0 txs
2.1k calls
constructor
constructor()
functions
calculateMultiplier
purefunction calculateMultiplier(uint256 amount, uint256 effectiveLockup) pure returns (uint256)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getEarlyUnstakeCooldownAmount
viewfunction getEarlyUnstakeCooldownAmount(address user) view returns (uint256 amount)
getEffectiveStakeAmount
viewfunction getEffectiveStakeAmount(address user) view returns (uint256 effectiveStakeAmount)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getTimeUntilEarlyUnstake
viewfunction getTimeUntilEarlyUnstake(address user) view returns (uint256 timeUntilEarlyUnstake)
getTimeUntilUnlock
viewfunction getTimeUntilUnlock(address user) view returns (uint256 timeUntilUnlock)
getTimeUntilUnstake
viewfunction getTimeUntilUnstake(address user) view returns (uint256 timeUntilUnstake)
getTotalInCooldown
viewfunction getTotalInCooldown(address user) view returns (uint256 totalInCooldown)
getTotalLocked
viewfunction getTotalLocked(address user) view returns (uint256 totalLocked)
getTotalReadyForUnstake
viewfunction getTotalReadyForUnstake(address user) view returns (uint256 totalReadyForUnstake)
getTotalStaked
viewfunction getTotalStaked(address user) view returns (uint256 userTotalStaked)
getTotalUnlocked
viewfunction getTotalUnlocked(address user) view returns (uint256 totalUnlocked)
getUserLockupPeriod
viewfunction getUserLockupPeriod(address user) view returns (uint256 effectiveLockUpPeriod)
getUserMultiplier
viewfunction getUserMultiplier(address user) view returns (uint256 effectiveMultiplier)
getUserStake
viewfunction getUserStake(address user) view returns (tuple)
getUserStakingSummary
viewfunction getUserStakingSummary(address user) view returns (tuple summary)
hasActiveStake
viewfunction hasActiveStake(address user) view returns (bool hasStake)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isEarlyUnstakeReady
viewfunction isEarlyUnstakeReady(address user) view returns (bool ready)
isValidLockUpPeriod
purefunction isValidLockUpPeriod(uint256 lockUpPeriod) pure returns (bool)
maximumStakeAmount
viewfunction maximumStakeAmount() view returns (uint256)
paused
viewfunction paused() view returns (bool)
PAUSER_ROLE
purefunction PAUSER_ROLE() pure returns (bytes32)
SAPIEN_QA_ROLE
purefunction SAPIEN_QA_ROLE() pure returns (bytes32)
sapienToken
viewfunction sapienToken() view returns (address)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
totalStaked
viewfunction totalStaked() view returns (uint256)
treasury
viewfunction treasury() view returns (address)
userStakes
viewfunction userStakes(address) view returns (uint128 amount, uint128 cooldownAmount, uint64 weightedStartTime, uint64 effectiveLockUpPeriod, uint64 cooldownStart, uint64 lastUpdateTime, uint64 earlyUnstakeCooldownStart, uint32 effectiveMultiplier, uint128 earlyUnstakeCooldownAmount)
version
purefunction version() pure returns (string)
earlyUnstake
nonpayablefunction earlyUnstake(uint256 amount)
emergencyWithdraw
nonpayablefunction emergencyWithdraw(address token, address to, uint256 amount)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
increaseAmount
nonpayablefunction increaseAmount(uint256 additionalAmount)
increaseLockup
nonpayablefunction increaseLockup(uint256 additionalLockup)
increaseStake
nonpayablefunction increaseStake(uint256 additionalAmount, uint256 additionalLockup)
initialize
nonpayablefunction initialize(address token, address admin, address pauser, address newTreasury, address sapienQA)
initiateEarlyUnstake
nonpayablefunction initiateEarlyUnstake(uint256 amount)
initiateUnstake
nonpayablefunction initiateUnstake(uint256 amount)
pause
nonpayablefunction pause()
processQAPenalty
nonpayablefunction processQAPenalty(address userAddress, uint256 penaltyAmount) returns (uint256 actualPenalty)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setMaximumStakeAmount
nonpayablefunction setMaximumStakeAmount(uint256 newMaximumStakeAmount)
setTreasury
nonpayablefunction setTreasury(address newTreasury)
stake
nonpayablefunction stake(uint256 amount, uint256 lockUpPeriod)
unpause
nonpayablefunction unpause()
unstake
nonpayablefunction unstake(uint256 amount)
events
AmountIncreased
event AmountIncreased(address indexed user, uint256 additionalAmount, uint256 newTotalAmount, uint256 newEffectiveMultiplier)
EarlyUnstake
event EarlyUnstake(address indexed user, uint256 amount, uint256 penalty)
EarlyUnstakeCooldownInitiated
event EarlyUnstakeCooldownInitiated(address indexed user, uint256 cooldownStart, uint256 amount)
EmergencyWithdraw
event EmergencyWithdraw(address indexed token, address indexed to, uint256 amount)
Initialized
event Initialized(uint64 version)
LockupIncreased
event LockupIncreased(address indexed user, uint256 additionalLockup, uint256 newEffectiveLockup, uint256 newEffectiveMultiplier)
MaximumStakeAmountUpdated
event MaximumStakeAmountUpdated(uint256 oldMaximumStakeAmount, uint256 newMaximumStakeAmount)
Paused
event Paused(address account)
QACooldownAdjusted
event QACooldownAdjusted(address indexed user, uint256 adjustedAmount)
QAPenaltyProcessed
event QAPenaltyProcessed(address indexed user, uint256 penaltyAmount, address indexed qaContract)
QAStakeReduced
event QAStakeReduced(address indexed user, uint256 fromActiveStake, uint256 fromCooldownStake)
QAUserStakeReset
event QAUserStakeReset(address indexed user)
RoleAdminChanged
event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole)
RoleGranted
event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender)
RoleRevoked
event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender)
SapienTreasuryUpdated
event SapienTreasuryUpdated(address indexed newSapienTreasury)
Staked
event Staked(address indexed user, uint256 amount, uint256 effectiveMultiplier, uint256 lockUpPeriod)
Unpaused
event Unpaused(address account)
Unstaked
event Unstaked(address indexed user, uint256 amount)
UnstakingInitiated
event UnstakingInitiated(address indexed user, uint256 cooldownStart, uint256 cooldownAmount)
UserStakeReset
event UserStakeReset(address indexed user, (uint128 amount, uint128 cooldownAmount, uint64 weightedStartTime, uint64 effectiveLockUpPeriod, uint64 cooldownStart, uint64 lastUpdateTime, uint64 earlyUnstakeCooldownStart, uint32 effectiveMultiplier, uint128 earlyUnstakeCooldownAmount) userStake)
UserStakeUpdated
event UserStakeUpdated(address indexed user, (uint128 amount, uint128 cooldownAmount, uint64 weightedStartTime, uint64 effectiveLockUpPeriod, uint64 cooldownStart, uint64 lastUpdateTime, uint64 earlyUnstakeCooldownStart, uint32 effectiveMultiplier, uint128 earlyUnstakeCooldownAmount) userStake)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AmountExceedsAvailableBalance
error AmountExceedsAvailableBalance()
AmountExceedsCooldownAmount
error AmountExceedsCooldownAmount()
AmountExceedsEarlyUnstakeRequest
error AmountExceedsEarlyUnstakeRequest()
CannotIncreaseStakeInCooldown
error CannotIncreaseStakeInCooldown()
EarlyUnstakeCooldownActive
error EarlyUnstakeCooldownActive()
EarlyUnstakeCooldownRequired
error EarlyUnstakeCooldownRequired()
EnforcedPause
error EnforcedPause()
ExistingStakeFound
error ExistingStakeFound()
ExpectedPause
error ExpectedPause()
InsufficientStakeForPenalty
error InsufficientStakeForPenalty()
InsufficientSurplusForEmergencyWithdraw
error InsufficientSurplusForEmergencyWithdraw(uint256 surplus, uint256 amount)
InvalidAmount
error InvalidAmount()
InvalidInitialization
error InvalidInitialization()
InvalidLockupPeriod
error InvalidLockupPeriod()
InvalidRecipient
error InvalidRecipient()
LockPeriodCompleted
error LockPeriodCompleted()
MinimumLockupIncreaseRequired
error MinimumLockupIncreaseRequired()
MinimumStakeAmountRequired
error MinimumStakeAmountRequired()
MinimumUnstakeAmountRequired
error MinimumUnstakeAmountRequired()
NoStakeFound
error NoStakeFound()
NotInitializing
error NotInitializing()
NotReadyForUnstake
error NotReadyForUnstake()
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RemainingStakeBelowMinimum
error RemainingStakeBelowMinimum()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StakeAmountTooLarge
error StakeAmountTooLarge()
StakeInCooldown
error StakeInCooldown()
StakeStillLocked
error StakeStillLocked()
ZeroAddress
error ZeroAddress()
creation bytecode
0x6080604052348015600e575f5ffd5b5060156019565b60c9565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00805468010000000000000000900460ff161560685760405163f92ee8a960e01b815260040160405180910390fd5b80546001600160401b039081161460c65780546001600160401b0319166001600160401b0390811782556040519081527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50565b613e53806100d65f395ff3fe608060405234801561000f575f5ffd5b50600436106102b1575f3560e01c8063817b1cd21161017b578063c691ef9b116100e4578063e351396a1161009e578063e63ea40811610079578063e63ea408146108f6578063f0f4426014610909578063f36cc39d1461091c578063f36db0ff1461092f575f5ffd5b8063e351396a146108bd578063e4307444146108d0578063e63ab1e9146108e3575f5ffd5b8063c691ef9b1461079d578063c8e6a35714610840578063d547741f14610853578063d7f146be14610866578063dd2a8b1114610879578063e231dc27146108aa575f5ffd5b8063a217fddf11610135578063a217fddf14610611578063a48f01bf14610618578063ae5ac9211461062b578063bbadc93a1461063e578063bec10cde14610752578063c5e22f3f14610765575f5ffd5b8063817b1cd2146104e05780638456cb59146104e957806386ae0143146104f15780638da7ad231461050457806391d14854146105eb5780639c630325146105fe575f5ffd5b806345b3799b1161021d57806369486d29116101d757806369486d291461046f578063720936621461048257806373361da6146104945780637aa6255b146104a75780637b0472f0146104ba5780637c0712b4146104cd575f5ffd5b806345b3799b146103a9578063476d3f4f146103bc57806354fd4d50146103f757806359fd155e1461041a5780635c975abb1461042d57806361d027b314610444575f5ffd5b8063248a9ca31161026e578063248a9ca3146103425780632e17de78146103555780632f2ff15d1461036857806336568abe1461037b5780633d3fb0991461038e5780633f4ba83a146103a1575f5ffd5b806301ffc9a7146102b557806304e971ec146102dd57806305c77a3c146102f45780631459457a1461030757806315456eba1461031c578063191e13251461032f575b5f5ffd5b6102c86102c3366004613946565b610942565b60405190151581526020015b60405180910390f35b6102e660045481565b6040519081526020016102d4565b6102e6610302366004613988565b610978565b61031a6103153660046139a1565b6109d0565b005b61031a61032a366004613a02565b610c1e565b6102e661033d366004613988565b610e10565b6102e6610350366004613a02565b610e3d565b61031a610363366004613a02565b610e5d565b61031a610376366004613a19565b610f4c565b61031a610389366004613a19565b610f6e565b6102e661039c366004613988565b610fa6565b61031a611022565b61031a6103b7366004613a02565b61107a565b6102e66103ca366004613988565b6001600160a01b03165f90815260036020526040902060010154600160401b90046001600160401b031690565b60408051808201825260018152603160f81b602082015290516102d49190613a43565b5f516020613d5e5f395f51905f526102e6565b5f516020613dbe5f395f51905f525460ff166102c8565b600154610457906001600160a01b031681565b6040516001600160a01b0390911681526020016102d4565b6102c861047d366004613988565b61115f565b5f54610457906001600160a01b031681565b6102e66104a2366004613988565b61119b565b6102c86104b5366004613a02565b61129b565b61031a6104c8366004613a78565b6112b5565b61031a6104db366004613a02565b611430565b6102e660025481565b61031a611579565b6102e66104ff366004613a78565b6115ca565b610584610512366004613988565b60036020525f90815260409020805460018201546002909201546001600160801b0380831693600160801b938490048216936001600160401b0380831694600160401b808504831695938504831694600160c01b90048316939282169290820463ffffffff1691600160601b90041689565b604080516001600160801b039a8b168152988a1660208a01526001600160401b03978816908901529486166060880152928516608087015290841660a086015290921660c084015263ffffffff90911660e0830152909116610100820152610120016102d4565b6102c86105f9366004613a19565b611649565b61031a61060c366004613a02565b61167f565b6102e65f81565b6102e6610626366004613a98565b6118bd565b61031a610639366004613a02565b611a29565b61074561064c366004613988565b60408051610120810182525f80825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810191909152506001600160a01b03165f9081526003602090815260409182902082516101208101845281546001600160801b038082168352600160801b9182900481169483019490945260018301546001600160401b0380821696840196909652600160401b8082048716606085015291810486166080840152600160c01b9004851660a083015260029092015493841660c082015290830463ffffffff1660e0820152600160601b9092041661010082015290565b6040516102d49190613ac0565b61031a610760366004613a78565b611b0b565b6102e6610773366004613988565b6001600160a01b03165f90815260036020526040902060020154600160401b900463ffffffff1690565b6107b06107ab366004613988565b611b1d565b6040516102d491905f61018082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010083015161010083015261012083015161012083015261014083015161014083015261016083015161016083015292915050565b6102e661084e366004613988565b611d0c565b61031a610861366004613a19565b611e18565b6102c8610874366004613988565b611e34565b6102e6610887366004613988565b6001600160a01b03165f908152600360205260409020546001600160801b031690565b6102e66108b8366004613988565b611f16565b6102e66108cb366004613988565b612004565b6102e66108de366004613988565b6120ca565b5f516020613d7e5f395f51905f526102e6565b61031a610904366004613ba3565b6121a7565b61031a610917366004613988565b6123d6565b6102e661092a366004613988565b612475565b61031a61093d366004613a02565b6124b8565b5f6001600160e01b03198216637965db0b60e01b148061097257506301ffc9a760e01b6001600160e01b03198316145b92915050565b6001600160a01b0381165f9081526003602052604081206109988161255f565b806109b357508054600160801b90046001600160801b031615155b156109c057505f92915050565b546001600160801b031692915050565b5f6109d96125a8565b805490915060ff600160401b82041615906001600160401b03165f811580156109ff5750825b90505f826001600160401b03166001148015610a1a5750303b155b905081158015610a28575080155b15610a465760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610a7057845460ff60401b1916600160401b1785555b6001600160a01b038a16610a975760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038916610abe5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038816610ae55760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038716610b0c5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b038616610b335760405163d92e233d60e01b815260040160405180910390fd5b610b3b6125d0565b610b436125d0565b610b4b6125d8565b610b555f8a6125e8565b50610b6d5f516020613d7e5f395f51905f52896125e8565b50610b855f516020613d5e5f395f51905f52876125e8565b505f80546001600160a01b03808d166001600160a01b03199283161790925560018054928a1692909116919091179055610bc9670de0b6b3a76400006109c4613bf1565b6004558315610c1257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b50505050505050505050565b610c26612690565b610c2e6126c0565b335f908152600360205260409020610c4682826126f7565b80545f90610c6b9083908590610c669082906001600160801b0316613c08565b6127e8565b5f54909150610c85906001600160a01b0316333086612823565b81545f90610c9d9085906001600160801b0316613c08565b9050610ca88261288a565b60018401805467ffffffffffffffff19166001600160401b0392909216919091179055610cd4816128f5565b83546001600160801b0319166001600160801b0391909116178355610cf84261288a565b6001840180546001600160c01b0316600160c01b6001600160401b03938416021790819055610d3a91610d35918491600160401b909104166115ca565b61295d565b8360020160086101000a81548163ffffffff021916908363ffffffff1602179055508360025f828254610d6d9190613c08565b909155505060028301546040805186815260208101849052600160401b90920463ffffffff169082015233907f76fb5396626aa10baa1270d03b41b846cdd4bf11195b77a5d07c744c8d5e74559060600160405180910390a2336001600160a01b03165f516020613dfe5f395f51905f5284604051610dec9190613c1b565b60405180910390a2505050610e0d60015f516020613dde5f395f51905f5255565b50565b6001600160a01b03165f90815260036020526040902060020154600160601b90046001600160801b031690565b5f9081525f516020613d9e5f395f51905f52602052604090206001015490565b610e65612690565b610e6d6126c0565b335f908152600360205260409020610e8582826129d4565b80545f90610e9d9084906001600160801b0316613cbb565b9050610ea8816128f5565b82546001600160801b0319166001600160801b0391909116178255600280548491905f90610ed7908490613cbb565b90915550610ee89050828483612a76565b5f54610efe906001600160a01b03163385612c9d565b60405183815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f75906020015b60405180910390a25050610e0d60015f516020613dde5f395f51905f5255565b610f5582610e3d565b610f5e81612cce565b610f6883836125e8565b50505050565b6001600160a01b0381163314610f975760405163334bd91960e11b815260040160405180910390fd5b610fa18282612cd8565b505050565b6001600160a01b0381165f908152600360205260408120610fc68161255f565b610fd257505f92915050565b80546001600160801b03600160801b82048116911611610ff457505f92915050565b8054611012906001600160801b03600160801b820481169116613cce565b6001600160801b03169392505050565b6110395f516020613d7e5f395f51905f5233611649565b6110705760405163e2517d3f60e01b81523360048201525f516020613d7e5f395f51905f5260248201526044015b60405180910390fd5b611078612d51565b565b611082612690565b61108a6126c0565b335f9081526003602052604090206110a28282612db0565b6110ab4261288a565b60028201805467ffffffffffffffff19166001600160401b03929092169190911790556110d7826128f5565b6002820180546001600160801b0392909216600160601b026fffffffffffffffffffffffffffffffff60601b19909216919091179055604080514281526020810184905233917f7c3cca43ac018e3ba7f0299215d4d46cbead268759ac087447059dab9f481927910160405180910390a250610e0d60015f516020613dde5f395f51905f5255565b5f6001600160a01b03821661117557505f919050565b506001600160a01b03165f908152600360205260409020546001600160801b0316151590565b6001600160a01b0381165f90815260036020908152604080832081516101208101835281546001600160801b038082168352600160801b9182900481169583019590955260018301546001600160401b0380821695840195909552600160401b8082048616606085015291810485166080840152600160c01b9004841660a083015260029092015492831660c0820181905291830463ffffffff1660e0820152600160601b90920490921661010082015290820361125b57505f92915050565b5f6202a3008260c001516001600160401b03166112789190613c08565b9050804210156112915761128c4282613cbb565b611293565b5f5b949350505050565b5f62278d0082101580156109725750506301e13380101590565b6112bd612690565b6112c56126c0565b335f9081526003602090815260409182902082516101208101845281546001600160801b038082168352600160801b9182900481169483019490945260018301546001600160401b0380821696840196909652600160401b8082048716606085015291810486166080840152600160c01b9004851660a0830152600283015494851660c0830152840463ffffffff1660e0820152600160601b909304909116610100830152906113789084908490612eb6565b5f5461138f906001600160a01b0316333086612823565b61139a818484612f5b565b8260025f8282546113ab9190613c08565b90915550506002810154600182015460408051868152600160401b9384900463ffffffff166020820152929091046001600160401b03169082015233907fb4caaf29adda3eefee3ad552a8e85058589bf834c7466cae4ee58787f70589ed9060600160405180910390a25061142c60015f516020613dde5f395f51905f5255565b5050565b611438612690565b6114406126c0565b335f9081526003602052604090206114588282613062565b80545f906114709084906001600160801b0316613cbb565b90505f81118015611492575061148f670de0b6b3a76400006001613bf1565b81105b156114a7575080546001600160801b031691505f5b5f6127106114b76107d086613bf1565b6114c19190613d01565b90505f6114ce8286613cbb565b90508460025f8282546114e19190613cbb565b909155506114f29050848685612a76565b5f54611508906001600160a01b03163383612c9d565b6001545f54611524916001600160a01b03918216911684612c9d565b604080518281526020810184905233917faea66efc34965ca33ce966727c65f2713eb6881888ff8e691d27b7685a31e326910160405180910390a250505050610e0d60015f516020613dde5f395f51905f5255565b6115905f516020613d7e5f395f51905f5233611649565b6115c25760405163e2517d3f60e01b81523360048201525f516020613d7e5f395f51905f526024820152604401611067565b611078613150565b5f806115e0670de0b6b3a76400006109c4613bf1565b9050808411156115ee578093505b6301e13380831115611602576301e1338092505b5f611611826301e13380613bf1565b61138861161e8787613bf1565b6116289190613bf1565b6116329190613d01565b905061164081612710613c08565b95945050505050565b5f9182525f516020613d9e5f395f51905f52602090815260408084206001600160a01b0393909316845291905290205460ff1690565b611687612690565b61168f6126c0565b335f9081526003602052604090206116a78282613198565b5f6116b18261255f565b156116e95750816116c14261288a565b60018301805467ffffffffffffffff19166001600160401b0392909216919091179055611786565b60018201545f90611703906001600160401b031642613cbb565b60018401549091505f90600160401b90046001600160401b03168210611729575f611749565b6001840154611749908390600160401b90046001600160401b0316613cbb565b90506117558582613c08565b92506117604261288a565b60018501805467ffffffffffffffff19166001600160401b039290921691909117905550505b6301e1338081111561179957506301e133805b6117a28161288a565b6001830180546001600160401b0392909216600160401b026fffffffffffffffff00000000000000001990921691909117905581546117ee90610d35906001600160801b0316836115ca565b8260020160086101000a81548163ffffffff021916908363ffffffff1602179055506118194261288a565b6001830180546001600160c01b0316600160c01b6001600160401b03939093169290920291909117905560028201546040805185815260208101849052600160401b90920463ffffffff169082015233907fc909bbf1e625c0d99ddb466201b37062953bc71afad4e348a5097cee5face9409060600160405180910390a2336001600160a01b03165f516020613dfe5f395f51905f5283604051610f2c9190613c1b565b5f6118c66126c0565b6118ce612690565b6118e55f516020613d5e5f395f51905f5233611649565b6119175760405163e2517d3f60e01b81523360048201525f516020613d5e5f395f51905f526024820152604401611067565b6001600160a01b03831661193e5760405163d92e233d60e01b815260040160405180910390fd5b815f0361195e5760405163162908e360e11b815260040160405180910390fd5b6001600160a01b0383165f90815260036020526040902061197f8184613232565b9150815f036119a157604051634626061160e11b815260040160405180910390fd5b6119ac81838661324c565b6119b68185613321565b6001545f546119d2916001600160a01b03918216911684612c9d565b60405182815233906001600160a01b038616907f787492d764b797514df43a788145bf0190801f076aa1e78e2544476f0051693a9060200160405180910390a35061097260015f516020613dde5f395f51905f5255565b611a31612690565b611a396126c0565b335f908152600360205260409020611a518282613474565b8054600160801b90046001600160801b03165f611a6e8483613c08565b9050611a794261288a565b8360010160106101000a8154816001600160401b0302191690836001600160401b03160217905550611aaa816128f5565b83546001600160801b03918216600160801b029116178355337ffdb9e05f5f822a2d73f44e23b52571e663a8f40844047cac41ccaa32e37ff040611aed4261288a565b604080516001600160401b0390921682526020820185905201610dec565b611b1482610c1e565b61142c8161167f565b611b756040518061018001604052805f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81526020015f81525090565b6001600160a01b0382165f9081526003602090815260409182902082516101208101845281546001600160801b03808216808452600160801b9283900482169584019590955260018401546001600160401b0380821697850197909752600160401b8082048816606086015292810487166080850152600160c01b9004861660a084015260029093015494851660c0830152840463ffffffff1660e0820152600160601b9093041661010083015215611cdf5780516001600160801b03168252611c3e83610fa6565b60a0830152611c4c83610978565b6080830152611c5a83611d0c565b610120830152611c6983612475565b60e0830152611c7783612004565b602083015260e081015163ffffffff1660408301526060808201516001600160401b031690830152611ca883611f16565b60c0830152611cb68361119b565b610140830152611cc583610e10565b610160830152611cd4836120ca565b610100830152611d06565b5f80835260a0830181905260808301819052610120830181905260e0830181905260408301525b50919050565b6001600160a01b0381165f90815260036020908152604080832081516101208101835281546001600160801b03808216808452600160801b9283900482169684019690965260018401546001600160401b0380821696850196909652600160401b8082048716606086015292810486166080850152600160c01b9004851660a084015260029093015493841660c0830152830463ffffffff1660e0820152600160601b90920416610100820152901580611dd1575060808101516001600160401b0316155b15611dde57505f92915050565b805f01516001600160801b031681602001516001600160801b031611611e08578060200151611012565b516001600160801b031692915050565b611e2182610e3d565b611e2a81612cce565b610f688383612cd8565b6001600160a01b0381165f90815260036020908152604080832081516101208101835281546001600160801b038082168352600160801b9182900481169583019590955260018301546001600160401b0380821695840195909552600160401b8082048616606085015291810485166080840152600160c01b9004841660a083015260029092015492831660c0820181905291830463ffffffff1660e0820152600160601b9092049092166101008201529015801590611f0f57506202a3008160c001516001600160401b0316611f0b9190613c08565b4210155b9392505050565b6001600160a01b0381165f90815260036020908152604080832081516101208101835281546001600160801b03808216808452600160801b9283900482169684019690965260018401546001600160401b0380821696850196909652600160401b8082048716606086015292810486166080850152600160c01b9004851660a084015260029093015493841660c0830152830463ffffffff1660e0820152600160601b90920416610100820152908203611fd257505f92915050565b5f81606001518260400151611fe79190613d14565b6001600160401b03169050804210156112915761128c4282613cbb565b6001600160a01b0381165f90815260036020908152604080832081516101208101835281546001600160801b03808216808452600160801b92839004821696840187905260018501546001600160401b0380821697860197909752600160401b8082048816606087015293810487166080860152600160c01b9004861660a085015260029094015494851660c084015290840463ffffffff1660e0830152600160601b909304909216610100830181905291926120c091613cce565b6110129190613cce565b6001600160a01b0381165f90815260036020908152604080832081516101208101835281546001600160801b038082168352600160801b9182900481169583019590955260018301546001600160401b0380821695840195909552600160401b80820486166060850152918104851660808401819052600160c01b909104851660a084015260029093015493841660c0830152830463ffffffff1660e0820152600160601b90920490921661010082015290820361218a57505f92915050565b5f6202a30082608001516001600160401b03166112789190613c08565b6121b15f33611649565b6121d65760405163e2517d3f60e01b81523360048201525f6024820152604401611067565b6121de61352b565b6121e66126c0565b6001600160a01b03821661220d5760405163d92e233d60e01b815260040160405180910390fd5b5f546001600160a01b03908116908416036122db575f80546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015612268573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061228c9190613d33565b6002549091505f8183116122a0575f6122aa565b6122aa8284613cbb565b9050808411156122d757604051630d4a459560e41b81526004810182905260248101859052604401611067565b5050505b6001600160a01b03831661235f575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114612332576040519150601f19603f3d011682016040523d82523d5f602084013e612337565b606091505b50509050806123595760405163162908e360e11b815260040160405180910390fd5b50612373565b6123736001600160a01b0384168383612c9d565b816001600160a01b0316836001600160a01b03167ff24ef89f38eadc1bde50701ad6e4d6d11a2dc24f7cf834a486991f3883328504836040516123b891815260200190565b60405180910390a3610fa160015f516020613dde5f395f51905f5255565b6123e05f33611649565b6124055760405163e2517d3f60e01b81523360048201525f6024820152604401611067565b6001600160a01b03811661242c5760405163d92e233d60e01b815260040160405180910390fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f803b5faf395220414a798e0ad7357a6b654dc4ab8f56a850aec28221af018c37905f90a250565b6001600160a01b0381165f9081526003602052604081206124958161355a565b6124a157505f92915050565b54600160801b90046001600160801b031692915050565b6124c25f33611649565b6124e75760405163e2517d3f60e01b81523360048201525f6024820152604401611067565b6124fa670de0b6b3a76400006001613bf1565b81101561251a5760405163162908e360e11b815260040160405180910390fd5b600480549082905560408051828152602081018490527fadaa801cad4c1691b12cd5d49aa7f8d7abce266655a608a55df5da8525a56c90910160405180910390a15050565b80545f906001600160801b03161580159061097257506001820154612596906001600160401b03600160401b820481169116613d14565b6001600160401b031642101592915050565b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610972565b6110786135d4565b6125e06135d4565b6110786135f9565b5f5f516020613d9e5f395f51905f526126018484611649565b612680575f848152602082815260408083206001600160a01b03871684529091529020805460ff191660011790556126363390565b6001600160a01b0316836001600160a01b0316857f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a46001915050610972565b5f915050610972565b5092915050565b5f516020613dbe5f395f51905f525460ff16156110785760405163d93c066560e01b815260040160405180910390fd5b5f516020613dde5f395f51905f528054600119016126f157604051633ee5aeb560e01b815260040160405180910390fd5b60029055565b815f036127175760405163162908e360e11b815260040160405180910390fd5b80546001600160801b03165f0361274157604051632cdf478160e11b815260040160405180910390fd5b6001810154600160801b90046001600160401b031615158061276f575060028101546001600160401b031615155b1561278d5760405163149ac65f60e21b815260040160405180910390fd5b6004548211156127b057604051633a44c43960e01b815260040160405180910390fd5b60045481546127c99084906001600160801b0316613c08565b111561142c57604051633a44c43960e01b815260040160405180910390fd5b5f6127f28461255f565b156127fe575042611f0f565b60018401548454611293916001600160401b0316906001600160801b03168585613601565b6040516001600160a01b038481166024830152838116604483015260648201839052610f689186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506136ad565b5f6001600160401b038211156128f15760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203660448201526534206269747360d01b6064820152608401611067565b5090565b5f6001600160801b038211156128f15760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401611067565b5f63ffffffff8211156128f15760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203360448201526532206269747360d01b6064820152608401611067565b60015f516020613dde5f395f51905f5255565b815f036129f45760405163162908e360e11b815260040160405180910390fd5b80546001600160801b03165f03612a1e57604051632cdf478160e11b815260040160405180910390fd5b612a278161355a565b612a4457604051630121260760e61b815260040160405180910390fd5b8054600160801b90046001600160801b031682111561142c576040516343bb5e5360e11b815260040160405180910390fd5b805f03612a8657610fa183613719565b612a8f816128f5565b83546001600160801b0319166001600160801b0391909116178355612ab34261288a565b6001840180546001600160c01b0316600160c01b6001600160401b03938416021790819055612af091610d35918491600160401b909104166115ca565b60028401805463ffffffff92909216600160401b026bffffffff00000000000000001990921691909117908190556001600160801b03600160601b9091041615612bc3576002830154600160601b90046001600160801b03168210612b71576002830180546bffffffff0000000000000001600160e01b0319169055612bc3565b612b7a826128f5565b600284018054600c90612b9e908490600160601b90046001600160801b0316613cce565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b8254600160801b90046001600160801b031615612c6a578254600160801b90046001600160801b03168210612c1a5782546001600160801b0316835560018301805467ffffffffffffffff60801b19169055612c6a565b612c23826128f5565b83548490601090612c45908490600160801b90046001600160801b0316613cce565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505b336001600160a01b03165f516020613dfe5f395f51905f5284604051612c909190613c1b565b60405180910390a2505050565b6040516001600160a01b03838116602483015260448201839052610fa191859182169063a9059cbb90606401612858565b610e0d8133613776565b5f5f516020613d9e5f395f51905f52612cf18484611649565b15612680575f848152602082815260408083206001600160a01b0387168085529252808320805460ff1916905551339287917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a46001915050610972565b612d5961352b565b5f516020613dbe5f395f51905f52805460ff191681557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a150565b815f03612dd05760405163162908e360e11b815260040160405180910390fd5b6101f4821015612df357604051635f6b512760e01b815260040160405180910390fd5b80546001600160801b03165f03612e1d57604051632cdf478160e11b815260040160405180910390fd5b8054612e3b906001600160801b03600160801b820481169116613cce565b6001600160801b0316821115612e6457604051631ecb384960e21b815260040160405180910390fd5b612e6d8161255f565b15612e8a5760405162bd319f60e71b815260040160405180910390fd5b60028101546001600160401b03161561142c57604051634c5c8e6760e01b815260040160405180910390fd5b612ec9670de0b6b3a76400006001613bf1565b831015612ee957604051638cb4f93360e01b815260040160405180910390fd5b80516001600160801b031615612f12576040516323bd7dc360e01b815260040160405180910390fd5b600454831115612f3557604051633a44c43960e01b815260040160405180910390fd5b612f3e8261129b565b610fa157604051631578094360e01b815260040160405180910390fd5b612f64826128f5565b83546001600160801b0319166001600160801b0391909116178355612f884261288a565b60018401805467ffffffffffffffff19166001600160401b0392909216919091179055612fb48161288a565b8360010160086101000a8154816001600160401b0302191690836001600160401b03160217905550612fe9610d3583836115ca565b8360020160086101000a81548163ffffffff021916908363ffffffff1602179055506130144261288a565b8360010160186101000a8154816001600160401b0302191690836001600160401b03160217905550336001600160a01b03165f516020613dfe5f395f51905f5284604051612c909190613c1b565b80546001600160801b03165f0361308c57604051632cdf478160e11b815260040160405180910390fd5b6130958161255f565b156130b25760405162bd319f60e71b815260040160405180910390fd5b60028101546001600160401b03165f036130df5760405163b145282f60e01b815260040160405180910390fd5b6002810154600160601b90046001600160801b03168211156131145760405163067d4c6160e01b815260040160405180910390fd5b6002810154613130906202a300906001600160401b0316613c08565b42101561142c5760405163b145282f60e01b815260040160405180910390fd5b613158612690565b5f516020613dbe5f395f51905f52805460ff191660011781557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25833612d92565b80546001600160801b03165f036131c257604051632cdf478160e11b815260040160405180910390fd5b62278d008210156131e657604051630f8eca2360e01b815260040160405180910390fd5b6001810154600160801b90046001600160401b0316151580613214575060028101546001600160401b031615155b1561142c5760405163149ac65f60e21b815260040160405180910390fd5b81545f906001600160801b0316808311611f0f5782611293565b8254600160801b90046001600160801b03165f61326985856137af565b85549091505f9061328a90600160801b90046001600160801b031684613cbb565b905080156132d657836001600160a01b03167ff7cf7b1711c5bbc4c77741e9036bd3a4a64723f392c4a6b7559d2c717af22a56826040516132cd91815260200190565b60405180910390a25b604080518381525f60208201526001600160a01b038616917f31d3be5e846b813c99af01f7b14d068e41a8b728c428a2a70429c6de42348255910160405180910390a2505050505050565b81546001600160801b0380821615801592600160801b900490911615159082613348575080155b1561338f5761335684613719565b6040516001600160a01b038416907f3a7764df0962835f5e7e2a1fec329d81512c7ed5d3f40a46459d30dab4fad518905f90a250505050565b811561343d576133a8670de0b6b3a76400006001613bf1565b84546001600160801b03161061340f57835460018501546133e891610d35916001600160801b0390911690600160401b90046001600160401b03166115ca565b8460020160086101000a81548163ffffffff021916908363ffffffff16021790555061343d565b61341a61271061295d565b8460020160086101000a81548163ffffffff021916908363ffffffff1602179055505b6134464261288a565b8460010160186101000a8154816001600160401b0302191690836001600160401b0316021790555050505050565b815f036134945760405163162908e360e11b815260040160405180910390fd5b80546001600160801b03165f036134be57604051632cdf478160e11b815260040160405180910390fd5b6134c78161255f565b6134e457604051633fb34cfb60e11b815260040160405180910390fd5b8054613502906001600160801b03600160801b820481169116613cce565b6001600160801b031682111561142c57604051631ecb384960e21b815260040160405180910390fd5b5f516020613dbe5f395f51905f525460ff1661107857604051638dfc202b60e01b815260040160405180910390fd5b80545f906001600160801b03161580159061358857506001820154600160801b90046001600160401b031615155b80156135b6575060018201546135b2906202a30090600160801b90046001600160401b0316613c08565b4210155b801561097257505054600160801b90046001600160801b0316151590565b6135dc61392d565b61107857604051631afcd79f60e31b815260040160405180910390fd5b6129c16135d4565b5f6064613617670de0b6b3a76400006001613bf1565b6136219190613d01565b8310156136415760405163162908e360e11b815260040160405180910390fd5b5f61364c8587613bf1565b90505f6136598542613bf1565b90505f6136668284613c08565b90506136728582613d01565b93505f61367f8683613d4a565b905061368c600287613d01565b8111156136a15761369e600186613c08565b94505b50505050949350505050565b5f5f60205f8451602086015f885af1806136cc576040513d5f823e3d81fd5b50505f513d915081156136e35780600114156136f0565b6001600160a01b0384163b155b15610f6857604051635274afe760e01b81526001600160a01b0385166004820152602401611067565b5f80825560028201805460018401929092556001600160e01b0319909116905560405133907feb85dfc819a81fd844a1d2cdca33997530643d158a96628f2a6d0b835ce804759061376b908490613c1b565b60405180910390a250565b6137808282611649565b61142c5760405163e2517d3f60e01b81526001600160a01b038216600482015260248101839052604401611067565b81545f906001600160801b03168082036137cc575f915050610972565b8083116137d957826137db565b805b91505f6137e88383613cbb565b90506137f3816128f5565b85546001600160801b0319166001600160801b0391909116178555600280548491905f90613822908490613cbb565b90915550508454600160801b90046001600160801b031681101561388057613849816128f5565b85546001600160801b03918216600160801b0291161785555f8190036138805760018501805467ffffffffffffffff60801b191690555b6002850154600160601b90046001600160801b031615613925576002850154600160601b90046001600160801b03168110156138e8576138bf816128f5565b85600201600c6101000a8154816001600160801b0302191690836001600160801b031602179055505b60028501546101f4600160601b9091046001600160801b03161015613925576002850180546bffffffff0000000000000001600160e01b03191690555b505092915050565b5f6139366125a8565b54600160401b900460ff16919050565b5f60208284031215613956575f5ffd5b81356001600160e01b031981168114611f0f575f5ffd5b80356001600160a01b0381168114613983575f5ffd5b919050565b5f60208284031215613998575f5ffd5b611f0f8261396d565b5f5f5f5f5f60a086880312156139b5575f5ffd5b6139be8661396d565b94506139cc6020870161396d565b93506139da6040870161396d565b92506139e86060870161396d565b91506139f66080870161396d565b90509295509295909350565b5f60208284031215613a12575f5ffd5b5035919050565b5f5f60408385031215613a2a575f5ffd5b82359150613a3a6020840161396d565b90509250929050565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f60408385031215613a89575f5ffd5b50508035926020909101359150565b5f5f60408385031215613aa9575f5ffd5b613ab28361396d565b946020939093013593505050565b5f610120820190506001600160801b0383511682526001600160801b0360208401511660208301526040830151613b0260408401826001600160401b03169052565b506060830151613b1d60608401826001600160401b03169052565b506080830151613b3860808401826001600160401b03169052565b5060a0830151613b5360a08401826001600160401b03169052565b5060c0830151613b6e60c08401826001600160401b03169052565b5060e0830151613b8660e084018263ffffffff169052565b506101008301516126896101008401826001600160801b03169052565b5f5f5f60608486031215613bb5575f5ffd5b613bbe8461396d565b9250613bcc6020850161396d565b929592945050506040919091013590565b634e487b7160e01b5f52601160045260245ffd5b808202811582820484141761097257610972613bdd565b8082018082111561097257610972613bdd565b81546001600160801b0381168252610120820190608081901c60208401525060018301546001600160401b0381166040840152604081901c6001600160401b03166060840152608081811c6001600160401b03169084015260c081901c60a08401525060028301546001600160401b03811660c0840152604081901c63ffffffff1660e0840152606081901c6001600160801b0316610100840152612689565b8181038181111561097257610972613bdd565b6001600160801b03828116828216039081111561097257610972613bdd565b634e487b7160e01b5f52601260045260245ffd5b5f82613d0f57613d0f613ced565b500490565b6001600160401b03818116838216019081111561097257610972613bdd565b5f60208284031215613d43575f5ffd5b5051919050565b5f82613d5857613d58613ced565b50069056fe5b9244c17df7f9af15fee62b52742bf91d06911c0e0f86770806902b5e42387c65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a02dd7bc7dec4dceedda775e58dd541e08a116c6c53815c0bd028192f7b626800cd5ed15c6e187e77e9aee88184c21f4f2182ab5827cb3b7e07fbedcd63f033009b779b17422d0df92223018b32b4d1fa46e071723d6817e2486d003becc55f00ca4fbe6e77b4943cfcc7bad32bc22a7d6a91982f606ba92ba5aadb5f1e000f23a26469706673582212209f09e2adfe0f5013d4e6403b26b7b846c8a7a33b5cd3c4b91e236617322694ab64736f6c634300081e0033