2k txs
1.8k calls
constructor
constructor(address _oopzCore, address _tokenWhitelist, address _admin)
functions
accruedFees
viewfunction accruedFees(string, address) view returns (uint256)
ADMIN_ROLE
viewfunction ADMIN_ROLE() view returns (bytes32)
BASIS_POINTS
viewfunction BASIS_POINTS() view returns (uint256)
calculateBatchDistribution
purefunction calculateBatchDistribution(uint256 totalAmount, uint256 recipientCount, uint256 feeRate) pure returns (uint256 netAmountPerRecipient, uint256 totalFeeAmount)
calculateDistribution
purefunction calculateDistribution(uint256 grossAmount, uint256 feeRate) pure returns (uint256 netAmount, uint256 feeAmount)
canDistribute
viewfunction canDistribute(address token, uint256 amount) view returns (bool)
DEFAULT_ADMIN_ROLE
viewfunction DEFAULT_ADMIN_ROLE() view returns (bytes32)
DEFAULT_INITIAL_FEE_RATE
viewfunction DEFAULT_INITIAL_FEE_RATE() view returns (uint256)
defaultFeeRate
viewfunction defaultFeeRate() view returns (uint256)
distributionSummaries
viewfunction distributionSummaries(string) view returns (uint256 totalDistributed, uint256 totalFees, uint256 distributionCount)
getAccruedFees
viewfunction getAccruedFees(string source, address token) view returns (uint256)
getAllSources
viewfunction getAllSources() view returns (string[])
getDefaultFeeRate
viewfunction getDefaultFeeRate() view returns (uint256)
getDistributionSummary
viewfunction getDistributionSummary(string source) view returns (tuple)
getOOPZCore
viewfunction getOOPZCore() view returns (address)
getRoleAdmin
viewfunction getRoleAdmin(bytes32 role) view returns (bytes32)
getSourceDistributionCount
viewfunction getSourceDistributionCount(string source) view returns (uint256)
getSourceFeeInfo
viewfunction getSourceFeeInfo(string source, address token) view returns (tuple)
getSourceTokens
viewfunction getSourceTokens(string source) view returns (address[])
getTokenWhitelist
viewfunction getTokenWhitelist() view returns (address)
getTotalAccruedFeesByToken
viewfunction getTotalAccruedFeesByToken(address token) view returns (uint256)
getTotalDistributionsCount
viewfunction getTotalDistributionsCount() view returns (uint256)
getTotalFeesForSource
viewfunction getTotalFeesForSource(string source) view returns (address[] tokens, uint256[] amounts)
hasRole
viewfunction hasRole(bytes32 role, address account) view returns (bool)
isAdmin
viewfunction isAdmin(address account) view returns (bool)
isManager
viewfunction isManager(address account) view returns (bool)
isValidFeeRate
purefunction isValidFeeRate(uint256 feeRate) pure returns (bool)
isValidSource
purefunction isValidSource(string source) pure returns (bool)
MANAGER_ROLE
viewfunction MANAGER_ROLE() view returns (bytes32)
MAX_FEE_RATE
viewfunction MAX_FEE_RATE() view returns (uint256)
oopzCore
viewfunction oopzCore() view returns (address)
owner
viewfunction owner() view returns (address)
sourceFeeInfo
viewfunction sourceFeeInfo(string, address) view returns (uint256 totalCollected, uint256 lastUpdated)
supportsInterface
viewfunction supportsInterface(bytes4 interfaceId) view returns (bool)
tokenWhitelist
viewfunction tokenWhitelist() view returns (address)
totalAccruedFeesByToken
viewfunction totalAccruedFeesByToken(address) view returns (uint256)
totalDistributionsCount
viewfunction totalDistributionsCount() view returns (uint256)
addSource
nonpayablefunction addSource(string source)
distributeReward
nonpayablefunction distributeReward(string source, address recipient, address token, uint256 amount)
distributeRewardBatch
nonpayablefunction distributeRewardBatch(string source, address[] recipients, address token, uint256 totalAmount)
distributeRewardToVault
nonpayablefunction distributeRewardToVault(string source, address vault, address token, uint256 amount)
distributeRewardWithFee
nonpayablefunction distributeRewardWithFee(string source, address recipient, address token, uint256 amount, uint256 overrideFeeRate)
emergencyTokenRecovery
nonpayablefunction emergencyTokenRecovery(address token, address to, uint256 amount, string reason)
grantManagerRole
nonpayablefunction grantManagerRole(address account)
grantRole
nonpayablefunction grantRole(bytes32 role, address account)
renounceRole
nonpayablefunction renounceRole(bytes32 role, address callerConfirmation)
revokeManagerRole
nonpayablefunction revokeManagerRole(address account)
revokeRole
nonpayablefunction revokeRole(bytes32 role, address account)
sendFees
nonpayablefunction sendFees(string[] sourcesToSend)
sendFeesForSource
nonpayablefunction sendFeesForSource(string source)
setDefaultFeeRate
nonpayablefunction setDefaultFeeRate(uint256 newFeeRate)
transferOwnership
nonpayablefunction transferOwnership(address newOwner)
events
EmergencyTokenRecovery
event EmergencyTokenRecovery(address indexed admin, address indexed token, address indexed to, uint256 amount, string reason, uint256 timestamp)
FeeAccrued
event FeeAccrued(string indexed source, address indexed token, uint256 amount, uint256 timestamp)
FeeRateUpdated
event FeeRateUpdated(uint256 oldRate, uint256 newRate, address indexed admin, uint256 timestamp)
FeesContributedToOOPZ
event FeesContributedToOOPZ(address indexed sender, string[] sources, address[] tokens, uint256[] amounts, uint256 totalSources, uint256 timestamp)
ManagerRoleGranted
event ManagerRoleGranted(address indexed account, address indexed admin, uint256 timestamp)
ManagerRoleRevoked
event ManagerRoleRevoked(address indexed account, address indexed admin, uint256 timestamp)
OwnershipTransferred
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner, uint256 timestamp)
RewardDistributed
event RewardDistributed(address indexed sender, address indexed recipient, address indexed token, string source, uint256 grossAmount, uint256 netAmount, uint256 feeAmount, uint256 feeRate, uint256 timestamp)
RewardDistributedBatch
event RewardDistributedBatch(address indexed sender, address indexed token, string source, address[] recipients, uint256 grossAmount, uint256 totalNetAmount, uint256 totalFeeAmount, uint256 feeRate, uint256 recipientCount, uint256 timestamp)
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)
SourceAdded
event SourceAdded(string source, address indexed addedBy, uint256 timestamp)
errors
AccessControlBadConfirmation
error AccessControlBadConfirmation()
AccessControlUnauthorizedAccount
error AccessControlUnauthorizedAccount(address account, bytes32 neededRole)
ArrayLengthMismatch
error ArrayLengthMismatch(uint256 length1, uint256 length2)
ContractCallFailed
error ContractCallFailed(address target, bytes data)
EmptyArray
error EmptyArray()
InsufficientAmount
error InsufficientAmount(uint256 provided, uint256 required)
InvalidAddress
error InvalidAddress(address addr)
InvalidFeeRate
error InvalidFeeRate(uint256 rate)
InvalidRecipient
error InvalidRecipient(address recipient)
InvalidSource
error InvalidSource(string source)
NoRecoverableFunds
error NoRecoverableFunds(address token)
ReentrancyGuardReentrantCall
error ReentrancyGuardReentrantCall()
SafeERC20FailedDecreaseAllowance
error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease)
SafeERC20FailedOperation
error SafeERC20FailedOperation(address token)
SourceAlreadyExists
error SourceAlreadyExists(string source)
SourceNotRegistered
error SourceNotRegistered(string source)
TokenNotWhitelisted
error TokenNotWhitelisted(address token)
TransferFailed
error TransferFailed(address token, address to, uint256 amount)
UnauthorizedAccess
error UnauthorizedAccess(address caller)
creation bytecode
0x60c03461014f57601f61412238819003918201601f19168301916001600160401b038311848410176101535780849260609460405283398101031261014f5761004781610167565b61005f604061005860208501610167565b9301610167565b600180556001600160a01b0390911691821561013c576001600160a01b0316801561012a576001600160a01b038216908115610117576100c49360805260a05260018060a01b031960025416176002556107d06003556100be8161017b565b506101f1565b50604051613e3d9081610285823960805181818161161901528181612bb001526134ef015260a051818181610abe01528181610e4b015281816112890152818161146101528181611cf90152611ea10152f35b50634726455360e11b5f5260045260245ffd5b634726455360e11b5f5260045260245ffd5b82634726455360e11b5f5260045260245ffd5b5f80fd5b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b038216820361014f57565b6001600160a01b0381165f9081525f5160206141025f395f51905f52602052604090205460ff166101ec576001600160a01b03165f8181525f5160206141025f395f51905f5260205260408120805460ff191660011790553391905f5160206140c25f395f51905f528180a4600190565b505f90565b6001600160a01b0381165f9081525f5160206140e25f395f51905f52602052604090205460ff166101ec576001600160a01b03165f8181525f5160206140e25f395f51905f5260205260408120805460ff191660011790553391907fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775905f5160206140c25f395f51905f529080a460019056fe60806040526004361015610011575f80fd5b5f5f3560e01c8062a3b8ec14611e2c57806301ffc9a714611dd55780630384765c14611c84578063078b264814611c3b57806307d33455146118b657806319ce558b14611b5f578063248a9ca314611b2c57806324d7806c14611ad857806326e885e314611a065780632f2ff15d146119c85780632facaa7f14611981578063312feff31461191957806336568abe146118d4578063371ec54114610e355780633ba484ac146118b65780633c062c1814611893578063466252df146118595780635d34e95f146116035780635deb7baa146117ba5780635f70fdb51461170b578063739882a4146116c557806375b238fc1461169d57806378724fc8146116485780637bafa7f714610da057806389d6591c146116035780638da5cb5b146115da57806391d14854146115915780639211ca3c1461138357806392f6576e146109255780639a182c6c1461123d578063a217fddf14611221578063b863ebcf1461111c578063be3b078c14610f91578063be4dc94f14610eab578063bec66b4814610e7a578063ca735cc114610e35578063cb9e1c7914610dbe578063cc99154d146109c3578063cca04ee514610da0578063d1020ed714610d83578063d3a657fd146109fc578063d4e0d36f146109c3578063d547741f1461097c578063e000c9891461092a578063e1f1c4a714610925578063e719f272146108a9578063e7db730a14610695578063e94860b6146105ea578063ec87621c146105c2578063ed62d2ff146102f6578063f2fde38b146102ab5763f3ae241514610255575f80fd5b346102a85760203660031901126102a8576040610270612147565b915f516020613d685f395f51905f52815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b80fd5b50346102a85760203660031901126102a8576102c5612147565b6002546001600160a01b031633036102e3576102e090612635565b80f35b633733be5960e21b825233600452602482fd5b50346102a85760203660031901126102a8576004356001600160401b0381116105be5761032790369060040161211a565b5f516020613d685f395f51905f52835260208381526040808520335f908152925290205490919060ff161580610590575b61057d5761036682826124fa565b156105585761037636838361224e565b60208151910120610392815f52600860205260405f2054151590565b61052e5761039f81613c68565b5083526009602052604083206001600160401b03831161051a576103c3815461259a565b601f81116104d5575b508284601f821160011461044957917fe6151686c094ae17717447d9aa46f6b3a0358a75f9dc4c560aa660e661920340939161042e93879161043e575b508560011b905f198760031b1c19161790555b6040519360408552604085019161246b565b914260208201528033930390a280f35b90508201355f610409565b82865260208620915084601f198116875b8181106104ba5750917fe6151686c094ae17717447d9aa46f6b3a0358a75f9dc4c560aa660e66192034095939161042e9593106104a1575b5050600185811b01905561041c565b8301355f19600388901b60f8161c191690555f80610492565b8684013585556001909401936020938401938893500161045a565b81855260208520601f850160051c81019160208610610510575b601f0160051c01905b81811061050557506103cc565b8581556001016104f8565b90915081906104ef565b634e487b7160e01b84526041600452602484fd5b506040516378ac244760e01b81526020600482015291829161055491602484019161246b565b0390fd5b60405163fd772b5160e01b81526020600482015291829161055491602484019161246b565b633733be5960e21b835233600452602483fd5b505f516020613dc85f395f51905f52835260208381526040808520335f908152925290205460ff1615610358565b5080fd5b50346102a857806003193601126102a85760206040515f516020613d685f395f51905f528152f35b50346102a85760203660031901126102a8576004356001600160401b0381116105be5761061b90369060040161243b565b906106246126de565b5f516020613d685f395f51905f52835260208381526040808520335f908152925290205460ff161580610667575b61057d57906106609161347d565b6001805580f35b505f516020613dc85f395f51905f52835260208381526040808520335f908152925290205460ff1615610652565b50346102a85760803660031901126102a8576106af612147565b6106b761215d565b90604435916064356001600160401b0381116108a5576106db90369060040161211a565b5f516020613dc85f395f51905f52865260208681526040808820335f908152925290205490939060ff1615610892576107126126de565b6001600160a01b03169283158015610881575b61086d576040516370a0823160e01b8152306004820152602081602481885afa90811561086257879161082c575b50848752600560205260408720548082111561082357610772916124a3565b945b851561080f57806108095750845b8086116107f257507f27629061158dde3bb9d621266687df93d0c6a33239afbdfd4c1a9e483e5d8b4d916107d2916107bb878688613400565b60405196875260606020880152606087019161246b565b4260408601526001600160a01b0390921693339281900390a46001805580f35b630da801c760e31b87526004526024859052604486fd5b94610782565b63958357b760e01b87526004859052602487fd5b50508594610774565b90506020813d60201161085a575b816108476020938361222d565b8101031261085657515f610753565b5f80fd5b3d915061083a565b6040513d89823e3d90fd5b634726455360e11b86526004849052602486fd5b506001600160a01b03831615610725565b633733be5960e21b865233600452602486fd5b8480fd5b50346102a85760203660031901126102a857600435906001600160401b0382116102a8576020806108dd3660048601612293565b604051928184925191829101835e8101600b815203019020805461092160026001840154930154604051938493846040919493926060820195825260208201520152565b0390f35b612370565b50346102a85760208061093c366122b1565b9290604051928184925191829101835e810160068152030190209060018060a01b03165f526020526040805f206001815491015482519182526020820152f35b50346102a85760403660031901126102a8576109bf60043561099c61215d565b906109ba6109b5825f525f602052600160405f20015490565b612e9f565b61322d565b5080f35b50346102a85760203660031901126102a8576020906040906001600160a01b036109eb612147565b168152600583522054604051908152f35b50346102a85760803660031901126102a8576004356001600160401b0381116105be57610a2d90369060040161211a565b6024929192356001600160401b038111610d7f57610a4f90369060040161243b565b91610a58612173565b9260643595610a656126de565b610a8b610a7336858461224e565b602081519101205f52600860205260405f2054151590565b15610d5a5760405163b5af090f60e01b81526001600160a01b0380871660048301819052969190602090829060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa908115610d4f578891610d20575b5015610d0c578215610cfd578715610ce457865b838110610c7157508760035492610b1a8486846125d2565b90610b25878261331e565b938491610b348230338f6126fe565b8c5b8c8a8d818410610c4157505050505082610b6260209593610b5d610b9196610b68956124a3565b6124a3565b90612749565b948580610c2f575b610b7d91508d8a846128ed565b60405197610100895261010089019161246b565b8681038288015285815201959888995b858b10610bfb57507fefe47c2e5144a02ec45562642b256b8e08aeaacc3d48edc3c5df120b1441f284969798995060408601526060850152608084015260a083015260c08201524260e08201528033930390a36001805580f35b968735906001600160a01b0382168203610856576001600160a01b03909116815260019a909a019960209081019701610ba1565b610c3a918a846127e7565b5f85610b70565b84965060019550610c5c84610c6795969493610c6193612611565b612621565b90613400565b0184918d91610b36565b6001600160a01b03610c87610c5c83878a612611565b16158015610cc5575b610c9c57600101610b02565b87610cad610c5c602493878a612611565b630bc2c5df60e11b82526001600160a01b0316600452fd5b50610cd4610c5c828689612611565b6001600160a01b03163014610c90565b630da801c760e31b875260048890526001602452604487fd5b63521299a960e01b8752600487fd5b63751dff9760e11b87526004869052602487fd5b610d42915060203d602011610d48575b610d3a818361222d565b81019061248b565b5f610aee565b503d610d30565b6040513d8a823e3d90fd5b826105546040519283926344a6072960e11b845260206004850152602484019161246b565b8280fd5b50346102a857806003193601126102a85760206040516107d08152f35b50346102a857806003193601126102a8576020600c54604051908152f35b50346102a857602090610dd0366122f2565b9391909282604051610de181612212565b8281520152826040519384928337810160068152030190209060018060a01b03165f526020526040805f208151610e1781612212565b60206001835493848452015491019081528251918252516020820152f35b50346102a857806003193601126102a8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102a85760603660031901126102a8576040610e9f6044356024356004356125d2565b82519182526020820152f35b50346102a85760203660031901126102a857610ec5612147565b5f516020613dc85f395f51905f52825260208281526040808420335f908152925290205460ff16156102e3576001600160a01b038116908115610f7d575f516020613d685f395f51905f525f9081526020527fe84508f2c7fa9c351146748b3025cb78b45df37d868e48c6a75102fecdeee64654610f4c9190610f4790612e9f565b6130c2565b50604051904282527f28194fd5b54f51872144ad690c34b51cfcc7bcba945449eafcebfc73899f7d9160203393a380f35b634726455360e11b83526004829052602483fd5b50346102a857806003193601126102a8576040516007548082528160208101600785526020852092855b818110611103575050610fd09250038261222d565b805191610fdc8361251c565b92610fea604051948561222d565b808452610ff9601f199161251c565b01815b8181106110f2575050805b82518110156110dc5761101a8184612586565b5182526009602052604082206040519083908054906110388261259a565b80855291600181169081156110b5575060011461107e575b5050906110628160019493038261222d565b61106c8287612586565b526110778186612586565b5001611007565b8552602085208592505b81831061109f575050810160200161106282611050565b6001816020925483868801015201920191611088565b60ff191660208087019190915292151560051b850190920192506110629150839050611050565b60405160208082528190610921908201876123e3565b806060602080938801015201610ffc565b8454835260019485019486945060209093019201610fbb565b50346102a85760203660031901126102a8576004356001600160401b0381116105be5761114d90369060040161211a565b909161116c60405183858237602081858101600a815203019020613b58565b6111768151612533565b926111818251612533565b925b82518110156111f7576001906001600160a01b036111a18286612586565b51166111ad8288612586565b52604051838882376020818581016004815203019020828060a01b036111d38387612586565b5116838060a01b03165f5260205260405f20546111f08287612586565b5201611183565b6112138561092186604051938493604085526040850190612334565b90838203602085015261238c565b50346102a857806003193601126102a857602090604051908152f35b50346102a85760403660031901126102a857611257612147565b60405163b5af090f60e01b81526001600160a01b039182166004820181905290926024803593919291602091869182907f0000000000000000000000000000000000000000000000000000000000000000165afa938415611378578294611357575b508361134d575b836112d3575b6020846040519015158152f35b6040516370a0823160e01b81523360048201529350602090849060249082905afa908115611341579061130e575b1015905060205f806112c6565b506020823d602011611339575b816113286020938361222d565b810103126108565760209151611301565b3d915061131b565b604051903d90823e3d90fd5b82151593506112c0565b61137191945060203d602011610d4857610d3a818361222d565b925f6112b9565b6040513d84823e3d90fd5b50346102a85760a03660031901126102a8576004356001600160401b0381116105be576113b490369060040161211a565b91906113be61215d565b926113c7612173565b91606435608435936113d76126de565b5f516020613d685f395f51905f52865260208681526040808820335f908152925290205460ff161580611563575b61089257611417610a7336868661224e565b15611540576001600160a01b03871680158015611537575b611525575060405163b5af090f60e01b81526001600160a01b03828116600483018190529190602090829060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa908115610d4f578891611506575b50156114f4575061271085116114e05781156114c75761066095966114b6868461329a565b946114c186856124a3565b9461296f565b630da801c760e31b865260048290526001602452604486fd5b6336e6824b60e21b86526004859052602486fd5b63751dff9760e11b8752600452602486fd5b61151f915060203d602011610d4857610d3a818361222d565b5f611491565b630bc2c5df60e11b8752600452602486fd5b5030811461142f565b6040516344a6072960e11b8152602060048201528061055460248201878761246b565b505f516020613dc85f395f51905f52865260208681526040808820335f908152925290205460ff1615611405565b50346102a85760403660031901126102a85760406115ad61215d565b91600435815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102a857806003193601126102a8576002546040516001600160a01b039091168152602090f35b50346102a857806003193601126102a8576040517f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602090f35b50346102a85760203660031901126102a857600435906001600160401b0382116102a857602060028161167e366004870161211a565b91908260405193849283378101600b8152030190200154604051908152f35b50346102a857806003193601126102a85760206040515f516020613dc85f395f51905f528152f35b50346102a85760203660031901126102a857600435906001600160401b0382116102a85760206117016116fb366004860161211a565b906124fa565b6040519015158152f35b50346102a85760203660031901126102a8575f516020613dc85f395f51905f52815260208181526040808320335f90815292529020546004359060ff16156102e35761271081116117a8577fc95bfcd4e03e6bf26940036d4db059c3c0fce106be15b6d350a2eaebcdd28efd6117a26003548360035560405191829133954291846040919493926060820195825260208201520152565b0390a280f35b6336e6824b60e21b8252600452602490fd5b50346102a85760203660031901126102a8576004356001600160401b0381116105be579060206117f0606093369060040161211a565b92604080516117fe816121e3565b828152828582015201528260405193849283378101600b815203019020604051611827816121e3565b815491828252604060026001830154926020850193845201549201918252604051928352516020830152516040820152f35b50346102a85760403660031901126102a857604060043561188661187f6024358361329a565b80926124a3565b9082519182526020820152f35b50346102a85760203660031901126102a857602060405161271060043511158152f35b50346102a857806003193601126102a8576020600354604051908152f35b50346102a85760403660031901126102a8576118ee61215d565b336001600160a01b0382160361190a576109bf9060043561322d565b63334bd91960e11b8252600482fd5b50346102a85760203660031901126102a8576004356001600160401b0381116105be5761092191602061195361196d93369060040161211a565b92508260405193849283378101600a815203019020613b58565b604051918291602083526020830190612334565b50346102a857602090611993366122f2565b9391909250826040519384928337810160048152030190209060018060a01b03165f52602052602060405f2054604051908152f35b50346102a85760403660031901126102a8576109bf6004356119e861215d565b90611a016109b5825f525f602052600160405f20015490565b61304d565b50346102a85760203660031901126102a857611a20612147565b5f516020613dc85f395f51905f52825260208281526040808420335f908152925290205460ff16156102e3576001600160a01b038116908115610f7d575f516020613d685f395f51905f525f9081526020527fe84508f2c7fa9c351146748b3025cb78b45df37d868e48c6a75102fecdeee64654611aa79190611aa290612e9f565b612ed7565b50604051904282527ff12e8743cefbfb479e9c1131389476e6cd27fc147562995e9465a20d5358523660203393a380f35b50346102a85760203660031901126102a8576040611af4612147565b915f516020613dc85f395f51905f52815280602052209060018060a01b03165f52602052602060ff60405f2054166040519015158152f35b50346102a85760203660031901126102a8576020611b576004355f525f602052600160405f20015490565b604051908152f35b50346102a85760203660031901126102a8576004356001600160401b0381116105be57611b9090369060040161211a565b90611b996126de565b5f516020613d685f395f51905f52835260208381526040808520335f908152925290205460ff161580611c0d575b61057d57611bd9610a7336848461224e565b15611be8579061066091612a10565b6040516344a6072960e11b81526020600482015291829161055491602484019161246b565b505f516020613dc85f395f51905f52835260208381526040808520335f908152925290205460ff1615611bc7565b50346102a857602080611c4d366122b1565b9290604051928184925191829101835e810160048152030190209060018060a01b03165f52602052602060405f2054604051908152f35b50346102a857611c9336612189565b949390611ca19392936126de565b611caf610a7336858561224e565b15611daf576001600160a01b03841680158015611da6575b611d94575060405163b5af090f60e01b81526001600160a01b03828116600483018190529190602090829060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa908115610862578791611d75575b5015611d6357508515611d4a57946106609495600354946114b6868461329a565b630da801c760e31b855260048690526001602452604485fd5b63751dff9760e11b8652600452602485fd5b611d8e915060203d602011610d4857610d3a818361222d565b5f611d29565b630bc2c5df60e11b8652600452602485fd5b50308114611cc7565b506040516344a6072960e11b81526020600482015291829161055491602484019161246b565b50346102a85760203660031901126102a85760043563ffffffff60e01b81168091036105be57602090637965db0b60e01b8114908115611e1b575b506040519015158152f35b6301ffc9a760e01b14905082611e10565b503461085657611e3b36612189565b611e4894939291946126de565b611e56610a7336858761224e565b156120f4576001600160a01b03821693841580156120eb575b6120d85760405163b5af090f60e01b81526001600160a01b0380881660048301819052979190602090829060249082907f0000000000000000000000000000000000000000000000000000000000000000165afa908115612034575f916120b9575b50156120a657821561208e57611ee96003548461329a565b90611ef482856124a3565b94611f018530338c6126fe565b604051636eb1769f60e11b81523060048201526001600160a01b0382166024820152906020826044818d5afa918215612034575f9261205a575b5086821061203f575b5050863b15610856576040516311f9fbc960e21b81526001600160a01b0382166004820152602481018690525f81604481838c5af1801561203457611ff2575b5091817fb03ffa9377f642b6ffc8c05d57d92b12f42019aa2d7e1a864654a21243ea4c0495949381611fd694611fe0575b611fc291508589856128ed565b6003549060405195869533994295886124c4565b0390a46001805580f35b611feb9189856127e7565b5f81611fb5565b7fb03ffa9377f642b6ffc8c05d57d92b12f42019aa2d7e1a864654a21243ea4c04959493919950916120275f611fd69461222d565b5f99919394955091611f84565b6040513d5f823e3d90fd5b61204c61205392886124a3565b908a612756565b5f80611f44565b9091506020813d602011612086575b816120766020938361222d565b810103126108565751905f611f3b565b3d9150612069565b82630da801c760e31b5f52600452600160245260445ffd5b8663751dff9760e11b5f5260045260245ffd5b6120d2915060203d602011610d4857610d3a818361222d565b5f611ed1565b84630bc2c5df60e11b5f5260045260245ffd5b50308514611e6f565b50506105546040519283926344a6072960e11b845260206004850152602484019161246b565b9181601f84011215610856578235916001600160401b038311610856576020838186019501011161085657565b600435906001600160a01b038216820361085657565b602435906001600160a01b038216820361085657565b604435906001600160a01b038216820361085657565b608060031982011261085657600435906001600160401b038211610856576121b39160040161211a565b90916024356001600160a01b038116810361085657906044356001600160a01b0381168103610856579060643590565b606081019081106001600160401b038211176121fe57604052565b634e487b7160e01b5f52604160045260245ffd5b604081019081106001600160401b038211176121fe57604052565b90601f801991011681019081106001600160401b038211176121fe57604052565b9291926001600160401b0382116121fe5760405191612277601f8201601f19166020018461222d565b829481845281830111610856578281602093845f960137010152565b9080601f83011215610856578160206122ae9335910161224e565b90565b604060031982011261085657600435906001600160401b038211610856576122db91600401612293565b906024356001600160a01b03811681036108565790565b604060031982011261085657600435906001600160401b0382116108565761231c9160040161211a565b90916024356001600160a01b03811681036108565790565b90602080835192838152019201905f5b8181106123515750505090565b82516001600160a01b0316845260209384019390920191600101612344565b34610856575f3660031901126108565760206040516127108152f35b90602080835192838152019201905f5b8181106123a95750505090565b825184526020938401939092019160010161239c565b805180835260209291819084018484015e5f828201840152601f01601f1916010190565b9080602083519182815201916020808360051b8301019401925f915b83831061240e57505050505090565b909192939460208061242c600193601f1986820301875289516123bf565b970193019301919392906123ff565b9181601f84011215610856578235916001600160401b038311610856576020808501948460051b01011161085657565b908060209392818452848401375f828201840152601f01601f1916010190565b90816020910312610856575180151581036108565790565b919082039182116124b057565b634e487b7160e01b5f52601160045260245ffd5b93906124e19060a09693999897949960c0875260c087019161246b565b9760208501526040840152606083015260808201520152565b61250591369161224e565b518015159081612513575090565b60409150111590565b6001600160401b0381116121fe5760051b60200190565b9061253d8261251c565b61254a604051918261222d565b828152809261255b601f199161251c565b0190602036910137565b8051156125725760200190565b634e487b7160e01b5f52603260045260245ffd5b80518210156125725760209160051b010190565b90600182811c921680156125c8575b60208310146125b457565b634e487b7160e01b5f52602260045260245ffd5b91607f16916125a9565b9181156125f957906125f16125ea6125f6938561329a565b80946124a3565b613354565b91565b50630da801c760e31b5f52600452600160245260445ffd5b91908110156125725760051b0190565b356001600160a01b03811681036108565790565b6001600160a01b0381169081156126cb576002546001600160a01b038116918383146126c55783612684926bffffffffffffffffffffffff60a01b161760025561267e81612f5c565b50612fcd565b5061268e81613140565b50612698816131af565b507fc13a1166d81cd3b0b352a367aebab95f3a6f6bc695fdab8e9a9d335239c3861b6020604051428152a3565b50505050565b50634726455360e11b5f5260045260245ffd5b6002600154146126ef576002600155565b633ee5aeb560e01b5f5260045ffd5b6040516323b872dd60e01b60208201526001600160a01b0392831660248201529290911660448301526064808301939093529181526127479161274260848361222d565b613981565b565b919082018092116124b057565b604051636eb1769f60e11b81523060048201526001600160a01b0383166024820152909190602081806044810103816001600160a01b0387165afa908115612034575f916127b3575b50612747936127ad91612749565b916139d9565b90506020813d6020116127df575b816127ce6020938361222d565b81010312610856575161274761279f565b3d91506127c1565b7fa961ae9de88ed51608da4a767b3328eb8ae09c392fc220561ef4bf94857ca80e91604091949394825182828237602081848101600481520301902060018060a01b0387165f52602052825f2061283f868254612749565b9055612868835183838237602081858101600a8152030190209660018060a01b03168097613cd6565b50855f526005602052825f2061287f868254612749565b90558251828282376020818481016006815203019020865f52602052825f206128a9868254612749565b90558251828282376020818481016006815203019020865f52602052825f20600142910155818351928392833781015f8152039020928151908152426020820152a3565b60029360209293612913604051868582378581888101600b815203019020918254612749565b90556129376001604051868582378581888101600b81520301902001918254612749565b90558260405193849283378101600b81520301902001805490600182018092116124b05755600c54600181018091116124b057600c55565b6001600160a01b03841697949691957fb03ffa9377f642b6ffc8c05d57d92b12f42019aa2d7e1a864654a21243ea4c049590946129eb93906129b38a30338e6126fe565b6129be87878d613400565b81806129f0575b6129d291508a8a866128ed565b60405195869560018060a01b03169933994295886124c4565b0390a4565b6129fb918a866127e7565b5f816129c5565b5f1981146124b05760010190565b6040515f9392610ca09290612a25848461222d565b60648352601f19840180366020860137612a42604051958661222d565b606485523660208601375f92612a6b60405183858237602081858101600a815203019020613b58565b5f5b8151811015612b86576001600160a01b03612a888284612586565b511660405185878237602081878101600481520301902060018060a01b0382165f5260205260405f2054908115612b7c5760405186888237602081888101600481520301902060018060a01b0382165f526020525f60408120555f5f5b898110612b2c575b5015612b00575b50506001905b01612a6d565b96612b249160019398612b138388612586565b52612b1e828b612586565b52612a02565b95905f612af4565b838b846001600160a01b03612b41858c612586565b511614612b52575050600101612ae5565b82935090612b66612b7393612b6c93612586565b51612749565b918b612586565b5260015f612aed565b5050600190612afa565b5050928015612e9657612b9881612533565b93612ba282612533565b955f5b838110612e585750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690505f5b828110612d775750803b156108565760405163f45464ad60e01b815260606004820152905f908290818381612c40612c2d8d612c1b606485018f612334565b8481036003190160248601529061238c565b8281036003190160448401528a8c61246b565b03925af1801561203457612d62575b50865b818110612d24575050604080519690612c6b818961222d565b60018852959695601f1901905b818110612d11575050612cfb92612cb67f36c88106b52f73e617cea64e877d3b7bca5e80cb67bdedbc30ba5068591d337a9593612ced93369161224e565b612cbf87612565565b52612cc986612565565b50612cdf6040519660a0885260a08801906123e3565b908682036020880152612334565b90848203604086015261238c565b91600160608201524260808201528033930390a2565b6060602082890181019190915201612c78565b80612d3160019288612586565b51828060a01b03612d428389612586565b51168a526005602052612d5a60408b209182546124a3565b905501612c52565b612d6f9197505f9061222d565b5f955f612c4f565b6001600160a01b03612d898288612586565b511690612d968189612586565b51604051636eb1769f60e11b81523060048201526001600160a01b038516602482015292602084604481845afa80156120345785905f90612e24575b6001955083811015612df757612deb90612df1946124a3565b91612756565b01612bdc565b838111612e08575b50505050612df1565b612e1b93612e15916124a3565b91613a9e565b5f808481612dff565b50506020843d8211612e50575b81612e3e6020938361222d565b81010312610856578460019451612dd2565b3d9150612e31565b6001906001600160a01b03612e6d8286612586565b5116612e79828a612586565b52612e848184612586565b51612e8f828b612586565b5201612ba5565b50505050509050565b5f8181526020818152604080832033845290915290205460ff1615612ec15750565b63e2517d3f60e01b5f523360045260245260445ffd5b6001600160a01b0381165f9081525f516020613d885f395f51905f52602052604090205460ff16612f57576001600160a01b03165f8181525f516020613d885f395f51905f5260205260408120805460ff191660011790553391905f516020613d685f395f51905f52905f516020613d285f395f51905f529080a4600190565b505f90565b6001600160a01b0381165f9081525f516020613de85f395f51905f52602052604090205460ff16612f57576001600160a01b03165f8181525f516020613de85f395f51905f5260205260408120805460ff191660011790553391905f516020613d285f395f51905f528180a4600190565b6001600160a01b0381165f9081525f516020613d485f395f51905f52602052604090205460ff16612f57576001600160a01b03165f8181525f516020613d485f395f51905f5260205260408120805460ff191660011790553391905f516020613dc85f395f51905f52905f516020613d285f395f51905f529080a4600190565b5f818152602081815260408083206001600160a01b038616845290915290205460ff166130bc575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19166001179055339291905f516020613d285f395f51905f529080a4600190565b50505f90565b6001600160a01b0381165f9081525f516020613d885f395f51905f52602052604090205460ff1615612f57576001600160a01b03165f8181525f516020613d885f395f51905f5260205260408120805460ff191690553391905f516020613d685f395f51905f52905f516020613da85f395f51905f529080a4600190565b6001600160a01b0381165f9081525f516020613de85f395f51905f52602052604090205460ff1615612f57576001600160a01b03165f8181525f516020613de85f395f51905f5260205260408120805460ff191690553391905f516020613da85f395f51905f528180a4600190565b6001600160a01b0381165f9081525f516020613d485f395f51905f52602052604090205460ff1615612f57576001600160a01b03165f8181525f516020613d485f395f51905f5260205260408120805460ff191690553391905f516020613dc85f395f51905f52905f516020613da85f395f51905f529080a4600190565b5f818152602081815260408083206001600160a01b038616845290915290205460ff16156130bc575f818152602081815260408083206001600160a01b0395909516808452949091528120805460ff19169055339291905f516020613da85f395f51905f529080a4600190565b9091905f905f198482099084810292838084109303928084039314613311578261271011156132ff57507fbc01a36e2eb1c432ca57a786c226809d495182a9930be0ded288ce703afb7e919394612710910990828211900360fc1b910360041c170290565b634e487b71905260116020526024601cfd5b5050506127109192500490565b5f91905f19828209928282029384808210910381811461334c5703600111156132ff57509060019109900390565b505050505090565b5f1960018209918180841093039280840393146133e057828111156133c9578060018309815f0382168092046002816003021880820260020302808202600203028082026002030280820260020302808202600203028091026002030293600183805f03040190848311900302920304170290565b634e487b715f52156003026011186020526024601cfd5b809250156133ec570490565b634e487b7160e01b5f52601260045260245ffd5b60405163a9059cbb60e01b60208201526001600160a01b039290921660248301526044808301939093529181526127479161274260648361222d565b91908110156125725760051b81013590601e19813603018212156108565701908135916001600160401b038311610856576020018236038113610856579190565b5f90821561397257610ca090604051613496838261222d565b60648152601f198301803660208401376134b3604051948561222d565b606484523660208501375f5f5b8681106137ff575080156137f7576134d781612533565b916134e182612533565b945f5b8381106137b95750507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690505f5b8281106136e4575061352d8785613ba0565b90803b156108565760405163f45464ad60e01b815260606004820152915f91839182908490829061358d9061357b8d613569606486018e612334565b8581036003190160248701529061238c565b838103600319016044850152906123bf565b03925af18015612034576136cf575b50845b818110613691575050604051938560a0860160a087525260c0850160c08760051b87010193809280601e1983360301925b8a831061363757505050505050916136158285947f36c88106b52f73e617cea64e877d3b7bca5e80cb67bdedbc30ba5068591d337a9661362395036020870152612334565b90838203604085015261238c565b9260608201524260808201528033930390a2565b90919293949660bf198a820301865287358581121561368d5782016020813591016001600160401b0382116108a55781360381136108a55761367f600193602093849361246b565b9901960194930191906135d0565b8380fd5b8061369e60019287612586565b51828060a01b036136af8387612586565b5116885260056020526136c7604089209182546124a3565b90550161359f565b6136dc9195505f9061222d565b5f935f61359c565b6001600160a01b036136f68286612586565b5116906137038188612586565b51604051636eb1769f60e11b81523060048201526001600160a01b038516602482015292602084604481845afa80156120345785905f90613785575b600195508381101561375e57612deb90613758946124a3565b0161351b565b83811161376f575b50505050613758565b61377c93612e15916124a3565b5f808481613766565b50506020843d82116137b1575b8161379f6020938361222d565b8101031261085657846001945161373f565b3d9150613792565b6001906001600160a01b036137ce8286612586565b51166137da8288612586565b526137e58184612586565b516137f0828a612586565b52016134e4565b505050505050565b959190939461381961381288858761343c565b369161224e565b936040519361383e865195602081818a0198808a835e8101600a815203019020613b58565b925f5b845181101561395e576001600160a01b0361385c8287612586565b51166040516020818b51808c835e8101600481520301902060018060a01b0382165f5260205260405f2054908115613954578b908960208c604051928391518091835e8101600481520301902060018060a01b0382165f526020525f60408120555f5f5b8d8110613904575b50156138dc575b5050506001905b01613841565b91612b1e8c80936138fb956001979f6138f5908e612586565b52612586565b98908a5f6138cf565b9192909190836001600160a01b0361391c848e612586565b5116146139305750600101908d92916138c0565b92915061394b61394485612b668487612586565b9184612586565b5260015f6138c8565b50506001906138d6565b5097969394509790945060019150016134c0565b63521299a960e01b5f5260045ffd5b905f602091828151910182855af115612034575f513d6139d057506001600160a01b0381163b155b6139b05750565b635274afe760e01b5f9081526001600160a01b0391909116600452602490fd5b600114156139a9565b60405163095ea7b360e01b60208083019182526001600160a01b0385166024840152604480840196909652948252929390925f90613a1860648661222d565b84519082855af15f513d82613a79575b505015613a3457505050565b60405163095ea7b360e01b60208201526001600160a01b0390931660248401525f60448085019190915283526127479261274290613a7360648261222d565b82613981565b909150613a9657506001600160a01b0381163b15155b5f80613a28565b600114613a8f565b604051636eb1769f60e11b81523060048201526001600160a01b0383166024820152929392909190602081806044810103816001600160a01b0387165afa908115612034575f91613b26575b50848110613aff5793612747939403916139d9565b63e570110f60e01b5f9081526001600160a01b039092166004526024526044849052606490fd5b90506020813d602011613b50575b81613b416020938361222d565b8101031261085657515f613aea565b3d9150613b34565b90604051918281549182825260208201905f5260205f20925f5b818110613b875750506127479250038361222d565b8454835260019485019487945060209093019201613b72565b9190918215613c51578035601e19823603018112156108565781018035906001600160401b03821161085657602001813603811361085657919391613be691369161224e565b926001915b808310613bf757505050565b9091936020613c486001809383613c0f8a888a61343c565b90816040519785899651918291018688015e850191600b60fa1b85840152602183013701015f838201520301601f19810183528261222d565b94019190613beb565b509050604051613c6260208261222d565b5f815290565b805f52600860205260405f2054155f14612f5757600754600160401b8110156121fe576001810180600755811015612572577fa66cc928b5edb82af9bd49922954155ab7b0942694bea4ce44661d9a8736c688018190556007545f9182526008602052604090912055600190565b5f8281526001820160205260409020546130bc57805490600160401b8210156121fe57600182018082558210156125725782600192825f5260205f2001558054925f520160205260405f205560019056fe2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d7d7ffb7a348e1c6a02869081a26547b49160dd3df72d1d75a570eb9b698292ec241ecf16d79d0f8dbfb92cbc07fe17840425976cf0667f022fe9877caa831b08e84508f2c7fa9c351146748b3025cb78b45df37d868e48c6a75102fecdeee645f6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171ba49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775ad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5a264697066735822122028ac83b9d9d477f091006aa93ae68c3d927358b5d6bfc542cee60c52f44b57ce64736f6c634300081c00332f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d7d7ffb7a348e1c6a02869081a26547b49160dd3df72d1d75a570eb9b698292ecad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb5000000000000000000000000fb64eb18084c2d38f2d61a37028f02280a271e7e000000000000000000000000719b3215c1041b8b7a2b33ae2744e01ecfa8932a00000000000000000000000000921726681d22706be0e377770b66a4f7f55d7c