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 }