144 txs
936 calls
constructor
constructor(uint32 _startTimestamp, address _shaolin, address _weth, (address _v3Router, address _v3Factory, address _owner) _params)
functions
balanceOf
viewfunction balanceOf(address owner) view returns (uint256)
batchClaimableAmount
viewfunction batchClaimableAmount(uint256[] _ids) view returns (uint256 toClaim)
convertShaolinToShares
purefunction convertShaolinToShares(uint256 _amount, uint32 _duration) pure returns (uint256 shares)
getApproved
viewfunction getApproved(uint256 tokenId) view returns (address)
getTwapAmount
viewfunction getTwapAmount(address tokenIn, address tokenOut, uint24 poolTier, uint256 amount) view returns (uint256 twapAmount, uint224 slippage)
isApprovedForAll
viewfunction isApprovedForAll(address owner, address operator) view returns (bool)
isApprovedOrOwner
viewfunction isApprovedOrOwner(uint256 _tokenId, address _spender) view
lastDistributedDay
viewfunction lastDistributedDay() view returns (uint32)
MAX_DURATION
viewfunction MAX_DURATION() view returns (uint32)
MIN_DURATION
viewfunction MIN_DURATION() view returns (uint32)
name
viewfunction name() view returns (string)
owner
viewfunction owner() view returns (address)
ownerOf
viewfunction ownerOf(uint256 tokenId) view returns (address)
pendingOwner
viewfunction pendingOwner() view returns (address)
rewardPerShare
viewfunction rewardPerShare() view returns (uint256)
shaolin
viewfunction shaolin() view returns (address)
slippageAdmin
viewfunction slippageAdmin() view returns (address)
slippageConfigs
viewfunction slippageConfigs(address pool) view returns (uint224 slippage, uint32 twapLookback)
startTimestamp
viewfunction startTimestamp() view returns (uint32)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
symbol
viewfunction symbol() view returns (string)
toDistribute
viewfunction toDistribute(uint8) view returns (uint256)
tokenId
viewfunction tokenId() view returns (uint96)
tokenURI
viewfunction tokenURI(uint256 tokenId) view returns (string)
totalShares
viewfunction totalShares() view returns (uint256)
uniswapV3Router
viewfunction uniswapV3Router() view returns (address)
userRecords
viewfunction userRecords(uint256 id) view returns (uint256 shares, uint256 lockedShaolin, uint256 rewardDebt, uint32 endTime)
userShares
viewfunction userShares(address user) view returns (uint256 totalShares)
v3Factory
viewfunction v3Factory() view returns (address)
weth
viewfunction weth() view returns (address)
acceptOwnership
nonpayablefunction acceptOwnership()
approve
nonpayablefunction approve(address to, uint256 tokenId)
batchClaim
nonpayablefunction batchClaim(uint256[] _ids, address _receiver)
batchUnstake
nonpayablefunction batchUnstake(uint256[] _ids, address _receiver)
changeSlippageAdmin
nonpayablefunction changeSlippageAdmin(address _new)
changeSlippageConfig
nonpayablefunction changeSlippageConfig(address pool, uint224 _newSlippage, uint32 _newLookBack)
claim
nonpayablefunction claim(uint256 _tokenId, address _receiver)
compoundRewards
nonpayablefunction compoundRewards(uint256 _id, uint256 _amountShaolinMin, uint32 _deadline)
distribute
nonpayablefunction distribute(uint256 _amount)
distributeToSpecificPool
nonpayablefunction distributeToSpecificPool(uint8 _pool, uint256 _amount)
renounceOwnership
nonpayablefunction renounceOwnership()
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId, bytes data)
safeTransferFrom
nonpayablefunction safeTransferFrom(address from, address to, uint256 tokenId)
setApprovalForAll
nonpayablefunction setApprovalForAll(address operator, bool approved)
stake
nonpayablefunction stake(uint32 _duration, uint256 _shaolinAmount) returns (uint96 _tokenId, uint256 shares)
toggleBlackListed
nonpayablefunction toggleBlackListed(address _user, bool _value)
transferFrom
nonpayablefunction transferFrom(address from, address to, uint256 tokenId)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
unstake
nonpayablefunction unstake(uint256 _tokenId, address _receiver)
updateRewardsIfNecessary
nonpayablefunction updateRewardsIfNecessary()
events
Approval
event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId)
ApprovalForAll
event ApprovalForAll(address indexed owner, address indexed operator, bool approved)
Claimed
event Claimed(uint256 indexed id, uint256 indexed rewards, uint256 indexed newRewardDebt, address ownerOfStake)
CompoundedRewards
event CompoundedRewards(uint256 indexed newShares, uint256 indexed stakeId, address indexed ownerOfStake)
Distributed
event Distributed(uint8 indexed pool, uint256 indexed amount)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner)
OwnershipTransferStarted
event OwnershipTransferStarted(address indexed previousOwner, address indexed newOwner)
SlippageAdminChanged
event SlippageAdminChanged(address indexed oldAdmin, address indexed newAdmin)
SlippageConfigChanged
event SlippageConfigChanged(address indexed pool, uint224 indexed newSlippage, uint32 indexed newLookback)
Staked
event Staked(address indexed staker, uint256 indexed shaolin, uint152 indexed id, uint256 _shares, uint32 duration)
Transfer
event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)
Unstaked
event Unstaked(uint256 indexed shares, uint256 indexed shaolinAmountReceived, uint256 indexed _tokenId, address recepient)
errors
Address0
error Address0()
Amount0
error Amount0()
Bytes0
error Bytes0()
ERC721IncorrectOwner
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner)
ERC721InsufficientApproval
error ERC721InsufficientApproval(address operator, uint256 tokenId)
ERC721InvalidApprover
error ERC721InvalidApprover(address approver)
ERC721InvalidOperator
error ERC721InvalidOperator(address operator)
ERC721InvalidOwner
error ERC721InvalidOwner(address owner)
ERC721InvalidReceiver
error ERC721InvalidReceiver(address receiver)
ERC721InvalidSender
error ERC721InvalidSender(address sender)
ERC721NonexistentToken
error ERC721NonexistentToken(uint256 tokenId)
Expired
error Expired()
GreaterThan
error GreaterThan(uint256 a, uint256 b)
OwnableInvalidOwner
error OwnableInvalidOwner(address owner)
OwnableUnauthorizedAccount
error OwnableUnauthorizedAccount(address account)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
ShaolinStaking__Blacklisted
error ShaolinStaking__Blacklisted(address _user)
ShaolinStaking__InvalidDuration
error ShaolinStaking__InvalidDuration()
ShaolinStaking__LockPeriodNotOver
error ShaolinStaking__LockPeriodNotOver()
ShaolinStaking__NoSharesToClaim
error ShaolinStaking__NoSharesToClaim()
ShaolinStaking__OnlyMintingAndBurning
error ShaolinStaking__OnlyMintingAndBurning()
SwapActions__InvalidLookBack
error SwapActions__InvalidLookBack()
SwapActions__InvalidSlippage
error SwapActions__InvalidSlippage()
SwapActions__OnlySlippageAdmin
error SwapActions__OnlySlippageAdmin()
T
error T()
creation bytecode
0x610120604052348015610010575f5ffd5b5060405161442938038061442983398101604081905261002f916101d6565b808060400151604051806040016040528060078152602001665374616b696e6760c81b8152506040518060400160405280600381526020016253544b60e81b815250815f908161007f9190610311565b50600161008c8282610311565b5050506001600160a01b0381166100bc57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b6100c58161013a565b5080516001600160a01b039081166080526020820151811660a052604090910151600880549183166001600160a01b031990921691909117905563ffffffff90941660c05250908216610100521660e052600c805463ffffffff60601b19166c010000000000000000000000001790556103cb565b600780546001600160a01b031916905561015381610156565b50565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b80516001600160a01b03811681146101bd575f5ffd5b919050565b634e487b7160e01b5f52604160045260245ffd5b5f5f5f5f84860360c08112156101ea575f5ffd5b855163ffffffff811681146101fd575f5ffd5b945061020b602087016101a7565b9350610219604087016101a7565b92506060605f198201121561022c575f5ffd5b50604051606081016001600160401b038111828210171561024f5761024f6101c2565b60405261025e606087016101a7565b815261026c608087016101a7565b602082015261027d60a087016101a7565b6040820152939692955090935050565b600181811c908216806102a157607f821691505b6020821081036102bf57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f82111561030c57805f5260205f20601f840160051c810160208510156102ea5750805b601f840160051c820191505b81811015610309575f81556001016102f6565b50505b505050565b81516001600160401b0381111561032a5761032a6101c2565b61033e81610338845461028d565b846102c5565b6020601f821160018114610370575f83156103595750848201515b5f19600385901b1c1916600184901b178455610309565b5f84815260208120601f198516915b8281101561039f578785015182556020948501946001909201910161037f565b50848210156103bc57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b60805160a05160c05160e05161010051613fcd61045c5f395f81816107cb01528181610f75015281816111af01526114a101525f818161042c01528181610a540152818161148001528181611d300152611e9401525f818161076301528181611aab0152611af801525f818161054a01526115b001525f81816103e90152818161218f01526122cd0152613fcd5ff3fe608060405234801561000f575f5ffd5b50600436106102cb575f3560e01c80637ec6840f1161017b578063c87b56dd116100e4578063e30c39781161009e578063ed50298611610079578063ed50298614610798578063f2fde38b146107a0578063f6c4c9c1146107b3578063fa0b7de7146107c6575f5ffd5b8063e30c39781461074d578063e6fd48bc1461075e578063e985e9c514610785575f5ffd5b8063c87b56dd1461066a578063ca1c95b41461067d578063d1837eca14610690578063ddd5e1b2146106c0578063de69b3aa146106d3578063e121ce41146106f2575f5ffd5b80639f47f048116101355780639f47f04814610609578063a22cb4651461061c578063b1724b461461062f578063b6a6d1771461063a578063b88d4fde14610644578063c1168dad14610657575f5ffd5b80637ec6840f1461056c5780638381e1821461059e5780638da5cb5b146105b157806391c05b0b146105c257806395591c9b146105d557806395d89b4114610601575f5ffd5b80633a98ef39116102375780636352211e116101f1578063715018a6116101cc578063715018a614610522578063745f60601461052a57806379ba50971461053d5780637c887c5914610545575f5ffd5b80636352211e146104dd57806367b92272146104f057806370a082311461050f575f5ffd5b80633a98ef391461041e5780633fc8cef31461042757806342842e0e1461044e578063446a2ec814610461578063457c7afa1461046a578063612f3fbe1461047d575f5ffd5b806317d70f7c1161028857806317d70f7c1461037257806319b29a9f1461039d57806323b872dd146103be5780632ae6ad11146103d15780632c76d7a6146103e45780633a237aa01461040b575f5ffd5b806301ffc9a7146102cf57806306fdde03146102f7578063081812fc1461030c578063095ea7b314610337578063109abc2d1461034c57806315e7f5f71461035f575b5f5ffd5b6102e26102dd3660046132c3565b6107ed565b60405190151581526020015b60405180910390f35b6102ff61083e565b6040516102ee919061332b565b61031f61031a36600461333d565b6108cd565b6040516001600160a01b0390911681526020016102ee565b61034a610345366004613368565b6108f4565b005b61034a61035a3660046133da565b610903565b61034a61036d36600461343a565b61093d565b600c54610385906001600160601b031681565b6040516001600160601b0390911681526020016102ee565b6103b06103ab366004613482565b61096f565b6040519081526020016102ee565b61034a6103cc3660046134a5565b6109ad565b61034a6103df3660046134f6565b610a35565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b60085461031f906001600160a01b031681565b6103b0600a5481565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61034a61045c3660046134a5565b610ac8565b6103b0600b5481565b61034a610478366004613510565b610ae7565b6104b761048b36600461333d565b600e6020525f908152604090208054600182015460028301546003909301549192909163ffffffff1684565b6040805194855260208501939093529183015263ffffffff1660608201526080016102ee565b61031f6104eb36600461333d565b610b55565b6103b06104fe36600461352b565b600d6020525f908152604090205481565b6103b061051d366004613510565b610b5f565b61034a610ba4565b6103b0610538366004613544565b610bb7565b61034a610d3d565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b61057f61057a366004613583565b610d81565b604080516001600160601b0390931683526020830191909152016102ee565b61034a6105ac36600461359f565b611004565b6006546001600160a01b031661031f565b61034a6105d036600461333d565b61122d565b600c546105ec90600160601b900463ffffffff1681565b60405163ffffffff90911681526020016102ee565b6102ff611240565b61034a6106173660046135c2565b61124f565b61034a61062a36600461343a565b61135b565b6105ec6301e1338081565b6105ec6274040081565b61034a61065236600461364f565b611366565b61034a6106653660046133da565b61137e565b6102ff61067836600461333d565b6113b2565b61034a61068b366004613711565b611422565b6106a361069e36600461373c565b6115a8565b604080519283526001600160e01b039091166020830152016102ee565b61034a6106ce36600461359f565b6116f1565b6103b06106e1366004613510565b600f6020525f908152604090205481565b610729610700366004613510565b60096020525f90815260409020546001600160e01b03811690600160e01b900463ffffffff1682565b604080516001600160e01b03909316835263ffffffff9091166020830152016102ee565b6007546001600160a01b031661031f565b6105ec7f000000000000000000000000000000000000000000000000000000000000000081565b6102e2610793366004613791565b611719565b61034a611746565b61034a6107ae366004613510565b611817565b61034a6107c136600461359f565b611888565b61031f7f000000000000000000000000000000000000000000000000000000000000000081565b5f6001600160e01b031982166380ac58cd60e01b148061081d57506001600160e01b03198216635b5e139f60e01b145b8061083857506301ffc9a760e01b6001600160e01b03198316145b92915050565b60605f805461084c906137bd565b80601f0160208091040260200160405190810160405280929190818152602001828054610878906137bd565b80156108c35780601f1061089a576101008083540402835291602001916108c3565b820191905f5260205f20905b8154815290600101906020018083116108a657829003601f168201915b5050505050905090565b5f6108d78261189b565b505f828152600460205260409020546001600160a01b0316610838565b6108ff8282336118d3565b5050565b5f5b828110156109375761092f848483818110610922576109226137f5565b90506020020135836116f1565b600101610905565b50505050565b6109456118e0565b6001600160a01b03919091165f908152601060205260409020805460ff1916911515919091179055565b8161099c8161099784627404006301e1338066b1a2bc2ec50000670de0b6b3a764000061190d565b611960565b6109a6908261381d565b9392505050565b6001600160a01b0382166109db57604051633250574960e11b81525f60048201526024015b60405180910390fd5b5f6109e783833361198b565b9050836001600160a01b0316816001600160a01b031614610937576040516364283d7b60e01b81526001600160a01b03808616600483015260248201849052821660448201526064016109d2565b80610a3f816119e7565b610a47611746565b610a7c6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333085611a07565b81600d5f856001811115610a9257610a92613830565b6001811115610aa357610aa3613830565b81526020019081526020015f205f828254610abe919061381d565b9091555050505050565b610ae283838360405180602001604052805f815250611366565b505050565b80610af181611a61565b610af96118e0565b6008546040516001600160a01b038085169216907fe29b0c9a6487aafa3c3ceb89f97f492476d5d1b3c03dbbdd4e1c004d8bd83ef4905f90a350600880546001600160a01b0319166001600160a01b0392909216919091179055565b5f6108388261189b565b5f6001600160a01b038216610b89576040516322718ad960e21b81525f60048201526024016109d2565b506001600160a01b03165f9081526003602052604090205490565b610bac6118e0565b610bb55f611a88565b565b5f5f610bc1611aa1565b600b54600c54919250905f90610be690600890600160601b900463ffffffff16613858565b63ffffffff16610bf7600885613858565b63ffffffff161190505f6010600c8054906101000a900463ffffffff16610c1e9190613858565b63ffffffff16610c2f601086613858565b63ffffffff161190508115610c7a57610c6d600d5f805b6001811115610c5757610c57613830565b81526020019081526020015f2054600a54611b92565b610c77908461381d565b92505b8015610c9a57610c8d600d5f6001610c46565b610c97908461381d565b92505b5f5b86811015610d32575f888883818110610cb757610cb76137f5565b602090810292909201355f818152600e845260409081902081516080810183528154808252600183015496820196909652600282015492810183905260039091015463ffffffff1660608201529194509092610d19925090610997908961387f565b610d23908961381d565b97505050806001019050610c9c565b505050505092915050565b60075433906001600160a01b03168114610d755760405163118cdaa760e01b81526001600160a01b03821660048201526024016109d2565b610d7e81611a88565b50565b5f5f82610d8d816119e7565b33610d9781611bdf565b63ffffffff86166274040011801590610dba57506301e1338063ffffffff871611155b8015610dd65750610dce6201518087613892565b63ffffffff16155b610df25760405162829cef60e51b815260040160405180910390fd5b610dfa611746565b600c80545f90610e12906001600160601b03166138b9565b91906101000a8154816001600160601b0302191690836001600160601b0316021790559350610e41858761096f565b92506040518060800160405280848152602001868152602001600b54815260200187610e6a4290565b610e7491906138e3565b63ffffffff9081169091526001600160601b0386165f908152600e602090815260408083208551815591850151600183015584015160028201556060909301516003909301805463ffffffff191693909216929092179055600a8054859290610ede90849061381d565b9091555050335f908152600f602052604081208054859290610f0190849061381d565b90915550506040805184815263ffffffff881660208201526001600160601b03861691879133917f207b496e2079bdcc047c0b60534f96e8fb9a9bb55a1d1ff3826598beefdff447910160405180910390a46040516323b872dd60e01b8152336004820152306024820152604481018690527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906323b872dd906064016020604051808303815f875af1158015610fc3573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fe791906138ff565b50610ffb33856001600160601b0316611c26565b50509250929050565b8061100e81611a61565b82611018816119e7565b5f848152600e60209081526040808320815160808101835281548082526001830154948201949094526002820154928101929092526003015463ffffffff166060820152910361107b5760405163621f7f3560e01b815260040160405180910390fd5b4263ffffffff16816060015163ffffffff1611156110ac57604051632cae2d0160e01b815260040160405180910390fd5b6110b68533611888565b5f6110c086610b55565b90506110cc8686611c87565b60208083015183515f898152600e909352604083208381556001810184905560028101849055600301805463ffffffff19169055600a80549293919283929061111690849061387f565b90915550506001600160a01b0383165f908152600f60205260408120805483929061114290849061387f565b90915550506040516001600160a01b03881681528890839083907fe58f1bc928f89a539038781e3855b3646edb6dacfabffbc4f320f272e6bb4d6c9060200160405180910390a460405163a9059cbb60e01b81526001600160a01b038881166004830152602482018490527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af11580156111f5573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061121991906138ff565b5061122388611da1565b5050505050505050565b80611237816119e7565b6108ff82611dd9565b60606001805461084c906137bd565b8063ffffffff1661125f816119e7565b611267611ebc565b60148263ffffffff16111561128f576040516330c067a960e01b815260040160405180910390fd5b670de0b6b3a76400006001600160e01b03841611156112c1576040516338fd8f3960e21b815260040160405180910390fd5b8163ffffffff16836001600160e01b0316856001600160a01b03167f6b866971e730de54469a032413d79dc0037a7da3f92641b3a839ecc013a9c73e60405160405180910390a4506040805180820182526001600160e01b03938416815263ffffffff92831660208083019182526001600160a01b039096165f90815260099096529190942093519051909116600160e01b029116179055565b6108ff338383611efc565b6113718484846109ad565b6109373385858585611f9a565b5f5b82811015610937576113aa84848381811061139d5761139d6137f5565b9050602002013583611004565b600101611380565b60606113bd8261189b565b505f6113d360408051602081019091525f815290565b90505f8151116113f15760405180602001604052805f8152506109a6565b806113fb846120c1565b60405160200161140c92919061391a565b6040516020818303038152906040529392505050565b8061142c81612151565b61143584610b55565b61143e81611bdf565b611446611746565b6114508533611888565b5f858152600e6020526040812080546002820154600b5492939261147892916109979161387f565b90505f6114cb7f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000848a6127108b612178565b9050600b54836002018190555080836001015f8282546114eb919061381d565b90915550508254819084905f9061150390849061381d565b909155505f905061151389610b55565b6001600160a01b0381165f908152600f602052604081208054929350849290919061153f90849061381d565b9250508190555081600a5f828254611557919061381d565b90915550611566905089610b55565b6001600160a01b031689837f7542c67f9118a1e6b89a5e2750b90049d08653d93c1815f27a66954c5afd845660405160405180910390a4505050505050505050565b5f5f5f6115df7f00000000000000000000000000000000000000000000000000000000000000006115da89898961235a565b6123c4565b6001600160a01b0381165f908152600960209081526040918290208251808401909352546001600160e01b0381168352600160e01b900463ffffffff169082018190529192509015801561163b575080516001600160e01b0316155b1561167e5760405180604001604052806702c68af0bb140000670de0b6b3a76400006116679190613948565b67ffffffffffffffff168152600f60209091015290505b5f8160200151603c6116909190613968565b90505f61169c846124aa565b90508163ffffffff168163ffffffff1610156116b6578091505b5f6116c18584612658565b5090505f6116ce82612887565b8551975090506116e0818a8e8e612ba2565b975050505050505094509492505050565b806116fb81611a61565b82611705816119e7565b61170f8433611888565b6109378484611c87565b6001600160a01b039182165f90815260056020908152604080832093909416825291909152205460ff1690565b600a545f0361175157565b5f61175a611aa1565b90505f6008600c8054906101000a900463ffffffff1661177a9190613858565b63ffffffff1661178b600884613858565b63ffffffff161190505f6010600c8054906101000a900463ffffffff166117b29190613858565b63ffffffff166117c3601085613858565b63ffffffff1611905081156117dd576117dd5f600d612c86565b80156117ef576117ef6001600d612c86565b5050600c805463ffffffff909216600160601b0263ffffffff60601b19909216919091179055565b61181f6118e0565b600780546001600160a01b0383166001600160a01b031990911681179091556118506006546001600160a01b031690565b6001600160a01b03167f38d16b8cac22d99fc7c124b9cd0de2d3fa1faef420bfe791d8c362d765e2270060405160405180910390a350565b6108ff61189483610b55565b8284612d98565b5f818152600260205260408120546001600160a01b03168061083857604051637e27328960e01b8152600481018490526024016109d2565b610ae28383836001612dfc565b6006546001600160a01b03163314610bb55760405163118cdaa760e01b81523360048201526024016109d2565b5f611918858561398e565b63ffffffff16611928848461387f565b611932878961398e565b63ffffffff1661194291906139aa565b61194c91906139c1565b611956908461381d565b9695505050505050565b5f815f1904831182021561197b5763c4c5d7f55f526004601cfd5b50670de0b6b3a764000091020490565b5f828152600260205260408120546001600160a01b03168015806119b657506001600160a01b038516155b6119d357604051630296227f60e01b815260040160405180910390fd5b6119de858585612f00565b95945050505050565b805f03610d7e57604051635a53a6e960e01b815260040160405180910390fd5b604080516001600160a01b0385811660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052610937908590612ff2565b6001600160a01b038116610d7e576040516359c662df60e11b815260040160405180910390fd5b600780546001600160a01b0319169055610d7e8161305e565b5f4263ffffffff167f000000000000000000000000000000000000000000000000000000000000000063ffffffff161115611adc5750600190565b735dcd2315a462f0046641b2118e106fbb47d133d363e091ed9f7f0000000000000000000000000000000000000000000000000000000000000000426040516001600160e01b031960e085901b16815263ffffffff928316600482015291166024820152604401602060405180830381865af4158015611b5e573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b8291906139d4565b611b8d9060016138e3565b905090565b5f7812725dd1d243aba0e75fe645cc4873f9e65afe688c928e1f218311670de0b6b3a764000002158202611bcd5763bcbede655f526004601cfd5b50670de0b6b3a7640000919091020490565b6001600160a01b0381165f90815260106020526040902054819060ff16156108ff57604051637628816760e01b81526001600160a01b0390911660048201526024016109d2565b6001600160a01b038216611c4f57604051633250574960e11b81525f60048201526024016109d2565b5f611c5b83835f61198b565b90506001600160a01b03811615610ae2576040516339e3563760e11b81525f60048201526024016109d2565b5f828152600e60205260409020611c9c611746565b5f611cb6825f01548360020154600b54610997919061387f565b600b546002840181905590915081857fee0b8b0781df81efd732b637fff3a1f3ab388d58bcfe3547eb43bed7ee111695611cef82610b55565b6040516001600160a01b03909116815260200160405180910390a460405163a9059cbb60e01b81526001600160a01b038481166004830152602482018390527f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906044016020604051808303815f875af1158015611d76573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d9a91906138ff565b5050505050565b5f611dad5f835f61198b565b90506001600160a01b0381166108ff57604051637e27328960e01b8152600481018390526024016109d2565b611de1611746565b611df3816706f05b59d3b20000611960565b5f808052600d6020527f81955a0a11e65eac625c29e8882660bae4e165a75d72780094acae8ece9a29ee8054909190611e2d90849061381d565b90915550611e459050816706f05b59d3b20000611960565b60015f908152600d6020527ffd54ff1ed53f34a900b24c5ba64f85761163b5d82d98a47b9bd80e45466993c58054909190611e8190849061381d565b90915550610d7e90506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016333084611a07565b6008546001600160a01b0316331480611edf57506006546001600160a01b031633145b610bb5576040516371dd489b60e11b815260040160405180910390fd5b6001600160a01b038216611f2e57604051630b61174360e31b81526001600160a01b03831660048201526024016109d2565b6001600160a01b038381165f81815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b0383163b15611d9a57604051630a85bd0160e11b81526001600160a01b0384169063150b7a0290611fdc9088908890879087906004016139ef565b6020604051808303815f875af1925050508015612016575060408051601f3d908101601f1916820190925261201391810190613a21565b60015b61207d573d808015612043576040519150601f19603f3d011682016040523d82523d5f602084013e612048565b606091505b5080515f0361207557604051633250574960e11b81526001600160a01b03851660048201526024016109d2565b805181602001fd5b6001600160e01b03198116630a85bd0160e11b146120b957604051633250574960e11b81526001600160a01b03851660048201526024016109d2565b505050505050565b60605f6120cd836130af565b60010190505f8167ffffffffffffffff8111156120ec576120ec61360a565b6040519080825280601f01601f191660200182016040528015612116576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461212057509392505050565b8063ffffffff16421115610d7e57604051630407b05b60e31b815260040160405180910390fd5b60405163095ea7b360e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018690525f919088169063095ea7b3906044016020604051808303815f875af11580156121e7573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220b91906138ff565b506040516bffffffffffffffffffffffff19606089811b821660208401526001600160e81b031960e887901b16603484015288901b1660378201525f90604b0160405160208183030381529060405290505f5f61226a8a8a888b6115a8565b915091505f875f1461227c578761228f565b61228f83836001600160e01b0316611960565b6040805160a08101825286815230602082015263ffffffff891681830152606081018c905260808101839052905163c04b8d5960e01b8152919250907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063c04b8d599061230a908490600401613a3c565b6020604051808303815f875af1158015612326573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061234a9190613a93565b9c9b505050505050505050505050565b604080516060810182525f8082526020820181905291810191909152826001600160a01b0316846001600160a01b03161115612394579192915b50604080516060810182526001600160a01b03948516815292909316602083015262ffffff169181019190915290565b5f81602001516001600160a01b0316825f01516001600160a01b0316106123e9575f5ffd5b815160208084015160408086015181516001600160a01b0395861681860152949092168482015262ffffff90911660608085019190915281518085038201815260808501909252815191909201206001600160f81b031960a08401529085901b6bffffffffffffffffffffffff191660a183015260b58201527fe34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b5460d582015260f50160408051601f1981840301815291905280516020909101209392505050565b5f5f5f836001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa1580156124e9573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250d9190613abb565b5050509350935050505f8161ffff161161254e5760405162461bcd60e51b81526020600482015260026024820152614e4960f01b60448201526064016109d2565b5f806001600160a01b03861663252c09d78461256b876001613b53565b6125759190613b6d565b6040516001600160e01b031960e084901b16815261ffff9091166004820152602401608060405180830381865afa1580156125b2573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125d69190613ba1565b9350505091508061264e5760405163252c09d760e01b81525f60048201526001600160a01b0387169063252c09d790602401608060405180830381865afa158015612623573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906126479190613ba1565b5091935050505b611956824261398e565b5f5f8263ffffffff165f036126945760405162461bcd60e51b8152602060048201526002602482015261042560f41b60448201526064016109d2565b6040805160028082526060820183525f9260208301908036833701905050905083815f815181106126c7576126c76137f5565b602002602001019063ffffffff16908163ffffffff16815250505f816001815181106126f5576126f56137f5565b602002602001019063ffffffff16908163ffffffff16815250505f5f866001600160a01b031663883bdbfd846040518263ffffffff1660e01b815260040161273d9190613bf9565b5f60405180830381865afa158015612757573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261277e9190810190613cd7565b915091505f825f81518110612795576127956137f5565b6020026020010151836001815181106127b0576127b06137f5565b60200260200101516127c29190613d9c565b90505f825f815181106127d7576127d76137f5565b6020026020010151836001815181106127f2576127f26137f5565b602090810291909101015103905063ffffffff88166128118184613dc9565b97505f8360060b128015612830575061282a8184613e05565b60060b15155b15612843578761283f81613e26565b9850505b63ffffffff8916640100000000600160c01b03602084901b1661286d6001600160a01b0383613e47565b6128779190613e78565b9750505050505050509250929050565b5f5f5f8360020b1261289c578260020b6128a3565b8260020b5f035b9050620d89e88111156128c9576040516315e4079d60e11b815260040160405180910390fd5b5f816001165f036128de57600160801b6128f0565b6ffffcb933bd6fad37aa2d162d1a5940015b70ffffffffffffffffffffffffffffffffff1690506002821615612924576ffff97272373d413259a46990580e213a0260801c5b6004821615612943576ffff2e50f5f656932ef12357cf3c7fdcc0260801c5b6008821615612962576fffe5caca7e10e4e61c3624eaa0941cd00260801c5b6010821615612981576fffcb9843d60f6159c9db58835c9266440260801c5b60208216156129a0576fff973b41fa98c081472e6896dfb254c00260801c5b60408216156129bf576fff2ea16466c96a3843ec78b326b528610260801c5b60808216156129de576ffe5dee046a99a2a811c461f1969c30530260801c5b6101008216156129fe576ffcbe86c7900a88aedcffc83b479aa3a40260801c5b610200821615612a1e576ff987a7253ac413176f2b074cf7815e540260801c5b610400821615612a3e576ff3392b0822b70005940c7a398e4b70f30260801c5b610800821615612a5e576fe7159475a2c29b7443b29c7fa6e889d90260801c5b611000821615612a7e576fd097f3bdfd2022b8845ad8f792aa58250260801c5b612000821615612a9e576fa9f746462d870fdf8a65dc1f90e061e50260801c5b614000821615612abe576f70d869a156d2a1b890bb3df62baf32f70260801c5b618000821615612ade576f31be135f97d08fd981231505542fcfa60260801c5b62010000821615612aff576f09aa508b5b7a84e1c677de54f3e99bc90260801c5b62020000821615612b1f576e5d6af8dedb81196699c329225ee6040260801c5b62040000821615612b3e576d2216e584f5fa1ea926041bedfe980260801c5b62080000821615612b5b576b048a170391f7dc42444e8fa20260801c5b5f8460020b1315612b7a57805f1981612b7657612b76613844565b0490505b640100000000810615612b8e576001612b90565b5f5b60ff16602082901c0192505050919050565b5f6fffffffffffffffffffffffffffffffff6001600160a01b03861611612c1e575f612bd860026001600160a01b038816613f89565b9050826001600160a01b0316846001600160a01b031610612c0757612c02600160c01b8683613186565b612c16565b612c168186600160c01b613186565b915050612c7e565b5f612c3c6001600160a01b0387168068010000000000000000613186565b9050826001600160a01b0316846001600160a01b031610612c6b57612c66600160801b8683613186565b612c7a565b612c7a8186600160801b613186565b9150505b949350505050565b805f836001811115612c9a57612c9a613830565b6001811115612cab57612cab613830565b81526020019081526020015f20545f03612cc3575050565b612cda815f846001811115610c4657610c46613830565b600b5f828254612cea919061381d565b909155508190505f836001811115612d0457612d04613830565b6001811115612d1557612d15613830565b81526020019081526020015f2054826001811115612d3557612d35613830565b6040517f6561e54c14520a1109ca3c094be574addf898e575c0712103c2278cf3c31f1a3905f90a35f600d5f846001811115612d7357612d73613830565b6001811115612d8457612d84613830565b815260208101919091526040015f20555050565b612da383838361323c565b610ae2576001600160a01b038316612dd157604051637e27328960e01b8152600481018290526024016109d2565b60405163177e802f60e01b81526001600160a01b0383166004820152602481018290526044016109d2565b8080612e1057506001600160a01b03821615155b15612ed1575f612e1f8461189b565b90506001600160a01b03831615801590612e4b5750826001600160a01b0316816001600160a01b031614155b8015612e5e5750612e5c8184611719565b155b15612e875760405163a9fbf51f60e01b81526001600160a01b03841660048201526024016109d2565b8115612ecf5783856001600160a01b0316826001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45b505b50505f90815260046020526040902080546001600160a01b0319166001600160a01b0392909216919091179055565b5f828152600260205260408120546001600160a01b0390811690831615612f2c57612f2c818486612d98565b6001600160a01b03811615612f6657612f475f855f5f612dfc565b6001600160a01b0381165f90815260036020526040902080545f190190555b6001600160a01b03851615612f94576001600160a01b0385165f908152600360205260409020805460010190555b5f8481526002602052604080822080546001600160a01b0319166001600160a01b0389811691821790925591518793918516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4949350505050565b5f5f60205f8451602086015f885af180613011576040513d5f823e3d81fd5b50505f513d91508115613028578060011415613035565b6001600160a01b0384163b155b1561093757604051635274afe760e01b81526001600160a01b03851660048201526024016109d2565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b83106130ed5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310613119576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc10000831061313757662386f26fc10000830492506010015b6305f5e100831061314f576305f5e100830492506008015b612710831061316357612710830492506004015b60648310613175576064830492506002015b600a83106108385760010192915050565b5f838302815f1985870982811083820303915050805f036131ba578382816131b0576131b0613844565b04925050506109a6565b8084116131d1576131d1600385150260111861329d565b5f848688095f868103871696879004966002600389028118808a02820302808a02820302808a02820302808a02820302808a02820302808a02909103029181900381900460010186841190950394909402919094039290920491909117919091029150509392505050565b5f6001600160a01b03831615801590612c7e5750826001600160a01b0316846001600160a01b0316148061327557506132758484611719565b80612c7e5750505f908152600460205260409020546001600160a01b03908116911614919050565b634e487b715f52806020526024601cfd5b6001600160e01b031981168114610d7e575f5ffd5b5f602082840312156132d3575f5ffd5b81356109a6816132ae565b5f5b838110156132f85781810151838201526020016132e0565b50505f910152565b5f81518084526133178160208601602086016132de565b601f01601f19169290920160200192915050565b602081525f6109a66020830184613300565b5f6020828403121561334d575f5ffd5b5035919050565b6001600160a01b0381168114610d7e575f5ffd5b5f5f60408385031215613379575f5ffd5b823561338481613354565b946020939093013593505050565b5f5f83601f8401126133a2575f5ffd5b50813567ffffffffffffffff8111156133b9575f5ffd5b6020830191508360208260051b85010111156133d3575f5ffd5b9250929050565b5f5f5f604084860312156133ec575f5ffd5b833567ffffffffffffffff811115613402575f5ffd5b61340e86828701613392565b909450925050602084013561342281613354565b809150509250925092565b8015158114610d7e575f5ffd5b5f5f6040838503121561344b575f5ffd5b823561345681613354565b915060208301356134668161342d565b809150509250929050565b63ffffffff81168114610d7e575f5ffd5b5f5f60408385031215613493575f5ffd5b82359150602083013561346681613471565b5f5f5f606084860312156134b7575f5ffd5b83356134c281613354565b925060208401356134d281613354565b929592945050506040919091013590565b8035600281106134f1575f5ffd5b919050565b5f5f60408385031215613507575f5ffd5b613384836134e3565b5f60208284031215613520575f5ffd5b81356109a681613354565b5f6020828403121561353b575f5ffd5b6109a6826134e3565b5f5f60208385031215613555575f5ffd5b823567ffffffffffffffff81111561356b575f5ffd5b61357785828601613392565b90969095509350505050565b5f5f60408385031215613594575f5ffd5b823561338481613471565b5f5f604083850312156135b0575f5ffd5b82359150602083013561346681613354565b5f5f5f606084860312156135d4575f5ffd5b83356135df81613354565b925060208401356001600160e01b03811681146135fa575f5ffd5b9150604084013561342281613471565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156136475761364761360a565b604052919050565b5f5f5f5f60808587031215613662575f5ffd5b843561366d81613354565b9350602085013561367d81613354565b925060408501359150606085013567ffffffffffffffff81111561369f575f5ffd5b8501601f810187136136af575f5ffd5b803567ffffffffffffffff8111156136c9576136c961360a565b6136dc601f8201601f191660200161361e565b8181528860208385010111156136f0575f5ffd5b816020840160208301375f6020838301015280935050505092959194509250565b5f5f5f60608486031215613723575f5ffd5b8335925060208401359150604084013561342281613471565b5f5f5f5f6080858703121561374f575f5ffd5b843561375a81613354565b9350602085013561376a81613354565b9250604085013562ffffff81168114613781575f5ffd5b9396929550929360600135925050565b5f5f604083850312156137a2575f5ffd5b82356137ad81613354565b9150602083013561346681613354565b600181811c908216806137d157607f821691505b6020821081036137ef57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b8082018082111561083857610838613809565b634e487b7160e01b5f52602160045260245ffd5b634e487b7160e01b5f52601260045260245ffd5b5f63ffffffff83168061386d5761386d613844565b8063ffffffff84160491505092915050565b8181038181111561083857610838613809565b5f63ffffffff8316806138a7576138a7613844565b8063ffffffff84160691505092915050565b5f6001600160601b0382166001600160601b0381036138da576138da613809565b60010192915050565b63ffffffff818116838216019081111561083857610838613809565b5f6020828403121561390f575f5ffd5b81516109a68161342d565b5f835161392b8184602088016132de565b83519083019061393f8183602088016132de565b01949350505050565b67ffffffffffffffff828116828216039081111561083857610838613809565b63ffffffff818116838216029081169081811461398757613987613809565b5092915050565b63ffffffff828116828216039081111561083857610838613809565b808202811582820484141761083857610838613809565b5f826139cf576139cf613844565b500490565b5f602082840312156139e4575f5ffd5b81516109a681613471565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061195690830184613300565b5f60208284031215613a31575f5ffd5b81516109a6816132ae565b602081525f825160a06020840152613a5760c0840182613300565b905060018060a01b0360208501511660408401526040840151606084015260608401516080840152608084015160a08401528091505092915050565b5f60208284031215613aa3575f5ffd5b5051919050565b805161ffff811681146134f1575f5ffd5b5f5f5f5f5f5f5f60e0888a031215613ad1575f5ffd5b8751613adc81613354565b8097505060208801518060020b8114613af3575f5ffd5b9550613b0160408901613aaa565b9450613b0f60608901613aaa565b9350613b1d60808901613aaa565b925060a088015160ff81168114613b32575f5ffd5b60c0890151909250613b438161342d565b8091505092959891949750929550565b61ffff818116838216019081111561083857610838613809565b5f61ffff831680613b8057613b80613844565b8061ffff84160691505092915050565b8051600681900b81146134f1575f5ffd5b5f5f5f5f60808587031215613bb4575f5ffd5b8451613bbf81613471565b9350613bcd60208601613b90565b92506040850151613bdd81613354565b6060860151909250613bee8161342d565b939692955090935050565b602080825282518282018190525f918401906040840190835b81811015613c3657835163ffffffff16835260209384019390920191600101613c12565b509095945050505050565b5f67ffffffffffffffff821115613c5a57613c5a61360a565b5060051b60200190565b5f82601f830112613c73575f5ffd5b8151613c86613c8182613c41565b61361e565b8082825260208201915060208360051b860101925085831115613ca7575f5ffd5b602085015b83811015613ccd578051613cbf81613354565b835260209283019201613cac565b5095945050505050565b5f5f60408385031215613ce8575f5ffd5b825167ffffffffffffffff811115613cfe575f5ffd5b8301601f81018513613d0e575f5ffd5b8051613d1c613c8182613c41565b8082825260208201915060208360051b850101925087831115613d3d575f5ffd5b6020840193505b82841015613d6657613d5584613b90565b825260209384019390910190613d44565b80955050505050602083015167ffffffffffffffff811115613d86575f5ffd5b613d9285828601613c64565b9150509250929050565b600682810b9082900b03667fffffffffffff198112667fffffffffffff8213171561083857610838613809565b5f8160060b8360060b80613ddf57613ddf613844565b667fffffffffffff1982145f1982141615613dfc57613dfc613809565b90059392505050565b5f8260060b80613e1757613e17613844565b808360060b0791505092915050565b5f8160020b627fffff198103613e3e57613e3e613809565b5f190192915050565b6001600160c01b03818116838216818102909216918183048114821517613e7057613e70613809565b505092915050565b5f6001600160c01b03831680613e9057613e90613844565b6001600160c01b03929092169190910492915050565b6001815b6001841115613ee157808504811115613ec557613ec5613809565b6001841615613ed357908102905b60019390931c928002613eaa565b935093915050565b5f82613ef757506001610838565b81613f0357505f610838565b8160018114613f195760028114613f2357613f3f565b6001915050610838565b60ff841115613f3457613f34613809565b50506001821b610838565b5060208310610133831016604e8410600b8410161715613f62575081810a610838565b613f6e5f198484613ea6565b805f1904821115613f8157613f81613809565b029392505050565b5f6109a660ff841683613ee956fea264697066735822122016ba797b731c92ecbb98842a19baa3c750c87a9c6f336b5ad9b5844b151f6fa264736f6c634300081b003300000000000000000000000000000000000000000000000000000000679e6120000000000000000000000000af0db65b7296c02ab043f5cb17300c8ee949f247000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2000000000000000000000000e592427a0aece92de3edee1f18e0157c058615640000000000000000000000001f98431c8ad98523631ae4a59f267346ea31f9840000000000000000000000005da227386e0fd73329fe3923394913eca3a624f7