github.com/MetalBlockchain/subnet-evm@v0.4.9/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  	// Test that named and anonymous inputs are handled correctly
   111  	{
   112  		`InputChecker`, ``, []string{``},
   113  		[]string{`
   114  			[
   115  				{"type":"function","name":"noInput","constant":true,"inputs":[],"outputs":[]},
   116  				{"type":"function","name":"namedInput","constant":true,"inputs":[{"name":"str","type":"string"}],"outputs":[]},
   117  				{"type":"function","name":"anonInput","constant":true,"inputs":[{"name":"","type":"string"}],"outputs":[]},
   118  				{"type":"function","name":"namedInputs","constant":true,"inputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}],"outputs":[]},
   119  				{"type":"function","name":"anonInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"","type":"string"}],"outputs":[]},
   120  				{"type":"function","name":"mixedInputs","constant":true,"inputs":[{"name":"","type":"string"},{"name":"str","type":"string"}],"outputs":[]}
   121  			]
   122  		`},
   123  		`
   124  			"fmt"
   125  
   126  			"github.com/ethereum/go-ethereum/common"
   127  		`,
   128  		`if b, err := NewInputChecker(common.Address{}, nil); b == nil || err != nil {
   129  			 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   130  		 } else if false { // Don't run, just compile and test types
   131  			 var err error
   132  
   133  			 err = b.NoInput(nil)
   134  			 err = b.NamedInput(nil, "")
   135  			 err = b.AnonInput(nil, "")
   136  			 err = b.NamedInputs(nil, "", "")
   137  			 err = b.AnonInputs(nil, "", "")
   138  			 err = b.MixedInputs(nil, "", "")
   139  
   140  			 fmt.Println(err)
   141  		 }`,
   142  		nil,
   143  		nil,
   144  		nil,
   145  		nil,
   146  	},
   147  	// Test that named and anonymous outputs are handled correctly
   148  	{
   149  		`OutputChecker`, ``, []string{``},
   150  		[]string{`
   151  			[
   152  				{"type":"function","name":"noOutput","constant":true,"inputs":[],"outputs":[]},
   153  				{"type":"function","name":"namedOutput","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"}]},
   154  				{"type":"function","name":"anonOutput","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"}]},
   155  				{"type":"function","name":"namedOutputs","constant":true,"inputs":[],"outputs":[{"name":"str1","type":"string"},{"name":"str2","type":"string"}]},
   156  				{"type":"function","name":"collidingOutputs","constant":true,"inputs":[],"outputs":[{"name":"str","type":"string"},{"name":"Str","type":"string"}]},
   157  				{"type":"function","name":"anonOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"","type":"string"}]},
   158  				{"type":"function","name":"mixedOutputs","constant":true,"inputs":[],"outputs":[{"name":"","type":"string"},{"name":"str","type":"string"}]}
   159  			]
   160  		`},
   161  		`
   162  			"fmt"
   163  
   164  			"github.com/ethereum/go-ethereum/common"
   165  		`,
   166  		`if b, err := NewOutputChecker(common.Address{}, nil); b == nil || err != nil {
   167  			 t.Fatalf("binding (%v) nil or error (%v) not nil", b, nil)
   168  		 } else if false { // Don't run, just compile and test types
   169  			 var str1, str2 string
   170  			 var err error
   171  
   172  			 err              = b.NoOutput(nil)
   173  			 str1, err        = b.NamedOutput(nil)
   174  			 str1, err        = b.AnonOutput(nil)
   175  			 res, _          := b.NamedOutputs(nil)
   176  			 str1, str2, err  = b.CollidingOutputs(nil)
   177  			 str1, str2, err  = b.AnonOutputs(nil)
   178  			 str1, str2, err  = b.MixedOutputs(nil)
   179  
   180  			 fmt.Println(str1, str2, res.Str1, res.Str2, err)
   181  		 }`,
   182  		nil,
   183  		nil,
   184  		nil,
   185  		nil,
   186  	},
   187  	// Tests that named, anonymous and indexed events are handled correctly
   188  	{
   189  		`EventChecker`, ``, []string{``},
   190  		[]string{`
   191  			[
   192  				{"type":"event","name":"empty","inputs":[]},
   193  				{"type":"event","name":"indexed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256","indexed":true}]},
   194  				{"type":"event","name":"mixed","inputs":[{"name":"addr","type":"address","indexed":true},{"name":"num","type":"int256"}]},
   195  				{"type":"event","name":"anonymous","anonymous":true,"inputs":[]},
   196  				{"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"}]},
   197  				{"type":"event","name":"unnamed","inputs":[{"name":"","type":"uint256","indexed": true},{"name":"","type":"uint256","indexed":true}]}
   198  			]
   199  		`},
   200  		`
   201  			"fmt"
   202  			"math/big"
   203  			"reflect"
   204  
   205  			"github.com/ethereum/go-ethereum/common"
   206  		`,
   207  		`if e, err := NewEventChecker(common.Address{}, nil); e == nil || err != nil {
   208  			 t.Fatalf("binding (%v) nil or error (%v) not nil", e, nil)
   209  		 } else if false { // Don't run, just compile and test types
   210  			 var (
   211  				 err  error
   212  			   res  bool
   213  				 str  string
   214  				 dat  []byte
   215  				 hash common.Hash
   216  			 )
   217  			 _, err = e.FilterEmpty(nil)
   218  			 _, err = e.FilterIndexed(nil, []common.Address{}, []*big.Int{})
   219  
   220  			 mit, err := e.FilterMixed(nil, []common.Address{})
   221  
   222  			 res = mit.Next()  // Make sure the iterator has a Next method
   223  			 err = mit.Error() // Make sure the iterator has an Error method
   224  			 err = mit.Close() // Make sure the iterator has a Close method
   225  
   226  			 fmt.Println(mit.Event.Raw.BlockHash) // Make sure the raw log is contained within the results
   227  			 fmt.Println(mit.Event.Num)           // Make sure the unpacked non-indexed fields are present
   228  			 fmt.Println(mit.Event.Addr)          // Make sure the reconstructed indexed fields are present
   229  
   230  			 dit, err := e.FilterDynamic(nil, []string{}, [][]byte{})
   231  
   232  			 str  = dit.Event.Str    // Make sure non-indexed strings retain their type
   233  			 dat  = dit.Event.Dat    // Make sure non-indexed bytes retain their type
   234  			 hash = dit.Event.IdxStr // Make sure indexed strings turn into hashes
   235  			 hash = dit.Event.IdxDat // Make sure indexed bytes turn into hashes
   236  
   237  			 sink := make(chan *EventCheckerMixed)
   238  			 sub, err := e.WatchMixed(nil, sink, []common.Address{})
   239  			 defer sub.Unsubscribe()
   240  
   241  			 event := <-sink
   242  			 fmt.Println(event.Raw.BlockHash) // Make sure the raw log is contained within the results
   243  			 fmt.Println(event.Num)           // Make sure the unpacked non-indexed fields are present
   244  			 fmt.Println(event.Addr)          // Make sure the reconstructed indexed fields are present
   245  
   246  			 fmt.Println(res, str, dat, hash, err)
   247  
   248  			 oit, err := e.FilterUnnamed(nil, []*big.Int{}, []*big.Int{})
   249  
   250  			 arg0  := oit.Event.Arg0    // Make sure unnamed arguments are handled correctly
   251  			 arg1  := oit.Event.Arg1    // Make sure unnamed arguments are handled correctly
   252  			 fmt.Println(arg0, arg1)
   253  		 }
   254  		 // Run a tiny reflection test to ensure disallowed methods don't appear
   255  		 if _, ok := reflect.TypeOf(&EventChecker{}).MethodByName("FilterAnonymous"); ok {
   256  		 	t.Errorf("binding has disallowed method (FilterAnonymous)")
   257  		 }`,
   258  		nil,
   259  		nil,
   260  		nil,
   261  		nil,
   262  	},
   263  	// Test that contract interactions (deploy, transact and call) generate working code
   264  	{
   265  		`Interactor`,
   266  		`
   267  			contract Interactor {
   268  				string public deployString;
   269  				string public transactString;
   270  
   271  				function Interactor(string str) {
   272  				  deployString = str;
   273  				}
   274  
   275  				function transact(string str) {
   276  				  transactString = str;
   277  				}
   278  			}
   279  		`,
   280  		[]string{`6060604052604051610328380380610328833981016040528051018060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10608d57805160ff19168380011785555b50607c9291505b8082111560ba57838155600101606b565b50505061026a806100be6000396000f35b828001600101855582156064579182015b828111156064578251826000505591602001919060010190609e565b509056606060405260e060020a60003504630d86a0e181146100315780636874e8091461008d578063d736c513146100ea575b005b610190600180546020600282841615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b61019060008054602060026001831615610100026000190190921691909104601f810182900490910260809081016040526060828152929190828280156102295780601f106101fe57610100808354040283529160200191610229565b60206004803580820135601f81018490049093026080908101604052606084815261002f946024939192918401918190838280828437509496505050505050508060016000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061023157805160ff19168380011785555b506102619291505b808211156102665760008155830161017d565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600f02600301f150905090810190601f1680156101f05780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b820191906000526020600020905b81548152906001019060200180831161020c57829003601f168201915b505050505081565b82800160010185558215610175579182015b82811115610175578251826000505591602001919060010190610243565b505050565b509056`},
   281  		[]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"}]`},
   282  		`
   283  			"math/big"
   284  
   285  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   286  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   287  			"github.com/MetalBlockchain/subnet-evm/core"
   288  			"github.com/ethereum/go-ethereum/crypto"
   289  		`,
   290  		`
   291  			// Generate a new random account and a funded simulator
   292  			key, _ := crypto.GenerateKey()
   293  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   294  
   295  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   296  			defer sim.Close()
   297  
   298  			// Deploy an interaction tester contract and call a transaction on it
   299  			_, _, interactor, err := DeployInteractor(auth, sim, "Deploy string")
   300  			if err != nil {
   301  				t.Fatalf("Failed to deploy interactor contract: %v", err)
   302  			}
   303  			if _, err := interactor.Transact(auth, "Transact string"); err != nil {
   304  				t.Fatalf("Failed to transact with interactor contract: %v", err)
   305  			}
   306  			// Commit all pending transactions in the simulator and check the contract state
   307  			sim.Commit(false)
   308  
   309  			if str, err := interactor.DeployString(nil); err != nil {
   310  				t.Fatalf("Failed to retrieve deploy string: %v", err)
   311  			} else if str != "Deploy string" {
   312  				t.Fatalf("Deploy string mismatch: have '%s', want 'Deploy string'", str)
   313  			}
   314  			if str, err := interactor.TransactString(nil); err != nil {
   315  				t.Fatalf("Failed to retrieve transact string: %v", err)
   316  			} else if str != "Transact string" {
   317  				t.Fatalf("Transact string mismatch: have '%s', want 'Transact string'", str)
   318  			}
   319  		`,
   320  		nil,
   321  		nil,
   322  		nil,
   323  		nil,
   324  	},
   325  	// Tests that plain values can be properly returned and deserialized
   326  	{
   327  		`Getter`,
   328  		`
   329  			contract Getter {
   330  				function getter() constant returns (string, int, bytes32) {
   331  					return ("Hi", 1, sha3(""));
   332  				}
   333  			}
   334  		`,
   335  		[]string{`606060405260dc8060106000396000f3606060405260e060020a6000350463993a04b78114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`},
   336  		[]string{`[{"constant":true,"inputs":[],"name":"getter","outputs":[{"name":"","type":"string"},{"name":"","type":"int256"},{"name":"","type":"bytes32"}],"type":"function"}]`},
   337  		`
   338  			"math/big"
   339  
   340  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   341  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   342  			"github.com/MetalBlockchain/subnet-evm/core"
   343  			"github.com/ethereum/go-ethereum/crypto"
   344  		`,
   345  		`
   346  			// Generate a new random account and a funded simulator
   347  			key, _ := crypto.GenerateKey()
   348  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   349  
   350  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   351  			defer sim.Close()
   352  
   353  			// Deploy a tuple tester contract and execute a structured call on it
   354  			_, _, getter, err := DeployGetter(auth, sim)
   355  			if err != nil {
   356  				t.Fatalf("Failed to deploy getter contract: %v", err)
   357  			}
   358  			sim.Commit(false)
   359  
   360  			if str, num, _, err := getter.Getter(nil); err != nil {
   361  				t.Fatalf("Failed to call anonymous field retriever: %v", err)
   362  			} else if str != "Hi" || num.Cmp(big.NewInt(1)) != 0 {
   363  				t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", str, num, "Hi", 1)
   364  			}
   365  		`,
   366  		nil,
   367  		nil,
   368  		nil,
   369  		nil,
   370  	},
   371  	// Tests that tuples can be properly returned and deserialized
   372  	{
   373  		`Tupler`,
   374  		`
   375  			contract Tupler {
   376  				function tuple() constant returns (string a, int b, bytes32 c) {
   377  					return ("Hi", 1, sha3(""));
   378  				}
   379  			}
   380  		`,
   381  		[]string{`606060405260dc8060106000396000f3606060405260e060020a60003504633175aae28114601a575b005b600060605260c0604052600260809081527f486900000000000000000000000000000000000000000000000000000000000060a05260017fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a47060e0829052610100819052606060c0908152600261012081905281906101409060a09080838184600060046012f1505081517fffff000000000000000000000000000000000000000000000000000000000000169091525050604051610160819003945092505050f3`},
   382  		[]string{`[{"constant":true,"inputs":[],"name":"tuple","outputs":[{"name":"a","type":"string"},{"name":"b","type":"int256"},{"name":"c","type":"bytes32"}],"type":"function"}]`},
   383  		`
   384  			"math/big"
   385  
   386  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   387  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   388  			"github.com/MetalBlockchain/subnet-evm/core"
   389  			"github.com/ethereum/go-ethereum/crypto"
   390  		`,
   391  		`
   392  			// Generate a new random account and a funded simulator
   393  			key, _ := crypto.GenerateKey()
   394  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   395  
   396  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   397  			defer sim.Close()
   398  
   399  			// Deploy a tuple tester contract and execute a structured call on it
   400  			_, _, tupler, err := DeployTupler(auth, sim)
   401  			if err != nil {
   402  				t.Fatalf("Failed to deploy tupler contract: %v", err)
   403  			}
   404  			sim.Commit(false)
   405  
   406  			if res, err := tupler.Tuple(nil); err != nil {
   407  				t.Fatalf("Failed to call structure retriever: %v", err)
   408  			} else if res.A != "Hi" || res.B.Cmp(big.NewInt(1)) != 0 {
   409  				t.Fatalf("Retrieved value mismatch: have %v/%v, want %v/%v", res.A, res.B, "Hi", 1)
   410  			}
   411  		`,
   412  		nil,
   413  		nil,
   414  		nil,
   415  		nil,
   416  	},
   417  	// Tests that arrays/slices can be properly returned and deserialized.
   418  	// Only addresses are tested, remainder just compiled to keep the test small.
   419  	{
   420  		`Slicer`,
   421  		`
   422  			contract Slicer {
   423  				function echoAddresses(address[] input) constant returns (address[] output) {
   424  					return input;
   425  				}
   426  				function echoInts(int[] input) constant returns (int[] output) {
   427  					return input;
   428  				}
   429  				function echoFancyInts(uint24[23] input) constant returns (uint24[23] output) {
   430  					return input;
   431  				}
   432  				function echoBools(bool[] input) constant returns (bool[] output) {
   433  					return input;
   434  				}
   435  			}
   436  		`,
   437  		[]string{`606060405261015c806100126000396000f3606060405260e060020a6000350463be1127a3811461003c578063d88becc014610092578063e15a3db71461003c578063f637e5891461003c575b005b604080516020600480358082013583810285810185019096528085526100ee959294602494909392850192829185019084908082843750949650505050505050604080516020810190915260009052805b919050565b604080516102e0818101909252610138916004916102e491839060179083908390808284375090955050505050506102e0604051908101604052806017905b60008152602001906001900390816100d15790505081905061008d565b60405180806020018281038252838181518152602001915080519060200190602002808383829060006004602084601f0104600f02600301f1509050019250505060405180910390f35b60405180826102e0808381846000600461015cf15090500191505060405180910390f3`},
   438  		[]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"}]`},
   439  		`
   440  			"math/big"
   441  			"reflect"
   442  
   443  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   444  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   445  			"github.com/ethereum/go-ethereum/common"
   446  			"github.com/MetalBlockchain/subnet-evm/core"
   447  			"github.com/ethereum/go-ethereum/crypto"
   448  		`,
   449  		`
   450  			// Generate a new random account and a funded simulator
   451  			key, _ := crypto.GenerateKey()
   452  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   453  
   454  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   455  			defer sim.Close()
   456  
   457  			// Deploy a slice tester contract and execute a n array call on it
   458  			_, _, slicer, err := DeploySlicer(auth, sim)
   459  			if err != nil {
   460  					t.Fatalf("Failed to deploy slicer contract: %v", err)
   461  			}
   462  			sim.Commit(false)
   463  
   464  			if out, err := slicer.EchoAddresses(nil, []common.Address{auth.From, common.Address{}}); err != nil {
   465  					t.Fatalf("Failed to call slice echoer: %v", err)
   466  			} else if !reflect.DeepEqual(out, []common.Address{auth.From, common.Address{}}) {
   467  					t.Fatalf("Slice return mismatch: have %v, want %v", out, []common.Address{auth.From, common.Address{}})
   468  			}
   469  		`,
   470  		nil,
   471  		nil,
   472  		nil,
   473  		nil,
   474  	},
   475  	// Tests that anonymous default methods can be correctly invoked
   476  	{
   477  		`Defaulter`,
   478  		`
   479  			contract Defaulter {
   480  				address public caller;
   481  
   482  				function() {
   483  					caller = msg.sender;
   484  				}
   485  			}
   486  		`,
   487  		[]string{`6060604052606a8060106000396000f360606040523615601d5760e060020a6000350463fc9c8d3981146040575b605e6000805473ffffffffffffffffffffffffffffffffffffffff191633179055565b606060005473ffffffffffffffffffffffffffffffffffffffff1681565b005b6060908152602090f3`},
   488  		[]string{`[{"constant":true,"inputs":[],"name":"caller","outputs":[{"name":"","type":"address"}],"type":"function"}]`},
   489  		`
   490  			"math/big"
   491  
   492  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   493  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   494  			"github.com/MetalBlockchain/subnet-evm/core"
   495  			"github.com/ethereum/go-ethereum/crypto"
   496  		`,
   497  		`
   498  			// Generate a new random account and a funded simulator
   499  			key, _ := crypto.GenerateKey()
   500  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   501  
   502  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   503  			defer sim.Close()
   504  
   505  			// Deploy a default method invoker contract and execute its default method
   506  			_, _, defaulter, err := DeployDefaulter(auth, sim)
   507  			if err != nil {
   508  				t.Fatalf("Failed to deploy defaulter contract: %v", err)
   509  			}
   510  			if _, err := (&DefaulterRaw{defaulter}).Transfer(auth); err != nil {
   511  				t.Fatalf("Failed to invoke default method: %v", err)
   512  			}
   513  			sim.Commit(false)
   514  
   515  			if caller, err := defaulter.Caller(nil); err != nil {
   516  				t.Fatalf("Failed to call address retriever: %v", err)
   517  			} else if (caller != auth.From) {
   518  				t.Fatalf("Address mismatch: have %v, want %v", caller, auth.From)
   519  			}
   520  		`,
   521  		nil,
   522  		nil,
   523  		nil,
   524  		nil,
   525  	},
   526  	// Tests that structs are correctly unpacked
   527  	{
   528  
   529  		`Structs`,
   530  		`
   531  		pragma solidity ^0.6.5;
   532  			pragma experimental ABIEncoderV2;
   533  			contract Structs {
   534  				struct A {
   535  					bytes32 B;
   536  				}
   537  				
   538  				function F() public view returns (A[] memory a, uint256[] memory c, bool[] memory d) {
   539  					A[] memory a = new A[](2);
   540  					a[0].B = bytes32(uint256(1234) << 96);
   541  					uint256[] memory c;
   542  					bool[] memory d;
   543  					return (a, c, d);
   544  				}
   545  			
   546  				function G() public view returns (A[] memory a) {
   547  					A[] memory a = new A[](2);
   548  					a[0].B = bytes32(uint256(1234) << 96);
   549  					return a;
   550  				}
   551  			}
   552  		`,
   553  		[]string{`608060405234801561001057600080fd5b50610278806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806328811f591461003b5780636fecb6231461005b575b600080fd5b610043610070565b604051610052939291906101a0565b60405180910390f35b6100636100d6565b6040516100529190610186565b604080516002808252606082810190935282918291829190816020015b610095610131565b81526020019060019003908161008d575050805190915061026960611b9082906000906100be57fe5b60209081029190910101515293606093508392509050565b6040805160028082526060828101909352829190816020015b6100f7610131565b8152602001906001900390816100ef575050805190915061026960611b90829060009061012057fe5b602090810291909101015152905090565b60408051602081019091526000815290565b815260200190565b6000815180845260208085019450808401835b8381101561017b578151518752958201959082019060010161015e565b509495945050505050565b600060208252610199602083018461014b565b9392505050565b6000606082526101b3606083018661014b565b6020838203818501528186516101c98185610239565b91508288019350845b818110156101f3576101e5838651610143565b9484019492506001016101d2565b505084810360408601528551808252908201925081860190845b8181101561022b57825115158552938301939183019160010161020d565b509298975050505050505050565b9081526020019056fea2646970667358221220eb85327e285def14230424c52893aebecec1e387a50bb6b75fc4fdbed647f45f64736f6c63430006050033`},
   554  		[]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"}]`},
   555  		`
   556  			"math/big"
   557  
   558  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   559  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   560  			"github.com/MetalBlockchain/subnet-evm/core"
   561  			"github.com/ethereum/go-ethereum/crypto"
   562  		`,
   563  		`
   564  			// Generate a new random account and a funded simulator
   565  			key, _ := crypto.GenerateKey()
   566  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   567  		
   568  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   569  			defer sim.Close()
   570  		
   571  			// Deploy a structs method invoker contract and execute its default method
   572  			_, _, structs, err := DeployStructs(auth, sim)
   573  			if err != nil {
   574  				t.Fatalf("Failed to deploy defaulter contract: %v", err)
   575  			}
   576  			sim.Commit(false)
   577  			opts := bind.CallOpts{}
   578  			if _, err := structs.F(&opts); err != nil {
   579  				t.Fatalf("Failed to invoke F method: %v", err)
   580  			}
   581  			if _, err := structs.G(&opts); err != nil {
   582  				t.Fatalf("Failed to invoke G method: %v", err)
   583  			}
   584  		`,
   585  		nil,
   586  		nil,
   587  		nil,
   588  		nil,
   589  	},
   590  	// Tests that non-existent contracts are reported as such (though only simulator test)
   591  	{
   592  		`NonExistent`,
   593  		`
   594  			contract NonExistent {
   595  				function String() constant returns(string) {
   596  					return "I don't exist";
   597  				}
   598  			}
   599  		`,
   600  		[]string{`6060604052609f8060106000396000f3606060405260e060020a6000350463f97a60058114601a575b005b600060605260c0604052600d60809081527f4920646f6e27742065786973740000000000000000000000000000000000000060a052602060c0908152600d60e081905281906101009060a09080838184600060046012f15050815172ffffffffffffffffffffffffffffffffffffff1916909152505060405161012081900392509050f3`},
   601  		[]string{`[{"constant":true,"inputs":[],"name":"String","outputs":[{"name":"","type":"string"}],"type":"function"}]`},
   602  		`
   603  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   604  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   605  			"github.com/ethereum/go-ethereum/common"
   606  			"github.com/MetalBlockchain/subnet-evm/core"
   607  		`,
   608  		`
   609  			// Create a simulator and wrap a non-deployed contract
   610  
   611  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000))
   612  			defer sim.Close()
   613  
   614  			nonexistent, err := NewNonExistent(common.Address{}, sim)
   615  			if err != nil {
   616  				t.Fatalf("Failed to access non-existent contract: %v", err)
   617  			}
   618  			// Ensure that contract calls fail with the appropriate error
   619  			if res, err := nonexistent.String(nil); err == nil {
   620  				t.Fatalf("Call succeeded on non-existent contract: %v", res)
   621  			} else if (err != bind.ErrNoCode) {
   622  				t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode)
   623  			}
   624  		`,
   625  		nil,
   626  		nil,
   627  		nil,
   628  		nil,
   629  	},
   630  	{
   631  		`NonExistentStruct`,
   632  		`
   633  			contract NonExistentStruct {
   634  				function Struct() public view returns(uint256 a, uint256 b) {
   635  					return (10, 10);
   636  				}
   637  			}
   638  		`,
   639  		[]string{`6080604052348015600f57600080fd5b5060888061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063d5f6622514602d575b600080fd5b6033604c565b6040805192835260208301919091528051918290030190f35b600a809156fea264697066735822beefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeefbeef64736f6c6343decafe0033`},
   640  		[]string{`[{"inputs":[],"name":"Struct","outputs":[{"internalType":"uint256","name":"a","type":"uint256"},{"internalType":"uint256","name":"b","type":"uint256"}],"stateMutability":"pure","type":"function"}]`},
   641  		`
   642  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   643  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   644  			"github.com/ethereum/go-ethereum/common"
   645  			"github.com/MetalBlockchain/subnet-evm/core"
   646  		`,
   647  		`
   648  			// Create a simulator and wrap a non-deployed contract
   649  
   650  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{}, uint64(10000000000))
   651  			defer sim.Close()
   652  
   653  			nonexistent, err := NewNonExistentStruct(common.Address{}, sim)
   654  			if err != nil {
   655  				t.Fatalf("Failed to access non-existent contract: %v", err)
   656  			}
   657  			// Ensure that contract calls fail with the appropriate error
   658  			if res, err := nonexistent.Struct(nil); err == nil {
   659  				t.Fatalf("Call succeeded on non-existent contract: %v", res)
   660  			} else if (err != bind.ErrNoCode) {
   661  				t.Fatalf("Error mismatch: have %v, want %v", err, bind.ErrNoCode)
   662  			}
   663  		`,
   664  		nil,
   665  		nil,
   666  		nil,
   667  		nil,
   668  	},
   669  	// Tests that gas estimation works for contracts with weird gas mechanics too.
   670  	{
   671  		`FunkyGasPattern`,
   672  		`
   673  			contract FunkyGasPattern {
   674  				string public field;
   675  
   676  				function SetField(string value) {
   677  					// This check will screw gas estimation! Good, good!
   678  					if (msg.gas < 100000) {
   679  						throw;
   680  					}
   681  					field = value;
   682  				}
   683  			}
   684  		`,
   685  		[]string{`606060405261021c806100126000396000f3606060405260e060020a600035046323fcf32a81146100265780634f28bf0e1461007b575b005b6040805160206004803580820135601f8101849004840285018401909552848452610024949193602493909291840191908190840183828082843750949650505050505050620186a05a101561014e57610002565b6100db60008054604080516020601f600260001961010060018816150201909516949094049384018190048102820181019092528281529291908301828280156102145780601f106101e957610100808354040283529160200191610214565b60405180806020018281038252838181518152602001915080519060200190808383829060006004602084601f0104600302600f01f150905090810190601f16801561013b5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b505050565b8060006000509080519060200190828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106101b557805160ff19168380011785555b506101499291505b808211156101e557600081556001016101a1565b82800160010185558215610199579182015b828111156101995782518260005055916020019190600101906101c7565b5090565b820191906000526020600020905b8154815290600101906020018083116101f757829003601f168201915b50505050508156`},
   686  		[]string{`[{"constant":false,"inputs":[{"name":"value","type":"string"}],"name":"SetField","outputs":[],"type":"function"},{"constant":true,"inputs":[],"name":"field","outputs":[{"name":"","type":"string"}],"type":"function"}]`},
   687  		`
   688  			"math/big"
   689  
   690  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   691  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   692  			"github.com/MetalBlockchain/subnet-evm/core"
   693  			"github.com/ethereum/go-ethereum/crypto"
   694  		`,
   695  		`
   696  			// Generate a new random account and a funded simulator
   697  			key, _ := crypto.GenerateKey()
   698  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   699  
   700  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   701  			defer sim.Close()
   702  
   703  			// Deploy a funky gas pattern contract
   704  			_, _, limiter, err := DeployFunkyGasPattern(auth, sim)
   705  			if err != nil {
   706  				t.Fatalf("Failed to deploy funky contract: %v", err)
   707  			}
   708  			sim.Commit(false)
   709  
   710  			// Set the field with automatic estimation and check that it succeeds
   711  			if _, err := limiter.SetField(auth, "automatic"); err != nil {
   712  				t.Fatalf("Failed to call automatically gased transaction: %v", err)
   713  			}
   714  			sim.Commit(false)
   715  
   716  			if field, _ := limiter.Field(nil); field != "automatic" {
   717  				t.Fatalf("Field mismatch: have %v, want %v", field, "automatic")
   718  			}
   719  		`,
   720  		nil,
   721  		nil,
   722  		nil,
   723  		nil,
   724  	},
   725  	// Test that constant functions can be called from an (optional) specified address
   726  	{
   727  		`CallFrom`,
   728  		`
   729  			contract CallFrom {
   730  				function callFrom() constant returns(address) {
   731  					return msg.sender;
   732  				}
   733  			}
   734  		`, []string{`6060604052346000575b6086806100176000396000f300606060405263ffffffff60e060020a60003504166349f8e98281146022575b6000565b34600057602c6055565b6040805173ffffffffffffffffffffffffffffffffffffffff9092168252519081900360200190f35b335b905600a165627a7a72305820aef6b7685c0fa24ba6027e4870404a57df701473fe4107741805c19f5138417c0029`},
   735  		[]string{`[{"constant":true,"inputs":[],"name":"callFrom","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"}]`},
   736  		`
   737  			"math/big"
   738  
   739  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   740  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   741  			"github.com/ethereum/go-ethereum/common"
   742  			"github.com/MetalBlockchain/subnet-evm/core"
   743  			"github.com/ethereum/go-ethereum/crypto"
   744  		`,
   745  		`
   746  			// Generate a new random account and a funded simulator
   747  			key, _ := crypto.GenerateKey()
   748  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   749  
   750  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   751  			defer sim.Close()
   752  
   753  			// Deploy a sender tester contract and execute a structured call on it
   754  			_, _, callfrom, err := DeployCallFrom(auth, sim)
   755  			if err != nil {
   756  				t.Fatalf("Failed to deploy sender contract: %v", err)
   757  			}
   758  			sim.Commit(false)
   759  
   760  			if res, err := callfrom.CallFrom(nil); err != nil {
   761  				t.Errorf("Failed to call constant function: %v", err)
   762  			} else if res != (common.Address{}) {
   763  				t.Errorf("Invalid address returned, want: %x, got: %x", (common.Address{}), res)
   764  			}
   765  
   766  			for _, addr := range []common.Address{common.Address{}, common.Address{1}, common.Address{2}} {
   767  				if res, err := callfrom.CallFrom(&bind.CallOpts{From: addr}); err != nil {
   768  					t.Fatalf("Failed to call constant function: %v", err)
   769  				} else if res != addr {
   770  					t.Fatalf("Invalid address returned, want: %x, got: %x", addr, res)
   771  				}
   772  			}
   773  		`,
   774  		nil,
   775  		nil,
   776  		nil,
   777  		nil,
   778  	},
   779  	// Tests that methods and returns with underscores inside work correctly.
   780  	{
   781  		`Underscorer`,
   782  		`
   783  		contract Underscorer {
   784  			function UnderscoredOutput() constant returns (int _int, string _string) {
   785  				return (314, "pi");
   786  			}
   787  			function LowerLowerCollision() constant returns (int _res, int res) {
   788  				return (1, 2);
   789  			}
   790  			function LowerUpperCollision() constant returns (int _res, int Res) {
   791  				return (1, 2);
   792  			}
   793  			function UpperLowerCollision() constant returns (int _Res, int res) {
   794  				return (1, 2);
   795  			}
   796  			function UpperUpperCollision() constant returns (int _Res, int Res) {
   797  				return (1, 2);
   798  			}
   799  			function PurelyUnderscoredOutput() constant returns (int _, int res) {
   800  				return (1, 2);
   801  			}
   802  			function AllPurelyUnderscoredOutput() constant returns (int _, int __) {
   803  				return (1, 2);
   804  			}
   805  			function _under_scored_func() constant returns (int _int) {
   806  				return 0;
   807  			}
   808  		}
   809  		`, []string{`6060604052341561000f57600080fd5b6103858061001e6000396000f30060606040526004361061008e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806303a592131461009357806346546dbe146100c357806367e6633d146100ec5780639df4848514610181578063af7486ab146101b1578063b564b34d146101e1578063e02ab24d14610211578063e409ca4514610241575b600080fd5b341561009e57600080fd5b6100a6610271565b604051808381526020018281526020019250505060405180910390f35b34156100ce57600080fd5b6100d6610286565b6040518082815260200191505060405180910390f35b34156100f757600080fd5b6100ff61028e565b6040518083815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561014557808201518184015260208101905061012a565b50505050905090810190601f1680156101725780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561018c57600080fd5b6101946102dc565b604051808381526020018281526020019250505060405180910390f35b34156101bc57600080fd5b6101c46102f1565b604051808381526020018281526020019250505060405180910390f35b34156101ec57600080fd5b6101f4610306565b604051808381526020018281526020019250505060405180910390f35b341561021c57600080fd5b61022461031b565b604051808381526020018281526020019250505060405180910390f35b341561024c57600080fd5b610254610330565b604051808381526020018281526020019250505060405180910390f35b60008060016002819150809050915091509091565b600080905090565b6000610298610345565b61013a8090506040805190810160405280600281526020017f7069000000000000000000000000000000000000000000000000000000000000815250915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b60008060016002819150809050915091509091565b6020604051908101604052806000815250905600a165627a7a72305820d1a53d9de9d1e3d55cb3dc591900b63c4f1ded79114f7b79b332684840e186a40029`},
   810  		[]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"}]`},
   811  		`
   812  			"fmt"
   813  			"math/big"
   814  
   815  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   816  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   817  			"github.com/MetalBlockchain/subnet-evm/core"
   818  			"github.com/ethereum/go-ethereum/crypto"
   819  		`,
   820  		`
   821  			// Generate a new random account and a funded simulator
   822  			key, _ := crypto.GenerateKey()
   823  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   824  
   825  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   826  			defer sim.Close()
   827  
   828  			// Deploy a underscorer tester contract and execute a structured call on it
   829  			_, _, underscorer, err := DeployUnderscorer(auth, sim)
   830  			if err != nil {
   831  				t.Fatalf("Failed to deploy underscorer contract: %v", err)
   832  			}
   833  			sim.Commit(false)
   834  
   835  			// Verify that underscored return values correctly parse into structs
   836  			if res, err := underscorer.UnderscoredOutput(nil); err != nil {
   837  				t.Errorf("Failed to call constant function: %v", err)
   838  			} else if res.Int.Cmp(big.NewInt(314)) != 0 || res.String != "pi" {
   839  				t.Errorf("Invalid result, want: {314, \"pi\"}, got: %+v", res)
   840  			}
   841  			// Verify that underscored and non-underscored name collisions force tuple outputs
   842  			var a, b *big.Int
   843  
   844  			a, b, _ = underscorer.LowerLowerCollision(nil)
   845  			a, b, _ = underscorer.LowerUpperCollision(nil)
   846  			a, b, _ = underscorer.UpperLowerCollision(nil)
   847  			a, b, _ = underscorer.UpperUpperCollision(nil)
   848  			a, b, _ = underscorer.PurelyUnderscoredOutput(nil)
   849  			a, b, _ = underscorer.AllPurelyUnderscoredOutput(nil)
   850  			a, _ = underscorer.UnderScoredFunc(nil)
   851  
   852  			fmt.Println(a, b, err)
   853  		`,
   854  		nil,
   855  		nil,
   856  		nil,
   857  		nil,
   858  	},
   859  	// Tests that logs can be successfully filtered and decoded.
   860  	{
   861  		`Eventer`,
   862  		`
   863  			contract Eventer {
   864  				event SimpleEvent (
   865  					address indexed Addr,
   866  					bytes32 indexed Id,
   867  					bool    indexed Flag,
   868  					uint    Value
   869  				);
   870  				function raiseSimpleEvent(address addr, bytes32 id, bool flag, uint value) {
   871  					SimpleEvent(addr, id, flag, value);
   872  				}
   873  
   874  				event NodataEvent (
   875  					uint   indexed Number,
   876  					int16  indexed Short,
   877  					uint32 indexed Long
   878  				);
   879  				function raiseNodataEvent(uint number, int16 short, uint32 long) {
   880  					NodataEvent(number, short, long);
   881  				}
   882  
   883  				event DynamicEvent (
   884  					string indexed IndexedString,
   885  					bytes  indexed IndexedBytes,
   886  					string NonIndexedString,
   887  					bytes  NonIndexedBytes
   888  				);
   889  				function raiseDynamicEvent(string str, bytes blob) {
   890  					DynamicEvent(str, blob, str, blob);
   891  				}
   892  
   893  				event FixedBytesEvent (
   894  					bytes24 indexed IndexedBytes,
   895  					bytes24 NonIndexedBytes
   896  				);
   897  				function raiseFixedBytesEvent(bytes24 blob) {
   898  					FixedBytesEvent(blob, blob);
   899  				}
   900  			}
   901  		`,
   902  		[]string{`608060405234801561001057600080fd5b5061043f806100206000396000f3006080604052600436106100615763ffffffff7c0100000000000000000000000000000000000000000000000000000000600035041663528300ff8114610066578063630c31e2146100ff5780636cc6b94014610138578063c7d116dd1461015b575b600080fd5b34801561007257600080fd5b506040805160206004803580820135601f81018490048402850184019095528484526100fd94369492936024939284019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506101829650505050505050565b005b34801561010b57600080fd5b506100fd73ffffffffffffffffffffffffffffffffffffffff60043516602435604435151560643561033c565b34801561014457600080fd5b506100fd67ffffffffffffffff1960043516610394565b34801561016757600080fd5b506100fd60043560243560010b63ffffffff604435166103d6565b806040518082805190602001908083835b602083106101b25780518252601f199092019160209182019101610193565b51815160209384036101000a6000190180199092169116179052604051919093018190038120875190955087945090928392508401908083835b6020831061020b5780518252601f1990920191602091820191016101ec565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390207f3281fd4f5e152dd3385df49104a3f633706e21c9e80672e88d3bcddf33101f008484604051808060200180602001838103835285818151815260200191508051906020019080838360005b8381101561029c578181015183820152602001610284565b50505050905090810190601f1680156102c95780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156102fc5781810151838201526020016102e4565b50505050905090810190601f1680156103295780820380516001836020036101000a031916815260200191505b5094505050505060405180910390a35050565b60408051828152905183151591859173ffffffffffffffffffffffffffffffffffffffff8816917f1f097de4289df643bd9c11011cc61367aa12983405c021056e706eb5ba1250c8919081900360200190a450505050565b6040805167ffffffffffffffff19831680825291517fcdc4c1b1aed5524ffb4198d7a5839a34712baef5fa06884fac7559f4a5854e0a9181900360200190a250565b8063ffffffff168260010b847f3ca7f3a77e5e6e15e781850bc82e32adfa378a2a609370db24b4d0fae10da2c960405160405180910390a45050505600a165627a7a72305820468b5843bf653145bd924b323c64ef035d3dd922c170644b44d61aa666ea6eee0029`},
   903  		[]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"}]`},
   904  		`
   905  			"math/big"
   906  			"time"
   907  
   908  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
   909  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
   910  			"github.com/ethereum/go-ethereum/common"
   911  			"github.com/MetalBlockchain/subnet-evm/core"
   912  			"github.com/ethereum/go-ethereum/crypto"
   913  		`,
   914  		`
   915  			// Generate a new random account and a funded simulator
   916  			key, _ := crypto.GenerateKey()
   917  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
   918  
   919  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
   920  			defer sim.Close()
   921  
   922  			// Deploy an eventer contract
   923  			_, _, eventer, err := DeployEventer(auth, sim)
   924  			if err != nil {
   925  				t.Fatalf("Failed to deploy eventer contract: %v", err)
   926  			}
   927  			sim.Commit(false)
   928  
   929  			// Inject a few events into the contract, gradually more in each block
   930  			for i := 1; i <= 3; i++ {
   931  				for j := 1; j <= i; j++ {
   932  					if _, err := eventer.RaiseSimpleEvent(auth, common.Address{byte(j)}, [32]byte{byte(j)}, true, big.NewInt(int64(10*i+j))); err != nil {
   933  						t.Fatalf("block %d, event %d: raise failed: %v", i, j, err)
   934  					}
   935  				}
   936  				sim.Commit(false)
   937  			}
   938  			// Test filtering for certain events and ensure they can be found
   939  			sit, err := eventer.FilterSimpleEvent(nil, []common.Address{common.Address{1}, common.Address{3}}, [][32]byte{{byte(1)}, {byte(2)}, {byte(3)}}, []bool{true})
   940  			if err != nil {
   941  				t.Fatalf("failed to filter for simple events: %v", err)
   942  			}
   943  			defer sit.Close()
   944  
   945  			sit.Next()
   946  			if sit.Event.Value.Uint64() != 11 || !sit.Event.Flag {
   947  				t.Errorf("simple log content mismatch: have %v, want {11, true}", sit.Event)
   948  			}
   949  			sit.Next()
   950  			if sit.Event.Value.Uint64() != 21 || !sit.Event.Flag {
   951  				t.Errorf("simple log content mismatch: have %v, want {21, true}", sit.Event)
   952  			}
   953  			sit.Next()
   954  			if sit.Event.Value.Uint64() != 31 || !sit.Event.Flag {
   955  				t.Errorf("simple log content mismatch: have %v, want {31, true}", sit.Event)
   956  			}
   957  			sit.Next()
   958  			if sit.Event.Value.Uint64() != 33 || !sit.Event.Flag {
   959  				t.Errorf("simple log content mismatch: have %v, want {33, true}", sit.Event)
   960  			}
   961  
   962  			if sit.Next() {
   963  				t.Errorf("unexpected simple event found: %+v", sit.Event)
   964  			}
   965  			if err = sit.Error(); err != nil {
   966  				t.Fatalf("simple event iteration failed: %v", err)
   967  			}
   968  			// Test raising and filtering for an event with no data component
   969  			if _, err := eventer.RaiseNodataEvent(auth, big.NewInt(314), 141, 271); err != nil {
   970  				t.Fatalf("failed to raise nodata event: %v", err)
   971  			}
   972  			sim.Commit(false)
   973  
   974  			nit, err := eventer.FilterNodataEvent(nil, []*big.Int{big.NewInt(314)}, []int16{140, 141, 142}, []uint32{271})
   975  			if err != nil {
   976  				t.Fatalf("failed to filter for nodata events: %v", err)
   977  			}
   978  			defer nit.Close()
   979  
   980  			if !nit.Next() {
   981  				t.Fatalf("nodata log not found: %v", nit.Error())
   982  			}
   983  			if nit.Event.Number.Uint64() != 314 {
   984  				t.Errorf("nodata log content mismatch: have %v, want 314", nit.Event.Number)
   985  			}
   986  			if nit.Next() {
   987  				t.Errorf("unexpected nodata event found: %+v", nit.Event)
   988  			}
   989  			if err = nit.Error(); err != nil {
   990  				t.Fatalf("nodata event iteration failed: %v", err)
   991  			}
   992  			// Test raising and filtering for events with dynamic indexed components
   993  			if _, err := eventer.RaiseDynamicEvent(auth, "Hello", []byte("World")); err != nil {
   994  				t.Fatalf("failed to raise dynamic event: %v", err)
   995  			}
   996  			sim.Commit(false)
   997  
   998  			dit, err := eventer.FilterDynamicEvent(nil, []string{"Hi", "Hello", "Bye"}, [][]byte{[]byte("World")})
   999  			if err != nil {
  1000  				t.Fatalf("failed to filter for dynamic events: %v", err)
  1001  			}
  1002  			defer dit.Close()
  1003  
  1004  			if !dit.Next() {
  1005  				t.Fatalf("dynamic log not found: %v", dit.Error())
  1006  			}
  1007  			if dit.Event.NonIndexedString != "Hello" || string(dit.Event.NonIndexedBytes) != "World" ||	dit.Event.IndexedString != common.HexToHash("0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2") || dit.Event.IndexedBytes != common.HexToHash("0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18") {
  1008  				t.Errorf("dynamic log content mismatch: have %v, want {'0x06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2, '0xf2208c967df089f60420785795c0a9ba8896b0f6f1867fa7f1f12ad6f79c1a18', 'Hello', 'World'}", dit.Event)
  1009  			}
  1010  			if dit.Next() {
  1011  				t.Errorf("unexpected dynamic event found: %+v", dit.Event)
  1012  			}
  1013  			if err = dit.Error(); err != nil {
  1014  				t.Fatalf("dynamic event iteration failed: %v", err)
  1015  			}
  1016  			// Test raising and filtering for events with fixed bytes components
  1017  			var fblob [24]byte
  1018  			copy(fblob[:], []byte("Fixed Bytes"))
  1019  
  1020  			if _, err := eventer.RaiseFixedBytesEvent(auth, fblob); err != nil {
  1021  				t.Fatalf("failed to raise fixed bytes event: %v", err)
  1022  			}
  1023  			sim.Commit(false)
  1024  
  1025  			fit, err := eventer.FilterFixedBytesEvent(nil, [][24]byte{fblob})
  1026  			if err != nil {
  1027  				t.Fatalf("failed to filter for fixed bytes events: %v", err)
  1028  			}
  1029  			defer fit.Close()
  1030  
  1031  			if !fit.Next() {
  1032  				t.Fatalf("fixed bytes log not found: %v", fit.Error())
  1033  			}
  1034  			if fit.Event.NonIndexedBytes != fblob || fit.Event.IndexedBytes != fblob {
  1035  				t.Errorf("fixed bytes log content mismatch: have %v, want {'%x', '%x'}", fit.Event, fblob, fblob)
  1036  			}
  1037  			if fit.Next() {
  1038  				t.Errorf("unexpected fixed bytes event found: %+v", fit.Event)
  1039  			}
  1040  			if err = fit.Error(); err != nil {
  1041  				t.Fatalf("fixed bytes event iteration failed: %v", err)
  1042  			}
  1043  			// Test subscribing to an event and raising it afterwards
  1044  			ch := make(chan *EventerSimpleEvent, 16)
  1045  			sub, err := eventer.WatchSimpleEvent(nil, ch, nil, nil, nil)
  1046  			if err != nil {
  1047  				t.Fatalf("failed to subscribe to simple events: %v", err)
  1048  			}
  1049  			if _, err := eventer.RaiseSimpleEvent(auth, common.Address{255}, [32]byte{255}, true, big.NewInt(255)); err != nil {
  1050  				t.Fatalf("failed to raise subscribed simple event: %v", err)
  1051  			}
  1052  			sim.Commit(false)
  1053  
  1054  			select {
  1055  			case event := <-ch:
  1056  				if event.Value.Uint64() != 255 {
  1057  					t.Errorf("simple log content mismatch: have %v, want 255", event)
  1058  				}
  1059  			case <-time.After(250 * time.Millisecond):
  1060  				t.Fatalf("subscribed simple event didn't arrive")
  1061  			}
  1062  			// Unsubscribe from the event and make sure we're not delivered more
  1063  			sub.Unsubscribe()
  1064  
  1065  			if _, err := eventer.RaiseSimpleEvent(auth, common.Address{254}, [32]byte{254}, true, big.NewInt(254)); err != nil {
  1066  				t.Fatalf("failed to raise subscribed simple event: %v", err)
  1067  			}
  1068  			sim.Commit(false)
  1069  
  1070  			select {
  1071  			case event := <-ch:
  1072  				t.Fatalf("unsubscribed simple event arrived: %v", event)
  1073  			case <-time.After(250 * time.Millisecond):
  1074  			}
  1075  		`,
  1076  		nil,
  1077  		nil,
  1078  		nil,
  1079  		nil,
  1080  	},
  1081  	{
  1082  		`DeeplyNestedArray`,
  1083  		`
  1084  			contract DeeplyNestedArray {
  1085  				uint64[3][4][5] public deepUint64Array;
  1086  				function storeDeepUintArray(uint64[3][4][5] arr) public {
  1087  					deepUint64Array = arr;
  1088  				}
  1089  				function retrieveDeepArray() public view returns (uint64[3][4][5]) {
  1090  					return deepUint64Array;
  1091  				}
  1092  			}
  1093  		`,
  1094  		[]string{`6060604052341561000f57600080fd5b6106438061001e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063344248551461005c5780638ed4573a1461011457806398ed1856146101ab575b600080fd5b341561006757600080fd5b610112600480806107800190600580602002604051908101604052809291906000905b828210156101055783826101800201600480602002604051908101604052809291906000905b828210156100f25783826060020160038060200260405190810160405280929190826003602002808284378201915050505050815260200190600101906100b0565b505050508152602001906001019061008a565b5050505091905050610208565b005b341561011f57600080fd5b61012761021d565b604051808260056000925b8184101561019b578284602002015160046000925b8184101561018d5782846020020151600360200280838360005b8381101561017c578082015181840152602081019050610161565b505050509050019260010192610147565b925050509260010192610132565b9250505091505060405180910390f35b34156101b657600080fd5b6101de6004808035906020019091908035906020019091908035906020019091905050610309565b604051808267ffffffffffffffff1667ffffffffffffffff16815260200191505060405180910390f35b80600090600561021992919061035f565b5050565b6102256103b0565b6000600580602002604051908101604052809291906000905b8282101561030057838260040201600480602002604051908101604052809291906000905b828210156102ed578382016003806020026040519081016040528092919082600380156102d9576020028201916000905b82829054906101000a900467ffffffffffffffff1667ffffffffffffffff16815260200190600801906020826007010492830192600103820291508084116102945790505b505050505081526020019060010190610263565b505050508152602001906001019061023e565b50505050905090565b60008360058110151561031857fe5b600402018260048110151561032957fe5b018160038110151561033757fe5b6004918282040191900660080292509250509054906101000a900467ffffffffffffffff1681565b826005600402810192821561039f579160200282015b8281111561039e5782518290600461038e9291906103df565b5091602001919060040190610375565b5b5090506103ac919061042d565b5090565b610780604051908101604052806005905b6103c9610459565b8152602001906001900390816103c15790505090565b826004810192821561041c579160200282015b8281111561041b5782518290600361040b929190610488565b50916020019190600101906103f2565b5b5090506104299190610536565b5090565b61045691905b8082111561045257600081816104499190610562565b50600401610433565b5090565b90565b610180604051908101604052806004905b6104726105a7565b81526020019060019003908161046a5790505090565b82600380016004900481019282156105255791602002820160005b838211156104ef57835183826101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555092602001926008016020816007010492830192600103026104a3565b80156105235782816101000a81549067ffffffffffffffff02191690556008016020816007010492830192600103026104ef565b505b50905061053291906105d9565b5090565b61055f91905b8082111561055b57600081816105529190610610565b5060010161053c565b5090565b90565b50600081816105719190610610565b50600101600081816105839190610610565b50600101600081816105959190610610565b5060010160006105a59190610610565b565b6060604051908101604052806003905b600067ffffffffffffffff168152602001906001900390816105b75790505090565b61060d91905b8082111561060957600081816101000a81549067ffffffffffffffff0219169055506001016105df565b5090565b90565b50600090555600a165627a7a7230582087e5a43f6965ab6ef7a4ff056ab80ed78fd8c15cff57715a1bf34ec76a93661c0029`},
  1095  		[]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"}]`},
  1096  		`
  1097  			"math/big"
  1098  
  1099  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1100  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1101  			"github.com/MetalBlockchain/subnet-evm/core"
  1102  			"github.com/ethereum/go-ethereum/crypto"
  1103  		`,
  1104  		`
  1105  			// Generate a new random account and a funded simulator
  1106  			key, _ := crypto.GenerateKey()
  1107  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1108  
  1109  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1110  			defer sim.Close()
  1111  
  1112  			//deploy the test contract
  1113  			_, _, testContract, err := DeployDeeplyNestedArray(auth, sim)
  1114  			if err != nil {
  1115  				t.Fatalf("Failed to deploy test contract: %v", err)
  1116  			}
  1117  
  1118  			// Finish deploy.
  1119  			sim.Commit(false)
  1120  
  1121  			//Create coordinate-filled array, for testing purposes.
  1122  			testArr := [5][4][3]uint64{}
  1123  			for i := 0; i < 5; i++ {
  1124  				testArr[i] = [4][3]uint64{}
  1125  				for j := 0; j < 4; j++ {
  1126  					testArr[i][j] = [3]uint64{}
  1127  					for k := 0; k < 3; k++ {
  1128  						//pack the coordinates, each array value will be unique, and can be validated easily.
  1129  						testArr[i][j][k] = uint64(i) << 16 | uint64(j) << 8 | uint64(k)
  1130  					}
  1131  				}
  1132  			}
  1133  
  1134  			if _, err := testContract.StoreDeepUintArray(&bind.TransactOpts{
  1135  				From: auth.From,
  1136  				Signer: auth.Signer,
  1137  			}, testArr); err != nil {
  1138  				t.Fatalf("Failed to store nested array in test contract: %v", err)
  1139  			}
  1140  
  1141  			sim.Commit(false)
  1142  
  1143  			retrievedArr, err := testContract.RetrieveDeepArray(&bind.CallOpts{
  1144  				From: auth.From,
  1145  				Accepted: false,
  1146  			})
  1147  			if err != nil {
  1148  				t.Fatalf("Failed to retrieve nested array from test contract: %v", err)
  1149  			}
  1150  
  1151  			//quick check to see if contents were copied
  1152  			// (See accounts/abi/unpack_test.go for more extensive testing)
  1153  			if retrievedArr[4][3][2] != testArr[4][3][2] {
  1154  				t.Fatalf("Retrieved value does not match expected value! got: %d, expected: %d. %v", retrievedArr[4][3][2], testArr[4][3][2], err)
  1155  			}
  1156  		`,
  1157  		nil,
  1158  		nil,
  1159  		nil,
  1160  		nil,
  1161  	},
  1162  	{
  1163  		`CallbackParam`,
  1164  		`
  1165  			contract FunctionPointerTest {
  1166  				function test(function(uint256) external callback) external {
  1167  					callback(1);
  1168  				}
  1169  			}
  1170  		`,
  1171  		[]string{`608060405234801561001057600080fd5b5061015e806100206000396000f3fe60806040526004361061003b576000357c010000000000000000000000000000000000000000000000000000000090048063d7a5aba214610040575b600080fd5b34801561004c57600080fd5b506100be6004803603602081101561006357600080fd5b810190808035806c0100000000000000000000000090049068010000000000000000900463ffffffff1677ffffffffffffffffffffffffffffffffffffffffffffffff169091602001919093929190939291905050506100c0565b005b818160016040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050600060405180830381600087803b15801561011657600080fd5b505af115801561012a573d6000803e3d6000fd5b50505050505056fea165627a7a7230582062f87455ff84be90896dbb0c4e4ddb505c600d23089f8e80a512548440d7e2580029`},
  1172  		[]string{`[
  1173  			{
  1174  				"constant": false,
  1175  				"inputs": [
  1176  					{
  1177  						"name": "callback",
  1178  						"type": "function"
  1179  					}
  1180  				],
  1181  				"name": "test",
  1182  				"outputs": [],
  1183  				"payable": false,
  1184  				"stateMutability": "nonpayable",
  1185  				"type": "function"
  1186  			}
  1187  		]`}, `
  1188  			"strings"
  1189  		`,
  1190  		`
  1191  			if strings.Compare("test(function)", CallbackParamFuncSigs["d7a5aba2"]) != 0 {
  1192  				t.Fatalf("")
  1193  			}
  1194  		`,
  1195  		[]map[string]string{
  1196  			{
  1197  				"test(function)": "d7a5aba2",
  1198  			},
  1199  		},
  1200  		nil,
  1201  		nil,
  1202  		nil,
  1203  	}, {
  1204  		`Tuple`,
  1205  		`
  1206  		pragma solidity >=0.4.19 <0.6.0;
  1207  		pragma experimental ABIEncoderV2;
  1208  
  1209  		contract Tuple {
  1210  			struct S { uint a; uint[] b; T[] c; }
  1211  			struct T { uint x; uint y; }
  1212  			struct P { uint8 x; uint8 y; }
  1213  			struct Q { uint16 x; uint16 y; }
  1214  			event TupleEvent(S a, T[2][] b, T[][2] c, S[] d, uint[] e);
  1215  			event TupleEvent2(P[]);
  1216  
  1217  			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) {
  1218  				return (a, b, c, d, e);
  1219  			}
  1220  			function func2(S memory a, T[2][] memory b, T[][2] memory c, S[] memory d, uint[] memory e) public {
  1221  				emit TupleEvent(a, b, c, d, e);
  1222  			}
  1223  			function func3(Q[] memory) public pure {} // call function, nothing to return
  1224  		}
  1225  		`,
  1226  		[]string{`60806040523480156100115760006000fd5b50610017565b6110b2806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100465760003560e01c8063443c79b41461004c578063d0062cdd14610080578063e4d9a43b1461009c57610046565b60006000fd5b610066600480360361006191908101906107b8565b6100b8565b604051610077959493929190610ccb565b60405180910390f35b61009a600480360361009591908101906107b8565b6100ef565b005b6100b660048036036100b19190810190610775565b610136565b005b6100c061013a565b60606100ca61015e565b606060608989898989945094509450945094506100e2565b9550955095509550959050565b7f18d6e66efa53739ca6d13626f35ebc700b31cced3eddb50c70bbe9c082c6cd008585858585604051610126959493929190610ccb565b60405180910390a15b5050505050565b5b50565b60405180606001604052806000815260200160608152602001606081526020015090565b60405180604001604052806002905b606081526020019060019003908161016d57905050905661106e565b600082601f830112151561019d5760006000fd5b81356101b06101ab82610d6f565b610d41565b915081818352602084019350602081019050838560808402820111156101d65760006000fd5b60005b8381101561020757816101ec888261037a565b8452602084019350608083019250505b6001810190506101d9565b5050505092915050565b600082601f83011215156102255760006000fd5b600261023861023382610d98565b610d41565b9150818360005b83811015610270578135860161025588826103f3565b8452602084019350602083019250505b60018101905061023f565b5050505092915050565b600082601f830112151561028e5760006000fd5b81356102a161029c82610dbb565b610d41565b915081818352602084019350602081019050838560408402820111156102c75760006000fd5b60005b838110156102f857816102dd888261058b565b8452602084019350604083019250505b6001810190506102ca565b5050505092915050565b600082601f83011215156103165760006000fd5b813561032961032482610de4565b610d41565b9150818183526020840193506020810190508360005b83811015610370578135860161035588826105d8565b8452602084019350602083019250505b60018101905061033f565b5050505092915050565b600082601f830112151561038e5760006000fd5b60026103a161039c82610e0d565b610d41565b915081838560408402820111156103b85760006000fd5b60005b838110156103e957816103ce88826106fe565b8452602084019350604083019250505b6001810190506103bb565b5050505092915050565b600082601f83011215156104075760006000fd5b813561041a61041582610e30565b610d41565b915081818352602084019350602081019050838560408402820111156104405760006000fd5b60005b83811015610471578161045688826106fe565b8452602084019350604083019250505b600181019050610443565b5050505092915050565b600082601f830112151561048f5760006000fd5b81356104a261049d82610e59565b610d41565b915081818352602084019350602081019050838560208402820111156104c85760006000fd5b60005b838110156104f957816104de8882610760565b8452602084019350602083019250505b6001810190506104cb565b5050505092915050565b600082601f83011215156105175760006000fd5b813561052a61052582610e82565b610d41565b915081818352602084019350602081019050838560208402820111156105505760006000fd5b60005b8381101561058157816105668882610760565b8452602084019350602083019250505b600181019050610553565b5050505092915050565b60006040828403121561059e5760006000fd5b6105a86040610d41565b905060006105b88482850161074b565b60008301525060206105cc8482850161074b565b60208301525092915050565b6000606082840312156105eb5760006000fd5b6105f56060610d41565b9050600061060584828501610760565b600083015250602082013567ffffffffffffffff8111156106265760006000fd5b6106328482850161047b565b602083015250604082013567ffffffffffffffff8111156106535760006000fd5b61065f848285016103f3565b60408301525092915050565b60006060828403121561067e5760006000fd5b6106886060610d41565b9050600061069884828501610760565b600083015250602082013567ffffffffffffffff8111156106b95760006000fd5b6106c58482850161047b565b602083015250604082013567ffffffffffffffff8111156106e65760006000fd5b6106f2848285016103f3565b60408301525092915050565b6000604082840312156107115760006000fd5b61071b6040610d41565b9050600061072b84828501610760565b600083015250602061073f84828501610760565b60208301525092915050565b60008135905061075a8161103a565b92915050565b60008135905061076f81611054565b92915050565b6000602082840312156107885760006000fd5b600082013567ffffffffffffffff8111156107a35760006000fd5b6107af8482850161027a565b91505092915050565b6000600060006000600060a086880312156107d35760006000fd5b600086013567ffffffffffffffff8111156107ee5760006000fd5b6107fa8882890161066b565b955050602086013567ffffffffffffffff8111156108185760006000fd5b61082488828901610189565b945050604086013567ffffffffffffffff8111156108425760006000fd5b61084e88828901610211565b935050606086013567ffffffffffffffff81111561086c5760006000fd5b61087888828901610302565b925050608086013567ffffffffffffffff8111156108965760006000fd5b6108a288828901610503565b9150509295509295909350565b60006108bb8383610a6a565b60808301905092915050565b60006108d38383610ac2565b905092915050565b60006108e78383610c36565b905092915050565b60006108fb8383610c8d565b60408301905092915050565b60006109138383610cbc565b60208301905092915050565b600061092a82610f0f565b6109348185610fb7565b935061093f83610eab565b8060005b8381101561097157815161095788826108af565b975061096283610f5c565b9250505b600181019050610943565b5085935050505092915050565b600061098982610f1a565b6109938185610fc8565b9350836020820285016109a585610ebb565b8060005b858110156109e257848403895281516109c285826108c7565b94506109cd83610f69565b925060208a019950505b6001810190506109a9565b50829750879550505050505092915050565b60006109ff82610f25565b610a098185610fd3565b935083602082028501610a1b85610ec5565b8060005b85811015610a585784840389528151610a3885826108db565b9450610a4383610f76565b925060208a019950505b600181019050610a1f565b50829750879550505050505092915050565b610a7381610f30565b610a7d8184610fe4565b9250610a8882610ed5565b8060005b83811015610aba578151610aa087826108ef565b9650610aab83610f83565b9250505b600181019050610a8c565b505050505050565b6000610acd82610f3b565b610ad78185610fef565b9350610ae283610edf565b8060005b83811015610b14578151610afa88826108ef565b9750610b0583610f90565b9250505b600181019050610ae6565b5085935050505092915050565b6000610b2c82610f51565b610b368185611011565b9350610b4183610eff565b8060005b83811015610b73578151610b598882610907565b9750610b6483610faa565b9250505b600181019050610b45565b5085935050505092915050565b6000610b8b82610f46565b610b958185611000565b9350610ba083610eef565b8060005b83811015610bd2578151610bb88882610907565b9750610bc383610f9d565b9250505b600181019050610ba4565b5085935050505092915050565b6000606083016000830151610bf76000860182610cbc565b5060208301518482036020860152610c0f8282610b80565b91505060408301518482036040860152610c298282610ac2565b9150508091505092915050565b6000606083016000830151610c4e6000860182610cbc565b5060208301518482036020860152610c668282610b80565b91505060408301518482036040860152610c808282610ac2565b9150508091505092915050565b604082016000820151610ca36000850182610cbc565b506020820151610cb66020850182610cbc565b50505050565b610cc581611030565b82525050565b600060a0820190508181036000830152610ce58188610bdf565b90508181036020830152610cf9818761091f565b90508181036040830152610d0d818661097e565b90508181036060830152610d2181856109f4565b90508181036080830152610d358184610b21565b90509695505050505050565b6000604051905081810181811067ffffffffffffffff82111715610d655760006000fd5b8060405250919050565b600067ffffffffffffffff821115610d875760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610db05760006000fd5b602082029050919050565b600067ffffffffffffffff821115610dd35760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610dfc5760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e255760006000fd5b602082029050919050565b600067ffffffffffffffff821115610e485760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e715760006000fd5b602082029050602081019050919050565b600067ffffffffffffffff821115610e9a5760006000fd5b602082029050602081019050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050919050565b6000819050602082019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061ffff82169050919050565b6000819050919050565b61104381611022565b811415156110515760006000fd5b50565b61105d81611030565b8114151561106b5760006000fd5b50565bfea365627a7a72315820d78c6ba7ee332581e6c4d9daa5fc07941841230f7ce49edf6e05b1b63853e8746c6578706572696d656e74616cf564736f6c634300050c0040`},
  1227  		[]string{`
  1228  [{"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"}]
  1229  		`},
  1230  		`
  1231  			"math/big"
  1232  			"reflect"
  1233  
  1234  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1235  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1236  			"github.com/MetalBlockchain/subnet-evm/core"
  1237  			"github.com/ethereum/go-ethereum/crypto"
  1238  		`,
  1239  
  1240  		`
  1241  			key, _ := crypto.GenerateKey()
  1242  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1243  
  1244  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1245  			defer sim.Close()
  1246  
  1247  			_, _, contract, err := DeployTuple(auth, sim)
  1248  			if err != nil {
  1249  				t.Fatalf("deploy contract failed %v", err)
  1250  			}
  1251  			sim.Commit(false)
  1252  
  1253  			check := func(a, b interface{}, errMsg string) {
  1254  				if !reflect.DeepEqual(a, b) {
  1255  					t.Fatal(errMsg)
  1256  				}
  1257  			}
  1258  
  1259  			a := TupleS{
  1260  				A: big.NewInt(1),
  1261  				B: []*big.Int{big.NewInt(2), big.NewInt(3)},
  1262  				C: []TupleT{
  1263  					{
  1264  						X: big.NewInt(4),
  1265  						Y: big.NewInt(5),
  1266  					},
  1267  					{
  1268  						X: big.NewInt(6),
  1269  						Y: big.NewInt(7),
  1270  					},
  1271  				},
  1272  			}
  1273  
  1274  			b := [][2]TupleT{
  1275  				{
  1276  					{
  1277  						X: big.NewInt(8),
  1278  						Y: big.NewInt(9),
  1279  					},
  1280  					{
  1281  						X: big.NewInt(10),
  1282  						Y: big.NewInt(11),
  1283  					},
  1284  				},
  1285  			}
  1286  
  1287  			c := [2][]TupleT{
  1288  				{
  1289  					{
  1290  						X: big.NewInt(12),
  1291  						Y: big.NewInt(13),
  1292  					},
  1293  					{
  1294  						X: big.NewInt(14),
  1295  						Y: big.NewInt(15),
  1296  					},
  1297  				},
  1298  				{
  1299  					{
  1300  						X: big.NewInt(16),
  1301  						Y: big.NewInt(17),
  1302  					},
  1303  				},
  1304  			}
  1305  
  1306  			d := []TupleS{a}
  1307  
  1308  			e := []*big.Int{big.NewInt(18), big.NewInt(19)}
  1309  			ret1, ret2, ret3, ret4, ret5, err := contract.Func1(nil, a, b, c, d, e)
  1310  			if err != nil {
  1311  				t.Fatalf("invoke contract failed, err %v", err)
  1312  			}
  1313  			check(ret1, a, "ret1 mismatch")
  1314  			check(ret2, b, "ret2 mismatch")
  1315  			check(ret3, c, "ret3 mismatch")
  1316  			check(ret4, d, "ret4 mismatch")
  1317  			check(ret5, e, "ret5 mismatch")
  1318  
  1319  			_, err = contract.Func2(auth, a, b, c, d, e)
  1320  			if err != nil {
  1321  				t.Fatalf("invoke contract failed, err %v", err)
  1322  			}
  1323  			sim.Commit(false)
  1324  
  1325  			iter, err := contract.FilterTupleEvent(nil)
  1326  			if err != nil {
  1327  				t.Fatalf("failed to create event filter, err %v", err)
  1328  			}
  1329  			defer iter.Close()
  1330  
  1331  			iter.Next()
  1332  			check(iter.Event.A, a, "field1 mismatch")
  1333  			check(iter.Event.B, b, "field2 mismatch")
  1334  			check(iter.Event.C, c, "field3 mismatch")
  1335  			check(iter.Event.D, d, "field4 mismatch")
  1336  			check(iter.Event.E, e, "field5 mismatch")
  1337  
  1338  			err = contract.Func3(nil, nil)
  1339  			if err != nil {
  1340  				t.Fatalf("failed to call function which has no return, err %v", err)
  1341  			}
  1342  		`,
  1343  		nil,
  1344  		nil,
  1345  		nil,
  1346  		nil,
  1347  	},
  1348  	{
  1349  		`UseLibrary`,
  1350  		`
  1351  		library Math {
  1352      		function add(uint a, uint b) public view returns(uint) {
  1353          		return a + b;
  1354      		}
  1355  		}
  1356  
  1357  		contract UseLibrary {
  1358  			function add (uint c, uint d) public view returns(uint) {
  1359          		return Math.add(c,d);
  1360      		}
  1361  		}
  1362  		`,
  1363  		[]string{
  1364  			// Bytecode for the UseLibrary contract
  1365  			`608060405234801561001057600080fd5b5061011d806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063771602f714602d575b600080fd5b604d60048036036040811015604157600080fd5b5080359060200135605f565b60408051918252519081900360200190f35b600073__$b98c933f0a6ececcd167bd4f9d3299b1a0$__63771602f784846040518363ffffffff1660e01b8152600401808381526020018281526020019250505060206040518083038186803b15801560b757600080fd5b505af415801560ca573d6000803e3d6000fd5b505050506040513d602081101560df57600080fd5b5051939250505056fea265627a7a72305820eb5c38f42445604cfa43d85e3aa5ecc48b0a646456c902dd48420ae7241d06f664736f6c63430005090032`,
  1366  			// Bytecode for the Math contract
  1367  			`60a3610024600b82828239805160001a607314601757fe5b30600052607381538281f3fe730000000000000000000000000000000000000000301460806040526004361060335760003560e01c8063771602f7146038575b600080fd5b605860048036036040811015604c57600080fd5b5080359060200135606a565b60408051918252519081900360200190f35b019056fea265627a7a723058206fc6c05f3078327f9c763edffdb5ab5f8bd212e293a1306c7d0ad05af3ad35f464736f6c63430005090032`,
  1368  		},
  1369  		[]string{
  1370  			`[{"constant":true,"inputs":[{"name":"c","type":"uint256"},{"name":"d","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`,
  1371  			`[{"constant":true,"inputs":[{"name":"a","type":"uint256"},{"name":"b","type":"uint256"}],"name":"add","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]`,
  1372  		},
  1373  		`
  1374  			"math/big"
  1375  
  1376  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1377  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1378  			"github.com/MetalBlockchain/subnet-evm/core"
  1379  			"github.com/ethereum/go-ethereum/crypto"
  1380  		`,
  1381  		`
  1382  			// Generate a new random account and a funded simulator
  1383  			key, _ := crypto.GenerateKey()
  1384  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1385  
  1386  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1387  			defer sim.Close()
  1388  
  1389  			//deploy the test contract
  1390  			_, _, testContract, err := DeployUseLibrary(auth, sim)
  1391  			if err != nil {
  1392  				t.Fatalf("Failed to deploy test contract: %v", err)
  1393  			}
  1394  
  1395  			// Finish deploy.
  1396  			sim.Commit(false)
  1397  
  1398  			// Check that the library contract has been deployed
  1399  			// by calling the contract's add function.
  1400  			res, err := testContract.Add(&bind.CallOpts{
  1401  				From: auth.From,
  1402  				Accepted: false,
  1403  			}, big.NewInt(1), big.NewInt(2))
  1404  			if err != nil {
  1405  				t.Fatalf("Failed to call linked contract: %v", err)
  1406  			}
  1407  			if res.Cmp(big.NewInt(3)) != 0 {
  1408  				t.Fatalf("Add did not return the correct result: %d != %d", res, 3)
  1409  			}
  1410  		`,
  1411  		nil,
  1412  		map[string]string{
  1413  			"b98c933f0a6ececcd167bd4f9d3299b1a0": "Math",
  1414  		},
  1415  		nil,
  1416  		[]string{"UseLibrary", "Math"},
  1417  	}, {
  1418  		"Overload",
  1419  		`
  1420  		pragma solidity ^0.5.10;
  1421  
  1422  		contract overload {
  1423  		  mapping(address => uint256) balances;
  1424  
  1425  		  event bar(uint256 i);
  1426  		  event bar(uint256 i, uint256 j);
  1427  
  1428  		  function foo(uint256 i) public {
  1429  			  emit bar(i);
  1430  		  }
  1431  		  function foo(uint256 i, uint256 j) public {
  1432  			  emit bar(i, j);
  1433  		  }
  1434  		}
  1435  		`,
  1436  		[]string{`608060405234801561001057600080fd5b50610153806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806304bc52f81461003b5780632fbebd3814610073575b600080fd5b6100716004803603604081101561005157600080fd5b8101908080359060200190929190803590602001909291905050506100a1565b005b61009f6004803603602081101561008957600080fd5b81019080803590602001909291905050506100e4565b005b7fae42e9514233792a47a1e4554624e83fe852228e1503f63cd383e8a431f4f46d8282604051808381526020018281526020019250505060405180910390a15050565b7f0423a1321222a0a8716c22b92fac42d85a45a612b696a461784d9fa537c81e5c816040518082815260200191505060405180910390a15056fea265627a7a72305820e22b049858b33291cbe67eeaece0c5f64333e439d27032ea8337d08b1de18fe864736f6c634300050a0032`},
  1437  		[]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"}]`},
  1438  		`
  1439  		"math/big"
  1440  		"time"
  1441  
  1442  		"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1443  		"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1444  		"github.com/MetalBlockchain/subnet-evm/core"
  1445  		"github.com/ethereum/go-ethereum/crypto"
  1446  		"github.com/MetalBlockchain/subnet-evm/params"
  1447  		`,
  1448  		`
  1449  		// Initialize test accounts
  1450  		key, _ := crypto.GenerateKey()
  1451  		auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1452  		auth.GasFeeCap = params.TestMaxBaseFee
  1453  		sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: new(big.Int).Mul(big.NewInt(10000000000000000), big.NewInt(1000))}}, 10000000)
  1454  		defer sim.Close()
  1455  
  1456  		// deploy the test contract
  1457  		_, _, contract, err := DeployOverload(auth, sim)
  1458  		if err != nil {
  1459  			t.Fatalf("Failed to deploy contract: %v", err)
  1460  		}
  1461  
  1462  		resCh, stopCh := make(chan uint64), make(chan struct{})
  1463  
  1464  		go func() {
  1465  			barSink := make(chan *OverloadBar)
  1466  			sub, _ := contract.WatchBar(nil, barSink)
  1467  			defer sub.Unsubscribe()
  1468  
  1469  			bar0Sink := make(chan *OverloadBar0)
  1470  			sub0, _ := contract.WatchBar0(nil, bar0Sink)
  1471  			defer sub0.Unsubscribe()
  1472  
  1473  			for {
  1474  				select {
  1475  				case ev := <-barSink:
  1476  					resCh <- ev.I.Uint64()
  1477  				case ev := <-bar0Sink:
  1478  					resCh <- ev.I.Uint64() + ev.J.Uint64()
  1479  				case <-stopCh:
  1480  					return
  1481  				}
  1482  			}
  1483  		}()
  1484  
  1485  		time.Sleep(5 * time.Second)
  1486  
  1487  		// Finish deploy.
  1488  		sim.Commit(false)
  1489  
  1490  		contract.Foo(auth, big.NewInt(1), big.NewInt(2))
  1491  		sim.Commit(false)
  1492  
  1493  		time.Sleep(5 * time.Second)
  1494  
  1495  		bar0Timer := time.NewTimer(60 * time.Second)
  1496  		time.Sleep(1 * time.Second)
  1497  
  1498  		select {
  1499  		case n := <-resCh:
  1500  			if n != 3 {
  1501  				t.Fatalf("Invalid bar0 event")
  1502  			}
  1503  		case <-bar0Timer.C:
  1504  			t.Fatalf("Wait bar0 event timeout")
  1505  		}
  1506  
  1507  		bar0Timer.Stop()
  1508  
  1509  		contract.Foo0(auth, big.NewInt(1))
  1510  		sim.Commit(false)
  1511  
  1512  		time.Sleep(5 * time.Second)
  1513  
  1514  		barTimer := time.NewTimer(60 * time.Second)
  1515  		time.Sleep(1 * time.Second)
  1516  
  1517  		select {
  1518  		case n := <-resCh:
  1519  			if n != 1 {
  1520  				t.Fatalf("Invalid bar event")
  1521  			}
  1522  		case <-barTimer.C:
  1523  			t.Fatalf("Wait bar event timeout")
  1524  		}
  1525  
  1526  		barTimer.Stop()
  1527  
  1528  		close(stopCh)
  1529  		`,
  1530  		nil,
  1531  		nil,
  1532  		nil,
  1533  		nil,
  1534  	},
  1535  	{
  1536  		"IdentifierCollision",
  1537  		`
  1538  		pragma solidity >=0.4.19 <0.6.0;
  1539  
  1540  		contract IdentifierCollision {
  1541  			uint public _myVar;
  1542  
  1543  			function MyVar() public view returns (uint) {
  1544  				return _myVar;
  1545  			}
  1546  		}
  1547  		`,
  1548  		[]string{"60806040523480156100115760006000fd5b50610017565b60c3806100256000396000f3fe608060405234801560105760006000fd5b506004361060365760003560e01c806301ad4d8714603c5780634ef1f0ad146058576036565b60006000fd5b60426074565b6040518082815260200191505060405180910390f35b605e607d565b6040518082815260200191505060405180910390f35b60006000505481565b60006000600050549050608b565b9056fea265627a7a7231582067c8d84688b01c4754ba40a2a871cede94ea1f28b5981593ab2a45b46ac43af664736f6c634300050c0032"},
  1549  		[]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"}]`},
  1550  		`
  1551  		"math/big"
  1552  
  1553  		"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1554  		"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1555  		"github.com/ethereum/go-ethereum/crypto"
  1556  		"github.com/MetalBlockchain/subnet-evm/core"
  1557  		`,
  1558  		`
  1559  		// Initialize test accounts
  1560  		key, _ := crypto.GenerateKey()
  1561  		addr := crypto.PubkeyToAddress(key.PublicKey)
  1562  
  1563  		// Deploy registrar contract
  1564  		sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: new(big.Int).Mul(big.NewInt(10000000000000000), big.NewInt(1000))}}, 10000000)
  1565  		defer sim.Close()
  1566  
  1567  		transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1568  		_, _, _, err := DeployIdentifierCollision(transactOpts, sim)
  1569  		if err != nil {
  1570  			t.Fatalf("failed to deploy contract: %v", err)
  1571  		}
  1572  		`,
  1573  		nil,
  1574  		nil,
  1575  		map[string]string{"_myVar": "pubVar"}, // alias MyVar to PubVar
  1576  		nil,
  1577  	},
  1578  	{
  1579  		"MultiContracts",
  1580  		`
  1581  		pragma solidity ^0.5.11;
  1582  		pragma experimental ABIEncoderV2;
  1583  
  1584  		library ExternalLib {
  1585  			struct SharedStruct{
  1586  				uint256 f1;
  1587  				bytes32 f2;
  1588  			}
  1589  		}
  1590  
  1591  		contract ContractOne {
  1592  			function foo(ExternalLib.SharedStruct memory s) pure public {
  1593  				// Do stuff
  1594  			}
  1595  		}
  1596  
  1597  		contract ContractTwo {
  1598  			function bar(ExternalLib.SharedStruct memory s) pure public {
  1599  				// Do stuff
  1600  			}
  1601  		}
  1602          `,
  1603  		[]string{
  1604  			`60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c80639d8a8ba81461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a72315820749274eb7f6c01010d5322af4e1668b0a154409eb7968bd6cae5524c7ed669bb6c6578706572696d656e74616cf564736f6c634300050c0040`,
  1605  			`60806040523480156100115760006000fd5b50610017565b6101b5806100266000396000f3fe60806040523480156100115760006000fd5b50600436106100305760003560e01c8063db8ba08c1461003657610030565b60006000fd5b610050600480360361004b91908101906100d1565b610052565b005b5b5056610171565b6000813590506100698161013d565b92915050565b6000604082840312156100825760006000fd5b61008c60406100fb565b9050600061009c848285016100bc565b60008301525060206100b08482850161005a565b60208301525092915050565b6000813590506100cb81610157565b92915050565b6000604082840312156100e45760006000fd5b60006100f28482850161006f565b91505092915050565b6000604051905081810181811067ffffffffffffffff8211171561011f5760006000fd5b8060405250919050565b6000819050919050565b6000819050919050565b61014681610129565b811415156101545760006000fd5b50565b61016081610133565b8114151561016e5760006000fd5b50565bfea365627a7a723158209bc28ee7ea97c131a13330d77ec73b4493b5c59c648352da81dd288b021192596c6578706572696d656e74616cf564736f6c634300050c0040`,
  1606  			`606c6026600b82828239805160001a6073141515601857fe5b30600052607381538281f350fe73000000000000000000000000000000000000000030146080604052600436106023575b60006000fdfea365627a7a72315820518f0110144f5b3de95697d05e456a064656890d08e6f9cff47f3be710cc46a36c6578706572696d656e74616cf564736f6c634300050c0040`,
  1607  		},
  1608  		[]string{
  1609  			`[{"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"}]`,
  1610  			`[{"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"}]`,
  1611  			`[]`,
  1612  		},
  1613  		`
  1614  		"math/big"
  1615  
  1616  		"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1617  		"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1618  		"github.com/ethereum/go-ethereum/crypto"
  1619  		"github.com/MetalBlockchain/subnet-evm/core"
  1620          `,
  1621  		`
  1622  		key, _ := crypto.GenerateKey()
  1623  		addr := crypto.PubkeyToAddress(key.PublicKey)
  1624  
  1625  		// Deploy registrar contract
  1626  		sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1627  		defer sim.Close()
  1628  
  1629  		transactOpts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1630  		_, _, c1, err := DeployContractOne(transactOpts, sim)
  1631  		if err != nil {
  1632  			t.Fatal("Failed to deploy contract")
  1633  		}
  1634  		sim.Commit(false)
  1635  		err = c1.Foo(nil, ExternalLibSharedStruct{
  1636  			F1: big.NewInt(100),
  1637  			F2: [32]byte{0x01, 0x02, 0x03},
  1638  		})
  1639  		if err != nil {
  1640  			t.Fatal("Failed to invoke function")
  1641  		}
  1642  		_, _, c2, err := DeployContractTwo(transactOpts, sim)
  1643  		if err != nil {
  1644  			t.Fatal("Failed to deploy contract")
  1645  		}
  1646  		sim.Commit(false)
  1647  		err = c2.Bar(nil, ExternalLibSharedStruct{
  1648  			F1: big.NewInt(100),
  1649  			F2: [32]byte{0x01, 0x02, 0x03},
  1650  		})
  1651  		if err != nil {
  1652  			t.Fatal("Failed to invoke function")
  1653  		}
  1654          `,
  1655  		nil,
  1656  		nil,
  1657  		nil,
  1658  		[]string{"ContractOne", "ContractTwo", "ExternalLib"},
  1659  	},
  1660  	// Test the existence of the free retrieval calls
  1661  	{
  1662  		`PureAndView`,
  1663  		`pragma solidity >=0.6.0;
  1664  		contract PureAndView {
  1665  			function PureFunc() public pure returns (uint) {
  1666  				return 42;
  1667  			}
  1668  			function ViewFunc() public view returns (uint) {
  1669  				return block.number;
  1670  			}
  1671  		}
  1672  		`,
  1673  		[]string{`608060405234801561001057600080fd5b5060b68061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060325760003560e01c806376b5686a146037578063bb38c66c146053575b600080fd5b603d606f565b6040518082815260200191505060405180910390f35b60596077565b6040518082815260200191505060405180910390f35b600043905090565b6000602a90509056fea2646970667358221220d158c2ab7fdfce366a7998ec79ab84edd43b9815630bbaede2c760ea77f29f7f64736f6c63430006000033`},
  1674  		[]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"}]`},
  1675  		`
  1676  			"math/big"
  1677  
  1678  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1679  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1680  			"github.com/MetalBlockchain/subnet-evm/core"
  1681  			"github.com/ethereum/go-ethereum/crypto"
  1682  		`,
  1683  		`
  1684  			// Generate a new random account and a funded simulator
  1685  			key, _ := crypto.GenerateKey()
  1686  			auth, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1687  
  1688  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{auth.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1689  			defer sim.Close()
  1690  
  1691  			// Deploy a tester contract and execute a structured call on it
  1692  			_, _, pav, err := DeployPureAndView(auth, sim)
  1693  			if err != nil {
  1694  				t.Fatalf("Failed to deploy PureAndView contract: %v", err)
  1695  			}
  1696  			sim.Commit(false)
  1697  
  1698  			// This test the existence of the free retreiver call for view and pure functions
  1699  			if num, err := pav.PureFunc(nil); err != nil {
  1700  				t.Fatalf("Failed to call anonymous field retriever: %v", err)
  1701  			} else if num.Cmp(big.NewInt(42)) != 0 {
  1702  				t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 42)
  1703  			}
  1704  			if num, err := pav.ViewFunc(nil); err != nil {
  1705  				t.Fatalf("Failed to call anonymous field retriever: %v", err)
  1706  			} else if num.Cmp(big.NewInt(1)) != 0 {
  1707  				t.Fatalf("Retrieved value mismatch: have %v, want %v", num, 1)
  1708  			}
  1709  		`,
  1710  		nil,
  1711  		nil,
  1712  		nil,
  1713  		nil,
  1714  	},
  1715  	// Test fallback separation introduced in v0.6.0
  1716  	{
  1717  		`NewFallbacks`,
  1718  		`
  1719  		pragma solidity >=0.6.0 <0.7.0;
  1720  	
  1721  		contract NewFallbacks {
  1722  			event Fallback(bytes data);
  1723  			fallback() external {
  1724  				emit Fallback(msg.data);
  1725  			}
  1726  	
  1727  			event Received(address addr, uint value);
  1728  			receive() external payable {
  1729  				emit Received(msg.sender, msg.value);
  1730  			}
  1731  		}
  1732  	   `,
  1733  		[]string{"6080604052348015600f57600080fd5b506101078061001f6000396000f3fe608060405236605f577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f885258743334604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a1005b348015606a57600080fd5b507f9043988963722edecc2099c75b0af0ff76af14ffca42ed6bce059a20a2a9f98660003660405180806020018281038252848482818152602001925080828437600081840152601f19601f820116905080830192505050935050505060405180910390a100fea26469706673582212201f994dcfbc53bf610b19176f9a361eafa77b447fd9c796fa2c615dfd0aaf3b8b64736f6c634300060c0033"},
  1734  		[]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"}]`},
  1735  		`
  1736  			"bytes"
  1737  			"math/big"
  1738  
  1739  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1740  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1741  			"github.com/MetalBlockchain/subnet-evm/core"
  1742  			"github.com/ethereum/go-ethereum/crypto"
  1743  	   `,
  1744  		`
  1745  			key, _ := crypto.GenerateKey()
  1746  			addr := crypto.PubkeyToAddress(key.PublicKey)
  1747  	
  1748  			sim := backends.NewSimulatedBackend(core.GenesisAlloc{addr: {Balance: big.NewInt(1000000000000000000)}}, 1000000)
  1749  			defer sim.Close()
  1750  	
  1751  			opts, _ := bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1752  			_, _, c, err := DeployNewFallbacks(opts, sim)
  1753  			if err != nil {
  1754  				t.Fatalf("Failed to deploy contract: %v", err)
  1755  			}
  1756  			sim.Commit(false)
  1757  	
  1758  			// Test receive function
  1759  			opts.Value = big.NewInt(100)
  1760  			c.Receive(opts)
  1761  			sim.Commit(false)
  1762  	
  1763  			var gotEvent bool
  1764  			iter, _ := c.FilterReceived(nil)
  1765  			defer iter.Close()
  1766  			for iter.Next() {
  1767  				if iter.Event.Addr != addr {
  1768  					t.Fatal("Msg.sender mismatch")
  1769  				}
  1770  				if iter.Event.Value.Uint64() != 100 {
  1771  					t.Fatal("Msg.value mismatch")
  1772  				}
  1773  				gotEvent = true
  1774  				break
  1775  			}
  1776  			if !gotEvent {
  1777  				t.Fatal("Expect to receive event emitted by receive")
  1778  			}
  1779  	
  1780  			// Test fallback function
  1781  			gotEvent = false
  1782  			opts.Value = nil
  1783  			calldata := []byte{0x01, 0x02, 0x03}
  1784  			c.Fallback(opts, calldata)
  1785  			sim.Commit(false)
  1786  	
  1787  			iter2, _ := c.FilterFallback(nil)
  1788  			defer iter2.Close()
  1789  			for iter2.Next() {
  1790  				if !bytes.Equal(iter2.Event.Data, calldata) {
  1791  					t.Fatal("calldata mismatch")
  1792  				}
  1793  				gotEvent = true
  1794  				break
  1795  			}
  1796  			if !gotEvent {
  1797  				t.Fatal("Expect to receive event emitted by fallback")
  1798  			}
  1799  	   `,
  1800  		nil,
  1801  		nil,
  1802  		nil,
  1803  		nil,
  1804  	},
  1805  	// Test resolving single struct argument
  1806  	{
  1807  		`NewSingleStructArgument`,
  1808  		`
  1809  		 pragma solidity ^0.8.0;
  1810  
  1811  		 contract NewSingleStructArgument {
  1812  			 struct MyStruct{
  1813  				 uint256 a;
  1814  				 uint256 b;
  1815  			 }
  1816  			 event StructEvent(MyStruct s);
  1817  			 function TestEvent() public {
  1818  				 emit StructEvent(MyStruct({a: 1, b: 2}));
  1819  			 }
  1820  		 }
  1821  	   `,
  1822  		[]string{"608060405234801561001057600080fd5b50610113806100206000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c806324ec1d3f14602d575b600080fd5b60336035565b005b7fb4b2ff75e30cb4317eaae16dd8a187dd89978df17565104caa6c2797caae27d460405180604001604052806001815260200160028152506040516078919060ba565b60405180910390a1565b6040820160008201516096600085018260ad565b50602082015160a7602085018260ad565b50505050565b60b48160d3565b82525050565b600060408201905060cd60008301846082565b92915050565b600081905091905056fea26469706673582212208823628796125bf9941ce4eda18da1be3cf2931b231708ab848e1bd7151c0c9a64736f6c63430008070033"},
  1823  		[]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"}]`},
  1824  		`
  1825  			"math/big"
  1826  
  1827  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1828  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1829  			"github.com/MetalBlockchain/subnet-evm/core"
  1830  			"github.com/ethereum/go-ethereum/crypto"
  1831  	   `,
  1832  		`
  1833  			var (
  1834  				key, _  = crypto.GenerateKey()
  1835  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1836  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1837  			)
  1838  			defer sim.Close()
  1839  
  1840  			_, _, d, err := DeployNewSingleStructArgument(user, sim)
  1841  			if err != nil {
  1842  				t.Fatalf("Failed to deploy contract %v", err)
  1843  			}
  1844  			sim.Commit(false)
  1845  
  1846  			_, err = d.TestEvent(user)
  1847  			if err != nil {
  1848  				t.Fatalf("Failed to call contract %v", err)
  1849  			}
  1850  			sim.Commit(false)
  1851  
  1852  			it, err := d.FilterStructEvent(nil)
  1853  			if err != nil {
  1854  				t.Fatalf("Failed to filter contract event %v", err)
  1855  			}
  1856  			var count int
  1857  			for it.Next() {
  1858  				if it.Event.S.A.Cmp(big.NewInt(1)) != 0 {
  1859  					t.Fatal("Unexpected contract event")
  1860  				}
  1861  				if it.Event.S.B.Cmp(big.NewInt(2)) != 0 {
  1862  					t.Fatal("Unexpected contract event")
  1863  				}
  1864  				count += 1
  1865  			}
  1866  			if count != 1 {
  1867  				t.Fatal("Unexpected contract event number")
  1868  			}
  1869  	   `,
  1870  		nil,
  1871  		nil,
  1872  		nil,
  1873  		nil,
  1874  	},
  1875  	// Test errors introduced in v0.8.4
  1876  	{
  1877  		`NewErrors`,
  1878  		`
  1879  			pragma solidity >0.8.4;
  1880  		
  1881  			contract NewErrors {
  1882  				error MyError(uint256);
  1883  				error MyError1(uint256);
  1884  				error MyError2(uint256, uint256);
  1885  				error MyError3(uint256 a, uint256 b, uint256 c);
  1886  				function Error() public pure {
  1887  					revert MyError3(1,2,3);
  1888  				}
  1889  			}
  1890  		   `,
  1891  		[]string{"0x6080604052348015600f57600080fd5b5060998061001e6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063726c638214602d575b600080fd5b60336035565b005b60405163024876cd60e61b815260016004820152600260248201526003604482015260640160405180910390fdfea264697066735822122093f786a1bc60216540cd999fbb4a6109e0fef20abcff6e9107fb2817ca968f3c64736f6c63430008070033"},
  1892  		[]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"}]`},
  1893  		`
  1894  				"math/big"
  1895  
  1896  				"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1897  				"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1898  				"github.com/MetalBlockchain/subnet-evm/core"
  1899  				"github.com/ethereum/go-ethereum/crypto"
  1900  		   `,
  1901  		`
  1902  				var (
  1903  					key, _  = crypto.GenerateKey()
  1904  					user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1905  					sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1906  				)
  1907  				defer sim.Close()
  1908  		
  1909  				_, tx, contract, err := DeployNewErrors(user, sim)
  1910  				if err != nil {
  1911  					t.Fatal(err)
  1912  				}
  1913  				sim.Commit(true)
  1914  				_, err = bind.WaitDeployed(nil, sim, tx)
  1915  				if err != nil {
  1916  					t.Error(err)
  1917  				}
  1918  				if err := contract.Error(new(bind.CallOpts)); err == nil {
  1919  					t.Fatalf("expected contract to throw error")
  1920  				}
  1921  				// TODO (MariusVanDerWijden unpack error using abigen
  1922  				// once that is implemented
  1923  		   `,
  1924  		nil,
  1925  		nil,
  1926  		nil,
  1927  		nil,
  1928  	},
  1929  	{
  1930  		name: `ConstructorWithStructParam`,
  1931  		contract: `
  1932  		pragma solidity >=0.8.0 <0.9.0;
  1933  		
  1934  		contract ConstructorWithStructParam {
  1935  			struct StructType {
  1936  				uint256 field;
  1937  			}
  1938  		
  1939  			constructor(StructType memory st) {}
  1940  		}
  1941  		`,
  1942  		bytecode: []string{`0x608060405234801561001057600080fd5b506040516101c43803806101c48339818101604052810190610032919061014a565b50610177565b6000604051905090565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6100958261004c565b810181811067ffffffffffffffff821117156100b4576100b361005d565b5b80604052505050565b60006100c7610038565b90506100d3828261008c565b919050565b6000819050919050565b6100eb816100d8565b81146100f657600080fd5b50565b600081519050610108816100e2565b92915050565b60006020828403121561012457610123610047565b5b61012e60206100bd565b9050600061013e848285016100f9565b60008301525092915050565b6000602082840312156101605761015f610042565b5b600061016e8482850161010e565b91505092915050565b603f806101856000396000f3fe6080604052600080fdfea2646970667358221220cdffa667affecefac5561f65f4a4ba914204a8d4eb859d8cd426fb306e5c12a364736f6c634300080a0033`},
  1943  		abi:      []string{`[{"inputs":[{"components":[{"internalType":"uint256","name":"field","type":"uint256"}],"internalType":"struct ConstructorWithStructParam.StructType","name":"st","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"}]`},
  1944  		imports: `
  1945  			"math/big"
  1946  
  1947  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1948  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1949  			"github.com/MetalBlockchain/subnet-evm/core"
  1950  			"github.com/ethereum/go-ethereum/crypto"
  1951  		`,
  1952  		tester: `
  1953  			var (
  1954  				key, _  = crypto.GenerateKey()
  1955  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  1956  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, 10000000)
  1957  			)
  1958  			defer sim.Close()
  1959  
  1960  			_, tx, _, err := DeployConstructorWithStructParam(user, sim, ConstructorWithStructParamStructType{Field: big.NewInt(42)})
  1961  			if err != nil {
  1962  				t.Fatalf("DeployConstructorWithStructParam() got err %v; want nil err", err)
  1963  			}
  1964  			sim.Commit(true)
  1965  			
  1966  			if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
  1967  				t.Logf("Deployment tx: %+v", tx)
  1968  				t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err)
  1969  			}
  1970  		`,
  1971  	},
  1972  	{
  1973  		name: `NameConflict`,
  1974  		contract: `
  1975  		// SPDX-License-Identifier: GPL-3.0
  1976  		pragma solidity >=0.4.22 <0.9.0;
  1977  		contract oracle {
  1978  			struct request {
  1979  				 bytes data;
  1980  				 bytes _data;
  1981  			}
  1982  			event log (int msg, int _msg);
  1983  			function addRequest(request memory req) public pure {}
  1984  			function getRequest() pure public returns (request memory) {
  1985  				 return request("", "");
  1986  			}
  1987  		}
  1988  		`,
  1989  		bytecode: []string{"0x608060405234801561001057600080fd5b5061042b806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c8063c2bb515f1461003b578063cce7b04814610059575b600080fd5b610043610075565b60405161005091906101af565b60405180910390f35b610073600480360381019061006e91906103ac565b6100b5565b005b61007d6100b8565b604051806040016040528060405180602001604052806000815250815260200160405180602001604052806000815250815250905090565b50565b604051806040016040528060608152602001606081525090565b600081519050919050565b600082825260208201905092915050565b60005b8381101561010c5780820151818401526020810190506100f1565b8381111561011b576000848401525b50505050565b6000601f19601f8301169050919050565b600061013d826100d2565b61014781856100dd565b93506101578185602086016100ee565b61016081610121565b840191505092915050565b600060408301600083015184820360008601526101888282610132565b915050602083015184820360208601526101a28282610132565b9150508091505092915050565b600060208201905081810360008301526101c9818461016b565b905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61022282610121565b810181811067ffffffffffffffff82111715610241576102406101ea565b5b80604052505050565b60006102546101d1565b90506102608282610219565b919050565b600080fd5b600080fd5b600080fd5b600067ffffffffffffffff82111561028f5761028e6101ea565b5b61029882610121565b9050602081019050919050565b82818337600083830152505050565b60006102c76102c284610274565b61024a565b9050828152602081018484840111156102e3576102e261026f565b5b6102ee8482856102a5565b509392505050565b600082601f83011261030b5761030a61026a565b5b813561031b8482602086016102b4565b91505092915050565b60006040828403121561033a576103396101e5565b5b610344604061024a565b9050600082013567ffffffffffffffff81111561036457610363610265565b5b610370848285016102f6565b600083015250602082013567ffffffffffffffff81111561039457610393610265565b5b6103a0848285016102f6565b60208301525092915050565b6000602082840312156103c2576103c16101db565b5b600082013567ffffffffffffffff8111156103e0576103df6101e0565b5b6103ec84828501610324565b9150509291505056fea264697066735822122033bca1606af9b6aeba1673f98c52003cec19338539fb44b86690ce82c51483b564736f6c634300080e0033"},
  1990  		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" } ]`},
  1991  		imports: `
  1992  			"math/big"
  1993  
  1994  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  1995  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  1996  			"github.com/MetalBlockchain/subnet-evm/core"
  1997  			"github.com/ethereum/go-ethereum/crypto"
  1998  		`,
  1999  		tester: `
  2000  			var (
  2001  				gasCeil = uint64(30000000) // Note: from geth's ethconfig.Defaults.Miner.GasCeil
  2002  				key, _  = crypto.GenerateKey()
  2003  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  2004  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, gasCeil)
  2005  			)
  2006  			defer sim.Close()
  2007  
  2008  			_, tx, _, err := DeployNameConflict(user, sim)
  2009  			if err != nil {
  2010  				t.Fatalf("DeployNameConflict() got err %v; want nil err", err)
  2011  			}
  2012  			sim.Commit(true)
  2013  			
  2014  			if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
  2015  				t.Logf("Deployment tx: %+v", tx)
  2016  				t.Errorf("bind.WaitDeployed(nil, %T, <deployment tx>) got err %v; want nil err", sim, err)
  2017  			}
  2018  		`,
  2019  	},
  2020  	{
  2021  		name: "RangeKeyword",
  2022  		contract: `
  2023  		// SPDX-License-Identifier: GPL-3.0
  2024  		pragma solidity >=0.4.22 <0.9.0;
  2025  		contract keywordcontract {
  2026  			function functionWithKeywordParameter(range uint256) public pure {}
  2027  		}
  2028  		`,
  2029  		bytecode: []string{"0x608060405234801561001057600080fd5b5060dc8061001f6000396000f3fe6080604052348015600f57600080fd5b506004361060285760003560e01c8063527a119f14602d575b600080fd5b60436004803603810190603f9190605b565b6045565b005b50565b6000813590506055816092565b92915050565b600060208284031215606e57606d608d565b5b6000607a848285016048565b91505092915050565b6000819050919050565b600080fd5b6099816083565b811460a357600080fd5b5056fea2646970667358221220d4f4525e2615516394055d369fb17df41c359e5e962734f27fd683ea81fd9db164736f6c63430008070033"},
  2030  		abi:      []string{`[{"inputs":[{"internalType":"uint256","name":"range","type":"uint256"}],"name":"functionWithKeywordParameter","outputs":[],"stateMutability":"pure","type":"function"}]`},
  2031  		imports: `
  2032  			"math/big"
  2033  
  2034  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind"
  2035  			"github.com/MetalBlockchain/subnet-evm/accounts/abi/bind/backends"
  2036  			"github.com/MetalBlockchain/subnet-evm/core"
  2037  			"github.com/ethereum/go-ethereum/crypto"
  2038  		`,
  2039  		tester: `
  2040  			var (
  2041  				gasCeil = uint64(30000000) // Note: from geth's ethconfig.Defaults.Miner.GasCeil
  2042  				key, _  = crypto.GenerateKey()
  2043  				user, _ = bind.NewKeyedTransactorWithChainID(key, big.NewInt(1337))
  2044  				sim     = backends.NewSimulatedBackend(core.GenesisAlloc{user.From: {Balance: big.NewInt(1000000000000000000)}}, gasCeil)
  2045  			)
  2046  			_, tx, _, err := DeployRangeKeyword(user, sim)
  2047  			if err != nil {
  2048  				t.Fatalf("error deploying contract: %v", err)
  2049  			}
  2050  			sim.Commit(true)
  2051  
  2052  			if _, err = bind.WaitDeployed(nil, sim, tx); err != nil {
  2053  				t.Errorf("error deploying the contract: %v", err)
  2054  			}
  2055  		`,
  2056  	},
  2057  }
  2058  
  2059  // The binding tests have been modified to run in two separate test
  2060  // functions to allow these tests to pass on GitHub Actions.
  2061  func TestGolangBindingsOverload(t *testing.T) {
  2062  	golangBindings(t, true)
  2063  }
  2064  
  2065  func TestGolangBindings(t *testing.T) {
  2066  	golangBindings(t, false)
  2067  }
  2068  
  2069  // Tests that packages generated by the binder can be successfully compiled and
  2070  // the requested tester run against it.
  2071  func golangBindings(t *testing.T, overload bool) {
  2072  	// Skip the test if no Go command can be found
  2073  	gocmd := runtime.GOROOT() + "/bin/go"
  2074  	if !common.FileExist(gocmd) {
  2075  		t.Skip("go sdk not found for testing")
  2076  	}
  2077  	// Create a temporary workspace for the test suite
  2078  	ws := t.TempDir()
  2079  
  2080  	pkg := filepath.Join(ws, "bindtest")
  2081  	if err := os.MkdirAll(pkg, 0700); err != nil {
  2082  		t.Fatalf("failed to create package: %v", err)
  2083  	}
  2084  	// Generate the test suite for all the contracts
  2085  	for i, tt := range bindTests {
  2086  		t.Run(tt.name, func(t *testing.T) {
  2087  			// Skip the "Overload" test if [!overload]
  2088  			if !overload && tt.name == "Overload" {
  2089  				return
  2090  			}
  2091  			// Skip all tests except for "Overload" if [overload]
  2092  			if overload && tt.name != "Overload" {
  2093  				return
  2094  			}
  2095  			var types []string
  2096  			if tt.types != nil {
  2097  				types = tt.types
  2098  			} else {
  2099  				types = []string{tt.name}
  2100  			}
  2101  			// Generate the binding and create a Go source file in the workspace
  2102  			bind, err := Bind(types, tt.abi, tt.bytecode, tt.fsigs, "bindtest", LangGo, tt.libs, tt.aliases, false)
  2103  			if err != nil {
  2104  				t.Fatalf("test %d: failed to generate binding: %v", i, err)
  2105  			}
  2106  			if err = os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+".go"), []byte(bind), 0600); err != nil {
  2107  				t.Fatalf("test %d: failed to write binding: %v", i, err)
  2108  			}
  2109  			// Generate the test file with the injected test code
  2110  			code := fmt.Sprintf(`
  2111  			package bindtest
  2112  
  2113  			import (
  2114  				"testing"
  2115  				%s
  2116  			)
  2117  
  2118  			func Test%s(t *testing.T) {
  2119  				%s
  2120  			}
  2121  		`, tt.imports, tt.name, tt.tester)
  2122  			if err := os.WriteFile(filepath.Join(pkg, strings.ToLower(tt.name)+"_test.go"), []byte(code), 0600); err != nil {
  2123  				t.Fatalf("test %d: failed to write tests: %v", i, err)
  2124  			}
  2125  		})
  2126  	}
  2127  	// Convert the package to go modules and use the current source for go-ethereum
  2128  	moder := exec.Command(gocmd, "mod", "init", "bindtest")
  2129  	moder.Dir = pkg
  2130  	if out, err := moder.CombinedOutput(); err != nil {
  2131  		t.Fatalf("failed to convert binding test to modules: %v\n%s", err, out)
  2132  	}
  2133  	pwd, _ := os.Getwd()
  2134  	replacer := exec.Command(gocmd, "mod", "edit", "-x", "-require", "github.com/MetalBlockchain/subnet-evm@v0.0.0", "-replace", "github.com/MetalBlockchain/subnet-evm="+filepath.Join(pwd, "..", "..", "..")) // Repo root
  2135  	replacer.Dir = pkg
  2136  	if out, err := replacer.CombinedOutput(); err != nil {
  2137  		t.Fatalf("failed to replace binding test dependency to current source tree: %v\n%s", err, out)
  2138  	}
  2139  	tidier := exec.Command(gocmd, "mod", "tidy", "-compat=1.18")
  2140  	tidier.Dir = pkg
  2141  	if out, err := tidier.CombinedOutput(); err != nil {
  2142  		t.Fatalf("failed to tidy Go module file: %v\n%s", err, out)
  2143  	}
  2144  	// Test the entire package and report any failures
  2145  	cmd := exec.Command(gocmd, "test", "-v", "-count", "1")
  2146  	cmd.Dir = pkg
  2147  	if out, err := cmd.CombinedOutput(); err != nil {
  2148  		t.Fatalf("failed to run binding test: %v\n%s", err, out)
  2149  	}
  2150  }
  2151  
  2152  // Tests that java binding generated by the binder is exactly matched.
  2153  func TestJavaBindings(t *testing.T) {
  2154  	var cases = []struct {
  2155  		name     string
  2156  		contract string
  2157  		abi      string
  2158  		bytecode string
  2159  		expected string
  2160  	}{
  2161  		{
  2162  			"test",
  2163  			`
  2164  			pragma experimental ABIEncoderV2;
  2165  			pragma solidity ^0.5.2;
  2166  
  2167  			contract test {
  2168  				function setAddress(address a) public returns(address){}
  2169  				function setAddressList(address[] memory a_l) public returns(address[] memory){}
  2170  				function setAddressArray(address[2] memory a_a) public returns(address[2] memory){}
  2171  
  2172  				function setUint8(uint8 u8) public returns(uint8){}
  2173  				function setUint16(uint16 u16) public returns(uint16){}
  2174  				function setUint32(uint32 u32) public returns(uint32){}
  2175  				function setUint64(uint64 u64) public returns(uint64){}
  2176  				function setUint256(uint256 u256) public returns(uint256){}
  2177  				function setUint256List(uint256[] memory u256_l) public returns(uint256[] memory){}
  2178  				function setUint256Array(uint256[2] memory u256_a) public returns(uint256[2] memory){}
  2179  
  2180  				function setInt8(int8 i8) public returns(int8){}
  2181  				function setInt16(int16 i16) public returns(int16){}
  2182  				function setInt32(int32 i32) public returns(int32){}
  2183  				function setInt64(int64 i64) public returns(int64){}
  2184  				function setInt256(int256 i256) public returns(int256){}
  2185  				function setInt256List(int256[] memory i256_l) public returns(int256[] memory){}
  2186  				function setInt256Array(int256[2] memory i256_a) public returns(int256[2] memory){}
  2187  
  2188  				function setBytes1(bytes1 b1) public returns(bytes1) {}
  2189  				function setBytes32(bytes32 b32) public returns(bytes32) {}
  2190  				function setBytes(bytes memory bs) public returns(bytes memory) {}
  2191  				function setBytesList(bytes[] memory bs_l) public returns(bytes[] memory) {}
  2192  				function setBytesArray(bytes[2] memory bs_a) public returns(bytes[2] memory) {}
  2193  
  2194  				function setString(string memory s) public returns(string memory) {}
  2195  				function setStringList(string[] memory s_l) public returns(string[] memory) {}
  2196  				function setStringArray(string[2] memory s_a) public returns(string[2] memory) {}
  2197  
  2198  				function setBool(bool b) public returns(bool) {}
  2199  				function setBoolList(bool[] memory b_l) public returns(bool[] memory) {}
  2200  				function setBoolArray(bool[2] memory b_a) public returns(bool[2] memory) {}
  2201  			}`,
  2202  			`[{"constant":false,"inputs":[{"name":"u16","type":"uint16"}],"name":"setUint16","outputs":[{"name":"","type":"uint16"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b_a","type":"bool[2]"}],"name":"setBoolArray","outputs":[{"name":"","type":"bool[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a_a","type":"address[2]"}],"name":"setAddressArray","outputs":[{"name":"","type":"address[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs_l","type":"bytes[]"}],"name":"setBytesList","outputs":[{"name":"","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u8","type":"uint8"}],"name":"setUint8","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u32","type":"uint32"}],"name":"setUint32","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b","type":"bool"}],"name":"setBool","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256_l","type":"int256[]"}],"name":"setInt256List","outputs":[{"name":"","type":"int256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256_a","type":"uint256[2]"}],"name":"setUint256Array","outputs":[{"name":"","type":"uint256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b_l","type":"bool[]"}],"name":"setBoolList","outputs":[{"name":"","type":"bool[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs_a","type":"bytes[2]"}],"name":"setBytesArray","outputs":[{"name":"","type":"bytes[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a_l","type":"address[]"}],"name":"setAddressList","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256_a","type":"int256[2]"}],"name":"setInt256Array","outputs":[{"name":"","type":"int256[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s_a","type":"string[2]"}],"name":"setStringArray","outputs":[{"name":"","type":"string[2]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s","type":"string"}],"name":"setString","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u64","type":"uint64"}],"name":"setUint64","outputs":[{"name":"","type":"uint64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i16","type":"int16"}],"name":"setInt16","outputs":[{"name":"","type":"int16"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i8","type":"int8"}],"name":"setInt8","outputs":[{"name":"","type":"int8"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256_l","type":"uint256[]"}],"name":"setUint256List","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i256","type":"int256"}],"name":"setInt256","outputs":[{"name":"","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i32","type":"int32"}],"name":"setInt32","outputs":[{"name":"","type":"int32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b32","type":"bytes32"}],"name":"setBytes32","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"s_l","type":"string[]"}],"name":"setStringList","outputs":[{"name":"","type":"string[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"u256","type":"uint256"}],"name":"setUint256","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"bs","type":"bytes"}],"name":"setBytes","outputs":[{"name":"","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"a","type":"address"}],"name":"setAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"i64","type":"int64"}],"name":"setInt64","outputs":[{"name":"","type":"int64"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"b1","type":"bytes1"}],"name":"setBytes1","outputs":[{"name":"","type":"bytes1"}],"payable":false,"stateMutability":"nonpayable","type":"function"}]`,
  2203  			`608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037`,
  2204  			`
  2205  // This file is an automatically generated Java binding. Do not modify as any
  2206  // change will likely be lost upon the next re-generation!
  2207  
  2208  package bindtest;
  2209  
  2210  import org.ethereum.geth.*;
  2211  import java.util.*;
  2212  
  2213  public class Test {
  2214  	// ABI is the input ABI used to generate the binding from.
  2215  	public final static String ABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"u16\",\"type\":\"uint16\"}],\"name\":\"setUint16\",\"outputs\":[{\"name\":\"\",\"type\":\"uint16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_a\",\"type\":\"bool[2]\"}],\"name\":\"setBoolArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_a\",\"type\":\"address[2]\"}],\"name\":\"setAddressArray\",\"outputs\":[{\"name\":\"\",\"type\":\"address[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_l\",\"type\":\"bytes[]\"}],\"name\":\"setBytesList\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u8\",\"type\":\"uint8\"}],\"name\":\"setUint8\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u32\",\"type\":\"uint32\"}],\"name\":\"setUint32\",\"outputs\":[{\"name\":\"\",\"type\":\"uint32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"name\":\"setBool\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_l\",\"type\":\"int256[]\"}],\"name\":\"setInt256List\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_a\",\"type\":\"uint256[2]\"}],\"name\":\"setUint256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b_l\",\"type\":\"bool[]\"}],\"name\":\"setBoolList\",\"outputs\":[{\"name\":\"\",\"type\":\"bool[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs_a\",\"type\":\"bytes[2]\"}],\"name\":\"setBytesArray\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a_l\",\"type\":\"address[]\"}],\"name\":\"setAddressList\",\"outputs\":[{\"name\":\"\",\"type\":\"address[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256_a\",\"type\":\"int256[2]\"}],\"name\":\"setInt256Array\",\"outputs\":[{\"name\":\"\",\"type\":\"int256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_a\",\"type\":\"string[2]\"}],\"name\":\"setStringArray\",\"outputs\":[{\"name\":\"\",\"type\":\"string[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s\",\"type\":\"string\"}],\"name\":\"setString\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u64\",\"type\":\"uint64\"}],\"name\":\"setUint64\",\"outputs\":[{\"name\":\"\",\"type\":\"uint64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i16\",\"type\":\"int16\"}],\"name\":\"setInt16\",\"outputs\":[{\"name\":\"\",\"type\":\"int16\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i8\",\"type\":\"int8\"}],\"name\":\"setInt8\",\"outputs\":[{\"name\":\"\",\"type\":\"int8\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256_l\",\"type\":\"uint256[]\"}],\"name\":\"setUint256List\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i256\",\"type\":\"int256\"}],\"name\":\"setInt256\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i32\",\"type\":\"int32\"}],\"name\":\"setInt32\",\"outputs\":[{\"name\":\"\",\"type\":\"int32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b32\",\"type\":\"bytes32\"}],\"name\":\"setBytes32\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"s_l\",\"type\":\"string[]\"}],\"name\":\"setStringList\",\"outputs\":[{\"name\":\"\",\"type\":\"string[]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"u256\",\"type\":\"uint256\"}],\"name\":\"setUint256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bs\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"a\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i64\",\"type\":\"int64\"}],\"name\":\"setInt64\",\"outputs\":[{\"name\":\"\",\"type\":\"int64\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b1\",\"type\":\"bytes1\"}],\"name\":\"setBytes1\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes1\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]";
  2216  	
  2217  	// BYTECODE is the compiled bytecode used for deploying new contracts.
  2218  	public final static String BYTECODE = "0x608060405234801561001057600080fd5b5061265a806100206000396000f3fe608060405234801561001057600080fd5b50600436106101e1576000357c0100000000000000000000000000000000000000000000000000000000900480637fcaf66611610116578063c2b12a73116100b4578063da359dc81161008e578063da359dc814610666578063e30081a014610696578063e673eb32146106c6578063fba1a1c3146106f6576101e1565b8063c2b12a73146105d6578063c577796114610606578063d2282dc514610636576101e1565b80639a19a953116100f05780639a19a95314610516578063a0709e1914610546578063a53b1c1e14610576578063b7d5df31146105a6576101e1565b80637fcaf66614610486578063822cba69146104b657806386114cea146104e6576101e1565b806322722302116101835780635119655d1161015d5780635119655d146103c65780635be6b37e146103f65780636aa482fc146104265780637173b69514610456576101e1565b806322722302146103365780632766a755146103665780634d5ee6da14610396576101e1565b806316c105e2116101bf57806316c105e2146102765780631774e646146102a65780631c9352e2146102d65780631e26fd3314610306576101e1565b80630477988a146101e6578063118a971814610216578063151f547114610246575b600080fd5b61020060048036036101fb9190810190611599565b610726565b60405161020d9190611f01565b60405180910390f35b610230600480360361022b919081019061118d565b61072d565b60405161023d9190611ca6565b60405180910390f35b610260600480360361025b9190810190611123565b61073a565b60405161026d9190611c69565b60405180910390f35b610290600480360361028b9190810190611238565b610747565b60405161029d9190611d05565b60405180910390f35b6102c060048036036102bb919081019061163d565b61074e565b6040516102cd9190611f6d565b60405180910390f35b6102f060048036036102eb91908101906115eb565b610755565b6040516102fd9190611f37565b60405180910390f35b610320600480360361031b91908101906113cf565b61075c565b60405161032d9190611de5565b60405180910390f35b610350600480360361034b91908101906112a2565b610763565b60405161035d9190611d42565b60405180910390f35b610380600480360361037b9190810190611365565b61076a565b60405161038d9190611da8565b60405180910390f35b6103b060048036036103ab91908101906111b6565b610777565b6040516103bd9190611cc1565b60405180910390f35b6103e060048036036103db91908101906111f7565b61077e565b6040516103ed9190611ce3565b60405180910390f35b610410600480360361040b919081019061114c565b61078b565b60405161041d9190611c84565b60405180910390f35b610440600480360361043b9190810190611279565b610792565b60405161044d9190611d27565b60405180910390f35b610470600480360361046b91908101906112e3565b61079f565b60405161047d9190611d64565b60405180910390f35b6104a0600480360361049b9190810190611558565b6107ac565b6040516104ad9190611edf565b60405180910390f35b6104d060048036036104cb9190810190611614565b6107b3565b6040516104dd9190611f52565b60405180910390f35b61050060048036036104fb919081019061148b565b6107ba565b60405161050d9190611e58565b60405180910390f35b610530600480360361052b919081019061152f565b6107c1565b60405161053d9190611ec4565b60405180910390f35b610560600480360361055b919081019061138e565b6107c8565b60405161056d9190611dc3565b60405180910390f35b610590600480360361058b91908101906114b4565b6107cf565b60405161059d9190611e73565b60405180910390f35b6105c060048036036105bb91908101906114dd565b6107d6565b6040516105cd9190611e8e565b60405180910390f35b6105f060048036036105eb9190810190611421565b6107dd565b6040516105fd9190611e1b565b60405180910390f35b610620600480360361061b9190810190611324565b6107e4565b60405161062d9190611d86565b60405180910390f35b610650600480360361064b91908101906115c2565b6107eb565b60405161065d9190611f1c565b60405180910390f35b610680600480360361067b919081019061144a565b6107f2565b60405161068d9190611e36565b60405180910390f35b6106b060048036036106ab91908101906110fa565b6107f9565b6040516106bd9190611c4e565b60405180910390f35b6106e060048036036106db9190810190611506565b610800565b6040516106ed9190611ea9565b60405180910390f35b610710600480360361070b91908101906113f8565b610807565b60405161071d9190611e00565b60405180910390f35b6000919050565b61073561080e565b919050565b610742610830565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b610772610852565b919050565b6060919050565b610786610874565b919050565b6060919050565b61079a61089b565b919050565b6107a76108bd565b919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6060919050565b6000919050565b6060919050565b6000919050565b6000919050565b6000919050565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108835790505090565b6040805190810160405280600290602082028038833980820191505090505090565b60408051908101604052806002905b60608152602001906001900390816108cc5790505090565b60006108f082356124f2565b905092915050565b600082601f830112151561090b57600080fd5b600261091e61091982611fb5565b611f88565b9150818385602084028201111561093457600080fd5b60005b83811015610964578161094a88826108e4565b845260208401935060208301925050600181019050610937565b5050505092915050565b600082601f830112151561098157600080fd5b813561099461098f82611fd7565b611f88565b915081818352602084019350602081019050838560208402820111156109b957600080fd5b60005b838110156109e957816109cf88826108e4565b8452602084019350602083019250506001810190506109bc565b5050505092915050565b600082601f8301121515610a0657600080fd5b6002610a19610a1482611fff565b611f88565b91508183856020840282011115610a2f57600080fd5b60005b83811015610a5f5781610a458882610e9e565b845260208401935060208301925050600181019050610a32565b5050505092915050565b600082601f8301121515610a7c57600080fd5b8135610a8f610a8a82612021565b611f88565b91508181835260208401935060208101905083856020840282011115610ab457600080fd5b60005b83811015610ae45781610aca8882610e9e565b845260208401935060208301925050600181019050610ab7565b5050505092915050565b600082601f8301121515610b0157600080fd5b6002610b14610b0f82612049565b611f88565b9150818360005b83811015610b4b5781358601610b318882610eda565b845260208401935060208301925050600181019050610b1b565b5050505092915050565b600082601f8301121515610b6857600080fd5b8135610b7b610b768261206b565b611f88565b9150818183526020840193506020810190508360005b83811015610bc15781358601610ba78882610eda565b845260208401935060208301925050600181019050610b91565b5050505092915050565b600082601f8301121515610bde57600080fd5b6002610bf1610bec82612093565b611f88565b91508183856020840282011115610c0757600080fd5b60005b83811015610c375781610c1d8882610f9a565b845260208401935060208301925050600181019050610c0a565b5050505092915050565b600082601f8301121515610c5457600080fd5b8135610c67610c62826120b5565b611f88565b91508181835260208401935060208101905083856020840282011115610c8c57600080fd5b60005b83811015610cbc5781610ca28882610f9a565b845260208401935060208301925050600181019050610c8f565b5050505092915050565b600082601f8301121515610cd957600080fd5b6002610cec610ce7826120dd565b611f88565b9150818360005b83811015610d235781358601610d098882610fea565b845260208401935060208301925050600181019050610cf3565b5050505092915050565b600082601f8301121515610d4057600080fd5b8135610d53610d4e826120ff565b611f88565b9150818183526020840193506020810190508360005b83811015610d995781358601610d7f8882610fea565b845260208401935060208301925050600181019050610d69565b5050505092915050565b600082601f8301121515610db657600080fd5b6002610dc9610dc482612127565b611f88565b91508183856020840282011115610ddf57600080fd5b60005b83811015610e0f5781610df588826110aa565b845260208401935060208301925050600181019050610de2565b5050505092915050565b600082601f8301121515610e2c57600080fd5b8135610e3f610e3a82612149565b611f88565b91508181835260208401935060208101905083856020840282011115610e6457600080fd5b60005b83811015610e945781610e7a88826110aa565b845260208401935060208301925050600181019050610e67565b5050505092915050565b6000610eaa8235612504565b905092915050565b6000610ebe8235612510565b905092915050565b6000610ed2823561253c565b905092915050565b600082601f8301121515610eed57600080fd5b8135610f00610efb82612171565b611f88565b91508082526020830160208301858383011115610f1c57600080fd5b610f278382846125cd565b50505092915050565b600082601f8301121515610f4357600080fd5b8135610f56610f518261219d565b611f88565b91508082526020830160208301858383011115610f7257600080fd5b610f7d8382846125cd565b50505092915050565b6000610f928235612546565b905092915050565b6000610fa68235612553565b905092915050565b6000610fba823561255d565b905092915050565b6000610fce823561256a565b905092915050565b6000610fe28235612577565b905092915050565b600082601f8301121515610ffd57600080fd5b813561101061100b826121c9565b611f88565b9150808252602083016020830185838301111561102c57600080fd5b6110378382846125cd565b50505092915050565b600082601f830112151561105357600080fd5b8135611066611061826121f5565b611f88565b9150808252602083016020830185838301111561108257600080fd5b61108d8382846125cd565b50505092915050565b60006110a28235612584565b905092915050565b60006110b68235612592565b905092915050565b60006110ca823561259c565b905092915050565b60006110de82356125ac565b905092915050565b60006110f282356125c0565b905092915050565b60006020828403121561110c57600080fd5b600061111a848285016108e4565b91505092915050565b60006040828403121561113557600080fd5b6000611143848285016108f8565b91505092915050565b60006020828403121561115e57600080fd5b600082013567ffffffffffffffff81111561117857600080fd5b6111848482850161096e565b91505092915050565b60006040828403121561119f57600080fd5b60006111ad848285016109f3565b91505092915050565b6000602082840312156111c857600080fd5b600082013567ffffffffffffffff8111156111e257600080fd5b6111ee84828501610a69565b91505092915050565b60006020828403121561120957600080fd5b600082013567ffffffffffffffff81111561122357600080fd5b61122f84828501610aee565b91505092915050565b60006020828403121561124a57600080fd5b600082013567ffffffffffffffff81111561126457600080fd5b61127084828501610b55565b91505092915050565b60006040828403121561128b57600080fd5b600061129984828501610bcb565b91505092915050565b6000602082840312156112b457600080fd5b600082013567ffffffffffffffff8111156112ce57600080fd5b6112da84828501610c41565b91505092915050565b6000602082840312156112f557600080fd5b600082013567ffffffffffffffff81111561130f57600080fd5b61131b84828501610cc6565b91505092915050565b60006020828403121561133657600080fd5b600082013567ffffffffffffffff81111561135057600080fd5b61135c84828501610d2d565b91505092915050565b60006040828403121561137757600080fd5b600061138584828501610da3565b91505092915050565b6000602082840312156113a057600080fd5b600082013567ffffffffffffffff8111156113ba57600080fd5b6113c684828501610e19565b91505092915050565b6000602082840312156113e157600080fd5b60006113ef84828501610e9e565b91505092915050565b60006020828403121561140a57600080fd5b600061141884828501610eb2565b91505092915050565b60006020828403121561143357600080fd5b600061144184828501610ec6565b91505092915050565b60006020828403121561145c57600080fd5b600082013567ffffffffffffffff81111561147657600080fd5b61148284828501610f30565b91505092915050565b60006020828403121561149d57600080fd5b60006114ab84828501610f86565b91505092915050565b6000602082840312156114c657600080fd5b60006114d484828501610f9a565b91505092915050565b6000602082840312156114ef57600080fd5b60006114fd84828501610fae565b91505092915050565b60006020828403121561151857600080fd5b600061152684828501610fc2565b91505092915050565b60006020828403121561154157600080fd5b600061154f84828501610fd6565b91505092915050565b60006020828403121561156a57600080fd5b600082013567ffffffffffffffff81111561158457600080fd5b61159084828501611040565b91505092915050565b6000602082840312156115ab57600080fd5b60006115b984828501611096565b91505092915050565b6000602082840312156115d457600080fd5b60006115e2848285016110aa565b91505092915050565b6000602082840312156115fd57600080fd5b600061160b848285016110be565b91505092915050565b60006020828403121561162657600080fd5b6000611634848285016110d2565b91505092915050565b60006020828403121561164f57600080fd5b600061165d848285016110e6565b91505092915050565b61166f816123f7565b82525050565b61167e816122ab565b61168782612221565b60005b828110156116b95761169d858351611666565b6116a68261235b565b915060208501945060018101905061168a565b5050505050565b60006116cb826122b6565b8084526020840193506116dd8361222b565b60005b8281101561170f576116f3868351611666565b6116fc82612368565b91506020860195506001810190506116e0565b50849250505092915050565b611724816122c1565b61172d82612238565b60005b8281101561175f57611743858351611ab3565b61174c82612375565b9150602085019450600181019050611730565b5050505050565b6000611771826122cc565b80845260208401935061178383612242565b60005b828110156117b557611799868351611ab3565b6117a282612382565b9150602086019550600181019050611786565b50849250505092915050565b60006117cc826122d7565b836020820285016117dc8561224f565b60005b848110156118155783830388526117f7838351611b16565b92506118028261238f565b91506020880197506001810190506117df565b508196508694505050505092915050565b6000611831826122e2565b8084526020840193508360208202850161184a85612259565b60005b84811015611883578383038852611865838351611b16565b92506118708261239c565b915060208801975060018101905061184d565b508196508694505050505092915050565b61189d816122ed565b6118a682612266565b60005b828110156118d8576118bc858351611b5b565b6118c5826123a9565b91506020850194506001810190506118a9565b5050505050565b60006118ea826122f8565b8084526020840193506118fc83612270565b60005b8281101561192e57611912868351611b5b565b61191b826123b6565b91506020860195506001810190506118ff565b50849250505092915050565b600061194582612303565b836020820285016119558561227d565b60005b8481101561198e578383038852611970838351611bcd565b925061197b826123c3565b9150602088019750600181019050611958565b508196508694505050505092915050565b60006119aa8261230e565b808452602084019350836020820285016119c385612287565b60005b848110156119fc5783830388526119de838351611bcd565b92506119e9826123d0565b91506020880197506001810190506119c6565b508196508694505050505092915050565b611a1681612319565b611a1f82612294565b60005b82811015611a5157611a35858351611c12565b611a3e826123dd565b9150602085019450600181019050611a22565b5050505050565b6000611a6382612324565b808452602084019350611a758361229e565b60005b82811015611aa757611a8b868351611c12565b611a94826123ea565b9150602086019550600181019050611a78565b50849250505092915050565b611abc81612409565b82525050565b611acb81612415565b82525050565b611ada81612441565b82525050565b6000611aeb8261233a565b808452611aff8160208601602086016125dc565b611b088161260f565b602085010191505092915050565b6000611b218261232f565b808452611b358160208601602086016125dc565b611b3e8161260f565b602085010191505092915050565b611b558161244b565b82525050565b611b6481612458565b82525050565b611b7381612462565b82525050565b611b828161246f565b82525050565b611b918161247c565b82525050565b6000611ba282612350565b808452611bb68160208601602086016125dc565b611bbf8161260f565b602085010191505092915050565b6000611bd882612345565b808452611bec8160208601602086016125dc565b611bf58161260f565b602085010191505092915050565b611c0c81612489565b82525050565b611c1b816124b7565b82525050565b611c2a816124c1565b82525050565b611c39816124d1565b82525050565b611c48816124e5565b82525050565b6000602082019050611c636000830184611666565b92915050565b6000604082019050611c7e6000830184611675565b92915050565b60006020820190508181036000830152611c9e81846116c0565b905092915050565b6000604082019050611cbb600083018461171b565b92915050565b60006020820190508181036000830152611cdb8184611766565b905092915050565b60006020820190508181036000830152611cfd81846117c1565b905092915050565b60006020820190508181036000830152611d1f8184611826565b905092915050565b6000604082019050611d3c6000830184611894565b92915050565b60006020820190508181036000830152611d5c81846118df565b905092915050565b60006020820190508181036000830152611d7e818461193a565b905092915050565b60006020820190508181036000830152611da0818461199f565b905092915050565b6000604082019050611dbd6000830184611a0d565b92915050565b60006020820190508181036000830152611ddd8184611a58565b905092915050565b6000602082019050611dfa6000830184611ab3565b92915050565b6000602082019050611e156000830184611ac2565b92915050565b6000602082019050611e306000830184611ad1565b92915050565b60006020820190508181036000830152611e508184611ae0565b905092915050565b6000602082019050611e6d6000830184611b4c565b92915050565b6000602082019050611e886000830184611b5b565b92915050565b6000602082019050611ea36000830184611b6a565b92915050565b6000602082019050611ebe6000830184611b79565b92915050565b6000602082019050611ed96000830184611b88565b92915050565b60006020820190508181036000830152611ef98184611b97565b905092915050565b6000602082019050611f166000830184611c03565b92915050565b6000602082019050611f316000830184611c12565b92915050565b6000602082019050611f4c6000830184611c21565b92915050565b6000602082019050611f676000830184611c30565b92915050565b6000602082019050611f826000830184611c3f565b92915050565b6000604051905081810181811067ffffffffffffffff82111715611fab57600080fd5b8060405250919050565b600067ffffffffffffffff821115611fcc57600080fd5b602082029050919050565b600067ffffffffffffffff821115611fee57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561201657600080fd5b602082029050919050565b600067ffffffffffffffff82111561203857600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561206057600080fd5b602082029050919050565b600067ffffffffffffffff82111561208257600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120aa57600080fd5b602082029050919050565b600067ffffffffffffffff8211156120cc57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156120f457600080fd5b602082029050919050565b600067ffffffffffffffff82111561211657600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561213e57600080fd5b602082029050919050565b600067ffffffffffffffff82111561216057600080fd5b602082029050602081019050919050565b600067ffffffffffffffff82111561218857600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121b457600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156121e057600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561220c57600080fd5b601f19601f8301169050602081019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b6000819050919050565b6000602082019050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600060029050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b6000602082019050919050565b600061240282612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b60006124fd82612497565b9050919050565b60008115159050919050565b60007fff0000000000000000000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b60008160010b9050919050565b6000819050919050565b60008160030b9050919050565b60008160070b9050919050565b60008160000b9050919050565b600061ffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156125fa5780820151818401526020810190506125df565b83811115612609576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a723058206fe37171cf1b10ebd291cfdca61d67e7fc3c208795e999c833c42a14d86cf00d6c6578706572696d656e74616cf50037";
  2219  
  2220  	// deploy deploys a new Ethereum contract, binding an instance of Test to it.
  2221  	public static Test deploy(TransactOpts auth, EthereumClient client) throws Exception {
  2222  		Interfaces args = Geth.newInterfaces(0);
  2223  		String bytecode = BYTECODE;
  2224  		return new Test(Geth.deployContract(auth, ABI, Geth.decodeFromHex(bytecode), client, args));
  2225  	}
  2226  
  2227  	// Internal constructor used by contract deployment.
  2228  	private Test(BoundContract deployment) {
  2229  		this.Address  = deployment.getAddress();
  2230  		this.Deployer = deployment.getDeployer();
  2231  		this.Contract = deployment;
  2232  	}
  2233  	
  2234  	// Ethereum address where this contract is located at.
  2235  	public final Address Address;
  2236  
  2237  	// Ethereum transaction in which this contract was deployed (if known!).
  2238  	public final Transaction Deployer;
  2239  
  2240  	// Contract instance bound to a blockchain address.
  2241  	private final BoundContract Contract;
  2242  
  2243  	// Creates a new instance of Test, bound to a specific deployed contract.
  2244  	public Test(Address address, EthereumClient client) throws Exception {
  2245  		this(Geth.bindContract(address, ABI, client));
  2246  	}
  2247  
  2248  	// setAddress is a paid mutator transaction binding the contract method 0xe30081a0.
  2249  	//
  2250  	// Solidity: function setAddress(address a) returns(address)
  2251  	public Transaction setAddress(TransactOpts opts, Address a) throws Exception {
  2252  		Interfaces args = Geth.newInterfaces(1);
  2253  		Interface arg0 = Geth.newInterface();arg0.setAddress(a);args.set(0,arg0);
  2254  		
  2255  		return this.Contract.transact(opts, "setAddress"	, args);
  2256  	}
  2257  	
  2258  	// setAddressArray is a paid mutator transaction binding the contract method 0x151f5471.
  2259  	//
  2260  	// Solidity: function setAddressArray(address[2] a_a) returns(address[2])
  2261  	public Transaction setAddressArray(TransactOpts opts, Addresses a_a) throws Exception {
  2262  		Interfaces args = Geth.newInterfaces(1);
  2263  		Interface arg0 = Geth.newInterface();arg0.setAddresses(a_a);args.set(0,arg0);
  2264  		
  2265  		return this.Contract.transact(opts, "setAddressArray"	, args);
  2266  	}
  2267  	
  2268  	// setAddressList is a paid mutator transaction binding the contract method 0x5be6b37e.
  2269  	//
  2270  	// Solidity: function setAddressList(address[] a_l) returns(address[])
  2271  	public Transaction setAddressList(TransactOpts opts, Addresses a_l) throws Exception {
  2272  		Interfaces args = Geth.newInterfaces(1);
  2273  		Interface arg0 = Geth.newInterface();arg0.setAddresses(a_l);args.set(0,arg0);
  2274  		
  2275  		return this.Contract.transact(opts, "setAddressList"	, args);
  2276  	}
  2277  	
  2278  	// setBool is a paid mutator transaction binding the contract method 0x1e26fd33.
  2279  	//
  2280  	// Solidity: function setBool(bool b) returns(bool)
  2281  	public Transaction setBool(TransactOpts opts, boolean b) throws Exception {
  2282  		Interfaces args = Geth.newInterfaces(1);
  2283  		Interface arg0 = Geth.newInterface();arg0.setBool(b);args.set(0,arg0);
  2284  		
  2285  		return this.Contract.transact(opts, "setBool"	, args);
  2286  	}
  2287  	
  2288  	// setBoolArray is a paid mutator transaction binding the contract method 0x118a9718.
  2289  	//
  2290  	// Solidity: function setBoolArray(bool[2] b_a) returns(bool[2])
  2291  	public Transaction setBoolArray(TransactOpts opts, Bools b_a) throws Exception {
  2292  		Interfaces args = Geth.newInterfaces(1);
  2293  		Interface arg0 = Geth.newInterface();arg0.setBools(b_a);args.set(0,arg0);
  2294  		
  2295  		return this.Contract.transact(opts, "setBoolArray"	, args);
  2296  	}
  2297  	
  2298  	// setBoolList is a paid mutator transaction binding the contract method 0x4d5ee6da.
  2299  	//
  2300  	// Solidity: function setBoolList(bool[] b_l) returns(bool[])
  2301  	public Transaction setBoolList(TransactOpts opts, Bools b_l) throws Exception {
  2302  		Interfaces args = Geth.newInterfaces(1);
  2303  		Interface arg0 = Geth.newInterface();arg0.setBools(b_l);args.set(0,arg0);
  2304  		
  2305  		return this.Contract.transact(opts, "setBoolList"	, args);
  2306  	}
  2307  	
  2308  	// setBytes is a paid mutator transaction binding the contract method 0xda359dc8.
  2309  	//
  2310  	// Solidity: function setBytes(bytes bs) returns(bytes)
  2311  	public Transaction setBytes(TransactOpts opts, byte[] bs) throws Exception {
  2312  		Interfaces args = Geth.newInterfaces(1);
  2313  		Interface arg0 = Geth.newInterface();arg0.setBinary(bs);args.set(0,arg0);
  2314  		
  2315  		return this.Contract.transact(opts, "setBytes"	, args);
  2316  	}
  2317  	
  2318  	// setBytes1 is a paid mutator transaction binding the contract method 0xfba1a1c3.
  2319  	//
  2320  	// Solidity: function setBytes1(bytes1 b1) returns(bytes1)
  2321  	public Transaction setBytes1(TransactOpts opts, byte[] b1) throws Exception {
  2322  		Interfaces args = Geth.newInterfaces(1);
  2323  		Interface arg0 = Geth.newInterface();arg0.setBinary(b1);args.set(0,arg0);
  2324  		
  2325  		return this.Contract.transact(opts, "setBytes1"	, args);
  2326  	}
  2327  	
  2328  	// setBytes32 is a paid mutator transaction binding the contract method 0xc2b12a73.
  2329  	//
  2330  	// Solidity: function setBytes32(bytes32 b32) returns(bytes32)
  2331  	public Transaction setBytes32(TransactOpts opts, byte[] b32) throws Exception {
  2332  		Interfaces args = Geth.newInterfaces(1);
  2333  		Interface arg0 = Geth.newInterface();arg0.setBinary(b32);args.set(0,arg0);
  2334  		
  2335  		return this.Contract.transact(opts, "setBytes32"	, args);
  2336  	}
  2337  	
  2338  	// setBytesArray is a paid mutator transaction binding the contract method 0x5119655d.
  2339  	//
  2340  	// Solidity: function setBytesArray(bytes[2] bs_a) returns(bytes[2])
  2341  	public Transaction setBytesArray(TransactOpts opts, Binaries bs_a) throws Exception {
  2342  		Interfaces args = Geth.newInterfaces(1);
  2343  		Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_a);args.set(0,arg0);
  2344  		
  2345  		return this.Contract.transact(opts, "setBytesArray"	, args);
  2346  	}
  2347  	
  2348  	// setBytesList is a paid mutator transaction binding the contract method 0x16c105e2.
  2349  	//
  2350  	// Solidity: function setBytesList(bytes[] bs_l) returns(bytes[])
  2351  	public Transaction setBytesList(TransactOpts opts, Binaries bs_l) throws Exception {
  2352  		Interfaces args = Geth.newInterfaces(1);
  2353  		Interface arg0 = Geth.newInterface();arg0.setBinaries(bs_l);args.set(0,arg0);
  2354  		
  2355  		return this.Contract.transact(opts, "setBytesList"	, args);
  2356  	}
  2357  	
  2358  	// setInt16 is a paid mutator transaction binding the contract method 0x86114cea.
  2359  	//
  2360  	// Solidity: function setInt16(int16 i16) returns(int16)
  2361  	public Transaction setInt16(TransactOpts opts, short i16) throws Exception {
  2362  		Interfaces args = Geth.newInterfaces(1);
  2363  		Interface arg0 = Geth.newInterface();arg0.setInt16(i16);args.set(0,arg0);
  2364  		
  2365  		return this.Contract.transact(opts, "setInt16"	, args);
  2366  	}
  2367  	
  2368  	// setInt256 is a paid mutator transaction binding the contract method 0xa53b1c1e.
  2369  	//
  2370  	// Solidity: function setInt256(int256 i256) returns(int256)
  2371  	public Transaction setInt256(TransactOpts opts, BigInt i256) throws Exception {
  2372  		Interfaces args = Geth.newInterfaces(1);
  2373  		Interface arg0 = Geth.newInterface();arg0.setBigInt(i256);args.set(0,arg0);
  2374  		
  2375  		return this.Contract.transact(opts, "setInt256"	, args);
  2376  	}
  2377  	
  2378  	// setInt256Array is a paid mutator transaction binding the contract method 0x6aa482fc.
  2379  	//
  2380  	// Solidity: function setInt256Array(int256[2] i256_a) returns(int256[2])
  2381  	public Transaction setInt256Array(TransactOpts opts, BigInts i256_a) throws Exception {
  2382  		Interfaces args = Geth.newInterfaces(1);
  2383  		Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_a);args.set(0,arg0);
  2384  		
  2385  		return this.Contract.transact(opts, "setInt256Array"	, args);
  2386  	}
  2387  	
  2388  	// setInt256List is a paid mutator transaction binding the contract method 0x22722302.
  2389  	//
  2390  	// Solidity: function setInt256List(int256[] i256_l) returns(int256[])
  2391  	public Transaction setInt256List(TransactOpts opts, BigInts i256_l) throws Exception {
  2392  		Interfaces args = Geth.newInterfaces(1);
  2393  		Interface arg0 = Geth.newInterface();arg0.setBigInts(i256_l);args.set(0,arg0);
  2394  		
  2395  		return this.Contract.transact(opts, "setInt256List"	, args);
  2396  	}
  2397  	
  2398  	// setInt32 is a paid mutator transaction binding the contract method 0xb7d5df31.
  2399  	//
  2400  	// Solidity: function setInt32(int32 i32) returns(int32)
  2401  	public Transaction setInt32(TransactOpts opts, int i32) throws Exception {
  2402  		Interfaces args = Geth.newInterfaces(1);
  2403  		Interface arg0 = Geth.newInterface();arg0.setInt32(i32);args.set(0,arg0);
  2404  		
  2405  		return this.Contract.transact(opts, "setInt32"	, args);
  2406  	}
  2407  	
  2408  	// setInt64 is a paid mutator transaction binding the contract method 0xe673eb32.
  2409  	//
  2410  	// Solidity: function setInt64(int64 i64) returns(int64)
  2411  	public Transaction setInt64(TransactOpts opts, long i64) throws Exception {
  2412  		Interfaces args = Geth.newInterfaces(1);
  2413  		Interface arg0 = Geth.newInterface();arg0.setInt64(i64);args.set(0,arg0);
  2414  		
  2415  		return this.Contract.transact(opts, "setInt64"	, args);
  2416  	}
  2417  	
  2418  	// setInt8 is a paid mutator transaction binding the contract method 0x9a19a953.
  2419  	//
  2420  	// Solidity: function setInt8(int8 i8) returns(int8)
  2421  	public Transaction setInt8(TransactOpts opts, byte i8) throws Exception {
  2422  		Interfaces args = Geth.newInterfaces(1);
  2423  		Interface arg0 = Geth.newInterface();arg0.setInt8(i8);args.set(0,arg0);
  2424  		
  2425  		return this.Contract.transact(opts, "setInt8"	, args);
  2426  	}
  2427  	
  2428  	// setString is a paid mutator transaction binding the contract method 0x7fcaf666.
  2429  	//
  2430  	// Solidity: function setString(string s) returns(string)
  2431  	public Transaction setString(TransactOpts opts, String s) throws Exception {
  2432  		Interfaces args = Geth.newInterfaces(1);
  2433  		Interface arg0 = Geth.newInterface();arg0.setString(s);args.set(0,arg0);
  2434  		
  2435  		return this.Contract.transact(opts, "setString"	, args);
  2436  	}
  2437  	
  2438  	// setStringArray is a paid mutator transaction binding the contract method 0x7173b695.
  2439  	//
  2440  	// Solidity: function setStringArray(string[2] s_a) returns(string[2])
  2441  	public Transaction setStringArray(TransactOpts opts, Strings s_a) throws Exception {
  2442  		Interfaces args = Geth.newInterfaces(1);
  2443  		Interface arg0 = Geth.newInterface();arg0.setStrings(s_a);args.set(0,arg0);
  2444  		
  2445  		return this.Contract.transact(opts, "setStringArray"	, args);
  2446  	}
  2447  	
  2448  	// setStringList is a paid mutator transaction binding the contract method 0xc5777961.
  2449  	//
  2450  	// Solidity: function setStringList(string[] s_l) returns(string[])
  2451  	public Transaction setStringList(TransactOpts opts, Strings s_l) throws Exception {
  2452  		Interfaces args = Geth.newInterfaces(1);
  2453  		Interface arg0 = Geth.newInterface();arg0.setStrings(s_l);args.set(0,arg0);
  2454  		
  2455  		return this.Contract.transact(opts, "setStringList"	, args);
  2456  	}
  2457  	
  2458  	// setUint16 is a paid mutator transaction binding the contract method 0x0477988a.
  2459  	//
  2460  	// Solidity: function setUint16(uint16 u16) returns(uint16)
  2461  	public Transaction setUint16(TransactOpts opts, BigInt u16) throws Exception {
  2462  		Interfaces args = Geth.newInterfaces(1);
  2463  		Interface arg0 = Geth.newInterface();arg0.setUint16(u16);args.set(0,arg0);
  2464  		
  2465  		return this.Contract.transact(opts, "setUint16"	, args);
  2466  	}
  2467  	
  2468  	// setUint256 is a paid mutator transaction binding the contract method 0xd2282dc5.
  2469  	//
  2470  	// Solidity: function setUint256(uint256 u256) returns(uint256)
  2471  	public Transaction setUint256(TransactOpts opts, BigInt u256) throws Exception {
  2472  		Interfaces args = Geth.newInterfaces(1);
  2473  		Interface arg0 = Geth.newInterface();arg0.setBigInt(u256);args.set(0,arg0);
  2474  		
  2475  		return this.Contract.transact(opts, "setUint256"	, args);
  2476  	}
  2477  	
  2478  	// setUint256Array is a paid mutator transaction binding the contract method 0x2766a755.
  2479  	//
  2480  	// Solidity: function setUint256Array(uint256[2] u256_a) returns(uint256[2])
  2481  	public Transaction setUint256Array(TransactOpts opts, BigInts u256_a) throws Exception {
  2482  		Interfaces args = Geth.newInterfaces(1);
  2483  		Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_a);args.set(0,arg0);
  2484  		
  2485  		return this.Contract.transact(opts, "setUint256Array"	, args);
  2486  	}
  2487  	
  2488  	// setUint256List is a paid mutator transaction binding the contract method 0xa0709e19.
  2489  	//
  2490  	// Solidity: function setUint256List(uint256[] u256_l) returns(uint256[])
  2491  	public Transaction setUint256List(TransactOpts opts, BigInts u256_l) throws Exception {
  2492  		Interfaces args = Geth.newInterfaces(1);
  2493  		Interface arg0 = Geth.newInterface();arg0.setBigInts(u256_l);args.set(0,arg0);
  2494  		
  2495  		return this.Contract.transact(opts, "setUint256List"	, args);
  2496  	}
  2497  	
  2498  	// setUint32 is a paid mutator transaction binding the contract method 0x1c9352e2.
  2499  	//
  2500  	// Solidity: function setUint32(uint32 u32) returns(uint32)
  2501  	public Transaction setUint32(TransactOpts opts, BigInt u32) throws Exception {
  2502  		Interfaces args = Geth.newInterfaces(1);
  2503  		Interface arg0 = Geth.newInterface();arg0.setUint32(u32);args.set(0,arg0);
  2504  		
  2505  		return this.Contract.transact(opts, "setUint32"	, args);
  2506  	}
  2507  	
  2508  	// setUint64 is a paid mutator transaction binding the contract method 0x822cba69.
  2509  	//
  2510  	// Solidity: function setUint64(uint64 u64) returns(uint64)
  2511  	public Transaction setUint64(TransactOpts opts, BigInt u64) throws Exception {
  2512  		Interfaces args = Geth.newInterfaces(1);
  2513  		Interface arg0 = Geth.newInterface();arg0.setUint64(u64);args.set(0,arg0);
  2514  		
  2515  		return this.Contract.transact(opts, "setUint64"	, args);
  2516  	}
  2517  	
  2518  	// setUint8 is a paid mutator transaction binding the contract method 0x1774e646.
  2519  	//
  2520  	// Solidity: function setUint8(uint8 u8) returns(uint8)
  2521  	public Transaction setUint8(TransactOpts opts, BigInt u8) throws Exception {
  2522  		Interfaces args = Geth.newInterfaces(1);
  2523  		Interface arg0 = Geth.newInterface();arg0.setUint8(u8);args.set(0,arg0);
  2524  		
  2525  		return this.Contract.transact(opts, "setUint8"	, args);
  2526  	}
  2527  }
  2528  `,
  2529  		},
  2530  	}
  2531  	for i, c := range cases {
  2532  		binding, err := Bind([]string{c.name}, []string{c.abi}, []string{c.bytecode}, nil, "bindtest", LangJava, nil, nil, false)
  2533  		if err != nil {
  2534  			t.Fatalf("test %d: failed to generate binding: %v", i, err)
  2535  		}
  2536  		// Remove empty lines
  2537  		removeEmptys := func(input string) string {
  2538  			lines := strings.Split(input, "\n")
  2539  			var index int
  2540  			for _, line := range lines {
  2541  				if strings.TrimSpace(line) != "" {
  2542  					lines[index] = line
  2543  					index += 1
  2544  				}
  2545  			}
  2546  			lines = lines[:index]
  2547  			return strings.Join(lines, "\n")
  2548  		}
  2549  		binding = removeEmptys(binding)
  2550  		expect := removeEmptys(c.expected)
  2551  		if binding != expect {
  2552  			t.Fatalf("test %d: generated binding mismatch, has %s, want %s", i, binding, c.expected)
  2553  		}
  2554  	}
  2555  }