@@ -143,6 +143,226 @@ func TestEvmEventsForCw20(t *testing.T) {
143
143
require .Equal (t , common .HexToHash ("0x64" ).Bytes (), receipt .Logs [0 ].Data )
144
144
}
145
145
146
+ func TestEvmEventsForCw721 (t * testing.T ) {
147
+ k := testkeeper .EVMTestApp .EvmKeeper
148
+ wasmKeeper := k .WasmKeeper ()
149
+ ctx := testkeeper .EVMTestApp .GetContextForDeliverTx ([]byte {}).WithBlockTime (time .Now ()).WithChainID ("sei-test" ).WithBlockHeight (1 )
150
+ code , err := os .ReadFile ("../contracts/wasm/cw721_base.wasm" )
151
+ require .Nil (t , err )
152
+ privKey := testkeeper .MockPrivateKey ()
153
+ creator , _ := testkeeper .PrivateKeyToAddresses (privKey )
154
+ codeID , err := wasmKeeper .Create (ctx , creator , code , nil )
155
+ require .Nil (t , err )
156
+ contractAddr , _ , err := wasmKeeper .Instantiate (ctx , codeID , creator , creator , []byte (fmt .Sprintf ("{\" name\" :\" test\" ,\" symbol\" :\" test\" ,\" minter\" :\" %s\" }" , creator .String ())), "test" , sdk .NewCoins ())
157
+ require .Nil (t , err )
158
+
159
+ _ , mockPointerAddr := testkeeper .MockAddressPair ()
160
+ k .SetERC721CW721Pointer (ctx , contractAddr .String (), mockPointerAddr )
161
+
162
+ // calling CW contract directly
163
+ amt := sdk .NewCoins (sdk .NewCoin ("usei" , sdk .NewInt (1000000000000 )))
164
+ k .BankKeeper ().MintCoins (ctx , "evm" , amt )
165
+ k .BankKeeper ().SendCoinsFromModuleToAccount (ctx , "evm" , creator , amt )
166
+ recipient , _ := testkeeper .MockAddressPair ()
167
+ payload := []byte (fmt .Sprintf ("{\" mint\" :{\" token_id\" :\" 1\" ,\" owner\" :\" %s\" }}" , recipient .String ()))
168
+ msg := & wasmtypes.MsgExecuteContract {
169
+ Sender : creator .String (),
170
+ Contract : contractAddr .String (),
171
+ Msg : payload ,
172
+ }
173
+ txBuilder := testkeeper .EVMTestApp .GetTxConfig ().NewTxBuilder ()
174
+ txBuilder .SetMsgs (msg )
175
+ txBuilder .SetFeeAmount (sdk .NewCoins (sdk .NewCoin ("usei" , sdk .NewInt (1000000 ))))
176
+ txBuilder .SetGasLimit (300000 )
177
+ tx := signTx (txBuilder , privKey , k .AccountKeeper ().GetAccount (ctx , creator ))
178
+ txbz , err := testkeeper .EVMTestApp .GetTxConfig ().TxEncoder ()(tx )
179
+ require .Nil (t , err )
180
+ sum := sha256 .Sum256 (txbz )
181
+ res := testkeeper .EVMTestApp .DeliverTx (ctx .WithEventManager (sdk .NewEventManager ()), abci.RequestDeliverTx {Tx : txbz }, tx , sum )
182
+ require .Equal (t , uint32 (0 ), res .Code )
183
+ receipt , err := testkeeper .EVMTestApp .EvmKeeper .GetTransientReceipt (ctx , common .BytesToHash (sum [:]))
184
+ require .Nil (t , err )
185
+ require .Equal (t , 1 , len (receipt .Logs ))
186
+ require .NotEmpty (t , receipt .LogsBloom )
187
+ require .Equal (t , mockPointerAddr .Hex (), receipt .Logs [0 ].Address )
188
+ _ , found := testkeeper .EVMTestApp .EvmKeeper .GetEVMTxDeferredInfo (ctx )
189
+ require .True (t , found )
190
+
191
+ // calling from wasmd precompile
192
+ abi , err := wasmd .GetABI ()
193
+ require .Nil (t , err )
194
+ emptyCoins , err := sdk .NewCoins ().MarshalJSON ()
195
+ require .Nil (t , err )
196
+ payload = []byte (fmt .Sprintf ("{\" mint\" :{\" token_id\" :\" 2\" ,\" owner\" :\" %s\" }}" , creator .String ()))
197
+ data , err := abi .Pack ("execute" , contractAddr .String (), payload , emptyCoins )
198
+ require .Nil (t , err )
199
+ wasmAddr := common .HexToAddress (wasmd .WasmdAddress )
200
+ txData := ethtypes.LegacyTx {
201
+ Nonce : 0 ,
202
+ GasPrice : big .NewInt (1000000000 ),
203
+ Gas : 1000000 ,
204
+ To : & wasmAddr ,
205
+ Data : data ,
206
+ }
207
+ chainID := k .ChainID (ctx )
208
+ chainCfg := evmtypes .DefaultChainConfig ()
209
+ ethCfg := chainCfg .EthereumConfig (chainID )
210
+ blockNum := big .NewInt (ctx .BlockHeight ())
211
+ signer := ethtypes .MakeSigner (ethCfg , blockNum , uint64 (ctx .BlockTime ().Unix ()))
212
+ testPrivHex := hex .EncodeToString (privKey .Bytes ())
213
+ key , _ := crypto .HexToECDSA (testPrivHex )
214
+ signedTx , err := ethtypes .SignTx (ethtypes .NewTx (& txData ), signer , key )
215
+ require .Nil (t , err )
216
+ typedTx , err := ethtx .NewLegacyTx (signedTx )
217
+ require .Nil (t , err )
218
+ emsg , err := evmtypes .NewMsgEVMTransaction (typedTx )
219
+ require .Nil (t , err )
220
+ txBuilder = testkeeper .EVMTestApp .GetTxConfig ().NewTxBuilder ()
221
+ txBuilder .SetMsgs (emsg )
222
+ tx = txBuilder .GetTx ()
223
+ txbz , err = testkeeper .EVMTestApp .GetTxConfig ().TxEncoder ()(tx )
224
+ require .Nil (t , err )
225
+ res = testkeeper .EVMTestApp .DeliverTx (ctx .WithEventManager (sdk .NewEventManager ()).WithTxIndex (1 ), abci.RequestDeliverTx {Tx : txbz }, tx , sum )
226
+ require .Equal (t , uint32 (0 ), res .Code )
227
+ receipt , err = testkeeper .EVMTestApp .EvmKeeper .GetTransientReceipt (ctx , signedTx .Hash ())
228
+ require .Nil (t , err )
229
+ require .Equal (t , 1 , len (receipt .Logs ))
230
+ require .NotEmpty (t , receipt .LogsBloom )
231
+ require .Equal (t , mockPointerAddr .Hex (), receipt .Logs [0 ].Address )
232
+ _ , found = testkeeper .EVMTestApp .EvmKeeper .GetEVMTxDeferredInfo (ctx )
233
+ require .True (t , found )
234
+
235
+ // test approval message
236
+ payload = []byte (fmt .Sprintf ("{\" approve\" :{\" spender\" :\" %s\" ,\" token_id\" :\" 2\" }}" , recipient .String ()))
237
+ msg = & wasmtypes.MsgExecuteContract {
238
+ Sender : creator .String (),
239
+ Contract : contractAddr .String (),
240
+ Msg : payload ,
241
+ }
242
+ txBuilder = testkeeper .EVMTestApp .GetTxConfig ().NewTxBuilder ()
243
+ txBuilder .SetMsgs (msg )
244
+ txBuilder .SetFeeAmount (sdk .NewCoins (sdk .NewCoin ("usei" , sdk .NewInt (1000000 ))))
245
+ txBuilder .SetGasLimit (300000 )
246
+ tx = signTx (txBuilder , privKey , k .AccountKeeper ().GetAccount (ctx , creator ))
247
+ txbz , err = testkeeper .EVMTestApp .GetTxConfig ().TxEncoder ()(tx )
248
+ require .Nil (t , err )
249
+ sum = sha256 .Sum256 (txbz )
250
+ res = testkeeper .EVMTestApp .DeliverTx (ctx .WithEventManager (sdk .NewEventManager ()), abci.RequestDeliverTx {Tx : txbz }, tx , sum )
251
+ require .Equal (t , uint32 (0 ), res .Code )
252
+ receipt , err = testkeeper .EVMTestApp .EvmKeeper .GetTransientReceipt (ctx , common .BytesToHash (sum [:]))
253
+ require .Nil (t , err )
254
+ require .Equal (t , 1 , len (receipt .Logs ))
255
+ require .NotEmpty (t , receipt .LogsBloom )
256
+ require .Equal (t , mockPointerAddr .Hex (), receipt .Logs [0 ].Address )
257
+ _ , found = testkeeper .EVMTestApp .EvmKeeper .GetEVMTxDeferredInfo (ctx )
258
+ require .True (t , found )
259
+ require .Equal (t , common .HexToHash ("0x2" ).Bytes (), receipt .Logs [0 ].Data )
260
+
261
+ // revoke
262
+ payload = []byte (fmt .Sprintf ("{\" revoke\" :{\" spender\" :\" %s\" ,\" token_id\" :\" 2\" }}" , recipient .String ()))
263
+ msg = & wasmtypes.MsgExecuteContract {
264
+ Sender : creator .String (),
265
+ Contract : contractAddr .String (),
266
+ Msg : payload ,
267
+ }
268
+ txBuilder = testkeeper .EVMTestApp .GetTxConfig ().NewTxBuilder ()
269
+ txBuilder .SetMsgs (msg )
270
+ txBuilder .SetFeeAmount (sdk .NewCoins (sdk .NewCoin ("usei" , sdk .NewInt (1000000 ))))
271
+ txBuilder .SetGasLimit (300000 )
272
+ tx = signTx (txBuilder , privKey , k .AccountKeeper ().GetAccount (ctx , creator ))
273
+ txbz , err = testkeeper .EVMTestApp .GetTxConfig ().TxEncoder ()(tx )
274
+ require .Nil (t , err )
275
+ sum = sha256 .Sum256 (txbz )
276
+ res = testkeeper .EVMTestApp .DeliverTx (ctx .WithEventManager (sdk .NewEventManager ()), abci.RequestDeliverTx {Tx : txbz }, tx , sum )
277
+ require .Equal (t , uint32 (0 ), res .Code )
278
+ receipt , err = testkeeper .EVMTestApp .EvmKeeper .GetTransientReceipt (ctx , common .BytesToHash (sum [:]))
279
+ require .Nil (t , err )
280
+ require .Equal (t , 1 , len (receipt .Logs ))
281
+ require .NotEmpty (t , receipt .LogsBloom )
282
+ require .Equal (t , mockPointerAddr .Hex (), receipt .Logs [0 ].Address )
283
+ _ , found = testkeeper .EVMTestApp .EvmKeeper .GetEVMTxDeferredInfo (ctx )
284
+ require .True (t , found )
285
+ require .Equal (t , common .HexToHash ("0x2" ).Bytes (), receipt .Logs [0 ].Data )
286
+
287
+ // approve all
288
+ payload = []byte (fmt .Sprintf ("{\" approve_all\" :{\" operator\" :\" %s\" }}" , recipient .String ()))
289
+ msg = & wasmtypes.MsgExecuteContract {
290
+ Sender : creator .String (),
291
+ Contract : contractAddr .String (),
292
+ Msg : payload ,
293
+ }
294
+ txBuilder = testkeeper .EVMTestApp .GetTxConfig ().NewTxBuilder ()
295
+ txBuilder .SetMsgs (msg )
296
+ txBuilder .SetFeeAmount (sdk .NewCoins (sdk .NewCoin ("usei" , sdk .NewInt (1000000 ))))
297
+ txBuilder .SetGasLimit (300000 )
298
+ tx = signTx (txBuilder , privKey , k .AccountKeeper ().GetAccount (ctx , creator ))
299
+ txbz , err = testkeeper .EVMTestApp .GetTxConfig ().TxEncoder ()(tx )
300
+ require .Nil (t , err )
301
+ sum = sha256 .Sum256 (txbz )
302
+ res = testkeeper .EVMTestApp .DeliverTx (ctx .WithEventManager (sdk .NewEventManager ()), abci.RequestDeliverTx {Tx : txbz }, tx , sum )
303
+ require .Equal (t , uint32 (0 ), res .Code )
304
+ receipt , err = testkeeper .EVMTestApp .EvmKeeper .GetTransientReceipt (ctx , common .BytesToHash (sum [:]))
305
+ require .Nil (t , err )
306
+ require .Equal (t , 1 , len (receipt .Logs ))
307
+ require .NotEmpty (t , receipt .LogsBloom )
308
+ require .Equal (t , mockPointerAddr .Hex (), receipt .Logs [0 ].Address )
309
+ _ , found = testkeeper .EVMTestApp .EvmKeeper .GetEVMTxDeferredInfo (ctx )
310
+ require .True (t , found )
311
+ require .Equal (t , common .HexToHash ("0x1" ).Bytes (), receipt .Logs [0 ].Data )
312
+
313
+ // revoke all
314
+ payload = []byte (fmt .Sprintf ("{\" revoke_all\" :{\" operator\" :\" %s\" }}" , recipient .String ()))
315
+ msg = & wasmtypes.MsgExecuteContract {
316
+ Sender : creator .String (),
317
+ Contract : contractAddr .String (),
318
+ Msg : payload ,
319
+ }
320
+ txBuilder = testkeeper .EVMTestApp .GetTxConfig ().NewTxBuilder ()
321
+ txBuilder .SetMsgs (msg )
322
+ txBuilder .SetFeeAmount (sdk .NewCoins (sdk .NewCoin ("usei" , sdk .NewInt (1000000 ))))
323
+ txBuilder .SetGasLimit (300000 )
324
+ tx = signTx (txBuilder , privKey , k .AccountKeeper ().GetAccount (ctx , creator ))
325
+ txbz , err = testkeeper .EVMTestApp .GetTxConfig ().TxEncoder ()(tx )
326
+ require .Nil (t , err )
327
+ sum = sha256 .Sum256 (txbz )
328
+ res = testkeeper .EVMTestApp .DeliverTx (ctx .WithEventManager (sdk .NewEventManager ()), abci.RequestDeliverTx {Tx : txbz }, tx , sum )
329
+ require .Equal (t , uint32 (0 ), res .Code )
330
+ receipt , err = testkeeper .EVMTestApp .EvmKeeper .GetTransientReceipt (ctx , common .BytesToHash (sum [:]))
331
+ require .Nil (t , err )
332
+ require .Equal (t , 1 , len (receipt .Logs ))
333
+ require .NotEmpty (t , receipt .LogsBloom )
334
+ require .Equal (t , mockPointerAddr .Hex (), receipt .Logs [0 ].Address )
335
+ _ , found = testkeeper .EVMTestApp .EvmKeeper .GetEVMTxDeferredInfo (ctx )
336
+ require .True (t , found )
337
+ require .Equal (t , common .HexToHash ("0x0" ).Bytes (), receipt .Logs [0 ].Data )
338
+
339
+ // burn
340
+ payload = []byte ("{\" burn\" :{\" token_id\" :\" 2\" }}" )
341
+ msg = & wasmtypes.MsgExecuteContract {
342
+ Sender : creator .String (),
343
+ Contract : contractAddr .String (),
344
+ Msg : payload ,
345
+ }
346
+ txBuilder = testkeeper .EVMTestApp .GetTxConfig ().NewTxBuilder ()
347
+ txBuilder .SetMsgs (msg )
348
+ txBuilder .SetFeeAmount (sdk .NewCoins (sdk .NewCoin ("usei" , sdk .NewInt (1000000 ))))
349
+ txBuilder .SetGasLimit (300000 )
350
+ tx = signTx (txBuilder , privKey , k .AccountKeeper ().GetAccount (ctx , creator ))
351
+ txbz , err = testkeeper .EVMTestApp .GetTxConfig ().TxEncoder ()(tx )
352
+ require .Nil (t , err )
353
+ sum = sha256 .Sum256 (txbz )
354
+ res = testkeeper .EVMTestApp .DeliverTx (ctx .WithEventManager (sdk .NewEventManager ()), abci.RequestDeliverTx {Tx : txbz }, tx , sum )
355
+ require .Equal (t , uint32 (0 ), res .Code )
356
+ receipt , err = testkeeper .EVMTestApp .EvmKeeper .GetTransientReceipt (ctx , common .BytesToHash (sum [:]))
357
+ require .Nil (t , err )
358
+ require .Equal (t , 1 , len (receipt .Logs ))
359
+ require .NotEmpty (t , receipt .LogsBloom )
360
+ require .Equal (t , mockPointerAddr .Hex (), receipt .Logs [0 ].Address )
361
+ _ , found = testkeeper .EVMTestApp .EvmKeeper .GetEVMTxDeferredInfo (ctx )
362
+ require .True (t , found )
363
+ require .Equal (t , common .HexToHash ("0x2" ).Bytes (), receipt .Logs [0 ].Data )
364
+ }
365
+
146
366
func signTx (txBuilder client.TxBuilder , privKey cryptotypes.PrivKey , acc authtypes.AccountI ) sdk.Tx {
147
367
var sigsV2 []signing.SignatureV2
148
368
sigV2 := signing.SignatureV2 {
0 commit comments