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

package uniswapv3

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
)

// IUniswapV3StakerIncentiveKey is an auto generated low-level Go binding around an user-defined struct.
type IUniswapV3StakerIncentiveKey struct {
	RewardToken common.Address
	Pool        common.Address
	StartTime   *big.Int
	EndTime     *big.Int
	Refundee    common.Address
}

// UniswapV3StakerMetaData contains all meta data concerning the UniswapV3Staker contract.
var UniswapV3StakerMetaData = &bind.MetaData{
	ABI: "[{\"inputs\":[{\"internalType\":\"contractIUniswapV3Factory\",\"name\":\"_factory\",\"type\":\"address\"},{\"internalType\":\"contractINonfungiblePositionManager\",\"name\":\"_nonfungiblePositionManager\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_maxIncentiveStartLeadTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_maxIncentiveDuration\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"DepositTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"contractIERC20Minimal\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"contractIUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"refundee\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"IncentiveCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incentiveId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"refund\",\"type\":\"uint256\"}],\"name\":\"IncentiveEnded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"RewardClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incentiveId\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"}],\"name\":\"TokenStaked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"incentiveId\",\"type\":\"bytes32\"}],\"name\":\"TokenUnstaked\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"contractIERC20Minimal\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amountRequested\",\"type\":\"uint256\"}],\"name\":\"claimReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIERC20Minimal\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"contractIUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"refundee\",\"type\":\"address\"}],\"internalType\":\"structIUniswapV3Staker.IncentiveKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"name\":\"createIncentive\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deposits\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint48\",\"name\":\"numberOfStakes\",\"type\":\"uint48\"},{\"internalType\":\"int24\",\"name\":\"tickLower\",\"type\":\"int24\"},{\"internalType\":\"int24\",\"name\":\"tickUpper\",\"type\":\"int24\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIERC20Minimal\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"contractIUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"refundee\",\"type\":\"address\"}],\"internalType\":\"structIUniswapV3Staker.IncentiveKey\",\"name\":\"key\",\"type\":\"tuple\"}],\"name\":\"endIncentive\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"refund\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"factory\",\"outputs\":[{\"internalType\":\"contractIUniswapV3Factory\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIERC20Minimal\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"contractIUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"refundee\",\"type\":\"address\"}],\"internalType\":\"structIUniswapV3Staker.IncentiveKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getRewardInfo\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"},{\"internalType\":\"uint160\",\"name\":\"secondsInsideX128\",\"type\":\"uint160\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"incentives\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalRewardUnclaimed\",\"type\":\"uint256\"},{\"internalType\":\"uint160\",\"name\":\"totalSecondsClaimedX128\",\"type\":\"uint160\"},{\"internalType\":\"uint96\",\"name\":\"numberOfStakes\",\"type\":\"uint96\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxIncentiveDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxIncentiveStartLeadTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"multicall\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"results\",\"type\":\"bytes[]\"}],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonfungiblePositionManager\",\"outputs\":[{\"internalType\":\"contractINonfungiblePositionManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"onERC721Received\",\"outputs\":[{\"internalType\":\"bytes4\",\"name\":\"\",\"type\":\"bytes4\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contractIERC20Minimal\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"rewards\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIERC20Minimal\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"contractIUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"refundee\",\"type\":\"address\"}],\"internalType\":\"structIUniswapV3Staker.IncentiveKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"stakeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"incentiveId\",\"type\":\"bytes32\"}],\"name\":\"stakes\",\"outputs\":[{\"internalType\":\"uint160\",\"name\":\"secondsPerLiquidityInsideInitialX128\",\"type\":\"uint160\"},{\"internalType\":\"uint128\",\"name\":\"liquidity\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"contractIERC20Minimal\",\"name\":\"rewardToken\",\"type\":\"address\"},{\"internalType\":\"contractIUniswapV3Pool\",\"name\":\"pool\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"endTime\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"refundee\",\"type\":\"address\"}],\"internalType\":\"structIUniswapV3Staker.IncentiveKey\",\"name\":\"key\",\"type\":\"tuple\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"unstakeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"withdrawToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]",
	Bin: "0x6101006040523480156200001257600080fd5b5060405162003d2738038062003d2783398101604081905262000035916200005e565b6001600160601b0319606094851b81166080529290931b90911660a05260c05260e052620000c3565b6000806000806080858703121562000074578384fd5b84516200008181620000aa565b60208601519094506200009481620000aa565b6040860151606090960151949790965092505050565b6001600160a01b0381168114620000c057600080fd5b50565b60805160601c60a05160601c60c05160e051613c056200012260003980610bbd5280610cfa5250806103b15280610c595250806103ed52806104525280610b4852806110555280611ad552508061124c5280611ab45250613c056000f3fe6080604052600436106101295760003560e01c8063b02c43d0116100a5578063c45a015511610074578063e70b9e2711610059578063e70b9e271461034f578063f2d2909b1461036f578063f549ab421461038f57610129565b8063c45a01551461030c578063d953186e1461032157610129565b8063b02c43d01461026c578063b44a27221461029c578063b5ada6e4146102be578063c36c1ea5146102de57610129565b80633c423f0b116100fc5780635cc5e3d9116100e15780635cc5e3d9146101fd578063607777951461021d578063ac9650d81461024c57610129565b80633c423f0b146101c85780633dc0714b146101e857610129565b806301b754401461012e578063150b7a021461015957806326bfee04146101865780632f2d783d146101a8575b600080fd5b34801561013a57600080fd5b506101436103af565b60405161015091906139c9565b60405180910390f35b34801561016557600080fd5b5061017961017436600461284f565b6103d3565b6040516101509190612ec4565b34801561019257600080fd5b506101a66101a1366004612bac565b61071c565b005b3480156101b457600080fd5b506101436101c3366004612a56565b61084a565b3480156101d457600080fd5b506101a66101e3366004612bd0565b610928565b3480156101f457600080fd5b50610143610bbb565b34801561020957600080fd5b506101a6610218366004612b82565b610bdf565b34801561022957600080fd5b5061023d610238366004612a06565b610e10565b604051610150939291906139f6565b61025f61025a3660046128e9565b610e67565b6040516101509190612e46565b34801561027857600080fd5b5061028c610287366004612a06565b610fc1565b6040516101509493929190612e05565b3480156102a857600080fd5b506102b1611053565b6040516101509190612ef1565b3480156102ca57600080fd5b506101436102d9366004612b67565b611077565b3480156102ea57600080fd5b506102fe6102f9366004612c62565b6111c5565b604051610150929190613991565b34801561031857600080fd5b506102b161124a565b34801561032d57600080fd5b5061034161033c366004612b82565b61126e565b6040516101509291906139d2565b34801561035b57600080fd5b5061014361036a366004612a1e565b611493565b34801561037b57600080fd5b506101a661038a366004612b82565b6114b0565b34801561039b57600080fd5b506101a66103aa366004612b82565b61151b565b7f000000000000000000000000000000000000000000000000000000000000000081565b60003373ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000161461044d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061386a565b60405180910390fd5b6000807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166399fbab88876040518263ffffffff1660e01b81526004016104a991906139c9565b6101806040518083038186803b1580156104c257600080fd5b505afa1580156104d6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104fa9190612c83565b505050505096509650505050505060405180608001604052808873ffffffffffffffffffffffffffffffffffffffff168152602001600065ffffffffffff1681526020018360020b81526020018260020b8152506001600088815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548165ffffffffffff021916908365ffffffffffff160217905550604082015181600001601a6101000a81548162ffffff021916908360020b62ffffff160217905550606082015181600001601d6101000a81548162ffffff021916908360020b62ffffff1602179055509050508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff16877fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f60405160405180910390a483156106ef5760a08414156106ab576106a66106a085870187612b67565b87611964565b6106ef565b60006106b985870187612958565b905060005b81518110156106ec576106e48282815181106106d657fe5b602002602001015189611964565b6001016106be565b50505b507f150b7a0200000000000000000000000000000000000000000000000000000000979650505050505050565b73ffffffffffffffffffffffffffffffffffffffff8116610769576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613293565b60008281526001602052604090205473ffffffffffffffffffffffffffffffffffffffff163381146107c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612f96565b60008381526001602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff868116918217909255915191929084169186917fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f91a4505050565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600360209081526040808320338452909152902054811580159061088957508082105b156108915750805b73ffffffffffffffffffffffffffffffffffffffff841660009081526003602090815260408083203384529091529020805482900390556108d3848483611ed1565b8273ffffffffffffffffffffffffffffffffffffffff167f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f72418260405161091991906139c9565b60405180910390a29392505050565b73ffffffffffffffffffffffffffffffffffffffff8216301415610978576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906138c7565b6000838152600160209081526040918290208251608081018452905473ffffffffffffffffffffffffffffffffffffffff8116825265ffffffffffff740100000000000000000000000000000000000000008204169282018390527a0100000000000000000000000000000000000000000000000000008104600290810b810b810b948301949094527d0100000000000000000000000000000000000000000000000000000000009004830b830b90920b606083015215610a65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613156565b805173ffffffffffffffffffffffffffffffffffffffff163314610ab5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613591565b6000848152600160205260408082208290558251905173ffffffffffffffffffffffffffffffffffffffff9091169086907fcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f908490a46040517fb88d4fde00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000169063b88d4fde90610b83903090879089908890600401612dbc565b600060405180830381600087803b158015610b9d57600080fd5b505af1158015610bb1573d6000803e3d6000fd5b5050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008111610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906136ce565b8160400151421115610c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906132f0565b7f0000000000000000000000000000000000000000000000000000000000000000428360400151031115610cb7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061372b565b8160600151826040015110610cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906137e7565b7f000000000000000000000000000000000000000000000000000000000000000082604001518360600151031115610d5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613789565b6000610d6783611f55565b60008181526020819052604090208054840190558351909150610d8c90333085611f86565b826020015173ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff167fa876344e28d4b5191ad03bc0d43f740e3695827ab0faccac739930b915ef8b0285604001518660600151876080015187604051610e039493929190613a30565b60405180910390a3505050565b6000602081905290815260409020805460019091015473ffffffffffffffffffffffffffffffffffffffff8116907401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1683565b60608167ffffffffffffffff81118015610e8057600080fd5b50604051908082528060200260200182016040528015610eb457816020015b6060815260200190600190039081610e9f5790505b50905060005b82811015610fba5760008030868685818110610ed257fe5b9050602002810190610ee49190613a61565b604051610ef2929190612dac565b600060405180830381855af49150503d8060008114610f2d576040519150601f19603f3d011682016040523d82523d6000602084013e610f32565b606091505b509150915081610f9857604481511015610f4b57600080fd5b60048101905080806020019051810190610f659190612aef565b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449190612f26565b80848481518110610fa557fe5b60209081029190910101525050600101610eba565b5092915050565b60016020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff81169065ffffffffffff74010000000000000000000000000000000000000000820416907a0100000000000000000000000000000000000000000000000000008104600290810b917d0100000000000000000000000000000000000000000000000000000000009004900b84565b7f000000000000000000000000000000000000000000000000000000000000000081565b600081606001514210156110b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613076565b60006110c283611f55565b6000818152602081905260409020805493509091508261110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490612f39565b60018101547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1615611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906135ee565b6000815583516080850151611186919085611ed1565b817f65124e6175aa9904f40735e87e2a37c76e87a609b855287bb4d1aba8257d9763846040516111b691906139c9565b60405180910390a25050919050565b60008281526002602090815260408083208484529091529020805473ffffffffffffffffffffffffffffffffffffffff8116916bffffffffffffffffffffffff740100000000000000000000000000000000000000009092048216918214156112425760018101546fffffffffffffffffffffffffffffffff1691505b509250929050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600080600061127c85611f55565b905060008061128b86846111c5565b915091506000816fffffffffffffffffffffffffffffffff16116112db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613019565b60008681526001602081815260408084208151608081018352905473ffffffffffffffffffffffffffffffffffffffff80821683527401000000000000000000000000000000000000000080830465ffffffffffff16848701527a0100000000000000000000000000000000000000000000000000008304600290810b810b810b8587019081527d010000000000000000000000000000000000000000000000000000000000909404810b810b900b60608086019182528c8a52898852868a2087519182018852805482529098015480841689890152919091046bffffffffffffffffffffffff1687860152948e01519151945193517fa38807f200000000000000000000000000000000000000000000000000000000815292969491169263a38807f29261140e929190600401612f12565b60606040518083038186803b15801561142657600080fd5b505afa15801561143a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145e9190612a96565b50915050611482826000015183602001518c604001518d60600151888a874261200c565b909b909a5098505050505050505050565b600360209081526000928352604080842090915290825290205481565b60008181526001602052604090205473ffffffffffffffffffffffffffffffffffffffff16331461150d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613671565b6115178282611964565b5050565b6000818152600160209081526040918290208251608081018452905473ffffffffffffffffffffffffffffffffffffffff8116825265ffffffffffff74010000000000000000000000000000000000000000820416928201929092527a0100000000000000000000000000000000000000000000000000008204600290810b810b810b938201939093527d010000000000000000000000000000000000000000000000000000000000909104820b820b90910b60608083019190915283015142101561163157805173ffffffffffffffffffffffffffffffffffffffff163314611631576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061342e565b600061163c84611f55565b905060008061164b85846111c5565b91509150806fffffffffffffffffffffffffffffffff166000141561169c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906130f9565b600083815260208181526040808320888452600180845282852080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff65ffffffffffff740100000000000000000000000000000000000000008084048216830190911681027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9093169290921790925591830180546bffffffffffffffffffffffff848204811690930190921690920273ffffffffffffffffffffffffffffffffffffffff91821617909155928a01518883015160608a015193517fa38807f2000000000000000000000000000000000000000000000000000000008152929594919091169263a38807f2926117b7929190600401612f12565b60606040518083038186803b1580156117cf57600080fd5b505afa1580156117e3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118079190612a96565b508354600185015460408c015160608d0151939550600094508493611848939273ffffffffffffffffffffffffffffffffffffffff169190898b894261200c565b6001860180547fffffffffffffffffffffffff0000000000000000000000000000000000000000811673ffffffffffffffffffffffffffffffffffffffff9182168401821617909155865483900387558c51811660009081526003602090815260408083208e5190941683529281528282208054860190558d8252600281528282208c8352905290812090815591935091506bffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff87161061192a576001810180547fffffffffffffffffffffffffffffffff000000000000000000000000000000001690555b60405188908b907fe1ba67e807ae0efa0a9549f9520ddc15c27f0a4dae2bc045e800ca66a940778f90600090a35050505050505050505050565b81604001514210156119a2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906134b1565b816060015142106119df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613236565b60006119ea83611f55565b600081815260208190526040902054909150611a32576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906133d1565b60008281526002602090815260408083208484529091529020547401000000000000000000000000000000000000000090046bffffffffffffffffffffffff1615611aa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610444906131d9565b600080600080611afa7f00000000000000000000000000000000000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000008861208e565b9350935093509350866020015173ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614611b6b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104449061350e565b6000816fffffffffffffffffffffffffffffffff1611611bb7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161044490613373565b6000868152600160208181526040808420805465ffffffffffff740100000000000000000000000000000000000000008083048216870190911681027fffffffffffff000000000000ffffffffffffffffffffffffffffffffffffffff9092169190911790915589855291849052808420830180546bffffffffffffffffffffffff848204811690950190941690920273ffffffffffffffffffffffffffffffffffffffff93841617909155517fa38807f20000000000000000000000000000000000000000000000000000000081529086169063a38807f290611ca19087908790600401612f12565b60606040518083038186803b158015611cb957600080fd5b505afa158015611ccd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cf19190612a96565b509150506bffffffffffffffffffffffff6fffffffffffffffffffffffffffffffff831610611e0a576040805160608101825273ffffffffffffffffffffffffffffffffffffffff80841682526bffffffffffffffffffffffff60208084018281526fffffffffffffffffffffffffffffffff80891686880190815260008f8152600285528881208f82529094529690922094518554915190931674010000000000000000000000000000000000000000029284167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617909216178255915160019091018054919092167fffffffffffffffffffffffffffffffff00000000000000000000000000000000909116179055611e8e565b6000878152600260209081526040808320898452909152902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8381169190911716740100000000000000000000000000000000000000006bffffffffffffffffffffffff8516021790555b85877f3fe90ccd0a34e28f2b4b7a1e8323415ed9dd595f4eec5dfd461d18c2df336dbd84604051611ebf9190613974565b60405180910390a35050505050505050565b611ef08373ffffffffffffffffffffffffffffffffffffffff16612197565b611f45576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603a815260200180613b81603a913960400191505060405180910390fd5b611f5083838361219d565b505050565b600081604051602001611f689190613924565b6040516020818303038152906040528051906020012090505b919050565b611fa58473ffffffffffffffffffffffffffffffffffffffff16612197565b611ffa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603e815260200180613bbb603e913960400191505060405180910390fd5b61200684848484612379565b50505050565b6000808783101561201957fe5b508383036fffffffffffffffffffffffffffffffff861602600073ffffffffffffffffffffffffffffffffffffffff8a1660808a6120578b8861255e565b03901b03905061207e8b8373ffffffffffffffffffffffffffffffffffffffff1683612577565b9250509850989650505050505050565b60008060008060008060008873ffffffffffffffffffffffffffffffffffffffff166399fbab88896040518263ffffffff1660e01b8152600401808281526020019150506101806040518083038186803b1580156120eb57600080fd5b505afa1580156120ff573d6000803e3d6000fd5b505050506040513d61018081101561211657600080fd5b50604080820151606080840151608085015160a086015160c087015160e0909701518651948501875273ffffffffffffffffffffffffffffffffffffffff80871686528416602086015262ffffff8316968501969096529b50949950929750909550909350909150612189908b90612644565b965050505093509350935093565b3b151590565b6040805173ffffffffffffffffffffffffffffffffffffffff8481166024830152604480830185905283518084039091018152606490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb000000000000000000000000000000000000000000000000000000001781529251825160009485949389169392918291908083835b6020831061227257805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612235565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146122d4576040519150601f19603f3d011682016040523d82523d6000602084013e6122d9565b606091505b5091509150818015612307575080511580612307575080806020019051602081101561230457600080fd5b50515b61237257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600260248201527f5354000000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b5050505050565b6040805173ffffffffffffffffffffffffffffffffffffffff85811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f23b872dd00000000000000000000000000000000000000000000000000000000178152925182516000948594938a169392918291908083835b6020831061245657805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101612419565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146124b8576040519150601f19603f3d011682016040523d82523d6000602084013e6124bd565b606091505b50915091508180156124eb5750805115806124eb57508080602001905160208110156124e857600080fd5b50515b61255657604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600360248201527f5354460000000000000000000000000000000000000000000000000000000000604482015290519081900360640190fd5b505050505050565b60008183101561256e5781612570565b825b9392505050565b600080807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff858709868602925082811090839003039050806125cb57600084116125c057600080fd5b508290049050612570565b8084116125d757600080fd5b6000848688096000868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b6000816020015173ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161061268657600080fd5b508051602080830151604093840151845173ffffffffffffffffffffffffffffffffffffffff94851681850152939091168385015262ffffff166060808401919091528351808403820181526080840185528051908301207fff0000000000000000000000000000000000000000000000000000000000000060a085015294901b7fffffffffffffffffffffffffffffffffffffffff0000000000000000000000001660a183015260b58201939093527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d5808301919091528251808303909101815260f5909101909152805191012090565b8051611f8181613b5b565b8051600281900b8114611f8157600080fd5b600060a082840312156127a8578081fd5b60405160a0810181811067ffffffffffffffff821117156127c557fe5b60405290508082356127d681613b5b565b815260208301356127e681613b5b565b806020830152506040830135604082015260608301356060820152608083013561280f81613b5b565b6080919091015292915050565b80516fffffffffffffffffffffffffffffffff81168114611f8157600080fd5b805162ffffff81168114611f8157600080fd5b600080600080600060808688031215612866578081fd5b853561287181613b5b565b9450602086013561288181613b5b565b935060408601359250606086013567ffffffffffffffff808211156128a4578283fd5b818801915088601f8301126128b7578283fd5b8135818111156128c5578384fd5b8960208285010111156128d6578384fd5b9699959850939650602001949392505050565b600080602083850312156128fb578182fd5b823567ffffffffffffffff80821115612912578384fd5b818501915085601f830112612925578384fd5b813581811115612933578485fd5b8660208083028501011115612946578485fd5b60209290920196919550909350505050565b6000602080838503121561296a578182fd5b823567ffffffffffffffff80821115612981578384fd5b818501915085601f830112612994578384fd5b8135818111156129a057fe5b6129ad8485830201613acb565b818152848101925083850160a0808402860187018a10156129cc578788fd5b8795505b838610156129f8576129e28a83612797565b85526001959095019493860193908101906129d0565b509098975050505050505050565b600060208284031215612a17578081fd5b5035919050565b60008060408385031215612a30578182fd5b8235612a3b81613b5b565b91506020830135612a4b81613b5b565b809150509250929050565b600080600060608486031215612a6a578081fd5b8335612a7581613b5b565b92506020840135612a8581613b5b565b929592945050506040919091013590565b600080600060608486031215612aaa578081fd5b83518060060b8114612aba578182fd5b6020850151909350612acb81613b5b565b604085015190925063ffffffff81168114612ae4578182fd5b809150509250925092565b600060208284031215612b00578081fd5b815167ffffffffffffffff811115612b16578182fd5b8201601f81018413612b26578182fd5b8051612b39612b3482613aef565b613acb565b818152856020838501011115612b4d578384fd5b612b5e826020830160208601613b2f565b95945050505050565b600060a08284031215612b78578081fd5b6125708383612797565b60008060c08385031215612b94578182fd5b612b9e8484612797565b9460a0939093013593505050565b60008060408385031215612bbe578182fd5b823591506020830135612a4b81613b5b565b600080600060608486031215612be4578081fd5b833592506020840135612bf681613b5b565b9150604084013567ffffffffffffffff811115612c11578182fd5b8401601f81018613612c21578182fd5b8035612c2f612b3482613aef565b818152876020838501011115612c43578384fd5b8160208401602083013783602083830101528093505050509250925092565b60008060408385031215612c74578182fd5b50508035926020909101359150565b6000806000806000806000806000806000806101808d8f031215612ca557898afd5b8c516bffffffffffffffffffffffff81168114612cc0578a8bfd5b9b50612cce60208e0161277a565b9a50612cdc60408e0161277a565b9950612cea60608e0161277a565b9850612cf860808e0161283c565b9750612d0660a08e01612785565b9650612d1460c08e01612785565b9550612d2260e08e0161281c565b94506101008d015193506101208d01519250612d416101408e0161281c565b9150612d506101608e0161281c565b90509295989b509295989b509295989b565b60008151808452612d7a816020860160208601613b2f565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6000828483379101908152919050565b600073ffffffffffffffffffffffffffffffffffffffff808716835280861660208401525083604083015260806060830152612dfb6080830184612d62565b9695505050505050565b73ffffffffffffffffffffffffffffffffffffffff94909416845265ffffffffffff929092166020840152600290810b60408401520b606082015260800190565b6000602080830181845280855180835260408601915060408482028701019250838701855b82811015612eb7577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0888603018452612ea5858351612d62565b94509285019290850190600101612e6b565b5092979650505050505050565b7fffffffff0000000000000000000000000000000000000000000000000000000091909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff91909116815260200190565b600292830b8152910b602082015260400190565b6000602082526125706020830184612d62565b60208082526032908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206e60408201527f6f20726566756e6420617661696c61626c650000000000000000000000000000606082015260800190565b60208082526045908201527f556e697377617056335374616b65723a3a7472616e736665724465706f73697460408201527f3a2063616e206f6e6c792062652063616c6c6564206279206465706f7369742060608201527f6f776e6572000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526034908201527f556e697377617056335374616b65723a3a676574526577617264496e666f3a2060408201527f7374616b6520646f6573206e6f74206578697374000000000000000000000000606082015260800190565b60208082526043908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206360408201527f616e6e6f7420656e6420696e63656e74697665206265666f726520656e64207460608201527f696d650000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526033908201527f556e697377617056335374616b65723a3a756e7374616b65546f6b656e3a207360408201527f74616b6520646f6573206e6f7420657869737400000000000000000000000000606082015260800190565b60208082526042908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f63616e6e6f7420776974686472617720746f6b656e207768696c65207374616b60608201527f6564000000000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526031908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20746f6b60408201527f656e20616c7265616479207374616b6564000000000000000000000000000000606082015260800190565b6020808252602c908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20696e6360408201527f656e7469766520656e6465640000000000000000000000000000000000000000606082015260800190565b6020808252603c908201527f556e697377617056335374616b65723a3a7472616e736665724465706f73697460408201527f3a20696e76616c6964207472616e7366657220726563697069656e7400000000606082015260800190565b60208082526049908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a2073746172742074696d65206d757374206265206e6f77206f7220696e207460608201527f6865206675747572650000000000000000000000000000000000000000000000608082015260a00190565b602080825260409082018190527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a2063616e908201527f6e6f74207374616b6520746f6b656e20776974682030206c6971756964697479606082015260800190565b60208082526033908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a206e6f6e60408201527f2d6578697374656e7420696e63656e7469766500000000000000000000000000606082015260800190565b60208082526056908201527f556e697377617056335374616b65723a3a756e7374616b65546f6b656e3a206f60408201527f6e6c79206f776e65722063616e20776974686472617720746f6b656e2062656660608201527f6f726520696e63656e7469766520656e642074696d6500000000000000000000608082015260a00190565b60208082526032908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20696e6360408201527f656e74697665206e6f7420737461727465640000000000000000000000000000606082015260800190565b60208082526041908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a20746f6b60408201527f656e20706f6f6c206973206e6f742074686520696e63656e7469766520706f6f60608201527f6c00000000000000000000000000000000000000000000000000000000000000608082015260a00190565b6020808252603d908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f6f6e6c79206f776e65722063616e20776974686472617720746f6b656e000000606082015260800190565b6020808252604d908201527f556e697377617056335374616b65723a3a656e64496e63656e746976653a206360408201527f616e6e6f7420656e6420696e63656e74697665207768696c65206465706f736960608201527f747320617265207374616b656400000000000000000000000000000000000000608082015260a00190565b60208082526037908201527f556e697377617056335374616b65723a3a7374616b65546f6b656e3a206f6e6c60408201527f79206f776e65722063616e207374616b6520746f6b656e000000000000000000606082015260800190565b60208082526039908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a20726577617264206d75737420626520706f73697469766500000000000000606082015260800190565b602080825260409082018190527f556e697377617056335374616b65723a3a637265617465496e63656e74697665908201527f3a2073746172742074696d6520746f6f2066617220696e746f20667574757265606082015260800190565b602080825260409082018190527f556e697377617056335374616b65723a3a637265617465496e63656e74697665908201527f3a20696e63656e74697665206475726174696f6e20697320746f6f206c6f6e67606082015260800190565b60208082526044908201527f556e697377617056335374616b65723a3a637265617465496e63656e7469766560408201527f3a2073746172742074696d65206d757374206265206265666f726520656e642060608201527f74696d6500000000000000000000000000000000000000000000000000000000608082015260a00190565b60208082526032908201527f556e697377617056335374616b65723a3a6f6e4552433732315265636569766560408201527f643a206e6f74206120756e697633206e66740000000000000000000000000000606082015260800190565b60208082526039908201527f556e697377617056335374616b65723a3a7769746864726177546f6b656e3a2060408201527f63616e6e6f7420776974686472617720746f207374616b657200000000000000606082015260800190565b815173ffffffffffffffffffffffffffffffffffffffff90811682526020808401518216908301526040808401519083015260608084015190830152608092830151169181019190915260a00190565b6fffffffffffffffffffffffffffffffff91909116815260200190565b73ffffffffffffffffffffffffffffffffffffffff9290921682526fffffffffffffffffffffffffffffffff16602082015260400190565b90815260200190565b91825273ffffffffffffffffffffffffffffffffffffffff16602082015260400190565b92835273ffffffffffffffffffffffffffffffffffffffff9190911660208301526bffffffffffffffffffffffff16604082015260600190565b938452602084019290925273ffffffffffffffffffffffffffffffffffffffff166040830152606082015260800190565b60008083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112613a95578283fd5b83018035915067ffffffffffffffff821115613aaf578283fd5b602001915036819003821315613ac457600080fd5b9250929050565b60405181810167ffffffffffffffff81118282101715613ae757fe5b604052919050565b600067ffffffffffffffff821115613b0357fe5b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60005b83811015613b4a578181015183820152602001613b32565b838111156120065750506000910152565b73ffffffffffffffffffffffffffffffffffffffff81168114613b7d57600080fd5b5056fe5472616e7366657248656c706572457874656e6465643a3a736166655472616e736665723a2063616c6c20746f206e6f6e2d636f6e74726163745472616e7366657248656c706572457874656e6465643a3a736166655472616e7366657246726f6d3a2063616c6c20746f206e6f6e2d636f6e7472616374a164736f6c6343000706000a",
}

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

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

// DeployUniswapV3Staker deploys a new Ethereum contract, binding an instance of UniswapV3Staker to it.
func DeployUniswapV3Staker(auth *bind.TransactOpts, backend bind.ContractBackend, _factory common.Address, _nonfungiblePositionManager common.Address, _maxIncentiveStartLeadTime *big.Int, _maxIncentiveDuration *big.Int) (common.Address, *types.Transaction, *UniswapV3Staker, error) {
	parsed, err := UniswapV3StakerMetaData.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(UniswapV3StakerBin), backend, _factory, _nonfungiblePositionManager, _maxIncentiveStartLeadTime, _maxIncentiveDuration)
	if err != nil {
		return common.Address{}, nil, nil, err
	}
	return address, tx, &UniswapV3Staker{UniswapV3StakerCaller: UniswapV3StakerCaller{contract: contract}, UniswapV3StakerTransactor: UniswapV3StakerTransactor{contract: contract}, UniswapV3StakerFilterer: UniswapV3StakerFilterer{contract: contract}}, nil
}

// UniswapV3Staker is an auto generated Go binding around an Ethereum contract.
type UniswapV3Staker struct {
	UniswapV3StakerCaller     // Read-only binding to the contract
	UniswapV3StakerTransactor // Write-only binding to the contract
	UniswapV3StakerFilterer   // Log filterer for contract events
}

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

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

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

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

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

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

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

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

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

// NewUniswapV3Staker creates a new instance of UniswapV3Staker, bound to a specific deployed contract.
func NewUniswapV3Staker(address common.Address, backend bind.ContractBackend) (*UniswapV3Staker, error) {
	contract, err := bindUniswapV3Staker(address, backend, backend, backend)
	if err != nil {
		return nil, err
	}
	return &UniswapV3Staker{UniswapV3StakerCaller: UniswapV3StakerCaller{contract: contract}, UniswapV3StakerTransactor: UniswapV3StakerTransactor{contract: contract}, UniswapV3StakerFilterer: UniswapV3StakerFilterer{contract: contract}}, nil
}

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

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

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

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

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

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

// Deposits is a free data retrieval call binding the contract method 0xb02c43d0.
//
// Solidity: function deposits(uint256 ) view returns(address owner, uint48 numberOfStakes, int24 tickLower, int24 tickUpper)
func (_UniswapV3Staker *UniswapV3StakerCaller) Deposits(opts *bind.CallOpts, arg0 *big.Int) (struct {
	Owner          common.Address
	NumberOfStakes *big.Int
	TickLower      *big.Int
	TickUpper      *big.Int
}, error) {
	var out []interface{}
	err := _UniswapV3Staker.contract.Call(opts, &out, "deposits", arg0)

	outstruct := new(struct {
		Owner          common.Address
		NumberOfStakes *big.Int
		TickLower      *big.Int
		TickUpper      *big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Owner = *abi.ConvertType(out[0], new(common.Address)).(*common.Address)
	outstruct.NumberOfStakes = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
	outstruct.TickLower = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)
	outstruct.TickUpper = *abi.ConvertType(out[3], new(*big.Int)).(**big.Int)

	return *outstruct, err

}

// Deposits is a free data retrieval call binding the contract method 0xb02c43d0.
//
// Solidity: function deposits(uint256 ) view returns(address owner, uint48 numberOfStakes, int24 tickLower, int24 tickUpper)
func (_UniswapV3Staker *UniswapV3StakerSession) Deposits(arg0 *big.Int) (struct {
	Owner          common.Address
	NumberOfStakes *big.Int
	TickLower      *big.Int
	TickUpper      *big.Int
}, error) {
	return _UniswapV3Staker.Contract.Deposits(&_UniswapV3Staker.CallOpts, arg0)
}

// Deposits is a free data retrieval call binding the contract method 0xb02c43d0.
//
// Solidity: function deposits(uint256 ) view returns(address owner, uint48 numberOfStakes, int24 tickLower, int24 tickUpper)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) Deposits(arg0 *big.Int) (struct {
	Owner          common.Address
	NumberOfStakes *big.Int
	TickLower      *big.Int
	TickUpper      *big.Int
}, error) {
	return _UniswapV3Staker.Contract.Deposits(&_UniswapV3Staker.CallOpts, arg0)
}

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

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

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

	return out0, err

}

// Factory is a free data retrieval call binding the contract method 0xc45a0155.
//
// Solidity: function factory() view returns(address)
func (_UniswapV3Staker *UniswapV3StakerSession) Factory() (common.Address, error) {
	return _UniswapV3Staker.Contract.Factory(&_UniswapV3Staker.CallOpts)
}

// Factory is a free data retrieval call binding the contract method 0xc45a0155.
//
// Solidity: function factory() view returns(address)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) Factory() (common.Address, error) {
	return _UniswapV3Staker.Contract.Factory(&_UniswapV3Staker.CallOpts)
}

// GetRewardInfo is a free data retrieval call binding the contract method 0xd953186e.
//
// Solidity: function getRewardInfo((address,address,uint256,uint256,address) key, uint256 tokenId) view returns(uint256 reward, uint160 secondsInsideX128)
func (_UniswapV3Staker *UniswapV3StakerCaller) GetRewardInfo(opts *bind.CallOpts, key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (struct {
	Reward            *big.Int
	SecondsInsideX128 *big.Int
}, error) {
	var out []interface{}
	err := _UniswapV3Staker.contract.Call(opts, &out, "getRewardInfo", key, tokenId)

	outstruct := new(struct {
		Reward            *big.Int
		SecondsInsideX128 *big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.Reward = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	outstruct.SecondsInsideX128 = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)

	return *outstruct, err

}

// GetRewardInfo is a free data retrieval call binding the contract method 0xd953186e.
//
// Solidity: function getRewardInfo((address,address,uint256,uint256,address) key, uint256 tokenId) view returns(uint256 reward, uint160 secondsInsideX128)
func (_UniswapV3Staker *UniswapV3StakerSession) GetRewardInfo(key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (struct {
	Reward            *big.Int
	SecondsInsideX128 *big.Int
}, error) {
	return _UniswapV3Staker.Contract.GetRewardInfo(&_UniswapV3Staker.CallOpts, key, tokenId)
}

// GetRewardInfo is a free data retrieval call binding the contract method 0xd953186e.
//
// Solidity: function getRewardInfo((address,address,uint256,uint256,address) key, uint256 tokenId) view returns(uint256 reward, uint160 secondsInsideX128)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) GetRewardInfo(key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (struct {
	Reward            *big.Int
	SecondsInsideX128 *big.Int
}, error) {
	return _UniswapV3Staker.Contract.GetRewardInfo(&_UniswapV3Staker.CallOpts, key, tokenId)
}

// Incentives is a free data retrieval call binding the contract method 0x60777795.
//
// Solidity: function incentives(bytes32 ) view returns(uint256 totalRewardUnclaimed, uint160 totalSecondsClaimedX128, uint96 numberOfStakes)
func (_UniswapV3Staker *UniswapV3StakerCaller) Incentives(opts *bind.CallOpts, arg0 [32]byte) (struct {
	TotalRewardUnclaimed    *big.Int
	TotalSecondsClaimedX128 *big.Int
	NumberOfStakes          *big.Int
}, error) {
	var out []interface{}
	err := _UniswapV3Staker.contract.Call(opts, &out, "incentives", arg0)

	outstruct := new(struct {
		TotalRewardUnclaimed    *big.Int
		TotalSecondsClaimedX128 *big.Int
		NumberOfStakes          *big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.TotalRewardUnclaimed = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	outstruct.TotalSecondsClaimedX128 = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)
	outstruct.NumberOfStakes = *abi.ConvertType(out[2], new(*big.Int)).(**big.Int)

	return *outstruct, err

}

// Incentives is a free data retrieval call binding the contract method 0x60777795.
//
// Solidity: function incentives(bytes32 ) view returns(uint256 totalRewardUnclaimed, uint160 totalSecondsClaimedX128, uint96 numberOfStakes)
func (_UniswapV3Staker *UniswapV3StakerSession) Incentives(arg0 [32]byte) (struct {
	TotalRewardUnclaimed    *big.Int
	TotalSecondsClaimedX128 *big.Int
	NumberOfStakes          *big.Int
}, error) {
	return _UniswapV3Staker.Contract.Incentives(&_UniswapV3Staker.CallOpts, arg0)
}

// Incentives is a free data retrieval call binding the contract method 0x60777795.
//
// Solidity: function incentives(bytes32 ) view returns(uint256 totalRewardUnclaimed, uint160 totalSecondsClaimedX128, uint96 numberOfStakes)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) Incentives(arg0 [32]byte) (struct {
	TotalRewardUnclaimed    *big.Int
	TotalSecondsClaimedX128 *big.Int
	NumberOfStakes          *big.Int
}, error) {
	return _UniswapV3Staker.Contract.Incentives(&_UniswapV3Staker.CallOpts, arg0)
}

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

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

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

	return out0, err

}

// MaxIncentiveDuration is a free data retrieval call binding the contract method 0x3dc0714b.
//
// Solidity: function maxIncentiveDuration() view returns(uint256)
func (_UniswapV3Staker *UniswapV3StakerSession) MaxIncentiveDuration() (*big.Int, error) {
	return _UniswapV3Staker.Contract.MaxIncentiveDuration(&_UniswapV3Staker.CallOpts)
}

// MaxIncentiveDuration is a free data retrieval call binding the contract method 0x3dc0714b.
//
// Solidity: function maxIncentiveDuration() view returns(uint256)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) MaxIncentiveDuration() (*big.Int, error) {
	return _UniswapV3Staker.Contract.MaxIncentiveDuration(&_UniswapV3Staker.CallOpts)
}

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

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

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

	return out0, err

}

// MaxIncentiveStartLeadTime is a free data retrieval call binding the contract method 0x01b75440.
//
// Solidity: function maxIncentiveStartLeadTime() view returns(uint256)
func (_UniswapV3Staker *UniswapV3StakerSession) MaxIncentiveStartLeadTime() (*big.Int, error) {
	return _UniswapV3Staker.Contract.MaxIncentiveStartLeadTime(&_UniswapV3Staker.CallOpts)
}

// MaxIncentiveStartLeadTime is a free data retrieval call binding the contract method 0x01b75440.
//
// Solidity: function maxIncentiveStartLeadTime() view returns(uint256)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) MaxIncentiveStartLeadTime() (*big.Int, error) {
	return _UniswapV3Staker.Contract.MaxIncentiveStartLeadTime(&_UniswapV3Staker.CallOpts)
}

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

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

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

	return out0, err

}

// NonfungiblePositionManager is a free data retrieval call binding the contract method 0xb44a2722.
//
// Solidity: function nonfungiblePositionManager() view returns(address)
func (_UniswapV3Staker *UniswapV3StakerSession) NonfungiblePositionManager() (common.Address, error) {
	return _UniswapV3Staker.Contract.NonfungiblePositionManager(&_UniswapV3Staker.CallOpts)
}

// NonfungiblePositionManager is a free data retrieval call binding the contract method 0xb44a2722.
//
// Solidity: function nonfungiblePositionManager() view returns(address)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) NonfungiblePositionManager() (common.Address, error) {
	return _UniswapV3Staker.Contract.NonfungiblePositionManager(&_UniswapV3Staker.CallOpts)
}

// Rewards is a free data retrieval call binding the contract method 0xe70b9e27.
//
// Solidity: function rewards(address , address ) view returns(uint256)
func (_UniswapV3Staker *UniswapV3StakerCaller) Rewards(opts *bind.CallOpts, arg0 common.Address, arg1 common.Address) (*big.Int, error) {
	var out []interface{}
	err := _UniswapV3Staker.contract.Call(opts, &out, "rewards", arg0, arg1)

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

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

	return out0, err

}

// Rewards is a free data retrieval call binding the contract method 0xe70b9e27.
//
// Solidity: function rewards(address , address ) view returns(uint256)
func (_UniswapV3Staker *UniswapV3StakerSession) Rewards(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
	return _UniswapV3Staker.Contract.Rewards(&_UniswapV3Staker.CallOpts, arg0, arg1)
}

// Rewards is a free data retrieval call binding the contract method 0xe70b9e27.
//
// Solidity: function rewards(address , address ) view returns(uint256)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) Rewards(arg0 common.Address, arg1 common.Address) (*big.Int, error) {
	return _UniswapV3Staker.Contract.Rewards(&_UniswapV3Staker.CallOpts, arg0, arg1)
}

// Stakes is a free data retrieval call binding the contract method 0xc36c1ea5.
//
// Solidity: function stakes(uint256 tokenId, bytes32 incentiveId) view returns(uint160 secondsPerLiquidityInsideInitialX128, uint128 liquidity)
func (_UniswapV3Staker *UniswapV3StakerCaller) Stakes(opts *bind.CallOpts, tokenId *big.Int, incentiveId [32]byte) (struct {
	SecondsPerLiquidityInsideInitialX128 *big.Int
	Liquidity                            *big.Int
}, error) {
	var out []interface{}
	err := _UniswapV3Staker.contract.Call(opts, &out, "stakes", tokenId, incentiveId)

	outstruct := new(struct {
		SecondsPerLiquidityInsideInitialX128 *big.Int
		Liquidity                            *big.Int
	})
	if err != nil {
		return *outstruct, err
	}

	outstruct.SecondsPerLiquidityInsideInitialX128 = *abi.ConvertType(out[0], new(*big.Int)).(**big.Int)
	outstruct.Liquidity = *abi.ConvertType(out[1], new(*big.Int)).(**big.Int)

	return *outstruct, err

}

// Stakes is a free data retrieval call binding the contract method 0xc36c1ea5.
//
// Solidity: function stakes(uint256 tokenId, bytes32 incentiveId) view returns(uint160 secondsPerLiquidityInsideInitialX128, uint128 liquidity)
func (_UniswapV3Staker *UniswapV3StakerSession) Stakes(tokenId *big.Int, incentiveId [32]byte) (struct {
	SecondsPerLiquidityInsideInitialX128 *big.Int
	Liquidity                            *big.Int
}, error) {
	return _UniswapV3Staker.Contract.Stakes(&_UniswapV3Staker.CallOpts, tokenId, incentiveId)
}

// Stakes is a free data retrieval call binding the contract method 0xc36c1ea5.
//
// Solidity: function stakes(uint256 tokenId, bytes32 incentiveId) view returns(uint160 secondsPerLiquidityInsideInitialX128, uint128 liquidity)
func (_UniswapV3Staker *UniswapV3StakerCallerSession) Stakes(tokenId *big.Int, incentiveId [32]byte) (struct {
	SecondsPerLiquidityInsideInitialX128 *big.Int
	Liquidity                            *big.Int
}, error) {
	return _UniswapV3Staker.Contract.Stakes(&_UniswapV3Staker.CallOpts, tokenId, incentiveId)
}

// ClaimReward is a paid mutator transaction binding the contract method 0x2f2d783d.
//
// Solidity: function claimReward(address rewardToken, address to, uint256 amountRequested) returns(uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerTransactor) ClaimReward(opts *bind.TransactOpts, rewardToken common.Address, to common.Address, amountRequested *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "claimReward", rewardToken, to, amountRequested)
}

// ClaimReward is a paid mutator transaction binding the contract method 0x2f2d783d.
//
// Solidity: function claimReward(address rewardToken, address to, uint256 amountRequested) returns(uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerSession) ClaimReward(rewardToken common.Address, to common.Address, amountRequested *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.ClaimReward(&_UniswapV3Staker.TransactOpts, rewardToken, to, amountRequested)
}

// ClaimReward is a paid mutator transaction binding the contract method 0x2f2d783d.
//
// Solidity: function claimReward(address rewardToken, address to, uint256 amountRequested) returns(uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) ClaimReward(rewardToken common.Address, to common.Address, amountRequested *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.ClaimReward(&_UniswapV3Staker.TransactOpts, rewardToken, to, amountRequested)
}

// CreateIncentive is a paid mutator transaction binding the contract method 0x5cc5e3d9.
//
// Solidity: function createIncentive((address,address,uint256,uint256,address) key, uint256 reward) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactor) CreateIncentive(opts *bind.TransactOpts, key IUniswapV3StakerIncentiveKey, reward *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "createIncentive", key, reward)
}

// CreateIncentive is a paid mutator transaction binding the contract method 0x5cc5e3d9.
//
// Solidity: function createIncentive((address,address,uint256,uint256,address) key, uint256 reward) returns()
func (_UniswapV3Staker *UniswapV3StakerSession) CreateIncentive(key IUniswapV3StakerIncentiveKey, reward *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.CreateIncentive(&_UniswapV3Staker.TransactOpts, key, reward)
}

// CreateIncentive is a paid mutator transaction binding the contract method 0x5cc5e3d9.
//
// Solidity: function createIncentive((address,address,uint256,uint256,address) key, uint256 reward) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) CreateIncentive(key IUniswapV3StakerIncentiveKey, reward *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.CreateIncentive(&_UniswapV3Staker.TransactOpts, key, reward)
}

// EndIncentive is a paid mutator transaction binding the contract method 0xb5ada6e4.
//
// Solidity: function endIncentive((address,address,uint256,uint256,address) key) returns(uint256 refund)
func (_UniswapV3Staker *UniswapV3StakerTransactor) EndIncentive(opts *bind.TransactOpts, key IUniswapV3StakerIncentiveKey) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "endIncentive", key)
}

// EndIncentive is a paid mutator transaction binding the contract method 0xb5ada6e4.
//
// Solidity: function endIncentive((address,address,uint256,uint256,address) key) returns(uint256 refund)
func (_UniswapV3Staker *UniswapV3StakerSession) EndIncentive(key IUniswapV3StakerIncentiveKey) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.EndIncentive(&_UniswapV3Staker.TransactOpts, key)
}

// EndIncentive is a paid mutator transaction binding the contract method 0xb5ada6e4.
//
// Solidity: function endIncentive((address,address,uint256,uint256,address) key) returns(uint256 refund)
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) EndIncentive(key IUniswapV3StakerIncentiveKey) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.EndIncentive(&_UniswapV3Staker.TransactOpts, key)
}

// Multicall is a paid mutator transaction binding the contract method 0xac9650d8.
//
// Solidity: function multicall(bytes[] data) payable returns(bytes[] results)
func (_UniswapV3Staker *UniswapV3StakerTransactor) Multicall(opts *bind.TransactOpts, data [][]byte) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "multicall", data)
}

// Multicall is a paid mutator transaction binding the contract method 0xac9650d8.
//
// Solidity: function multicall(bytes[] data) payable returns(bytes[] results)
func (_UniswapV3Staker *UniswapV3StakerSession) Multicall(data [][]byte) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.Multicall(&_UniswapV3Staker.TransactOpts, data)
}

// Multicall is a paid mutator transaction binding the contract method 0xac9650d8.
//
// Solidity: function multicall(bytes[] data) payable returns(bytes[] results)
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) Multicall(data [][]byte) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.Multicall(&_UniswapV3Staker.TransactOpts, data)
}

// OnERC721Received is a paid mutator transaction binding the contract method 0x150b7a02.
//
// Solidity: function onERC721Received(address , address from, uint256 tokenId, bytes data) returns(bytes4)
func (_UniswapV3Staker *UniswapV3StakerTransactor) OnERC721Received(opts *bind.TransactOpts, arg0 common.Address, from common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "onERC721Received", arg0, from, tokenId, data)
}

// OnERC721Received is a paid mutator transaction binding the contract method 0x150b7a02.
//
// Solidity: function onERC721Received(address , address from, uint256 tokenId, bytes data) returns(bytes4)
func (_UniswapV3Staker *UniswapV3StakerSession) OnERC721Received(arg0 common.Address, from common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.OnERC721Received(&_UniswapV3Staker.TransactOpts, arg0, from, tokenId, data)
}

// OnERC721Received is a paid mutator transaction binding the contract method 0x150b7a02.
//
// Solidity: function onERC721Received(address , address from, uint256 tokenId, bytes data) returns(bytes4)
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) OnERC721Received(arg0 common.Address, from common.Address, tokenId *big.Int, data []byte) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.OnERC721Received(&_UniswapV3Staker.TransactOpts, arg0, from, tokenId, data)
}

// StakeToken is a paid mutator transaction binding the contract method 0xf2d2909b.
//
// Solidity: function stakeToken((address,address,uint256,uint256,address) key, uint256 tokenId) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactor) StakeToken(opts *bind.TransactOpts, key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "stakeToken", key, tokenId)
}

// StakeToken is a paid mutator transaction binding the contract method 0xf2d2909b.
//
// Solidity: function stakeToken((address,address,uint256,uint256,address) key, uint256 tokenId) returns()
func (_UniswapV3Staker *UniswapV3StakerSession) StakeToken(key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.StakeToken(&_UniswapV3Staker.TransactOpts, key, tokenId)
}

// StakeToken is a paid mutator transaction binding the contract method 0xf2d2909b.
//
// Solidity: function stakeToken((address,address,uint256,uint256,address) key, uint256 tokenId) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) StakeToken(key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.StakeToken(&_UniswapV3Staker.TransactOpts, key, tokenId)
}

// TransferDeposit is a paid mutator transaction binding the contract method 0x26bfee04.
//
// Solidity: function transferDeposit(uint256 tokenId, address to) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactor) TransferDeposit(opts *bind.TransactOpts, tokenId *big.Int, to common.Address) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "transferDeposit", tokenId, to)
}

// TransferDeposit is a paid mutator transaction binding the contract method 0x26bfee04.
//
// Solidity: function transferDeposit(uint256 tokenId, address to) returns()
func (_UniswapV3Staker *UniswapV3StakerSession) TransferDeposit(tokenId *big.Int, to common.Address) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.TransferDeposit(&_UniswapV3Staker.TransactOpts, tokenId, to)
}

// TransferDeposit is a paid mutator transaction binding the contract method 0x26bfee04.
//
// Solidity: function transferDeposit(uint256 tokenId, address to) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) TransferDeposit(tokenId *big.Int, to common.Address) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.TransferDeposit(&_UniswapV3Staker.TransactOpts, tokenId, to)
}

// UnstakeToken is a paid mutator transaction binding the contract method 0xf549ab42.
//
// Solidity: function unstakeToken((address,address,uint256,uint256,address) key, uint256 tokenId) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactor) UnstakeToken(opts *bind.TransactOpts, key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "unstakeToken", key, tokenId)
}

// UnstakeToken is a paid mutator transaction binding the contract method 0xf549ab42.
//
// Solidity: function unstakeToken((address,address,uint256,uint256,address) key, uint256 tokenId) returns()
func (_UniswapV3Staker *UniswapV3StakerSession) UnstakeToken(key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.UnstakeToken(&_UniswapV3Staker.TransactOpts, key, tokenId)
}

// UnstakeToken is a paid mutator transaction binding the contract method 0xf549ab42.
//
// Solidity: function unstakeToken((address,address,uint256,uint256,address) key, uint256 tokenId) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) UnstakeToken(key IUniswapV3StakerIncentiveKey, tokenId *big.Int) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.UnstakeToken(&_UniswapV3Staker.TransactOpts, key, tokenId)
}

// WithdrawToken is a paid mutator transaction binding the contract method 0x3c423f0b.
//
// Solidity: function withdrawToken(uint256 tokenId, address to, bytes data) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactor) WithdrawToken(opts *bind.TransactOpts, tokenId *big.Int, to common.Address, data []byte) (*types.Transaction, error) {
	return _UniswapV3Staker.contract.Transact(opts, "withdrawToken", tokenId, to, data)
}

// WithdrawToken is a paid mutator transaction binding the contract method 0x3c423f0b.
//
// Solidity: function withdrawToken(uint256 tokenId, address to, bytes data) returns()
func (_UniswapV3Staker *UniswapV3StakerSession) WithdrawToken(tokenId *big.Int, to common.Address, data []byte) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.WithdrawToken(&_UniswapV3Staker.TransactOpts, tokenId, to, data)
}

// WithdrawToken is a paid mutator transaction binding the contract method 0x3c423f0b.
//
// Solidity: function withdrawToken(uint256 tokenId, address to, bytes data) returns()
func (_UniswapV3Staker *UniswapV3StakerTransactorSession) WithdrawToken(tokenId *big.Int, to common.Address, data []byte) (*types.Transaction, error) {
	return _UniswapV3Staker.Contract.WithdrawToken(&_UniswapV3Staker.TransactOpts, tokenId, to, data)
}

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

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

// UniswapV3StakerDepositTransferred represents a DepositTransferred event raised by the UniswapV3Staker contract.
type UniswapV3StakerDepositTransferred struct {
	TokenId  *big.Int
	OldOwner common.Address
	NewOwner common.Address
	Raw      types.Log // Blockchain specific contextual infos
}

// FilterDepositTransferred is a free log retrieval operation binding the contract event 0xcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f.
//
// Solidity: event DepositTransferred(uint256 indexed tokenId, address indexed oldOwner, address indexed newOwner)
func (_UniswapV3Staker *UniswapV3StakerFilterer) FilterDepositTransferred(opts *bind.FilterOpts, tokenId []*big.Int, oldOwner []common.Address, newOwner []common.Address) (*UniswapV3StakerDepositTransferredIterator, error) {

	var tokenIdRule []interface{}
	for _, tokenIdItem := range tokenId {
		tokenIdRule = append(tokenIdRule, tokenIdItem)
	}
	var oldOwnerRule []interface{}
	for _, oldOwnerItem := range oldOwner {
		oldOwnerRule = append(oldOwnerRule, oldOwnerItem)
	}
	var newOwnerRule []interface{}
	for _, newOwnerItem := range newOwner {
		newOwnerRule = append(newOwnerRule, newOwnerItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.FilterLogs(opts, "DepositTransferred", tokenIdRule, oldOwnerRule, newOwnerRule)
	if err != nil {
		return nil, err
	}
	return &UniswapV3StakerDepositTransferredIterator{contract: _UniswapV3Staker.contract, event: "DepositTransferred", logs: logs, sub: sub}, nil
}

// WatchDepositTransferred is a free log subscription operation binding the contract event 0xcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f.
//
// Solidity: event DepositTransferred(uint256 indexed tokenId, address indexed oldOwner, address indexed newOwner)
func (_UniswapV3Staker *UniswapV3StakerFilterer) WatchDepositTransferred(opts *bind.WatchOpts, sink chan<- *UniswapV3StakerDepositTransferred, tokenId []*big.Int, oldOwner []common.Address, newOwner []common.Address) (event.Subscription, error) {

	var tokenIdRule []interface{}
	for _, tokenIdItem := range tokenId {
		tokenIdRule = append(tokenIdRule, tokenIdItem)
	}
	var oldOwnerRule []interface{}
	for _, oldOwnerItem := range oldOwner {
		oldOwnerRule = append(oldOwnerRule, oldOwnerItem)
	}
	var newOwnerRule []interface{}
	for _, newOwnerItem := range newOwner {
		newOwnerRule = append(newOwnerRule, newOwnerItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.WatchLogs(opts, "DepositTransferred", tokenIdRule, oldOwnerRule, 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(UniswapV3StakerDepositTransferred)
				if err := _UniswapV3Staker.contract.UnpackLog(event, "DepositTransferred", 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
}

// ParseDepositTransferred is a log parse operation binding the contract event 0xcdfc765b85e1048bee3c6a0f9d1c91fc7c4631f5fe5745a55fc6843db5c3260f.
//
// Solidity: event DepositTransferred(uint256 indexed tokenId, address indexed oldOwner, address indexed newOwner)
func (_UniswapV3Staker *UniswapV3StakerFilterer) ParseDepositTransferred(log types.Log) (*UniswapV3StakerDepositTransferred, error) {
	event := new(UniswapV3StakerDepositTransferred)
	if err := _UniswapV3Staker.contract.UnpackLog(event, "DepositTransferred", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

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

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

// UniswapV3StakerIncentiveCreated represents a IncentiveCreated event raised by the UniswapV3Staker contract.
type UniswapV3StakerIncentiveCreated struct {
	RewardToken common.Address
	Pool        common.Address
	StartTime   *big.Int
	EndTime     *big.Int
	Refundee    common.Address
	Reward      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}

// FilterIncentiveCreated is a free log retrieval operation binding the contract event 0xa876344e28d4b5191ad03bc0d43f740e3695827ab0faccac739930b915ef8b02.
//
// Solidity: event IncentiveCreated(address indexed rewardToken, address indexed pool, uint256 startTime, uint256 endTime, address refundee, uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerFilterer) FilterIncentiveCreated(opts *bind.FilterOpts, rewardToken []common.Address, pool []common.Address) (*UniswapV3StakerIncentiveCreatedIterator, error) {

	var rewardTokenRule []interface{}
	for _, rewardTokenItem := range rewardToken {
		rewardTokenRule = append(rewardTokenRule, rewardTokenItem)
	}
	var poolRule []interface{}
	for _, poolItem := range pool {
		poolRule = append(poolRule, poolItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.FilterLogs(opts, "IncentiveCreated", rewardTokenRule, poolRule)
	if err != nil {
		return nil, err
	}
	return &UniswapV3StakerIncentiveCreatedIterator{contract: _UniswapV3Staker.contract, event: "IncentiveCreated", logs: logs, sub: sub}, nil
}

// WatchIncentiveCreated is a free log subscription operation binding the contract event 0xa876344e28d4b5191ad03bc0d43f740e3695827ab0faccac739930b915ef8b02.
//
// Solidity: event IncentiveCreated(address indexed rewardToken, address indexed pool, uint256 startTime, uint256 endTime, address refundee, uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerFilterer) WatchIncentiveCreated(opts *bind.WatchOpts, sink chan<- *UniswapV3StakerIncentiveCreated, rewardToken []common.Address, pool []common.Address) (event.Subscription, error) {

	var rewardTokenRule []interface{}
	for _, rewardTokenItem := range rewardToken {
		rewardTokenRule = append(rewardTokenRule, rewardTokenItem)
	}
	var poolRule []interface{}
	for _, poolItem := range pool {
		poolRule = append(poolRule, poolItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.WatchLogs(opts, "IncentiveCreated", rewardTokenRule, poolRule)
	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(UniswapV3StakerIncentiveCreated)
				if err := _UniswapV3Staker.contract.UnpackLog(event, "IncentiveCreated", 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
}

// ParseIncentiveCreated is a log parse operation binding the contract event 0xa876344e28d4b5191ad03bc0d43f740e3695827ab0faccac739930b915ef8b02.
//
// Solidity: event IncentiveCreated(address indexed rewardToken, address indexed pool, uint256 startTime, uint256 endTime, address refundee, uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerFilterer) ParseIncentiveCreated(log types.Log) (*UniswapV3StakerIncentiveCreated, error) {
	event := new(UniswapV3StakerIncentiveCreated)
	if err := _UniswapV3Staker.contract.UnpackLog(event, "IncentiveCreated", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

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

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

// UniswapV3StakerIncentiveEnded represents a IncentiveEnded event raised by the UniswapV3Staker contract.
type UniswapV3StakerIncentiveEnded struct {
	IncentiveId [32]byte
	Refund      *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}

// FilterIncentiveEnded is a free log retrieval operation binding the contract event 0x65124e6175aa9904f40735e87e2a37c76e87a609b855287bb4d1aba8257d9763.
//
// Solidity: event IncentiveEnded(bytes32 indexed incentiveId, uint256 refund)
func (_UniswapV3Staker *UniswapV3StakerFilterer) FilterIncentiveEnded(opts *bind.FilterOpts, incentiveId [][32]byte) (*UniswapV3StakerIncentiveEndedIterator, error) {

	var incentiveIdRule []interface{}
	for _, incentiveIdItem := range incentiveId {
		incentiveIdRule = append(incentiveIdRule, incentiveIdItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.FilterLogs(opts, "IncentiveEnded", incentiveIdRule)
	if err != nil {
		return nil, err
	}
	return &UniswapV3StakerIncentiveEndedIterator{contract: _UniswapV3Staker.contract, event: "IncentiveEnded", logs: logs, sub: sub}, nil
}

// WatchIncentiveEnded is a free log subscription operation binding the contract event 0x65124e6175aa9904f40735e87e2a37c76e87a609b855287bb4d1aba8257d9763.
//
// Solidity: event IncentiveEnded(bytes32 indexed incentiveId, uint256 refund)
func (_UniswapV3Staker *UniswapV3StakerFilterer) WatchIncentiveEnded(opts *bind.WatchOpts, sink chan<- *UniswapV3StakerIncentiveEnded, incentiveId [][32]byte) (event.Subscription, error) {

	var incentiveIdRule []interface{}
	for _, incentiveIdItem := range incentiveId {
		incentiveIdRule = append(incentiveIdRule, incentiveIdItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.WatchLogs(opts, "IncentiveEnded", incentiveIdRule)
	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(UniswapV3StakerIncentiveEnded)
				if err := _UniswapV3Staker.contract.UnpackLog(event, "IncentiveEnded", 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
}

// ParseIncentiveEnded is a log parse operation binding the contract event 0x65124e6175aa9904f40735e87e2a37c76e87a609b855287bb4d1aba8257d9763.
//
// Solidity: event IncentiveEnded(bytes32 indexed incentiveId, uint256 refund)
func (_UniswapV3Staker *UniswapV3StakerFilterer) ParseIncentiveEnded(log types.Log) (*UniswapV3StakerIncentiveEnded, error) {
	event := new(UniswapV3StakerIncentiveEnded)
	if err := _UniswapV3Staker.contract.UnpackLog(event, "IncentiveEnded", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

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

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

// UniswapV3StakerRewardClaimed represents a RewardClaimed event raised by the UniswapV3Staker contract.
type UniswapV3StakerRewardClaimed struct {
	To     common.Address
	Reward *big.Int
	Raw    types.Log // Blockchain specific contextual infos
}

// FilterRewardClaimed is a free log retrieval operation binding the contract event 0x106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241.
//
// Solidity: event RewardClaimed(address indexed to, uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerFilterer) FilterRewardClaimed(opts *bind.FilterOpts, to []common.Address) (*UniswapV3StakerRewardClaimedIterator, error) {

	var toRule []interface{}
	for _, toItem := range to {
		toRule = append(toRule, toItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.FilterLogs(opts, "RewardClaimed", toRule)
	if err != nil {
		return nil, err
	}
	return &UniswapV3StakerRewardClaimedIterator{contract: _UniswapV3Staker.contract, event: "RewardClaimed", logs: logs, sub: sub}, nil
}

// WatchRewardClaimed is a free log subscription operation binding the contract event 0x106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241.
//
// Solidity: event RewardClaimed(address indexed to, uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerFilterer) WatchRewardClaimed(opts *bind.WatchOpts, sink chan<- *UniswapV3StakerRewardClaimed, to []common.Address) (event.Subscription, error) {

	var toRule []interface{}
	for _, toItem := range to {
		toRule = append(toRule, toItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.WatchLogs(opts, "RewardClaimed", toRule)
	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(UniswapV3StakerRewardClaimed)
				if err := _UniswapV3Staker.contract.UnpackLog(event, "RewardClaimed", 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
}

// ParseRewardClaimed is a log parse operation binding the contract event 0x106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241.
//
// Solidity: event RewardClaimed(address indexed to, uint256 reward)
func (_UniswapV3Staker *UniswapV3StakerFilterer) ParseRewardClaimed(log types.Log) (*UniswapV3StakerRewardClaimed, error) {
	event := new(UniswapV3StakerRewardClaimed)
	if err := _UniswapV3Staker.contract.UnpackLog(event, "RewardClaimed", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

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

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

// UniswapV3StakerTokenStaked represents a TokenStaked event raised by the UniswapV3Staker contract.
type UniswapV3StakerTokenStaked struct {
	TokenId     *big.Int
	IncentiveId [32]byte
	Liquidity   *big.Int
	Raw         types.Log // Blockchain specific contextual infos
}

// FilterTokenStaked is a free log retrieval operation binding the contract event 0x3fe90ccd0a34e28f2b4b7a1e8323415ed9dd595f4eec5dfd461d18c2df336dbd.
//
// Solidity: event TokenStaked(uint256 indexed tokenId, bytes32 indexed incentiveId, uint128 liquidity)
func (_UniswapV3Staker *UniswapV3StakerFilterer) FilterTokenStaked(opts *bind.FilterOpts, tokenId []*big.Int, incentiveId [][32]byte) (*UniswapV3StakerTokenStakedIterator, error) {

	var tokenIdRule []interface{}
	for _, tokenIdItem := range tokenId {
		tokenIdRule = append(tokenIdRule, tokenIdItem)
	}
	var incentiveIdRule []interface{}
	for _, incentiveIdItem := range incentiveId {
		incentiveIdRule = append(incentiveIdRule, incentiveIdItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.FilterLogs(opts, "TokenStaked", tokenIdRule, incentiveIdRule)
	if err != nil {
		return nil, err
	}
	return &UniswapV3StakerTokenStakedIterator{contract: _UniswapV3Staker.contract, event: "TokenStaked", logs: logs, sub: sub}, nil
}

// WatchTokenStaked is a free log subscription operation binding the contract event 0x3fe90ccd0a34e28f2b4b7a1e8323415ed9dd595f4eec5dfd461d18c2df336dbd.
//
// Solidity: event TokenStaked(uint256 indexed tokenId, bytes32 indexed incentiveId, uint128 liquidity)
func (_UniswapV3Staker *UniswapV3StakerFilterer) WatchTokenStaked(opts *bind.WatchOpts, sink chan<- *UniswapV3StakerTokenStaked, tokenId []*big.Int, incentiveId [][32]byte) (event.Subscription, error) {

	var tokenIdRule []interface{}
	for _, tokenIdItem := range tokenId {
		tokenIdRule = append(tokenIdRule, tokenIdItem)
	}
	var incentiveIdRule []interface{}
	for _, incentiveIdItem := range incentiveId {
		incentiveIdRule = append(incentiveIdRule, incentiveIdItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.WatchLogs(opts, "TokenStaked", tokenIdRule, incentiveIdRule)
	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(UniswapV3StakerTokenStaked)
				if err := _UniswapV3Staker.contract.UnpackLog(event, "TokenStaked", 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
}

// ParseTokenStaked is a log parse operation binding the contract event 0x3fe90ccd0a34e28f2b4b7a1e8323415ed9dd595f4eec5dfd461d18c2df336dbd.
//
// Solidity: event TokenStaked(uint256 indexed tokenId, bytes32 indexed incentiveId, uint128 liquidity)
func (_UniswapV3Staker *UniswapV3StakerFilterer) ParseTokenStaked(log types.Log) (*UniswapV3StakerTokenStaked, error) {
	event := new(UniswapV3StakerTokenStaked)
	if err := _UniswapV3Staker.contract.UnpackLog(event, "TokenStaked", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}

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

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

// UniswapV3StakerTokenUnstaked represents a TokenUnstaked event raised by the UniswapV3Staker contract.
type UniswapV3StakerTokenUnstaked struct {
	TokenId     *big.Int
	IncentiveId [32]byte
	Raw         types.Log // Blockchain specific contextual infos
}

// FilterTokenUnstaked is a free log retrieval operation binding the contract event 0xe1ba67e807ae0efa0a9549f9520ddc15c27f0a4dae2bc045e800ca66a940778f.
//
// Solidity: event TokenUnstaked(uint256 indexed tokenId, bytes32 indexed incentiveId)
func (_UniswapV3Staker *UniswapV3StakerFilterer) FilterTokenUnstaked(opts *bind.FilterOpts, tokenId []*big.Int, incentiveId [][32]byte) (*UniswapV3StakerTokenUnstakedIterator, error) {

	var tokenIdRule []interface{}
	for _, tokenIdItem := range tokenId {
		tokenIdRule = append(tokenIdRule, tokenIdItem)
	}
	var incentiveIdRule []interface{}
	for _, incentiveIdItem := range incentiveId {
		incentiveIdRule = append(incentiveIdRule, incentiveIdItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.FilterLogs(opts, "TokenUnstaked", tokenIdRule, incentiveIdRule)
	if err != nil {
		return nil, err
	}
	return &UniswapV3StakerTokenUnstakedIterator{contract: _UniswapV3Staker.contract, event: "TokenUnstaked", logs: logs, sub: sub}, nil
}

// WatchTokenUnstaked is a free log subscription operation binding the contract event 0xe1ba67e807ae0efa0a9549f9520ddc15c27f0a4dae2bc045e800ca66a940778f.
//
// Solidity: event TokenUnstaked(uint256 indexed tokenId, bytes32 indexed incentiveId)
func (_UniswapV3Staker *UniswapV3StakerFilterer) WatchTokenUnstaked(opts *bind.WatchOpts, sink chan<- *UniswapV3StakerTokenUnstaked, tokenId []*big.Int, incentiveId [][32]byte) (event.Subscription, error) {

	var tokenIdRule []interface{}
	for _, tokenIdItem := range tokenId {
		tokenIdRule = append(tokenIdRule, tokenIdItem)
	}
	var incentiveIdRule []interface{}
	for _, incentiveIdItem := range incentiveId {
		incentiveIdRule = append(incentiveIdRule, incentiveIdItem)
	}

	logs, sub, err := _UniswapV3Staker.contract.WatchLogs(opts, "TokenUnstaked", tokenIdRule, incentiveIdRule)
	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(UniswapV3StakerTokenUnstaked)
				if err := _UniswapV3Staker.contract.UnpackLog(event, "TokenUnstaked", 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
}

// ParseTokenUnstaked is a log parse operation binding the contract event 0xe1ba67e807ae0efa0a9549f9520ddc15c27f0a4dae2bc045e800ca66a940778f.
//
// Solidity: event TokenUnstaked(uint256 indexed tokenId, bytes32 indexed incentiveId)
func (_UniswapV3Staker *UniswapV3StakerFilterer) ParseTokenUnstaked(log types.Log) (*UniswapV3StakerTokenUnstaked, error) {
	event := new(UniswapV3StakerTokenUnstaked)
	if err := _UniswapV3Staker.contract.UnpackLog(event, "TokenUnstaked", log); err != nil {
		return nil, err
	}
	event.Raw = log
	return event, nil
}
