github.com/ava-labs/subnet-evm@v0.6.4/accounts/abi/bind/bind_test.go (about)

     1  // (c) 2019-2020, Ava Labs, Inc.
     2  //
     3  // This file is a derived work, based on the go-ethereum library whose original
     4  // notices appear below.
     5  //
     6  // It is distributed under a license compatible with the licensing terms of the
     7  // original code from which it is derived.
     8  //
     9  // Much love to the original authors for their work.
    10  // **********
    11  // Copyright 2016 The go-ethereum Authors
    12  // This file is part of the go-ethereum library.
    13  //
    14  // The go-ethereum library is free software: you can redistribute it and/or modify
    15  // it under the terms of the GNU Lesser General Public License as published by
    16  // the Free Software Foundation, either version 3 of the License, or
    17  // (at your option) any later version.
    18  //
    19  // The go-ethereum library is distributed in the hope that it will be useful,
    20  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    21  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    22  // GNU Lesser General Public License for more details.
    23  //
    24  // You should have received a copy of the GNU Lesser General Public License
    25  // along with the go-ethereum library. If not, see <http://www.gnu.org/licenses/>.
    26  
    27  package bind
    28  
    29  import (
    30  	"fmt"
    31  	"os"
    32  	"os/exec"
    33  	"path/filepath"
    34  	"runtime"
    35  	"strings"
    36  	"testing"
    37  
    38  	"github.com/ethereum/go-ethereum/common"
    39  )
    40  
    41  var bindTests = []struct {
    42  	name     string
    43  	contract string
    44  	bytecode []string
    45  	abi      []string
    46  	imports  string
    47  	tester   string
    48  	fsigs    []map[string]string
    49  	libs     map[string]string
    50  	aliases  map[string]string
    51  	types    []string
    52  }{
    53  	// Test that the binding is available in combined and separate forms too
    54  	{
    55  		`Empty`,
    56  		`contract NilContract {}`,
    57  		[]string{`606060405260068060106000396000f3606060405200`},
    58  		[]string{`[]`},
    59  		`"github.com/ethereum/go-ethereum/common"`,
    60  		`
    61  			if b, err := NewEmpty(common.Address{}, nil); b == nil || err != nil {
    62  				t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil)
    63  			}
    64  			if b, err := NewEmptyCaller(common.Address{}, nil); b == nil || err != nil {
    65  				t.Fatalf("caller binding (%v) nil or error (%v) not nil", b, nil)
    66  			}
    67  			if b, err := NewEmptyTransactor(common.Address{}, nil); b == nil || err != nil {
    68  				t.Fatalf("transactor binding (%v) nil or error (%v) not nil", b, nil)
    69  			}
    70  		`,
    71  		nil,
    72  		nil,
    73  		nil,
    74  		nil,
    75  	},
    76  	// Test that all the official sample contracts bind correctly
    77  	{
    78  		`Token`,
    79  		`https://ethereum.org/token`,
    80  		[]string{`60606040526040516107fd3803806107fd83398101604052805160805160a05160c051929391820192909101600160a060020a0333166000908152600360209081526040822086905581548551838052601f6002600019610100600186161502019093169290920482018390047f290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e56390810193919290918801908390106100e857805160ff19168380011785555b506101189291505b8082111561017157600081556001016100b4565b50506002805460ff19168317905550505050610658806101a56000396000f35b828001600101855582156100ac579182015b828111156100ac5782518260005055916020019190600101906100fa565b50508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061017557805160ff19168380011785555b506100c89291506100b4565b5090565b82800160010185558215610165579182015b8281111561016557825182600050559160200191906001019061018756606060405236156100775760e060020a600035046306fdde03811461007f57806323b872dd146100dc578063313ce5671461010e57806370a082311461011a57806395d89b4114610132578063a9059cbb1461018e578063cae9ca51146101bd578063dc3080f21461031c578063dd62ed3e14610341575b610365610002565b61036760008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b6103d5600435602435604435600160a060020a038316600090815260036020526040812054829010156104f357610002565b6103e760025460ff1681565b6103d560043560036020526000908152604090205481565b610367600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156104eb5780601f106104c0576101008083540402835291602001916104eb565b610365600435602435600160a060020a033316600090815260036020526040902054819010156103f157610002565b60806020604435600481810135601f8101849004909302840160405260608381526103d5948235946024803595606494939101919081908382808284375094965050505050505060006000836004600050600033600160a060020a03168152602001908152602001600020600050600087600160a060020a031681526020019081526020016000206000508190555084905080600160a060020a0316638f4ffcb1338630876040518560e060020a0281526004018085600160a060020a0316815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156102f25780820380516001836020036101000a031916815260200191505b50955050505050506000604051808303816000876161da5a03f11561000257505050509392505050565b6005602090815260043560009081526040808220909252602435815220546103d59081565b60046020818152903560009081526040808220909252602435815220546103d59081565b005b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156103c75780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b60408051918252519081900360200190f35b6060908152602090f35b600160a060020a03821660009081526040902054808201101561041357610002565b806003600050600033600160a060020a03168152602001908152602001600020600082828250540392505081905550806003600050600084600160a060020a0316815260200190815260200160002060008282825054019250508190555081600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a35050565b820191906000526020600020905b8154815290600101906020018083116104ce57829003601f168201915b505050505081565b600160a060020a03831681526040812054808301101561051257610002565b600160a060020a0380851680835260046020908152604080852033949094168086529382528085205492855260058252808520938552929052908220548301111561055c57610002565b816003600050600086600160a060020a03168152602001908152602001600020600082828250540392505081905550816003600050600085600160a060020a03168152602001908152602001600020600082828250540192505081905550816005600050600086600160a060020a03168152602001908152602001600020600050600033600160a060020a0316815260200190815260200160002060008282825054019250508190555082600160a060020a031633600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a3939250505056`},
    81  		[]string{`[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[{"name":"success","type":"bool"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"spentAllowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"inputs":[{"name":"initialSupply","type":"uint256"},{"name":"tokenName","type":"string"},{"name":"decimalUnits","type":"uint8"},{"name":"tokenSymbol","type":"string"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]`},
    82  		`"github.com/ethereum/go-ethereum/common"`,
    83  		`
    84  			if b, err := NewToken(common.Address{}, nil); b == nil || err != nil {
    85  				t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
    86  			}
    87  		`,
    88  		nil,
    89  		nil,
    90  		nil,
    91  		nil,
    92  	},
    93  	{
    94  		`Crowdsale`,
    95  		`https://ethereum.org/crowdsale`,
    96  		[]string{`606060408190526007805460ff1916905560a0806105a883396101006040529051608051915160c05160e05160008054600160a060020a03199081169095178155670de0b6b3a7640000958602600155603c9093024201600355930260045560058054909216909217905561052f90819061007990396000f36060604052361561006c5760e060020a600035046301cb3b20811461008257806329dcb0cf1461014457806338af3eed1461014d5780636e66f6e91461015f5780637a3a0e84146101715780637b3e5e7b1461017a578063a035b1fe14610183578063dc0d3dff1461018c575b61020060075460009060ff161561032357610002565b61020060035460009042106103205760025460015490106103cb576002548154600160a060020a0316908290606082818181858883f150915460025460408051600160a060020a039390931683526020830191909152818101869052517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf6945090819003909201919050a15b60405160008054600160a060020a039081169230909116319082818181858883f150506007805460ff1916600117905550505050565b6103a160035481565b6103ab600054600160a060020a031681565b6103ab600554600160a060020a031681565b6103a160015481565b6103a160025481565b6103a160045481565b6103be60043560068054829081101561000257506000526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f8101547ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d409190910154600160a060020a03919091169082565b005b505050815481101561000257906000526020600020906002020160005060008201518160000160006101000a815481600160a060020a030219169083021790555060208201518160010160005055905050806002600082828250540192505081905550600560009054906101000a9004600160a060020a0316600160a060020a031663a9059cbb3360046000505484046040518360e060020a0281526004018083600160a060020a03168152602001828152602001925050506000604051808303816000876161da5a03f11561000257505060408051600160a060020a03331681526020810184905260018183015290517fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf692509081900360600190a15b50565b5060a0604052336060908152346080819052600680546001810180835592939282908280158290116102025760020281600202836000526020600020918201910161020291905b8082111561039d57805473ffffffffffffffffffffffffffffffffffffffff19168155600060019190910190815561036a565b5090565b6060908152602090f35b600160a060020a03166060908152602090f35b6060918252608052604090f35b5b60065481101561010e576006805482908110156100025760009182526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f0190600680549254600160a060020a0316928490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460405190915082818181858883f19350505050507fe842aea7a5f1b01049d752008c53c52890b1a6daf660cf39e8eec506112bbdf660066000508281548110156100025760008290526002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d3f01548154600160a060020a039190911691908490811015610002576002027ff652222313e28459528d920b65115c16c04f3efc82aaedc97be59f3f377c0d40015460408051600160a060020a0394909416845260208401919091526000838201525191829003606001919050a16001016103cc56`},
    97  		[]string{`[{"constant":false,"inputs":[],"name":"checkGoalReached","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"deadline","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"beneficiary","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"tokenReward","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":true,"inputs":[],"name":"fundingGoal","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"amountRaised","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"price","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"funders","outputs":[{"name":"addr","type":"address"},{"name":"amount","type":"uint256"}],"type":"function"},{"inputs":[{"name":"ifSuccessfulSendTo","type":"address"},{"name":"fundingGoalInEthers","type":"uint256"},{"name":"durationInMinutes","type":"uint256"},{"name":"etherCostOfEachToken","type":"uint256"},{"name":"addressOfTokenUsedAsReward","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"backer","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"isContribution","type":"bool"}],"name":"FundTransfer","type":"event"}]`},
    98  		`"github.com/ethereum/go-ethereum/common"`,
    99  		`
   100  			if b, err := NewCrowdsale(common.Address{}, nil); b == nil || err != nil {
   101  				t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   102  			}
   103  		`,
   104  		nil,
   105  		nil,
   106  		nil,
   107  		nil,
   108  	},
   109  	{
   110  		`DAO`,
   111  		`https://ethereum.org/dao`,
   112  		[]string{`606060405260405160808061145f833960e06040529051905160a05160c05160008054600160a060020a03191633179055600184815560028490556003839055600780549182018082558280158290116100b8576003028160030283600052602060002091820191016100b891906101c8565b50506060919091015160029190910155600160a060020a0381166000146100a65760008054600160a060020a031916821790555b505050506111f18061026e6000396000f35b505060408051608081018252600080825260208281018290528351908101845281815292820192909252426060820152600780549194509250811015610002579081527fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c6889050815181546020848101517401000000000000000000000000000000000000000002600160a060020a03199290921690921760a060020a60ff021916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f9081018390048201949192919091019083901061023e57805160ff19168380011785555b50610072929150610226565b5050600060028201556001015b8082111561023a578054600160a860020a031916815560018181018054600080835592600290821615610100026000190190911604601f81901061020c57506101bb565b601f0160209004906000526020600020908101906101bb91905b8082111561023a5760008155600101610226565b5090565b828001600101855582156101af579182015b828111156101af57825182600050559160200191906001019061025056606060405236156100b95760e060020a6000350463013cf08b81146100bb578063237e9492146101285780633910682114610281578063400e3949146102995780635daf08ca146102a257806369bd34361461032f5780638160f0b5146103385780638da5cb5b146103415780639644fcbd14610353578063aa02a90f146103be578063b1050da5146103c7578063bcca1fd3146104b5578063d3c0715b146104dc578063eceb29451461058d578063f2fde38b1461067b575b005b61069c6004356004805482908110156100025790600052602060002090600a02016000506005810154815460018301546003840154600485015460068601546007870154600160a060020a03959095169750929560020194919360ff828116946101009093041692919089565b60408051602060248035600481810135601f81018590048502860185019096528585526107759581359591946044949293909201918190840183828082843750949650505050505050600060006004600050848154811015610002575090527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19e600a8402908101547f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b909101904210806101e65750600481015460ff165b8061026757508060000160009054906101000a9004600160a060020a03168160010160005054846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f15090500193505050506040518091039020816007016000505414155b8061027757506001546005820154105b1561109257610002565b61077560043560066020526000908152604090205481565b61077560055481565b61078760043560078054829081101561000257506000526003026000805160206111d18339815191528101547fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c68a820154600160a060020a0382169260a060020a90920460ff16917fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c689019084565b61077560025481565b61077560015481565b610830600054600160a060020a031681565b604080516020604435600481810135601f81018490048402850184019095528484526100b9948135946024803595939460649492939101918190840183828082843750949650505050505050600080548190600160a060020a03908116339091161461084d57610002565b61077560035481565b604080516020604435600481810135601f8101849004840285018401909552848452610775948135946024803595939460649492939101918190840183828082843750506040805160209735808a0135601f81018a90048a0283018a019093528282529698976084979196506024909101945090925082915084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806104ab5750604081205460078054909190811015610002579082526003026000805160206111d1833981519152015460a060020a900460ff16155b15610ce557610002565b6100b960043560243560443560005433600160a060020a03908116911614610b1857610002565b604080516020604435600481810135601f810184900484028501840190955284845261077594813594602480359593946064949293910191819084018382808284375094965050505050505033600160a060020a031660009081526006602052604081205481908114806105835750604081205460078054909190811015610002579082526003026000805160206111d18339815191520181505460a060020a900460ff16155b15610f1d57610002565b604080516020606435600481810135601f81018490048402850184019095528484526107759481359460248035956044359560849492019190819084018382808284375094965050505050505060006000600460005086815481101561000257908252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01815090508484846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005054149150610cdc565b6100b960043560005433600160a060020a03908116911614610f0857610002565b604051808a600160a060020a031681526020018981526020018060200188815260200187815260200186815260200185815260200184815260200183815260200182810382528981815460018160011615610100020316600290048152602001915080546001816001161561010002031660029004801561075e5780601f106107335761010080835404028352916020019161075e565b820191906000526020600020905b81548152906001019060200180831161074157829003601f168201915b50509a505050505050505050505060405180910390f35b60408051918252519081900360200190f35b60408051600160a060020a038616815260208101859052606081018390526080918101828152845460026001821615610100026000190190911604928201839052909160a08301908590801561081e5780601f106107f35761010080835404028352916020019161081e565b820191906000526020600020905b81548152906001019060200180831161080157829003601f168201915b50509550505050505060405180910390f35b60408051600160a060020a03929092168252519081900360200190f35b600160a060020a03851660009081526006602052604081205414156108a957604060002060078054918290556001820180825582801582901161095c5760030281600302836000526020600020918201910161095c9190610a4f565b600160a060020a03851660009081526006602052604090205460078054919350908390811015610002575060005250600381026000805160206111d183398151915201805474ff0000000000000000000000000000000000000000191660a060020a85021781555b60408051600160a060020a03871681526020810186905281517f27b022af4a8347100c7a041ce5ccf8e14d644ff05de696315196faae8cd50c9b929181900390910190a15050505050565b505050915081506080604051908101604052808681526020018581526020018481526020014281526020015060076000508381548110156100025790600052602060002090600302016000508151815460208481015160a060020a02600160a060020a03199290921690921774ff00000000000000000000000000000000000000001916178255604083015180516001848101805460008281528690209195600293821615610100026000190190911692909204601f90810183900482019491929190910190839010610ad357805160ff19168380011785555b50610b03929150610abb565b5050600060028201556001015b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610aa15750610a42565b601f016020900490600052602060002090810190610a4291905b80821115610acf5760008155600101610abb565b5090565b82800160010185558215610a36579182015b82811115610a36578251826000505591602001919060010190610ae5565b50506060919091015160029190910155610911565b600183905560028290556003819055604080518481526020810184905280820183905290517fa439d3fa452be5e0e1e24a8145e715f4fd8b9c08c96a42fd82a855a85e5d57de9181900360600190a1505050565b50508585846040518084600160a060020a0316606060020a0281526014018381526020018280519060200190808383829060006004602084601f0104600f02600301f150905001935050505060405180910390208160070160005081905550600260005054603c024201816003016000508190555060008160040160006101000a81548160ff0219169083021790555060008160040160016101000a81548160ff02191690830217905550600081600501600050819055507f646fec02522b41e7125cfc859a64fd4f4cefd5dc3b6237ca0abe251ded1fa881828787876040518085815260200184600160a060020a03168152602001838152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f168015610cc45780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1600182016005555b50949350505050565b6004805460018101808355909190828015829011610d1c57600a0281600a028360005260206000209182019101610d1c9190610db8565b505060048054929450918491508110156100025790600052602060002090600a02016000508054600160a060020a031916871781556001818101879055855160028381018054600082815260209081902096975091959481161561010002600019011691909104601f90810182900484019391890190839010610ed857805160ff19168380011785555b50610b6c929150610abb565b50506001015b80821115610acf578054600160a060020a03191681556000600182810182905560028381018054848255909281161561010002600019011604601f819010610e9c57505b5060006003830181905560048301805461ffff191690556005830181905560068301819055600783018190556008830180548282559082526020909120610db2916002028101905b80821115610acf57805474ffffffffffffffffffffffffffffffffffffffffff1916815560018181018054600080835592600290821615610100026000190190911604601f819010610eba57505b5050600101610e44565b601f016020900490600052602060002090810190610dfc9190610abb565b601f016020900490600052602060002090810190610e929190610abb565b82800160010185558215610da6579182015b82811115610da6578251826000505591602001919060010190610eea565b60008054600160a060020a0319168217905550565b600480548690811015610002576000918252600a027f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b01905033600160a060020a0316600090815260098201602052604090205490915060ff1660011415610f8457610002565b33600160a060020a031660009081526009820160205260409020805460ff1916600190811790915560058201805490910190558315610fcd576006810180546001019055610fda565b6006810180546000190190555b7fc34f869b7ff431b034b7b9aea9822dac189a685e0b015c7d1be3add3f89128e8858533866040518085815260200184815260200183600160a060020a03168152602001806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f16801561107a5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a1509392505050565b6006810154600354901315611158578060000160009054906101000a9004600160a060020a0316600160a060020a03168160010160005054670de0b6b3a76400000284604051808280519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156111225780820380516001836020036101000a031916815260200191505b5091505060006040518083038185876185025a03f15050505060048101805460ff191660011761ff00191661010017905561116d565b60048101805460ff191660011761ff00191690555b60068101546005820154600483015460408051888152602081019490945283810192909252610100900460ff166060830152517fd220b7272a8b6d0d7d6bcdace67b936a8f175e6d5c1b3ee438b72256b32ab3af9181900360800190a1509291505056a66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688`},
   113  		[]string{`[{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposals","outputs":[{"name":"recipient","type":"address"},{"name":"amount","type":"uint256"},{"name":"description","type":"string"},{"name":"votingDeadline","type":"uint256"},{"name":"executed","type":"bool"},{"name":"proposalPassed","type":"bool"},{"name":"numberOfVotes","type":"uint256"},{"name":"currentResult","type":"int256"},{"name":"proposalHash","type":"bytes32"}],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"executeProposal","outputs":[{"name":"result","type":"int256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"memberId","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"numProposals","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"members","outputs":[{"name":"member","type":"address"},{"name":"canVote","type":"bool"},{"name":"name","type":"string"},{"name":"memberSince","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"debatingPeriodInMinutes","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"minimumQuorum","outputs":[{"name":"","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"type":"function"},{"constant":false,"inputs":[{"name":"targetMember","type":"address"},{"name":"canVote","type":"bool"},{"name":"memberName","type":"string"}],"name":"changeMembership","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"majorityMargin","outputs":[{"name":"","type":"int256"}],"type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"JobDescription","type":"string"},{"name":"transactionBytecode","type":"bytes"}],"name":"newProposal","outputs":[{"name":"proposalID","type":"uint256"}],"type":"function"},{"constant":false,"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"}],"name":"changeVotingRules","outputs":[],"type":"function"},{"constant":false,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"supportsProposal","type":"bool"},{"name":"justificationText","type":"string"}],"name":"vote","outputs":[{"name":"voteID","type":"uint256"}],"type":"function"},{"constant":true,"inputs":[{"name":"proposalNumber","type":"uint256"},{"name":"beneficiary","type":"address"},{"name":"etherAmount","type":"uint256"},{"name":"transactionBytecode","type":"bytes"}],"name":"checkProposalCode","outputs":[{"name":"codeChecksOut","type":"bool"}],"type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"type":"function"},{"inputs":[{"name":"minimumQuorumForProposals","type":"uint256"},{"name":"minutesForDebate","type":"uint256"},{"name":"marginOfVotesForMajority","type":"int256"},{"name":"congressLeader","type":"address"}],"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"recipient","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"description","type":"string"}],"name":"ProposalAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"position","type":"bool"},{"indexed":false,"name":"voter","type":"address"},{"indexed":false,"name":"justification","type":"string"}],"name":"Voted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"proposalID","type":"uint256"},{"indexed":false,"name":"result","type":"int256"},{"indexed":false,"name":"quorum","type":"uint256"},{"indexed":false,"name":"active","type":"bool"}],"name":"ProposalTallied","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"member","type":"address"},{"indexed":false,"name":"isMember","type":"bool"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"minimumQuorum","type":"uint256"},{"indexed":false,"name":"debatingPeriodInMinutes","type":"uint256"},{"indexed":false,"name":"majorityMargin","type":"int256"}],"name":"ChangeOfRules","type":"event"}]`},
   114  		`"github.com/ethereum/go-ethereum/common"`,
   115  		`
   116  			if b, err := NewDAO(common.Address{}, nil); b == nil || err != nil {
   117  				t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   118  			}
   119  		`,
   120  		nil,
   121  		nil,
   122  		nil,
   123  		nil,
   124  	},
   125  	// Test that named and anonymous inputs are handled correctly
   126  	{
   127  		`InputChecker`, ``, []string{``},
   128  		[]string{`
   129  			[
   130  				{"type":"function","name":"noInput","constant":true,"inputs":[],"outputs":[]},
   131  				{"type":"function","name":"namedInput","constant":true,"inputs":[{"name":"str","type":"string"}],"outputs":[]},
   132  				{"type":"function","name":"anonInput","constant":true,"inputs":[{"name":"","type":"string"}],"outputs":[]},
   133  				{"type":"function","name":"namedInputs","constant":true,"inputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}],"outputs":[]},
   134  				{"type":"function","name":"anonInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"outputs":[]},
   135  				{"type":"function","name":"mixedInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"str","type":"string"}],"outputs":[]}
   136  			]
   137  		`},
   138  		`
   139  			"fmt"
   140  
   141  			"github.com/ethereum/go-ethereum/common"
   142  		`,
   143  		`if b, err := NewInputChecker(common.Address{}, nil); b == nil || err != nil {
   144  			 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   145  		 } else if false { // Don't run, just compile and test types
   146  			 var err error
   147  
   148  			 err = b.NoInput(nil)
   149  			 err = b.NamedInput(nil, "")
   150  			 err = b.AnonInput(nil, "")
   151  			 err = b.NamedInputs(nil, "", "")
   152  			 err = b.AnonInputs(nil, "", "")
   153  			 err = b.MixedInputs(nil, "", "")
   154  
   155  			 fmt.Println(err)
   156  		 }`,
   157  		nil,
   158  		nil,
   159  		nil,
   160  		nil,
   161  	},
   162  	// Test that named and anonymous outputs are handled correctly
   163  	{
   164  		`OutputChecker`, ``, []string{``},
   165  		[]string{`
   166  			[
   167  				{"type":"function","name":"noOutput","constant":true,"inputs":[],"outputs":[]},
   168  				{"type":"function","name":"namedOutput","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"}]},
   169  				{"type":"function","name":"anonOutput","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"}]},
   170  				{"type":"function","name":"namedOutputs","constant":true,"inputs":[],"outputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}]},
   171  				{"type":"function","name":"collidingOutputs","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"},{"name":"Str","type":"string"}]},
   172  				{"type":"function","name":"anonOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"","type":"string"}]},
   173  				{"type":"function","name":"mixedOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"str","type":"string"}]}
   174  			]
   175  		`},
   176  		`
   177  			"fmt"
   178  
   179  			"github.com/ethereum/go-ethereum/common"
   180  		`,
   181  		`if b, err := NewOutputChecker(common.Address{}, nil); b == nil || err != nil {
   182  			 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   183  		 } else if false { // Don't run, just compile and test types
   184  			 var str1, str2 string
   185  			 var err error
   186  
   187  			 err              = b.NoOutput(nil)
   188  			 str1, err        = b.NamedOutput(nil)
   189  			 str1, err        = b.AnonOutput(nil)
   190  			 res, _          := b.NamedOutputs(nil)
   191  			 str1, str2, err  = b.CollidingOutputs(nil)
   192  			 str1, str2, err  = b.AnonOutputs(nil)
   193  			 str1, str2, err  = b.MixedOutputs(nil)
   194  
   195  			 fmt.Println(str1, str2, res.Str1, res.Str2, err)
   196  		 }`,
   197  		nil,
   198  		nil,
   199  		nil,
   200  		nil,
   201  	},
   202  	// Tests that named, anonymous and indexed events are handled correctly
   203  	{
   204  		`EventChecker`, ``, []string{``},
   205  		[]string{`
   206  			[
   207  				{"type":"event","name":"empty","inputs":[]},
   208  				{"type":"event","name":"indexed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256","indexed":true}]},
   209  				{"type":"event","name":"mixed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256"}]},
   210  				{"type":"event","name":"anonymous","anonymous":true,"inputs":[]},
   211  				{"type":"event","name":"dynamic","inputs":[{"name":"idxStr","type":"string","indexed":true},{"name":"idxDat","type":"bytes","indexed":true},{"name":"str","type":"string"},{"name":"dat","type":"bytes"}]},
   212  				{"type":"event","name":"unnamed","inputs":[{"name":"","type":"uint256","indexed": true},{"name":"","type":"uint256","indexed":true}]}
   213  			]
   214  		`},
   215  		`
   216  			"fmt"
   217  			"math/big"
   218  			"reflect"
   219  
   220  			"github.com/ethereum/go-ethereum/common"
   221  		`,
   222  		`if e, err := NewEventChecker(common.Address{}, nil); e == nil || err != nil {
   223  			 t.Fatalf("binding (%v) nil or error (%v) not nil", e, nil)
   224  		 } else if false { // Don't run, just compile and test types
   225  			 var (
   226  				 err  error
   227  			   res  bool
   228  				 str  string
   229  				 dat  []byte
   230  				 hash common.Hash
   231  			 )
   232  			 _, err = e.FilterEmpty(nil)
   233  			 _, err = e.FilterIndexed(nil, []common.Address{}, []*big.Int{})
   234  
   235  			 mit, err := e.FilterMixed(nil, []common.Address{})
   236  
   237  			 res = mit.Next()  // Make sure the iterator has a Next method
   238  			 err = mit.Error() // Make sure the iterator has an Error method
   239  			 err = mit.Close() // Make sure the iterator has a Close method
   240  
   241  			 fmt.Println(mit.Event.Raw.BlockHash) // Make sure the raw log is contained within the results
   242  			 fmt.Println(mit.Event.Num)           // Make sure the unpacked non-indexed fields are present
   243  			 fmt.Println(mit.Event.Addr)          // Make sure the reconstructed indexed fields are present
   244  
   245  			 dit, err := e.FilterDynamic(nil, []string{}, [][]byte{})
   246  
   247  			 str  = dit.Event.Str    // Make sure non-indexed strings retain their type
   248  			 dat  = dit.Event.Dat    // Make sure non-indexed bytes retain their type
   249  			 hash = dit.Event.IdxStr // Make sure indexed strings turn into hashes
   250  			 hash = dit.Event.IdxDat // Make sure indexed bytes turn into hashes
   251  
   252  			 sink := make(chan *EventCheckerMixed)
   253  			 sub, err := e.WatchMixed(nil, sink, []common.Address{})
   254  			 defer sub.Unsubscribe()
   255  
   256  			 event := <-sink
   257  			 fmt.Println(event.Raw.BlockHash) // Make sure the raw log is contained within the results
   258  			 fmt.Println(event.Num)           // Make sure the unpacked non-indexed fields are present
   259  			 fmt.Println(event.Addr)          // Make sure the reconstructed indexed fields are present
   260  
   261  			 fmt.Println(res, str, dat, hash, err)
   262  
   263  			 oit, err := e.FilterUnnamed(nil, []*big.Int{}, []*big.Int{})
   264  
   265  			 arg0  := oit.Event.Arg0    // Make sure unnamed arguments are handled correctly
   266  			 arg1  := oit.Event.Arg1    // Make sure unnamed arguments are handled correctly
   267  			 fmt.Println(arg0, arg1)
   268  		 }
   269  		 // Run a tiny reflection test to ensure disallowed methods don't appear
   270  		 if _, ok := reflect.TypeOf(&EventChecker{}).MethodByName("FilterAnonymous"); ok {
   271  		 	t.Errorf("binding has disallowed method (FilterAnonymous)")
   272  		 }`,
   273  		nil,
   274  		nil,
   275  		nil,
   276  		nil,
   277  	},
   278  	// Test that contract interactions (deploy, transact and call) generate working code
   279  	{
   280  		`Interactor`,
   281  		`
   282  			contract Interactor {
   283  				string public deployString;
   284  				string public transactString;
   285  
   286  				function Interactor(string str) {
   287  				  deployString = str;
   288  				}
   289  
   290  				function transact(string str) {
   291  				  transactString = str;
   292  				}
   293  			}
   294  		`,
   295  		[]string{`6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`},
   296  		[]string{`[{"constant":true,"inputs":[],"name":"transactString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":true,"inputs":[],"name":"deployString","outputs":[{"name":"","type":"string"}],"type":"function"},{"constant":false,"inputs":[{"name":"str","type":"string"}],"name":"transact","outputs":[],"type":"function"},{"inputs":[{"name":"str","type":"string"}],"type":"constructor"}]`},
   297  		`
   298  			"math/big"
   299  
   300  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   301  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   302  			"github.com/ava-labs/subnet-evm/core"
   303  			"github.com/ethereum/go-ethereum/crypto"
   304  		`,
   305  		`
   306  			// Generate a new random account and a funded simulator
   307  			key, _ := crypto.GenerateKey()
   308  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   309  
   310  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   311  			defer sim.Close()
   312  
   313  			// Deploy an interaction tester contract and call a transaction on it
   314  			_, _, interactor, err := DeployInteractor(auth, sim, "Deploy string")
   315  			if err != nil {
   316  				t.Fatalf("Failed to deploy interactor contract: %v", err)
   317  			}
   318  			if _, err := interactor.Transact(auth, "Transact string"); err != nil {
   319  				t.Fatalf("Failed to transact with interactor contract: %v", err)
   320  			}
   321  			// Commit all pending transactions in the simulator and check the contract state
   322  			sim.Commit(false)
   323  
   324  			if str, err := interactor.DeployString(nil); err != nil {
   325  				t.Fatalf("Failed to retrieve deploy string: %v", err)
   326  			} else if str != "Deploy string" {
   327  				t.Fatalf("Deploy string mismatch: have '%s', want 'Deploy string'", str)
   328  			}
   329  			if str, err := interactor.TransactString(nil); err != nil {
   330  				t.Fatalf("Failed to retrieve transact string: %v", err)
   331  			} else if str != "Transact string" {
   332  				t.Fatalf("Transact string mismatch: have '%s', want 'Transact string'", str)
   333  			}
   334  		`,
   335  		nil,
   336  		nil,
   337  		nil,
   338  		nil,
   339  	},
   340  	// Tests that plain values can be properly returned and deserialized
   341  	{
   342  		`Getter`,
   343  		`
   344  			contract Getter {
   345  				function getter() constant returns (string, int, bytes32) {
   346  					return ("Hi", 1, sha3(""));
   347  				}
   348  			}
   349  		`,
   350  		[]string{`606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`},
   351  		[]string{`[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`},
   352  		`
   353  			"math/big"
   354  
   355  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   356  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   357  			"github.com/ava-labs/subnet-evm/core"
   358  			"github.com/ethereum/go-ethereum/crypto"
   359  		`,
   360  		`
   361  			// Generate a new random account and a funded simulator
   362  			key, _ := crypto.GenerateKey()
   363  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   364  
   365  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   366  			defer sim.Close()
   367  
   368  			// Deploy a tuple tester contract and execute a structured call on it
   369  			_, _, getter, err := DeployGetter(auth, sim)
   370  			if err != nil {
   371  				t.Fatalf("Failed to deploy getter contract: %v", err)
   372  			}
   373  			sim.Commit(false)
   374  
   375  			if str, num, _, err := getter.Getter(nil); err != nil {
   376  				t.Fatalf("Failed to call anonymous field retriever: %v", err)
   377  			} else if str != "Hi" || num.Cmp(big.NewInt(1)) != 0 {
   378  				t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", str, num, "Hi", 1)
   379  			}
   380  		`,
   381  		nil,
   382  		nil,
   383  		nil,
   384  		nil,
   385  	},
   386  	// Tests that tuples can be properly returned and deserialized
   387  	{
   388  		`Tupler`,
   389  		`
   390  			contract Tupler {
   391  				function tuple() constant returns (string a, int b, bytes32 c) {
   392  					return ("Hi", 1, sha3(""));
   393  				}
   394  			}
   395  		`,
   396  		[]string{`606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`},
   397  		[]string{`[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`},
   398  		`
   399  			"math/big"
   400  
   401  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   402  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   403  			"github.com/ava-labs/subnet-evm/core"
   404  			"github.com/ethereum/go-ethereum/crypto"
   405  		`,
   406  		`
   407  			// Generate a new random account and a funded simulator
   408  			key, _ := crypto.GenerateKey()
   409  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   410  
   411  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   412  			defer sim.Close()
   413  
   414  			// Deploy a tuple tester contract and execute a structured call on it
   415  			_, _, tupler, err := DeployTupler(auth, sim)
   416  			if err != nil {
   417  				t.Fatalf("Failed to deploy tupler contract: %v", err)
   418  			}
   419  			sim.Commit(false)
   420  
   421  			if res, err := tupler.Tuple(nil); err != nil {
   422  				t.Fatalf("Failed to call structure retriever: %v", err)
   423  			} else if res.A != "Hi" || res.B.Cmp(big.NewInt(1)) != 0 {
   424  				t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", res.A, res.B, "Hi", 1)
   425  			}
   426  		`,
   427  		nil,
   428  		nil,
   429  		nil,
   430  		nil,
   431  	},
   432  	// Tests that arrays/slices can be properly returned and deserialized.
   433  	// Only addresses are tested, remainder just compiled to keep the test small.
   434  	{
   435  		`Slicer`,
   436  		`
   437  			contract Slicer {
   438  				function echoAddresses(address[] input) constant returns (address[] output) {
   439  					return input;
   440  				}
   441  				function echoInts(int[] input) constant returns (int[] output) {
   442  					return input;
   443  				}
   444  				function echoFancyInts(uint24[23] input) constant returns (uint24[23] output) {
   445  					return input;
   446  				}
   447  				function echoBools(bool[] input) constant returns (bool[] output) {
   448  					return input;
   449  				}
   450  			}
   451  		`,
   452  		[]string{`606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`},
   453  		[]string{`[{"constant":true,"inputs":[{"name":"input","type":"address[]"}],"name":"echoAddresses","outputs":[{"name":"output","type":"address[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"uint24[23]"}],"name":"echoFancyInts","outputs":[{"name":"output","type":"uint24[23]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"int256[]"}],"name":"echoInts","outputs":[{"name":"output","type":"int256[]"}],"type":"function"},{"constant":true,"inputs":[{"name":"input","type":"bool[]"}],"name":"echoBools","outputs":[{"name":"output","type":"bool[]"}],"type":"function"}]`},
   454  		`
   455  			"math/big"
   456  			"reflect"
   457  
   458  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   459  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   460  			"github.com/ethereum/go-ethereum/common"
   461  			"github.com/ava-labs/subnet-evm/core"
   462  			"github.com/ethereum/go-ethereum/crypto"
   463  		`,
   464  		`
   465  			// Generate a new random account and a funded simulator
   466  			key, _ := crypto.GenerateKey()
   467  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   468  
   469  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   470  			defer sim.Close()
   471  
   472  			// Deploy a slice tester contract and execute a n array call on it
   473  			_, _, slicer, err := DeploySlicer(auth, sim)
   474  			if err != nil {
   475  					t.Fatalf("Failed to deploy slicer contract: %v", err)
   476  			}
   477  			sim.Commit(false)
   478  
   479  			if out, err := slicer.EchoAddresses(nil, []common.Address{auth.From, common.Address{}}); err != nil {
   480  					t.Fatalf("Failed to call slice echoer: %v", err)
   481  			} else if !reflect.DeepEqual(out, []common.Address{auth.From, common.Address{}}) {
   482  					t.Fatalf("Slice return mismatch: have %v, want %v", out, []common.Address{auth.From, common.Address{}})
   483  			}
   484  		`,
   485  		nil,
   486  		nil,
   487  		nil,
   488  		nil,
   489  	},
   490  	// Tests that anonymous default methods can be correctly invoked
   491  	{
   492  		`Defaulter`,
   493  		`
   494  			contract Defaulter {
   495  				address public caller;
   496  
   497  				function() {
   498  					caller = msg.sender;
   499  				}
   500  			}
   501  		`,
   502  		[]string{`6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`},
   503  		[]string{`[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`},
   504  		`
   505  			"math/big"
   506  
   507  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   508  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   509  			"github.com/ava-labs/subnet-evm/core"
   510  			"github.com/ethereum/go-ethereum/crypto"
   511  		`,
   512  		`
   513  			// Generate a new random account and a funded simulator
   514  			key, _ := crypto.GenerateKey()
   515  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   516  
   517  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   518  			defer sim.Close()
   519  
   520  			// Deploy a default method invoker contract and execute its default method
   521  			_, _, defaulter, err := DeployDefaulter(auth, sim)
   522  			if err != nil {
   523  				t.Fatalf("Failed to deploy defaulter contract: %v", err)
   524  			}
   525  			if _, err := (&DefaulterRaw{defaulter}).Transfer(auth); err != nil {
   526  				t.Fatalf("Failed to invoke default method: %v", err)
   527  			}
   528  			sim.Commit(false)
   529  
   530  			if caller, err := defaulter.Caller(nil); err != nil {
   531  				t.Fatalf("Failed to call address retriever: %v", err)
   532  			} else if (caller != auth.From) {
   533  				t.Fatalf("Address mismatch: have %v, want %v", caller, auth.From)
   534  			}
   535  		`,
   536  		nil,
   537  		nil,
   538  		nil,
   539  		nil,
   540  	},
   541  	// Tests that structs are correctly unpacked
   542  	{
   543  
   544  		`Structs`,
   545  		`
   546  		pragma solidity ^0.6.5;
   547  			pragma experimental ABIEncoderV2;
   548  			contract Structs {
   549  				struct A {
   550  					bytes32 B;
   551  				}
   552  
   553  				function F() public view returns (A[] memory a, uint256[] memory c, bool[] memory d) {
   554  					A[] memory a = new A[](2);
   555  					a[0].B = bytes32(uint256(1234) << 96);
   556  					uint256[] memory c;
   557  					bool[] memory d;
   558  					return (a, c, d);
   559  				}
   560  			
   561  				function G() public view returns (A[] memory a) {
   562  					A[] memory a = new A[](2);
   563  					a[0].B = bytes32(uint256(1234) << 96);
   564  					return a;
   565  				}
   566  			}
   567  		`,
   568  		[]string{`608060405234801561001057600080fd5b50610278806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806328811f591461003b5780636fecb6231461005b575b600080fd5b610043610070565b604051610052939291906101a0565b60405180910390f35b6100636100d6565b6040516100529190610186565b604080516002808252606082810190935282918291829190816020015b610095610131565b81526020019060019003908161008d575050805190915061026960611b9082906000906100be57fe5b60209081029190910101515293606093508392509050565b6040805160028082526060828101909352829190816020015b6100f7610131565b8152602001906001900390816100ef575050805190915061026960611b90829060009061012057fe5b602090810291909101015152905090565b60408051602081019091526000815290565b815260200190565b6000815180845260208085019450808401835b8381101561017b578151518752958201959082019060010161015e565b509495945050505050565b600060208252610199602083018461014b565b9392505050565b6000606082526101b3606083018661014b565b6020838203818501528186516101c98185610239565b91508288019350845b818110156101f3576101e5838651610143565b9484019492506001016101d2565b505084810360408601528551808252908201925081860190845b8181101561022b57825115158552938301939183019160010161020d565b509298975050505050505050565b9081526020019056fea2646970667358221220eb85327e285def14230424c52893aebecec1e387a50bb6b75fc4fdbed647f45f64736f6c63430006050033`},
   569  		[]string{`[{"inputs":[],"name":"F","outputs":[{"components":[{"internalType":"bytes32","name":"B","type":"bytes32"}],"internalType":"structStructs.A[]","name":"a","type":"tuple[]"},{"internalType":"uint256[]","name":"c","type":"uint256[]"},{"internalType":"bool[]","name":"d","type":"bool[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"G","outputs":[{"components":[{"internalType":"bytes32","name":"B","type":"bytes32"}],"internalType":"structStructs.A[]","name":"a","type":"tuple[]"}],"stateMutability":"view","type":"function"}]`},
   570  		`
   571  			"math/big"
   572  
   573  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   574  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   575  			"github.com/ava-labs/subnet-evm/core"
   576  			"github.com/ethereum/go-ethereum/crypto"
   577  		`,
   578  		`
   579  			// Generate a new random account and a funded simulator
   580  			key, _ := crypto.GenerateKey()
   581  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   582  		
   583  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   584  			defer sim.Close()
   585  		
   586  			// Deploy a structs method invoker contract and execute its default method
   587  			_, _, structs, err := DeployStructs(auth, sim)
   588  			if err != nil {
   589  				t.Fatalf("Failed to deploy defaulter contract: %v", err)
   590  			}
   591  			sim.Commit(false)
   592  			opts := bind.CallOpts{}
   593  			if _, err := structs.F(&opts); err != nil {
   594  				t.Fatalf("Failed to invoke F method: %v", err)
   595  			}
   596  			if _, err := structs.G(&opts); err != nil {
   597  				t.Fatalf("Failed to invoke G method: %v", err)
   598  			}
   599  		`,
   600  		nil,
   601  		nil,
   602  		nil,
   603  		nil,
   604  	},
   605  	// Tests that non-existent contracts are reported as such (though only simulator test)
   606  	{
   607  		`NonExistent`,
   608  		`
   609  			contract NonExistent {
   610  				function String() constant returns(string) {
   611  					return "I don't exist";
   612  				}
   613  			}
   614  		`,
   615  		[]string{`6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`},
   616  		[]string{`[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`},
   617  		`
   618  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   619  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   620  			"github.com/ethereum/go-ethereum/common"
   621  			"github.com/ava-labs/subnet-evm/core"
   622  		`,
   623  		`
   624  			// Create a simulator and wrap a non-deployed contract
   625  
   626  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000))
   627  			defer sim.Close()
   628  
   629  			nonexistent, err := NewNonExistent(common.Address{}, sim)
   630  			if err != nil {
   631  				t.Fatalf("Failed to access non-existent contract: %v", err)
   632  			}
   633  			// Ensure that contract calls fail with the appropriate error
   634  			if res, err := nonexistent.String(nil); err == nil {
   635  				t.Fatalf("Call succeeded on non-existent contract: %v", res)
   636  			} else if (err != bind.ErrNoCode) {
   637  				t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode)
   638  			}
   639  		`,
   640  		nil,
   641  		nil,
   642  		nil,
   643  		nil,
   644  	},
   645  	{
   646  		`NonExistentStruct`,
   647  		`
   648  			contract NonExistentStruct {
   649  				function Struct() public view returns(uint256 a, uint256 b) {
   650  					return (10, 10);
   651  				}
   652  			}
   653  		`,
   654  		[]string{`6080604052348015600f57600080fd5b5060888061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063d5f6622514602d575b600080fd5b6033604c565b6040805192835260208301919091528051918290030190f35b600a809156fea264697066735822beefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef64736f6c6343decafe0033`},
   655  		[]string{`[{"inputs":[],"name":"Struct","outputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"stateMutability":"pure","type":"function"}]`},
   656  		`
   657  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   658  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   659  			"github.com/ethereum/go-ethereum/common"
   660  			"github.com/ava-labs/subnet-evm/core"
   661  		`,
   662  		`
   663  			// Create a simulator and wrap a non-deployed contract
   664  
   665  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000))
   666  			defer sim.Close()
   667  
   668  			nonexistent, err := NewNonExistentStruct(common.Address{}, sim)
   669  			if err != nil {
   670  				t.Fatalf("Failed to access non-existent contract: %v", err)
   671  			}
   672  			// Ensure that contract calls fail with the appropriate error
   673  			if res, err := nonexistent.Struct(nil); err == nil {
   674  				t.Fatalf("Call succeeded on non-existent contract: %v", res)
   675  			} else if (err != bind.ErrNoCode) {
   676  				t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode)
   677  			}
   678  		`,
   679  		nil,
   680  		nil,
   681  		nil,
   682  		nil,
   683  	},
   684  	// Tests that gas estimation works for contracts with weird gas mechanics too.
   685  	{
   686  		`FunkyGasPattern`,
   687  		`
   688  			contract FunkyGasPattern {
   689  				string public field;
   690  
   691  				function SetField(string value) {
   692  					// This check will screw gas estimation! Good, good!
   693  					if (msg.gas < 100000) {
   694  						throw;
   695  					}
   696  					field = value;
   697  				}
   698  			}
   699  		`,
   700  		[]string{`606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`},
   701  		[]string{`[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`},
   702  		`
   703  			"math/big"
   704  
   705  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   706  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   707  			"github.com/ava-labs/subnet-evm/core"
   708  			"github.com/ethereum/go-ethereum/crypto"
   709  		`,
   710  		`
   711  			// Generate a new random account and a funded simulator
   712  			key, _ := crypto.GenerateKey()
   713  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   714  
   715  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   716  			defer sim.Close()
   717  
   718  			// Deploy a funky gas pattern contract
   719  			_, _, limiter, err := DeployFunkyGasPattern(auth, sim)
   720  			if err != nil {
   721  				t.Fatalf("Failed to deploy funky contract: %v", err)
   722  			}
   723  			sim.Commit(false)
   724  
   725  			// Set the field with automatic estimation and check that it succeeds
   726  			if _, err := limiter.SetField(auth, "automatic"); err != nil {
   727  				t.Fatalf("Failed to call automatically gased transaction: %v", err)
   728  			}
   729  			sim.Commit(false)
   730  
   731  			if field, _ := limiter.Field(nil); field != "automatic" {
   732  				t.Fatalf("Field mismatch: have %v, want %v", field, "automatic")
   733  			}
   734  		`,
   735  		nil,
   736  		nil,
   737  		nil,
   738  		nil,
   739  	},
   740  	// Test that constant functions can be called from an (optional) specified address
   741  	{
   742  		`CallFrom`,
   743  		`
   744  			contract CallFrom {
   745  				function callFrom() constant returns(address) {
   746  					return msg.sender;
   747  				}
   748  			}
   749  		`, []string{`6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`},
   750  		[]string{`[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`},
   751  		`
   752  			"math/big"
   753  
   754  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   755  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   756  			"github.com/ethereum/go-ethereum/common"
   757  			"github.com/ava-labs/subnet-evm/core"
   758  			"github.com/ethereum/go-ethereum/crypto"
   759  		`,
   760  		`
   761  			// Generate a new random account and a funded simulator
   762  			key, _ := crypto.GenerateKey()
   763  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   764  
   765  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   766  			defer sim.Close()
   767  
   768  			// Deploy a sender tester contract and execute a structured call on it
   769  			_, _, callfrom, err := DeployCallFrom(auth, sim)
   770  			if err != nil {
   771  				t.Fatalf("Failed to deploy sender contract: %v", err)
   772  			}
   773  			sim.Commit(false)
   774  
   775  			if res, err := callfrom.CallFrom(nil); err != nil {
   776  				t.Errorf("Failed to call constant function: %v", err)
   777  			} else if res != (common.Address{}) {
   778  				t.Errorf("Invalid address returned, want: %x, got: %x", (common.Address{}), res)
   779  			}
   780  
   781  			for _, addr := range []common.Address{common.Address{}, common.Address{1}, common.Address{2}} {
   782  				if res, err := callfrom.CallFrom(&bind.CallOpts{From: addr}); err != nil {
   783  					t.Fatalf("Failed to call constant function: %v", err)
   784  				} else if res != addr {
   785  					t.Fatalf("Invalid address returned, want: %x, got: %x", addr, res)
   786  				}
   787  			}
   788  		`,
   789  		nil,
   790  		nil,
   791  		nil,
   792  		nil,
   793  	},
   794  	// Tests that methods and returns with underscores inside work correctly.
   795  	{
   796  		`Underscorer`,
   797  		`
   798  		contract Underscorer {
   799  			function UnderscoredOutput() constant returns (int _int, string _string) {
   800  				return (314, "pi");
   801  			}
   802  			function LowerLowerCollision() constant returns (int _res, int res) {
   803  				return (1, 2);
   804  			}
   805  			function LowerUpperCollision() constant returns (int _res, int Res) {
   806  				return (1, 2);
   807  			}
   808  			function UpperLowerCollision() constant returns (int _Res, int res) {
   809  				return (1, 2);
   810  			}
   811  			function UpperUpperCollision() constant returns (int _Res, int Res) {
   812  				return (1, 2);
   813  			}
   814  			function PurelyUnderscoredOutput() constant returns (int _, int res) {
   815  				return (1, 2);
   816  			}
   817  			function AllPurelyUnderscoredOutput() constant returns (int _, int __) {
   818  				return (1, 2);
   819  			}
   820  			function _under_scored_func() constant returns (int _int) {
   821  				return 0;
   822  			}
   823  		}
   824  		`, []string{`6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`},
   825  		[]string{`[{"constant":true,"inputs":[],"name":"LowerUpperCollision","outputs":[{"name":"_res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_under_scored_func","outputs":[{"name":"_int","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UnderscoredOutput","outputs":[{"name":"_int","type":"int256"},{"name":"_string","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"PurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperLowerCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"AllPurelyUnderscoredOutput","outputs":[{"name":"_","type":"int256"},{"name":"__","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"UpperUpperCollision","outputs":[{"name":"_Res","type":"int256"},{"name":"Res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LowerLowerCollision","outputs":[{"name":"_res","type":"int256"},{"name":"res","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"}]`},
   826  		`
   827  			"fmt"
   828  			"math/big"
   829  
   830  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   831  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   832  			"github.com/ava-labs/subnet-evm/core"
   833  			"github.com/ethereum/go-ethereum/crypto"
   834  		`,
   835  		`
   836  			// Generate a new random account and a funded simulator
   837  			key, _ := crypto.GenerateKey()
   838  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   839  
   840  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   841  			defer sim.Close()
   842  
   843  			// Deploy a underscorer tester contract and execute a structured call on it
   844  			_, _, underscorer, err := DeployUnderscorer(auth, sim)
   845  			if err != nil {
   846  				t.Fatalf("Failed to deploy underscorer contract: %v", err)
   847  			}
   848  			sim.Commit(false)
   849  
   850  			// Verify that underscored return values correctly parse into structs
   851  			if res, err := underscorer.UnderscoredOutput(nil); err != nil {
   852  				t.Errorf("Failed to call constant function: %v", err)
   853  			} else if res.Int.Cmp(big.NewInt(314)) != 0 || res.String != "pi" {
   854  				t.Errorf("Invalid result, want: {314, \"pi\"}, got: %+v", res)
   855  			}
   856  			// Verify that underscored and non-underscored name collisions force tuple outputs
   857  			var a, b *big.Int
   858  
   859  			a, b, _ = underscorer.LowerLowerCollision(nil)
   860  			a, b, _ = underscorer.LowerUpperCollision(nil)
   861  			a, b, _ = underscorer.UpperLowerCollision(nil)
   862  			a, b, _ = underscorer.UpperUpperCollision(nil)
   863  			a, b, _ = underscorer.PurelyUnderscoredOutput(nil)
   864  			a, b, _ = underscorer.AllPurelyUnderscoredOutput(nil)
   865  			a, _ = underscorer.UnderScoredFunc(nil)
   866  
   867  			fmt.Println(a, b, err)
   868  		`,
   869  		nil,
   870  		nil,
   871  		nil,
   872  		nil,
   873  	},
   874  	// Tests that logs can be successfully filtered and decoded.
   875  	{
   876  		`Eventer`,
   877  		`
   878  			contract Eventer {
   879  				event SimpleEvent (
   880  					address indexed Addr,
   881  					bytes32 indexed Id,
   882  					bool    indexed Flag,
   883  					uint    Value
   884  				);
   885  				function raiseSimpleEvent(address addr, bytes32 id, bool flag, uint value) {
   886  					SimpleEvent(addr, id, flag, value);
   887  				}
   888  
   889  				event NodataEvent (
   890  					uint   indexed Number,
   891  					int16  indexed Short,
   892  					uint32 indexed Long
   893  				);
   894  				function raiseNodataEvent(uint number, int16 short, uint32 long) {
   895  					NodataEvent(number, short, long);
   896  				}
   897  
   898  				event DynamicEvent (
   899  					string indexed IndexedString,
   900  					bytes  indexed IndexedBytes,
   901  					string NonIndexedString,
   902  					bytes  NonIndexedBytes
   903  				);
   904  				function raiseDynamicEvent(string str, bytes blob) {
   905  					DynamicEvent(str, blob, str, blob);
   906  				}
   907  
   908  				event FixedBytesEvent (
   909  					bytes24 indexed IndexedBytes,
   910  					bytes24 NonIndexedBytes
   911  				);
   912  				function raiseFixedBytesEvent(bytes24 blob) {
   913  					FixedBytesEvent(blob, blob);
   914  				}
   915  			}
   916  		`,
   917  		[]string{`608060405234801561001057600080fd5b5061043f806100206000396000f3006080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663528300ff8114610066578063630c31e2146100ff5780636cc6b94014610138578063c7d116dd1461015b575b600080fd5b34801561007257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100fd94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506101829650505050505050565b005b34801561010b57600080fd5b506100fd73ffffffffffffffffffffffffffffffffffffffff60043516602435604435151560643561033c565b34801561014457600080fd5b506100fd67ffffffffffffffff1960043516610394565b34801561016757600080fd5b506100fd60043560243560010b63ffffffff604435166103d6565b806040518082805190602001908083835b602083106101b25780518252601f199092019160209182019101610193565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955087945090928392508401908083835b6020831061020b5780518252601f1990920191602091820191016101ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561029c578181015183820152602001610284565b50505050905090810190601f1680156102c95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102fc5781810151838201526020016102e4565b50505050905090810190601f1680156103295780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b60408051828152905183151591859173ffffffffffffffffffffffffffffffffffffffff8816917f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8919081900360200190a450505050565b6040805167ffffffffffffffff19831680825291517fcdc4c1b1aed5524ffb4198d7a5839a34712baef5fa06884fac7559f4a5854e0a9181900360200190a250565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820468b5843bf653145bd924b323c64ef035d3dd922c170644b44d61aa666ea6eee0029`},
   918  		[]string{`[{"constant":false,"inputs":[{"name":"str","type":"string"},{"name":"blob","type":"bytes"}],"name":"raiseDynamicEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"addr","type":"address"},{"name":"id","type":"bytes32"},{"name":"flag","type":"bool"},{"name":"value","type":"uint256"}],"name":"raiseSimpleEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"blob","type":"bytes24"}],"name":"raiseFixedBytesEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"number","type":"uint256"},{"name":"short","type":"int16"},{"name":"long","type":"uint32"}],"name":"raiseNodataEvent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Addr","type":"address"},{"indexed":true,"name":"Id","type":"bytes32"},{"indexed":true,"name":"Flag","type":"bool"},{"indexed":false,"name":"Value","type":"uint256"}],"name":"SimpleEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"Number","type":"uint256"},{"indexed":true,"name":"Short","type":"int16"},{"indexed":true,"name":"Long","type":"uint32"}],"name":"NodataEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedString","type":"string"},{"indexed":true,"name":"IndexedBytes","type":"bytes"},{"indexed":false,"name":"NonIndexedString","type":"string"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes"}],"name":"DynamicEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"IndexedBytes","type":"bytes24"},{"indexed":false,"name":"NonIndexedBytes","type":"bytes24"}],"name":"FixedBytesEvent","type":"event"}]`},
   919  		`
   920  			"math/big"
   921  			"time"
   922  
   923  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
   924  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
   925  			"github.com/ethereum/go-ethereum/common"
   926  			"github.com/ava-labs/subnet-evm/core"
   927  			"github.com/ethereum/go-ethereum/crypto"
   928  		`,
   929  		`
   930  			// Generate a new random account and a funded simulator
   931  			key, _ := crypto.GenerateKey()
   932  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   933  
   934  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   935  			defer sim.Close()
   936  
   937  			// Deploy an eventer contract
   938  			_, _, eventer, err := DeployEventer(auth, sim)
   939  			if err != nil {
   940  				t.Fatalf("Failed to deploy eventer contract: %v", err)
   941  			}
   942  			sim.Commit(false)
   943  
   944  			// Inject a few events into the contract, gradually more in each block
   945  			for i := 1; i <= 3; i++ {
   946  				for j := 1; j <= i; j++ {
   947  					if _, err := eventer.RaiseSimpleEvent(auth, common.Address{byte(j)}, [32]byte{byte(j)}, true, big.NewInt(int64(10*i+j))); err != nil {
   948  						t.Fatalf("block %d, event %d: raise failed: %v", i, j, err)
   949  					}
   950  				}
   951  				sim.Commit(false)
   952  			}
   953  			// Test filtering for certain events and ensure they can be found
   954  			sit, err := eventer.FilterSimpleEvent(nil, []common.Address{common.Address{1}, common.Address{3}}, [][32]byte{{byte(1)}, {byte(2)}, {byte(3)}}, []bool{true})
   955  			if err != nil {
   956  				t.Fatalf("failed to filter for simple events: %v", err)
   957  			}
   958  			defer sit.Close()
   959  
   960  			sit.Next()
   961  			if sit.Event.Value.Uint64() != 11 || !sit.Event.Flag {
   962  				t.Errorf("simple log content mismatch: have %v, want {11, true}", sit.Event)
   963  			}
   964  			sit.Next()
   965  			if sit.Event.Value.Uint64() != 21 || !sit.Event.Flag {
   966  				t.Errorf("simple log content mismatch: have %v, want {21, true}", sit.Event)
   967  			}
   968  			sit.Next()
   969  			if sit.Event.Value.Uint64() != 31 || !sit.Event.Flag {
   970  				t.Errorf("simple log content mismatch: have %v, want {31, true}", sit.Event)
   971  			}
   972  			sit.Next()
   973  			if sit.Event.Value.Uint64() != 33 || !sit.Event.Flag {
   974  				t.Errorf("simple log content mismatch: have %v, want {33, true}", sit.Event)
   975  			}
   976  
   977  			if sit.Next() {
   978  				t.Errorf("unexpected simple event found: %+v", sit.Event)
   979  			}
   980  			if err = sit.Error(); err != nil {
   981  				t.Fatalf("simple event iteration failed: %v", err)
   982  			}
   983  			// Test raising and filtering for an event with no data component
   984  			if _, err := eventer.RaiseNodataEvent(auth, big.NewInt(314), 141, 271); err != nil {
   985  				t.Fatalf("failed to raise nodata event: %v", err)
   986  			}
   987  			sim.Commit(false)
   988  
   989  			nit, err := eventer.FilterNodataEvent(nil, []*big.Int{big.NewInt(314)}, []int16{140, 141, 142}, []uint32{271})
   990  			if err != nil {
   991  				t.Fatalf("failed to filter for nodata events: %v", err)
   992  			}
   993  			defer nit.Close()
   994  
   995  			if !nit.Next() {
   996  				t.Fatalf("nodata log not found: %v", nit.Error())
   997  			}
   998  			if nit.Event.Number.Uint64() != 314 {
   999  				t.Errorf("nodata log content mismatch: have %v, want 314", nit.Event.Number)
  1000  			}
  1001  			if nit.Next() {
  1002  				t.Errorf("unexpected nodata event found: %+v", nit.Event)
  1003  			}
  1004  			if err = nit.Error(); err != nil {
  1005  				t.Fatalf("nodata event iteration failed: %v", err)
  1006  			}
  1007  			// Test raising and filtering for events with dynamic indexed components
  1008  			if _, err := eventer.RaiseDynamicEvent(auth, "Hello", []byte("World")); err != nil {
  1009  				t.Fatalf("failed to raise dynamic event: %v", err)
  1010  			}
  1011  			sim.Commit(false)
  1012  
  1013  			dit, err := eventer.FilterDynamicEvent(nil, []string{"Hi", "Hello", "Bye"}, [][]byte{[]byte("World")})
  1014  			if err != nil {
  1015  				t.Fatalf("failed to filter for dynamic events: %v", err)
  1016  			}
  1017  			defer dit.Close()
  1018  
  1019  			if !dit.Next() {
  1020  				t.Fatalf("dynamic log not found: %v", dit.Error())
  1021  			}
  1022  			if dit.Event.NonIndexedString != "Hello" || string(dit.Event.NonIndexedBytes) != "World" ||	dit.Event.IndexedString != common.HexToHash("0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2") || dit.Event.IndexedBytes != common.HexToHash("0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18") {
  1023  				t.Errorf("dynamic log content mismatch: have %v, want {'0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2, '0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18', 'Hello', 'World'}", dit.Event)
  1024  			}
  1025  			if dit.Next() {
  1026  				t.Errorf("unexpected dynamic event found: %+v", dit.Event)
  1027  			}
  1028  			if err = dit.Error(); err != nil {
  1029  				t.Fatalf("dynamic event iteration failed: %v", err)
  1030  			}
  1031  			// Test raising and filtering for events with fixed bytes components
  1032  			var fblob [24]byte
  1033  			copy(fblob[:], []byte("Fixed Bytes"))
  1034  
  1035  			if _, err := eventer.RaiseFixedBytesEvent(auth, fblob); err != nil {
  1036  				t.Fatalf("failed to raise fixed bytes event: %v", err)
  1037  			}
  1038  			sim.Commit(false)
  1039  
  1040  			fit, err := eventer.FilterFixedBytesEvent(nil, [][24]byte{fblob})
  1041  			if err != nil {
  1042  				t.Fatalf("failed to filter for fixed bytes events: %v", err)
  1043  			}
  1044  			defer fit.Close()
  1045  
  1046  			if !fit.Next() {
  1047  				t.Fatalf("fixed bytes log not found: %v", fit.Error())
  1048  			}
  1049  			if fit.Event.NonIndexedBytes != fblob || fit.Event.IndexedBytes != fblob {
  1050  				t.Errorf("fixed bytes log content mismatch: have %v, want {'%x', '%x'}", fit.Event, fblob, fblob)
  1051  			}
  1052  			if fit.Next() {
  1053  				t.Errorf("unexpected fixed bytes event found: %+v", fit.Event)
  1054  			}
  1055  			if err = fit.Error(); err != nil {
  1056  				t.Fatalf("fixed bytes event iteration failed: %v", err)
  1057  			}
  1058  			// Test subscribing to an event and raising it afterwards
  1059  			ch := make(chan *EventerSimpleEvent, 16)
  1060  			sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil)
  1061  			if err != nil {
  1062  				t.Fatalf("failed to subscribe to simple events: %v", err)
  1063  			}
  1064  			if _, err := eventer.RaiseSimpleEvent(auth, common.Address{255}, [32]byte{255}, true, big.NewInt(255)); err != nil {
  1065  				t.Fatalf("failed to raise subscribed simple event: %v", err)
  1066  			}
  1067  			sim.Commit(false)
  1068  
  1069  			select {
  1070  			case event := <-ch:
  1071  				if event.Value.Uint64() != 255 {
  1072  					t.Errorf("simple log content mismatch: have %v, want 255", event)
  1073  				}
  1074  			case <-time.After(250 * time.Millisecond):
  1075  				t.Fatalf("subscribed simple event didn't arrive")
  1076  			}
  1077  			// Unsubscribe from the event and make sure we're not delivered more
  1078  			sub.Unsubscribe()
  1079  
  1080  			if _, err := eventer.RaiseSimpleEvent(auth, common.Address{254}, [32]byte{254}, true, big.NewInt(254)); err != nil {
  1081  				t.Fatalf("failed to raise subscribed simple event: %v", err)
  1082  			}
  1083  			sim.Commit(false)
  1084  
  1085  			select {
  1086  			case event := <-ch:
  1087  				t.Fatalf("unsubscribed simple event arrived: %v", event)
  1088  			case <-time.After(250 * time.Millisecond):
  1089  			}
  1090  		`,
  1091  		nil,
  1092  		nil,
  1093  		nil,
  1094  		nil,
  1095  	},
  1096  	{
  1097  		`DeeplyNestedArray`,
  1098  		`
  1099  			contract DeeplyNestedArray {
  1100  				uint64[3][4][5] public deepUint64Array;
  1101  				function storeDeepUintArray(uint64[3][4][5] arr) public {
  1102  					deepUint64Array = arr;
  1103  				}
  1104  				function retrieveDeepArray() public view returns (uint64[3][4][5]) {
  1105  					return deepUint64Array;
  1106  				}
  1107  			}
  1108  		`,
  1109  		[]string{`6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`},
  1110  		[]string{`[{"constant":false,"inputs":[{"name":"arr","type":"uint64[3][4][5]"}],"name":"storeDeepUintArray","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"retrieveDeepArray","outputs":[{"name":"","type":"uint64[3][4][5]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"name":"deepUint64Array","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"view","type":"function"}]`},
  1111  		`
  1112  			"math/big"
  1113  
  1114  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1115  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1116  			"github.com/ava-labs/subnet-evm/core"
  1117  			"github.com/ethereum/go-ethereum/crypto"
  1118  		`,
  1119  		`
  1120  			// Generate a new random account and a funded simulator
  1121  			key, _ := crypto.GenerateKey()
  1122  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1123  
  1124  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1125  			defer sim.Close()
  1126  
  1127  			//deploy the test contract
  1128  			_, _, testContract, err := DeployDeeplyNestedArray(auth, sim)
  1129  			if err != nil {
  1130  				t.Fatalf("Failed to deploy test contract: %v", err)
  1131  			}
  1132  
  1133  			// Finish deploy.
  1134  			sim.Commit(false)
  1135  
  1136  			//Create coordinate-filled array, for testing purposes.
  1137  			testArr := [5][4][3]uint64{}
  1138  			for i := 0; i < 5; i++ {
  1139  				testArr[i] = [4][3]uint64{}
  1140  				for j := 0; j < 4; j++ {
  1141  					testArr[i][j] = [3]uint64{}
  1142  					for k := 0; k < 3; k++ {
  1143  						//pack the coordinates, each array value will be unique, and can be validated easily.
  1144  						testArr[i][j][k] = uint64(i) << 16 | uint64(j) << 8 | uint64(k)
  1145  					}
  1146  				}
  1147  			}
  1148  
  1149  			if _, err := testContract.StoreDeepUintArray(&bind.TransactOpts{
  1150  				From: auth.From,
  1151  				Signer: auth.Signer,
  1152  			}, testArr); err != nil {
  1153  				t.Fatalf("Failed to store nested array in test contract: %v", err)
  1154  			}
  1155  
  1156  			sim.Commit(false)
  1157  
  1158  			retrievedArr, err := testContract.RetrieveDeepArray(&bind.CallOpts{
  1159  				From: auth.From,
  1160  				Accepted: false,
  1161  			})
  1162  			if err != nil {
  1163  				t.Fatalf("Failed to retrieve nested array from test contract: %v", err)
  1164  			}
  1165  
  1166  			//quick check to see if contents were copied
  1167  			// (See accounts/abi/unpack_test.go for more extensive testing)
  1168  			if retrievedArr[4][3][2] != testArr[4][3][2] {
  1169  				t.Fatalf("Retrieved value does not match expected value! got: %d, expected: %d. %v", retrievedArr[4][3][2], testArr[4][3][2], err)
  1170  			}
  1171  		`,
  1172  		nil,
  1173  		nil,
  1174  		nil,
  1175  		nil,
  1176  	},
  1177  	{
  1178  		`CallbackParam`,
  1179  		`
  1180  			contract FunctionPointerTest {
  1181  				function test(function(uint256) external callback) external {
  1182  					callback(1);
  1183  				}
  1184  			}
  1185  		`,
  1186  		[]string{`608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029`},
  1187  		[]string{`[
  1188  			{
  1189  				"constant": false,
  1190  				"inputs": [
  1191  					{
  1192  						"name": "callback",
  1193  						"type": "function"
  1194  					}
  1195  				],
  1196  				"name": "test",
  1197  				"outputs": [],
  1198  				"payable": false,
  1199  				"stateMutability": "nonpayable",
  1200  				"type": "function"
  1201  			}
  1202  		]`}, `
  1203  			"strings"
  1204  		`,
  1205  		`
  1206  			if strings.Compare("test(function)", CallbackParamFuncSigs["d7a5aba2"]) != 0 {
  1207  				t.Fatalf("")
  1208  			}
  1209  		`,
  1210  		[]map[string]string{
  1211  			{
  1212  				"test(function)": "d7a5aba2",
  1213  			},
  1214  		},
  1215  		nil,
  1216  		nil,
  1217  		nil,
  1218  	}, {
  1219  		`Tuple`,
  1220  		`
  1221  		pragma solidity >=0.4.19 <0.6.0;
  1222  		pragma experimental ABIEncoderV2;
  1223  
  1224  		contract Tuple {
  1225  			struct S { uint a; uint[] b; T[] c; }
  1226  			struct T { uint x; uint y; }
  1227  			struct P { uint8 x; uint8 y; }
  1228  			struct Q { uint16 x; uint16 y; }
  1229  			event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e);
  1230  			event TupleEvent2(P[]);
  1231  
  1232  			function func1(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public pure returns (S memory, T[2][] memory, T[][2] memory, S[] memory, uint[] memory) {
  1233  				return (a, b, c, d, e);
  1234  			}
  1235  			function func2(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public {
  1236  				emit TupleEvent(a, b, c, d, e);
  1237  			}
  1238  			function func3(Q[] memory) public pure {} // call function, nothing to return
  1239  		}
  1240  		`,
  1241  		[]string{`60806040523480156100115760006000fd5b50610017565b6110b2806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100465760003560e01c8063443c79b41461004c578063d0062cdd14610080578063e4d9a43b1461009c57610046565b60006000fd5b610066600480360361006191908101906107b8565b6100b8565b604051610077959493929190610ccb565b60405180910390f35b61009a600480360361009591908101906107b8565b6100ef565b005b6100b660048036036100b19190810190610775565b610136565b005b6100c061013a565b60606100ca61015e565b606060608989898989945094509450945094506100e2565b9550955095509550959050565b7f18d6e66efa53739ca6d13626f35ebc700b31cced3eddb50c70bbe9c082c6cd008585858585604051610126959493929190610ccb565b60405180910390a15b5050505050565b5b50565b60405180606001604052806000815260200160608152602001606081526020015090565b60405180604001604052806002905b606081526020019060019003908161016d57905050905661106e565b600082601f830112151561019d5760006000fd5b81356101b06101ab82610d6f565b610d41565b915081818352602084019350602081019050838560808402820111156101d65760006000fd5b60005b8381101561020757816101ec888261037a565b8452602084019350608083019250505b6001810190506101d9565b5050505092915050565b600082601f83011215156102255760006000fd5b600261023861023382610d98565b610d41565b9150818360005b83811015610270578135860161025588826103f3565b8452602084019350602083019250505b60018101905061023f565b5050505092915050565b600082601f830112151561028e5760006000fd5b81356102a161029c82610dbb565b610d41565b915081818352602084019350602081019050838560408402820111156102c75760006000fd5b60005b838110156102f857816102dd888261058b565b8452602084019350604083019250505b6001810190506102ca565b5050505092915050565b600082601f83011215156103165760006000fd5b813561032961032482610de4565b610d41565b9150818183526020840193506020810190508360005b83811015610370578135860161035588826105d8565b8452602084019350602083019250505b60018101905061033f565b5050505092915050565b600082601f830112151561038e5760006000fd5b60026103a161039c82610e0d565b610d41565b915081838560408402820111156103b85760006000fd5b60005b838110156103e957816103ce88826106fe565b8452602084019350604083019250505b6001810190506103bb565b5050505092915050565b600082601f83011215156104075760006000fd5b813561041a61041582610e30565b610d41565b915081818352602084019350602081019050838560408402820111156104405760006000fd5b60005b83811015610471578161045688826106fe565b8452602084019350604083019250505b600181019050610443565b5050505092915050565b600082601f830112151561048f5760006000fd5b81356104a261049d82610e59565b610d41565b915081818352602084019350602081019050838560208402820111156104c85760006000fd5b60005b838110156104f957816104de8882610760565b8452602084019350602083019250505b6001810190506104cb565b5050505092915050565b600082601f83011215156105175760006000fd5b813561052a61052582610e82565b610d41565b915081818352602084019350602081019050838560208402820111156105505760006000fd5b60005b8381101561058157816105668882610760565b8452602084019350602083019250505b600181019050610553565b5050505092915050565b60006040828403121561059e5760006000fd5b6105a86040610d41565b905060006105b88482850161074b565b60008301525060206105cc8482850161074b565b60208301525092915050565b6000606082840312156105eb5760006000fd5b6105f56060610d41565b9050600061060584828501610760565b600083015250602082013567ffffffffffffffff8111156106265760006000fd5b6106328482850161047b565b602083015250604082013567ffffffffffffffff8111156106535760006000fd5b61065f848285016103f3565b60408301525092915050565b60006060828403121561067e5760006000fd5b6106886060610d41565b9050600061069884828501610760565b600083015250602082013567ffffffffffffffff8111156106b95760006000fd5b6106c58482850161047b565b602083015250604082013567ffffffffffffffff8111156106e65760006000fd5b6106f2848285016103f3565b60408301525092915050565b6000604082840312156107115760006000fd5b61071b6040610d41565b9050600061072b84828501610760565b600083015250602061073f84828501610760565b60208301525092915050565b60008135905061075a8161103a565b92915050565b60008135905061076f81611054565b92915050565b6000602082840312156107885760006000fd5b600082013567ffffffffffffffff8111156107a35760006000fd5b6107af8482850161027a565b91505092915050565b6000600060006000600060a086880312156107d35760006000fd5b600086013567ffffffffffffffff8111156107ee5760006000fd5b6107fa8882890161066b565b955050602086013567ffffffffffffffff8111156108185760006000fd5b61082488828901610189565b945050604086013567ffffffffffffffff8111156108425760006000fd5b61084e88828901610211565b935050606086013567ffffffffffffffff81111561086c5760006000fd5b61087888828901610302565b925050608086013567ffffffffffffffff8111156108965760006000fd5b6108a288828901610503565b9150509295509295909350565b60006108bb8383610a6a565b60808301905092915050565b60006108d38383610ac2565b905092915050565b60006108e78383610c36565b905092915050565b60006108fb8383610c8d565b60408301905092915050565b60006109138383610cbc565b60208301905092915050565b600061092a82610f0f565b6109348185610fb7565b935061093f83610eab565b8060005b8381101561097157815161095788826108af565b975061096283610f5c565b9250505b600181019050610943565b5085935050505092915050565b600061098982610f1a565b6109938185610fc8565b9350836020820285016109a585610ebb565b8060005b858110156109e257848403895281516109c285826108c7565b94506109cd83610f69565b925060208a019950505b6001810190506109a9565b50829750879550505050505092915050565b60006109ff82610f25565b610a098185610fd3565b935083602082028501610a1b85610ec5565b8060005b85811015610a585784840389528151610a3885826108db565b9450610a4383610f76565b925060208a019950505b600181019050610a1f565b50829750879550505050505092915050565b610a7381610f30565b610a7d8184610fe4565b9250610a8882610ed5565b8060005b83811015610aba578151610aa087826108ef565b9650610aab83610f83565b9250505b600181019050610a8c565b505050505050565b6000610acd82610f3b565b610ad78185610fef565b9350610ae283610edf565b8060005b83811015610b14578151610afa88826108ef565b9750610b0583610f90565b9250505b600181019050610ae6565b5085935050505092915050565b6000610b2c82610f51565b610b368185611011565b9350610b4183610eff565b8060005b83811015610b73578151610b598882610907565b9750610b6483610faa565b9250505b600181019050610b45565b5085935050505092915050565b6000610b8b82610f46565b610b958185611000565b9350610ba083610eef565b8060005b83811015610bd2578151610bb88882610907565b9750610bc383610f9d565b9250505b600181019050610ba4565b5085935050505092915050565b6000606083016000830151610bf76000860182610cbc565b5060208301518482036020860152610c0f8282610b80565b91505060408301518482036040860152610c298282610ac2565b9150508091505092915050565b6000606083016000830151610c4e6000860182610cbc565b5060208301518482036020860152610c668282610b80565b91505060408301518482036040860152610c808282610ac2565b9150508091505092915050565b604082016000820151610ca36000850182610cbc565b506020820151610cb66020850182610cbc565b50505050565b610cc581611030565b82525050565b600060a0820190508181036000830152610ce58188610bdf565b90508181036020830152610cf9818761091f565b90508181036040830152610d0d818661097e565b90508181036060830152610d2181856109f4565b90508181036080830152610d358184610b21565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff82111715610d655760006000fd5b8060405250919050565b600067ffffffffffffffff821115610d875760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610db05760006000fd5b602082029050919050565b600067ffffffffffffffff821115610dd35760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610dfc5760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e255760006000fd5b602082029050919050565b600067ffffffffffffffff821115610e485760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e715760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e9a5760006000fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061ffff82169050919050565b6000819050919050565b61104381611022565b811415156110515760006000fd5b50565b61105d81611030565b8114151561106b5760006000fd5b50565bfea365627a7a72315820d78c6ba7ee332581e6c4d9daa5fc07941841230f7ce49edf6e05b1b63853e8746c6578706572696d656e74616cf564736f6c634300050c0040`},
  1242  		[]string{`
  1243  [{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"indexed":false,"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"indexed":false,"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"indexed":false,"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"indexed":false,"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"indexed":false,"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"TupleEvent","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"}],"indexed":false,"internalType":"struct Tuple.P[]","name":"","type":"tuple[]"}],"name":"TupleEvent2","type":"event"},{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"func1","outputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"","type":"tuple[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S","name":"a","type":"tuple"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[2][]","name":"b","type":"tuple[2][]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[][2]","name":"c","type":"tuple[][2]"},{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256[]","name":"b","type":"uint256[]"},{"components":[{"internalType":"uint256","name":"x","type":"uint256"},{"internalType":"uint256","name":"y","type":"uint256"}],"internalType":"struct Tuple.T[]","name":"c","type":"tuple[]"}],"internalType":"struct Tuple.S[]","name":"d","type":"tuple[]"},{"internalType":"uint256[]","name":"e","type":"uint256[]"}],"name":"func2","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"components":[{"internalType":"uint16","name":"x","type":"uint16"},{"internalType":"uint16","name":"y","type":"uint16"}],"internalType":"struct Tuple.Q[]","name":"","type":"tuple[]"}],"name":"func3","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]
  1244  		`},
  1245  		`
  1246  			"math/big"
  1247  			"reflect"
  1248  
  1249  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1250  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1251  			"github.com/ava-labs/subnet-evm/core"
  1252  			"github.com/ethereum/go-ethereum/crypto"
  1253  		`,
  1254  
  1255  		`
  1256  			key, _ := crypto.GenerateKey()
  1257  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1258  
  1259  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1260  			defer sim.Close()
  1261  
  1262  			_, _, contract, err := DeployTuple(auth, sim)
  1263  			if err != nil {
  1264  				t.Fatalf("deploy contract failed %v", err)
  1265  			}
  1266  			sim.Commit(false)
  1267  
  1268  			check := func(a, b interface{}, errMsg string) {
  1269  				if !reflect.DeepEqual(a, b) {
  1270  					t.Fatal(errMsg)
  1271  				}
  1272  			}
  1273  
  1274  			a := TupleS{
  1275  				A: big.NewInt(1),
  1276  				B: []*big.Int{big.NewInt(2), big.NewInt(3)},
  1277  				C: []TupleT{
  1278  					{
  1279  						X: big.NewInt(4),
  1280  						Y: big.NewInt(5),
  1281  					},
  1282  					{
  1283  						X: big.NewInt(6),
  1284  						Y: big.NewInt(7),
  1285  					},
  1286  				},
  1287  			}
  1288  
  1289  			b := [][2]TupleT{
  1290  				{
  1291  					{
  1292  						X: big.NewInt(8),
  1293  						Y: big.NewInt(9),
  1294  					},
  1295  					{
  1296  						X: big.NewInt(10),
  1297  						Y: big.NewInt(11),
  1298  					},
  1299  				},
  1300  			}
  1301  
  1302  			c := [2][]TupleT{
  1303  				{
  1304  					{
  1305  						X: big.NewInt(12),
  1306  						Y: big.NewInt(13),
  1307  					},
  1308  					{
  1309  						X: big.NewInt(14),
  1310  						Y: big.NewInt(15),
  1311  					},
  1312  				},
  1313  				{
  1314  					{
  1315  						X: big.NewInt(16),
  1316  						Y: big.NewInt(17),
  1317  					},
  1318  				},
  1319  			}
  1320  
  1321  			d := []TupleS{a}
  1322  
  1323  			e := []*big.Int{big.NewInt(18), big.NewInt(19)}
  1324  			ret1, ret2, ret3, ret4, ret5, err := contract.Func1(nil, a, b, c, d, e)
  1325  			if err != nil {
  1326  				t.Fatalf("invoke contract failed, err %v", err)
  1327  			}
  1328  			check(ret1, a, "ret1 mismatch")
  1329  			check(ret2, b, "ret2 mismatch")
  1330  			check(ret3, c, "ret3 mismatch")
  1331  			check(ret4, d, "ret4 mismatch")
  1332  			check(ret5, e, "ret5 mismatch")
  1333  
  1334  			_, err = contract.Func2(auth, a, b, c, d, e)
  1335  			if err != nil {
  1336  				t.Fatalf("invoke contract failed, err %v", err)
  1337  			}
  1338  			sim.Commit(false)
  1339  
  1340  			iter, err := contract.FilterTupleEvent(nil)
  1341  			if err != nil {
  1342  				t.Fatalf("failed to create event filter, err %v", err)
  1343  			}
  1344  			defer iter.Close()
  1345  
  1346  			iter.Next()
  1347  			check(iter.Event.A, a, "field1 mismatch")
  1348  			check(iter.Event.B, b, "field2 mismatch")
  1349  			check(iter.Event.C, c, "field3 mismatch")
  1350  			check(iter.Event.D, d, "field4 mismatch")
  1351  			check(iter.Event.E, e, "field5 mismatch")
  1352  
  1353  			err = contract.Func3(nil, nil)
  1354  			if err != nil {
  1355  				t.Fatalf("failed to call function which has no return, err %v", err)
  1356  			}
  1357  		`,
  1358  		nil,
  1359  		nil,
  1360  		nil,
  1361  		nil,
  1362  	},
  1363  	{
  1364  		`UseLibrary`,
  1365  		`
  1366  		library Math {
  1367      		function add(uint a, uint b) public view returns(uint) {
  1368          		return a + b;
  1369      		}
  1370  		}
  1371  
  1372  		contract UseLibrary {
  1373  			function add (uint c, uint d) public view returns(uint) {
  1374          		return Math.add(c,d);
  1375      		}
  1376  		}
  1377  		`,
  1378  		[]string{
  1379  			// Bytecode for the UseLibrary contract
  1380  			`608060405234801561001057600080fd5b5061011d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063771602f714602d575b600080fd5b604d60048036036040811015604157600080fd5b5080359060200135605f565b60408051918252519081900360200190f35b600073__$b98c933f0a6ececcd167bd4f9d3299b1a0$__63771602f784846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801560b757600080fd5b505af415801560ca573d6000803e3d6000fd5b505050506040513d602081101560df57600080fd5b5051939250505056fea265627a7a72305820eb5c38f42445604cfa43d85e3aa5ecc48b0a646456c902dd48420ae7241d06f664736f6c63430005090032`,
  1381  			// Bytecode for the Math contract
  1382  			`60a3610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063771602f7146038575b600080fd5b605860048036036040811015604c57600080fd5b5080359060200135606a565b60408051918252519081900360200190f35b019056fea265627a7a723058206fc6c05f3078327f9c763edffdb5ab5f8bd212e293a1306c7d0ad05af3ad35f464736f6c63430005090032`,
  1383  		},
  1384  		[]string{
  1385  			`[{"constant":true,"inputs":[{"name":"c","type":"uint256"},{"name":"d","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`,
  1386  			`[{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`,
  1387  		},
  1388  		`
  1389  			"math/big"
  1390  
  1391  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1392  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1393  			"github.com/ava-labs/subnet-evm/core"
  1394  			"github.com/ethereum/go-ethereum/crypto"
  1395  		`,
  1396  		`
  1397  			// Generate a new random account and a funded simulator
  1398  			key, _ := crypto.GenerateKey()
  1399  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1400  
  1401  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1402  			defer sim.Close()
  1403  
  1404  			//deploy the test contract
  1405  			_, _, testContract, err := DeployUseLibrary(auth, sim)
  1406  			if err != nil {
  1407  				t.Fatalf("Failed to deploy test contract: %v", err)
  1408  			}
  1409  
  1410  			// Finish deploy.
  1411  			sim.Commit(false)
  1412  
  1413  			// Check that the library contract has been deployed
  1414  			// by calling the contract's add function.
  1415  			res, err := testContract.Add(&bind.CallOpts{
  1416  				From: auth.From,
  1417  				Accepted: false,
  1418  			}, big.NewInt(1), big.NewInt(2))
  1419  			if err != nil {
  1420  				t.Fatalf("Failed to call linked contract: %v", err)
  1421  			}
  1422  			if res.Cmp(big.NewInt(3)) != 0 {
  1423  				t.Fatalf("Add did not return the correct result: %d != %d", res, 3)
  1424  			}
  1425  		`,
  1426  		nil,
  1427  		map[string]string{
  1428  			"b98c933f0a6ececcd167bd4f9d3299b1a0": "Math",
  1429  		},
  1430  		nil,
  1431  		[]string{"UseLibrary", "Math"},
  1432  	}, {
  1433  		"Overload",
  1434  		`
  1435  		pragma solidity ^0.5.10;
  1436  
  1437  		contract overload {
  1438  		  mapping(address => uint256) balances;
  1439  
  1440  		  event bar(uint256 i);
  1441  		  event bar(uint256 i, uint256 j);
  1442  
  1443  		  function foo(uint256 i) public {
  1444  			  emit bar(i);
  1445  		  }
  1446  		  function foo(uint256 i, uint256 j) public {
  1447  			  emit bar(i, j);
  1448  		  }
  1449  		}
  1450  		`,
  1451  		[]string{`608060405234801561001057600080fd5b50610153806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806304bc52f81461003b5780632fbebd3814610073575b600080fd5b6100716004803603604081101561005157600080fd5b8101908080359060200190929190803590602001909291905050506100a1565b005b61009f6004803603602081101561008957600080fd5b81019080803590602001909291905050506100e4565b005b7fae42e9514233792a47a1e4554624e83fe852228e1503f63cd383e8a431f4f46d8282604051808381526020018281526020019250505060405180910390a15050565b7f0423a1321222a0a8716c22b92fac42d85a45a612b696a461784d9fa537c81e5c816040518082815260200191505060405180910390a15056fea265627a7a72305820e22b049858b33291cbe67eeaece0c5f64333e439d27032ea8337d08b1de18fe864736f6c634300050a0032`},
  1452  		[]string{`[{"constant":false,"inputs":[{"name":"i","type":"uint256"},{"name":"j","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i","type":"uint256"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"}],"name":"bar","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"i","type":"uint256"},{"indexed":false,"name":"j","type":"uint256"}],"name":"bar","type":"event"}]`},
  1453  		`
  1454  		"math/big"
  1455  		"time"
  1456  
  1457  		"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1458  		"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1459  		"github.com/ava-labs/subnet-evm/core"
  1460  		"github.com/ethereum/go-ethereum/crypto"
  1461  		`,
  1462  		`
  1463  		// Initialize test accounts
  1464  		key, _ := crypto.GenerateKey()
  1465  		auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1466  		sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: new(big.Int).Mul(big.NewInt(10000000000000000), big.NewInt(1000))}}, 10000000)
  1467  		defer sim.Close()
  1468  
  1469  		// deploy the test contract
  1470  		_, _, contract, err := DeployOverload(auth, sim)
  1471  		if err != nil {
  1472  			t.Fatalf("Failed to deploy contract: %v", err)
  1473  		}
  1474  
  1475  		resCh, stopCh := make(chan uint64), make(chan struct{})
  1476  
  1477  		go func() {
  1478  			barSink := make(chan *OverloadBar)
  1479  			sub, _ := contract.WatchBar(nil, barSink)
  1480  			defer sub.Unsubscribe()
  1481  
  1482  			bar0Sink := make(chan *OverloadBar0)
  1483  			sub0, _ := contract.WatchBar0(nil, bar0Sink)
  1484  			defer sub0.Unsubscribe()
  1485  
  1486  			for {
  1487  				select {
  1488  				case ev := <-barSink:
  1489  					resCh <- ev.I.Uint64()
  1490  				case ev := <-bar0Sink:
  1491  					resCh <- ev.I.Uint64() + ev.J.Uint64()
  1492  				case <-stopCh:
  1493  					return
  1494  				}
  1495  			}
  1496  		}()
  1497  
  1498  		time.Sleep(5 * time.Second)
  1499  
  1500  		// Finish deploy.
  1501  		sim.Commit(false)
  1502  
  1503  		contract.Foo(auth, big.NewInt(1), big.NewInt(2))
  1504  		sim.Commit(false)
  1505  
  1506  		time.Sleep(5 * time.Second)
  1507  
  1508  		bar0Timer := time.NewTimer(60 * time.Second)
  1509  		time.Sleep(1 * time.Second)
  1510  
  1511  		select {
  1512  		case n := <-resCh:
  1513  			if n != 3 {
  1514  				t.Fatalf("Invalid bar0 event")
  1515  			}
  1516  		case <-bar0Timer.C:
  1517  			t.Fatalf("Wait bar0 event timeout")
  1518  		}
  1519  
  1520  		bar0Timer.Stop()
  1521  
  1522  		contract.Foo0(auth, big.NewInt(1))
  1523  		sim.Commit(false)
  1524  
  1525  		time.Sleep(5 * time.Second)
  1526  
  1527  		barTimer := time.NewTimer(60 * time.Second)
  1528  		time.Sleep(1 * time.Second)
  1529  
  1530  		select {
  1531  		case n := <-resCh:
  1532  			if n != 1 {
  1533  				t.Fatalf("Invalid bar event")
  1534  			}
  1535  		case <-barTimer.C:
  1536  			t.Fatalf("Wait bar event timeout")
  1537  		}
  1538  
  1539  		barTimer.Stop()
  1540  
  1541  		close(stopCh)
  1542  		`,
  1543  		nil,
  1544  		nil,
  1545  		nil,
  1546  		nil,
  1547  	},
  1548  	{
  1549  		"IdentifierCollision",
  1550  		`
  1551  		pragma solidity >=0.4.19 <0.6.0;
  1552  
  1553  		contract IdentifierCollision {
  1554  			uint public _myVar;
  1555  
  1556  			function MyVar() public view returns (uint) {
  1557  				return _myVar;
  1558  			}
  1559  		}
  1560  		`,
  1561  		[]string{"60806040523480156100115760006000fd5b50610017565b60c3806100256000396000f3fe608060405234801560105760006000fd5b506004361060365760003560e01c806301ad4d8714603c5780634ef1f0ad146058576036565b60006000fd5b60426074565b6040518082815260200191505060405180910390f35b605e607d565b6040518082815260200191505060405180910390f35b60006000505481565b60006000600050549050608b565b9056fea265627a7a7231582067c8d84688b01c4754ba40a2a871cede94ea1f28b5981593ab2a45b46ac43af664736f6c634300050c0032"},
  1562  		[]string{`[{"constant":true,"inputs":[],"name":"MyVar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_myVar","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`},
  1563  		`
  1564  		"math/big"
  1565  
  1566  		"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1567  		"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1568  		"github.com/ethereum/go-ethereum/crypto"
  1569  		"github.com/ava-labs/subnet-evm/core"
  1570  		`,
  1571  		`
  1572  		// Initialize test accounts
  1573  		key, _ := crypto.GenerateKey()
  1574  		addr := crypto.PubkeyToAddress(key.PublicKey)
  1575  
  1576  		// Deploy registrar contract
  1577  		sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: new(big.Int).Mul(big.NewInt(10000000000000000), big.NewInt(1000))}}, 10000000)
  1578  		defer sim.Close()
  1579  
  1580  		transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1581  		_, _, _, err := DeployIdentifierCollision(transactOpts, sim)
  1582  		if err != nil {
  1583  			t.Fatalf("failed to deploy contract: %v", err)
  1584  		}
  1585  		`,
  1586  		nil,
  1587  		nil,
  1588  		map[string]string{"_myVar": "pubVar"}, // alias MyVar to PubVar
  1589  		nil,
  1590  	},
  1591  	{
  1592  		"MultiContracts",
  1593  		`
  1594  		pragma solidity ^0.5.11;
  1595  		pragma experimental ABIEncoderV2;
  1596  
  1597  		library ExternalLib {
  1598  			struct SharedStruct{
  1599  				uint256 f1;
  1600  				bytes32 f2;
  1601  			}
  1602  		}
  1603  
  1604  		contract ContractOne {
  1605  			function foo(ExternalLib.SharedStruct memory s) pure public {
  1606  				// Do stuff
  1607  			}
  1608  		}
  1609  
  1610  		contract ContractTwo {
  1611  			function bar(ExternalLib.SharedStruct memory s) pure public {
  1612  				// Do stuff
  1613  			}
  1614  		}
  1615          `,
  1616  		[]string{
  1617  			`60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c80639d8a8ba81461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a72315820749274eb7f6c01010d5322af4e1668b0a154409eb7968bd6cae5524c7ed669bb6c6578706572696d656e74616cf564736f6c634300050c0040`,
  1618  			`60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c8063db8ba08c1461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a723158209bc28ee7ea97c131a13330d77ec73b4493b5c59c648352da81dd288b021192596c6578706572696d656e74616cf564736f6c634300050c0040`,
  1619  			`606c6026600b82828239805160001a6073141515601857fe5b30600052607381538281f350fe73000000000000000000000000000000000000000030146080604052600436106023575b60006000fdfea365627a7a72315820518f0110144f5b3de95697d05e456a064656890d08e6f9cff47f3be710cc46a36c6578706572696d656e74616cf564736f6c634300050c0040`,
  1620  		},
  1621  		[]string{
  1622  			`[{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"f1","type":"uint256"},{"internalType":"bytes32","name":"f2","type":"bytes32"}],"internalType":"struct ExternalLib.SharedStruct","name":"s","type":"tuple"}],"name":"foo","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]`,
  1623  			`[{"constant":true,"inputs":[{"components":[{"internalType":"uint256","name":"f1","type":"uint256"},{"internalType":"bytes32","name":"f2","type":"bytes32"}],"internalType":"struct ExternalLib.SharedStruct","name":"s","type":"tuple"}],"name":"bar","outputs":[],"payable":false,"stateMutability":"pure","type":"function"}]`,
  1624  			`[]`,
  1625  		},
  1626  		`
  1627  		"math/big"
  1628  
  1629  		"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1630  		"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1631  		"github.com/ethereum/go-ethereum/crypto"
  1632  		"github.com/ava-labs/subnet-evm/core"
  1633          `,
  1634  		`
  1635  		key, _ := crypto.GenerateKey()
  1636  		addr := crypto.PubkeyToAddress(key.PublicKey)
  1637  
  1638  		// Deploy registrar contract
  1639  		sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1640  		defer sim.Close()
  1641  
  1642  		transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1643  		_, _, c1, err := DeployContractOne(transactOpts, sim)
  1644  		if err != nil {
  1645  			t.Fatal("Failed to deploy contract")
  1646  		}
  1647  		sim.Commit(false)
  1648  		err = c1.Foo(nil, ExternalLibSharedStruct{
  1649  			F1: big.NewInt(100),
  1650  			F2: [32]byte{0x01, 0x02, 0x03},
  1651  		})
  1652  		if err != nil {
  1653  			t.Fatal("Failed to invoke function")
  1654  		}
  1655  		_, _, c2, err := DeployContractTwo(transactOpts, sim)
  1656  		if err != nil {
  1657  			t.Fatal("Failed to deploy contract")
  1658  		}
  1659  		sim.Commit(false)
  1660  		err = c2.Bar(nil, ExternalLibSharedStruct{
  1661  			F1: big.NewInt(100),
  1662  			F2: [32]byte{0x01, 0x02, 0x03},
  1663  		})
  1664  		if err != nil {
  1665  			t.Fatal("Failed to invoke function")
  1666  		}
  1667          `,
  1668  		nil,
  1669  		nil,
  1670  		nil,
  1671  		[]string{"ContractOne", "ContractTwo", "ExternalLib"},
  1672  	},
  1673  	// Test the existence of the free retrieval calls
  1674  	{
  1675  		`PureAndView`,
  1676  		`pragma solidity >=0.6.0;
  1677  		contract PureAndView {
  1678  			function PureFunc() public pure returns (uint) {
  1679  				return 42;
  1680  			}
  1681  			function ViewFunc() public view returns (uint) {
  1682  				return block.number;
  1683  			}
  1684  		}
  1685  		`,
  1686  		[]string{`608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806376b5686a146037578063bb38c66c146053575b600080fd5b603d606f565b6040518082815260200191505060405180910390f35b60596077565b6040518082815260200191505060405180910390f35b600043905090565b6000602a90509056fea2646970667358221220d158c2ab7fdfce366a7998ec79ab84edd43b9815630bbaede2c760ea77f29f7f64736f6c63430006000033`},
  1687  		[]string{`[{"inputs": [],"name": "PureFunc","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "pure","type": "function"},{"inputs": [],"name": "ViewFunc","outputs": [{"internalType": "uint256","name": "","type": "uint256"}],"stateMutability": "view","type": "function"}]`},
  1688  		`
  1689  			"math/big"
  1690  
  1691  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1692  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1693  			"github.com/ava-labs/subnet-evm/core"
  1694  			"github.com/ethereum/go-ethereum/crypto"
  1695  		`,
  1696  		`
  1697  			// Generate a new random account and a funded simulator
  1698  			key, _ := crypto.GenerateKey()
  1699  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1700  
  1701  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1702  			defer sim.Close()
  1703  
  1704  			// Deploy a tester contract and execute a structured call on it
  1705  			_, _, pav, err := DeployPureAndView(auth, sim)
  1706  			if err != nil {
  1707  				t.Fatalf("Failed to deploy PureAndView contract: %v", err)
  1708  			}
  1709  			sim.Commit(false)
  1710  
  1711  			// This test the existence of the free retreiver call for view and pure functions
  1712  			if num, err := pav.PureFunc(nil); err != nil {
  1713  				t.Fatalf("Failed to call anonymous field retriever: %v", err)
  1714  			} else if num.Cmp(big.NewInt(42)) != 0 {
  1715  				t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 42)
  1716  			}
  1717  			if num, err := pav.ViewFunc(nil); err != nil {
  1718  				t.Fatalf("Failed to call anonymous field retriever: %v", err)
  1719  			} else if num.Cmp(big.NewInt(1)) != 0 {
  1720  				t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 1)
  1721  			}
  1722  		`,
  1723  		nil,
  1724  		nil,
  1725  		nil,
  1726  		nil,
  1727  	},
  1728  	// Test fallback separation introduced in v0.6.0
  1729  	{
  1730  		`NewFallbacks`,
  1731  		`
  1732  		pragma solidity >=0.6.0 <0.7.0;
  1733  	
  1734  		contract NewFallbacks {
  1735  			event Fallback(bytes data);
  1736  			fallback() external {
  1737  				emit Fallback(msg.data);
  1738  			}
  1739  	
  1740  			event Received(address addr, uint value);
  1741  			receive() external payable {
  1742  				emit Received(msg.sender, msg.value);
  1743  			}
  1744  		}
  1745  	   `,
  1746  		[]string{"6080604052348015600f57600080fd5b506101078061001f6000396000f3fe608060405236605f577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1005b348015606a57600080fd5b507f9043988963722edecc2099c75b0af0ff76af14ffca42ed6bce059a20a2a9f98660003660405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a100fea26469706673582212201f994dcfbc53bf610b19176f9a361eafa77b447fd9c796fa2c615dfd0aaf3b8b64736f6c634300060c0033"},
  1747  		[]string{`[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"data","type":"bytes"}],"name":"Fallback","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Received","type":"event"},{"stateMutability":"nonpayable","type":"fallback"},{"stateMutability":"payable","type":"receive"}]`},
  1748  		`
  1749  			"bytes"
  1750  			"math/big"
  1751  	
  1752  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1753  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1754  			"github.com/ava-labs/subnet-evm/core"
  1755  			"github.com/ethereum/go-ethereum/crypto"
  1756  	   `,
  1757  		`
  1758  			key, _ := crypto.GenerateKey()
  1759  			addr := crypto.PubkeyToAddress(key.PublicKey)
  1760  	
  1761  			
  1762  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000000000000)}}, 1000000)
  1763  			defer sim.Close()
  1764  	
  1765  			opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1766  			_, _, c, err := DeployNewFallbacks(opts, sim)
  1767  			if err != nil {
  1768  				t.Fatalf("Failed to deploy contract: %v", err)
  1769  			}
  1770  			sim.Commit(false)
  1771  	
  1772  			// Test receive function
  1773  			opts.Value = big.NewInt(100)
  1774  			c.Receive(opts)
  1775  			sim.Commit(false)
  1776  	
  1777  			var gotEvent bool
  1778  			iter, _ := c.FilterReceived(nil)
  1779  			defer iter.Close()
  1780  			for iter.Next() {
  1781  				if iter.Event.Addr != addr {
  1782  					t.Fatal("Msg.sender mismatch")
  1783  				}
  1784  				if iter.Event.Value.Uint64() != 100 {
  1785  					t.Fatal("Msg.value mismatch")
  1786  				}
  1787  				gotEvent = true
  1788  				break
  1789  			}
  1790  			if !gotEvent {
  1791  				t.Fatal("Expect to receive event emitted by receive")
  1792  			}
  1793  
  1794  			// Test fallback function
  1795  			gotEvent = false
  1796  			opts.Value = nil
  1797  			calldata := []byte{0x01, 0x02, 0x03}
  1798  			c.Fallback(opts, calldata)
  1799  			sim.Commit(false)
  1800  	
  1801  			iter2, _ := c.FilterFallback(nil)
  1802  			defer iter2.Close()
  1803  			for iter2.Next() {
  1804  				if !bytes.Equal(iter2.Event.Data, calldata) {
  1805  					t.Fatal("calldata mismatch")
  1806  				}
  1807  				gotEvent = true
  1808  				break
  1809  			}
  1810  			if !gotEvent {
  1811  				t.Fatal("Expect to receive event emitted by fallback")
  1812  			}
  1813  	   `,
  1814  		nil,
  1815  		nil,
  1816  		nil,
  1817  		nil,
  1818  	},
  1819  	// Test resolving single struct argument
  1820  	{
  1821  		`NewSingleStructArgument`,
  1822  		`
  1823  		 pragma solidity ^0.8.0;
  1824  
  1825  		 contract NewSingleStructArgument {
  1826  			 struct MyStruct{
  1827  				 uint256 a;
  1828  				 uint256 b;
  1829  			 }
  1830  			 event StructEvent(MyStruct s);
  1831  			 function TestEvent() public {
  1832  				 emit StructEvent(MyStruct({a: 1, b: 2}));
  1833  			 }
  1834  		 }
  1835  	   `,
  1836  		[]string{"608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806324ec1d3f14602d575b600080fd5b60336035565b005b7fb4b2ff75e30cb4317eaae16dd8a187dd89978df17565104caa6c2797caae27d460405180604001604052806001815260200160028152506040516078919060ba565b60405180910390a1565b6040820160008201516096600085018260ad565b50602082015160a7602085018260ad565b50505050565b60b48160d3565b82525050565b600060408201905060cd60008301846082565b92915050565b600081905091905056fea26469706673582212208823628796125bf9941ce4eda18da1be3cf2931b231708ab848e1bd7151c0c9a64736f6c63430008070033"},
  1837  		[]string{`[{"anonymous":false,"inputs":[{"components":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"indexed":false,"internalType":"struct Test.MyStruct","name":"s","type":"tuple"}],"name":"StructEvent","type":"event"},{"inputs":[],"name":"TestEvent","outputs":[],"stateMutability":"nonpayable","type":"function"}]`},
  1838  		`
  1839  			"math/big"
  1840  
  1841  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1842  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1843  			"github.com/ava-labs/subnet-evm/core"
  1844  			"github.com/ethereum/go-ethereum/crypto"
  1845  	   `,
  1846  		`
  1847  			var (
  1848  				key, _  = crypto.GenerateKey()
  1849  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1850  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1851  			)
  1852  			defer sim.Close()
  1853  
  1854  			_, _, d, err := DeployNewSingleStructArgument(user, sim)
  1855  			if err != nil {
  1856  				t.Fatalf("Failed to deploy contract %v", err)
  1857  			}
  1858  			sim.Commit(false)
  1859  
  1860  			_, err = d.TestEvent(user)
  1861  			if err != nil {
  1862  				t.Fatalf("Failed to call contract %v", err)
  1863  			}
  1864  			sim.Commit(false)
  1865  
  1866  			it, err := d.FilterStructEvent(nil)
  1867  			if err != nil {
  1868  				t.Fatalf("Failed to filter contract event %v", err)
  1869  			}
  1870  			var count int
  1871  			for it.Next() {
  1872  				if it.Event.S.A.Cmp(big.NewInt(1)) != 0 {
  1873  					t.Fatal("Unexpected contract event")
  1874  				}
  1875  				if it.Event.S.B.Cmp(big.NewInt(2)) != 0 {
  1876  					t.Fatal("Unexpected contract event")
  1877  				}
  1878  				count += 1
  1879  			}
  1880  			if count != 1 {
  1881  				t.Fatal("Unexpected contract event number")
  1882  			}
  1883  			`,
  1884  		nil,
  1885  		nil,
  1886  		nil,
  1887  		nil,
  1888  	},
  1889  	// Test errors introduced in v0.8.4
  1890  	{
  1891  		`NewErrors`,
  1892  		`
  1893  		pragma solidity >0.8.4;
  1894  	
  1895  		contract NewErrors {
  1896  			error MyError(uint256);
  1897  			error MyError1(uint256);
  1898  			error MyError2(uint256, uint256);
  1899  			error MyError3(uint256 a, uint256 b, uint256 c);
  1900  			function Error() public pure {
  1901  				revert MyError3(1,2,3);
  1902  			}
  1903  		}
  1904  	   `,
  1905  		[]string{"0x6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063726c638214602d575b600080fd5b60336035565b005b60405163024876cd60e61b815260016004820152600260248201526003604482015260640160405180910390fdfea264697066735822122093f786a1bc60216540cd999fbb4a6109e0fef20abcff6e9107fb2817ca968f3c64736f6c63430008070033"},
  1906  		[]string{`[{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError1","type":"error"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"MyError2","type":"error"},{"inputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"},{"internalType":"uint256","name":"c","type":"uint256"}],"name":"MyError3","type":"error"},{"inputs":[],"name":"Error","outputs":[],"stateMutability":"pure","type":"function"}]`},
  1907  		`
  1908  			"math/big"
  1909  	
  1910  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1911  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1912  			"github.com/ava-labs/subnet-evm/core"
  1913  			"github.com/ethereum/go-ethereum/crypto"
  1914  	   `,
  1915  		`
  1916  			var (
  1917  				key, _  = crypto.GenerateKey()
  1918  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1919  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1920  			)
  1921  			defer sim.Close()
  1922  	
  1923  			_, tx, contract, err := DeployNewErrors(user, sim)
  1924  			if err != nil {
  1925  				t.Fatal(err)
  1926  			}
  1927  			sim.Commit(true)
  1928  			_, err = bind.WaitDeployed(nil, sim, tx)
  1929  			if err != nil {
  1930  				t.Error(err)
  1931  			}
  1932  			if err := contract.Error(new(bind.CallOpts)); err == nil {
  1933  				t.Fatalf("expected contract to throw error")
  1934  			}
  1935  			// TODO (MariusVanDerWijden unpack error using abigen
  1936  			// once that is implemented
  1937  	   `,
  1938  		nil,
  1939  		nil,
  1940  		nil,
  1941  		nil,
  1942  	},
  1943  	{
  1944  		name: `ConstructorWithStructParam`,
  1945  		contract: `
  1946  		pragma solidity >=0.8.0 <0.9.0;
  1947  		
  1948  		contract ConstructorWithStructParam {
  1949  			struct StructType {
  1950  				uint256 field;
  1951  			}
  1952  		
  1953  			constructor(StructType memory st) {}
  1954  		}
  1955  		`,
  1956  		bytecode: []string{`0x608060405234801561001057600080fd5b506040516101c43803806101c48339818101604052810190610032919061014a565b50610177565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100958261004c565b810181811067ffffffffffffffff821117156100b4576100b361005d565b5b80604052505050565b60006100c7610038565b90506100d3828261008c565b919050565b6000819050919050565b6100eb816100d8565b81146100f657600080fd5b50565b600081519050610108816100e2565b92915050565b60006020828403121561012457610123610047565b5b61012e60206100bd565b9050600061013e848285016100f9565b60008301525092915050565b6000602082840312156101605761015f610042565b5b600061016e8482850161010e565b91505092915050565b603f806101856000396000f3fe6080604052600080fdfea2646970667358221220cdffa667affecefac5561f65f4a4ba914204a8d4eb859d8cd426fb306e5c12a364736f6c634300080a0033`},
  1957  		abi:      []string{`[{"inputs":[{"components":[{"internalType":"uint256","name":"field","type":"uint256"}],"internalType":"struct ConstructorWithStructParam.StructType","name":"st","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"}]`},
  1958  		imports: `
  1959  			"math/big"
  1960  
  1961  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  1962  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  1963  			"github.com/ava-labs/subnet-evm/core"
  1964  			"github.com/ethereum/go-ethereum/crypto"
  1965  		`,
  1966  		tester: `
  1967  			var (
  1968  				key, _  = crypto.GenerateKey()
  1969  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1970  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1971  			)
  1972  			defer sim.Close()
  1973  
  1974  			_, tx, _, err := DeployConstructorWithStructParam(user, sim, ConstructorWithStructParamStructType{Field: big.NewInt(42)})
  1975  			if err != nil {
  1976  				t.Fatalf("DeployConstructorWithStructParam() got err %v; want nil err", err)
  1977  			}
  1978  			sim.Commit(true)
  1979  			
  1980  			if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
  1981  				t.Logf("Deployment tx: %+v", tx)
  1982  				t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err)
  1983  			}
  1984  		`,
  1985  	},
  1986  	{
  1987  		name: `NameConflict`,
  1988  		contract: `
  1989  		// SPDX-License-Identifier: GPL-3.0
  1990  		pragma solidity >=0.4.22 <0.9.0;
  1991  		contract oracle {
  1992  			struct request {
  1993  				 bytes data;
  1994  				 bytes _data;
  1995  			}
  1996  			event log (int msg, int _msg);
  1997  			function addRequest(request memory req) public pure {}
  1998  			function getRequest() pure public returns (request memory) {
  1999  				 return request("", "");
  2000  			}
  2001  		}
  2002  		`,
  2003  		bytecode: []string{"0x608060405234801561001057600080fd5b5061042b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c2bb515f1461003b578063cce7b04814610059575b600080fd5b610043610075565b60405161005091906101af565b60405180910390f35b610073600480360381019061006e91906103ac565b6100b5565b005b61007d6100b8565b604051806040016040528060405180602001604052806000815250815260200160405180602001604052806000815250815250905090565b50565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561010c5780820151818401526020810190506100f1565b8381111561011b576000848401525b50505050565b6000601f19601f8301169050919050565b600061013d826100d2565b61014781856100dd565b93506101578185602086016100ee565b61016081610121565b840191505092915050565b600060408301600083015184820360008601526101888282610132565b915050602083015184820360208601526101a28282610132565b9150508091505092915050565b600060208201905081810360008301526101c9818461016b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022282610121565b810181811067ffffffffffffffff82111715610241576102406101ea565b5b80604052505050565b60006102546101d1565b90506102608282610219565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561028f5761028e6101ea565b5b61029882610121565b9050602081019050919050565b82818337600083830152505050565b60006102c76102c284610274565b61024a565b9050828152602081018484840111156102e3576102e261026f565b5b6102ee8482856102a5565b509392505050565b600082601f83011261030b5761030a61026a565b5b813561031b8482602086016102b4565b91505092915050565b60006040828403121561033a576103396101e5565b5b610344604061024a565b9050600082013567ffffffffffffffff81111561036457610363610265565b5b610370848285016102f6565b600083015250602082013567ffffffffffffffff81111561039457610393610265565b5b6103a0848285016102f6565b60208301525092915050565b6000602082840312156103c2576103c16101db565b5b600082013567ffffffffffffffff8111156103e0576103df6101e0565b5b6103ec84828501610324565b9150509291505056fea264697066735822122033bca1606af9b6aeba1673f98c52003cec19338539fb44b86690ce82c51483b564736f6c634300080e0033"},
  2004  		abi:      []string{`[ { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "int256", "name": "msg", "type": "int256" }, { "indexed": false, "internalType": "int256", "name": "_msg", "type": "int256" } ], "name": "log", "type": "event" }, { "inputs": [ { "components": [ { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "internalType": "struct oracle.request", "name": "req", "type": "tuple" } ], "name": "addRequest", "outputs": [], "stateMutability": "pure", "type": "function" }, { "inputs": [], "name": "getRequest", "outputs": [ { "components": [ { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "internalType": "struct oracle.request", "name": "", "type": "tuple" } ], "stateMutability": "pure", "type": "function" } ]`},
  2005  		imports: `
  2006  			"math/big"
  2007  
  2008  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  2009  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  2010  			"github.com/ava-labs/subnet-evm/core"
  2011  			"github.com/ethereum/go-ethereum/crypto"
  2012  		`,
  2013  		tester: `
  2014  			var (
  2015  				gasCeil = uint64(30000000) // Note: from geth's ethconfig.Defaults.Miner.GasCeil
  2016  				key, _  = crypto.GenerateKey()
  2017  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  2018  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, gasCeil)
  2019  			)
  2020  			defer sim.Close()
  2021  
  2022  			_, tx, _, err := DeployNameConflict(user, sim)
  2023  			if err != nil {
  2024  				t.Fatalf("DeployNameConflict() got err %v; want nil err", err)
  2025  			}
  2026  			sim.Commit(true)
  2027  			
  2028  			if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
  2029  				t.Logf("Deployment tx: %+v", tx)
  2030  				t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err)
  2031  			}
  2032  		`,
  2033  	},
  2034  	{
  2035  		name: "RangeKeyword",
  2036  		contract: `
  2037  		// SPDX-License-Identifier: GPL-3.0
  2038  		pragma solidity >=0.4.22 <0.9.0;
  2039  		contract keywordcontract {
  2040  			function functionWithKeywordParameter(range uint256) public pure {}
  2041  		}
  2042  		`,
  2043  		bytecode: []string{"0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063527a119f14602d575b600080fd5b60436004803603810190603f9190605b565b6045565b005b50565b6000813590506055816092565b92915050565b600060208284031215606e57606d608d565b5b6000607a848285016048565b91505092915050565b6000819050919050565b600080fd5b6099816083565b811460a357600080fd5b5056fea2646970667358221220d4f4525e2615516394055d369fb17df41c359e5e962734f27fd683ea81fd9db164736f6c63430008070033"},
  2044  		abi:      []string{`[{"inputs":[{"internalType":"uint256","name":"range","type":"uint256"}],"name":"functionWithKeywordParameter","outputs":[],"stateMutability":"pure","type":"function"}]`},
  2045  		imports: `
  2046  			"math/big"
  2047  
  2048  			"github.com/ava-labs/subnet-evm/accounts/abi/bind"
  2049  			"github.com/ava-labs/subnet-evm/accounts/abi/bind/backends"
  2050  			"github.com/ava-labs/subnet-evm/core"
  2051  			"github.com/ethereum/go-ethereum/crypto"
  2052  		`,
  2053  		tester: `
  2054  			var (
  2055  				gasCeil = uint64(30000000) // Note: from geth's ethconfig.Defaults.Miner.GasCeil
  2056  				key, _  = crypto.GenerateKey()
  2057  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  2058  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, gasCeil)
  2059  			)
  2060  			_, tx, _, err := DeployRangeKeyword(user, sim)
  2061  			if err != nil {
  2062  				t.Fatalf("error deploying contract: %v", err)
  2063  			}
  2064  			sim.Commit(true)
  2065  
  2066  			if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
  2067  				t.Errorf("error deploying the contract: %v", err)
  2068  			}
  2069  		`,
  2070  	}, {
  2071  		name: "NumericMethodName",
  2072  		contract: `
  2073  		// SPDX-License-Identifier: GPL-3.0
  2074  		pragma solidity >=0.4.22 <0.9.0;
  2075  
  2076  		contract NumericMethodName {
  2077  			event _1TestEvent(address _param);
  2078  			function _1test() public pure {}
  2079  			function __1test() public pure {}
  2080  			function __2test() public pure {}
  2081  		}
  2082  		`,
  2083  		bytecode: []string{"0x6080604052348015600f57600080fd5b5060958061001e6000396000f3fe6080604052348015600f57600080fd5b5060043610603c5760003560e01c80639d993132146041578063d02767c7146049578063ffa02795146051575b600080fd5b60476059565b005b604f605b565b005b6057605d565b005b565b565b56fea26469706673582212200382ca602dff96a7e2ba54657985e2b4ac423a56abe4a1f0667bc635c4d4371f64736f6c63430008110033"},
  2084  		abi:      []string{`[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_param","type":"address"}],"name":"_1TestEvent","type":"event"},{"inputs":[],"name":"_1test","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"__1test","outputs":[],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"__2test","outputs":[],"stateMutability":"pure","type":"function"}]`},
  2085  		imports: `
  2086  			"github.com/ethereum/go-ethereum/common"
  2087  		`,
  2088  		tester: `
  2089  			if b, err := NewNumericMethodName(common.Address{}, nil); b == nil || err != nil {
  2090  				t.Fatalf("combined binding (%v) nil or error (%v) not nil", b, nil)
  2091  			}
  2092  `,
  2093  	},
  2094  }
  2095  
  2096  // The binding tests have been modified to run in two separate test
  2097  // functions to allow these tests to pass on GitHub Actions.
  2098  func TestGolangBindingsOverload(t *testing.T) {
  2099  	golangBindings(t, true)
  2100  }
  2101  
  2102  func TestGolangBindings(t *testing.T) {
  2103  	golangBindings(t, false)
  2104  }
  2105  
  2106  // Tests that packages generated by the binder can be successfully compiled and
  2107  // the requested tester run against it.
  2108  func golangBindings(t *testing.T, overload bool) {
  2109  	// Skip the test if no Go command can be found
  2110  	gocmd := runtime.GOROOT() + "/bin/go"
  2111  	if !common.FileExist(gocmd) {
  2112  		t.Skip("go sdk not found for testing")
  2113  	}
  2114  	// Create a temporary workspace for the test suite
  2115  	ws := t.TempDir()
  2116  
  2117  	pkg := filepath.Join(ws, "bindtest")
  2118  	if err := os.MkdirAll(pkg, 0700); err != nil {
  2119  		t.Fatalf("failed to create package: %v", err)
  2120  	}
  2121  	// Generate the test suite for all the contracts
  2122  	for i, tt := range bindTests {
  2123  		t.Run(tt.name, func(t *testing.T) {
  2124  			// Skip the "Overload" test if [!overload]
  2125  			if !overload && tt.name == "Overload" {
  2126  				return
  2127  			}
  2128  			// Skip all tests except for "Overload" if [overload]
  2129  			if overload && tt.name != "Overload" {
  2130  				return
  2131  			}
  2132  			var types []string
  2133  			if tt.types != nil {
  2134  				types = tt.types
  2135  			} else {
  2136  				types = []string{tt.name}
  2137  			}
  2138  			// Generate the binding and create a Go source file in the workspace
  2139  			bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases)
  2140  			if err != nil {
  2141  				t.Fatalf("test %d: failed to generate binding: %v", i, err)
  2142  			}
  2143  			if err = os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil {
  2144  				t.Fatalf("test %d: failed to write binding: %v", i, err)
  2145  			}
  2146  			// Generate the test file with the injected test code
  2147  			code := fmt.Sprintf(`
  2148  			package bindtest
  2149  
  2150  			import (
  2151  				"testing"
  2152  				%s
  2153  			)
  2154  
  2155  			func Test%s(t *testing.T) {
  2156  				%s
  2157  			}
  2158  		`, tt.imports, tt.name, tt.tester)
  2159  			if err := os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil {
  2160  				t.Fatalf("test %d: failed to write tests: %v", i, err)
  2161  			}
  2162  		})
  2163  	}
  2164  	// Convert the package to go modules and use the current source for go-ethereum
  2165  	moder := exec.Command(gocmd, "mod", "init", "bindtest")
  2166  	moder.Dir = pkg
  2167  	if out, err := moder.CombinedOutput(); err != nil {
  2168  		t.Fatalf("failed to convert binding test to modules: %v\n%s", err, out)
  2169  	}
  2170  	pwd, _ := os.Getwd()
  2171  	replacer := exec.Command(gocmd, "mod", "edit", "-x", "-require", "github.com/ava-labs/subnet-evm@v0.0.0", "-replace", "github.com/ava-labs/subnet-evm="+filepath.Join(pwd, "..", "..", "..")) // Repo root
  2172  	replacer.Dir = pkg
  2173  	if out, err := replacer.CombinedOutput(); err != nil {
  2174  		t.Fatalf("failed to replace binding test dependency to current source tree: %v\n%s", err, out)
  2175  	}
  2176  	tidier := exec.Command(gocmd, "mod", "tidy", "-compat=1.21")
  2177  	tidier.Dir = pkg
  2178  	if out, err := tidier.CombinedOutput(); err != nil {
  2179  		t.Fatalf("failed to tidy Go module file: %v\n%s", err, out)
  2180  	}
  2181  	// Test the entire package and report any failures
  2182  	cmd := exec.Command(gocmd, "test", "-v", "-count", "1")
  2183  	cmd.Dir = pkg
  2184  	if out, err := cmd.CombinedOutput(); err != nil {
  2185  		t.Fatalf("failed to run binding test: %v\n%s", err, out)
  2186  	}
  2187  }