github.com/theQRL/go-zond@v0.1.1/accounts/abi/bind/bind_test.go (about)

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