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

package wrappers

import (
	"errors"
	"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 (
	_ = errors.New
	_ = big.NewInt
	_ = strings.NewReader
	_ = ethereum.NotFound
	_ = bind.Bind
	_ = common.Big1
	_ = types.BloomLookup
	_ = event.NewSubscription
	_ = abi.ConvertType
)

// BinaryMerkleProof is an auto generated low-level Go binding around an user-defined struct.
type BinaryMerkleProof struct {
	SideNodes [][32]byte
	Key       *big.Int
	NumLeaves *big.Int
}

// DataRootTuple is an auto generated low-level Go binding around an user-defined struct.
type DataRootTuple struct {
	Height   *big.Int
	DataRoot [32]byte
}

// Signature is an auto generated low-level Go binding around an user-defined struct.
type Signature struct {
	V uint8
	R [32]byte
	S [32]byte
}

// Validator is an auto generated low-level Go binding around an user-defined struct.
type Validator struct {
	Addr  common.Address
	Power *big.Int
}

// WrappersMetaData contains all meta data concerning the Wrappers contract.
var WrappersMetaData = &bind.MetaData{
	ABI: "[{\"type\":\"function\",\"name\":\"UPGRADE_INTERFACE_VERSION\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"string\",\"internalType\":\"string\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"initialize\",\"inputs\":[{\"name\":\"_nonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_powerThreshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_validatorSetCheckpoint\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"owner\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"address\",\"internalType\":\"address\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"proxiableUUID\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"renounceOwnership\",\"inputs\":[],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"state_dataRootTupleRoots\",\"inputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state_eventNonce\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state_lastValidatorSetCheckpoint\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"state_powerThreshold\",\"inputs\":[],\"outputs\":[{\"name\":\"\",\"type\":\"uint256\",\"internalType\":\"uint256\"}],\"stateMutability\":\"view\"},{\"type\":\"function\",\"name\":\"submitDataRootTupleRoot\",\"inputs\":[{\"name\":\"_newNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_validatorSetNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_dataRootTupleRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_currentValidatorSet\",\"type\":\"tuple[]\",\"internalType\":\"structValidator[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"power\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_sigs\",\"type\":\"tuple[]\",\"internalType\":\"structSignature[]\",\"components\":[{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"transferOwnership\",\"inputs\":[{\"name\":\"newOwner\",\"type\":\"address\",\"internalType\":\"address\"}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"updateValidatorSet\",\"inputs\":[{\"name\":\"_newNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_oldNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_newPowerThreshold\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_newValidatorSetHash\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"_currentValidatorSet\",\"type\":\"tuple[]\",\"internalType\":\"structValidator[]\",\"components\":[{\"name\":\"addr\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"power\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]},{\"name\":\"_sigs\",\"type\":\"tuple[]\",\"internalType\":\"structSignature[]\",\"components\":[{\"name\":\"v\",\"type\":\"uint8\",\"internalType\":\"uint8\"},{\"name\":\"r\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"},{\"name\":\"s\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}],\"outputs\":[],\"stateMutability\":\"nonpayable\"},{\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"inputs\":[{\"name\":\"newImplementation\",\"type\":\"address\",\"internalType\":\"address\"},{\"name\":\"data\",\"type\":\"bytes\",\"internalType\":\"bytes\"}],\"outputs\":[],\"stateMutability\":\"payable\"},{\"type\":\"function\",\"name\":\"verifyAttestation\",\"inputs\":[{\"name\":\"_tupleRootNonce\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"_tuple\",\"type\":\"tuple\",\"internalType\":\"structDataRootTuple\",\"components\":[{\"name\":\"height\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"dataRoot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]},{\"name\":\"_proof\",\"type\":\"tuple\",\"internalType\":\"structBinaryMerkleProof\",\"components\":[{\"name\":\"sideNodes\",\"type\":\"bytes32[]\",\"internalType\":\"bytes32[]\"},{\"name\":\"key\",\"type\":\"uint256\",\"internalType\":\"uint256\"},{\"name\":\"numLeaves\",\"type\":\"uint256\",\"internalType\":\"uint256\"}]}],\"outputs\":[{\"name\":\"\",\"type\":\"bool\",\"internalType\":\"bool\"}],\"stateMutability\":\"view\"},{\"type\":\"event\",\"name\":\"DataRootTupleRootEvent\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"dataRootTupleRoot\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Initialized\",\"inputs\":[{\"name\":\"version\",\"type\":\"uint64\",\"indexed\":false,\"internalType\":\"uint64\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"OwnershipTransferred\",\"inputs\":[{\"name\":\"previousOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"},{\"name\":\"newOwner\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"Upgraded\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true,\"internalType\":\"address\"}],\"anonymous\":false},{\"type\":\"event\",\"name\":\"ValidatorSetUpdatedEvent\",\"inputs\":[{\"name\":\"nonce\",\"type\":\"uint256\",\"indexed\":true,\"internalType\":\"uint256\"},{\"name\":\"powerThreshold\",\"type\":\"uint256\",\"indexed\":false,\"internalType\":\"uint256\"},{\"name\":\"validatorSetHash\",\"type\":\"bytes32\",\"indexed\":false,\"internalType\":\"bytes32\"}],\"anonymous\":false},{\"type\":\"error\",\"name\":\"AddressEmptyCode\",\"inputs\":[{\"name\":\"target\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"AlreadyInitialized\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"ERC1967InvalidImplementation\",\"inputs\":[{\"name\":\"implementation\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"ERC1967NonPayable\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"FailedInnerCall\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InsufficientVotingPower\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidDataRootTupleRootNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidSignature\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"InvalidValidatorSetNonce\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"MalformedCurrentValidatorSet\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"NotInitializing\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"OwnableInvalidOwner\",\"inputs\":[{\"name\":\"owner\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"OwnableUnauthorizedAccount\",\"inputs\":[{\"name\":\"account\",\"type\":\"address\",\"internalType\":\"address\"}]},{\"type\":\"error\",\"name\":\"SuppliedValidatorSetInvalid\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnauthorizedCallContext\",\"inputs\":[]},{\"type\":\"error\",\"name\":\"UUPSUnsupportedProxiableUUID\",\"inputs\":[{\"name\":\"slot\",\"type\":\"bytes32\",\"internalType\":\"bytes32\"}]}]",
	Bin: "0x60a06040523462000044576200001462000054565b6200001e6200004a565b61350e620000d58239608051818181611caf01528181611d1b0152611ee6015261350e90f35b62000050565b60405190565b5f80fd5b6200005e62000060565b565b6200006a6200006c565b565b62000076620000c4565b565b60018060a01b031690565b90565b6200009f62000099620000a59262000078565b62000083565b62000078565b90565b620000b39062000086565b90565b620000c190620000a8565b90565b620000cf30620000b6565b60805256fe60806040526004361015610013575b610be7565b61001d5f356100fc565b806305d85c13146100f75780631f3302a9146100f2578063226fe7be146100ed5780634f1ef286146100e857806352d1902d146100e35780635433218c146100de578063715018a6146100d9578063817f985b146100d45780638da5cb5b146100cf578063ad3cb1cc146100ca578063cdade866146100c5578063e23eb326146100c0578063e5a2b5d2146100bb5763f2fde38b0361000e57610bb4565b610b61565b610b18565b610a5a565b6109cb565b610882565b61082b565b61078c565b610757565b6106e6565b61068b565b61054d565b6104dd565b610284565b60e01c90565b60405190565b5f80fd5b5f80fd5b5f80fd5b90565b61012081610114565b0361012757565b5f80fd5b9050359061013882610117565b565b90565b6101468161013a565b0361014d57565b5f80fd5b9050359061015e8261013d565b565b5f80fd5b5f80fd5b5f80fd5b909182601f830112156101a65781359167ffffffffffffffff83116101a157602001926040830284011161019c57565b610168565b610164565b610160565b909182601f830112156101e55781359167ffffffffffffffff83116101e05760200192606083028401116101db57565b610168565b610164565b610160565b60c08183031261027a57610200825f830161012b565b9261020e836020840161012b565b9261021c816040850161012b565b9261022a8260608301610151565b92608082013567ffffffffffffffff8111610275578361024b91840161016c565b92909360a082013567ffffffffffffffff81116102705761026c92016101ab565b9091565b610110565b610110565b61010c565b5f0190565b346102bc576102a66102973660046101ea565b96959095949194939293610d2b565b6102ae610102565b806102b88161027f565b0390f35b610108565b5f80fd5b601f801991011690565b634e487b7160e01b5f52604160045260245ffd5b906102ed906102c5565b810190811067ffffffffffffffff82111761030757604052565b6102cf565b9061031f610318610102565b92836102e3565b565b5f80fd5b919060408382031261035f576103589061033f604061030c565b9361034c825f830161012b565b5f860152602001610151565b6020830152565b6102c1565b67ffffffffffffffff811161037c5760208091020190565b6102cf565b9092919261039661039182610364565b61030c565b93818552602080860192028301928184116103d357915b8383106103ba5750505050565b602080916103c88486610151565b8152019201916103ad565b610168565b9080601f830112156103f6578160206103f393359101610381565b90565b610160565b91909160608184031261046057610412606061030c565b925f8201359167ffffffffffffffff831161045b57610436826104549483016103d8565b5f860152610447826020830161012b565b602086015260400161012b565b6040830152565b610321565b6102c1565b916080838303126104b15761047c825f850161012b565b9261048a8360208301610325565b92606082013567ffffffffffffffff81116104ac576104a992016103fb565b90565b610110565b61010c565b151590565b6104c4906104b6565b9052565b91906104db905f602085019401906104bb565b565b3461050e5761050a6104f96104f3366004610465565b91610f1c565b610501610102565b918291826104c8565b0390f35b610108565b90916060828403126105485761054561052e845f850161012b565b9361053c816020860161012b565b93604001610151565b90565b61010c565b3461057c57610566610560366004610513565b916112e1565b61056e610102565b806105788161027f565b0390f35b610108565b60018060a01b031690565b61059590610581565b90565b6105a18161058c565b036105a857565b5f80fd5b905035906105b982610598565b565b5f80fd5b67ffffffffffffffff81116105dd576105d96020916102c5565b0190565b6102cf565b90825f939282370152565b909291926106026105fd826105bf565b61030c565b9381855260208501908284011161061e5761061c926105e2565b565b6105bb565b9080601f830112156106415781602061063e933591016105ed565b90565b610160565b9190916040818403126106865761065f835f83016105ac565b92602082013567ffffffffffffffff81116106815761067e9201610623565b90565b610110565b61010c565b61069f610699366004610646565b90611317565b6106a7610102565b806106b18161027f565b0390f35b5f9103126106bf57565b61010c565b6106cd9061013a565b9052565b91906106e4905f602085019401906106c4565b565b34610716576106f63660046106b5565b610712610701611392565b610709610102565b918291826106d1565b0390f35b610108565b1c90565b90565b610732906008610737930261071b565b61071f565b90565b906107459154610722565b90565b61075460965f9061073a565b90565b34610787576107673660046106b5565b610783610772610748565b61077a610102565b918291826106d1565b0390f35b610108565b346107ba5761079c3660046106b5565b6107a46113f2565b6107ac610102565b806107b68161027f565b0390f35b610108565b906020828203126107d8576107d5915f0161012b565b90565b61010c565b90565b6107f46107ef6107f992610114565b6107dd565b610114565b90565b90610806906107e0565b5f5260205260405f2090565b610828906108236099915f926107fc565b61073a565b90565b3461085b576108576108466108413660046107bf565b610812565b61084e610102565b918291826106d1565b0390f35b610108565b6108699061058c565b9052565b9190610880905f60208501940190610860565b565b346108b2576108923660046106b5565b6108ae61089d61142c565b6108a5610102565b9182918261086d565b0390f35b610108565b67ffffffffffffffff81116108d5576108d16020916102c5565b0190565b6102cf565b906108ec6108e7836108b7565b61030c565b918252565b5f7f352e302e30000000000000000000000000000000000000000000000000000000910152565b61092260056108da565b9061092f602083016108f1565b565b610939610918565b90565b610944610931565b90565b61094f61093c565b90565b5190565b60209181520190565b5f5b838110610971575050905f910152565b806020918301518185015201610961565b6109a16109aa6020936109af9361099881610952565b93848093610956565b9586910161095f565b6102c5565b0190565b6109c89160208201915f818403910152610982565b90565b346109fb576109db3660046106b5565b6109f76109e6610947565b6109ee610102565b918291826109b3565b0390f35b610108565b90565b610a13906008610a18930261071b565b610a00565b90565b90610a269154610a03565b90565b610a3560985f90610a1b565b90565b610a4190610114565b9052565b9190610a58905f60208501940190610a38565b565b34610a8a57610a6a3660046106b5565b610a86610a75610a29565b610a7d610102565b91829182610a45565b0390f35b610108565b909160a082840312610b1357610aa7835f840161012b565b92610ab5816020850161012b565b92610ac38260408301610151565b92606082013567ffffffffffffffff8111610b0e5783610ae491840161016c565b929093608082013567ffffffffffffffff8111610b0957610b0592016101ab565b9091565b610110565b610110565b61010c565b34610b4d57610b37610b2b366004610a8f565b95949094939193611442565b610b3f610102565b80610b498161027f565b0390f35b610108565b610b5e60975f90610a1b565b90565b34610b9157610b713660046106b5565b610b8d610b7c610b52565b610b84610102565b91829182610a45565b0390f35b610108565b90602082820312610baf57610bac915f016105ac565b90565b61010c565b34610be257610bcc610bc7366004610b96565b611641565b610bd4610102565b80610bde8161027f565b0390f35b610108565b5f80fd5b5f1c90565b610bfc610c0191610beb565b610a00565b90565b610c0e9054610bf0565b90565b610c1d610c2291610beb565b61071f565b90565b610c2f9054610c11565b90565b90565b610c49610c44610c4e92610c32565b6107dd565b610114565b90565b634e487b7160e01b5f52601160045260245ffd5b610c74610c7a91939293610114565b92610114565b8201809211610c8557565b610c51565b5090565b5090565b5f1b90565b90610ca35f1991610c92565b9181191691161790565b610cb69061013a565b90565b610cc290610beb565b90565b90610cda610cd5610ce192610cad565b610cb9565b8254610c97565b9055565b90565b90610cfd610cf8610d04926107e0565b610ce5565b8254610c97565b9055565b916020610d29929493610d2260408201965f830190610a38565b01906106c4565b565b9490969195939296610d3d6098610c04565b610d476097610c04565b91610d526096610c25565b91610d79610d73610d6e8b93610d686001610c35565b90610c65565b610114565b91610114565b03610ea257610d89868590610c8a565b610da5610d9f610d9a8a8990610c8e565b610114565b91610114565b03610e7f57610dcd610dc7610dd392610dbf898890611751565b869091611810565b9261013a565b9161013a565b03610e5c57610e0094610df993610dec888a8c91611810565b95939190918693946118cb565b6096610cc5565b610e0b826097610ce8565b610e16816098610ce8565b9091610e427fe55fb3cbbfe29b13c7f8a35ef23127e7df9ab88df16bac166ad254a20f02414c926107e0565b92610e57610e4e610102565b92839283610d08565b0390a2565b610e64610102565b630bbdaec960e11b815280610e7b6004820161027f565b0390fd5b610e87610102565b63c6617b7b60e01b815280610e9e6004820161027f565b0390fd5b610eaa610102565b6368a35ffd60e11b815280610ec16004820161027f565b0390fd5b5f90565b610ed290610114565b9052565b610edf9061013a565b9052565b90602080610f0593610efb5f8201515f860190610ec9565b0151910190610ed6565b565b9190610f1a905f60408501940190610ee3565b565b90610f25610ec5565b5081610f42610f3c610f376098610c04565b610114565b91610114565b11610f9257610f8e92610f89610f64610f5f610f7a9560996107fc565b610c25565b9192610f6e610102565b94859160208301610f07565b602082018103825203846102e3565b611a6f565b5090565b5050505f90565b60401c90565b60ff1690565b610fb1610fb691610f99565b610f9f565b90565b610fc39054610fa5565b90565b67ffffffffffffffff1690565b610fdf610fe491610beb565b610fc6565b90565b610ff19054610fd3565b90565b67ffffffffffffffff1690565b61101561101061101a92610c32565b6107dd565b610ff4565b90565b61103161102c61103692610581565b6107dd565b610581565b90565b6110429061101d565b90565b61104e90611039565b90565b90565b61106861106361106d92611051565b6107dd565b610114565b90565b9061108367ffffffffffffffff91610c92565b9181191691161790565b6110a161109c6110a692610ff4565b6107dd565b610ff4565b90565b90565b906110c16110bc6110c89261108d565b6110a9565b8254611070565b9055565b60401b90565b906110e668ff0000000000000000916110cc565b9181191691161790565b6110f9906104b6565b90565b90565b9061111461110f61111b926110f0565b6110fc565b82546110d2565b9055565b61112890611001565b9052565b919061113f905f6020850194019061111f565b565b611149611c38565b9261115e6111585f8601610fb9565b156104b6565b928380611285575b61117090156104b6565b80611228575b6112065761119e9261119361118b6001611001565b5f88016110ac565b846111f4575b6112af565b6111a6575b50565b6111b3905f8091016110ff565b60016111eb7fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2916111e2610102565b9182918261112c565b0390a15f6111a3565b61120160015f88016110ff565b611199565b61120e610102565b62dc149f60e41b8152806112246004820161027f565b0390fd5b5061123230611045565b3b61124561123f5f611054565b91610114565b148061125b575b61125690156104b6565b611176565b5061125661126a5f8701610fe7565b61127d6112776001611001565b91610ff4565b14905061124c565b506111706112945f8701610fe7565b6112a76112a16001611001565b91610ff4565b109050611166565b6112cf926112c16112c8926098610ce8565b6096610cc5565b6097610ce8565b6112df6112da611c5c565b611c87565b565b906112ec9291611141565b565b90611300916112fb611c9e565b611302565b565b906113159161131081611d57565b611dc9565b565b90611321916112ee565b565b5f90565b61133890611333611ed5565b611386565b90565b90565b61135261134d6113579261133b565b610c92565b61013a565b90565b6113837f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc61133e565b90565b5061138f61135a565b90565b6113a261139d611323565b611327565b90565b6113ad611f3a565b6113b56113df565b565b6113cb6113c66113d092611051565b6107dd565b610581565b90565b6113dc906113b7565b90565b6113f06113eb5f6113d3565b611fd9565b565b6113fa6113a5565b565b5f90565b60018060a01b031690565b61141761141c91610beb565b611400565b90565b611429905461140b565b90565b6114346113fc565b5061143f606461141f565b90565b9493929091956114526098610c04565b61145c6097610c04565b936114676096610c25565b9161148e6114886114838b9361147d6001610c35565b90610c65565b610114565b91610114565b036115b25761149e848790610c8a565b6114ba6114b46114af8a8790610c8e565b610114565b91610114565b0361158f576114e26114dc6114e8926114d4878a90611751565b889091611810565b9261013a565b9161013a565b0361156c57611508946114fc8789906120aa565b929490919293946118cb565b611513816098610ce8565b61152882611523609984906107fc565b610cc5565b6115676115557f6614d037bde4905e31ca5ff05de61964c267f28b0320ed49e59f7d99752e1c4f926107e0565b9261155e610102565b918291826106d1565b0390a2565b611574610102565b630bbdaec960e11b81528061158b6004820161027f565b0390fd5b611597610102565b63c6617b7b60e01b8152806115ae6004820161027f565b0390fd5b6115ba610102565b63e869766d60e01b8152806115d16004820161027f565b0390fd5b6115e6906115e1611f3a565b6115e8565b565b806116036115fd6115f85f6113d3565b61058c565b9161058c565b146116135761161190611fd9565b565b61163d61161f5f6113d3565b611627610102565b918291631e4fbdf760e01b83526004830161086d565b0390fd5b61164a906115d5565b565b60209181520190565b90565b506116679060208101906105ac565b90565b6116739061058c565b9052565b5061168690602081019061012b565b90565b9060206116b46116bc936116ab6116a25f830183611658565b5f86019061166a565b82810190611677565b910190610ec9565b565b906116cb81604093611689565b0190565b5090565b60400190565b916116e7826116ed9261164c565b92611655565b90815f905b828210611700575050505090565b9091929361172261171c60019261171788866116cf565b6116be565b956116d3565b9201909291926116f2565b90916117449260208301925f8185039101526116d9565b90565b60200190565b5190565b6117849061175d611323565b50611775611769610102565b9384926020840161172d565b602082018103825203826102e3565b6117966117908261174d565b91611747565b2090565b90565b6117b16117ac6117b69261179a565b610c92565b61013a565b90565b6117cf6918da1958dadc1bda5b9d60b21b61179d565b90565b61180761180e946117fd6060949897956117f3608086019a5f8701906106c4565b6020850190610a38565b6040830190610a38565b01906106c4565b565b61183f61184e9293611820611323565b506118296117b9565b9294611833610102565b958694602086016117d2565b602082018103825203826102e3565b61186061185a8261174d565b91611747565b2090565b60016118709101610114565b90565b634e487b7160e01b5f52603260045260245ffd5b9190811015611897576060020190565b611873565b91908110156118ac576040020190565b611873565b356118bb81610598565b90565b356118c881610117565b90565b909294936118d85f611054565b926118e25f611054565b935b846119016118fb6118f6878a90610c8a565b610114565b91610114565b1015611a165761191b611916838a8891611887565b612169565b611a0c5761195461194e61193b5f611935888b8b9161189c565b016118b1565b85611948868d8b91611887565b916121ec565b156104b6565b6119e95761197990611973602061196d878a8a9161189c565b016118be565b90610c65565b938461198d61198789610114565b91610114565b10156119a35761199d905b611864565b936118e4565b505050506119bf9293506119b991505b92610114565b91610114565b106119c657565b6119ce610102565b63cabeb65560e01b8152806119e56004820161027f565b0390fd5b6119f1610102565b638baa579f60e01b815280611a086004820161027f565b0390fd5b9361199d90611998565b93505050506119bf9293506119b991506119b3565b5f90565b611a399051610114565b90565b5190565b634e487b7160e01b5f52602160045260245ffd5b60061115611a5e57565b611a40565b90611a6d82611a54565b565b9091611a79610ec5565b50611a82611a2b565b50611a8f60408401611a2f565b611aa2611a9c6001610c35565b91610114565b11155f14611bea57611ab65f840151611a3c565b611ac8611ac25f611054565b91610114565b03611be0575b611ada60208401611a2f565b611af7611af1611aec60408701611a2f565b610114565b91610114565b1015611bd657611b0690612474565b91611b135f820151611a3c565b611b25611b1f5f611054565b91610114565b14611b8f579182611b3c6020611b54949501611a2f565b915f611b4a60408401611a2f565b919201519261250e565b80611b67611b615f611a63565b91611a63565b03611b865750611b7a611b80919261013a565b9161013a565b14905f90565b929150505f9190565b6040611b9b9101611a2f565b611bae611ba86001610c35565b91610114565b145f14611bce57611bc2611bc8919261013a565b9161013a565b14905f90565b50505f905f90565b5050505f90600290565b5050505f90600190565b611bf65f840151611a3c565b611c28611c22611c1d611c0b60208801611a2f565b611c1760408901611a2f565b906122c3565b610114565b91610114565b0315611ace575050505f90600190565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0e90565b611c646113fc565b503390565b611c7a90611c75612722565b611c7c565b565b611c859061277a565b565b611c9090611c69565b565b611c9b90611039565b90565b611ca730611c92565b611cd9611cd37f000000000000000000000000000000000000000000000000000000000000000061058c565b9161058c565b148015611d0a575b611ce757565b611cef610102565b63703e46dd60e11b815280611d066004820161027f565b0390fd5b50611d13612785565b611d45611d3f7f000000000000000000000000000000000000000000000000000000000000000061058c565b9161058c565b1415611ce1565b50611d55611f3a565b565b611d6090611d4c565b565b611d6b9061101d565b90565b611d7790611d62565b90565b611d8390611039565b90565b60e01b90565b90505190611d998261013d565b565b90602082820312611db457611db1915f01611d8c565b90565b61010c565b611dc1610102565b3d5f823e3d90fd5b9190611df76020611de1611ddc86611d6e565b611d7a565b6352d1902d90611def610102565b938492611d86565b82528180611e076004820161027f565b03915afa80915f92611ea5575b50155f14611e4f575050906001611e2957505b565b611e4b90611e35610102565b918291634c9c8ce360e01b83526004830161086d565b0390fd5b9283611e6a611e64611e5f61135a565b61013a565b9161013a565b03611e7f57611e7a9293506127ab565b611e27565b611ea184611e8b610102565b918291632a87526960e21b8352600483016106d1565b0390fd5b611ec791925060203d8111611ece575b611ebf81836102e3565b810190611d9b565b905f611e14565b503d611eb5565b611ede30611c92565b611f10611f0a7f000000000000000000000000000000000000000000000000000000000000000061058c565b9161058c565b03611f1757565b611f1f610102565b63703e46dd60e11b815280611f366004820161027f565b0390fd5b611f4261142c565b611f5b611f55611f50611c5c565b61058c565b9161058c565b03611f6257565b611f8b611f6d611c5c565b611f75610102565b91829163118cdaa760e01b83526004830161086d565b0390fd5b90611fa060018060a01b0391610c92565b9181191691161790565b611fb390611039565b90565b90565b90611fce611fc9611fd592611faa565b611fb6565b8254611f8f565b9055565b611fe3606461141f565b611fee826064611fb9565b9061202261201c7f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e093611faa565b91611faa565b9161202b610102565b806120358161027f565b0390a3565b90565b61205161204c6120569261203a565b610c92565b61013a565b90565b6120756f0e8e4c2dce6c2c6e8d2dedc84c2e8c6d60831b61203d565b90565b6040906120a16120a8949695939661209760608401985f8501906106c4565b6020830190610a38565b01906106c4565b565b6120e7906120b6611323565b506120d86120c2612059565b91936120cc610102565b94859360208501612078565b602082018103825203826102e3565b6120f96120f38261174d565b91611747565b2090565b356121078161013d565b90565b61211e61211961212392611051565b610c92565b61013a565b90565b60ff1690565b61213581612126565b0361213c57565b5f80fd5b3561214a8161212c565b90565b61216161215c61216692611051565b6107dd565b612126565b90565b612171610ec5565b5061217e602082016120fd565b61219061218a5f61210a565b9161013a565b14806121c7575b90816121a2575b5090565b6121ae91505f01612140565b6121c06121ba5f61214d565b91612126565b145f61219e565b506121d4604082016120fd565b6121e66121e05f61210a565b9161013a565b14612197565b916122336122389161220961223e94612203610ec5565b506128ab565b906122155f8201612140565b61222d6040612226602085016120fd565b93016120fd565b926128f4565b61058c565b9161058c565b1490565b5f90565b90565b61225d61225861226292612246565b6107dd565b610114565b90565b612270610100612249565b90565b61228261228891939293610114565b92610114565b820391821161229357565b610c51565b1b90565b6122bb906122b56122af6122c094610114565b91610114565b90612298565b610114565b90565b6122cb612242565b50816122e06122da6001610c35565b91610114565b11156123c2576123006122f1612265565b6122fa8461291a565b90612273565b91612328600161232361231d866123176001610c35565b90612273565b91610c35565b61229c565b908261234f6123496123448561233e6001610c35565b90612273565b610114565b91610114565b11155f1461235d5750505090565b908092935061237561236f6001610c35565b91610114565b145f1461238c575050506123896001610c35565b90565b6123a66123ac926123a06001958290612273565b92612273565b906122c3565b906123ba6123bf9291610c35565b610c65565b90565b50506123cd5f611054565b90565b60ff60f81b1690565b60f81b90565b6123f36123ee6123f892611051565b6123d9565b6123d0565b90565b6124045f6123df565b90565b90565b61241661241b916123d0565b612407565b9052565b905090565b612449612440926020926124378161174d565b9485809361241f565b9384910161095f565b0190565b8061245e600192612465959461240a565b0190612424565b90565b61247191612424565b90565b5f6124c4602092612483611323565b506124b361248f6123fb565b6124a561249a610102565b93849288840161244d565b8682018103825203826102e3565b6124bb610102565b91829182612468565b039060025afa156124dc576124d95f51610c92565b90565b611db9565b906124eb82611a3c565b8110156124fc576020809102010190565b611873565b61250b905161013a565b90565b939293612519611323565b50612522611a2b565b50816125366125305f611054565b91610114565b14612717578161254f6125496001610c35565b91610114565b146126e85761255d85611a3c565b61256f6125695f611054565b91610114565b146126dd5761257d826129d5565b6125ae865f906125a86125a26125928b611a3c565b61259c6001610c35565b90612273565b92611054565b90612bb6565b916125b7611a2b565b50806125cb6125c584610114565b91610114565b1061265c576125fb9392916125ed6125f3926125e5611323565b508290612273565b93612273565b84919261250e565b90918161261061260a5f611a63565b91611a63565b0361265457505061264a6126458461263f61262f61264f969792611a3c565b6126396001610c35565b90612273565b906124e1565b612501565b612d34565b905f90565b915092509190565b61267b93505f96949692919250612671611323565b509186919261250e565b90938161269061268a5f611a63565b91611a63565b036126d55750506126ca6126c56126d09394926126bf6126af82611a3c565b6126b96001610c35565b90612273565b906124e1565b612501565b90612d34565b905f90565b915092509190565b505090915090600590565b505090916126f590611a3c565b6127076127015f611054565b91610114565b0361271157905f90565b90600490565b505090915090600390565b61273361272d612da4565b156104b6565b61273957565b612741610102565b631afcd79f60e31b8152806127586004820161027f565b0390fd5b61276d90612768612722565b61276f565b565b61277890611fd9565b565b6127839061275c565b565b61278d6113fc565b506127a85f6127a261279d61135a565b612dc2565b0161141f565b90565b906127b582612dc5565b816127e07fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b91611faa565b906127e9610102565b806127f38161027f565b0390a26127ff8161174d565b61281161280b5f611054565b91610114565b115f146128255761282191612ea3565b505b565b505061282f612e21565b612823565b905090565b5f7f19457468657265756d205369676e6564204d6573736167653a0a333200000000910152565b61286c601c8092612834565b61287581612839565b0190565b90565b61288861288d9161013a565b612879565b9052565b906128a76128a0602093612860565b809261287c565b0190565b6128de6128cf916128ba611323565b506128c3610102565b92839160208301612891565b602082018103825203826102e3565b6128f06128ea8261174d565b91611747565b2090565b9261290f92612917946129056113fc565b5092909192612f92565b919091613281565b90565b612922612242565b5061292c5f611054565b5b612941600161293c8391610c35565b61229c565b61295361294d84610114565b91610114565b10156129725761296d906129676001610c35565b90610c65565b61292d565b612984915061297f612265565b612273565b90565b1561298e57565b5f80fd5b6129a66129a16129ab92610c32565b6107dd565b612126565b90565b6129cd906129c76129c16129d294612126565b91610114565b9061071b565b610114565b90565b6129dd612242565b506129fc816129f56129ef6001610c35565b91610114565b1015612987565b612a2c612a08826133ad565b612a27612a21600192612a1b6001610c35565b90612273565b91610c35565b61229c565b90612a40612a3a8392610114565b91610114565b14612a49575b90565b612a5d90612a576001612992565b906129ae565b612a46565b606090565b60207f207468616e205f656e6400000000000000000000000000000000000000000000917f496e76616c69642072616e67653a205f626567696e20697320677265617465725f8201520152565b612ac1602a604092610956565b612aca81612a67565b0190565b612ae39060208101905f818303910152612ab4565b90565b60207f65206f7574206f6620626f756e64730000000000000000000000000000000000917f496e76616c69642072616e67653a205f626567696e206f72205f656e642061725f8201520152565b612b40602f604092610956565b612b4981612ae6565b0190565b612b629060208101905f818303910152612b33565b90565b90612b77612b7283610364565b61030c565b918252565b369037565b90612ba6612b8e83612b65565b92602080612b9c8693610364565b9201910390612b7c565b565b90612bb29061013a565b9052565b929092612bc1612a62565b5083612bd5612bcf85610114565b91610114565b11612cbd5783612bf5612bef612bea84611a3c565b610114565b91610114565b118015612c9b575b612c7957612c14612c0f848690612273565b612b81565b91845b80612c2a612c2487610114565b91610114565b1015612c7057612c6b90612c66612c4a612c458684906124e1565b612501565b612c618791612c5a858c90612273565b90926124e1565b612ba8565b611864565b612c17565b50935050905090565b612c81610102565b62461bcd60e51b815280612c9760048201612b4d565b0390fd5b5082612cb7612cb1612cac84611a3c565b610114565b91610114565b11612bfd565b612cc5610102565b62461bcd60e51b815280612cdb60048201612ace565b0390fd5b612cf3612cee612cf892610c32565b6123d9565b6123d0565b90565b612d056001612cdf565b90565b60209392612d28600183612d208895612d309761240a565b01809261287c565b01809261287c565b0190565b612d87602092612d765f93612d47611323565b50612d68612d53612cfb565b9193612d5d610102565b948593898501612d08565b8682018103825203826102e3565b612d7e610102565b91829182612468565b039060025afa15612d9f57612d9c5f51610c92565b90565b611db9565b612dac610ec5565b50612dbf5f612db9611c38565b01610fb9565b90565b90565b803b612dd9612dd35f611054565b91610114565b14612dfb57612df9905f612df3612dee61135a565b612dc2565b01611fb9565b565b612e1d90612e07610102565b918291634c9c8ce360e01b83526004830161086d565b0390fd5b34612e34612e2e5f611054565b91610114565b11612e3b57565b612e43610102565b63b398979f60e01b815280612e5a6004820161027f565b0390fd5b606090565b90612e75612e70836105bf565b61030c565b918252565b3d5f14612e9557612e8a3d612e63565b903d5f602084013e5b565b612e9d612e5e565b90612e93565b5f80612ecf93612eb1612e5e565b508390602081019051915af490612ec6612e7a565b90919091613400565b90565b5f90565b612ee2612ee791610beb565b6107e0565b90565b90565b612f01612efc612f0692612eea565b6107dd565b610114565b90565b90565b612f20612f1b612f2592612f09565b6107dd565b612126565b90565b90565b612f3f612f3a612f4492612f28565b6107dd565b612126565b90565b612f5090612126565b9052565b612f89612f9094612f7f606094989795612f75608086019a5f8701906106c4565b6020850190612f47565b60408301906106c4565b01906106c4565b565b929190612f9d6113fc565b50612fa6612ed2565b50612fb083612ed6565b612fe2612fdc7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0612eed565b91610114565b116130a35780612ffb612ff5601b612f0c565b91612126565b141580613087575b613074576130225f936020959293613019610102565b94859485612f54565b838052039060015afa1561306f5761303a5f51610c92565b8061305561304f61304a5f6113d3565b61058c565b9161058c565b1461305f57905f90565b506130695f6113d3565b90600190565b611db9565b505050506130815f6113d3565b90600490565b508061309c613096601c612f2b565b91612126565b1415613003565b505050506130b05f6113d3565b90600390565b600511156130c057565b611a40565b906130cf826130b6565b565b60207f7565000000000000000000000000000000000000000000000000000000000000917f45434453413a20696e76616c6964207369676e6174757265202776272076616c5f8201520152565b61312b6022604092610956565b613134816130d1565b0190565b61314d9060208101905f81830391015261311e565b90565b60207f7565000000000000000000000000000000000000000000000000000000000000917f45434453413a20696e76616c6964207369676e6174757265202773272076616c5f8201520152565b6131aa6022604092610956565b6131b381613150565b0190565b6131cc9060208101905f81830391015261319d565b90565b5f7f45434453413a20696e76616c6964207369676e6174757265206c656e67746800910152565b613203601f602092610956565b61320c816131cf565b0190565b6132259060208101905f8183039101526131f6565b90565b5f7f45434453413a20696e76616c6964207369676e61747572650000000000000000910152565b61325c6018602092610956565b61326581613228565b0190565b61327e9060208101905f81830391015261324f565b90565b8061329461328e5f6130c5565b916130c5565b145f1461329e5750565b806132b26132ac60016130c5565b916130c5565b145f146132db576132c1610102565b62461bcd60e51b8152806132d760048201613269565b0390fd5b806132ef6132e960026130c5565b916130c5565b145f14613318576132fe610102565b62461bcd60e51b81528061331460048201613210565b0390fd5b8061332c61332660036130c5565b916130c5565b145f146133555761333b610102565b62461bcd60e51b815280613351600482016131b7565b0390fd5b61336861336260046130c5565b916130c5565b1461336f57565b613377610102565b62461bcd60e51b81528061338d60048201613138565b0390fd5b61339a90610114565b5f1981146133a85760010190565b610c51565b6133b5612242565b506133bf5f611054565b5b816133d36133cd5f611054565b91610114565b146133fb576133e46133f591613391565b916133ef6001612992565b906129ae565b906133c0565b905090565b906134149061340d612e5e565b50156104b6565b5f14613420575061348b565b6134298261174d565b61343b6134355f611054565b91610114565b1480613470575b61344a575090565b61346c90613456610102565b918291639996b31560e01b83526004830161086d565b0390fd5b50803b61348561347f5f611054565b91610114565b14613442565b6134948161174d565b6134a66134a05f611054565b91610114565b115f146134b557805190602001fd5b6134bd610102565b630a12f52160e11b8152806134d46004820161027f565b0390fdfea2646970667358221220330c40076a8efd52e59b8031aee6c8487c8ee15030a76141e6918ab48bdd5b0964736f6c63430008160033",
}

// WrappersABI is the input ABI used to generate the binding from.
// Deprecated: Use WrappersMetaData.ABI instead.
var WrappersABI = WrappersMetaData.ABI

// WrappersBin is the compiled bytecode used for deploying new contracts.
// Deprecated: Use WrappersMetaData.Bin instead.
var WrappersBin = WrappersMetaData.Bin

// DeployWrappers deploys a new Ethereum contract, binding an instance of Wrappers to it.
func DeployWrappers(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *Wrappers, error) {
	parsed, err := WrappersMetaData.GetAbi()
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	if parsed == nil {
		return common.Address{}, nil, nil, errors.New("GetABI returned nil")
	}

	address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(WrappersBin), backend)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &Wrappers{WrappersCaller: WrappersCaller{contract: contract}, WrappersTransactor: WrappersTransactor{contract: contract}, WrappersFilterer: WrappersFilterer{contract: contract}}, nil
}

// Wrappers is an auto generated Go binding around an Ethereum contract.
type Wrappers struct {
	WrappersCaller     // Read-only binding to the contract
	WrappersTransactor // Write-only binding to the contract
	WrappersFilterer   // Log filterer for contract events
}

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

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

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

// WrappersSession is an auto generated Go binding around an Ethereum contract,
// with pre-set call and transact options.
type WrappersSession struct {
	Contract     *Wrappers         // 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
}

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

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

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

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

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

// NewWrappers creates a new instance of Wrappers, bound to a specific deployed contract.
func NewWrappers(address common.Address, backend bind.ContractBackend) (*Wrappers, error) {
	contract, err := bindWrappers(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &Wrappers{WrappersCaller: WrappersCaller{contract: contract}, WrappersTransactor: WrappersTransactor{contract: contract}, WrappersFilterer: WrappersFilterer{contract: contract}}, nil
}

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

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

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

// bindWrappers binds a generic wrapper to an already deployed contract.
func bindWrappers(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) {
	parsed, err := WrappersMetaData.GetAbi()
	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 (_Wrappers *WrappersRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Wrappers.Contract.WrappersCaller.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 (_Wrappers *WrappersRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wrappers.Contract.WrappersTransactor.contract.Transfer(opts)
}

// Transact invokes the (paid) contract method with params as input values.
func (_Wrappers *WrappersRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) {
	return _Wrappers.Contract.WrappersTransactor.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 (_Wrappers *WrappersCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error {
	return _Wrappers.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 (_Wrappers *WrappersTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wrappers.Contract.contract.Transfer(opts)
}

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

// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc.
//
// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string)
func (_Wrappers *WrappersCaller) UPGRADEINTERFACEVERSION(opts *bind.CallOpts) (string, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "UPGRADE_INTERFACE_VERSION")

	if err != nil {
		return *new(string), err
	}

	out0 := *abi.ConvertType(out[0], new(string)).(*string)

	return out0, err

}

// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc.
//
// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string)
func (_Wrappers *WrappersSession) UPGRADEINTERFACEVERSION() (string, error) {
	return _Wrappers.Contract.UPGRADEINTERFACEVERSION(&_Wrappers.CallOpts)
}

// UPGRADEINTERFACEVERSION is a free data retrieval call binding the contract method 0xad3cb1cc.
//
// Solidity: function UPGRADE_INTERFACE_VERSION() view returns(string)
func (_Wrappers *WrappersCallerSession) UPGRADEINTERFACEVERSION() (string, error) {
	return _Wrappers.Contract.UPGRADEINTERFACEVERSION(&_Wrappers.CallOpts)
}

// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_Wrappers *WrappersCaller) Owner(opts *bind.CallOpts) (common.Address, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "owner")

	if err != nil {
		return *new(common.Address), err
	}

	out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address)

	return out0, err

}

// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_Wrappers *WrappersSession) Owner() (common.Address, error) {
	return _Wrappers.Contract.Owner(&_Wrappers.CallOpts)
}

// Owner is a free data retrieval call binding the contract method 0x8da5cb5b.
//
// Solidity: function owner() view returns(address)
func (_Wrappers *WrappersCallerSession) Owner() (common.Address, error) {
	return _Wrappers.Contract.Owner(&_Wrappers.CallOpts)
}

// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d.
//
// Solidity: function proxiableUUID() view returns(bytes32)
func (_Wrappers *WrappersCaller) ProxiableUUID(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "proxiableUUID")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d.
//
// Solidity: function proxiableUUID() view returns(bytes32)
func (_Wrappers *WrappersSession) ProxiableUUID() ([32]byte, error) {
	return _Wrappers.Contract.ProxiableUUID(&_Wrappers.CallOpts)
}

// ProxiableUUID is a free data retrieval call binding the contract method 0x52d1902d.
//
// Solidity: function proxiableUUID() view returns(bytes32)
func (_Wrappers *WrappersCallerSession) ProxiableUUID() ([32]byte, error) {
	return _Wrappers.Contract.ProxiableUUID(&_Wrappers.CallOpts)
}

// StateDataRootTupleRoots is a free data retrieval call binding the contract method 0x817f985b.
//
// Solidity: function state_dataRootTupleRoots(uint256 ) view returns(bytes32)
func (_Wrappers *WrappersCaller) StateDataRootTupleRoots(opts *bind.CallOpts, arg0 *big.Int) ([32]byte, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "state_dataRootTupleRoots", arg0)

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// StateDataRootTupleRoots is a free data retrieval call binding the contract method 0x817f985b.
//
// Solidity: function state_dataRootTupleRoots(uint256 ) view returns(bytes32)
func (_Wrappers *WrappersSession) StateDataRootTupleRoots(arg0 *big.Int) ([32]byte, error) {
	return _Wrappers.Contract.StateDataRootTupleRoots(&_Wrappers.CallOpts, arg0)
}

// StateDataRootTupleRoots is a free data retrieval call binding the contract method 0x817f985b.
//
// Solidity: function state_dataRootTupleRoots(uint256 ) view returns(bytes32)
func (_Wrappers *WrappersCallerSession) StateDataRootTupleRoots(arg0 *big.Int) ([32]byte, error) {
	return _Wrappers.Contract.StateDataRootTupleRoots(&_Wrappers.CallOpts, arg0)
}

// StateEventNonce is a free data retrieval call binding the contract method 0xcdade866.
//
// Solidity: function state_eventNonce() view returns(uint256)
func (_Wrappers *WrappersCaller) StateEventNonce(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "state_eventNonce")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// StateEventNonce is a free data retrieval call binding the contract method 0xcdade866.
//
// Solidity: function state_eventNonce() view returns(uint256)
func (_Wrappers *WrappersSession) StateEventNonce() (*big.Int, error) {
	return _Wrappers.Contract.StateEventNonce(&_Wrappers.CallOpts)
}

// StateEventNonce is a free data retrieval call binding the contract method 0xcdade866.
//
// Solidity: function state_eventNonce() view returns(uint256)
func (_Wrappers *WrappersCallerSession) StateEventNonce() (*big.Int, error) {
	return _Wrappers.Contract.StateEventNonce(&_Wrappers.CallOpts)
}

// StateLastValidatorSetCheckpoint is a free data retrieval call binding the contract method 0x5433218c.
//
// Solidity: function state_lastValidatorSetCheckpoint() view returns(bytes32)
func (_Wrappers *WrappersCaller) StateLastValidatorSetCheckpoint(opts *bind.CallOpts) ([32]byte, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "state_lastValidatorSetCheckpoint")

	if err != nil {
		return *new([32]byte), err
	}

	out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte)

	return out0, err

}

// StateLastValidatorSetCheckpoint is a free data retrieval call binding the contract method 0x5433218c.
//
// Solidity: function state_lastValidatorSetCheckpoint() view returns(bytes32)
func (_Wrappers *WrappersSession) StateLastValidatorSetCheckpoint() ([32]byte, error) {
	return _Wrappers.Contract.StateLastValidatorSetCheckpoint(&_Wrappers.CallOpts)
}

// StateLastValidatorSetCheckpoint is a free data retrieval call binding the contract method 0x5433218c.
//
// Solidity: function state_lastValidatorSetCheckpoint() view returns(bytes32)
func (_Wrappers *WrappersCallerSession) StateLastValidatorSetCheckpoint() ([32]byte, error) {
	return _Wrappers.Contract.StateLastValidatorSetCheckpoint(&_Wrappers.CallOpts)
}

// StatePowerThreshold is a free data retrieval call binding the contract method 0xe5a2b5d2.
//
// Solidity: function state_powerThreshold() view returns(uint256)
func (_Wrappers *WrappersCaller) StatePowerThreshold(opts *bind.CallOpts) (*big.Int, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "state_powerThreshold")

	if err != nil {
		return *new(*big.Int), err
	}

	out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)

	return out0, err

}

// StatePowerThreshold is a free data retrieval call binding the contract method 0xe5a2b5d2.
//
// Solidity: function state_powerThreshold() view returns(uint256)
func (_Wrappers *WrappersSession) StatePowerThreshold() (*big.Int, error) {
	return _Wrappers.Contract.StatePowerThreshold(&_Wrappers.CallOpts)
}

// StatePowerThreshold is a free data retrieval call binding the contract method 0xe5a2b5d2.
//
// Solidity: function state_powerThreshold() view returns(uint256)
func (_Wrappers *WrappersCallerSession) StatePowerThreshold() (*big.Int, error) {
	return _Wrappers.Contract.StatePowerThreshold(&_Wrappers.CallOpts)
}

// VerifyAttestation is a free data retrieval call binding the contract method 0x1f3302a9.
//
// Solidity: function verifyAttestation(uint256 _tupleRootNonce, (uint256,bytes32) _tuple, (bytes32[],uint256,uint256) _proof) view returns(bool)
func (_Wrappers *WrappersCaller) VerifyAttestation(opts *bind.CallOpts, _tupleRootNonce *big.Int, _tuple DataRootTuple, _proof BinaryMerkleProof) (bool, error) {
	var out []interface{}
	err := _Wrappers.contract.Call(opts, &out, "verifyAttestation", _tupleRootNonce, _tuple, _proof)

	if err != nil {
		return *new(bool), err
	}

	out0 := *abi.ConvertType(out[0], new(bool)).(*bool)

	return out0, err

}

// VerifyAttestation is a free data retrieval call binding the contract method 0x1f3302a9.
//
// Solidity: function verifyAttestation(uint256 _tupleRootNonce, (uint256,bytes32) _tuple, (bytes32[],uint256,uint256) _proof) view returns(bool)
func (_Wrappers *WrappersSession) VerifyAttestation(_tupleRootNonce *big.Int, _tuple DataRootTuple, _proof BinaryMerkleProof) (bool, error) {
	return _Wrappers.Contract.VerifyAttestation(&_Wrappers.CallOpts, _tupleRootNonce, _tuple, _proof)
}

// VerifyAttestation is a free data retrieval call binding the contract method 0x1f3302a9.
//
// Solidity: function verifyAttestation(uint256 _tupleRootNonce, (uint256,bytes32) _tuple, (bytes32[],uint256,uint256) _proof) view returns(bool)
func (_Wrappers *WrappersCallerSession) VerifyAttestation(_tupleRootNonce *big.Int, _tuple DataRootTuple, _proof BinaryMerkleProof) (bool, error) {
	return _Wrappers.Contract.VerifyAttestation(&_Wrappers.CallOpts, _tupleRootNonce, _tuple, _proof)
}

// Initialize is a paid mutator transaction binding the contract method 0x226fe7be.
//
// Solidity: function initialize(uint256 _nonce, uint256 _powerThreshold, bytes32 _validatorSetCheckpoint) returns()
func (_Wrappers *WrappersTransactor) Initialize(opts *bind.TransactOpts, _nonce *big.Int, _powerThreshold *big.Int, _validatorSetCheckpoint [32]byte) (*types.Transaction, error) {
	return _Wrappers.contract.Transact(opts, "initialize", _nonce, _powerThreshold, _validatorSetCheckpoint)
}

// Initialize is a paid mutator transaction binding the contract method 0x226fe7be.
//
// Solidity: function initialize(uint256 _nonce, uint256 _powerThreshold, bytes32 _validatorSetCheckpoint) returns()
func (_Wrappers *WrappersSession) Initialize(_nonce *big.Int, _powerThreshold *big.Int, _validatorSetCheckpoint [32]byte) (*types.Transaction, error) {
	return _Wrappers.Contract.Initialize(&_Wrappers.TransactOpts, _nonce, _powerThreshold, _validatorSetCheckpoint)
}

// Initialize is a paid mutator transaction binding the contract method 0x226fe7be.
//
// Solidity: function initialize(uint256 _nonce, uint256 _powerThreshold, bytes32 _validatorSetCheckpoint) returns()
func (_Wrappers *WrappersTransactorSession) Initialize(_nonce *big.Int, _powerThreshold *big.Int, _validatorSetCheckpoint [32]byte) (*types.Transaction, error) {
	return _Wrappers.Contract.Initialize(&_Wrappers.TransactOpts, _nonce, _powerThreshold, _validatorSetCheckpoint)
}

// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_Wrappers *WrappersTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) {
	return _Wrappers.contract.Transact(opts, "renounceOwnership")
}

// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_Wrappers *WrappersSession) RenounceOwnership() (*types.Transaction, error) {
	return _Wrappers.Contract.RenounceOwnership(&_Wrappers.TransactOpts)
}

// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6.
//
// Solidity: function renounceOwnership() returns()
func (_Wrappers *WrappersTransactorSession) RenounceOwnership() (*types.Transaction, error) {
	return _Wrappers.Contract.RenounceOwnership(&_Wrappers.TransactOpts)
}

// SubmitDataRootTupleRoot is a paid mutator transaction binding the contract method 0xe23eb326.
//
// Solidity: function submitDataRootTupleRoot(uint256 _newNonce, uint256 _validatorSetNonce, bytes32 _dataRootTupleRoot, (address,uint256)[] _currentValidatorSet, (uint8,bytes32,bytes32)[] _sigs) returns()
func (_Wrappers *WrappersTransactor) SubmitDataRootTupleRoot(opts *bind.TransactOpts, _newNonce *big.Int, _validatorSetNonce *big.Int, _dataRootTupleRoot [32]byte, _currentValidatorSet []Validator, _sigs []Signature) (*types.Transaction, error) {
	return _Wrappers.contract.Transact(opts, "submitDataRootTupleRoot", _newNonce, _validatorSetNonce, _dataRootTupleRoot, _currentValidatorSet, _sigs)
}

// SubmitDataRootTupleRoot is a paid mutator transaction binding the contract method 0xe23eb326.
//
// Solidity: function submitDataRootTupleRoot(uint256 _newNonce, uint256 _validatorSetNonce, bytes32 _dataRootTupleRoot, (address,uint256)[] _currentValidatorSet, (uint8,bytes32,bytes32)[] _sigs) returns()
func (_Wrappers *WrappersSession) SubmitDataRootTupleRoot(_newNonce *big.Int, _validatorSetNonce *big.Int, _dataRootTupleRoot [32]byte, _currentValidatorSet []Validator, _sigs []Signature) (*types.Transaction, error) {
	return _Wrappers.Contract.SubmitDataRootTupleRoot(&_Wrappers.TransactOpts, _newNonce, _validatorSetNonce, _dataRootTupleRoot, _currentValidatorSet, _sigs)
}

// SubmitDataRootTupleRoot is a paid mutator transaction binding the contract method 0xe23eb326.
//
// Solidity: function submitDataRootTupleRoot(uint256 _newNonce, uint256 _validatorSetNonce, bytes32 _dataRootTupleRoot, (address,uint256)[] _currentValidatorSet, (uint8,bytes32,bytes32)[] _sigs) returns()
func (_Wrappers *WrappersTransactorSession) SubmitDataRootTupleRoot(_newNonce *big.Int, _validatorSetNonce *big.Int, _dataRootTupleRoot [32]byte, _currentValidatorSet []Validator, _sigs []Signature) (*types.Transaction, error) {
	return _Wrappers.Contract.SubmitDataRootTupleRoot(&_Wrappers.TransactOpts, _newNonce, _validatorSetNonce, _dataRootTupleRoot, _currentValidatorSet, _sigs)
}

// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_Wrappers *WrappersTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) {
	return _Wrappers.contract.Transact(opts, "transferOwnership", newOwner)
}

// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_Wrappers *WrappersSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
	return _Wrappers.Contract.TransferOwnership(&_Wrappers.TransactOpts, newOwner)
}

// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b.
//
// Solidity: function transferOwnership(address newOwner) returns()
func (_Wrappers *WrappersTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) {
	return _Wrappers.Contract.TransferOwnership(&_Wrappers.TransactOpts, newOwner)
}

// UpdateValidatorSet is a paid mutator transaction binding the contract method 0x05d85c13.
//
// Solidity: function updateValidatorSet(uint256 _newNonce, uint256 _oldNonce, uint256 _newPowerThreshold, bytes32 _newValidatorSetHash, (address,uint256)[] _currentValidatorSet, (uint8,bytes32,bytes32)[] _sigs) returns()
func (_Wrappers *WrappersTransactor) UpdateValidatorSet(opts *bind.TransactOpts, _newNonce *big.Int, _oldNonce *big.Int, _newPowerThreshold *big.Int, _newValidatorSetHash [32]byte, _currentValidatorSet []Validator, _sigs []Signature) (*types.Transaction, error) {
	return _Wrappers.contract.Transact(opts, "updateValidatorSet", _newNonce, _oldNonce, _newPowerThreshold, _newValidatorSetHash, _currentValidatorSet, _sigs)
}

// UpdateValidatorSet is a paid mutator transaction binding the contract method 0x05d85c13.
//
// Solidity: function updateValidatorSet(uint256 _newNonce, uint256 _oldNonce, uint256 _newPowerThreshold, bytes32 _newValidatorSetHash, (address,uint256)[] _currentValidatorSet, (uint8,bytes32,bytes32)[] _sigs) returns()
func (_Wrappers *WrappersSession) UpdateValidatorSet(_newNonce *big.Int, _oldNonce *big.Int, _newPowerThreshold *big.Int, _newValidatorSetHash [32]byte, _currentValidatorSet []Validator, _sigs []Signature) (*types.Transaction, error) {
	return _Wrappers.Contract.UpdateValidatorSet(&_Wrappers.TransactOpts, _newNonce, _oldNonce, _newPowerThreshold, _newValidatorSetHash, _currentValidatorSet, _sigs)
}

// UpdateValidatorSet is a paid mutator transaction binding the contract method 0x05d85c13.
//
// Solidity: function updateValidatorSet(uint256 _newNonce, uint256 _oldNonce, uint256 _newPowerThreshold, bytes32 _newValidatorSetHash, (address,uint256)[] _currentValidatorSet, (uint8,bytes32,bytes32)[] _sigs) returns()
func (_Wrappers *WrappersTransactorSession) UpdateValidatorSet(_newNonce *big.Int, _oldNonce *big.Int, _newPowerThreshold *big.Int, _newValidatorSetHash [32]byte, _currentValidatorSet []Validator, _sigs []Signature) (*types.Transaction, error) {
	return _Wrappers.Contract.UpdateValidatorSet(&_Wrappers.TransactOpts, _newNonce, _oldNonce, _newPowerThreshold, _newValidatorSetHash, _currentValidatorSet, _sigs)
}

// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286.
//
// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns()
func (_Wrappers *WrappersTransactor) UpgradeToAndCall(opts *bind.TransactOpts, newImplementation common.Address, data []byte) (*types.Transaction, error) {
	return _Wrappers.contract.Transact(opts, "upgradeToAndCall", newImplementation, data)
}

// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286.
//
// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns()
func (_Wrappers *WrappersSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) {
	return _Wrappers.Contract.UpgradeToAndCall(&_Wrappers.TransactOpts, newImplementation, data)
}

// UpgradeToAndCall is a paid mutator transaction binding the contract method 0x4f1ef286.
//
// Solidity: function upgradeToAndCall(address newImplementation, bytes data) payable returns()
func (_Wrappers *WrappersTransactorSession) UpgradeToAndCall(newImplementation common.Address, data []byte) (*types.Transaction, error) {
	return _Wrappers.Contract.UpgradeToAndCall(&_Wrappers.TransactOpts, newImplementation, data)
}

// WrappersDataRootTupleRootEventIterator is returned from FilterDataRootTupleRootEvent and is used to iterate over the raw logs and unpacked data for DataRootTupleRootEvent events raised by the Wrappers contract.
type WrappersDataRootTupleRootEventIterator struct {
	Event *WrappersDataRootTupleRootEvent // 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 *WrappersDataRootTupleRootEventIterator) 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(WrappersDataRootTupleRootEvent)
			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(WrappersDataRootTupleRootEvent)
		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 *WrappersDataRootTupleRootEventIterator) Error() error {
	return it.fail
}

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

// WrappersDataRootTupleRootEvent represents a DataRootTupleRootEvent event raised by the Wrappers contract.
type WrappersDataRootTupleRootEvent struct {
	Nonce             *big.Int
	DataRootTupleRoot [32]byte
	Raw               types.Log // Blockchain specific contextual infos
}

// FilterDataRootTupleRootEvent is a free log retrieval operation binding the contract event 0x6614d037bde4905e31ca5ff05de61964c267f28b0320ed49e59f7d99752e1c4f.
//
// Solidity: event DataRootTupleRootEvent(uint256 indexed nonce, bytes32 dataRootTupleRoot)
func (_Wrappers *WrappersFilterer) FilterDataRootTupleRootEvent(opts *bind.FilterOpts, nonce []*big.Int) (*WrappersDataRootTupleRootEventIterator, error) {

	var nonceRule []interface{}
	for _, nonceItem := range nonce {
		nonceRule = append(nonceRule, nonceItem)
	}

	logs, sub, err := _Wrappers.contract.FilterLogs(opts, "DataRootTupleRootEvent", nonceRule)
	if err != nil {
		return nil, err
	}
	return &WrappersDataRootTupleRootEventIterator{contract: _Wrappers.contract, event: "DataRootTupleRootEvent", logs: logs, sub: sub}, nil
}

// WatchDataRootTupleRootEvent is a free log subscription operation binding the contract event 0x6614d037bde4905e31ca5ff05de61964c267f28b0320ed49e59f7d99752e1c4f.
//
// Solidity: event DataRootTupleRootEvent(uint256 indexed nonce, bytes32 dataRootTupleRoot)
func (_Wrappers *WrappersFilterer) WatchDataRootTupleRootEvent(opts *bind.WatchOpts, sink chan<- *WrappersDataRootTupleRootEvent, nonce []*big.Int) (event.Subscription, error) {

	var nonceRule []interface{}
	for _, nonceItem := range nonce {
		nonceRule = append(nonceRule, nonceItem)
	}

	logs, sub, err := _Wrappers.contract.WatchLogs(opts, "DataRootTupleRootEvent", nonceRule)
	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(WrappersDataRootTupleRootEvent)
				if err := _Wrappers.contract.UnpackLog(event, "DataRootTupleRootEvent", 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
}

// ParseDataRootTupleRootEvent is a log parse operation binding the contract event 0x6614d037bde4905e31ca5ff05de61964c267f28b0320ed49e59f7d99752e1c4f.
//
// Solidity: event DataRootTupleRootEvent(uint256 indexed nonce, bytes32 dataRootTupleRoot)
func (_Wrappers *WrappersFilterer) ParseDataRootTupleRootEvent(log types.Log) (*WrappersDataRootTupleRootEvent, error) {
	event := new(WrappersDataRootTupleRootEvent)
	if err := _Wrappers.contract.UnpackLog(event, "DataRootTupleRootEvent", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// WrappersInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the Wrappers contract.
type WrappersInitializedIterator struct {
	Event *WrappersInitialized // 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 *WrappersInitializedIterator) 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(WrappersInitialized)
			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(WrappersInitialized)
		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 *WrappersInitializedIterator) Error() error {
	return it.fail
}

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

// WrappersInitialized represents a Initialized event raised by the Wrappers contract.
type WrappersInitialized struct {
	Version uint64
	Raw     types.Log // Blockchain specific contextual infos
}

// FilterInitialized is a free log retrieval operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2.
//
// Solidity: event Initialized(uint64 version)
func (_Wrappers *WrappersFilterer) FilterInitialized(opts *bind.FilterOpts) (*WrappersInitializedIterator, error) {

	logs, sub, err := _Wrappers.contract.FilterLogs(opts, "Initialized")
	if err != nil {
		return nil, err
	}
	return &WrappersInitializedIterator{contract: _Wrappers.contract, event: "Initialized", logs: logs, sub: sub}, nil
}

// WatchInitialized is a free log subscription operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2.
//
// Solidity: event Initialized(uint64 version)
func (_Wrappers *WrappersFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *WrappersInitialized) (event.Subscription, error) {

	logs, sub, err := _Wrappers.contract.WatchLogs(opts, "Initialized")
	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(WrappersInitialized)
				if err := _Wrappers.contract.UnpackLog(event, "Initialized", 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
}

// ParseInitialized is a log parse operation binding the contract event 0xc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2.
//
// Solidity: event Initialized(uint64 version)
func (_Wrappers *WrappersFilterer) ParseInitialized(log types.Log) (*WrappersInitialized, error) {
	event := new(WrappersInitialized)
	if err := _Wrappers.contract.UnpackLog(event, "Initialized", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// WrappersOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the Wrappers contract.
type WrappersOwnershipTransferredIterator struct {
	Event *WrappersOwnershipTransferred // 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 *WrappersOwnershipTransferredIterator) 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(WrappersOwnershipTransferred)
			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(WrappersOwnershipTransferred)
		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 *WrappersOwnershipTransferredIterator) Error() error {
	return it.fail
}

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

// WrappersOwnershipTransferred represents a OwnershipTransferred event raised by the Wrappers contract.
type WrappersOwnershipTransferred struct {
	PreviousOwner common.Address
	NewOwner      common.Address
	Raw           types.Log // Blockchain specific contextual infos
}

// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_Wrappers *WrappersFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*WrappersOwnershipTransferredIterator, error) {

	var previousOwnerRule []interface{}
	for _, previousOwnerItem := range previousOwner {
		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
	}
	var newOwnerRule []interface{}
	for _, newOwnerItem := range newOwner {
		newOwnerRule = append(newOwnerRule, newOwnerItem)
	}

	logs, sub, err := _Wrappers.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
	if err != nil {
		return nil, err
	}
	return &WrappersOwnershipTransferredIterator{contract: _Wrappers.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil
}

// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_Wrappers *WrappersFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *WrappersOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {

	var previousOwnerRule []interface{}
	for _, previousOwnerItem := range previousOwner {
		previousOwnerRule = append(previousOwnerRule, previousOwnerItem)
	}
	var newOwnerRule []interface{}
	for _, newOwnerItem := range newOwner {
		newOwnerRule = append(newOwnerRule, newOwnerItem)
	}

	logs, sub, err := _Wrappers.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule)
	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(WrappersOwnershipTransferred)
				if err := _Wrappers.contract.UnpackLog(event, "OwnershipTransferred", 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
}

// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0.
//
// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
func (_Wrappers *WrappersFilterer) ParseOwnershipTransferred(log types.Log) (*WrappersOwnershipTransferred, error) {
	event := new(WrappersOwnershipTransferred)
	if err := _Wrappers.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// WrappersUpgradedIterator is returned from FilterUpgraded and is used to iterate over the raw logs and unpacked data for Upgraded events raised by the Wrappers contract.
type WrappersUpgradedIterator struct {
	Event *WrappersUpgraded // 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 *WrappersUpgradedIterator) 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(WrappersUpgraded)
			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(WrappersUpgraded)
		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 *WrappersUpgradedIterator) Error() error {
	return it.fail
}

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

// WrappersUpgraded represents a Upgraded event raised by the Wrappers contract.
type WrappersUpgraded struct {
	Implementation common.Address
	Raw            types.Log // Blockchain specific contextual infos
}

// FilterUpgraded is a free log retrieval operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b.
//
// Solidity: event Upgraded(address indexed implementation)
func (_Wrappers *WrappersFilterer) FilterUpgraded(opts *bind.FilterOpts, implementation []common.Address) (*WrappersUpgradedIterator, error) {

	var implementationRule []interface{}
	for _, implementationItem := range implementation {
		implementationRule = append(implementationRule, implementationItem)
	}

	logs, sub, err := _Wrappers.contract.FilterLogs(opts, "Upgraded", implementationRule)
	if err != nil {
		return nil, err
	}
	return &WrappersUpgradedIterator{contract: _Wrappers.contract, event: "Upgraded", logs: logs, sub: sub}, nil
}

// WatchUpgraded is a free log subscription operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b.
//
// Solidity: event Upgraded(address indexed implementation)
func (_Wrappers *WrappersFilterer) WatchUpgraded(opts *bind.WatchOpts, sink chan<- *WrappersUpgraded, implementation []common.Address) (event.Subscription, error) {

	var implementationRule []interface{}
	for _, implementationItem := range implementation {
		implementationRule = append(implementationRule, implementationItem)
	}

	logs, sub, err := _Wrappers.contract.WatchLogs(opts, "Upgraded", implementationRule)
	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(WrappersUpgraded)
				if err := _Wrappers.contract.UnpackLog(event, "Upgraded", 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
}

// ParseUpgraded is a log parse operation binding the contract event 0xbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b.
//
// Solidity: event Upgraded(address indexed implementation)
func (_Wrappers *WrappersFilterer) ParseUpgraded(log types.Log) (*WrappersUpgraded, error) {
	event := new(WrappersUpgraded)
	if err := _Wrappers.contract.UnpackLog(event, "Upgraded", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

// WrappersValidatorSetUpdatedEventIterator is returned from FilterValidatorSetUpdatedEvent and is used to iterate over the raw logs and unpacked data for ValidatorSetUpdatedEvent events raised by the Wrappers contract.
type WrappersValidatorSetUpdatedEventIterator struct {
	Event *WrappersValidatorSetUpdatedEvent // 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 *WrappersValidatorSetUpdatedEventIterator) 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(WrappersValidatorSetUpdatedEvent)
			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(WrappersValidatorSetUpdatedEvent)
		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 *WrappersValidatorSetUpdatedEventIterator) Error() error {
	return it.fail
}

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

// WrappersValidatorSetUpdatedEvent represents a ValidatorSetUpdatedEvent event raised by the Wrappers contract.
type WrappersValidatorSetUpdatedEvent struct {
	Nonce            *big.Int
	PowerThreshold   *big.Int
	ValidatorSetHash [32]byte
	Raw              types.Log // Blockchain specific contextual infos
}

// FilterValidatorSetUpdatedEvent is a free log retrieval operation binding the contract event 0xe55fb3cbbfe29b13c7f8a35ef23127e7df9ab88df16bac166ad254a20f02414c.
//
// Solidity: event ValidatorSetUpdatedEvent(uint256 indexed nonce, uint256 powerThreshold, bytes32 validatorSetHash)
func (_Wrappers *WrappersFilterer) FilterValidatorSetUpdatedEvent(opts *bind.FilterOpts, nonce []*big.Int) (*WrappersValidatorSetUpdatedEventIterator, error) {

	var nonceRule []interface{}
	for _, nonceItem := range nonce {
		nonceRule = append(nonceRule, nonceItem)
	}

	logs, sub, err := _Wrappers.contract.FilterLogs(opts, "ValidatorSetUpdatedEvent", nonceRule)
	if err != nil {
		return nil, err
	}
	return &WrappersValidatorSetUpdatedEventIterator{contract: _Wrappers.contract, event: "ValidatorSetUpdatedEvent", logs: logs, sub: sub}, nil
}

// WatchValidatorSetUpdatedEvent is a free log subscription operation binding the contract event 0xe55fb3cbbfe29b13c7f8a35ef23127e7df9ab88df16bac166ad254a20f02414c.
//
// Solidity: event ValidatorSetUpdatedEvent(uint256 indexed nonce, uint256 powerThreshold, bytes32 validatorSetHash)
func (_Wrappers *WrappersFilterer) WatchValidatorSetUpdatedEvent(opts *bind.WatchOpts, sink chan<- *WrappersValidatorSetUpdatedEvent, nonce []*big.Int) (event.Subscription, error) {

	var nonceRule []interface{}
	for _, nonceItem := range nonce {
		nonceRule = append(nonceRule, nonceItem)
	}

	logs, sub, err := _Wrappers.contract.WatchLogs(opts, "ValidatorSetUpdatedEvent", nonceRule)
	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(WrappersValidatorSetUpdatedEvent)
				if err := _Wrappers.contract.UnpackLog(event, "ValidatorSetUpdatedEvent", 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
}

// ParseValidatorSetUpdatedEvent is a log parse operation binding the contract event 0xe55fb3cbbfe29b13c7f8a35ef23127e7df9ab88df16bac166ad254a20f02414c.
//
// Solidity: event ValidatorSetUpdatedEvent(uint256 indexed nonce, uint256 powerThreshold, bytes32 validatorSetHash)
func (_Wrappers *WrappersFilterer) ParseValidatorSetUpdatedEvent(log types.Log) (*WrappersValidatorSetUpdatedEvent, error) {
	event := new(WrappersValidatorSetUpdatedEvent)
	if err := _Wrappers.contract.UnpackLog(event, "ValidatorSetUpdatedEvent", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}
