// Code generated - DO NOT EDIT.
// This file is a generated binding and any manual changes will be lost.

package testapp

import (
	"math/big"
	"strings"

	ethereum "github.com/ethereum/go-ethereum"
	"github.com/ethereum/go-ethereum/accounts/abi"
	"github.com/ethereum/go-ethereum/accounts/abi/bind"
	"github.com/ethereum/go-ethereum/common"
	"github.com/ethereum/go-ethereum/core/types"
	"github.com/ethereum/go-ethereum/event"
)

// Reference imports to suppress errors if they are not otherwise used.
var (
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
)

// SimpleMultiSessionAppWithOracleABI is the input ABI used to generate the binding from.
const SimpleMultiSessionAppWithOracleABI = "[{\"constant\":false,\"inputs\":[{\"name\":\"_oracleProof\",\"type\":\"bytes\"}],\"name\":\"settleBySigTimeout\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_nonce\",\"type\":\"uint256\"},{\"name\":\"_signers\",\"type\":\"address[]\"}],\"name\":\"getSessionID\",\"outputs\":[{\"name\":\"session\",\"type\":\"bytes32\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_session\",\"type\":\"bytes32\"}],\"name\":\"getStatus\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracleProof\",\"type\":\"bytes\"},{\"name\":\"_cosignedStateProof\",\"type\":\"bytes\"}],\"name\":\"settleByInvalidTurn\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_query\",\"type\":\"bytes\"}],\"name\":\"isFinalized\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracleProof\",\"type\":\"bytes\"}],\"name\":\"settleByMoveTimeout\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"_oracleProof\",\"type\":\"bytes\"},{\"name\":\"_cosignedStateProof\",\"type\":\"bytes\"}],\"name\":\"settleByInvalidState\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"_sigTimeout\",\"type\":\"uint256\"},{\"name\":\"_moveTimeout\",\"type\":\"uint256\"},{\"name\":\"_playerNum\",\"type\":\"uint256\"},{\"name\":\"_oracle\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"session\",\"type\":\"bytes32\"}],\"name\":\"SigTimeoutDispute\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"session\",\"type\":\"bytes32\"}],\"name\":\"MoveTimeoutDispute\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"session\",\"type\":\"bytes32\"}],\"name\":\"InvalidTurnDispute\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"session\",\"type\":\"bytes32\"}],\"name\":\"InvalidStateDispute\",\"type\":\"event\"},{\"constant\":true,\"inputs\":[{\"name\":\"_query\",\"type\":\"bytes\"}],\"name\":\"getOutcome\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"_session\",\"type\":\"bytes32\"},{\"name\":\"_key\",\"type\":\"uint256\"}],\"name\":\"getState\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"}]"

// SimpleMultiSessionAppWithOracleBin is the compiled bytecode used for deploying new contracts.
var SimpleMultiSessionAppWithOracleBin = "0x608060405234801561001057600080fd5b506040516080806129848339810180604052608081101561003057600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050508383838383838383836000800181905550826000600101819055508160006002018190555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505050505050505050506128a4806100e06000396000f3fe608060405234801561001057600080fd5b50600436106100935760003560e01c8063a428cd3b11610066578063a428cd3b146102e8578063bcdbda94146103b6578063ea4ba8eb14610447578063f26285b2146104d8578063fb3fe8061461055157610093565b80632141dbda1461009857806329dd2f8e146101115780634d8bedec146101c25780635de28ae014610298575b600080fd5b61010f600480360360208110156100ae57600080fd5b81019080803590602001906401000000008111156100cb57600080fd5b8201836020820111156100dd57600080fd5b803590602001918460018302840111640100000000831117156100ff57600080fd5b909192939192939050505061061f565b005b6101476004803603604081101561012757600080fd5b81019080803590602001909291908035906020019092919050505061086a565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561018757808201518184015260208101905061016c565b50505050905090810190601f1680156101b45780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b610282600480360360408110156101d857600080fd5b8101908080359060200190929190803590602001906401000000008111156101ff57600080fd5b82018360208201111561021157600080fd5b8035906020019184602083028401116401000000008311171561023357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f8201169050808301925050505050505091929192905050506108dd565b6040518082815260200191505060405180910390f35b6102c4600480360360208110156102ae57600080fd5b8101908080359060200190929190505050610982565b604051808260018111156102d457fe5b60ff16815260200191505060405180910390f35b6103b4600480360360408110156102fe57600080fd5b810190808035906020019064010000000081111561031b57600080fd5b82018360208201111561032d57600080fd5b8035906020019184600183028401116401000000008311171561034f57600080fd5b90919293919293908035906020019064010000000081111561037057600080fd5b82018360208201111561038257600080fd5b803590602001918460018302840111640100000000831117156103a457600080fd5b90919293919293905050506109af565b005b61042d600480360360208110156103cc57600080fd5b81019080803590602001906401000000008111156103e957600080fd5b8201836020820111156103fb57600080fd5b8035906020019184600183028401116401000000008311171561041d57600080fd5b9091929391929390505050610c3f565b604051808215151515815260200191505060405180910390f35b6104be6004803603602081101561045d57600080fd5b810190808035906020019064010000000081111561047a57600080fd5b82018360208201111561048c57600080fd5b803590602001918460018302840111640100000000831117156104ae57600080fd5b9091929391929390505050610cd6565b604051808215151515815260200191505060405180910390f35b61054f600480360360208110156104ee57600080fd5b810190808035906020019064010000000081111561050b57600080fd5b82018360208201111561051d57600080fd5b8035906020019184600183028401116401000000008311171561053f57600080fd5b9091929391929390505050610d4a565b005b61061d6004803603604081101561056757600080fd5b810190808035906020019064010000000081111561058457600080fd5b82018360208201111561059657600080fd5b803590602001918460018302840111640100000000831117156105b857600080fd5b9091929391929390803590602001906401000000008111156105d957600080fd5b8201836020820111156105eb57600080fd5b8035906020019184600183028401116401000000008311171561060d57600080fd5b9091929391929390505050610f45565b005b610627612616565b61067483838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506111b8565b905080606001516000800154826040015101106106dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602781526020018061280f6027913960400191505060405180910390fd5b6106e461265b565b60606106f583600001516001611341565b91509150600060020154815110610757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806127e4602b913960400191505060405180910390fd5b600061076b836000015185608001516108dd565b905060018081111561077957fe5b6004600083815260200190815260200160002060000160009054906101000a900460ff1660018111156107a857fe5b141561081c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f73657373696f6e2073746174652069732066696e616c697a656400000000000081525060200191505060405180910390fd5b61082b81846040015184611392565b7f84b2b939adef644951dc4dc6318dc4fbe66768898728a435c356a3296947e510816040518082815260200191505060405180910390a1505050505050565b60608060206040519080825280601f01601f1916602001820160405280156108a15781602001600182028038833980820191505090505b50905060006005600086815260200190815260200160002060000160009054906101000a900460ff169050806020830152819250505092915050565b600082826040516020018083815260200180602001828103825283818151815260200191508051906020019060200280838360005b8381101561092d578082015181840152602081019050610912565b5050505090500193505050506040516020818303038152906040528051906020012090508160046000838152602001908152602001600020600101908051906020019061097b929190612683565b5092915050565b60006004600083815260200190815260200160002060000160009054906101000a900460ff169050919050565b6109b7612616565b610a0485858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506111b8565b9050610a0e61265b565b6060610a5f85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001611341565b91509150610a7183608001518261141e565b6000610a808360400151611561565b9050836020015173ffffffffffffffffffffffffffffffffffffffff1684608001518260ff1681518110610ab057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff161415610b25576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806128366021913960400191505060405180910390fd5b6000610b39846000015186608001516108dd565b9050600180811115610b4757fe5b6004600083815260200190815260200160002060000160009054906101000a900460ff166001811115610b7657fe5b1415610bea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f73657373696f6e2073746174652069732066696e616c697a656400000000000081525060200191505060405180910390fd5b610bfd8185604001518760200151611585565b7f632769e06437be0bc831706f701d0f55babe48cb2f48113134e4103bd5830afd816040518082815260200191505060405180910390a1505050505050505050565b600080610c8f84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611611565b9050600180811115610c9d57fe5b6004600083815260200190815260200160002060000160009054906101000a900460ff166001811115610ccc57fe5b1491505092915050565b6000610ce061270d565b610d2d84848080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505061162d565b9050610d41816000015182602001516116e1565b91505092915050565b610d52612616565b610d9f83838080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506111b8565b9050806060015160006001015482604001510110610e08576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260288152602001806127bc6028913960400191505060405180910390fd5b610e1061265b565b6060610e2183600001516001611341565b91509150610e3383608001518261141e565b6000610e47836000015185608001516108dd565b9050600180811115610e5557fe5b6004600083815260200190815260200160002060000160009054906101000a900460ff166001811115610e8457fe5b1415610ef8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f73657373696f6e2073746174652069732066696e616c697a656400000000000081525060200191505060405180910390fd5b610f068184604001516117a8565b7f36a857ab2f7719bef9c1d8246bf7211e3b4ec09468b88347325456d5bec1ce3a816040518082815260200191505060405180910390a1505050505050565b610f4d612616565b610f9a85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506111b8565b9050610fa461265b565b610fb382600001516000611341565b509050610fbe61265b565b606061100f86868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050506001611341565b9150915061102184608001518261141e565b61102b8284611833565b1561109e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f6f7261636c65206170707374617465206d75737420626520696e76616c69640081525060200191505060405180910390fd5b60006110b2836000015186608001516108dd565b90506001808111156110c057fe5b6004600083815260200190815260200160002060000160009054906101000a900460ff1660018111156110ef57fe5b1415611163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f73657373696f6e2073746174652069732066696e616c697a656400000000000081525060200191505060405180910390fd5b6111768184604001518760200151611877565b7f1ee6c3823014f5e366ff312d2cf02769f8c7767be5f8c4fc3bcfaa9eb1517d81816040518082815260200191505060405180910390a1505050505050505050565b6111c0612616565b6111c861272a565b6111d183611903565b9050600061125382600001516040516020018082805190602001908083835b6020831061121357805182526020820191506020810190506020830392506111f0565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206119ae565b90506000611265828460200151611a06565b9050600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461132a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f7369676e6572206d757374206265206f7261636c65000000000000000000000081525060200191505060405180910390fd5b6113378360000151611ae6565b9350505050919050565b61134961265b565b6060611353612744565b61135c85611d28565b905061136b8160000151611e9f565b9250831561138a57611387836040015182602001516000611f8d565b91505b509250929050565b600060046000858152602001908152602001600020905060018160000160006101000a81548160ff021916908360018111156113ca57fe5b0217905550826001815181106113dc57fe5b602001015160f81c60f81b60f81c6005600086815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555050505050565b8151815114611495576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f696e76616c6964206e756d626572206f66207369676e6572730000000000000081525060200191505060405180910390fd5b60008090505b825181101561155c578181815181106114b057fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff168382815181106114da57fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561154f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806128576022913960400191505060405180910390fd5b808060010191505061149b565b505050565b60008160008151811061157057fe5b602001015160f81c60f81b60f81c9050919050565b600060046000858152602001908152602001600020905060018160000160006101000a81548160ff021916908360018111156115bd57fe5b0217905550826001815181106115cf57fe5b602001015160f81c60f81b60f81c6005600086815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555050505050565b6000602082511461162157600080fd5b60208201519050919050565b61163561270d565b61163d61275e565b611646836121a4565b90506000805b611655836121d3565b156116d957611663836121e8565b8092508193505050600015611677576116d4565b600182141561169f5761169161168c8461221c565b611611565b8460000181815250506116d3565b60028214156116be576116b18361221c565b84602001819052506116d2565b6116d181846122d590919063ffffffff16565b5b5b5b61164c565b505050919050565b6000600182511461175a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f696e76616c6964207175657279206c656e67746800000000000000000000000081525060200191505060405180910390fd5b8160008151811061176757fe5b602001015160f81c60f81b60f81c60ff166005600085815260200190815260200160002060000160009054906101000a900460ff1660ff1614905092915050565b600060046000848152602001908152602001600020905060018160000160006101000a81548160ff021916908360018111156117e057fe5b0217905550816001815181106117f257fe5b602001015160f81c60f81b60f81c6005600085815260200190815260200160002060000160006101000a81548160ff021916908360ff160217905550505050565b6000816020015183602001511061184d5760009050611871565b61185f83604001518360400151612365565b61186c5760009050611871565b600190505b92915050565b600060046000858152602001908152602001600020905060018160000160006101000a81548160ff021916908360018111156118af57fe5b0217905550826001815181106118c157fe5b602001015160f81c60f81b60f81c6005600086815260200190815260200160002060000160006101000a81548160ff021916908360ff16021790555050505050565b61190b61272a565b61191361275e565b61191c836121a4565b90506000805b61192b836121d3565b156119a657611939836121e8565b809250819350505060001561194d576119a1565b600182141561196c5761195f8361221c565b84600001819052506119a0565b600282141561198b5761197e8361221c565b846020018190525061199f565b61199e81846122d590919063ffffffff16565b5b5b5b611922565b505050919050565b60008160405160200180807f19457468657265756d205369676e6564204d6573736167653a0a333200000000815250601c01828152602001915050604051602081830303815290604052805190602001209050919050565b60006041825114611a1a5760009050611ae0565b60008060006020850151925060408501519150606085015160001a9050601b8160ff161015611a4a57601b810190505b601b8160ff1614158015611a625750601c8160ff1614155b15611a735760009350505050611ae0565b60018682858560405160008152602001604052604051808581526020018460ff1660ff1681526020018381526020018281526020019450505050506020604051602081039080840390855afa158015611ad0573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b611aee612616565b611af661275e565b611aff836121a4565b90506060611b176005836124ae90919063ffffffff16565b905080600581518110611b2657fe5b6020026020010151604051908082528060200260200182016040528015611b5c5781602001602082028038833980820191505090505b508360800181905250600081600581518110611b7457fe5b6020026020010181815250506000805b611b8d846121d3565b15611d1f57611b9b846121e8565b8092508193505050600015611baf57611d1a565b6001821415611bce57611bc18461221c565b8560000181905250611d19565b6002821415611c2457611be8611be38561221c565b612553565b856020019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050611d18565b6003821415611c4457611c3684612565565b856040018181525050611d17565b6004821415611c6457611c5684612565565b856060018181525050611d16565b6005821415611d0157611c7e611c798561221c565b612553565b856080015184600581518110611c9057fe5b602002602001015181518110611ca257fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505082600581518110611ce957fe5b60200260200101805180919060010181525050611d15565b611d1481856122d590919063ffffffff16565b5b5b5b5b5b5b611b84565b50505050919050565b611d30612744565b611d3861275e565b611d41836121a4565b90506060611d596002836124ae90919063ffffffff16565b905080600281518110611d6857fe5b6020026020010151604051908082528060200260200182016040528015611da357816020015b6060815260200190600190039081611d8e5790505b508360200181905250600081600281518110611dbb57fe5b6020026020010181815250506000805b611dd4846121d3565b15611e9657611de2846121e8565b8092508193505050600015611df657611e91565b6001821415611e1557611e088461221c565b8560000181905250611e90565b6002821415611e7b57611e278461221c565b856020015184600281518110611e3957fe5b602002602001015181518110611e4b57fe5b602002602001018190525082600281518110611e6357fe5b60200260200101805180919060010181525050611e8f565b611e8e81856122d590919063ffffffff16565b5b5b5b611dcb565b50505050919050565b611ea761265b565b611eaf61275e565b611eb8836121a4565b90506000805b611ec7836121d3565b15611f8557611ed5836121e8565b8092508193505050600015611ee957611f80565b6001821415611f0957611efb83612565565b846000018181525050611f7f565b6002821415611f2957611f1b83612565565b846020018181525050611f7e565b6003821415611f4857611f3b8361221c565b8460400181905250611f7d565b6004821415611f6857611f5a83612565565b846060018181525050611f7c565b611f7b81846122d590919063ffffffff16565b5b5b5b5b5b611ebe565b505050919050565b6060808351604051908082528060200260200182016040528015611fc05781602001602082028038833980820191505090505b509050600061203f866040516020018082805190602001908083835b60208310611fff5780518252602082019150602081019050602083039250611fdc565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051602081830303815290604052805190602001206119ae565b9050600080905060008090505b8651811015612196576120728388838151811061206557fe5b6020026020010151611a06565b84828151811061207e57fe5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250508515612189578173ffffffffffffffffffffffffffffffffffffffff168482815181106120e157fe5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1611612172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f7369676e657273206e6f7420696e20617363656e64696e67206f72646572000081525060200191505060405180910390fd5b83818151811061217e57fe5b602002602001015191505b808060010191505061204c565b508293505050509392505050565b6121ac61275e565b60018251116121ba57600080fd5b8181602001819052506000816000018181525050919050565b60008160200151518260000151109050919050565b60008060006121f684612565565b90506008818161220257fe5b04925060078116600581111561221457fe5b915050915091565b6060600061222983612565565b9050600081846000015101905083602001515181111561224857600080fd5b816040519080825280601f01601f19166020018201604052801561227b5781602001600182028038833980820191505090505b50925060608460200151905060008086600001519050602086019150806020840101905060008090505b858110156122c05780820151818401526020810190506122a5565b50838760000181815250505050505050919050565b600060058111156122e257fe5b8160058111156122ee57fe5b1415612303576122fd82612565565b50612361565b6002600581111561231057fe5b81600581111561231c57fe5b141561235b57600061232d83612565565b9050808360000181815101915081815250508260200151518360000151111561235557600080fd5b50612360565b600080fd5b5b5050565b600060028351146123de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f696e76616c696420636f7369676e6564207374617465206c656e67746800000081525060200191505060405180910390fd5b60028251146123f057600090506124a8565b60006123fb84611561565b9050600061240884611561565b90508060ff166000600201546001840160ff168161242257fe5b0614612433576000925050506124a8565b60008560018151811061244257fe5b602001015160f81c60f81b60f81c905060008560018151811061246157fe5b602001015160f81c60f81b60f81c905060018260ff161480612486575060028260ff16145b1561249f578060ff168260ff16149450505050506124a8565b60019450505050505b92915050565b6060600083600001519050600183016040519080825280602002602001820160405280156124eb5781602001602082028038833980820191505090505b5091506000805b6124fb866121d3565b1561254057612509866121e8565b8092508193505050600184838151811061251f57fe5b60200260200101818151019150818152505061253b86826122d5565b6124f2565b8286600001818152505050505092915050565b600061255e826125eb565b9050919050565b60008060608360200151905083600001519250826020820101519150600080935060008090505b600a8110156125e05783811a915060078102607f8316901b8517945060006080831614156125d35760018101866000018181510191508181525050849450505050506125e6565b808060010191505061258c565b50600080fd5b919050565b600060148251146125fb57600080fd5b6c010000000000000000000000006020830151049050919050565b6040518060a0016040528060608152602001600073ffffffffffffffffffffffffffffffffffffffff1681526020016000815260200160008152602001606081525090565b6040518060800160405280600081526020016000815260200160608152602001600081525090565b8280548282559060005260206000209081019282156126fc579160200282015b828111156126fb5782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906126a3565b5b5090506127099190612778565b5090565b604051806040016040528060008019168152602001606081525090565b604051806040016040528060608152602001606081525090565b604051806040016040528060608152602001606081525090565b604051806040016040528060008152602001606081525090565b6127b891905b808211156127b457600081816101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555060010161277e565b5090565b9056fe6f7261636c65207374617465206d757374206265206166746572206d6f766520646561646c696e657369676e657273206c656e677468206d75737420626520736d616c6c6572207468616e20706c61796572736f7261636c65207374617465206d7573742062652061667465722073696720646561646c696e656f7261636c652073746174652075736572206d75737420626520696e76616c696473746174652070726f6f66207369676e6572206d75737420626520636f7272656374a165627a7a723058201ab16154d991b9c54c098110451f96315db33346e5465caa26ea9a86c0e147e50029"

// DeploySimpleMultiSessionAppWithOracle deploys a new Ethereum contract, binding an instance of SimpleMultiSessionAppWithOracle to it.
func DeploySimpleMultiSessionAppWithOracle(auth *bind.TransactOpts, backend bind.ContractBackend, _sigTimeout *big.Int, _moveTimeout *big.Int, _playerNum *big.Int, _oracle common.Address) (common.Address, *types.Transaction, *SimpleMultiSessionAppWithOracle, error) {
	parsed, err := abi.JSON(strings.NewReader(SimpleMultiSessionAppWithOracleABI))
	if err != nil {
		return common.Address{}, nil, nil, err
	}

	address, tx, contract, err := bind.DeployContract(auth, parsed, common.FromHex(SimpleMultiSessionAppWithOracleBin), backend, _sigTimeout, _moveTimeout, _playerNum, _oracle)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &SimpleMultiSessionAppWithOracle{SimpleMultiSessionAppWithOracleCaller: SimpleMultiSessionAppWithOracleCaller{contract: contract}, SimpleMultiSessionAppWithOracleTransactor: SimpleMultiSessionAppWithOracleTransactor{contract: contract}, SimpleMultiSessionAppWithOracleFilterer: SimpleMultiSessionAppWithOracleFilterer{contract: contract}}, nil
}

// SimpleMultiSessionAppWithOracle is an auto generated Go binding around an Ethereum contract.
type SimpleMultiSessionAppWithOracle struct {
	SimpleMultiSessionAppWithOracleCaller     // Read-only binding to the contract
	SimpleMultiSessionAppWithOracleTransactor // Write-only binding to the contract
	SimpleMultiSessionAppWithOracleFilterer   // Log filterer for contract events
}

// SimpleMultiSessionAppWithOracleCaller is an auto generated read-only Go binding around an Ethereum contract.
type SimpleMultiSessionAppWithOracleCaller struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// SimpleMultiSessionAppWithOracleTransactor is an auto generated write-only Go binding around an Ethereum contract.
type SimpleMultiSessionAppWithOracleTransactor struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// SimpleMultiSessionAppWithOracleFilterer is an auto generated log filtering Go binding around an Ethereum contract events.
type SimpleMultiSessionAppWithOracleFilterer struct {
	contract *bind.BoundContract // Generic contract wrapper for the low level calls
}

// SimpleMultiSessionAppWithOracleSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type SimpleMultiSessionAppWithOracleSession struct {
	Contract     *SimpleMultiSessionAppWithOracle // Generic contract binding to set the session for
	CallOpts     bind.CallOpts                    // Call options to use throughout this session
	TransactOpts bind.TransactOpts                // Transaction auth options to use throughout this session
}

// SimpleMultiSessionAppWithOracleCallerSession is an auto generated read-only Go binding around an Ethereum contract,
// with pre-set call options.
type SimpleMultiSessionAppWithOracleCallerSession struct {
	Contract *SimpleMultiSessionAppWithOracleCaller // Generic contract caller binding to set the session for
	CallOpts bind.CallOpts                          // Call options to use throughout this session
}

// SimpleMultiSessionAppWithOracleTransactorSession is an auto generated write-only Go binding around an Ethereum contract,
// with pre-set transact options.
type SimpleMultiSessionAppWithOracleTransactorSession struct {
	Contract     *SimpleMultiSessionAppWithOracleTransactor // Generic contract transactor binding to set the session for
	TransactOpts bind.TransactOpts                          // Transaction auth options to use throughout this session
}

// SimpleMultiSessionAppWithOracleRaw is an auto generated low-level Go binding around an Ethereum contract.
type SimpleMultiSessionAppWithOracleRaw struct {
	Contract *SimpleMultiSessionAppWithOracle // Generic contract binding to access the raw methods on
}

// SimpleMultiSessionAppWithOracleCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract.
type SimpleMultiSessionAppWithOracleCallerRaw struct {
	Contract *SimpleMultiSessionAppWithOracleCaller // Generic read-only contract binding to access the raw methods on
}

// SimpleMultiSessionAppWithOracleTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract.
type SimpleMultiSessionAppWithOracleTransactorRaw struct {
	Contract *SimpleMultiSessionAppWithOracleTransactor // Generic write-only contract binding to access the raw methods on
}

// NewSimpleMultiSessionAppWithOracle creates a new instance of SimpleMultiSessionAppWithOracle, bound to a specific deployed contract.
func NewSimpleMultiSessionAppWithOracle(address common.Address, backend bind.ContractBackend) (*SimpleMultiSessionAppWithOracle, error) {
	contract, err := bindSimpleMultiSessionAppWithOracle(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracle{SimpleMultiSessionAppWithOracleCaller: SimpleMultiSessionAppWithOracleCaller{contract: contract}, SimpleMultiSessionAppWithOracleTransactor: SimpleMultiSessionAppWithOracleTransactor{contract: contract}, SimpleMultiSessionAppWithOracleFilterer: SimpleMultiSessionAppWithOracleFilterer{contract: contract}}, nil
}

// NewSimpleMultiSessionAppWithOracleCaller creates a new read-only instance of SimpleMultiSessionAppWithOracle, bound to a specific deployed contract.
func NewSimpleMultiSessionAppWithOracleCaller(address common.Address, caller bind.ContractCaller) (*SimpleMultiSessionAppWithOracleCaller, error) {
	contract, err := bindSimpleMultiSessionAppWithOracle(address, caller, nil, nil)
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracleCaller{contract: contract}, nil
}

// NewSimpleMultiSessionAppWithOracleTransactor creates a new write-only instance of SimpleMultiSessionAppWithOracle, bound to a specific deployed contract.
func NewSimpleMultiSessionAppWithOracleTransactor(address common.Address, transactor bind.ContractTransactor) (*SimpleMultiSessionAppWithOracleTransactor, error) {
	contract, err := bindSimpleMultiSessionAppWithOracle(address, nil, transactor, nil)
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracleTransactor{contract: contract}, nil
}

// NewSimpleMultiSessionAppWithOracleFilterer creates a new log filterer instance of SimpleMultiSessionAppWithOracle, bound to a specific deployed contract.
func NewSimpleMultiSessionAppWithOracleFilterer(address common.Address, filterer bind.ContractFilterer) (*SimpleMultiSessionAppWithOracleFilterer, error) {
	contract, err := bindSimpleMultiSessionAppWithOracle(address, nil, nil, filterer)
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracleFilterer{contract: contract}, nil
}

// bindSimpleMultiSessionAppWithOracle binds a generic wrapper to an already deployed contract.
func bindSimpleMultiSessionAppWithOracle(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := abi.JSON(strings.NewReader(SimpleMultiSessionAppWithOracleABI))
	if err != nil {
		return nil, err
	}
	return bind.NewBoundContract(address, parsed, caller, transactor, filterer), nil
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
	return _SimpleMultiSessionAppWithOracle.Contract.SimpleMultiSessionAppWithOracleCaller.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SimpleMultiSessionAppWithOracleTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SimpleMultiSessionAppWithOracleTransactor.contract.Transact(opts, method, params...)
}

// Call invokes the (constant) contract method with params as input values and
// sets the output to result. The result type might be a single field for simple
// returns, a slice of interfaces for anonymous returns and a struct for named
// returns.
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCallerRaw) Call(opts *bind.CallOpts, result interface{}, method string, params ...interface{}) error {
	return _SimpleMultiSessionAppWithOracle.Contract.contract.Call(opts, result, method, params...)
}

// Transfer initiates a plain transaction to move funds to the contract, calling
// its default method if one is available.
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.contract.Transact(opts, method, params...)
}

// GetOutcome is a free data retrieval call binding the contract method 0xea4ba8eb.
//
// Solidity: function getOutcome(bytes _query) view returns(bool)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCaller) GetOutcome(opts *bind.CallOpts, _query []byte) (bool, error) {
	var (
		ret0 = new(bool)
	)
	out := ret0
	err := _SimpleMultiSessionAppWithOracle.contract.Call(opts, out, "getOutcome", _query)
	return *ret0, err
}

// GetOutcome is a free data retrieval call binding the contract method 0xea4ba8eb.
//
// Solidity: function getOutcome(bytes _query) view returns(bool)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) GetOutcome(_query []byte) (bool, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetOutcome(&_SimpleMultiSessionAppWithOracle.CallOpts, _query)
}

// GetOutcome is a free data retrieval call binding the contract method 0xea4ba8eb.
//
// Solidity: function getOutcome(bytes _query) view returns(bool)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCallerSession) GetOutcome(_query []byte) (bool, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetOutcome(&_SimpleMultiSessionAppWithOracle.CallOpts, _query)
}

// GetState is a free data retrieval call binding the contract method 0x29dd2f8e.
//
// Solidity: function getState(bytes32 _session, uint256 _key) view returns(bytes)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCaller) GetState(opts *bind.CallOpts, _session [32]byte, _key *big.Int) ([]byte, error) {
	var (
		ret0 = new([]byte)
	)
	out := ret0
	err := _SimpleMultiSessionAppWithOracle.contract.Call(opts, out, "getState", _session, _key)
	return *ret0, err
}

// GetState is a free data retrieval call binding the contract method 0x29dd2f8e.
//
// Solidity: function getState(bytes32 _session, uint256 _key) view returns(bytes)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) GetState(_session [32]byte, _key *big.Int) ([]byte, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetState(&_SimpleMultiSessionAppWithOracle.CallOpts, _session, _key)
}

// GetState is a free data retrieval call binding the contract method 0x29dd2f8e.
//
// Solidity: function getState(bytes32 _session, uint256 _key) view returns(bytes)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCallerSession) GetState(_session [32]byte, _key *big.Int) ([]byte, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetState(&_SimpleMultiSessionAppWithOracle.CallOpts, _session, _key)
}

// GetStatus is a free data retrieval call binding the contract method 0x5de28ae0.
//
// Solidity: function getStatus(bytes32 _session) view returns(uint8)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCaller) GetStatus(opts *bind.CallOpts, _session [32]byte) (uint8, error) {
	var (
		ret0 = new(uint8)
	)
	out := ret0
	err := _SimpleMultiSessionAppWithOracle.contract.Call(opts, out, "getStatus", _session)
	return *ret0, err
}

// GetStatus is a free data retrieval call binding the contract method 0x5de28ae0.
//
// Solidity: function getStatus(bytes32 _session) view returns(uint8)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) GetStatus(_session [32]byte) (uint8, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetStatus(&_SimpleMultiSessionAppWithOracle.CallOpts, _session)
}

// GetStatus is a free data retrieval call binding the contract method 0x5de28ae0.
//
// Solidity: function getStatus(bytes32 _session) view returns(uint8)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCallerSession) GetStatus(_session [32]byte) (uint8, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetStatus(&_SimpleMultiSessionAppWithOracle.CallOpts, _session)
}

// IsFinalized is a free data retrieval call binding the contract method 0xbcdbda94.
//
// Solidity: function isFinalized(bytes _query) view returns(bool)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCaller) IsFinalized(opts *bind.CallOpts, _query []byte) (bool, error) {
	var (
		ret0 = new(bool)
	)
	out := ret0
	err := _SimpleMultiSessionAppWithOracle.contract.Call(opts, out, "isFinalized", _query)
	return *ret0, err
}

// IsFinalized is a free data retrieval call binding the contract method 0xbcdbda94.
//
// Solidity: function isFinalized(bytes _query) view returns(bool)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) IsFinalized(_query []byte) (bool, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.IsFinalized(&_SimpleMultiSessionAppWithOracle.CallOpts, _query)
}

// IsFinalized is a free data retrieval call binding the contract method 0xbcdbda94.
//
// Solidity: function isFinalized(bytes _query) view returns(bool)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleCallerSession) IsFinalized(_query []byte) (bool, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.IsFinalized(&_SimpleMultiSessionAppWithOracle.CallOpts, _query)
}

// GetSessionID is a paid mutator transaction binding the contract method 0x4d8bedec.
//
// Solidity: function getSessionID(uint256 _nonce, address[] _signers) returns(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactor) GetSessionID(opts *bind.TransactOpts, _nonce *big.Int, _signers []common.Address) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.contract.Transact(opts, "getSessionID", _nonce, _signers)
}

// GetSessionID is a paid mutator transaction binding the contract method 0x4d8bedec.
//
// Solidity: function getSessionID(uint256 _nonce, address[] _signers) returns(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) GetSessionID(_nonce *big.Int, _signers []common.Address) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetSessionID(&_SimpleMultiSessionAppWithOracle.TransactOpts, _nonce, _signers)
}

// GetSessionID is a paid mutator transaction binding the contract method 0x4d8bedec.
//
// Solidity: function getSessionID(uint256 _nonce, address[] _signers) returns(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactorSession) GetSessionID(_nonce *big.Int, _signers []common.Address) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.GetSessionID(&_SimpleMultiSessionAppWithOracle.TransactOpts, _nonce, _signers)
}

// SettleByInvalidState is a paid mutator transaction binding the contract method 0xfb3fe806.
//
// Solidity: function settleByInvalidState(bytes _oracleProof, bytes _cosignedStateProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactor) SettleByInvalidState(opts *bind.TransactOpts, _oracleProof []byte, _cosignedStateProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.contract.Transact(opts, "settleByInvalidState", _oracleProof, _cosignedStateProof)
}

// SettleByInvalidState is a paid mutator transaction binding the contract method 0xfb3fe806.
//
// Solidity: function settleByInvalidState(bytes _oracleProof, bytes _cosignedStateProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) SettleByInvalidState(_oracleProof []byte, _cosignedStateProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleByInvalidState(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof, _cosignedStateProof)
}

// SettleByInvalidState is a paid mutator transaction binding the contract method 0xfb3fe806.
//
// Solidity: function settleByInvalidState(bytes _oracleProof, bytes _cosignedStateProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactorSession) SettleByInvalidState(_oracleProof []byte, _cosignedStateProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleByInvalidState(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof, _cosignedStateProof)
}

// SettleByInvalidTurn is a paid mutator transaction binding the contract method 0xa428cd3b.
//
// Solidity: function settleByInvalidTurn(bytes _oracleProof, bytes _cosignedStateProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactor) SettleByInvalidTurn(opts *bind.TransactOpts, _oracleProof []byte, _cosignedStateProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.contract.Transact(opts, "settleByInvalidTurn", _oracleProof, _cosignedStateProof)
}

// SettleByInvalidTurn is a paid mutator transaction binding the contract method 0xa428cd3b.
//
// Solidity: function settleByInvalidTurn(bytes _oracleProof, bytes _cosignedStateProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) SettleByInvalidTurn(_oracleProof []byte, _cosignedStateProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleByInvalidTurn(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof, _cosignedStateProof)
}

// SettleByInvalidTurn is a paid mutator transaction binding the contract method 0xa428cd3b.
//
// Solidity: function settleByInvalidTurn(bytes _oracleProof, bytes _cosignedStateProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactorSession) SettleByInvalidTurn(_oracleProof []byte, _cosignedStateProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleByInvalidTurn(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof, _cosignedStateProof)
}

// SettleByMoveTimeout is a paid mutator transaction binding the contract method 0xf26285b2.
//
// Solidity: function settleByMoveTimeout(bytes _oracleProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactor) SettleByMoveTimeout(opts *bind.TransactOpts, _oracleProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.contract.Transact(opts, "settleByMoveTimeout", _oracleProof)
}

// SettleByMoveTimeout is a paid mutator transaction binding the contract method 0xf26285b2.
//
// Solidity: function settleByMoveTimeout(bytes _oracleProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) SettleByMoveTimeout(_oracleProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleByMoveTimeout(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof)
}

// SettleByMoveTimeout is a paid mutator transaction binding the contract method 0xf26285b2.
//
// Solidity: function settleByMoveTimeout(bytes _oracleProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactorSession) SettleByMoveTimeout(_oracleProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleByMoveTimeout(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof)
}

// SettleBySigTimeout is a paid mutator transaction binding the contract method 0x2141dbda.
//
// Solidity: function settleBySigTimeout(bytes _oracleProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactor) SettleBySigTimeout(opts *bind.TransactOpts, _oracleProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.contract.Transact(opts, "settleBySigTimeout", _oracleProof)
}

// SettleBySigTimeout is a paid mutator transaction binding the contract method 0x2141dbda.
//
// Solidity: function settleBySigTimeout(bytes _oracleProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleSession) SettleBySigTimeout(_oracleProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleBySigTimeout(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof)
}

// SettleBySigTimeout is a paid mutator transaction binding the contract method 0x2141dbda.
//
// Solidity: function settleBySigTimeout(bytes _oracleProof) returns()
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleTransactorSession) SettleBySigTimeout(_oracleProof []byte) (*types.Transaction, error) {
	return _SimpleMultiSessionAppWithOracle.Contract.SettleBySigTimeout(&_SimpleMultiSessionAppWithOracle.TransactOpts, _oracleProof)
}

// SimpleMultiSessionAppWithOracleInvalidStateDisputeIterator is returned from FilterInvalidStateDispute and is used to iterate over the raw logs and unpacked data for InvalidStateDispute events raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleInvalidStateDisputeIterator struct {
	Event *SimpleMultiSessionAppWithOracleInvalidStateDispute // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *SimpleMultiSessionAppWithOracleInvalidStateDisputeIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(SimpleMultiSessionAppWithOracleInvalidStateDispute)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(SimpleMultiSessionAppWithOracleInvalidStateDispute)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *SimpleMultiSessionAppWithOracleInvalidStateDisputeIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *SimpleMultiSessionAppWithOracleInvalidStateDisputeIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// SimpleMultiSessionAppWithOracleInvalidStateDispute represents a InvalidStateDispute event raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleInvalidStateDispute struct {
	Session [32]byte
	Raw     types.Log // Blockchain specific contextual infos
}

// FilterInvalidStateDispute is a free log retrieval operation binding the contract event 0x1ee6c3823014f5e366ff312d2cf02769f8c7767be5f8c4fc3bcfaa9eb1517d81.
//
// Solidity: event InvalidStateDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) FilterInvalidStateDispute(opts *bind.FilterOpts) (*SimpleMultiSessionAppWithOracleInvalidStateDisputeIterator, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.FilterLogs(opts, "InvalidStateDispute")
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracleInvalidStateDisputeIterator{contract: _SimpleMultiSessionAppWithOracle.contract, event: "InvalidStateDispute", logs: logs, sub: sub}, nil
}

// WatchInvalidStateDispute is a free log subscription operation binding the contract event 0x1ee6c3823014f5e366ff312d2cf02769f8c7767be5f8c4fc3bcfaa9eb1517d81.
//
// Solidity: event InvalidStateDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) WatchInvalidStateDispute(opts *bind.WatchOpts, sink chan<- *SimpleMultiSessionAppWithOracleInvalidStateDispute) (event.Subscription, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.WatchLogs(opts, "InvalidStateDispute")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(SimpleMultiSessionAppWithOracleInvalidStateDispute)
				if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "InvalidStateDispute", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseInvalidStateDispute is a log parse operation binding the contract event 0x1ee6c3823014f5e366ff312d2cf02769f8c7767be5f8c4fc3bcfaa9eb1517d81.
//
// Solidity: event InvalidStateDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) ParseInvalidStateDispute(log types.Log) (*SimpleMultiSessionAppWithOracleInvalidStateDispute, error) {
	event := new(SimpleMultiSessionAppWithOracleInvalidStateDispute)
	if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "InvalidStateDispute", log); err != nil {
		return nil, err
	}
	return event, nil
}

// SimpleMultiSessionAppWithOracleInvalidTurnDisputeIterator is returned from FilterInvalidTurnDispute and is used to iterate over the raw logs and unpacked data for InvalidTurnDispute events raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleInvalidTurnDisputeIterator struct {
	Event *SimpleMultiSessionAppWithOracleInvalidTurnDispute // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *SimpleMultiSessionAppWithOracleInvalidTurnDisputeIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(SimpleMultiSessionAppWithOracleInvalidTurnDispute)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(SimpleMultiSessionAppWithOracleInvalidTurnDispute)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *SimpleMultiSessionAppWithOracleInvalidTurnDisputeIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *SimpleMultiSessionAppWithOracleInvalidTurnDisputeIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// SimpleMultiSessionAppWithOracleInvalidTurnDispute represents a InvalidTurnDispute event raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleInvalidTurnDispute struct {
	Session [32]byte
	Raw     types.Log // Blockchain specific contextual infos
}

// FilterInvalidTurnDispute is a free log retrieval operation binding the contract event 0x632769e06437be0bc831706f701d0f55babe48cb2f48113134e4103bd5830afd.
//
// Solidity: event InvalidTurnDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) FilterInvalidTurnDispute(opts *bind.FilterOpts) (*SimpleMultiSessionAppWithOracleInvalidTurnDisputeIterator, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.FilterLogs(opts, "InvalidTurnDispute")
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracleInvalidTurnDisputeIterator{contract: _SimpleMultiSessionAppWithOracle.contract, event: "InvalidTurnDispute", logs: logs, sub: sub}, nil
}

// WatchInvalidTurnDispute is a free log subscription operation binding the contract event 0x632769e06437be0bc831706f701d0f55babe48cb2f48113134e4103bd5830afd.
//
// Solidity: event InvalidTurnDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) WatchInvalidTurnDispute(opts *bind.WatchOpts, sink chan<- *SimpleMultiSessionAppWithOracleInvalidTurnDispute) (event.Subscription, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.WatchLogs(opts, "InvalidTurnDispute")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(SimpleMultiSessionAppWithOracleInvalidTurnDispute)
				if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "InvalidTurnDispute", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseInvalidTurnDispute is a log parse operation binding the contract event 0x632769e06437be0bc831706f701d0f55babe48cb2f48113134e4103bd5830afd.
//
// Solidity: event InvalidTurnDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) ParseInvalidTurnDispute(log types.Log) (*SimpleMultiSessionAppWithOracleInvalidTurnDispute, error) {
	event := new(SimpleMultiSessionAppWithOracleInvalidTurnDispute)
	if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "InvalidTurnDispute", log); err != nil {
		return nil, err
	}
	return event, nil
}

// SimpleMultiSessionAppWithOracleMoveTimeoutDisputeIterator is returned from FilterMoveTimeoutDispute and is used to iterate over the raw logs and unpacked data for MoveTimeoutDispute events raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleMoveTimeoutDisputeIterator struct {
	Event *SimpleMultiSessionAppWithOracleMoveTimeoutDispute // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *SimpleMultiSessionAppWithOracleMoveTimeoutDisputeIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(SimpleMultiSessionAppWithOracleMoveTimeoutDispute)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(SimpleMultiSessionAppWithOracleMoveTimeoutDispute)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *SimpleMultiSessionAppWithOracleMoveTimeoutDisputeIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *SimpleMultiSessionAppWithOracleMoveTimeoutDisputeIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// SimpleMultiSessionAppWithOracleMoveTimeoutDispute represents a MoveTimeoutDispute event raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleMoveTimeoutDispute struct {
	Session [32]byte
	Raw     types.Log // Blockchain specific contextual infos
}

// FilterMoveTimeoutDispute is a free log retrieval operation binding the contract event 0x36a857ab2f7719bef9c1d8246bf7211e3b4ec09468b88347325456d5bec1ce3a.
//
// Solidity: event MoveTimeoutDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) FilterMoveTimeoutDispute(opts *bind.FilterOpts) (*SimpleMultiSessionAppWithOracleMoveTimeoutDisputeIterator, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.FilterLogs(opts, "MoveTimeoutDispute")
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracleMoveTimeoutDisputeIterator{contract: _SimpleMultiSessionAppWithOracle.contract, event: "MoveTimeoutDispute", logs: logs, sub: sub}, nil
}

// WatchMoveTimeoutDispute is a free log subscription operation binding the contract event 0x36a857ab2f7719bef9c1d8246bf7211e3b4ec09468b88347325456d5bec1ce3a.
//
// Solidity: event MoveTimeoutDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) WatchMoveTimeoutDispute(opts *bind.WatchOpts, sink chan<- *SimpleMultiSessionAppWithOracleMoveTimeoutDispute) (event.Subscription, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.WatchLogs(opts, "MoveTimeoutDispute")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(SimpleMultiSessionAppWithOracleMoveTimeoutDispute)
				if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "MoveTimeoutDispute", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseMoveTimeoutDispute is a log parse operation binding the contract event 0x36a857ab2f7719bef9c1d8246bf7211e3b4ec09468b88347325456d5bec1ce3a.
//
// Solidity: event MoveTimeoutDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) ParseMoveTimeoutDispute(log types.Log) (*SimpleMultiSessionAppWithOracleMoveTimeoutDispute, error) {
	event := new(SimpleMultiSessionAppWithOracleMoveTimeoutDispute)
	if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "MoveTimeoutDispute", log); err != nil {
		return nil, err
	}
	return event, nil
}

// SimpleMultiSessionAppWithOracleSigTimeoutDisputeIterator is returned from FilterSigTimeoutDispute and is used to iterate over the raw logs and unpacked data for SigTimeoutDispute events raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleSigTimeoutDisputeIterator struct {
	Event *SimpleMultiSessionAppWithOracleSigTimeoutDispute // Event containing the contract specifics and raw log

	contract *bind.BoundContract // Generic contract to use for unpacking event data
	event    string              // Event name to use for unpacking event data

	logs chan types.Log        // Log channel receiving the found contract events
	sub  ethereum.Subscription // Subscription for errors, completion and termination
	done bool                  // Whether the subscription completed delivering logs
	fail error                 // Occurred error to stop iteration
}

// Next advances the iterator to the subsequent event, returning whether there
// are any more events found. In case of a retrieval or parsing error, false is
// returned and Error() can be queried for the exact failure.
func (it *SimpleMultiSessionAppWithOracleSigTimeoutDisputeIterator) Next() bool {
	// If the iterator failed, stop iterating
	if it.fail != nil {
		return false
	}
	// If the iterator completed, deliver directly whatever's available
	if it.done {
		select {
		case log := <-it.logs:
			it.Event = new(SimpleMultiSessionAppWithOracleSigTimeoutDispute)
			if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
				it.fail = err
				return false
			}
			it.Event.Raw = log
			return true

		default:
			return false
		}
	}
	// Iterator still in progress, wait for either a data or an error event
	select {
	case log := <-it.logs:
		it.Event = new(SimpleMultiSessionAppWithOracleSigTimeoutDispute)
		if err := it.contract.UnpackLog(it.Event, it.event, log); err != nil {
			it.fail = err
			return false
		}
		it.Event.Raw = log
		return true

	case err := <-it.sub.Err():
		it.done = true
		it.fail = err
		return it.Next()
	}
}

// Error returns any retrieval or parsing error occurred during filtering.
func (it *SimpleMultiSessionAppWithOracleSigTimeoutDisputeIterator) Error() error {
	return it.fail
}

// Close terminates the iteration process, releasing any pending underlying
// resources.
func (it *SimpleMultiSessionAppWithOracleSigTimeoutDisputeIterator) Close() error {
	it.sub.Unsubscribe()
	return nil
}

// SimpleMultiSessionAppWithOracleSigTimeoutDispute represents a SigTimeoutDispute event raised by the SimpleMultiSessionAppWithOracle contract.
type SimpleMultiSessionAppWithOracleSigTimeoutDispute struct {
	Session [32]byte
	Raw     types.Log // Blockchain specific contextual infos
}

// FilterSigTimeoutDispute is a free log retrieval operation binding the contract event 0x84b2b939adef644951dc4dc6318dc4fbe66768898728a435c356a3296947e510.
//
// Solidity: event SigTimeoutDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) FilterSigTimeoutDispute(opts *bind.FilterOpts) (*SimpleMultiSessionAppWithOracleSigTimeoutDisputeIterator, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.FilterLogs(opts, "SigTimeoutDispute")
	if err != nil {
		return nil, err
	}
	return &SimpleMultiSessionAppWithOracleSigTimeoutDisputeIterator{contract: _SimpleMultiSessionAppWithOracle.contract, event: "SigTimeoutDispute", logs: logs, sub: sub}, nil
}

// WatchSigTimeoutDispute is a free log subscription operation binding the contract event 0x84b2b939adef644951dc4dc6318dc4fbe66768898728a435c356a3296947e510.
//
// Solidity: event SigTimeoutDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) WatchSigTimeoutDispute(opts *bind.WatchOpts, sink chan<- *SimpleMultiSessionAppWithOracleSigTimeoutDispute) (event.Subscription, error) {

	logs, sub, err := _SimpleMultiSessionAppWithOracle.contract.WatchLogs(opts, "SigTimeoutDispute")
	if err != nil {
		return nil, err
	}
	return event.NewSubscription(func(quit <-chan struct{}) error {
		defer sub.Unsubscribe()
		for {
			select {
			case log := <-logs:
				// New log arrived, parse the event and forward to the user
				event := new(SimpleMultiSessionAppWithOracleSigTimeoutDispute)
				if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "SigTimeoutDispute", log); err != nil {
					return err
				}
				event.Raw = log

				select {
				case sink <- event:
				case err := <-sub.Err():
					return err
				case <-quit:
					return nil
				}
			case err := <-sub.Err():
				return err
			case <-quit:
				return nil
			}
		}
	}), nil
}

// ParseSigTimeoutDispute is a log parse operation binding the contract event 0x84b2b939adef644951dc4dc6318dc4fbe66768898728a435c356a3296947e510.
//
// Solidity: event SigTimeoutDispute(bytes32 session)
func (_SimpleMultiSessionAppWithOracle *SimpleMultiSessionAppWithOracleFilterer) ParseSigTimeoutDispute(log types.Log) (*SimpleMultiSessionAppWithOracleSigTimeoutDispute, error) {
	event := new(SimpleMultiSessionAppWithOracleSigTimeoutDispute)
	if err := _SimpleMultiSessionAppWithOracle.contract.UnpackLog(event, "SigTimeoutDispute", log); err != nil {
		return nil, err
	}
	return event, nil
}
