Skip to content

Commit f3e5fdf

Browse files
authored
Exclude only shell receipts from eth endpoints v5.9.0 (#1879)
* Exclude only shell receipts from eth endpoints * remove it.only
1 parent e742d5e commit f3e5fdf

File tree

6 files changed

+104
-50
lines changed

6 files changed

+104
-50
lines changed

contracts/test/ERC20toCW20PointerTest.js

+35-15
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,9 @@ describe("ERC20 to CW20 Pointer", function () {
9393
expect(await pointer.balanceOf(sender.evmAddress)).to.equal(balances.account0);
9494
expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(balances.account1);
9595

96-
const blockNumber = await ethers.provider.getBlockNumber();
9796
const tx = await pointer.transfer(recipient.evmAddress, 1);
98-
await tx.wait();
97+
const receipt = await tx.wait();
98+
const blockNumber = receipt.blockNumber;
9999

100100
expect(await pointer.balanceOf(sender.evmAddress)).to.equal(balances.account0-1);
101101
expect(await pointer.balanceOf(recipient.evmAddress)).to.equal(balances.account1+1);
@@ -107,18 +107,38 @@ describe("ERC20 to CW20 Pointer", function () {
107107
address: await pointer.getAddress(),
108108
topics: [ethers.id("Transfer(address,address,uint256)")]
109109
};
110-
// send via eth_ endpoint - synthetic event doesn't show up
110+
// send via eth_ endpoint - synthetic event should show up because we are using the
111+
// synthetic event in place of a real EVM event
111112
const ethlogs = await ethers.provider.send('eth_getLogs', [filter]);
112-
expect(ethlogs.length).to.equal(0);
113+
expect(ethlogs.length).to.equal(1);
113114

114115
// send via sei_ endpoint - synthetic event shows up
115116
const seilogs = await ethers.provider.send('sei_getLogs', [filter]);
116117
expect(seilogs.length).to.equal(1);
117-
expect(seilogs.length).to.equal(1);
118-
expect(seilogs[0]["address"].toLowerCase()).to.equal((await pointer.getAddress()).toLowerCase());
119-
expect(seilogs[0]["topics"][0]).to.equal(ethers.id("Transfer(address,address,uint256)"));
120-
expect(seilogs[0]["topics"][1].substring(26)).to.equal(sender.evmAddress.substring(2).toLowerCase());
121-
expect(seilogs[0]["topics"][2].substring(26)).to.equal(recipient.evmAddress.substring(2).toLowerCase());
118+
119+
const logs = [...ethlogs, ...seilogs];
120+
logs.forEach(async (log) => {
121+
expect(log["address"].toLowerCase()).to.equal((await pointer.getAddress()).toLowerCase());
122+
expect(log["topics"][0]).to.equal(ethers.id("Transfer(address,address,uint256)"));
123+
expect(log["topics"][1].substring(26)).to.equal(sender.evmAddress.substring(2).toLowerCase());
124+
expect(log["topics"][2].substring(26)).to.equal(recipient.evmAddress.substring(2).toLowerCase());
125+
});
126+
127+
const ethBlock = await ethers.provider.send('eth_getBlockByNumber', ['0x' + blockNumber.toString(16), false]);
128+
const seiBlock = await ethers.provider.send('sei_getBlockByNumber', ['0x' + blockNumber.toString(16), false]);
129+
expect(ethBlock.transactions.length).to.equal(1);
130+
expect(seiBlock.transactions.length).to.equal(1);
131+
132+
const ethReceipts = await ethers.provider.send('eth_getBlockReceipts', ['0x' + blockNumber.toString(16)]);
133+
const seiReceipts = await ethers.provider.send('sei_getBlockReceipts', ['0x' + blockNumber.toString(16)]);
134+
expect(ethReceipts.length).to.equal(1);
135+
expect(seiReceipts.length).to.equal(1);
136+
expect(ethReceipts[0].transactionHash).to.equal(seiReceipts[0].transactionHash);
137+
138+
const ethTx = await ethers.provider.send('eth_getTransactionReceipt', [receipt.hash]);
139+
expect(ethTx.logs.length).to.equal(1); // check for transfer event
140+
const ethTxByHash = await ethers.provider.send('eth_getTransactionByHash', [tx.hash]);
141+
expect(ethTxByHash).to.not.be.null;
122142

123143
const cleanupTx = await pointer.connect(recipient.signer).transfer(sender.evmAddress, 1);
124144
await cleanupTx.wait();
@@ -147,7 +167,7 @@ describe("ERC20 to CW20 Pointer", function () {
147167
const spender = accounts[1].evmAddress;
148168
const blockNumber = await ethers.provider.getBlockNumber();
149169
const tx = await pointer.approve(spender, 1000000);
150-
await tx.wait();
170+
const receipt = await tx.wait();
151171
const allowance = await pointer.allowance(owner, spender);
152172
expect(Number(allowance)).to.equal(1000000);
153173

@@ -160,15 +180,15 @@ describe("ERC20 to CW20 Pointer", function () {
160180
};
161181
// send via eth_ endpoint - synthetic event doesn't show up
162182
const ethlogs = await ethers.provider.send('eth_getLogs', [filter]);
163-
expect(ethlogs.length).to.equal(0);
183+
expect(ethlogs.length).to.equal(1);
184+
expect(ethlogs[0]["address"].toLowerCase()).to.equal((await pointer.getAddress()).toLowerCase());
185+
expect(ethlogs[0]["topics"][0]).to.equal(ethers.id("Approval(address,address,uint256)"));
186+
expect(ethlogs[0]["topics"][1].substring(26)).to.equal(owner.substring(2).toLowerCase());
187+
expect(ethlogs[0]["topics"][2].substring(26)).to.equal(spender.substring(2).toLowerCase());
164188

165189
// send via sei_ endpoint - synthetic event shows up
166190
const seilogs = await ethers.provider.send('sei_getLogs', [filter]);
167191
expect(seilogs.length).to.equal(1);
168-
expect(seilogs[0]["address"].toLowerCase()).to.equal((await pointer.getAddress()).toLowerCase());
169-
expect(seilogs[0]["topics"][0]).to.equal(ethers.id("Approval(address,address,uint256)"));
170-
expect(seilogs[0]["topics"][1].substring(26)).to.equal(owner.substring(2).toLowerCase());
171-
expect(seilogs[0]["topics"][2].substring(26)).to.equal(spender.substring(2).toLowerCase());
172192
});
173193

174194
it("should lower approval", async function () {

contracts/test/ERC721toCW721PointerTest.js

+32-13
Original file line numberDiff line numberDiff line change
@@ -94,17 +94,22 @@ describe("ERC721 to CW721 Pointer", function () {
9494
address: await pointerAcc1.getAddress(),
9595
topics: [ethers.id("Approval(address,address,uint256)")]
9696
};
97-
// send via eth_ endpoint - synthetic event doesn't show up
97+
// send via eth_ endpoint - synthetic event should show up because we are using the
98+
// synthetic event in place of a real EVM event
9899
const ethlogs = await ethers.provider.send('eth_getLogs', [filter]);
99-
expect(ethlogs.length).to.equal(0);
100+
expect(ethlogs.length).to.equal(1);
100101

101102
// send via sei_ endpoint - synthetic event shows up
102103
const seilogs = await ethers.provider.send('sei_getLogs', [filter]);
103104
expect(seilogs.length).to.equal(1);
104-
expect(seilogs[0]["address"].toLowerCase()).to.equal((await pointerAcc1.getAddress()).toLowerCase());
105-
expect(seilogs[0]["topics"][0]).to.equal(ethers.id("Approval(address,address,uint256)"));
106-
expect(seilogs[0]["topics"][1].substring(26)).to.equal(accounts[0].evmAddress.substring(2).toLowerCase());
107-
expect(seilogs[0]["topics"][2].substring(26)).to.equal(accounts[1].evmAddress.substring(2).toLowerCase());
105+
106+
const logs = [...ethlogs, ...seilogs];
107+
logs.forEach(async (log) => {
108+
expect(log["address"].toLowerCase()).to.equal((await pointer.getAddress()).toLowerCase());
109+
expect(log["topics"][0]).to.equal(ethers.id("Transfer(address,address,uint256)"));
110+
expect(log["topics"][1].substring(26)).to.equal(accounts[0].evmAddress.substring(2).toLowerCase());
111+
expect(log["topics"][2].substring(26)).to.equal(accounts[1].evmAddress.substring(2).toLowerCase());
112+
});
108113
});
109114

110115
it("cannot approve token you don't own", async function () {
@@ -116,7 +121,7 @@ describe("ERC721 to CW721 Pointer", function () {
116121
await mine(pointerAcc0.approve(accounts[1].evmAddress, 2));
117122
const blockNumber = await ethers.provider.getBlockNumber();
118123
transferTxResp = await pointerAcc1.transferFrom(accounts[0].evmAddress, accounts[1].evmAddress, 2);
119-
await transferTxResp.wait();
124+
const receipt = await transferTxResp.wait();
120125
const filter = {
121126
fromBlock: '0x' + blockNumber.toString(16),
122127
toBlock: 'latest',
@@ -125,19 +130,33 @@ describe("ERC721 to CW721 Pointer", function () {
125130
};
126131
// send via eth_ endpoint - synthetic event doesn't show up
127132
const ethlogs = await ethers.provider.send('eth_getLogs', [filter]);
128-
expect(ethlogs.length).to.equal(0);
129-
133+
expect(ethlogs.length).to.equal(1);
130134
const seilogs = await ethers.provider.send('sei_getLogs', [filter]);
131135
expect(seilogs.length).to.equal(1);
132-
expect(seilogs[0]["address"].toLowerCase()).to.equal((await pointerAcc1.getAddress()).toLowerCase());
133-
expect(seilogs[0]["topics"][0]).to.equal(ethers.id("Transfer(address,address,uint256)"));
134-
expect(seilogs[0]["topics"][1].substring(26)).to.equal(accounts[1].evmAddress.substring(2).toLowerCase());
135-
expect(seilogs[0]["topics"][2].substring(26)).to.equal(accounts[1].evmAddress.substring(2).toLowerCase());
136+
const logs = [...ethlogs, ...seilogs];
137+
logs.forEach(async (log) => {
138+
expect(log["address"].toLowerCase()).to.equal((await pointerAcc1.getAddress()).toLowerCase());
139+
expect(log["topics"][0]).to.equal(ethers.id("Transfer(address,address,uint256)"));
140+
expect(log["topics"][1].substring(26)).to.equal(accounts[1].evmAddress.substring(2).toLowerCase());
141+
expect(log["topics"][2].substring(26)).to.equal(accounts[1].evmAddress.substring(2).toLowerCase());
142+
});
143+
136144
const balance0 = await pointerAcc0.balanceOf(accounts[0].evmAddress);
137145
expect(balance0).to.equal(0);
138146
const balance1 = await pointerAcc0.balanceOf(accounts[1].evmAddress);
139147
expect(balance1).to.equal(2);
140148

149+
// do same for eth_getBlockReceipts and sei_getBlockReceipts
150+
const ethBlockReceipts = await ethers.provider.send('eth_getBlockReceipts', ['0x' + blockNumber.toString(16)]);
151+
expect(ethBlockReceipts.length).to.equal(1);
152+
const seiBlockReceipts = await ethers.provider.send('sei_getBlockReceipts', ['0x' + blockNumber.toString(16)]);
153+
expect(seiBlockReceipts.length).to.equal(1);
154+
155+
const ethTx = await ethers.provider.send('eth_getTransactionReceipt', [receipt.hash]);
156+
expect(ethTx.logs.length).to.equal(1);
157+
const ethTxByHash = await ethers.provider.send('eth_getTransactionByHash', [receipt.hash]);
158+
expect(ethTxByHash).to.not.be.null;
159+
141160
// return token id 2 back to accounts[0] using safe transfer from
142161
await mine(pointerAcc1.approve(accounts[0].evmAddress, 2));
143162
await mine(pointerAcc1.safeTransferFrom(accounts[1].evmAddress, accounts[0].evmAddress, 2));

evmrpc/block.go

+18-11
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"encoding/hex"
77
"errors"
88
"fmt"
9+
"math"
910
"math/big"
1011
"strings"
1112
"sync"
@@ -26,18 +27,20 @@ import (
2627
tmtypes "github.com/tendermint/tendermint/types"
2728
)
2829

30+
const ShellEVMTxType = math.MaxUint32
31+
2932
type BlockAPI struct {
30-
tmClient rpcclient.Client
31-
keeper *keeper.Keeper
32-
ctxProvider func(int64) sdk.Context
33-
txConfig client.TxConfig
34-
connectionType ConnectionType
35-
namespace string
36-
includeSyntheticTxs bool
33+
tmClient rpcclient.Client
34+
keeper *keeper.Keeper
35+
ctxProvider func(int64) sdk.Context
36+
txConfig client.TxConfig
37+
connectionType ConnectionType
38+
namespace string
39+
includeShellReceipts bool
3740
}
3841

3942
func NewBlockAPI(tmClient rpcclient.Client, k *keeper.Keeper, ctxProvider func(int64) sdk.Context, txConfig client.TxConfig, connectionType ConnectionType, namespace string) *BlockAPI {
40-
return &BlockAPI{tmClient: tmClient, keeper: k, ctxProvider: ctxProvider, txConfig: txConfig, connectionType: connectionType, includeSyntheticTxs: shouldIncludeSynthetic(namespace)}
43+
return &BlockAPI{tmClient: tmClient, keeper: k, ctxProvider: ctxProvider, txConfig: txConfig, connectionType: connectionType, includeShellReceipts: shouldIncludeSynthetic(namespace)}
4144
}
4245

4346
func (a *BlockAPI) GetBlockTransactionCountByNumber(ctx context.Context, number rpc.BlockNumber) (result *hexutil.Uint, returnErr error) {
@@ -80,7 +83,7 @@ func (a *BlockAPI) getBlockByHash(ctx context.Context, blockHash common.Hash, fu
8083
return nil, err
8184
}
8285
blockBloom := a.keeper.GetBlockBloom(a.ctxProvider(block.Block.Height))
83-
return EncodeTmBlock(a.ctxProvider(LatestCtxHeight), block, blockRes, blockBloom, a.keeper, a.txConfig.TxDecoder(), fullTx, a.includeSyntheticTxs)
86+
return EncodeTmBlock(a.ctxProvider(block.Block.Height), block, blockRes, blockBloom, a.keeper, a.txConfig.TxDecoder(), fullTx, a.includeShellReceipts)
8487
}
8588

8689
func (a *BlockAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (result map[string]interface{}, returnErr error) {
@@ -128,7 +131,7 @@ func (a *BlockAPI) getBlockByNumber(ctx context.Context, number rpc.BlockNumber,
128131
return nil, err
129132
}
130133
blockBloom := a.keeper.GetBlockBloom(a.ctxProvider(block.Block.Height))
131-
return EncodeTmBlock(a.ctxProvider(LatestCtxHeight), block, blockRes, blockBloom, a.keeper, a.txConfig.TxDecoder(), fullTx, a.includeSyntheticTxs)
134+
return EncodeTmBlock(a.ctxProvider(block.Block.Height), block, blockRes, blockBloom, a.keeper, a.txConfig.TxDecoder(), fullTx, a.includeShellReceipts)
132135
}
133136

134137
func (a *BlockAPI) GetBlockReceipts(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (result []map[string]interface{}, returnErr error) {
@@ -169,7 +172,8 @@ func (a *BlockAPI) GetBlockReceipts(ctx context.Context, blockNrOrHash rpc.Block
169172
mtx.Unlock()
170173
}
171174
} else {
172-
if !a.includeSyntheticTxs && len(receipt.Logs) > 0 && receipt.Logs[0].Synthetic {
175+
// If the receipt has synthetic logs, we actually want to include them in the response.
176+
if !a.includeShellReceipts && receipt.TxType == ShellEVMTxType {
173177
return
174178
}
175179
encodedReceipt, err := encodeReceipt(receipt, a.txConfig.TxDecoder(), block, func(h common.Hash) bool {
@@ -242,6 +246,9 @@ func EncodeTmBlock(
242246
if err != nil {
243247
continue
244248
}
249+
if !includeSyntheticTxs && receipt.TxType == ShellEVMTxType {
250+
continue
251+
}
245252
newTx := ethapi.NewRPCTransaction(ethtx, blockhash, number.Uint64(), uint64(blockTime.Second()), uint64(receipt.TransactionIndex), baseFeePerGas, chainConfig)
246253
transactions = append(transactions, newTx)
247254
}

evmrpc/block_test.go

+8-1
Original file line numberDiff line numberDiff line change
@@ -114,11 +114,18 @@ func TestGetBlockReceipts(t *testing.T) {
114114
// Query by tag latest => retrieves block 8
115115
resObj3 := sendRequestGood(t, "getBlockReceipts", "latest")
116116
result = resObj3["result"].([]interface{})
117-
require.Equal(t, 1, len(result))
117+
require.Equal(t, 2, len(result))
118118
receipt1 = result[0].(map[string]interface{})
119119
require.Equal(t, "0x8", receipt1["blockNumber"])
120120
require.Equal(t, "0x0", receipt1["transactionIndex"])
121121
require.Equal(t, multiTxBlockTx4.Hash().Hex(), receipt1["transactionHash"])
122+
receiptWithSyntheticLog := result[1].(map[string]interface{})
123+
require.Equal(t, "0x8", receiptWithSyntheticLog["blockNumber"])
124+
logs := receiptWithSyntheticLog["logs"].([]interface{})
125+
firstLog := logs[0].(map[string]interface{})
126+
topics := firstLog["topics"].([]interface{})
127+
syntheticLogFirstTopic := "0x0000000000000000000000000000000000000000000000000000000000000234"
128+
require.Equal(t, syntheticLogFirstTopic, topics[0].(string))
122129
}
123130

124131
func verifyGenesisBlockResult(t *testing.T, resObj map[string]interface{}) {

evmrpc/filter.go

+9-8
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ type EventItemDataWrapper struct {
6464
}
6565

6666
func NewFilterAPI(tmClient rpcclient.Client, k *keeper.Keeper, ctxProvider func(int64) sdk.Context, filterConfig *FilterConfig, connectionType ConnectionType, namespace string) *FilterAPI {
67-
logFetcher := &LogFetcher{tmClient: tmClient, k: k, ctxProvider: ctxProvider, filterConfig: filterConfig, includeSynthetic: shouldIncludeSynthetic(namespace)}
67+
logFetcher := &LogFetcher{tmClient: tmClient, k: k, ctxProvider: ctxProvider, filterConfig: filterConfig, includeSyntheticReceipts: shouldIncludeSynthetic(namespace)}
6868
filters := make(map[ethrpc.ID]filter)
6969
api := &FilterAPI{
7070
namespace: namespace,
@@ -275,11 +275,11 @@ func (a *FilterAPI) UninstallFilter(
275275
}
276276

277277
type LogFetcher struct {
278-
tmClient rpcclient.Client
279-
k *keeper.Keeper
280-
ctxProvider func(int64) sdk.Context
281-
filterConfig *FilterConfig
282-
includeSynthetic bool
278+
tmClient rpcclient.Client
279+
k *keeper.Keeper
280+
ctxProvider func(int64) sdk.Context
281+
filterConfig *FilterConfig
282+
includeSyntheticReceipts bool
283283
}
284284

285285
func (f *LogFetcher) GetLogsByFilters(ctx context.Context, crit filters.FilterCriteria, lastToHeight int64) ([]*ethtypes.Log, int64, error) {
@@ -366,10 +366,11 @@ func (f *LogFetcher) FindLogsByBloom(height int64, filters [][]bloomIndexes) (re
366366
ctx.Logger().Error(fmt.Sprintf("FindLogsByBloom: unable to find receipt for hash %s", hash.Hex()))
367367
continue
368368
}
369-
if !f.includeSynthetic && len(receipt.Logs) > 0 && receipt.Logs[0].Synthetic {
369+
// if includeShellReceipts is false, include receipts with synthetic logs but exclude shell tx receipts
370+
if !f.includeSyntheticReceipts && receipt.TxType == ShellEVMTxType {
370371
continue
371372
}
372-
if !f.includeSynthetic && receipt.EffectiveGasPrice == 0 {
373+
if !f.includeSyntheticReceipts && receipt.EffectiveGasPrice == 0 {
373374
return
374375
}
375376
if len(receipt.LogsBloom) > 0 && MatchFilters(ethtypes.Bloom(receipt.LogsBloom), filters) {

evmrpc/filter_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ func TestSeiFilterGetLogs(t *testing.T) {
221221
})
222222
}
223223

224-
func TestEthEndpointShouldNotReturnSyntheticLogs(t *testing.T) {
224+
func TestEthEndpointCanReturnSyntheticLogs(t *testing.T) {
225225
testFilterGetLogs(t, "eth", []GetFilterLogTests{
226226
{
227227
name: "filter by single topic with default range, exclude synethetic logs",
@@ -230,7 +230,7 @@ func TestEthEndpointShouldNotReturnSyntheticLogs(t *testing.T) {
230230
check: func(t *testing.T, log map[string]interface{}) {
231231
require.Equal(t, "0x0000000000000000000000000000000000000000000000000000000000000234", log["topics"].([]interface{})[0].(string))
232232
},
233-
wantLen: 0,
233+
wantLen: 1,
234234
},
235235
})
236236
}

0 commit comments

Comments
 (0)