contract_call_test.go 3.14 KB
Newer Older
1 2 3 4 5 6
package batching

import (
	"math/big"
	"testing"

7
	"github.com/ethereum-optimism/optimism/op-service/sources/batching/test"
8 9 10 11 12 13 14
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/common/hexutil"
	"github.com/stretchr/testify/require"
)

func TestContractCall_ToCallArgs(t *testing.T) {
	addr := common.Address{0xbd}
15
	testAbi, err := test.ERC20MetaData.GetAbi()
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
	require.NoError(t, err)
	call := NewContractCall(testAbi, addr, "approve", common.Address{0xcc}, big.NewInt(1234444))
	call.From = common.Address{0xab}
	args, err := call.ToCallArgs()
	require.NoError(t, err)
	argMap, ok := args.(map[string]interface{})
	require.True(t, ok)
	require.Equal(t, argMap["from"], call.From)
	require.Equal(t, argMap["to"], &addr)
	expectedData, err := call.Pack()
	require.NoError(t, err)
	require.Equal(t, argMap["input"], hexutil.Bytes(expectedData))

	require.NotContains(t, argMap, "value")
	require.NotContains(t, argMap, "gas")
	require.NotContains(t, argMap, "gasPrice")
}

func TestContractCall_ToTxCandidate(t *testing.T) {
	addr := common.Address{0xbd}
36
	testAbi, err := test.ERC20MetaData.GetAbi()
37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
	require.NoError(t, err)
	call := NewContractCall(testAbi, addr, "approve", common.Address{0xcc}, big.NewInt(1234444))
	candidate, err := call.ToTxCandidate()
	require.NoError(t, err)
	require.Equal(t, candidate.To, &addr)
	expectedData, err := call.Pack()
	require.NoError(t, err)
	require.Equal(t, candidate.TxData, expectedData)

	require.Nil(t, candidate.Value)
	require.Zero(t, candidate.GasLimit)
}

func TestContractCall_Pack(t *testing.T) {
	addr := common.Address{0xbd}
52
	testAbi, err := test.ERC20MetaData.GetAbi()
53 54 55 56 57 58 59 60 61 62 63 64 65 66
	require.NoError(t, err)
	sender := common.Address{0xcc}
	amount := big.NewInt(1234444)
	call := NewContractCall(testAbi, addr, "approve", sender, amount)
	actual, err := call.Pack()
	require.NoError(t, err)

	expected, err := testAbi.Pack("approve", sender, amount)
	require.NoError(t, err)
	require.Equal(t, actual, expected)
}

func TestContractCall_PackInvalid(t *testing.T) {
	addr := common.Address{0xbd}
67
	testAbi, err := test.ERC20MetaData.GetAbi()
68 69 70 71 72 73 74 75 76
	require.NoError(t, err)
	// Second arg should be a *big.Int so packing should fail
	call := NewContractCall(testAbi, addr, "approve", common.Address{0xcc}, uint32(123))
	_, err = call.Pack()
	require.Error(t, err)
}

func TestContractCall_Unpack(t *testing.T) {
	addr := common.Address{0xbd}
77
	testAbi, err := test.ERC20MetaData.GetAbi()
78 79 80 81 82 83 84 85 86 87 88 89 90 91
	require.NoError(t, err)
	call := NewContractCall(testAbi, addr, "balanceOf", common.Address{0xcc})
	outputs := testAbi.Methods["balanceOf"].Outputs
	expected := big.NewInt(1234)
	packed, err := outputs.Pack(expected)
	require.NoError(t, err)

	unpacked, err := call.Unpack(packed)
	require.NoError(t, err)
	require.Equal(t, unpacked.GetBigInt(0), expected)
}

func TestContractCall_UnpackInvalid(t *testing.T) {
	addr := common.Address{0xbd}
92
	testAbi, err := test.ERC20MetaData.GetAbi()
93 94 95 96 97 98 99 100 101 102
	require.NoError(t, err)
	call := NewContractCall(testAbi, addr, "balanceOf", common.Address{0xcc})

	// Input data is the wrong format and won't unpack successfully
	inputPacked, err := call.Pack()
	require.NoError(t, err)

	_, err = call.Unpack(inputPacked)
	require.Error(t, err)
}