github.com/cgcardona/r-subnet-evm@v0.1.5/accounts/abi/abi_extra_test.go (about) 1 // (c) 2023, Ava Labs, Inc. All rights reserved. 2 // See the file LICENSE for licensing terms. 3 4 package abi 5 6 import ( 7 "bytes" 8 "math/big" 9 "strings" 10 "testing" 11 12 "github.com/ethereum/go-ethereum/common" 13 "github.com/stretchr/testify/require" 14 ) 15 16 // Note: This file contains tests in addition to those found in go-ethereum. 17 18 const TEST_ABI = `[{"type":"function","name":"receive","inputs":[{"name":"sender","type":"address"},{"name":"amount","type":"uint256"},{"name":"memo","type":"bytes"}],"outputs":[{"internalType":"bool","name":"isAllowed","type":"bool"}]}]` 19 20 func TestUnpackInputIntoInterface(t *testing.T) { 21 abi, err := JSON(strings.NewReader(TEST_ABI)) 22 require.NoError(t, err) 23 24 type inputType struct { 25 Sender common.Address 26 Amount *big.Int 27 Memo []byte 28 } 29 input := inputType{ 30 Sender: common.HexToAddress("0x02"), 31 Amount: big.NewInt(100), 32 Memo: []byte("hello"), 33 } 34 data, err := abi.Pack("receive", input.Sender, input.Amount, input.Memo) 35 require.NoError(t, err) 36 37 // Unpack into interface 38 var v inputType 39 err = abi.UnpackInputIntoInterface(&v, "receive", data[4:]) // skips 4 byte selector 40 require.NoError(t, err) 41 42 // Verify unpacked values match input 43 require.Equal(t, v.Amount, input.Amount) 44 require.EqualValues(t, v.Amount, input.Amount) 45 require.True(t, bytes.Equal(v.Memo, input.Memo)) 46 } 47 48 func TestPackOutput(t *testing.T) { 49 abi, err := JSON(strings.NewReader(TEST_ABI)) 50 require.NoError(t, err) 51 52 bytes, err := abi.PackOutput("receive", true) 53 require.NoError(t, err) 54 55 vals, err := abi.Methods["receive"].Outputs.Unpack(bytes) 56 require.NoError(t, err) 57 58 require.Len(t, vals, 1) 59 require.True(t, vals[0].(bool)) 60 }