package abispec import ( "encoding/json" "testing" "github.com/stretchr/testify/require" ) func TestMethodPattern(t *testing.T) { results := methodPattern.FindStringSubmatch("sam(bytes,bool,uint256[])") require.Equal(t, "sam(bytes,bool,uint256[])", results[0]) require.Equal(t, "sam", results[1]) require.Equal(t, "bytes,bool,uint256[]", results[2]) results = methodPattern.FindStringSubmatch("s(bytes,bool,uint256[])") require.Equal(t, "s(bytes,bool,uint256[])", results[0]) require.Equal(t, "s", results[1]) require.Equal(t, "bytes,bool,uint256[]", results[2]) results = methodPattern.FindStringSubmatch("s1(bytes,bool,uint256[])") require.Equal(t, "s1(bytes,bool,uint256[])", results[0]) require.Equal(t, "s1", results[1]) require.Equal(t, "bytes,bool,uint256[]", results[2]) results = methodPattern.FindStringSubmatch("1s(bytes,bool,uint256[])") require.Len(t, results, 0) } func TestEncodeTransfer(t *testing.T) { result, err := EncodeTransfer("0x6f5f90fb1dD8E406F233442935F689bA7D5701b2", "10000") require.NoError(t, err) require.Equal(t, "0xa9059cbb0000000000000000000000006f5f90fb1dd8e406f233442935f689ba7d5701b20000000000000000000000000000000000000000000000000000000000002710", result) result, err = EncodeTransfer("0x6f5f90fb1dD8E406F233442935F689bA7D5701b2", "0x2710") require.NoError(t, err) require.Equal(t, "0xa9059cbb0000000000000000000000006f5f90fb1dd8e406f233442935f689ba7d5701b20000000000000000000000000000000000000000000000000000000000002710", result) } func TestEncode(t *testing.T) { result, err := Encode("baz(uint32,bool)", "[69,true]") require.NoError(t, err) require.Equal(t, "0xcdcd77c000000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001", result) result, err = Encode("baz(uint256,bool)", "[69,true]") require.NoError(t, err) require.Equal(t, "0x72ed38b600000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001", result) result, err = Encode("bar(bytes3[2])", `[["abc","def"]]`) require.NoError(t, err) require.Equal(t, "0xfce353f661626300000000000000000000000000000000000000000000000000000000006465660000000000000000000000000000000000000000000000000000000000", result) result, err = Encode("sam(bytes)", `["dave"]`) require.NoError(t, err) require.Equal(t, "0x05e73fb9000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000046461766500000000000000000000000000000000000000000000000000000000", result) result, err = Encode("sam(bytes,bool,uint256[])", `["dave",true,[1,2,3]]`) require.NoError(t, err) require.Equal(t, "0xa5643bf20000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", result) result, err = Encode("f(bytes10)", `["1234567890"]`) require.NoError(t, err) require.Equal(t, "0x6350865e3132333435363738393000000000000000000000000000000000000000000000", result) result, err = Encode("f(uint256,uint32[],bytes10,bytes)", `[291,[1110,1929],"1234567890","Hello, world!"]`) require.NoError(t, err) require.Equal(t, "0x8be6524600000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", result) result, err = Encode("getExpectedRate(address,address,uint256)", `["0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",1000]`) require.NoError(t, err) require.Equal(t, "0x809a9e55000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000003e8", result) result, err = Encode("f(uint256)", `["115792089237316195423570985008687907853269984665640564039457584007913129639935"]`) require.NoError(t, err) require.Equal(t, "0xb3de648bffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", result) //TODO following case would fail cause go-ethereum does not support type uint, should we fix this? //result, err = Encode("g(uint[][],string[])", `[[[1,2],[3]],["one","two","three"]]`) //require.NoError(t, err) //require.Equal(t, "0xad6a3446000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000001400000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000036f6e650000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000374776f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000057468726565000000000000000000000000000000000000000000000000000000", result) } func TestDecode(t *testing.T) { out, err := Decode("0x000000000000000000000000000000000000000000000000000000005bc741cd00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000013b86dbf1a83c9e6a492914a0ee39e8a5b7eb60700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002e516d533152484e4a57414b356e426f6f57454d34654d644268707a35666e325764557473457357754a4b79356147000000000000000000000000000000000000", []string{"uint256", "bytes", "address", "uint256", "uint256"}) require.NoError(t, err) bytes, err := json.Marshal(out) require.NoError(t, err) require.JSONEq(t, `[1539785165,"0x516d533152484e4a57414b356e426f6f57454d34654d644268707a35666e325764557473457357754a4b79356147","0x13b86dbf1a83c9e6a492914a0ee39e8a5b7eb607",0,0]`, string(bytes)) out, err = Decode("0x0000000000000000000000000000000000000000000000000de0b6b3a76400000000000000000000000000000000000000000000000000000d7621dc58210001", []string{"uint256", "uint256"}) require.NoError(t, err) bytes, err = json.Marshal(out) require.NoError(t, err) require.JSONEq(t, `["1000000000000000000","970000000000000001"]`, string(bytes)) out, err = Decode("0x000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee000000000000000000000000eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee00000000000000000000000000000000000000000000000000000000000003e8", []string{"address", "address", "uint256"}) require.NoError(t, err) bytes, err = json.Marshal(out) require.NoError(t, err) require.JSONEq(t, `["0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee","0xeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee",1000]`, string(bytes)) out, err = Decode("0x00000000000000000000000000000000000000000000000000000000000000450000000000000000000000000000000000000000000000000000000000000001", []string{"uint32", "bool"}) require.NoError(t, err) bytes, err = json.Marshal(out) require.NoError(t, err) require.JSONEq(t, `[69,true]`, string(bytes)) out, err = Decode("0x61626300000000000000000000000000000000000000000000000000000000006465660000000000000000000000000000000000000000000000000000000000", []string{"bytes3[2]"}) require.NoError(t, err) bytes, err = json.Marshal(out[0]) require.NoError(t, err) require.JSONEq(t, `["616263","646566"]`, string(bytes)) out, err = Decode("0x0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000000464617665000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003", []string{"string", "bool", "uint256[]"}) require.NoError(t, err) bytes, err = json.Marshal(out) require.NoError(t, err) require.JSONEq(t, `["dave",true,[1,2,3]]`, string(bytes)) out, err = Decode("0x00000000000000000000000000000000000000000000000000000000000001230000000000000000000000000000000000000000000000000000000000000080313233343536373839300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000004560000000000000000000000000000000000000000000000000000000000000789000000000000000000000000000000000000000000000000000000000000000d48656c6c6f2c20776f726c642100000000000000000000000000000000000000", []string{"uint256", "uint32[]", "bytes10", "bytes"}) require.NoError(t, err) bytes, err = json.Marshal(out) require.NoError(t, err) require.JSONEq(t, `[291,[1110,1929],"31323334353637383930","0x48656c6c6f2c20776f726c6421"]`, string(bytes)) }