From 72320ac62c57e129ed72940bbc11dccdfe84c35e Mon Sep 17 00:00:00 2001 From: codchen Date: Thu, 14 Nov 2024 15:27:40 +0800 Subject: [PATCH 1/3] Use owner event to populate ERC721 transfer topic --- app/receipt.go | 29 ++++++++++++++++++++++++++--- app/receipt_test.go | 28 +++++++++++++++++----------- 2 files changed, 43 insertions(+), 14 deletions(-) diff --git a/app/receipt.go b/app/receipt.go index 02a987c8ec..a2370afbd8 100644 --- a/app/receipt.go +++ b/app/receipt.go @@ -60,7 +60,7 @@ func (app *App) AddCosmosEventsToEVMReceiptIfApplicable(ctx sdk.Context, tx sdk. // check if there is a ERC721 pointer to contract Addr pointerAddr, _, exists = app.EvmKeeper.GetERC721CW721Pointer(wasmToEvmEventCtx, contractAddr) if exists { - log, eligible := app.translateCW721Event(wasmToEvmEventCtx, wasmEvent, pointerAddr, contractAddr) + log, eligible := app.translateCW721Event(wasmToEvmEventCtx, wasmEvent, pointerAddr, contractAddr, response) if eligible { log.Index = uint(len(logs)) logs = append(logs, log) @@ -173,7 +173,7 @@ func (app *App) translateCW20Event(ctx sdk.Context, wasmEvent abci.Event, pointe return nil, false } -func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, pointerAddr common.Address, contractAddr string) (*ethtypes.Log, bool) { +func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, pointerAddr common.Address, contractAddr string, response sdk.DeliverTxHookInput) (*ethtypes.Log, bool) { action, found := GetAttributeValue(wasmEvent, "action") if !found { return nil, false @@ -185,9 +185,32 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point if tokenID == nil { return nil, false } + sender := app.GetEvmAddressAttribute(ctx, wasmEvent, "sender") + ownerEvents := GetEventsOfType(response, wasmtypes.EventTypeCW721PreTransferOwner) + for _, ownerEvent := range ownerEvents { + if len(ownerEvent.Attributes) != 3 { + continue + } + if string(ownerEvent.Attributes[0].Key) != wasmtypes.AttributeKeyContractAddr || string(ownerEvent.Attributes[0].Value) != contractAddr { + continue + } + tokenIDStr, _ := GetAttributeValue(wasmEvent, "token_id") + if string(ownerEvent.Attributes[1].Key) != wasmtypes.AttributeKeyTokenId || string(ownerEvent.Attributes[1].Value) != tokenIDStr { + continue + } + if string(ownerEvent.Attributes[2].Key) != wasmtypes.AttributeKeyOwner { + continue + } + ownerAcc, err := sdk.AccAddressFromBech32(string(ownerEvent.Attributes[2].Value)) + if err != nil { + continue + } + owner := app.EvmKeeper.GetEVMAddressOrDefault(ctx, ownerAcc) + sender = common.BytesToHash(owner[:]) + } topics = []common.Hash{ ERC721TransferTopic, - app.GetEvmAddressAttribute(ctx, wasmEvent, "sender"), + sender, app.GetEvmAddressAttribute(ctx, wasmEvent, "recipient"), common.BigToHash(tokenID), } diff --git a/app/receipt_test.go b/app/receipt_test.go index bfdff291b8..efe3ce3b95 100644 --- a/app/receipt_test.go +++ b/app/receipt_test.go @@ -168,7 +168,8 @@ func TestEvmEventsForCw721(t *testing.T) { amt := sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(1000000000000))) k.BankKeeper().MintCoins(ctx, "evm", amt) k.BankKeeper().SendCoinsFromModuleToAccount(ctx, "evm", creator, amt) - recipient, _ := testkeeper.MockAddressPair() + privKeyRecipient := testkeeper.MockPrivateKey() + recipient, _ := testkeeper.PrivateKeyToAddresses(privKeyRecipient) payload := []byte(fmt.Sprintf("{\"mint\":{\"token_id\":\"1\",\"owner\":\"%s\"}}", recipient.String())) msg := &wasmtypes.MsgExecuteContract{ Sender: creator.String(), @@ -320,10 +321,12 @@ func TestEvmEventsForCw721(t *testing.T) { require.True(t, found) require.Equal(t, common.HexToHash("0x1").Bytes(), receipt.Logs[0].Data) - // revoke all - payload = []byte(fmt.Sprintf("{\"revoke_all\":{\"operator\":\"%s\"}}", recipient.String())) + // burn on behalf + payload = []byte("{\"burn\":{\"token_id\":\"2\"}}") + k.BankKeeper().MintCoins(ctx, "evm", amt) + k.BankKeeper().SendCoinsFromModuleToAccount(ctx, "evm", recipient, amt) msg = &wasmtypes.MsgExecuteContract{ - Sender: creator.String(), + Sender: recipient.String(), Contract: contractAddr.String(), Msg: payload, } @@ -331,7 +334,7 @@ func TestEvmEventsForCw721(t *testing.T) { txBuilder.SetMsgs(msg) txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(1000000)))) txBuilder.SetGasLimit(300000) - tx = signTx(txBuilder, privKey, k.AccountKeeper().GetAccount(ctx, creator)) + tx = signTx(txBuilder, privKeyRecipient, k.AccountKeeper().GetAccount(ctx, recipient)) txbz, err = testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(tx) require.Nil(t, err) sum = sha256.Sum256(txbz) @@ -342,12 +345,17 @@ func TestEvmEventsForCw721(t *testing.T) { require.Equal(t, 1, len(receipt.Logs)) require.NotEmpty(t, receipt.LogsBloom) require.Equal(t, mockPointerAddr.Hex(), receipt.Logs[0].Address) - _, found = testkeeper.EVMTestApp.EvmKeeper.GetEVMTxDeferredInfo(ctx) - require.True(t, found) + require.Equal(t, uint32(0), receipt.Logs[0].Index) + ownerHash := receipt.Logs[0].Topics[1] + // make sure that the owner is set correctly to the creator, not the spender. + creatorEvmAddr := testkeeper.EVMTestApp.EvmKeeper.GetEVMAddressOrDefault(ctx, creator) + require.Equal(t, common.BytesToHash(creatorEvmAddr[:]).Hex(), ownerHash) + tokenIdHash = receipt.Logs[0].Topics[3] + require.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000002", tokenIdHash) require.Equal(t, common.HexToHash("0x0").Bytes(), receipt.Logs[0].Data) - // burn - payload = []byte("{\"burn\":{\"token_id\":\"2\"}}") + // revoke all + payload = []byte(fmt.Sprintf("{\"revoke_all\":{\"operator\":\"%s\"}}", recipient.String())) msg = &wasmtypes.MsgExecuteContract{ Sender: creator.String(), Contract: contractAddr.String(), @@ -370,8 +378,6 @@ func TestEvmEventsForCw721(t *testing.T) { require.Equal(t, mockPointerAddr.Hex(), receipt.Logs[0].Address) _, found = testkeeper.EVMTestApp.EvmKeeper.GetEVMTxDeferredInfo(ctx) require.True(t, found) - tokenIdHash = receipt.Logs[0].Topics[3] - require.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000002", tokenIdHash) require.Equal(t, common.HexToHash("0x0").Bytes(), receipt.Logs[0].Data) } From 42d3acfa2477615ec9536949f3c7ff012067531d Mon Sep 17 00:00:00 2001 From: codchen Date: Thu, 14 Nov 2024 23:47:03 +0800 Subject: [PATCH 2/3] more test --- app/receipt.go | 48 ++++++++++++++++++++++++++-------------- app/receipt_test.go | 53 +++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 18 deletions(-) diff --git a/app/receipt.go b/app/receipt.go index a2370afbd8..0aa92f1996 100644 --- a/app/receipt.go +++ b/app/receipt.go @@ -39,6 +39,7 @@ func (app *App) AddCosmosEventsToEVMReceiptIfApplicable(ctx sdk.Context, tx sdk. return } logs := []*ethtypes.Log{} + ownerReplacements := map[uint]common.Hash{} // Note: txs with a very large number of WASM events may run out of gas due to // additional gas consumption from EVM receipt generation and event translation wasmToEvmEventGasLimit := app.EvmKeeper.GetDeliverTxHookWasmGasLimit(ctx.WithGasMeter(sdk.NewInfiniteGasMeter(1, 1))) @@ -60,10 +61,13 @@ func (app *App) AddCosmosEventsToEVMReceiptIfApplicable(ctx sdk.Context, tx sdk. // check if there is a ERC721 pointer to contract Addr pointerAddr, _, exists = app.EvmKeeper.GetERC721CW721Pointer(wasmToEvmEventCtx, contractAddr) if exists { - log, eligible := app.translateCW721Event(wasmToEvmEventCtx, wasmEvent, pointerAddr, contractAddr, response) + log, realOwner, eligible := app.translateCW721Event(wasmToEvmEventCtx, wasmEvent, pointerAddr, contractAddr, response) if eligible { log.Index = uint(len(logs)) logs = append(logs, log) + if (realOwner != common.Hash{}) { + ownerReplacements[log.Index] = realOwner + } } continue } @@ -77,15 +81,22 @@ func (app *App) AddCosmosEventsToEVMReceiptIfApplicable(ctx sdk.Context, tx sdk. } var bloom ethtypes.Bloom if r, err := app.EvmKeeper.GetTransientReceipt(wasmToEvmEventCtx, txHash); err == nil && r != nil { + existingLogCnt := len(r.Logs) r.Logs = append(r.Logs, utils.Map(logs, evmkeeper.ConvertSyntheticEthLog)...) for i, l := range r.Logs { l.Index = uint32(i) } bloom = ethtypes.CreateBloom(ethtypes.Receipts{ðtypes.Receipt{Logs: evmkeeper.GetLogsForTx(r)}}) r.LogsBloom = bloom[:] + for i, o := range ownerReplacements { + r.Logs[existingLogCnt+int(i)].Topics[1] = o.Hex() + } _ = app.EvmKeeper.SetTransientReceipt(wasmToEvmEventCtx, txHash, r) } else { bloom = ethtypes.CreateBloom(ethtypes.Receipts{ðtypes.Receipt{Logs: logs}}) + for i, o := range ownerReplacements { + logs[int(i)].Topics[1] = o + } receipt := &evmtypes.Receipt{ TxType: ShellEVMTxType, TxHashHex: txHash.Hex(), @@ -173,19 +184,24 @@ func (app *App) translateCW20Event(ctx sdk.Context, wasmEvent abci.Event, pointe return nil, false } -func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, pointerAddr common.Address, contractAddr string, response sdk.DeliverTxHookInput) (*ethtypes.Log, bool) { +func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, pointerAddr common.Address, contractAddr string, response sdk.DeliverTxHookInput) (*ethtypes.Log, common.Hash, bool) { action, found := GetAttributeValue(wasmEvent, "action") if !found { - return nil, false + return nil, common.Hash{}, false } var topics []common.Hash switch action { case "transfer_nft", "send_nft", "burn": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, false + return nil, common.Hash{}, false } - sender := app.GetEvmAddressAttribute(ctx, wasmEvent, "sender") + sender := common.Hash{} + // unfortunately CW721 transfer events differ from ERC721 transfer events + // in that CW721 include sender (which can be different than owner) whereas + // ERC721 always include owner. The following logic refer to the owner + // event emitted before the transfer and use that instead to populate the + // synthetic ERC721 event. ownerEvents := GetEventsOfType(response, wasmtypes.EventTypeCW721PreTransferOwner) for _, ownerEvent := range ownerEvents { if len(ownerEvent.Attributes) != 3 { @@ -210,7 +226,7 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point } topics = []common.Hash{ ERC721TransferTopic, - sender, + app.GetEvmAddressAttribute(ctx, wasmEvent, "sender"), app.GetEvmAddressAttribute(ctx, wasmEvent, "recipient"), common.BigToHash(tokenID), } @@ -218,11 +234,11 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, true + }, sender, true case "mint": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, false + return nil, common.Hash{}, false } topics = []common.Hash{ ERC721TransferTopic, @@ -234,11 +250,11 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, true + }, common.Hash{}, true case "approve": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, false + return nil, common.Hash{}, false } topics = []common.Hash{ ERC721ApprovalTopic, @@ -250,11 +266,11 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, true + }, common.Hash{}, true case "revoke": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, false + return nil, common.Hash{}, false } topics = []common.Hash{ ERC721ApprovalTopic, @@ -266,7 +282,7 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, true + }, common.Hash{}, true case "approve_all": topics = []common.Hash{ ERC721ApproveAllTopic, @@ -277,7 +293,7 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: TrueHash.Bytes(), - }, true + }, common.Hash{}, true case "revoke_all": topics = []common.Hash{ ERC721ApproveAllTopic, @@ -288,9 +304,9 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, true + }, common.Hash{}, true } - return nil, false + return nil, common.Hash{}, false } func (app *App) GetEvmAddressAttribute(ctx sdk.Context, event abci.Event, attribute string) common.Hash { diff --git a/app/receipt_test.go b/app/receipt_test.go index efe3ce3b95..326dd64265 100644 --- a/app/receipt_test.go +++ b/app/receipt_test.go @@ -321,10 +321,10 @@ func TestEvmEventsForCw721(t *testing.T) { require.True(t, found) require.Equal(t, common.HexToHash("0x1").Bytes(), receipt.Logs[0].Data) - // burn on behalf - payload = []byte("{\"burn\":{\"token_id\":\"2\"}}") + // transfer on behalf k.BankKeeper().MintCoins(ctx, "evm", amt) k.BankKeeper().SendCoinsFromModuleToAccount(ctx, "evm", recipient, amt) + payload = []byte(fmt.Sprintf("{\"transfer_nft\":{\"token_id\":\"2\",\"recipient\":\"%s\"}}", recipient.String())) msg = &wasmtypes.MsgExecuteContract{ Sender: recipient.String(), Contract: contractAddr.String(), @@ -354,6 +354,55 @@ func TestEvmEventsForCw721(t *testing.T) { require.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000002", tokenIdHash) require.Equal(t, common.HexToHash("0x0").Bytes(), receipt.Logs[0].Data) + // transfer back + payload = []byte(fmt.Sprintf("{\"transfer_nft\":{\"token_id\":\"2\",\"recipient\":\"%s\"}}", creator.String())) + msg = &wasmtypes.MsgExecuteContract{ + Sender: recipient.String(), + Contract: contractAddr.String(), + Msg: payload, + } + txBuilder = testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + txBuilder.SetMsgs(msg) + txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(1000000)))) + txBuilder.SetGasLimit(300000) + tx = signTx(txBuilder, privKeyRecipient, k.AccountKeeper().GetAccount(ctx, recipient)) + txbz, err = testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(tx) + require.Nil(t, err) + sum = sha256.Sum256(txbz) + res = testkeeper.EVMTestApp.DeliverTx(ctx.WithEventManager(sdk.NewEventManager()), abci.RequestDeliverTx{Tx: txbz}, tx, sum) + require.Equal(t, uint32(0), res.Code) + + // burn on behalf + payload = []byte("{\"burn\":{\"token_id\":\"2\"}}") + msg = &wasmtypes.MsgExecuteContract{ + Sender: recipient.String(), + Contract: contractAddr.String(), + Msg: payload, + } + txBuilder = testkeeper.EVMTestApp.GetTxConfig().NewTxBuilder() + txBuilder.SetMsgs(msg) + txBuilder.SetFeeAmount(sdk.NewCoins(sdk.NewCoin("usei", sdk.NewInt(1000000)))) + txBuilder.SetGasLimit(300000) + tx = signTx(txBuilder, privKeyRecipient, k.AccountKeeper().GetAccount(ctx, recipient)) + txbz, err = testkeeper.EVMTestApp.GetTxConfig().TxEncoder()(tx) + require.Nil(t, err) + sum = sha256.Sum256(txbz) + res = testkeeper.EVMTestApp.DeliverTx(ctx.WithEventManager(sdk.NewEventManager()), abci.RequestDeliverTx{Tx: txbz}, tx, sum) + require.Equal(t, uint32(0), res.Code) + receipt, err = testkeeper.EVMTestApp.EvmKeeper.GetTransientReceipt(ctx, common.BytesToHash(sum[:])) + require.Nil(t, err) + require.Equal(t, 1, len(receipt.Logs)) + require.NotEmpty(t, receipt.LogsBloom) + require.Equal(t, mockPointerAddr.Hex(), receipt.Logs[0].Address) + require.Equal(t, uint32(0), receipt.Logs[0].Index) + ownerHash = receipt.Logs[0].Topics[1] + // make sure that the owner is set correctly to the creator, not the spender. + creatorEvmAddr = testkeeper.EVMTestApp.EvmKeeper.GetEVMAddressOrDefault(ctx, creator) + require.Equal(t, common.BytesToHash(creatorEvmAddr[:]).Hex(), ownerHash) + tokenIdHash = receipt.Logs[0].Topics[3] + require.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000002", tokenIdHash) + require.Equal(t, common.HexToHash("0x0").Bytes(), receipt.Logs[0].Data) + // revoke all payload = []byte(fmt.Sprintf("{\"revoke_all\":{\"operator\":\"%s\"}}", recipient.String())) msg = &wasmtypes.MsgExecuteContract{ From 72f99e56184f3cd7b6eaf243de7052d0a102712c Mon Sep 17 00:00:00 2001 From: codchen Date: Wed, 20 Nov 2024 13:12:47 +0800 Subject: [PATCH 3/3] rebase and revert owner replacement --- app/receipt.go | 55 +++++++++++++++++++------------------------------- 1 file changed, 21 insertions(+), 34 deletions(-) diff --git a/app/receipt.go b/app/receipt.go index 0aa92f1996..f41ead37c1 100644 --- a/app/receipt.go +++ b/app/receipt.go @@ -39,7 +39,6 @@ func (app *App) AddCosmosEventsToEVMReceiptIfApplicable(ctx sdk.Context, tx sdk. return } logs := []*ethtypes.Log{} - ownerReplacements := map[uint]common.Hash{} // Note: txs with a very large number of WASM events may run out of gas due to // additional gas consumption from EVM receipt generation and event translation wasmToEvmEventGasLimit := app.EvmKeeper.GetDeliverTxHookWasmGasLimit(ctx.WithGasMeter(sdk.NewInfiniteGasMeter(1, 1))) @@ -61,13 +60,10 @@ func (app *App) AddCosmosEventsToEVMReceiptIfApplicable(ctx sdk.Context, tx sdk. // check if there is a ERC721 pointer to contract Addr pointerAddr, _, exists = app.EvmKeeper.GetERC721CW721Pointer(wasmToEvmEventCtx, contractAddr) if exists { - log, realOwner, eligible := app.translateCW721Event(wasmToEvmEventCtx, wasmEvent, pointerAddr, contractAddr, response) + log, eligible := app.translateCW721Event(wasmToEvmEventCtx, wasmEvent, pointerAddr, contractAddr, response) if eligible { log.Index = uint(len(logs)) logs = append(logs, log) - if (realOwner != common.Hash{}) { - ownerReplacements[log.Index] = realOwner - } } continue } @@ -81,22 +77,15 @@ func (app *App) AddCosmosEventsToEVMReceiptIfApplicable(ctx sdk.Context, tx sdk. } var bloom ethtypes.Bloom if r, err := app.EvmKeeper.GetTransientReceipt(wasmToEvmEventCtx, txHash); err == nil && r != nil { - existingLogCnt := len(r.Logs) r.Logs = append(r.Logs, utils.Map(logs, evmkeeper.ConvertSyntheticEthLog)...) for i, l := range r.Logs { l.Index = uint32(i) } bloom = ethtypes.CreateBloom(ethtypes.Receipts{ðtypes.Receipt{Logs: evmkeeper.GetLogsForTx(r)}}) r.LogsBloom = bloom[:] - for i, o := range ownerReplacements { - r.Logs[existingLogCnt+int(i)].Topics[1] = o.Hex() - } _ = app.EvmKeeper.SetTransientReceipt(wasmToEvmEventCtx, txHash, r) } else { bloom = ethtypes.CreateBloom(ethtypes.Receipts{ðtypes.Receipt{Logs: logs}}) - for i, o := range ownerReplacements { - logs[int(i)].Topics[1] = o - } receipt := &evmtypes.Receipt{ TxType: ShellEVMTxType, TxHashHex: txHash.Hex(), @@ -184,17 +173,17 @@ func (app *App) translateCW20Event(ctx sdk.Context, wasmEvent abci.Event, pointe return nil, false } -func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, pointerAddr common.Address, contractAddr string, response sdk.DeliverTxHookInput) (*ethtypes.Log, common.Hash, bool) { +func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, pointerAddr common.Address, contractAddr string, response sdk.DeliverTxHookInput) (*ethtypes.Log, bool) { action, found := GetAttributeValue(wasmEvent, "action") if !found { - return nil, common.Hash{}, false + return nil, false } var topics []common.Hash switch action { case "transfer_nft", "send_nft", "burn": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, common.Hash{}, false + return nil, false } sender := common.Hash{} // unfortunately CW721 transfer events differ from ERC721 transfer events @@ -204,17 +193,15 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point // synthetic ERC721 event. ownerEvents := GetEventsOfType(response, wasmtypes.EventTypeCW721PreTransferOwner) for _, ownerEvent := range ownerEvents { - if len(ownerEvent.Attributes) != 3 { - continue - } - if string(ownerEvent.Attributes[0].Key) != wasmtypes.AttributeKeyContractAddr || string(ownerEvent.Attributes[0].Value) != contractAddr { + if len(ownerEvent.Attributes) != 3 || + string(ownerEvent.Attributes[0].Key) != wasmtypes.AttributeKeyContractAddr || + string(ownerEvent.Attributes[0].Value) != contractAddr { continue } tokenIDStr, _ := GetAttributeValue(wasmEvent, "token_id") - if string(ownerEvent.Attributes[1].Key) != wasmtypes.AttributeKeyTokenId || string(ownerEvent.Attributes[1].Value) != tokenIDStr { - continue - } - if string(ownerEvent.Attributes[2].Key) != wasmtypes.AttributeKeyOwner { + if string(ownerEvent.Attributes[1].Key) != wasmtypes.AttributeKeyTokenId || + string(ownerEvent.Attributes[1].Value) != tokenIDStr || + string(ownerEvent.Attributes[2].Key) != wasmtypes.AttributeKeyOwner { continue } ownerAcc, err := sdk.AccAddressFromBech32(string(ownerEvent.Attributes[2].Value)) @@ -226,7 +213,7 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point } topics = []common.Hash{ ERC721TransferTopic, - app.GetEvmAddressAttribute(ctx, wasmEvent, "sender"), + sender, app.GetEvmAddressAttribute(ctx, wasmEvent, "recipient"), common.BigToHash(tokenID), } @@ -234,11 +221,11 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, sender, true + }, true case "mint": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, common.Hash{}, false + return nil, false } topics = []common.Hash{ ERC721TransferTopic, @@ -250,11 +237,11 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, common.Hash{}, true + }, true case "approve": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, common.Hash{}, false + return nil, false } topics = []common.Hash{ ERC721ApprovalTopic, @@ -266,11 +253,11 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, common.Hash{}, true + }, true case "revoke": tokenID := GetTokenIDAttribute(wasmEvent) if tokenID == nil { - return nil, common.Hash{}, false + return nil, false } topics = []common.Hash{ ERC721ApprovalTopic, @@ -282,7 +269,7 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, common.Hash{}, true + }, true case "approve_all": topics = []common.Hash{ ERC721ApproveAllTopic, @@ -293,7 +280,7 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: TrueHash.Bytes(), - }, common.Hash{}, true + }, true case "revoke_all": topics = []common.Hash{ ERC721ApproveAllTopic, @@ -304,9 +291,9 @@ func (app *App) translateCW721Event(ctx sdk.Context, wasmEvent abci.Event, point Address: pointerAddr, Topics: topics, Data: EmptyHash.Bytes(), - }, common.Hash{}, true + }, true } - return nil, common.Hash{}, false + return nil, false } func (app *App) GetEvmAddressAttribute(ctx sdk.Context, event abci.Event, attribute string) common.Hash {