Skip to content

Commit d89babe

Browse files
committed
add test
1 parent 7f9ab01 commit d89babe

File tree

2 files changed

+147
-41
lines changed

2 files changed

+147
-41
lines changed

rpc/types/types_test.go

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
package types_test
22

33
import (
4+
"encoding/json"
45
"maps"
56
"testing"
67

78
"github.com/ethereum/go-ethereum/common"
89
"github.com/ethereum/go-ethereum/common/hexutil"
910
"github.com/ethereum/go-ethereum/core/vm"
11+
"github.com/stretchr/testify/require"
1012

1113
rpc "github.com/cosmos/evm/rpc/types"
1214
"github.com/cosmos/evm/x/vm/statedb"
@@ -110,3 +112,99 @@ func TestApply(t *testing.T) {
110112
})
111113
}
112114
}
115+
116+
func TestParseOverrides(t *testing.T) {
117+
tests := []struct {
118+
name string
119+
input string
120+
expectedEVMOverrides bool
121+
expectedCosmosOverrides int
122+
expectError bool
123+
isDynamicPrecompile bool
124+
}{
125+
{
126+
name: "Standard EVM overrides (backward compatibility)",
127+
input: `{
128+
"0x1234567890abcdef1234567890abcdef12345678": {
129+
"stateDiff": {
130+
"0x0000000000000000000000000000000000000000000000000000000000000001": "0x0000000000000000000000000000000000000000000000000000000000000064"
131+
}
132+
}
133+
}`,
134+
expectedEVMOverrides: true,
135+
expectedCosmosOverrides: 0,
136+
isDynamicPrecompile: false,
137+
},
138+
{
139+
name: "Dynamic precompile with aligned cosmos overrides in state field",
140+
input: `{
141+
"0x1234567890abcdef1234567890abcdef12345678": {
142+
"state": "W3sibmFtZSI6ImJhbmsiLCJlbnRyaWVzIjpbeyJrZXkiOiJZbUZ1YXlCclpYaz0iLCJ2YWx1ZSI6IllXRnVhM0IyWVd4MVpRPT0iLCJkZWxldGUiOmZhbHNlfV19XQ=="
143+
}
144+
}`,
145+
expectedEVMOverrides: false,
146+
expectedCosmosOverrides: 1,
147+
isDynamicPrecompile: true,
148+
},
149+
{
150+
name: "Dynamic precompile with aligned cosmos overrides in stateDiff field",
151+
input: `{
152+
"0x1234567890abcdef1234567890abcdef12345678": {
153+
"stateDiff": "W3sibmFtZSI6ImJhbmsiLCJlbnRyaWVzIjpbeyJrZXkiOiJZbUZ1YXlCclpYaz0iLCJ2YWx1ZSI6IllXRnVhM0IyWVd4MVpRPT0iLCJkZWxldGUiOmZhbHNlfV19XQ=="
154+
}
155+
}`,
156+
expectedEVMOverrides: false,
157+
expectedCosmosOverrides: 1,
158+
isDynamicPrecompile: true,
159+
},
160+
{
161+
name: "Empty overrides",
162+
input: `{}`,
163+
expectedEVMOverrides: false,
164+
expectedCosmosOverrides: 0,
165+
isDynamicPrecompile: false,
166+
},
167+
{
168+
name: "Invalid JSON",
169+
input: `{invalid json}`,
170+
expectError: true,
171+
isDynamicPrecompile: false,
172+
},
173+
{
174+
name: "Nil input",
175+
input: "",
176+
expectedEVMOverrides: false,
177+
expectedCosmosOverrides: 0,
178+
expectError: false,
179+
isDynamicPrecompile: false,
180+
},
181+
}
182+
183+
for _, tc := range tests {
184+
t.Run(tc.name, func(t *testing.T) {
185+
var rawMessage *json.RawMessage
186+
if tc.input != "" {
187+
msg := json.RawMessage(tc.input)
188+
rawMessage = &msg
189+
}
190+
evmOverrides, cosmosOverrides, err := rpc.ParseOverrides(rawMessage, tc.isDynamicPrecompile)
191+
if tc.expectError {
192+
require.Error(t, err)
193+
return
194+
}
195+
require.NoError(t, err)
196+
if tc.expectedEVMOverrides {
197+
require.NotNil(t, evmOverrides)
198+
require.Len(t, *evmOverrides, 1)
199+
} else {
200+
require.Nil(t, evmOverrides)
201+
}
202+
if tc.expectedCosmosOverrides > 0 {
203+
require.NotNil(t, cosmosOverrides)
204+
require.Len(t, cosmosOverrides, tc.expectedCosmosOverrides)
205+
} else {
206+
require.Nil(t, cosmosOverrides)
207+
}
208+
})
209+
}
210+
}

tests/integration/rpc/backend/test_call_tx.go

Lines changed: 49 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,22 @@ func (s *TestSuite) TestSendRawTransaction() {
414414
}
415415
}
416416

417+
func (s *TestSuite) registerMock(bz []byte, expectedRequest *evmtypes.EthCallRequest, shouldError bool) func() {
418+
return func() {
419+
client := s.backend.ClientCtx.Client.(*mocks.Client)
420+
QueryClient := s.backend.QueryClient.QueryClient.(*mocks.EVMQueryClient)
421+
height := int64(1)
422+
RegisterHeader(client, &height, bz)
423+
// Register precompile for any address that might be called
424+
RegisterPrecompile(QueryClient, "")
425+
if shouldError {
426+
RegisterEthCallError(QueryClient, expectedRequest)
427+
} else {
428+
RegisterEthCall(QueryClient, expectedRequest)
429+
}
430+
}
431+
}
432+
417433
func (s *TestSuite) TestDoCall() {
418434
_, bz := s.buildEthereumTx()
419435
gasPrice := (*hexutil.Big)(big.NewInt(1))
@@ -432,10 +448,12 @@ func (s *TestSuite) TestDoCall() {
432448
AccessList: nil,
433449
ChainID: evmChainID,
434450
}
451+
452+
var err error
435453
argsBz, err := json.Marshal(callArgs)
436454
s.Require().NoError(err)
437455

438-
overrides := json.RawMessage(`{
456+
evmOverrides := json.RawMessage(`{
439457
"` + toAddr.Hex() + `": {
440458
"balance": "0x1000000000000000000",
441459
"nonce": "0x1",
@@ -445,8 +463,17 @@ func (s *TestSuite) TestDoCall() {
445463
}
446464
}
447465
}`)
466+
evmOverridesParsed, _, err := rpctypes.ParseOverrides(&evmOverrides, false)
467+
s.Require().NoError(err)
468+
var bzOverrides []byte
469+
if evmOverridesParsed != nil {
470+
bzOverrides, err = json.Marshal(evmOverridesParsed)
471+
s.Require().NoError(err)
472+
}
473+
448474
invalidOverrides := json.RawMessage(`{"invalid": json}`)
449475
emptyOverrides := json.RawMessage(`{}`)
476+
baseRequest := &evmtypes.EthCallRequest{Args: argsBz, ChainId: s.backend.EvmChainID.Int64()}
450477
testCases := []struct {
451478
name string
452479
registerMock func()
@@ -458,13 +485,7 @@ func (s *TestSuite) TestDoCall() {
458485
}{
459486
{
460487
"fail - Invalid request",
461-
func() {
462-
client := s.backend.ClientCtx.Client.(*mocks.Client)
463-
QueryClient := s.backend.QueryClient.QueryClient.(*mocks.EVMQueryClient)
464-
height := int64(1)
465-
RegisterHeader(client, &height, bz)
466-
RegisterEthCallError(QueryClient, &evmtypes.EthCallRequest{Args: argsBz, ChainId: s.backend.EvmChainID.Int64()})
467-
},
488+
s.registerMock(bz, baseRequest, true),
468489
rpctypes.BlockNumber(1),
469490
callArgs,
470491
nil,
@@ -473,36 +494,29 @@ func (s *TestSuite) TestDoCall() {
473494
},
474495
{
475496
"pass - Returned transaction response",
476-
func() {
477-
client := s.backend.ClientCtx.Client.(*mocks.Client)
478-
QueryClient := s.backend.QueryClient.QueryClient.(*mocks.EVMQueryClient)
479-
height := int64(1)
480-
RegisterHeader(client, &height, bz)
481-
RegisterEthCall(QueryClient, &evmtypes.EthCallRequest{Args: argsBz, ChainId: s.backend.EvmChainID.Int64()})
482-
},
497+
s.registerMock(bz, baseRequest, false),
483498
rpctypes.BlockNumber(1),
484499
callArgs,
485500
nil,
486501
&evmtypes.MsgEthereumTxResponse{},
487502
true,
488503
},
489504
{
490-
"pass - With state overrides",
505+
"pass - With EVM state overrides",
491506
func() {
492-
client := s.backend.ClientCtx.Client.(*mocks.Client)
493-
QueryClient := s.backend.QueryClient.QueryClient.(*mocks.EVMQueryClient)
494-
height := int64(1)
495-
RegisterHeader(client, &height, bz)
496-
expected := &evmtypes.EthCallRequest{
497-
Args: argsBz,
498-
ChainId: s.backend.EvmChainID.Int64(),
499-
Overrides: overrides,
507+
_, expectedCosmosOverrides, err := rpctypes.ParseOverrides(&evmOverrides, false)
508+
s.Require().NoError(err)
509+
expectedRequest := &evmtypes.EthCallRequest{
510+
Args: argsBz,
511+
ChainId: s.backend.EvmChainID.Int64(),
512+
Overrides: bzOverrides,
513+
StateOverrides: expectedCosmosOverrides,
500514
}
501-
RegisterEthCall(QueryClient, expected)
515+
s.registerMock(bz, expectedRequest, false)()
502516
},
503517
rpctypes.BlockNumber(1),
504518
callArgs,
505-
&overrides,
519+
&evmOverrides,
506520
&evmtypes.MsgEthereumTxResponse{},
507521
true,
508522
},
@@ -513,12 +527,7 @@ func (s *TestSuite) TestDoCall() {
513527
QueryClient := s.backend.QueryClient.QueryClient.(*mocks.EVMQueryClient)
514528
height := int64(1)
515529
RegisterHeader(client, &height, bz)
516-
expected := &evmtypes.EthCallRequest{
517-
Args: argsBz,
518-
ChainId: s.backend.EvmChainID.Int64(),
519-
Overrides: invalidOverrides,
520-
}
521-
RegisterEthCallError(QueryClient, expected)
530+
RegisterPrecompile(QueryClient, "")
522531
},
523532
rpctypes.BlockNumber(1),
524533
callArgs,
@@ -529,16 +538,15 @@ func (s *TestSuite) TestDoCall() {
529538
{
530539
"pass - Empty state overrides",
531540
func() {
532-
client := s.backend.ClientCtx.Client.(*mocks.Client)
533-
QueryClient := s.backend.QueryClient.QueryClient.(*mocks.EVMQueryClient)
534-
height := int64(1)
535-
RegisterHeader(client, &height, bz)
536-
expected := &evmtypes.EthCallRequest{
537-
Args: argsBz,
538-
ChainId: s.backend.EvmChainID.Int64(),
539-
Overrides: emptyOverrides,
541+
_, expectedCosmosOverrides, err := rpctypes.ParseOverrides(&emptyOverrides, false)
542+
s.Require().NoError(err)
543+
expectedRequest := &evmtypes.EthCallRequest{
544+
Args: argsBz,
545+
ChainId: s.backend.EvmChainID.Int64(),
546+
Overrides: nil,
547+
StateOverrides: expectedCosmosOverrides,
540548
}
541-
RegisterEthCall(QueryClient, expected)
549+
s.registerMock(bz, expectedRequest, false)()
542550
},
543551
rpctypes.BlockNumber(1),
544552
callArgs,

0 commit comments

Comments
 (0)