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  }