github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/evm/evm2cm_test.go (about)

     1  package evm
     2  
     3  import (
     4  	"encoding/hex"
     5  	"fmt"
     6  	"math/big"
     7  	"testing"
     8  
     9  	"github.com/ethereum/go-ethereum/common"
    10  	sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types"
    11  	etypes "github.com/fibonacci-chain/fbc/x/evm/types"
    12  	"github.com/stretchr/testify/require"
    13  )
    14  
    15  type testMsg struct {
    16  	route string
    17  }
    18  
    19  func (msg testMsg) Route() string                { return msg.route }
    20  func (msg testMsg) Type() string                 { return "testMsg" }
    21  func (msg testMsg) GetSigners() []sdk.AccAddress { return nil }
    22  func (msg testMsg) GetSignBytes() []byte         { return nil }
    23  func (msg testMsg) ValidateBasic() error         { return nil }
    24  
    25  func TestEvmConvertJudge(t *testing.T) {
    26  
    27  	receiver := common.HexToAddress("0x606D5a30c22cEf66ed3C596b69a94200173e48b4")
    28  	payLoad := sysABIParser.Methods[sysContractInvokeFunction].ID
    29  
    30  	testcases := []struct {
    31  		msg     sdk.Msg
    32  		fnCheck func(addr []byte, is bool)
    33  	}{
    34  		{
    35  			msg: testMsg{route: "testMsg"},
    36  			fnCheck: func(addr []byte, is bool) {
    37  				require.Nil(t, addr)
    38  				require.Equal(t, false, is)
    39  			},
    40  		},
    41  		{
    42  			msg: testMsg{route: "evm"},
    43  			fnCheck: func(addr []byte, is bool) {
    44  				require.Nil(t, addr)
    45  				require.Equal(t, false, is)
    46  			},
    47  		},
    48  		{
    49  			// deploy contract
    50  			msg: etypes.NewMsgEthereumTxContract(1, nil, 1, nil, nil),
    51  			fnCheck: func(addr []byte, is bool) {
    52  				require.Nil(t, addr)
    53  				require.Equal(t, false, is)
    54  			},
    55  		},
    56  		{
    57  			msg: etypes.NewMsgEthereumTx(1, &receiver, nil, 1, nil, nil),
    58  			fnCheck: func(addr []byte, is bool) {
    59  				require.Nil(t, addr)
    60  				require.Equal(t, false, is)
    61  			},
    62  		},
    63  		{
    64  			msg: etypes.NewMsgEthereumTx(1, &receiver, nil, 1, nil, payLoad),
    65  			fnCheck: func(addr []byte, is bool) {
    66  				require.Equal(t, receiver[:], addr)
    67  				require.Equal(t, true, is)
    68  			},
    69  		},
    70  	}
    71  
    72  	for _, ts := range testcases {
    73  		addr, is := EvmConvertJudge(ts.msg)
    74  		ts.fnCheck(addr, is)
    75  	}
    76  }
    77  
    78  func TestParseContractParam(t *testing.T) {
    79  	testcases := []struct {
    80  		fnInit  func() []byte
    81  		fnCheck func(ctm []byte, err error)
    82  	}{
    83  		{
    84  			fnInit: func() []byte {
    85  				return sysABIParser.Methods[sysContractInvokeFunction].ID
    86  			},
    87  			fnCheck: func(ctm []byte, err error) {
    88  				require.Nil(t, ctm)
    89  				require.NotNil(t, err)
    90  			},
    91  		},
    92  		{
    93  			fnInit: func() []byte { // input param number error
    94  				param1 := `126`
    95  				param2 := "123"
    96  				// two input param for invoke
    97  				abistr := `[{"inputs":[{"internalType":"string","name":"data","type":"string"},{"internalType":"string","name":"len","type":"string"}],"name":"invoke","outputs":[],"stateMutability":"nonpayable","type":"function"}]`
    98  				abis, err := etypes.NewABI(abistr)
    99  				require.NoError(t, err)
   100  				re, err := abis.Pack(sysContractInvokeFunction, param1, param2)
   101  				require.NoError(t, err)
   102  				return re
   103  			},
   104  			fnCheck: func(ctm []byte, err error) {
   105  				require.Nil(t, ctm)
   106  				require.NotNil(t, err)
   107  			},
   108  		},
   109  		{
   110  			fnInit: func() []byte {
   111  				abistr := `[{"inputs":[{"internalType":"int256","name":"len","type":"int256"}],"name":"invoke","outputs":[],"stateMutability":"nonpayable","type":"function"}]`
   112  				abis, err := etypes.NewABI(abistr)
   113  				require.NoError(t, err)
   114  
   115  				re, err := abis.Pack(sysContractInvokeFunction, big.NewInt(123))
   116  				require.NoError(t, err)
   117  				return re
   118  			},
   119  			fnCheck: func(ctm []byte, err error) {
   120  				require.Nil(t, ctm)
   121  				require.NotNil(t, err)
   122  			},
   123  		},
   124  		{
   125  			fnInit: func() []byte {
   126  				param := `{"module": "staking","function": "deposit","data": "123"}`
   127  				re, err := sysABIParser.Pack(sysContractInvokeFunction, hex.EncodeToString([]byte(param)))
   128  				require.NoError(t, err)
   129  				return re
   130  			},
   131  			fnCheck: func(ctm []byte, err error) {
   132  				require.NoError(t, err)
   133  				require.Equal(t, `{"module": "staking","function": "deposit","data": "123"}`, string(ctm))
   134  			},
   135  		},
   136  	}
   137  
   138  	for _, ts := range testcases {
   139  		input := ts.fnInit()
   140  		cmtp, err := ParseContractParam(input)
   141  		ts.fnCheck(cmtp, err)
   142  	}
   143  }
   144  
   145  func TestDecodeParam(t *testing.T) {
   146  	testcases := []struct {
   147  		input   string
   148  		fnCheck func(ctm []byte, err error)
   149  	}{
   150  		{
   151  			// {"module": "staking","function": "deposit","data": "{\"delegator_address\": \"0xb2910e22bb23d129c02d122b77b462ceb0e89db9\",\"quantity\": {\"denom\": \"fibo\",\"amount\": \"1\"}}"}
   152  			input: "7b226d6f64756c65223a20227374616b696e67222c2266756e6374696f6e223a20226465706f736974222c2264617461223a20227b5c2264656c656761746f725f616464726573735c223a205c223078623239313065323262623233643132396330326431323262373762343632636562306538396462395c222c5c227175616e746974795c223a207b5c2264656e6f6d5c223a205c226f6b745c222c5c22616d6f756e745c223a205c22315c227d7d227d",
   153  			fnCheck: func(ctm []byte, err error) {
   154  				require.NoError(t, err)
   155  				tmpExpect := "okt"
   156  				data := fmt.Sprintf(`{"module": "staking","function": "deposit","data": "{\"delegator_address\": \"0xb2910e22bb23d129c02d122b77b462ceb0e89db9\",\"quantity\": {\"denom\": \"%s\",\"amount\": \"1\"}}"}`, tmpExpect)
   157  				require.Equal(t, string(ctm), data)
   158  			},
   159  		},
   160  		{
   161  			input: "7b2",
   162  			fnCheck: func(ctm []byte, err error) {
   163  				require.NotNil(t, err)
   164  			},
   165  		},
   166  		{
   167  			// {"module": "staking","function1": "deposit","data": ""}
   168  			input: "7b226d6f64756c65223a20227374616b696e67222c2266756e6374696f6e31223a20226465706f736974222c2264617461223a2022227d",
   169  			fnCheck: func(ctm []byte, err error) {
   170  				require.NoError(t, err)
   171  				data := `{"module": "staking","function1": "deposit","data": ""}`
   172  				require.Equal(t, string(ctm), data)
   173  			},
   174  		},
   175  	}
   176  
   177  	for _, tc := range testcases {
   178  		ctm, err := DecodeParam([]byte(tc.input))
   179  		tc.fnCheck(ctm, err)
   180  	}
   181  }
   182  
   183  func TestDecodeResultData(t *testing.T) {
   184  	strs := []string{
   185  		"BB020A140000000000000000000000000000000000000000128002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002A2022A33F1DFE21FB0F80C661BEB4003B05D08C154B5727FD5FED4802C13B24EDDC",
   186  		"BB020A140000000000000000000000000000000000000000128002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002A200000000000000000000000000000000000000000000000000000000000000000",
   187  	}
   188  
   189  	for _, str := range strs {
   190  		d, err := hex.DecodeString(str)
   191  		require.NoError(t, err)
   192  		if err != nil {
   193  			panic(err)
   194  		}
   195  		rd, err := etypes.DecodeResultData(d)
   196  		require.NoError(t, err)
   197  		fmt.Println(rd)
   198  	}
   199  }