github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/x/vmbridge/types/protoclo_test.go (about) 1 package types 2 3 import ( 4 "math/big" 5 "testing" 6 7 "github.com/ethereum/go-ethereum/common" 8 sdk "github.com/fibonacci-chain/fbc/libs/cosmos-sdk/types" 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestGetEVMABIConfig(t *testing.T) { 13 testCase := []struct { 14 name string 15 data []byte 16 isErr bool 17 expectErr string 18 }{ 19 { 20 name: "normal abi json", 21 data: abiJson, 22 isErr: false, 23 }, 24 { 25 name: "normal abi json have more func", 26 data: []byte("[\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"wasmAddr\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"recipient\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"__OKCSendToWasm\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"caller\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mintERC20\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"caller\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mintERC201\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]\n"), 27 isErr: false, 28 }, 29 { 30 name: "normal abi json have more event", 31 data: []byte("[\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"wasmAddr\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"recipient\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"__OKCSendToWasm\",\n \"type\": \"event\"\n },\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"caller\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mintERC20\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n },\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"wasmAddr\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"recipient\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"__OKCSendToWasmTest\",\n \"type\": \"event\"\n }\n]\n"), 32 isErr: false, 33 }, 34 { 35 name: "normal abi json have less event", 36 data: []byte("[\n {\n \"inputs\": [\n {\n \"internalType\": \"string\",\n \"name\": \"caller\",\n \"type\": \"string\"\n },\n {\n \"internalType\": \"address\",\n \"name\": \"recipient\",\n \"type\": \"address\"\n },\n {\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"mintERC20\",\n \"outputs\": [\n {\n \"internalType\": \"bool\",\n \"name\": \"success\",\n \"type\": \"bool\"\n }\n ],\n \"stateMutability\": \"nonpayable\",\n \"type\": \"function\"\n }\n]\n"), 37 isErr: true, 38 expectErr: "abi must have event event", 39 }, 40 { 41 name: "normal abi json have less func", 42 data: []byte("[\n {\n \"anonymous\": false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"wasmAddr\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"recipient\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"__OKCSendToWasm\",\n \"type\": \"event\"\n }\n]"), 43 isErr: false, 44 }, 45 { 46 name: "error abi json", 47 data: []byte("[\n {\n : false,\n \"inputs\": [\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"wasmAddr\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"string\",\n \"name\": \"recipient\",\n \"type\": \"string\"\n },\n {\n \"indexed\": false,\n \"internalType\": \"uint256\",\n \"name\": \"amount\",\n \"type\": \"uint256\"\n }\n ],\n \"name\": \"__OKCSendToWasm\",\n \"type\": \"event\"\n }\n]"), 48 isErr: true, 49 expectErr: "json decode failed", 50 }, 51 } 52 for _, tc := range testCase { 53 t.Run(tc.name, func(tt *testing.T) { 54 if tc.isErr { 55 defer func() { 56 r := recover() 57 require.NotNil(tt, r) 58 err := r.(error) 59 require.ErrorContains(tt, err, tc.expectErr) 60 }() 61 } 62 GetEVMABIConfig(tc.data) 63 }) 64 } 65 66 } 67 68 func TestGetMintERC20Input(t *testing.T) { 69 ethAddress := common.Address{0x1} 70 addrStr := ethAddress.String() 71 testCases := []struct { 72 name string 73 caller string 74 recipient common.Address 75 amount *big.Int 76 isErr bool 77 expectErr string 78 }{ 79 { 80 name: "normal", 81 caller: addrStr, 82 recipient: ethAddress, 83 amount: sdk.NewInt(1).BigInt(), 84 }, 85 } 86 87 for _, tc := range testCases { 88 _, err := GetMintERC20Input(tc.caller, tc.recipient, tc.amount) 89 if tc.isErr { 90 require.Error(t, err) 91 } 92 } 93 94 } 95 96 func TestGetMintERC20Output(t *testing.T) { 97 testCases := []struct { 98 name string 99 data []byte 100 isErr bool 101 expectErr string 102 expect bool 103 }{ 104 { 105 name: "normal true 1", 106 data: func() []byte { 107 buffer := make([]byte, 31, 64) 108 buffer = append(buffer, byte(0x1)) 109 return buffer 110 }(), 111 expect: true, 112 }, 113 { 114 name: "normal false", 115 data: func() []byte { 116 buffer := make([]byte, 31, 64) 117 buffer = append(buffer, byte(0x0)) 118 return buffer 119 }(), 120 expect: false, 121 }, 122 { 123 name: "normal true 2", 124 data: func() []byte { 125 buffer := make([]byte, 32) 126 buffer[31] = byte(0x1) 127 return buffer 128 }(), 129 expect: true, 130 }, 131 { 132 name: "err data input no enough ", 133 data: func() []byte { 134 buffer := make([]byte, 28) 135 return buffer 136 }(), 137 isErr: true, 138 expect: false, 139 }, 140 { 141 name: "err data input more ", 142 data: func() []byte { 143 buffer := make([]byte, 33) 144 return buffer 145 }(), 146 isErr: true, 147 expect: false, 148 }, 149 } 150 151 for _, tc := range testCases { 152 t.Run(tc.name, func(tt *testing.T) { 153 result, err := GetMintERC20Output(tc.data) 154 if tc.isErr { 155 require.Error(tt, err) 156 } 157 require.Equal(tt, tc.expect, result) 158 }) 159 } 160 } 161 162 func TestGetMintCW20Input(t *testing.T) { 163 testCases := []struct { 164 name string 165 amount string 166 reicient string 167 isErr bool 168 expectErr string 169 expect string 170 }{ 171 { 172 name: "normal true", 173 reicient: func() string { 174 addr := sdk.AccAddress{0x1} 175 return addr.String() 176 }(), 177 amount: sdk.NewInt(1).String(), 178 expect: "{\"mint_c_w20\":{\"amount\":\"1\",\"recipient\":\"cosmos1qyfkm2y3\"}}", 179 }, 180 { 181 name: "amount -1", 182 reicient: func() string { 183 addr := sdk.AccAddress{0x1} 184 return addr.String() 185 }(), 186 amount: sdk.NewInt(-1).String(), 187 expect: "{\"mint_c_w20\":{\"amount\":\"-1\",\"recipient\":\"cosmos1qyfkm2y3\"}}", 188 }, 189 { 190 name: "addr is error", 191 reicient: "hehe", 192 amount: sdk.NewInt(-1).String(), 193 expect: "{\"mint_c_w20\":{\"amount\":\"-1\",\"recipient\":\"hehe\"}}", 194 }, 195 } 196 for _, tc := range testCases { 197 t.Run(tc.name, func(tt *testing.T) { 198 result, err := GetMintCW20Input(tc.amount, tc.reicient) 199 if tc.isErr { 200 require.Error(tt, err) 201 } 202 require.Equal(tt, tc.expect, string(result)) 203 }) 204 } 205 }