267 txs
264 calls
constructor
constructor(address _admin, address _manager, address _multisig, address _stakingStorage, address _strategiesRegistry, address _claimsJournal, address _poolManager)
functions
batchCalculateReward
viewfunction batchCalculateReward(bytes32[] stakeIds, uint256[] poolIds, uint256[] strategyIds) view returns (uint256[])
calculateReward
viewfunction calculateReward(address staker, bytes32 stakeId, uint256 poolId, uint256 strategyId) view returns (uint256)
calculateRewardsForPool
viewfunction calculateRewardsForPool(bytes32 stakeId, uint256 poolId, uint256 layerId) view returns (uint256[], uint256[], uint8[])
claimsJournal
viewfunction claimsJournal() view returns (address)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
getCurrentDay
viewfunction getCurrentDay() view returns (uint16)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
MANAGER_ROLE
viewfunction MANAGER_ROLE() view returns (bytes32)
MULTISIG_ROLE
viewfunction MULTISIG_ROLE() view returns (bytes32)
paused
viewfunction paused() view returns (bool)
poolManager
viewfunction poolManager() view returns (address)
rewardAssignedToPool
viewfunction rewardAssignedToPool(uint256 poolId, uint256 strategyId) view returns (uint256)
stakingStorage
viewfunction stakingStorage() view returns (address)
strategiesRegistry
viewfunction strategiesRegistry() view returns (address)
strategyBalances
viewfunction strategyBalances(uint256) view returns (uint256)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
assignRewardToPool
nonpayablefunction assignRewardToPool(uint256 _poolId, uint256 _strategyId, uint256 _amount)
batchClaimReward
nonpayablefunction batchClaimReward(bytes32[] stakeIds, uint256[] poolIds, uint256[] strategyIds)
claimReward
nonpayablefunction claimReward(bytes32 stakeId, uint256 poolId, uint256 strategyId)
fundStrategy
nonpayablefunction fundStrategy(uint256 _strategyId, uint256 _amount)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
pause
nonpayablefunction pause()
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
setClaimsJournal
nonpayablefunction setClaimsJournal(address _newClaimsJournal)
transferStrategyBalance
nonpayablefunction transferStrategyBalance(uint256 _fromStrategyId, uint256 _toStrategyId, uint256 _amount)
unpause
nonpayablefunction unpause()
withdrawStrategy
nonpayablefunction withdrawStrategy(uint256 _strategyId, uint256 _amount, address _to)
events
Paused
event Paused(address account)
RewardClaimed
event RewardClaimed(address indexed user, bytes32 stakeId, uint256 indexed poolId, uint256 indexed strategyId, uint256 rewardAmount, uint16 claimDay)
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)
StrategyFunded
event StrategyFunded(uint256 indexed strategyId, uint256 amount)
StrategyWithdrawn
event StrategyWithdrawn(uint256 indexed strategyId, uint256 amount)
Unpaused
event Unpaused(address account)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
AmountMustBeGreaterThanZero
error AmountMustBeGreaterThanZero()
CallerIsNotManager
error CallerIsNotManager()
ControllerAlreadySet
error ControllerAlreadySet()
DeclaredAmountLessThanDeposited
error DeclaredAmountLessThanDeposited(uint256 declared, uint256 deposited)
DeclaredRewardZero
error DeclaredRewardZero()
DepositAmountZero
error DepositAmountZero()
DepositExceedsDeclared
error DepositExceedsDeclared(uint256 total, uint256 declared)
EnforcedPause
error EnforcedPause()
ExpectedPause
error ExpectedPause()
InsufficientDepositedFunds
error InsufficientDepositedFunds(uint256 requested, uint256 available)
InsufficientStrategyBalance
error InsufficientStrategyBalance()
InvalidAddress
error InvalidAddress()
InvalidInputArrays
error InvalidInputArrays()
InvalidPoolDates
error InvalidPoolDates()
LayerAlreadyHasClaim
error LayerAlreadyHasClaim(uint256 layer, uint16 day)
LayerAlreadyHasExclusiveClaim
error LayerAlreadyHasExclusiveClaim(uint256 layer, uint16 day)
LayerAlreadyHasSemiExclusiveClaim
error LayerAlreadyHasSemiExclusiveClaim(uint256 layer, uint16 day)
LayerIsLocked
error LayerIsLocked(uint256 layer, uint16 day)
NoRewardToClaim
error NoRewardToClaim()
NoRewardToRestake
error NoRewardToRestake()
NotStakeOwner
error NotStakeOwner(address sender, address owner)
PoolAlreadyActiveOrFinalized
error PoolAlreadyActiveOrFinalized(uint256 poolId)
PoolAlreadyCalculated
error PoolAlreadyCalculated(uint256 poolId)
PoolDoesNotExist
error PoolDoesNotExist(uint256 poolId)
PoolHasAlreadyBeenAnnounced
error PoolHasAlreadyBeenAnnounced()
PoolNotDeclared
error PoolNotDeclared(uint256 poolId)
PoolNotEnded
error PoolNotEnded(uint256 poolId)
PoolNotFullyFunded
error PoolNotFullyFunded(uint256 poolId)
PoolNotInitializedOrCalculated
error PoolNotInitializedOrCalculated(uint256 poolId)
PoolNotSetUp
error PoolNotSetUp(uint256 poolId)
PoolNotStarted
error PoolNotStarted(uint256 poolId)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
RewardAlreadyGranted
error RewardAlreadyGranted()
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
StrategyCannotBeChanged
error StrategyCannotBeChanged()
StrategyExist
error StrategyExist(uint256 strategyId)
StrategyNotExist
error StrategyNotExist(uint256 strategyId)
StrategyNotPreFunded
error StrategyNotPreFunded(uint256 strategyId)
TotalEligibleWeightIsZero
error TotalEligibleWeightIsZero()
UserNotEligibleForPool
error UserNotEligibleForPool()
creation bytecode
0x60e060405234801561000f575f5ffd5b50604051612ae5380380612ae583398101604081905261002e916101ad565b8686868561003c5f856100ed565b506100545f516020612ac55f395f51905f52846100ed565b5061007f7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab836100ed565b506001600160a01b0316608052505060016003555061009e5f886100ed565b506100b65f516020612ac55f395f51905f52876100ed565b506001600160a01b0393841660a052600480546001600160a01b0319169285169290921790915590911660c0525061024492505050565b5f828152602081815260408083206001600160a01b038516845290915281205460ff1661018d575f838152602081815260408083206001600160a01b03861684529091529020805460ff191660011790556101453390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a4506001610190565b505f5b92915050565b6001600160a01b03811681146101aa575f5ffd5b50565b5f5f5f5f5f5f5f60e0888a0312156101c3575f5ffd5b87516101ce81610196565b60208901519097506101df81610196565b60408901519096506101f081610196565b606089015190955061020181610196565b608089015190945061021281610196565b60a089015190935061022381610196565b60c089015190925061023481610196565b8091505092959891949750929550565b60805160a05160c0516127e76102de5f395f81816104280152818161051701528181610f96015281816111c1015281816112c90152818161180b0152818161191c015281816119cb01528181611a900152611d5f01525f81816103a9015261113501525f81816102ae015281816106bc0152818161093d01528181610d2501528181610e1c015281816110a9015261174f01526127e75ff3fe608060405234801561000f575f5ffd5b50600436106101c6575f3560e01c80638456cb59116100fe578063c36536a71161009e578063e328400c1161006e578063e328400c1461044a578063ec87621c14610471578063ed43d3ad14610485578063f26a1a4714610498575f5ffd5b8063c36536a7146103de578063c3c727ba146103f1578063d547741f14610410578063dc4c90d314610423575f5ffd5b8063a1f7aeb7116100d9578063a1f7aeb71461037d578063a217fddf1461039d578063b518a00e146103a4578063bb15c4f3146103cb575f5ffd5b80638456cb591461034f57806391d148541461035757806396c684dd1461036a575f5ffd5b80632fcb3972116101695780633f4ba83a116101445780633f4ba83a146103165780635c975abb1461031e57806369535fe71461032957806382f85c901461033c575f5ffd5b80632fcb3972146102a957806336568abe146102e85780633e6968b6146102fb575f5ffd5b806314160e83116101a457806314160e831461023f5780631798f7ca14610261578063248a9ca3146102745780632f2ff15d14610296575f5ffd5b806301ffc9a7146101ca5780630c003a98146101f257806312e7f17c1461022a575b5f5ffd5b6101dd6101d8366004611f76565b6104ab565b60405190151581526020015b60405180910390f35b61021c610200366004611fa4565b600560209081525f928352604080842090915290825290205481565b6040519081526020016101e9565b61023d610238366004611fd8565b6104e1565b005b61025261024d366004611ff3565b61050e565b6040516101e993929190612086565b61023d61026f3660046120f8565b610670565b61021c61028236600461212e565b5f9081526020819052604090206001015490565b61023d6102a4366004612145565b6107e3565b6102d07f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016101e9565b61023d6102f6366004612145565b61080d565b610303610845565b60405161ffff90911681526020016101e9565b61023d610853565b60025460ff166101dd565b61023d6103373660046121bb565b610875565b61023d61034a366004611fa4565b61090e565b61023d610ae4565b6101dd610365366004612145565b610b03565b61023d610378366004611ff3565b610b2b565b61039061038b3660046121bb565b610bfe565b6040516101e9919061225a565b61021c5f81565b6102d07f000000000000000000000000000000000000000000000000000000000000000081565b61023d6103d9366004611ff3565b610cf6565b61023d6103ec366004611ff3565b610f69565b61021c6103ff36600461212e565b60016020525f908152604090205481565b61023d61041e366004612145565b611041565b6102d07f000000000000000000000000000000000000000000000000000000000000000081565b61021c7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab81565b61021c5f5160206127925f395f51905f5281565b6004546102d0906001600160a01b031681565b61021c6104a636600461226c565b611065565b5f6001600160e01b03198216637965db0b60e01b14806104db57506301ffc9a760e01b6001600160e01b03198316145b92915050565b5f6104eb8161107d565b50600480546001600160a01b0319166001600160a01b0392909216919091179055565b60608060605f5f7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166365439db688886040518363ffffffff1660e01b815260040161056c929190918252602082015260400190565b5f60405180830381865afa158015610586573d5f5f3e3d5ffd5b505050506040513d5f823e601f3d908101601f191682016040526105ad919081019061238b565b915091505f825167ffffffffffffffff8111156105cc576105cc6122a4565b6040519080825280602002602001820160405280156105f5578160200160208202803683370190505b5090505f6106038a60601c90565b90505f5b845181101561065f575f85828151811061062357610623612449565b60200260200101519050610639838d8d84611087565b84838151811061064b5761064b612449565b602090810291909101015250600101610607565b509299909850909650945050505050565b7fa5a0b70b385ff7611cd3840916bd08b10829e5bf9e6637cf79dd9a427fc0e2ab61069a8161107d565b6106a4848461141e565b604051636ccf2fa760e01b8152600481018590525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636ccf2fa790602401602060405180830381865afa158015610709573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061072d919061245d565b6001600160a01b03166369940d796040518163ffffffff1660e01b8152600401602060405180830381865afa158015610768573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061078c919061245d565b90506107a26001600160a01b038216848661146d565b847f27683c8889e99eaeb6f7c9e177d5d70bcfc8ab059b36c61ed4a51fa26dddb7cb856040516107d491815260200190565b60405180910390a25050505050565b5f828152602081905260409020600101546107fd8161107d565b61080783836114cc565b50505050565b6001600160a01b03811633146108365760405163334bd91960e11b815260040160405180910390fd5b610840828261155b565b505050565b5f61084e6115c4565b905090565b5f5160206127925f395f51905f5261086a8161107d565b6108726115d2565b50565b848314801561088357508481145b6108a05760405163744bba7b60e01b815260040160405180910390fd5b5f5b85811015610905576108fd8787838181106108bf576108bf612449565b905060200201358686848181106108d8576108d8612449565b905060200201358585858181106108f1576108f1612449565b90506020020135610b2b565b6001016108a2565b50505050505050565b5f5160206127925f395f51905f526109258161107d565b604051636ccf2fa760e01b8152600481018490525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636ccf2fa790602401602060405180830381865afa15801561098a573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109ae919061245d565b9050836001600160a01b0382166109e45760405163b393400f60e01b81526004016109db91815260200190565b60405180910390fd5b508083610a0457604051635e85ae7360e01b815260040160405180910390fd5b5f816001600160a01b03166369940d796040518163ffffffff1660e01b8152600401602060405180830381865afa158015610a41573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a65919061245d565b90508460015f8881526020019081526020015f205f828254610a87919061248c565b90915550610aa290506001600160a01b038216333088611624565b857fdf6bc5d53caf80630bcba0ff64b0f79c973ce3cb0c3edf552df7e00951519b5486604051610ad491815260200190565b60405180910390a2505050505050565b5f5160206127925f395f51905f52610afb8161107d565b61087261165d565b5f918252602082815260408084206001600160a01b0393909316845291905290205460ff1690565b610b3361169a565b610b3b6116c4565b5f5f5f610b498686866116ea565b9250925092505f610b5c84888888611087565b90505f8111610b7e57604051635aa9184d60e01b815260040160405180910390fd5b610b8b848787858b611a6a565b610b9784868584611bbf565b8486856001600160a01b03167faaf0084f616cbb4f11f076022e4183ec07a5199180cca1ce9b04557ffac271eb8a85610bce6115c4565b60408051938452602084019290925261ffff169082015260600160405180910390a4505050506108406001600355565b60605f8667ffffffffffffffff811115610c1a57610c1a6122a4565b604051908082528060200260200182016040528015610c43578160200160208202803683370190505b5090505f5b87811015610cea57610cc5610c758a8a84818110610c6857610c68612449565b9050602002013560601c90565b8a8a84818110610c8757610c87612449565b90506020020135898985818110610ca057610ca0612449565b90506020020135888886818110610cb957610cb9612449565b90506020020135611087565b828281518110610cd757610cd7612449565b6020908102919091010152600101610c48565b50979650505050505050565b5f5160206127925f395f51905f52610d0d8161107d565b604051636ccf2fa760e01b8152600481018590525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636ccf2fa790602401602060405180830381865afa158015610d72573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d96919061245d565b90505f816001600160a01b03166369940d796040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dd5573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610df9919061245d565b604051636ccf2fa760e01b8152600481018790529091505f906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636ccf2fa790602401602060405180830381865afa158015610e61573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e85919061245d565b90505f816001600160a01b03166369940d796040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ec4573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610ee8919061245d565b9050806001600160a01b0316836001600160a01b031614610f4b5760405162461bcd60e51b815260206004820152601760248201527f446966666572656e742072657761726420746f6b656e7300000000000000000060448201526064016109db565b610f55888761141e565b610f5f8787611c47565b5050505050505050565b5f5160206127925f395f51905f52610f808161107d565b60405163dc23f1f160e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063dc23f1f190602401602060405180830381865afa158015610fe3573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100791906124b3565b156110255760405163d56fb85d60e01b815260040160405180910390fd5b505f928352600560209081526040808520938552929052912055565b5f8281526020819052604090206001015461105b8161107d565b610807838361155b565b5f61107285858585611087565b90505b949350505050565b6108728133611c6d565b604051636ccf2fa760e01b8152600481018290525f9081906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636ccf2fa790602401602060405180830381865afa1580156110ee573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611112919061245d565b6040516373b2e09160e11b8152600481018790529091505f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063e765c1229060240160a060405180830381865afa15801561117a573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061119e91906124dd565b60405163068bcd8d60e01b8152600481018790529091505f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063068bcd8d9060240160c060405180830381865afa158015611206573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061122a9190612578565b6004805460405163961646b560e01b81529182018a905260248201899052604482018890529192505f916001600160a01b03169063961646b590606401602060405180830381865afa158015611282573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906112a6919061260b565b604051633e2dcc5f60e21b8152600481018990529091505f906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063f8b7317c90602401602060405180830381865afa15801561130e573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113329190612624565b90508015801561134457506080830151155b15611356575f95505050505050611075565b5f5f846080015111611368578161136e565b83608001515b9050856001600160a01b0316634c6516228c878460055f8f81526020019081526020015f205f8e81526020019081526020015f205489604001518a606001518a6040518863ffffffff1660e01b81526004016113d0979695949392919061263b565b602060405180830381865afa1580156113eb573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061140f9190612624565b9b9a5050505050505050505050565b5f828152600160205260409020548181101561144d576040516354e89c2b60e11b815260040160405180910390fd5b61145782826126d5565b5f93845260016020526040909320929092555050565b6040516001600160a01b0383811660248301526044820183905261084091859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b038381831617835250505050611caa565b5f6114d78383610b03565b611554575f838152602081815260408083206001600160a01b03861684529091529020805460ff1916600117905561150c3390565b6001600160a01b0316826001600160a01b0316847f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45060016104db565b505f6104db565b5f6115668383610b03565b15611554575f838152602081815260408083206001600160a01b0386168085529252808320805460ff1916905551339286917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45060016104db565b5f61084e62015180426126e8565b6115da611d16565b6002805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6040516001600160a01b0384811660248301528381166044830152606482018390526108079186918216906323b872dd9060840161149a565b6116656116c4565b6002805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586116073390565b6002600354036116bd57604051633ee5aeb560e01b815260040160405180910390fd5b6002600355565b60025460ff16156116e85760405163d93c066560e01b815260040160405180910390fd5b565b5f5f5f6116f78660601c90565b925033836001600160a01b03811682146117375760405163af71074f60e01b81526001600160a01b039283166004820152911660248201526044016109db565b5050604051636ccf2fa760e01b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636ccf2fa790602401602060405180830381865afa15801561179c573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117c0919061245d565b9150836001600160a01b0383166117ed5760405163b393400f60e01b81526004016109db91815260200190565b5060405163194418cb60e01b815260048101869052602481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063194418cb90604401602060405180830381865afa158015611858573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061187c9190612624565b905061188a83868387611d39565b5f826001600160a01b0316630eb9b15a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118c7573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118eb9190612707565b9050600181600181111561190157611901612056565b036119b557604051633e22ad3760e01b8152600481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690633e22ad3790602401602060405180830381865afa158015611969573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061198d91906124b3565b86906119af5760405163d2a9552d60e01b81526004016109db91815260200190565b50611a60565b6040516351f41c0960e01b8152600481018790527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906351f41c0990602401602060405180830381865afa158015611a18573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3c91906124b3565b8690611a5e57604051630bd187e160e21b81526004016109db91815260200190565b505b5093509350939050565b604051633379141760e21b81526004810185905260248101839052604481018490525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063cde4505c90606401602060405180830381865afa158015611add573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b019190612725565b90505f80826002811115611b1757611b17612056565b03611b2357505f611b48565b6002826002811115611b3757611b37612056565b03611b4457506002611b48565b5060015b6004546001600160a01b03166394c072e1888887898887611b676115c4565b6040518863ffffffff1660e01b8152600401611b899796959493929190612740565b5f604051808303815f87803b158015611ba0575f5ffd5b505af1158015611bb2573d5f5f3e3d5ffd5b5050505050505050505050565b611bc9838261141e565b5f826001600160a01b03166369940d796040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c06573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611c2a919061245d565b9050611c406001600160a01b038216868461146d565b5050505050565b5f8281526001602052604081208054839290611c6490849061248c565b90915550505050565b611c778282610b03565b611ca65760405163e2517d3f60e01b81526001600160a01b0382166004820152602481018390526044016109db565b5050565b5f5f60205f8451602086015f885af180611cc9576040513d5f823e3d81fd5b50505f513d91508115611ce0578060011415611ced565b6001600160a01b0384163b155b1561080757604051635274afe760e01b81526001600160a01b03851660048201526024016109db565b60025460ff166116e857604051638dfc202b60e01b815260040160405180910390fd5b604051633379141760e21b81526004810184905260248101839052604481018290525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063cde4505c90606401602060405180830381865afa158015611dac573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dd09190612725565b60048054604051631c7847db60e21b81526001600160a01b038981169382019390935260248101889052604481018790529293505f929116906371e11f6c90606401602060405180830381865afa158015611e2d573d5f5f3e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e519190612725565b90506001826002811115611e6757611e67612056565b03611ebc575f816002811115611e7f57611e7f612056565b1484611e896115c4565b9091611eb5576040516314d8bc7f60e21b8152600481019290925261ffff1660248201526044016109db565b5050611f6e565b6001816002811115611ed057611ed0612056565b141584611edb6115c4565b9091611f075760405163e619e40f60e01b8152600481019290925261ffff1660248201526044016109db565b5060029050826002811115611f1e57611f1e612056565b03611f6e576002816002811115611f3757611f37612056565b141584611f426115c4565b9091610f5f57604051633818f85b60e11b8152600481019290925261ffff1660248201526044016109db565b505050505050565b5f60208284031215611f86575f5ffd5b81356001600160e01b031981168114611f9d575f5ffd5b9392505050565b5f5f60408385031215611fb5575f5ffd5b50508035926020909101359150565b6001600160a01b0381168114610872575f5ffd5b5f60208284031215611fe8575f5ffd5b8135611f9d81611fc4565b5f5f5f60608486031215612005575f5ffd5b505081359360208301359350604090920135919050565b5f8151808452602084019350602083015f5b8281101561204c57815186526020958601959091019060010161202e565b5093949350505050565b634e487b7160e01b5f52602160045260245ffd5b6003811061087257634e487b7160e01b5f52602160045260245ffd5b606081525f612098606083018661201c565b82810360208401526120aa818661201c565b8381036040850152845180825260208087019350909101905f5b818110156120eb5783516120d78161206a565b8352602093840193909201916001016120c4565b5090979650505050505050565b5f5f5f6060848603121561210a575f5ffd5b8335925060208401359150604084013561212381611fc4565b809150509250925092565b5f6020828403121561213e575f5ffd5b5035919050565b5f5f60408385031215612156575f5ffd5b82359150602083013561216881611fc4565b809150509250929050565b5f5f83601f840112612183575f5ffd5b50813567ffffffffffffffff81111561219a575f5ffd5b6020830191508360208260051b85010111156121b4575f5ffd5b9250929050565b5f5f5f5f5f5f606087890312156121d0575f5ffd5b863567ffffffffffffffff8111156121e6575f5ffd5b6121f289828a01612173565b909750955050602087013567ffffffffffffffff811115612211575f5ffd5b61221d89828a01612173565b909550935050604087013567ffffffffffffffff81111561223c575f5ffd5b61224889828a01612173565b979a9699509497509295939492505050565b602081525f611f9d602083018461201c565b5f5f5f5f6080858703121561227f575f5ffd5b843561228a81611fc4565b966020860135965060408601359560600135945092505050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156122e1576122e16122a4565b604052919050565b5f67ffffffffffffffff821115612302576123026122a4565b5060051b60200190565b60038110610872575f5ffd5b5f82601f830112612327575f5ffd5b815161233a612335826122e9565b6122b8565b8082825260208201915060208360051b86010192508583111561235b575f5ffd5b602085015b838110156123815780516123738161230c565b835260209283019201612360565b5095945050505050565b5f5f6040838503121561239c575f5ffd5b825167ffffffffffffffff8111156123b2575f5ffd5b8301601f810185136123c2575f5ffd5b80516123d0612335826122e9565b8082825260208201915060208360051b8501019250878311156123f1575f5ffd5b6020840193505b828410156124135783518252602093840193909101906123f8565b80955050505050602083015167ffffffffffffffff811115612433575f5ffd5b61243f85828601612318565b9150509250929050565b634e487b7160e01b5f52603260045260245ffd5b5f6020828403121561246d575f5ffd5b8151611f9d81611fc4565b634e487b7160e01b5f52601160045260245ffd5b808201808211156104db576104db612478565b805180151581146124ae575f5ffd5b919050565b5f602082840312156124c3575f5ffd5b611f9d8261249f565b805161ffff811681146124ae575f5ffd5b5f60a08284031280156124ee575f5ffd5b5060405160a0810167ffffffffffffffff81118282101715612512576125126122a4565b60405282516001600160801b038116811461252b575f5ffd5b8152612539602084016124cc565b602082015261254a604084016124cc565b604082015261255b606084016124cc565b606082015261256c608084016124cc565b60808201529392505050565b5f60c0828403128015612589575f5ffd5b5060405160c0810167ffffffffffffffff811182821017156125ad576125ad6122a4565b6040526125b98361249f565b81526125c76020840161249f565b60208201526125d8604084016124cc565b60408201526125e9606084016124cc565b60608201526080838101519082015260a0928301519281019290925250919050565b5f6020828403121561261b575f5ffd5b611f9d826124cc565b5f60208284031215612634575f5ffd5b5051919050565b5f6101608201905060018060a01b03891682526001600160801b03885116602083015261ffff602089015116604083015261ffff604089015116606083015261ffff606089015116608083015261ffff60808901511660a08301528660c08301528560e08301526126b361010083018661ffff169052565b61ffff841661012083015261ffff831661014083015298975050505050505050565b818103818111156104db576104db612478565b5f8261270257634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215612717575f5ffd5b815160028110611f9d575f5ffd5b5f60208284031215612735575f5ffd5b8151611f9d8161230c565b6001600160a01b03881681526020810187905260408101869052606081018590526080810184905260e081016127758461206a565b8360a083015261ffff831660c08301529897505050505050505056fe241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08a264697066735822122099ee92ec4aa182c6bef98ce9e3653d744647dbead348ac89b5db570562dd271164736f6c634300081e0033241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b080000000000000000000000006972480b73fd3a5278c039cf072b499c4ca22e330000000000000000000000006972480b73fd3a5278c039cf072b499c4ca22e33000000000000000000000000b8b16d2c54ccf3af3d3d8b1402740e0570545e62000000000000000000000000faa8a501cf7ffd8080b0864f2c959e8cbcf830300000000000000000000000004b98fb37149f45fa498857e48b7c9c50739e42070000000000000000000000000acd045ff839ceec9ee16c7433c228ce773f69d9000000000000000000000000c7e162f85a4470046b22d059dc6a85a40f039ad1