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