github.com/status-im/status-go@v1.1.0/abi-spec/core_test.go (about) 1 package abispec 2 3 import ( 4 "encoding/json" 5 "testing" 6 7 "github.com/stretchr/testify/require" 8 ) 9 10 func TestMethodPattern(t *testing.T) { 11 results := methodPattern.FindStringSubmatch("sam(bytes,bool,uint256[])") 12 require.Equal(t, "sam(bytes,bool,uint256[])", results[0]) 13 require.Equal(t, "sam", results[1]) 14 require.Equal(t, "bytes,bool,uint256[]", results[2]) 15 16 results = methodPattern.FindStringSubmatch("s(bytes,bool,uint256[])") 17 require.Equal(t, "s(bytes,bool,uint256[])", results[0]) 18 require.Equal(t, "s", results[1]) 19 require.Equal(t, "bytes,bool,uint256[]", results[2]) 20 21 results = methodPattern.FindStringSubmatch("s1(bytes,bool,uint256[])") 22 require.Equal(t, "s1(bytes,bool,uint256[])", results[0]) 23 require.Equal(t, "s1", results[1]) 24 require.Equal(t, "bytes,bool,uint256[]", results[2]) 25 26 results = methodPattern.FindStringSubmatch("1s(bytes,bool,uint256[])") 27 require.Len(t, results, 0) 28 } 29 30 func TestEncodeTransfer(t *testing.T) { 31 result, err := EncodeTransfer("0x6f5f90fb1dD8E406F233442935F689bA7D5701b2", "10000") 32 require.NoError(t, err) 33 require.Equal(t, "0xa9059cbb0000000000000000000000006f5f90fb1dd8e406f233442935f689ba7d5701b20000000000000000000000000000000000000000000000000000000000002710", result) 34 35 result, err = EncodeTransfer("0x6f5f90fb1dD8E406F233442935F689bA7D5701b2", "0x2710") 36 require.NoError(t, err) 37 require.Equal(t, "0xa9059cbb0000000000000000000000006f5f90fb1dd8e406f233442935f689ba7d5701b20000000000000000000000000000000000000000000000000000000000002710", result) 38 } 39 40 func TestEncode(t *testing.T) { 41 result, err := Encode("baz(uint32,bool)", "[69,true]") 42 require.NoError(t, err) 43 require.Equal(t, "0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001", result) 44 45 result, err = Encode("baz(uint256,bool)", "[69,true]") 46 require.NoError(t, err) 47 require.Equal(t, "0x72ed38b600000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001", result) 48 49 result, err = Encode("bar(bytes3[2])", `[["abc","def"]]`) 50 require.NoError(t, err) 51 require.Equal(t, "0xfce353f661626300000000000000000000000000000000000000000000000000000000006465660000000000000000000000000000000000000000000000000000000000", result) 52 53 result, err = Encode("sam(bytes)", `["dave"]`) 54 require.NoError(t, err) 55 require.Equal(t, "0x05e73fb9000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046461766500000000000000000000000000000000000000000000000000000000", result) 56 57 result, err = Encode("sam(bytes,bool,uint256[])", `["dave",true,[1,2,3]]`) 58 require.NoError(t, err) 59 require.Equal(t, "0xa5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", result) 60 61 result, err = Encode("f(bytes10)", `["1234567890"]`) 62 require.NoError(t, err) 63 require.Equal(t, "0x6350865e3132333435363738393000000000000000000000000000000000000000000000", result) 64 65 result, err = Encode("f(uint256,uint32[],bytes10,bytes)", `[291,[1110,1929],"1234567890","Hello, world!"]`) 66 require.NoError(t, err) 67 require.Equal(t, "0x8be6524600000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", result) 68 69 result, err = Encode("getExpectedRate(address,address,uint256)", `["0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",1000]`) 70 require.NoError(t, err) 71 require.Equal(t, "0x809a9e55000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000003e8", result) 72 73 result, err = Encode("f(uint256)", `["115792089237316195423570985008687907853269984665640564039457584007913129639935"]`) 74 require.NoError(t, err) 75 require.Equal(t, "0xb3de648bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", result) 76 77 //TODO following case would fail cause go-ethereum does not support type uint, should we fix this? 78 //result, err = Encode("g(uint[][],string[])", `[[[1,2],[3]],["one","two","three"]]`) 79 //require.NoError(t, err) 80 //require.Equal(t, "0xad6a3446000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000036f6e650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374776f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057468726565000000000000000000000000000000000000000000000000000000", result) 81 82 } 83 84 func TestDecode(t *testing.T) { 85 out, err := Decode("0x000000000000000000000000000000000000000000000000000000005bc741cd00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000013b86dbf1a83c9e6a492914a0ee39e8a5b7eb60700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d533152484e4a57414b356e426f6f57454d34654d644268707a35666e325764557473457357754a4b79356147000000000000000000000000000000000000", 86 []string{"uint256", "bytes", "address", "uint256", "uint256"}) 87 require.NoError(t, err) 88 bytes, err := json.Marshal(out) 89 require.NoError(t, err) 90 require.JSONEq(t, `[1539785165,"0x516d533152484e4a57414b356e426f6f57454d34654d644268707a35666e325764557473457357754a4b79356147","0x13b86dbf1a83c9e6a492914a0ee39e8a5b7eb607",0,0]`, string(bytes)) 91 92 out, err = Decode("0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000d7621dc58210001", 93 []string{"uint256", "uint256"}) 94 require.NoError(t, err) 95 bytes, err = json.Marshal(out) 96 require.NoError(t, err) 97 require.JSONEq(t, `["1000000000000000000","970000000000000001"]`, string(bytes)) 98 99 out, err = Decode("0x000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000003e8", 100 []string{"address", "address", "uint256"}) 101 require.NoError(t, err) 102 bytes, err = json.Marshal(out) 103 require.NoError(t, err) 104 require.JSONEq(t, `["0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",1000]`, string(bytes)) 105 106 out, err = Decode("0x00000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001", 107 []string{"uint32", "bool"}) 108 require.NoError(t, err) 109 bytes, err = json.Marshal(out) 110 require.NoError(t, err) 111 require.JSONEq(t, `[69,true]`, string(bytes)) 112 113 out, err = Decode("0x61626300000000000000000000000000000000000000000000000000000000006465660000000000000000000000000000000000000000000000000000000000", 114 []string{"bytes3[2]"}) 115 require.NoError(t, err) 116 bytes, err = json.Marshal(out[0]) 117 require.NoError(t, err) 118 require.JSONEq(t, `["616263","646566"]`, string(bytes)) 119 120 out, err = Decode("0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", 121 []string{"string", "bool", "uint256[]"}) 122 require.NoError(t, err) 123 bytes, err = json.Marshal(out) 124 require.NoError(t, err) 125 require.JSONEq(t, `["dave",true,[1,2,3]]`, string(bytes)) 126 127 out, err = Decode("0x00000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", 128 []string{"uint256", "uint32[]", "bytes10", "bytes"}) 129 require.NoError(t, err) 130 bytes, err = json.Marshal(out) 131 require.NoError(t, err) 132 require.JSONEq(t, `[291,[1110,1929],"31323334353637383930","0x48656c6c6f2c20776f726c6421"]`, string(bytes)) 133 }