11package backend
22
33import (
4+ "encoding/base64"
45 "encoding/json"
56 "errors"
67 "fmt"
@@ -18,10 +19,12 @@ import (
1819 utiltx "github.com/cosmos/evm/testutil/tx"
1920 evmtypes "github.com/cosmos/evm/x/vm/types"
2021
22+ "cosmossdk.io/collections"
2123 "cosmossdk.io/math"
2224
2325 sdk "github.com/cosmos/cosmos-sdk/types"
2426 errortypes "github.com/cosmos/cosmos-sdk/types/errors"
27+ banktypes "github.com/cosmos/cosmos-sdk/x/bank/types"
2528)
2629
2730func (s * TestSuite ) TestResend () {
@@ -414,6 +417,20 @@ func (s *TestSuite) TestSendRawTransaction() {
414417 }
415418}
416419
420+ func (s * TestSuite ) registerMock (bz []byte , expectedRequest * evmtypes.EthCallRequest , shouldError bool ) func () {
421+ return func () {
422+ client := s .backend .ClientCtx .Client .(* mocks.Client )
423+ QueryClient := s .backend .QueryClient .QueryClient .(* mocks.EVMQueryClient )
424+ height := int64 (1 )
425+ RegisterHeader (client , & height , bz )
426+ if shouldError {
427+ RegisterEthCallError (QueryClient , expectedRequest )
428+ } else {
429+ RegisterEthCall (QueryClient , expectedRequest )
430+ }
431+ }
432+ }
433+
417434func (s * TestSuite ) TestDoCall () {
418435 _ , bz := s .buildEthereumTx ()
419436 gasPrice := (* hexutil .Big )(big .NewInt (1 ))
@@ -432,10 +449,12 @@ func (s *TestSuite) TestDoCall() {
432449 AccessList : nil ,
433450 ChainID : evmChainID ,
434451 }
452+
453+ var err error
435454 argsBz , err := json .Marshal (callArgs )
436455 s .Require ().NoError (err )
437456
438- overrides := json .RawMessage (`{
457+ evmOverrides := json .RawMessage (`{
439458 "` + toAddr .Hex () + `": {
440459 "balance": "0x1000000000000000000",
441460 "nonce": "0x1",
@@ -445,8 +464,43 @@ func (s *TestSuite) TestDoCall() {
445464 }
446465 }
447466 }` )
467+ evmOverridesParsed , _ , err := rpctypes .ParseOverrides (& evmOverrides )
468+ s .Require ().NoError (err )
469+ var bzOverrides []byte
470+ if evmOverridesParsed != nil {
471+ bzOverrides , err = json .Marshal (evmOverridesParsed )
472+ s .Require ().NoError (err )
473+ }
474+
475+ // Cosmos state overrides with bank balance key
476+ addr := common .HexToAddress ("0x378c50D9264C63F3F92B806d4ee56E9D86FfB3Ec" )
477+ acc := sdk .AccAddress (addr .Bytes ())
478+ denom := fmt .Sprintf ("factory/%s/eth_call" , acc .String ())
479+ keyCodec := collections .PairKeyCodec (sdk .AccAddressKey , collections .StringKey )
480+ key , err := collections .EncodeKeyWithPrefix (banktypes .BalancesPrefix , keyCodec , collections .Join (acc , denom ))
481+ s .Require ().NoError (err )
482+ s .Require ().NotEmpty (key )
483+ value := []byte ("99" )
484+ keyB64 := base64 .StdEncoding .EncodeToString (key )
485+ valueB64 := base64 .StdEncoding .EncodeToString (value )
486+ cosmosOverrides := json .RawMessage (`{
487+ "cosmosStateOverrides": [
488+ {
489+ "name": "bank",
490+ "entries": [
491+ {
492+ "key": "` + keyB64 + `",
493+ "value": "` + valueB64 + `",
494+ "delete": false
495+ }
496+ ]
497+ }
498+ ]
499+ }` )
500+
448501 invalidOverrides := json .RawMessage (`{"invalid": json}` )
449502 emptyOverrides := json .RawMessage (`{}` )
503+ baseRequest := & evmtypes.EthCallRequest {Args : argsBz , ChainId : s .backend .EvmChainID .Int64 ()}
450504 testCases := []struct {
451505 name string
452506 registerMock func ()
@@ -458,13 +512,7 @@ func (s *TestSuite) TestDoCall() {
458512 }{
459513 {
460514 "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- },
515+ s .registerMock (bz , baseRequest , true ),
468516 rpctypes .BlockNumber (1 ),
469517 callArgs ,
470518 nil ,
@@ -473,52 +521,38 @@ func (s *TestSuite) TestDoCall() {
473521 },
474522 {
475523 "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- },
524+ s .registerMock (bz , baseRequest , false ),
483525 rpctypes .BlockNumber (1 ),
484526 callArgs ,
485527 nil ,
486528 & evmtypes.MsgEthereumTxResponse {},
487529 true ,
488530 },
489531 {
490- "pass - With state overrides" ,
532+ "pass - With EVM state overrides" ,
491533 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 ,
534+ _ , expectedCosmosOverrides , err := rpctypes .ParseOverrides (& evmOverrides )
535+ s .Require ().NoError (err )
536+ expectedRequest := & evmtypes.EthCallRequest {
537+ Args : argsBz ,
538+ ChainId : s .backend .EvmChainID .Int64 (),
539+ Overrides : bzOverrides ,
540+ StateOverrides : expectedCosmosOverrides ,
500541 }
501- RegisterEthCall ( QueryClient , expected )
542+ s . registerMock ( bz , expectedRequest , false )( )
502543 },
503544 rpctypes .BlockNumber (1 ),
504545 callArgs ,
505- & overrides ,
546+ & evmOverrides ,
506547 & evmtypes.MsgEthereumTxResponse {},
507548 true ,
508549 },
509550 {
510551 "fail - Invalid state overrides JSON" ,
511552 func () {
512553 client := s .backend .ClientCtx .Client .(* mocks.Client )
513- QueryClient := s .backend .QueryClient .QueryClient .(* mocks.EVMQueryClient )
514554 height := int64 (1 )
515555 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 )
522556 },
523557 rpctypes .BlockNumber (1 ),
524558 callArgs ,
@@ -529,23 +563,41 @@ func (s *TestSuite) TestDoCall() {
529563 {
530564 "pass - Empty state overrides" ,
531565 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 ,
566+ _ , expectedCosmosOverrides , err := rpctypes .ParseOverrides (& emptyOverrides )
567+ s .Require ().NoError (err )
568+ expectedRequest := & evmtypes.EthCallRequest {
569+ Args : argsBz ,
570+ ChainId : s .backend .EvmChainID .Int64 (),
571+ Overrides : nil ,
572+ StateOverrides : expectedCosmosOverrides ,
540573 }
541- RegisterEthCall ( QueryClient , expected )
574+ s . registerMock ( bz , expectedRequest , false )( )
542575 },
543576 rpctypes .BlockNumber (1 ),
544577 callArgs ,
545578 & emptyOverrides ,
546579 & evmtypes.MsgEthereumTxResponse {},
547580 true ,
548581 },
582+ {
583+ "pass - With cosmos state overrides JSON" ,
584+ func () {
585+ _ , expectedCosmosOverrides , err := rpctypes .ParseOverrides (& cosmosOverrides )
586+ s .Require ().NoError (err )
587+ expectedRequest := & evmtypes.EthCallRequest {
588+ Args : argsBz ,
589+ ChainId : s .backend .EvmChainID .Int64 (),
590+ Overrides : nil ,
591+ StateOverrides : expectedCosmosOverrides ,
592+ }
593+ s .registerMock (bz , expectedRequest , false )()
594+ },
595+ rpctypes .BlockNumber (1 ),
596+ callArgs ,
597+ & cosmosOverrides ,
598+ & evmtypes.MsgEthereumTxResponse {},
599+ true ,
600+ },
549601 }
550602
551603 for _ , tc := range testCases {
0 commit comments