Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
TokenController
Compiler Version
v0.8.18+commit.87f61d96
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; import "../../interfaces/IAssessment.sol"; import "../../interfaces/IGovernance.sol"; import "../../interfaces/ISAFURAToken.sol"; import "../../interfaces/IPool.sol"; import "../../interfaces/IPooledStaking.sol"; import "../../interfaces/IQuotationData.sol"; import "../../interfaces/IStakingPool.sol"; import "../../interfaces/ITokenController.sol"; import "../../libraries/SafeUintCast.sol"; import "../../libraries/StakingPoolLibrary.sol"; import "../../abstract/MasterAwareV2.sol"; import "./external/LockHandler.sol"; contract TokenController is ITokenController, LockHandler, MasterAwareV2 { using SafeUintCast for uint; address public _unused_token; address public _unused_pooledStaking; uint public _unused_minCALockTime; uint public _unused_claimSubmissionGracePeriod; // coverId => CoverInfo mapping(uint => CoverInfo) public override coverInfo; // pool id => { rewards, deposits } mapping(uint => StakingPoolNXMBalances) public override stakingPoolNXMBalances; // pool id => manager mapping(uint => address) internal stakingPoolManagers; // pool id => offer mapping(uint => StakingPoolOwnershipOffer) internal stakingPoolOwnershipOffers; // manager => pool ids mapping(address => uint[]) internal managerStakingPools; ISAFURAToken public immutable token; IQuotationData public immutable quotationData; address public immutable claimsReward; address public immutable stakingPoolFactory; constructor( address quotationDataAddress, address claimsRewardAddress, address stakingPoolFactoryAddress, address tokenAddress ) { quotationData = IQuotationData(quotationDataAddress); claimsReward = claimsRewardAddress; stakingPoolFactory = stakingPoolFactoryAddress; token = ISAFURAToken(tokenAddress); } /* ========== DEPENDENCIES ========== */ function pooledStaking() internal view returns (IPooledStaking) { return IPooledStaking(internalContracts[uint(ID.PS)]); } function assessment() internal view returns (IAssessment) { return IAssessment(internalContracts[uint(ID.AS)]); } function governance() internal view returns (IGovernance) { return IGovernance(internalContracts[uint(ID.GV)]); } function pool() internal view returns (IPool) { return IPool(internalContracts[uint(ID.P1)]); } function changeDependentContractAddress() public override { internalContracts[uint(ID.PS)] = master.getLatestAddress("PS"); internalContracts[uint(ID.AS)] = master.getLatestAddress("AS"); internalContracts[uint(ID.GV)] = master.getLatestAddress("GV"); internalContracts[uint(ID.P1)] = master.getLatestAddress("P1"); } /** * @dev to change the operator address * @param _newOperator is the new address of operator */ function changeOperator(address _newOperator) public override onlyGovernance { token.changeOperator(_newOperator); } /** * @dev Proxies token transfer through this contract to allow staking when members are locked for voting * @param _from Source address * @param _to Destination address * @param _value Amount to transfer */ function operatorTransfer( address _from, address _to, uint _value ) external override onlyInternal returns (bool) { token.operatorTransfer(_from, _value); if (_to != address(this)) { token.transfer(_to, _value); } return true; } /** * @dev burns tokens of an address * @param _of is the address to burn tokens of * @param amount is the amount to burn * @return the boolean status of the burning process */ function burnFrom(address _of, uint amount) public override onlyInternal returns (bool) { return token.burnFrom(_of, amount); } /** * @dev Adds an address to whitelist maintained in the contract * @param _member address to add to whitelist */ function addToWhitelist(address _member) public virtual override onlyInternal { token.addToWhiteList(_member); } /** * @dev Removes an address from the whitelist in the token * @param _member address to remove */ function removeFromWhitelist(address _member) public override onlyInternal { token.removeFromWhiteList(_member); } /** * @dev Mints new tokens for an address and checks if the address is a member * @param _member address to send the minted tokens to * @param _amount number of tokens to mint */ function mint(address _member, uint _amount) public override onlyInternal { _mint(_member, _amount); } /** * @dev Internal function to mint new tokens for an address and checks if the address is a member * @dev Other internal functions in this contract should use _mint and never token.mint directly * @param _member address to send the minted tokens to * @param _amount number of tokens to mint */ function _mint(address _member, uint _amount) internal { require( _member == address(this) || token.whiteListed(_member), "TokenController: Address is not a member" ); token.mint(_member, _amount); } /** * @dev Lock the user's tokens * @param _of user's address. */ function lockForMemberVote(address _of, uint _days) public override onlyInternal { token.lockForMemberVote(_of, _days); } /** * @dev Unlocks the withdrawable tokens against CLA of a specified addresses * @param users Addresses of users for whom the tokens are unlocked */ function withdrawClaimAssessmentTokens(address[] calldata users) external whenNotPaused { for (uint256 i = 0; i < users.length; i++) { if (locked[users[i]]["CLA"].claimed) { continue; } uint256 amount = locked[users[i]]["CLA"].amount; if (amount > 0) { locked[users[i]]["CLA"].claimed = true; emit Unlocked(users[i], "CLA", amount); token.transfer(users[i], amount); } } } /** * @dev Updates Uint Parameters of a code * @param code whose details we want to update * @param value value to set */ function updateUintParameters(bytes8 code, uint value) external view onlyGovernance { // silence compiler warnings code; value; revert("TokenController: invalid param code"); } function getLockReasons(address _of) external override view returns (bytes32[] memory reasons) { return lockReason[_of]; } function totalSupply() public override view returns (uint256) { return token.totalSupply(); } /// Returns the base voting power. It is used in governance and snapshot voting. /// Includes the delegated tokens via staking pools. /// /// @param _of The member address for which the base voting power is calculated. function totalBalanceOf(address _of) public override view returns (uint) { return _totalBalanceOf(_of, true); } /// Returns the base voting power. It is used in governance and snapshot voting. /// Does not include the delegated tokens via staking pools in order to act as a fallback if /// voting including delegations fails for whatever reason. /// /// @param _of The member address for which the base voting power is calculated. function totalBalanceOfWithoutDelegations(address _of) public override view returns (uint) { return _totalBalanceOf(_of, false); } function _totalBalanceOf(address _of, bool includeManagedStakingPools) internal view returns (uint) { uint amount = token.balanceOf(_of); // This loop can be removed once all cover notes are withdrawn for (uint256 i = 0; i < lockReason[_of].length; i++) { amount = amount + tokensLocked(_of, lockReason[_of][i]); } // TODO: can be removed after PooledStaking is decommissioned amount += pooledStaking().stakerReward(_of); amount += pooledStaking().stakerDeposit(_of); (uint assessmentStake,,) = assessment().stakeOf(_of); amount += assessmentStake; if (includeManagedStakingPools) { uint managedStakingPoolCount = managerStakingPools[_of].length; for (uint i = 0; i < managedStakingPoolCount; i++) { uint poolId = managerStakingPools[_of][i]; amount += stakingPoolNXMBalances[poolId].deposits; } } return amount; } /// Returns the NXM price in ETH. To be use by external protocols. /// /// @dev Intended for external protocols - this is a proxy and the contract address won't change function getTokenPrice() public override view returns (uint tokenPrice) { // get spot price from ramm return pool().getTokenPrice(); } /// Withdraws governance rewards for the given member address /// @dev This function requires a batchSize that fits in one block. It cannot be 0. function withdrawGovernanceRewards( address memberAddress, uint batchSize ) public whenNotPaused { uint governanceRewards = governance().claimReward(memberAddress, batchSize); require(governanceRewards > 0, "TokenController: No withdrawable governance rewards"); token.transfer(memberAddress, governanceRewards); } /// Withdraws governance rewards to the destination address. It can only be called by the owner /// of the rewards. /// @dev This function requires a batchSize that fits in one block. It cannot be 0. function withdrawGovernanceRewardsTo( address destination, uint batchSize ) public whenNotPaused { uint governanceRewards = governance().claimReward(msg.sender, batchSize); require(governanceRewards > 0, "TokenController: No withdrawable governance rewards"); token.transfer(destination, governanceRewards); } function getPendingRewards(address member) public view returns (uint) { (uint totalPendingAmountInNXM,,) = assessment().getRewards(member); uint governanceRewards = governance().getPendingReward(member); return totalPendingAmountInNXM + governanceRewards; } /// Function used to claim all pending rewards in one tx. It can be used to selectively withdraw /// rewards. /// /// @param forUser The address for whom the governance and/or assessment rewards are /// withdrawn. /// @param fromGovernance When true, governance rewards are withdrawn. /// @param fromAssessment When true, assessment rewards are withdrawn. /// @param batchSize The maximum number of iterations to avoid unbounded loops when /// withdrawing governance and/or assessment rewards. function withdrawPendingRewards( address forUser, bool fromGovernance, bool fromAssessment, uint batchSize ) external whenNotPaused { if (fromAssessment) { assessment().withdrawRewards(forUser, batchSize.toUint104()); } if (fromGovernance) { uint governanceRewards = governance().claimReward(forUser, batchSize); require(governanceRewards > 0, "TokenController: No withdrawable governance rewards"); token.transfer(forUser, governanceRewards); } } /** * @dev Returns tokens locked for a specified address for a * specified reason * * @param _of The address whose tokens are locked * @param _reason The reason to query the lock tokens for */ function tokensLocked( address _of, bytes32 _reason ) public view returns (uint256 amount) { if (!locked[_of][_reason].claimed) { amount = locked[_of][_reason].amount; } } // Can be removed once all cover notes are withdrawn function getWithdrawableCoverNotes( address coverOwner ) public view returns ( uint[] memory coverIds, bytes32[] memory lockReasons, uint withdrawableAmount ) { uint[] memory allCoverIds = quotationData.getAllCoversOfUser(coverOwner); uint[] memory idsQueue = new uint[](allCoverIds.length); bytes32[] memory lockReasonsQueue = new bytes32[](allCoverIds.length); uint idsQueueLength = 0; for (uint i = 0; i < allCoverIds.length; i++) { uint coverId = allCoverIds[i]; bytes32 lockReason = keccak256(abi.encodePacked("CN", coverOwner, coverId)); uint coverNoteAmount = tokensLocked(coverOwner, lockReason); if (coverNoteAmount > 0) { idsQueue[idsQueueLength] = coverId; lockReasonsQueue[idsQueueLength] = lockReason; withdrawableAmount += coverNoteAmount; idsQueueLength++; } } coverIds = new uint[](idsQueueLength); lockReasons = new bytes32[](idsQueueLength); for (uint i = 0; i < idsQueueLength; i++) { coverIds[i] = idsQueue[i]; lockReasons[i] = lockReasonsQueue[i]; } } // Can be removed once all cover notes are withdrawn function withdrawCoverNote( address user, uint[] calldata coverIds, uint[] calldata indexes ) external whenNotPaused override { uint reasonCount = lockReason[user].length; require(reasonCount > 0, "TokenController: No locked cover notes found"); uint lastReasonIndex = reasonCount - 1; uint totalAmount = 0; // The iteration is done from the last to first to prevent reason indexes from // changing due to the way we delete the items (copy last to current and pop last). // The provided indexes array must be ordered, otherwise reason index checks will fail. for (uint i = coverIds.length; i > 0; i--) { // note: cover owner is implicitly checked using the reason hash bytes32 _reason = keccak256(abi.encodePacked("CN", user, coverIds[i - 1])); uint _reasonIndex = indexes[i - 1]; require(lockReason[user][_reasonIndex] == _reason, "TokenController: Bad reason index"); uint amount = locked[user][_reason].amount; totalAmount = totalAmount + amount; delete locked[user][_reason]; if (lastReasonIndex != _reasonIndex) { lockReason[user][_reasonIndex] = lockReason[user][lastReasonIndex]; } lockReason[user].pop(); emit Unlocked(user, _reason, amount); if (lastReasonIndex > 0) { lastReasonIndex = lastReasonIndex - 1; } } token.transfer(user, totalAmount); } function getStakingPoolManager(uint poolId) external override view returns (address) { return stakingPoolManagers[poolId]; } function getManagerStakingPools(address manager) external override view returns (uint[] memory) { return managerStakingPools[manager]; } function isStakingPoolManager(address member) external override view returns (bool) { return managerStakingPools[member].length > 0; } function getStakingPoolOwnershipOffer( uint poolId ) external override view returns (address proposedManager, uint deadline) { return ( stakingPoolOwnershipOffers[poolId].proposedManager, stakingPoolOwnershipOffers[poolId].deadline ); } /// Transfer ownership of all staking pools managed by a member to a new address. Used when switching membership. /// /// @param from address of the member whose pools are being transferred /// @param to the new address of the member function transferStakingPoolsOwnership(address from, address to) external override onlyInternal { uint stakingPoolCount = managerStakingPools[from].length; if (stakingPoolCount == 0) { return; } while (stakingPoolCount > 0) { // remove from old uint poolId = managerStakingPools[from][stakingPoolCount - 1]; managerStakingPools[from].pop(); // add to new and update manager managerStakingPools[to].push(poolId); stakingPoolManagers[poolId] = to; stakingPoolCount--; } } function _assignStakingPoolManager(uint poolId, address manager) internal { address previousManager = stakingPoolManagers[poolId]; // remove previous manager if (previousManager != address(0)) { uint managedPoolCount = managerStakingPools[previousManager].length; // find staking pool id index and remove from previous manager's list // on-chain iteration is expensive, but we don't expect to have many pools per manager for (uint i = 0; i < managedPoolCount; i++) { if (managerStakingPools[previousManager][i] == poolId) { uint lastIndex = managedPoolCount - 1; managerStakingPools[previousManager][i] = managerStakingPools[previousManager][lastIndex]; managerStakingPools[previousManager].pop(); break; } } } // add staking pool id to new manager's list managerStakingPools[manager].push(poolId); stakingPoolManagers[poolId] = manager; } /// Transfers the ownership of a staking pool to a new address /// Used by PooledStaking during the migration /// /// @param poolId id of the staking pool /// @param manager address of the new manager of the staking pool function assignStakingPoolManager(uint poolId, address manager) external override onlyInternal { _assignStakingPoolManager(poolId, manager); } /// Creates a ownership transfer offer for a staking pool /// The offer can be accepted by the proposed manager before the deadline expires /// /// @param poolId id of the staking pool /// @param proposedManager address of the proposed manager /// @param deadline timestamp after which the offer expires function createStakingPoolOwnershipOffer( uint poolId, address proposedManager, uint deadline ) external override { require(msg.sender == stakingPoolManagers[poolId], "TokenController: Caller is not staking pool manager"); require(block.timestamp < deadline, "TokenController: Deadline cannot be in the past"); stakingPoolOwnershipOffers[poolId] = StakingPoolOwnershipOffer(proposedManager, deadline.toUint96()); } /// Accepts a staking pool ownership offer /// /// @param poolId id of the staking pool function acceptStakingPoolOwnershipOffer(uint poolId) external override { address oldManager = stakingPoolManagers[poolId]; require( block.timestamp > token.isLockedForMV(oldManager), "TokenController: Current manager is locked for voting in governance" ); require( msg.sender == stakingPoolOwnershipOffers[poolId].proposedManager, "TokenController: Caller is not the proposed manager" ); require( stakingPoolOwnershipOffers[poolId].deadline > block.timestamp, "TokenController: Ownership offer has expired" ); _assignStakingPoolManager(poolId, msg.sender); delete stakingPoolOwnershipOffers[poolId]; } /// Cancels a staking pool ownership offer /// /// @param poolId id of the staking pool function cancelStakingPoolOwnershipOffer(uint poolId) external override { require(msg.sender == stakingPoolManagers[poolId], "TokenController: Caller is not staking pool manager"); delete stakingPoolOwnershipOffers[poolId]; } function _stakingPool(uint poolId) internal view returns (address) { return StakingPoolLibrary.getAddress(stakingPoolFactory, poolId); } function mintStakingPoolNXMRewards(uint amount, uint poolId) external { require(msg.sender == _stakingPool(poolId), "TokenController: Caller not a staking pool"); _mint(address(this), amount); stakingPoolNXMBalances[poolId].rewards += amount.toUint128(); } function burnStakingPoolNXMRewards(uint amount, uint poolId) external { require(msg.sender == _stakingPool(poolId), "TokenController: Caller not a staking pool"); stakingPoolNXMBalances[poolId].rewards -= amount.toUint128(); token.burn(amount); } function depositStakedNXM(address from, uint amount, uint poolId) external { require(msg.sender == _stakingPool(poolId), "TokenController: Caller not a staking pool"); stakingPoolNXMBalances[poolId].deposits += amount.toUint128(); token.operatorTransfer(from, amount); } function withdrawNXMStakeAndRewards( address to, uint stakeToWithdraw, uint rewardsToWithdraw, uint poolId ) external { require(msg.sender == _stakingPool(poolId), "TokenController: Caller not a staking pool"); StakingPoolNXMBalances memory poolBalances = stakingPoolNXMBalances[poolId]; poolBalances.deposits -= stakeToWithdraw.toUint128(); poolBalances.rewards -= rewardsToWithdraw.toUint128(); stakingPoolNXMBalances[poolId] = poolBalances; token.transfer(to, stakeToWithdraw + rewardsToWithdraw); } function burnStakedNXM(uint amount, uint poolId) external { require(msg.sender == _stakingPool(poolId), "TokenController: Caller not a staking pool"); stakingPoolNXMBalances[poolId].deposits -= amount.toUint128(); token.burn(amount); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; import "../interfaces/ISAFURAMaster.sol"; import "../interfaces/IMasterAwareV2.sol"; import "../interfaces/IMemberRoles.sol"; abstract contract MasterAwareV2 is IMasterAwareV2 { ISAFURAMaster public master; mapping(uint => address payable) public internalContracts; modifier onlyMember { require( IMemberRoles(internalContracts[uint(ID.MR)]).checkRole( msg.sender, uint(IMemberRoles.Role.Member) ), "Caller is not a member" ); _; } modifier onlyAdvisoryBoard { require( IMemberRoles(internalContracts[uint(ID.MR)]).checkRole( msg.sender, uint(IMemberRoles.Role.AdvisoryBoard) ), "Caller is not an advisory board member" ); _; } modifier onlyInternal { require(master.isInternal(msg.sender), "Caller is not an internal contract"); _; } modifier onlyMaster { if (address(master) != address(0)) { require(address(master) == msg.sender, "Not master"); } _; } modifier onlyGovernance { require( master.checkIsAuthToGoverned(msg.sender), "Caller is not authorized to govern" ); _; } modifier onlyEmergencyAdmin { require( msg.sender == master.emergencyAdmin(), "Caller is not emergency admin" ); _; } modifier whenPaused { require(master.isPause(), "System is not paused"); _; } modifier whenNotPaused { require(!master.isPause(), "System is paused"); _; } function getInternalContractAddress(ID id) internal view returns (address payable) { return internalContracts[uint(id)]; } function changeMasterAddress(address masterAddress) public onlyMaster { master = ISAFURAMaster(masterAddress); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IAssessment { /* ========== DATA STRUCTURES ========== */ enum UintParams { minVotingPeriodInDays, stakeLockupPeriodInDays, payoutCooldownInDays, silentEndingPeriodInDays } struct Configuration { // The minimum number of days the users can vote on polls uint8 minVotingPeriodInDays; // Number of days the users must wait from their last vote to withdraw their stake. uint8 stakeLockupPeriodInDays; // Number of days the users must wait after a poll closes to redeem payouts. uint8 payoutCooldownInDays; // Number of days representing the silence period. It is used to extend a poll's end date when // a vote is cast during the silence period before the end date. uint8 silentEndingPeriodInDays; } struct Stake { uint96 amount; uint104 rewardsWithdrawableFromIndex; uint16 fraudCount; /*uint32 unused,*/ } // Holds data for a vote belonging to an assessor. // // The structure is used to keep track of user's votes. Each vote is used to determine // a user's share of rewards or to create a fraud resolution which excludes fraudulent votes // from the initial poll. struct Vote { // Identifier of the claim or incident uint80 assessmentId; // If the assessor votes to accept the event it's true otherwise it's false bool accepted; // Date and time when the vote was cast uint32 timestamp; // How many tokens were staked when the vote was cast uint96 stakedAmount; } // Holds poll results for an assessment. // // The structure is used to keep track of all votes on a given assessment such as how many NXM were // used to cast accept and deny votes as well as when the poll started and when it ends. struct Poll { // The amount of NXM from accept votes uint96 accepted; // The amount of NXM from deny votes uint96 denied; // Timestamp of when the poll started. uint32 start; // Timestamp of when the poll ends. uint32 end; } // Holds data for an assessment belonging to an assessable event (individual claims, yield token // incidents etc.). // // The structure is used to keep track of the total reward that should be distributed to // assessors, the assessment deposit the claimants made to start the assessment, and the poll // coresponding to this assessment. struct Assessment { // See Poll struct Poll poll; // The amount of NXM representing the assessment reward which is split among those who voted. uint128 totalRewardInNXM; // An amount of ETH which is sent back to the claimant when the poll result is positive, // otherwise it is kep it the pool to back the assessment rewards. This allows claimants to // open an unlimited amount of claims and prevents unbacked NXM to be minted through the // assessment process. uint128 assessmentDepositInETH; } /* ========== VIEWS ========== */ function getAssessmentsCount() external view returns (uint); function assessments(uint id) external view returns (Poll memory poll, uint128 totalReward, uint128 assessmentDeposit); function getPoll(uint assessmentId) external view returns (Poll memory); function getRewards(address user) external view returns ( uint totalPendingAmount, uint withdrawableAmount, uint withdrawableUntilIndex ); function getVoteCountOfAssessor(address assessor) external view returns (uint); function votesOf(address user, uint id) external view returns (uint80 assessmentId, bool accepted, uint32 timestamp, uint96 stakedAmount); function stakeOf(address user) external view returns (uint96 amount, uint104 rewardsWithdrawableFromIndex, uint16 fraudCount); function config() external view returns ( uint8 minVotingPeriodInDays, uint8 stakeLockupPeriodInDays, uint8 payoutCooldownInDays, uint8 silentEndingPeriodInDays ); function hasAlreadyVotedOn(address voter, uint pollId) external view returns (bool); /* === MUTATIVE FUNCTIONS ==== */ function stake(uint96 amount) external; function unstake(uint96 amount, address to) external; function withdrawRewards( address user, uint104 batchSize ) external returns (uint withdrawn, uint withdrawnUntilIndex); function withdrawRewardsTo( address destination, uint104 batchSize ) external returns (uint withdrawn, uint withdrawnUntilIndex); function startAssessment(uint totalReward, uint assessmentDeposit) external returns (uint); function castVotes( uint[] calldata assessmentIds, bool[] calldata votes, string[] calldata ipfsAssessmentDataHashes, uint96 stakeIncrease ) external; function submitFraud(bytes32 root) external; function processFraud( uint256 rootIndex, bytes32[] calldata proof, address assessor, uint256 lastFraudulentVoteIndex, uint96 burnAmount, uint16 fraudCount, uint256 voteBatchSize ) external; function updateUintParameters(UintParams[] calldata paramNames, uint[] calldata values) external; /* ========== EVENTS ========== */ event StakeDeposited(address user, uint104 amount); event StakeWithdrawn(address indexed user, address to, uint96 amount); event VoteCast(address indexed user, uint256 assessmentId, uint96 stakedAmount, bool accepted, string ipfsAssessmentDataHash); event RewardWithdrawn(address user, address to, uint256 amount); event FraudProcessed(uint assessmentId, address assessor, Poll poll); event FraudSubmitted(bytes32 root); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IGovernance { event Proposal( address indexed proposalOwner, uint256 indexed proposalId, uint256 dateAdd, string proposalTitle, string proposalSD, string proposalDescHash ); event Solution( uint256 indexed proposalId, address indexed solutionOwner, uint256 indexed solutionId, string solutionDescHash, uint256 dateAdd ); event Vote( address indexed from, uint256 indexed proposalId, uint256 indexed voteId, uint256 dateAdd, uint256 solutionChosen ); event RewardClaimed( address indexed member, uint gbtReward ); /// @dev VoteCast event is called whenever a vote is cast that can potentially close the proposal. event VoteCast (uint256 proposalId); /// @dev ProposalAccepted event is called when a proposal is accepted so that a server can listen that can /// call any offchain actions event ProposalAccepted (uint256 proposalId); /// @dev CloseProposalOnTime event is called whenever a proposal is created or updated to close it on time. event CloseProposalOnTime ( uint256 indexed proposalId, uint256 time ); /// @dev ActionSuccess event is called whenever an onchain action is executed. event ActionSuccess ( uint256 proposalId ); struct DelegateVote { address follower; address leader; uint lastUpd; } /// @dev Creates a new proposal /// @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal /// @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective function createProposal( string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash, uint _categoryId ) external; /// @dev Edits the details of an existing proposal and creates new version /// @param _proposalId Proposal id that details needs to be updated /// @param _proposalDescHash Proposal description hash having long and short description of proposal. function updateProposal( uint _proposalId, string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash ) external; /// @dev Categorizes proposal to proceed further. Categories shows the proposal objective. function categorizeProposal( uint _proposalId, uint _categoryId, uint _incentives ) external; /// @dev Submit proposal with solution /// @param _proposalId Proposal id /// @param _solutionHash Solution hash contains parameters, values and description needed according to proposal function submitProposalWithSolution( uint _proposalId, string calldata _solutionHash, bytes calldata _action ) external; /// @dev Creates a new proposal with solution and votes for the solution /// @param _proposalDescHash Proposal description hash through IPFS having Short and long description of proposal /// @param _categoryId This id tells under which the proposal is categorized i.e. Proposal's Objective /// @param _solutionHash Solution hash contains parameters, values and description needed according to proposal function createProposalwithSolution( string calldata _proposalTitle, string calldata _proposalSD, string calldata _proposalDescHash, uint _categoryId, string calldata _solutionHash, bytes calldata _action ) external; /// @dev Casts vote using total balance including delegated tokens via managed staking pools /// @param _proposalId Proposal id /// @param _solutionChosen solution chosen while voting function submitVote(uint _proposalId, uint _solutionChosen) external; /// @dev Casts vote using total balance without delegated tokens via managed staking pools /// @param _proposalId Proposal id /// @param _solutionChosen solution chosen while voting function submitVoteWithoutDelegations(uint _proposalId, uint _solutionChosen) external; function closeProposal(uint _proposalId) external; function tokenHoldingTime() external returns (uint); function claimReward(address _memberAddress, uint _maxRecords) external returns (uint pendingDAppReward); function proposal(uint _proposalId) external view returns ( uint proposalId, uint category, uint status, uint finalVerdict, uint totalReward ); function canCloseProposal(uint _proposalId) external view returns (uint closeValue); function allowedToCatgorize() external view returns (uint roleId); function getPendingReward(address _memberAddress) external view returns (uint pendingDAppReward); function getFollowers(address _add) external view returns (uint[] memory); function followerDelegation(address _add) external view returns (uint delegationId); function allDelegation(uint _delegationId) external view returns (address follower, address leader, uint lastUpd); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IMasterAwareV2 { // TODO: if you update this enum, update lib/constants.js as well enum ID { TC, // TokenController.sol P1, // Pool.sol MR, // MemberRoles.sol MC, // MCR.sol CO, // Cover.sol SP, // StakingProducts.sol PS, // LegacyPooledStaking.sol GV, // Governance.sol GW, // LegacyGateway.sol - removed CL, // CoverMigrator.sol - removed AS, // Assessment.sol CI, // IndividualClaims.sol - Claims for Individuals CG, // YieldTokenIncidents.sol - Claims for Groups RA, // Ramm.sol ST, // SafeTracker.sol CP // CoverProducts.sol } function changeMasterAddress(address masterAddress) external; function changeDependentContractAddress() external; function internalContracts(uint) external view returns (address payable); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IMemberRoles { enum Role {Unassigned, AdvisoryBoard, Member, Owner, Auditor} function join(address _userAddress, uint nonce, bytes calldata signature) external payable; function switchMembership(address _newAddress) external; function switchMembershipAndAssets( address newAddress, uint[] calldata coverIds, uint[] calldata stakingTokenIds ) external; function switchMembershipOf(address member, address _newAddress) external; function totalRoles() external view returns (uint256); function changeAuthorized(uint _roleId, address _newAuthorized) external; function setKycAuthAddress(address _add) external; function members(uint _memberRoleId) external view returns (uint, address[] memory memberArray); function numberOfMembers(uint _memberRoleId) external view returns (uint); function authorized(uint _memberRoleId) external view returns (address); function roles(address _memberAddress) external view returns (uint[] memory); function checkRole(address _memberAddress, uint _roleId) external view returns (bool); function getMemberLengthForAllRoles() external view returns (uint[] memory totalMembers); function memberAtIndex(uint _memberRoleId, uint index) external view returns (address, bool); function membersLength(uint _memberRoleId) external view returns (uint); event MemberRole(uint256 indexed roleId, bytes32 roleName, string roleDescription); event MemberJoined(address indexed newMember, uint indexed nonce); event switchedMembership(address indexed previousMember, address indexed newMember, uint timeStamp); event MembershipWithdrawn(address indexed member, uint timestamp); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "./IPriceFeedOracle.sol"; struct SwapDetails { uint104 minAmount; uint104 maxAmount; uint32 lastSwapTime; // 2 decimals of precision. 0.01% -> 0.0001 -> 1e14 uint16 maxSlippageRatio; } struct Asset { address assetAddress; bool isCoverAsset; bool isAbandoned; } interface IPool { function swapOperator() external view returns (address); function getAsset(uint assetId) external view returns (Asset memory); function getAssets() external view returns (Asset[] memory); function transferAssetToSwapOperator(address asset, uint amount) external; function setSwapDetailsLastSwapTime(address asset, uint32 lastSwapTime) external; function getAssetSwapDetails(address assetAddress) external view returns (SwapDetails memory); function sendPayout(uint assetIndex, address payable payoutAddress, uint amount, uint ethDepositAmount) external; function sendEth(address payoutAddress, uint amount) external; function upgradeCapitalPool(address payable newPoolAddress) external; function priceFeedOracle() external view returns (IPriceFeedOracle); function getPoolValueInEth() external view returns (uint); function calculateMCRRatio(uint totalAssetValue, uint mcrEth) external pure returns (uint); function getInternalTokenPriceInAsset(uint assetId) external view returns (uint tokenPrice); function getInternalTokenPriceInAssetAndUpdateTwap(uint assetId) external returns (uint tokenPrice); function getTokenPrice() external view returns (uint tokenPrice); function getMCRRatio() external view returns (uint); function setSwapValue(uint value) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IPooledStaking { struct Staker { uint deposit; // total amount of deposit nxm uint reward; // total amount that is ready to be claimed address[] contracts; // list of contracts the staker has staked on // staked amounts for each contract mapping(address => uint) stakes; // amount pending to be subtracted after all unstake requests will be processed mapping(address => uint) pendingUnstakeRequestsTotal; // flag to indicate the presence of this staker in the array of stakers of each contract mapping(address => bool) isInContractStakers; } struct Burn { uint amount; uint burnedAt; address contractAddress; } struct Reward { uint amount; uint rewardedAt; address contractAddress; } struct UnstakeRequest { uint amount; uint unstakeAt; address contractAddress; address stakerAddress; uint next; // id of the next unstake request in the linked list } struct ContractReward { uint amount; uint lastDistributionRound; } function accumulateReward(address contractAddress, uint amount) external; function pushBurn(address contractAddress, uint amount) external; function hasPendingActions() external view returns (bool); function processPendingActions(uint maxIterations) external returns (bool finished); function contractStake(address contractAddress) external view returns (uint); function stakerReward(address staker) external view returns (uint); function stakerDeposit(address staker) external view returns (uint); function stakerContractStake(address staker, address contractAddress) external view returns (uint); function withdraw(uint amount) external; function withdrawForUser(address user) external; function stakerMaxWithdrawable(address stakerAddress) external view returns (uint); function withdrawReward(address stakerAddress) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface Aggregator { function decimals() external view returns (uint8); function latestAnswer() external view returns (int); } interface IPriceFeedOracle { struct OracleAsset { Aggregator aggregator; uint8 decimals; } function ETH() external view returns (address); function assets(address) external view returns (Aggregator, uint8); function getAssetToEthRate(address asset) external view returns (uint); function getAssetForEth(address asset, uint ethIn) external view returns (uint); function getEthForAsset(address asset, uint amount) external view returns (uint); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface IQuotationData { function authQuoteEngine() external view returns (address); function stlp() external view returns (uint); function stl() external view returns (uint); function pm() external view returns (uint); function minDays() external view returns (uint); function tokensRetained() external view returns (uint); function kycAuthAddress() external view returns (address); function refundEligible(address) external view returns (bool); function holdedCoverIDStatus(uint) external view returns (uint); function timestampRepeated(uint) external view returns (bool); enum HCIDStatus {NA, kycPending, kycPass, kycFailedOrRefunded, kycPassNoCover} enum CoverStatus {Active, ClaimAccepted, ClaimDenied, CoverExpired, ClaimSubmitted, Requested} function addInTotalSumAssuredSC(address _add, bytes4 _curr, uint _amount) external; function subFromTotalSumAssuredSC(address _add, bytes4 _curr, uint _amount) external; function subFromTotalSumAssured(bytes4 _curr, uint _amount) external; function addInTotalSumAssured(bytes4 _curr, uint _amount) external; function setTimestampRepeated(uint _timestamp) external; /// @dev Creates a blank new cover. function addCover( uint16 _coverPeriod, uint _sumAssured, address payable _userAddress, bytes4 _currencyCode, address _scAddress, uint premium, uint premiumNXM ) external; function addHoldCover( address payable from, address scAddress, bytes4 coverCurr, uint[] calldata coverDetails, uint16 coverPeriod ) external; function setRefundEligible(address _add, bool status) external; function setHoldedCoverIDStatus(uint holdedCoverID, uint status) external; function setKycAuthAddress(address _add) external; function changeAuthQuoteEngine(address _add) external; function getUintParameters(bytes8 code) external view returns (bytes8 codeVal, uint val); function getProductDetails() external view returns ( uint _minDays, uint _pm, uint _stl, uint _stlp ); function getCoverLength() external view returns (uint len); function getAuthQuoteEngine() external view returns (address _add); function getTotalSumAssured(bytes4 _curr) external view returns (uint amount); function getAllCoversOfUser(address _add) external view returns (uint[] memory allCover); function getUserCoverLength(address _add) external view returns (uint len); function getCoverStatusNo(uint _cid) external view returns (uint8); function getCoverPeriod(uint _cid) external view returns (uint32 cp); function getCoverSumAssured(uint _cid) external view returns (uint sa); function getCurrencyOfCover(uint _cid) external view returns (bytes4 curr); function getValidityOfCover(uint _cid) external view returns (uint date); function getscAddressOfCover(uint _cid) external view returns (uint, address); function getCoverMemberAddress(uint _cid) external view returns (address payable _add); function getCoverPremiumNXM(uint _cid) external view returns (uint _premiumNXM); function getCoverDetailsByCoverID1( uint _cid ) external view returns ( uint cid, address _memberAddress, address _scAddress, bytes4 _currencyCode, uint _sumAssured, uint premiumNXM ); function getCoverDetailsByCoverID2( uint _cid ) external view returns ( uint cid, uint8 status, uint sumAssured, uint16 coverPeriod, uint validUntil ); function getHoldedCoverDetailsByID1( uint _hcid ) external view returns ( uint hcid, address scAddress, bytes4 coverCurr, uint16 coverPeriod ); function getUserHoldedCoverLength(address _add) external view returns (uint); function getUserHoldedCoverByIndex(address _add, uint index) external view returns (uint); function getHoldedCoverDetailsByID2( uint _hcid ) external view returns ( uint hcid, address payable memberAddress, uint[] memory coverDetails ); function getTotalSumAssuredSC(address _add, bytes4 _curr) external view returns (uint amount); function changeCoverStatusNo(uint _cid, uint8 _stat) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface ISAFURAMaster { function tokenAddress() external view returns (address); function owner() external view returns (address); function emergencyAdmin() external view returns (address); function masterInitialized() external view returns (bool); function isInternal(address _add) external view returns (bool); function isPause() external view returns (bool check); function isMember(address _add) external view returns (bool); function checkIsAuthToGoverned(address _add) external view returns (bool); function getLatestAddress(bytes2 _contractName) external view returns (address payable contractAddress); function contractAddresses(bytes2 code) external view returns (address payable); function upgradeMultipleContracts( bytes2[] calldata _contractCodes, address payable[] calldata newAddresses ) external; function removeContracts(bytes2[] calldata contractCodesToRemove) external; function addNewInternalContracts( bytes2[] calldata _contractCodes, address payable[] calldata newAddresses, uint[] calldata _types ) external; function updateOwnerParameters(bytes8 code, address payable val) external; }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; interface ISAFURAToken { function burn(uint256 amount) external returns (bool); function burnFrom(address from, uint256 value) external returns (bool); function operatorTransfer(address from, uint256 value) external returns (bool); function mint(address account, uint256 amount) external; function isLockedForMV(address member) external view returns (uint); function whiteListed(address member) external view returns (bool); function addToWhiteList(address _member) external returns (bool); function removeFromWhiteList(address _member) external returns (bool); function changeOperator(address _newOperator) external returns (bool); function lockForMemberVote(address _of, uint _days) external; /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; /* structs for io */ struct AllocationRequest { uint productId; uint coverId; uint allocationId; uint period; uint gracePeriod; bool useFixedPrice; uint previousStart; uint previousExpiration; uint previousRewardsRatio; uint globalCapacityRatio; uint capacityReductionRatio; uint rewardRatio; uint globalMinPrice; } struct BurnStakeParams { uint allocationId; uint productId; uint start; uint period; uint deallocationAmount; } interface IStakingPool { /* structs for storage */ // stakers are grouped in tranches based on the timelock expiration // tranche index is calculated based on the expiration date // the initial proposal is to have 4 tranches per year (1 tranche per quarter) struct Tranche { uint128 stakeShares; uint128 rewardsShares; } struct ExpiredTranche { uint96 accNxmPerRewardShareAtExpiry; uint96 stakeAmountAtExpiry; // nxm total supply is 6.7e24 and uint96.max is 7.9e28 uint128 stakeSharesSupplyAtExpiry; } struct Deposit { uint96 lastAccNxmPerRewardShare; uint96 pendingRewards; uint128 stakeShares; uint128 rewardsShares; } function initialize( bool isPrivatePool, uint initialPoolFee, uint maxPoolFee, uint _poolId, string memory ipfsDescriptionHash ) external; function processExpirations(bool updateUntilCurrentTimestamp) external; function requestAllocation( uint amount, uint previousPremium, AllocationRequest calldata request ) external returns (uint premium, uint allocationId); function burnStake(uint amount, BurnStakeParams calldata params) external; function depositTo( uint amount, uint trancheId, uint requestTokenId, address destination ) external returns (uint tokenId); function withdraw( uint tokenId, bool withdrawStake, bool withdrawRewards, uint[] memory trancheIds ) external returns (uint withdrawnStake, uint withdrawnRewards); function isPrivatePool() external view returns (bool); function isHalted() external view returns (bool); function manager() external view returns (address); function getPoolId() external view returns (uint); function getPoolFee() external view returns (uint); function getMaxPoolFee() external view returns (uint); function getActiveStake() external view returns (uint); function getStakeSharesSupply() external view returns (uint); function getRewardsSharesSupply() external view returns (uint); function getRewardPerSecond() external view returns (uint); function getAccNxmPerRewardsShare() external view returns (uint); function getLastAccNxmUpdate() external view returns (uint); function getFirstActiveTrancheId() external view returns (uint); function getFirstActiveBucketId() external view returns (uint); function getNextAllocationId() external view returns (uint); function getDeposit(uint tokenId, uint trancheId) external view returns ( uint lastAccNxmPerRewardShare, uint pendingRewards, uint stakeShares, uint rewardsShares ); function getTranche(uint trancheId) external view returns ( uint stakeShares, uint rewardsShares ); function getExpiredTranche(uint trancheId) external view returns ( uint accNxmPerRewardShareAtExpiry, uint stakeAmountAtExpiry, uint stakeShareSupplyAtExpiry ); function setPoolFee(uint newFee) external; function setPoolPrivacy(bool isPrivatePool) external; function getActiveAllocations( uint productId ) external view returns (uint[] memory trancheAllocations); function getTrancheCapacities( uint productId, uint firstTrancheId, uint trancheCount, uint capacityRatio, uint reductionRatio ) external view returns (uint[] memory trancheCapacities); /* ========== EVENTS ========== */ event StakeDeposited(address indexed user, uint256 amount, uint256 trancheId, uint256 tokenId); event DepositExtended(address indexed user, uint256 tokenId, uint256 initialTrancheId, uint256 newTrancheId, uint256 topUpAmount); event PoolPrivacyChanged(address indexed manager, bool isPrivate); event PoolFeeChanged(address indexed manager, uint newFee); event PoolDescriptionSet(string ipfsDescriptionHash); event Withdraw(address indexed user, uint indexed tokenId, uint tranche, uint amountStakeWithdrawn, uint amountRewardsWithdrawn); event StakeBurned(uint amount); event Deallocated(uint productId); event BucketExpired(uint bucketId); event TrancheExpired(uint trancheId); // Auth error OnlyCoverContract(); error OnlyStakingProductsContract(); error OnlyManager(); error PrivatePool(); error SystemPaused(); error PoolHalted(); // Fees error PoolFeeExceedsMax(); error MaxPoolFeeAbove100(); // Voting error NxmIsLockedForGovernanceVote(); error ManagerNxmIsLockedForGovernanceVote(); // Deposit error InsufficientDepositAmount(); error RewardRatioTooHigh(); // Staking NFTs error InvalidTokenId(); error NotTokenOwnerOrApproved(); error InvalidStakingPoolForToken(); // Tranche & capacity error NewTrancheEndsBeforeInitialTranche(); error RequestedTrancheIsNotYetActive(); error RequestedTrancheIsExpired(); error InsufficientCapacity(); // Allocation error AlreadyDeallocated(uint allocationId); }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity >=0.5.0; import "./ISAFURAToken.sol"; interface ITokenController { struct StakingPoolNXMBalances { uint128 rewards; uint128 deposits; } struct CoverInfo { uint16 claimCount; bool hasOpenClaim; bool hasAcceptedClaim; uint96 requestedPayoutAmount; // note: still 128 bits available here, can be used later } struct StakingPoolOwnershipOffer { address proposedManager; uint96 deadline; } function coverInfo(uint id) external view returns ( uint16 claimCount, bool hasOpenClaim, bool hasAcceptedClaim, uint96 requestedPayoutAmount ); function withdrawCoverNote( address _of, uint[] calldata _coverIds, uint[] calldata _indexes ) external; function changeOperator(address _newOperator) external; function operatorTransfer(address _from, address _to, uint _value) external returns (bool); function burnFrom(address _of, uint amount) external returns (bool); function addToWhitelist(address _member) external; function removeFromWhitelist(address _member) external; function mint(address _member, uint _amount) external; function lockForMemberVote(address _of, uint _days) external; function withdrawClaimAssessmentTokens(address[] calldata users) external; function getLockReasons(address _of) external view returns (bytes32[] memory reasons); function totalSupply() external view returns (uint); function totalBalanceOf(address _of) external view returns (uint amount); function totalBalanceOfWithoutDelegations(address _of) external view returns (uint amount); function getTokenPrice() external view returns (uint tokenPrice); function token() external view returns (ISAFURAToken); function getStakingPoolManager(uint poolId) external view returns (address manager); function getManagerStakingPools(address manager) external view returns (uint[] memory poolIds); function isStakingPoolManager(address member) external view returns (bool); function getStakingPoolOwnershipOffer(uint poolId) external view returns (address proposedManager, uint deadline); function transferStakingPoolsOwnership(address from, address to) external; function assignStakingPoolManager(uint poolId, address manager) external; function createStakingPoolOwnershipOffer(uint poolId, address proposedManager, uint deadline) external; function acceptStakingPoolOwnershipOffer(uint poolId) external; function cancelStakingPoolOwnershipOffer(uint poolId) external; function mintStakingPoolNXMRewards(uint amount, uint poolId) external; function burnStakingPoolNXMRewards(uint amount, uint poolId) external; function depositStakedNXM(address from, uint amount, uint poolId) external; function withdrawNXMStakeAndRewards(address to, uint stakeToWithdraw, uint rewardsToWithdraw, uint poolId) external; function burnStakedNXM(uint amount, uint poolId) external; function stakingPoolNXMBalances(uint poolId) external view returns(uint128 rewards, uint128 deposits); function tokensLocked(address _of, bytes32 _reason) external view returns (uint256 amount); function getWithdrawableCoverNotes( address coverOwner ) external view returns ( uint[] memory coverIds, bytes32[] memory lockReasons, uint withdrawableAmount ); function getPendingRewards(address member) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.18; /** * @dev Wrappers over Solidity's uintXX casting operators with added overflow * checks. * * Downcasting from uint256 in Solidity does not revert on overflow. This can * easily result in undesired exploitation or bugs, since developers usually * assume that overflows raise errors. `SafeCast` restores this intuition by * reverting the transaction when such an operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeUintCast { /** * @dev Returns the downcasted uint248 from uint256, reverting on * overflow (when the input is greater than largest uint248). * * Counterpart to Solidity's `uint248` operator. * * Requirements: * * - input must fit into 248 bits */ function toUint248(uint256 value) internal pure returns (uint248) { require(value < 2**248, "SafeCast: value doesn\'t fit in 248 bits"); return uint248(value); } /** * @dev Returns the downcasted uint240 from uint256, reverting on * overflow (when the input is greater than largest uint240). * * Counterpart to Solidity's `uint240` operator. * * Requirements: * * - input must fit into 240 bits */ function toUint240(uint256 value) internal pure returns (uint240) { require(value < 2**240, "SafeCast: value doesn\'t fit in 240 bits"); return uint240(value); } /** * @dev Returns the downcasted uint232 from uint256, reverting on * overflow (when the input is greater than largest uint232). * * Counterpart to Solidity's `uint232` operator. * * Requirements: * * - input must fit into 232 bits */ function toUint232(uint256 value) internal pure returns (uint232) { require(value < 2**232, "SafeCast: value doesn\'t fit in 232 bits"); return uint232(value); } /** * @dev Returns the downcasted uint224 from uint256, reverting on * overflow (when the input is greater than largest uint224). * * Counterpart to Solidity's `uint224` operator. * * Requirements: * * - input must fit into 224 bits */ function toUint224(uint256 value) internal pure returns (uint224) { require(value < 2**224, "SafeCast: value doesn\'t fit in 224 bits"); return uint224(value); } /** * @dev Returns the downcasted uint216 from uint256, reverting on * overflow (when the input is greater than largest uint216). * * Counterpart to Solidity's `uint216` operator. * * Requirements: * * - input must fit into 216 bits */ function toUint216(uint256 value) internal pure returns (uint216) { require(value < 2**216, "SafeCast: value doesn\'t fit in 216 bits"); return uint216(value); } /** * @dev Returns the downcasted uint208 from uint256, reverting on * overflow (when the input is greater than largest uint208). * * Counterpart to Solidity's `uint208` operator. * * Requirements: * * - input must fit into 208 bits */ function toUint208(uint256 value) internal pure returns (uint208) { require(value < 2**208, "SafeCast: value doesn\'t fit in 208 bits"); return uint208(value); } /** * @dev Returns the downcasted uint200 from uint256, reverting on * overflow (when the input is greater than largest uint200). * * Counterpart to Solidity's `uint200` operator. * * Requirements: * * - input must fit into 200 bits */ function toUint200(uint256 value) internal pure returns (uint200) { require(value < 2**200, "SafeCast: value doesn\'t fit in 200 bits"); return uint200(value); } /** * @dev Returns the downcasted uint192 from uint256, reverting on * overflow (when the input is greater than largest uint192). * * Counterpart to Solidity's `uint192` operator. * * Requirements: * * - input must fit into 192 bits */ function toUint192(uint256 value) internal pure returns (uint192) { require(value < 2**192, "SafeCast: value doesn\'t fit in 192 bits"); return uint192(value); } /** * @dev Returns the downcasted uint184 from uint256, reverting on * overflow (when the input is greater than largest uint184). * * Counterpart to Solidity's `uint184` operator. * * Requirements: * * - input must fit into 184 bits */ function toUint184(uint256 value) internal pure returns (uint184) { require(value < 2**184, "SafeCast: value doesn\'t fit in 184 bits"); return uint184(value); } /** * @dev Returns the downcasted uint176 from uint256, reverting on * overflow (when the input is greater than largest uint176). * * Counterpart to Solidity's `uint176` operator. * * Requirements: * * - input must fit into 176 bits */ function toUint176(uint256 value) internal pure returns (uint176) { require(value < 2**176, "SafeCast: value doesn\'t fit in 176 bits"); return uint176(value); } /** * @dev Returns the downcasted uint168 from uint256, reverting on * overflow (when the input is greater than largest uint168). * * Counterpart to Solidity's `uint168` operator. * * Requirements: * * - input must fit into 168 bits */ function toUint168(uint256 value) internal pure returns (uint168) { require(value < 2**168, "SafeCast: value doesn\'t fit in 168 bits"); return uint168(value); } /** * @dev Returns the downcasted uint160 from uint256, reverting on * overflow (when the input is greater than largest uint160). * * Counterpart to Solidity's `uint160` operator. * * Requirements: * * - input must fit into 160 bits */ function toUint160(uint256 value) internal pure returns (uint160) { require(value < 2**160, "SafeCast: value doesn\'t fit in 160 bits"); return uint160(value); } /** * @dev Returns the downcasted uint152 from uint256, reverting on * overflow (when the input is greater than largest uint152). * * Counterpart to Solidity's `uint152` operator. * * Requirements: * * - input must fit into 152 bits */ function toUint152(uint256 value) internal pure returns (uint152) { require(value < 2**152, "SafeCast: value doesn\'t fit in 152 bits"); return uint152(value); } /** * @dev Returns the downcasted uint144 from uint256, reverting on * overflow (when the input is greater than largest uint144). * * Counterpart to Solidity's `uint144` operator. * * Requirements: * * - input must fit into 144 bits */ function toUint144(uint256 value) internal pure returns (uint144) { require(value < 2**144, "SafeCast: value doesn\'t fit in 144 bits"); return uint144(value); } /** * @dev Returns the downcasted uint136 from uint256, reverting on * overflow (when the input is greater than largest uint136). * * Counterpart to Solidity's `uint136` operator. * * Requirements: * * - input must fit into 136 bits */ function toUint136(uint256 value) internal pure returns (uint136) { require(value < 2**136, "SafeCast: value doesn\'t fit in 136 bits"); return uint136(value); } /** * @dev Returns the downcasted uint128 from uint256, reverting on * overflow (when the input is greater than largest uint128). * * Counterpart to Solidity's `uint128` operator. * * Requirements: * * - input must fit into 128 bits */ function toUint128(uint256 value) internal pure returns (uint128) { require(value < 2**128, "SafeCast: value doesn\'t fit in 128 bits"); return uint128(value); } /** * @dev Returns the downcasted uint120 from uint256, reverting on * overflow (when the input is greater than largest uint120). * * Counterpart to Solidity's `uint120` operator. * * Requirements: * * - input must fit into 120 bits */ function toUint120(uint256 value) internal pure returns (uint120) { require(value < 2**120, "SafeCast: value doesn\'t fit in 120 bits"); return uint120(value); } /** * @dev Returns the downcasted uint112 from uint256, reverting on * overflow (when the input is greater than largest uint112). * * Counterpart to Solidity's `uint112` operator. * * Requirements: * * - input must fit into 112 bits */ function toUint112(uint256 value) internal pure returns (uint112) { require(value < 2**112, "SafeCast: value doesn\'t fit in 112 bits"); return uint112(value); } /** * @dev Returns the downcasted uint104 from uint256, reverting on * overflow (when the input is greater than largest uint104). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 104 bits */ function toUint104(uint256 value) internal pure returns (uint104) { require(value < 2**104, "SafeCast: value doesn\'t fit in 104 bits"); return uint104(value); } /** * @dev Returns the downcasted uint96 from uint256, reverting on * overflow (when the input is greater than largest uint96). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 96 bits */ function toUint96(uint256 value) internal pure returns (uint96) { require(value < 2**96, "SafeCast: value doesn\'t fit in 96 bits"); return uint96(value); } /** * @dev Returns the downcasted uint88 from uint256, reverting on * overflow (when the input is greater than largest uint88). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 88 bits */ function toUint88(uint256 value) internal pure returns (uint88) { require(value < 2**88, "SafeCast: value doesn\'t fit in 88 bits"); return uint88(value); } /** * @dev Returns the downcasted uint80 from uint256, reverting on * overflow (when the input is greater than largest uint80). * * Counterpart to Solidity's `uint104` operator. * * Requirements: * * - input must fit into 80 bits */ function toUint80(uint256 value) internal pure returns (uint80) { require(value < 2**80, "SafeCast: value doesn\'t fit in 80 bits"); return uint80(value); } /** * @dev Returns the downcasted uint64 from uint256, reverting on * overflow (when the input is greater than largest uint64). * * Counterpart to Solidity's `uint64` operator. * * Requirements: * * - input must fit into 64 bits */ function toUint64(uint256 value) internal pure returns (uint64) { require(value < 2**64, "SafeCast: value doesn\'t fit in 64 bits"); return uint64(value); } /** * @dev Returns the downcasted uint56 from uint256, reverting on * overflow (when the input is greater than largest uint56). * * Counterpart to Solidity's `uint56` operator. * * Requirements: * * - input must fit into 56 bits */ function toUint56(uint256 value) internal pure returns (uint56) { require(value < 2**56, "SafeCast: value doesn\'t fit in 56 bits"); return uint56(value); } /** * @dev Returns the downcasted uint48 from uint256, reverting on * overflow (when the input is greater than largest uint48). * * Counterpart to Solidity's `uint48` operator. * * Requirements: * * - input must fit into 48 bits */ function toUint48(uint256 value) internal pure returns (uint48) { require(value < 2**48, "SafeCast: value doesn\'t fit in 48 bits"); return uint48(value); } /** * @dev Returns the downcasted uint40 from uint256, reverting on * overflow (when the input is greater than largest uint40). * * Counterpart to Solidity's `uint40` operator. * * Requirements: * * - input must fit into 40 bits */ function toUint40(uint256 value) internal pure returns (uint40) { require(value < 2**40, "SafeCast: value doesn\'t fit in 40 bits"); return uint40(value); } /** * @dev Returns the downcasted uint32 from uint256, reverting on * overflow (when the input is greater than largest uint32). * * Counterpart to Solidity's `uint32` operator. * * Requirements: * * - input must fit into 32 bits */ function toUint32(uint256 value) internal pure returns (uint32) { require(value < 2**32, "SafeCast: value doesn\'t fit in 32 bits"); return uint32(value); } /** * @dev Returns the downcasted uint24 from uint256, reverting on * overflow (when the input is greater than largest uint24). * * Counterpart to Solidity's `uint24` operator. * * Requirements: * * - input must fit into 24 bits */ function toUint24(uint256 value) internal pure returns (uint24) { require(value < 2**24, "SafeCast: value doesn\'t fit in 24 bits"); return uint24(value); } /** * @dev Returns the downcasted uint16 from uint256, reverting on * overflow (when the input is greater than largest uint16). * * Counterpart to Solidity's `uint16` operator. * * Requirements: * * - input must fit into 16 bits */ function toUint16(uint256 value) internal pure returns (uint16) { require(value < 2**16, "SafeCast: value doesn\'t fit in 16 bits"); return uint16(value); } /** * @dev Returns the downcasted uint8 from uint256, reverting on * overflow (when the input is greater than largest uint8). * * Counterpart to Solidity's `uint8` operator. * * Requirements: * * - input must fit into 8 bits. */ function toUint8(uint256 value) internal pure returns (uint8) { require(value < 2**8, "SafeCast: value doesn\'t fit in 8 bits"); return uint8(value); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; /** * @dev Simple library to derive the staking pool address from the pool id without external calls */ library StakingPoolLibrary { function getAddress(address factory, uint poolId) internal pure returns (address) { bytes32 hash = keccak256( abi.encodePacked( hex'ff', factory, poolId, // salt // init code hash of the MinimalBeaconProxy // updated using patch-staking-pool-library.js script hex'1eb804b66941a2e8465fa0951be9c8b855b7794ee05b0789ab22a02ee1298ebe' // init code hash ) ); // cast last 20 bytes of hash to address return address(uint160(uint(hash))); } }
// SPDX-License-Identifier: GPL-3.0-only pragma solidity ^0.8.18; /** * @title ERC1132 interface * @dev see https://github.com/ethereum/EIPs/issues/1132 */ contract LockHandler { /** * @dev Reasons why a user's tokens have been locked */ mapping(address => bytes32[]) public lockReason; /** * @dev locked token structure */ struct LockToken { uint256 amount; uint256 validity; bool claimed; } /** * @dev Holds number & validity of tokens locked for a given reason for * a specified address */ mapping(address => mapping(bytes32 => LockToken)) public locked; event Locked(address indexed _of, bytes32 indexed _reason, uint256 _amount, uint256 _validity); event Unlocked(address indexed _of, bytes32 indexed _reason, uint256 _amount); }
{ "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract ABI
API[{"inputs":[{"internalType":"address","name":"quotationDataAddress","type":"address"},{"internalType":"address","name":"claimsRewardAddress","type":"address"},{"internalType":"address","name":"stakingPoolFactoryAddress","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_of","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_reason","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_validity","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_of","type":"address"},{"indexed":true,"internalType":"bytes32","name":"_reason","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[],"name":"_unused_claimSubmissionGracePeriod","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_unused_minCALockTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_unused_pooledStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_unused_token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"acceptStakingPoolOwnershipOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"manager","type":"address"}],"name":"assignStakingPoolManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"burnStakedNXM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"burnStakingPoolNXMRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"cancelStakingPoolOwnershipOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"changeDependentContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"masterAddress","type":"address"}],"name":"changeMasterAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOperator","type":"address"}],"name":"changeOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimsReward","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"coverInfo","outputs":[{"internalType":"uint16","name":"claimCount","type":"uint16"},{"internalType":"bool","name":"hasOpenClaim","type":"bool"},{"internalType":"bool","name":"hasAcceptedClaim","type":"bool"},{"internalType":"uint96","name":"requestedPayoutAmount","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"},{"internalType":"address","name":"proposedManager","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"createStakingPoolOwnershipOffer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"depositStakedNXM","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"}],"name":"getLockReasons","outputs":[{"internalType":"bytes32[]","name":"reasons","type":"bytes32[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"manager","type":"address"}],"name":"getManagerStakingPools","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"member","type":"address"}],"name":"getPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getStakingPoolManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"getStakingPoolOwnershipOffer","outputs":[{"internalType":"address","name":"proposedManager","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"tokenPrice","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"coverOwner","type":"address"}],"name":"getWithdrawableCoverNotes","outputs":[{"internalType":"uint256[]","name":"coverIds","type":"uint256[]"},{"internalType":"bytes32[]","name":"lockReasons","type":"bytes32[]"},{"internalType":"uint256","name":"withdrawableAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"internalContracts","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"member","type":"address"}],"name":"isStakingPoolManager","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"},{"internalType":"uint256","name":"_days","type":"uint256"}],"name":"lockForMemberVote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"lockReason","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"locked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"validity","type":"uint256"},{"internalType":"bool","name":"claimed","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"master","outputs":[{"internalType":"contract ISAFURAMaster","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"mintStakingPoolNXMRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"operatorTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"quotationData","outputs":[{"internalType":"contract IQuotationData","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_member","type":"address"}],"name":"removeFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingPoolFactory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"stakingPoolNXMBalances","outputs":[{"internalType":"uint128","name":"rewards","type":"uint128"},{"internalType":"uint128","name":"deposits","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"contract ISAFURAToken","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"},{"internalType":"bytes32","name":"_reason","type":"bytes32"}],"name":"tokensLocked","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"}],"name":"totalBalanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_of","type":"address"}],"name":"totalBalanceOfWithoutDelegations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"}],"name":"transferStakingPoolsOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes8","name":"code","type":"bytes8"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"updateUintParameters","outputs":[],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"}],"name":"withdrawClaimAssessmentTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256[]","name":"coverIds","type":"uint256[]"},{"internalType":"uint256[]","name":"indexes","type":"uint256[]"}],"name":"withdrawCoverNote","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"memberAddress","type":"address"},{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"withdrawGovernanceRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"destination","type":"address"},{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"withdrawGovernanceRewardsTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"stakeToWithdraw","type":"uint256"},{"internalType":"uint256","name":"rewardsToWithdraw","type":"uint256"},{"internalType":"uint256","name":"poolId","type":"uint256"}],"name":"withdrawNXMStakeAndRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"forUser","type":"address"},{"internalType":"bool","name":"fromGovernance","type":"bool"},{"internalType":"bool","name":"fromAssessment","type":"bool"},{"internalType":"uint256","name":"batchSize","type":"uint256"}],"name":"withdrawPendingRewards","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6101006040523480156200001257600080fd5b50604051620043b8380380620043b8833981016040819052620000359162000075565b6001600160a01b0393841660a05291831660c052821660e05216608052620000d2565b80516001600160a01b03811681146200007057600080fd5b919050565b600080600080608085870312156200008c57600080fd5b620000978562000058565b9350620000a76020860162000058565b9250620000b76040860162000058565b9150620000c76060860162000058565b905092959194509250565b60805160a05160c05160e0516142196200019f6000396000818161061301526130ff0152600061066001526000818161087f015261236001526000818161085801528181610c8b01528181610db701528181610f64015281816110060152818161135501528181611470015281816116000152818161181f01528181611a7f01528181611d3e0152818161200a015281816122b60152818161270301528181612afa01528181612d0801528181612fb3015281816131b601528181613295015261335901526142196000f3fe608060405234801561001057600080fd5b50600436106102f15760003560e01c80638448fa2f1161019d578063d46655f4116100e9578063e41060cd116100a2578063ee97f7f31161007c578063ee97f7f31461082d578063f6ed201714610840578063fc0c546a14610853578063ffd7d66d1461087a57600080fd5b8063e41060cd146107de578063e43252d7146107f1578063eb9623601461080457600080fd5b8063d46655f414610713578063d71be8db14610726578063dd3031c01461077c578063e01cdf0c1461078f578063e0a09646146107b8578063e1324942146107cb57600080fd5b8063aec1f86611610156578063c4927d7e11610130578063c4927d7e14610682578063c4b083fa146106ad578063c58fada9146106b6578063cc35b1b11461070057600080fd5b8063aec1f86614610635578063b31100af14610648578063ba428e681461065b57600080fd5b80638448fa2f146105aa5780638ab1d681146105cc57806398aebc7d146105df5780639dd86e0f146105f25780639e23a46614610605578063a1b8adcb1461060e57600080fd5b80634b0ee02a1161025c5780635c39eaef116102155780636eb6dd71116101ef5780636eb6dd711461054657806371d66f0014610571578063768298391461058457806379cc67901461059757600080fd5b80635c39eaef1461050d5780635ca48d8c146105205780636b80bdd21461053357600080fd5b80634b0ee02a146104a65780634b94f50e146104b95780634c47e71d146104c15780634f8a048f146104d457806351626ddd146104e757806352e2fed2146104fa57600080fd5b806318160ddd116102ae57806318160ddd146103b5578063186c0c22146103cb57806322133fdd146103de578063259767d314610460578063392d5d2e1461048057806340c10f191461049357600080fd5b8063026c0b5f146102f657806306394c9b1461030b57806308cd3d6f1461031e5780630d1af103146103315780630d90cc2f146103595780630ea9c984146103ad575b600080fd5b6103096103043660046139a8565b6108a1565b005b610309610319366004613a2b565b610d10565b61030961032c366004613a48565b610e29565b61034461033f366004613a6a565b610ec4565b60405190151581526020015b60405180910390f35b61038d610367366004613aab565b6009602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610350565b61030961108c565b6103bd611351565b604051908152602001610350565b6103096103d9366004613ac4565b6113da565b61042c6103ec366004613aab565b60086020526000908152604090205461ffff81169060ff62010000820481169163010000008104909116906001600160601b036401000000009091041684565b6040805161ffff90951685529215156020850152901515918301919091526001600160601b03166060820152608001610350565b61047361046e366004613a2b565b611505565b6040516103509190613b34565b61030961048e366004613a48565b611571565b6103096104a1366004613b47565b611694565b6103bd6104b4366004613a2b565b611726565b6103bd611739565b6103096104cf366004613b47565b611780565b6103096104e2366004613b81565b61188c565b6103bd6104f5366004613a2b565b611af9565b610309610508366004613bd2565b611b06565b61030961051b366004613c14565b611e09565b6103bd61052e366004613b47565b611f09565b610309610541366004613aab565b611f60565b600454610559906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b6103bd61057f366004613b47565b611fa7565b610309610592366004613aab565b611fd8565b6103446105a5366004613b47565b612216565b6105bd6105b8366004613a2b565b612337565b60405161035093929190613c3b565b6103096105da366004613a2b565b61265d565b600554610559906001600160a01b031681565b610309610600366004613c71565b612732565b6103bd60065481565b6105597f000000000000000000000000000000000000000000000000000000000000000081565b610309610643366004613c9c565b61280e565b610473610656366004613a2b565b6129a7565b6105597f000000000000000000000000000000000000000000000000000000000000000081565b610344610690366004613a2b565b6001600160a01b03166000908152600c6020526040902054151590565b6103bd60075481565b6106f26106c4366004613aab565b6000908152600b60205260409020546001600160a01b03811691600160a01b9091046001600160601b031690565b604051610350929190613cd5565b61030961070e366004613cee565b612a0f565b610309610721366004613a2b565b612b47565b61075f610734366004613b47565b6001602081815260009384526040808520909152918352912080549181015460029091015460ff1683565b604080519384526020840192909252151590820152606001610350565b61030961078a366004613b47565b612bc1565b61055961079d366004613aab565b6000908152600a60205260409020546001600160a01b031690565b6103096107c6366004613d29565b612d3f565b6103096107d9366004613b47565b612dd1565b6103096107ec366004613a48565b612e9c565b6103096107ff366004613a2b565b612f0c565b610559610812366004613aab565b6003602052600090815260409020546001600160a01b031681565b600254610559906001600160a01b031681565b6103bd61084e366004613a2b565b612fe2565b6105597f000000000000000000000000000000000000000000000000000000000000000081565b6105597f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109189190613d4e565b1561093e5760405162461bcd60e51b815260040161093590613d6b565b60405180910390fd5b6001600160a01b038516600090815260208190526040902054806109b95760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204e6f206c6f636b656420636f76657260448201526b081b9bdd195cc8199bdd5b9960a21b6064820152608401610935565b60006109c6600183613dab565b90506000855b8015610c735760008989896109e2600186613dab565b8181106109f1576109f1613dbe565b90506020020135604051602001610a09929190613dd4565b60405160208183030381529060405280519060200120905060008787600185610a329190613dab565b818110610a4157610a41613dbe565b905060200201359050816000808d6001600160a01b03166001600160a01b031681526020019081526020016000208281548110610a8057610a80613dbe565b906000526020600020015414610ae25760405162461bcd60e51b815260206004820152602160248201527f546f6b656e436f6e74726f6c6c65723a2042616420726561736f6e20696e64656044820152600f60fb1b6064820152608401610935565b6001600160a01b038b166000908152600160209081526040808320858452909152902054610b108186613e01565b6001600160a01b038d166000908152600160208181526040808420888552909152822082815590810191909155600201805460ff191690559450858214610bc8576001600160a01b038c166000908152602081905260409020805487908110610b7b57610b7b613dbe565b90600052602060002001546000808e6001600160a01b03166001600160a01b031681526020019081526020016000208381548110610bbb57610bbb613dbe565b6000918252602090912001555b6001600160a01b038c166000908152602081905260409020805480610bef57610bef613e14565b60019003818190600052602060002001600090559055828c6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051610c4191815260200190565b60405180910390a38515610c5d57610c5a600187613dab565b95505b5050508080610c6b90613e2a565b9150506109cc565b5060405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610cc2908b908590600401613cd5565b6020604051808303816000875af1158015610ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d059190613d4e565b505050505050505050565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7c9190613d4e565b610d985760405162461bcd60e51b815260040161093590613e41565b6040516306394c9b60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906306394c9b906024015b6020604051808303816000875af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190613d4e565b5050565b610e32816130e7565b6001600160a01b0316336001600160a01b031614610e625760405162461bcd60e51b815260040161093590613e83565b610e6c3083613185565b610e75826132cc565b60008281526009602052604081208054909190610e9c9084906001600160801b0316613ecd565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa158015610f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f319190613d4e565b610f4d5760405162461bcd60e51b815260040161093590613ef4565b60405163b0e65d0760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e65d0790610f9b9087908690600401613cd5565b6020604051808303816000875af1158015610fba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fde9190613d4e565b506001600160a01b03831630146110825760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061103d9086908690600401613cd5565b6020604051808303816000875af115801561105c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110809190613d4e565b505b5060019392505050565b6002546040516227050b60e31b815261505360f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa1580156110d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fc9190613f36565b600660005260036020527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261415360f01b6004820152911690630138285890602401602060405180830381865afa158015611186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111aa9190613f36565b600a60005260036020527f9dcb9783ba5cd0b54745f65f4f918525e461e91888c334e5342cb380ac558d5380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b81526123ab60f11b6004820152911690630138285890602401602060405180830381865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112589190613f36565b600760005260036020527ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd280546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261503160f01b6004820152911690630138285890602401602060405180830381865afa1580156112e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113069190613f36565b600160005260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b0319166001600160a01b0392909216919091179055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d59190613f53565b905090565b6113e3816130e7565b6001600160a01b0316336001600160a01b0316146114135760405162461bcd60e51b815260040161093590613e83565b61141c826132cc565b6000828152600960205260409020805460109061144a908490600160801b90046001600160801b0316613ecd565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0e65d0784846040518363ffffffff1660e01b81526004016114bc929190613cd5565b6020604051808303816000875af11580156114db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ff9190613d4e565b50505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561156557602002820191906000526020600020905b815481526020019060010190808311611551575b50505050509050919050565b61157a816130e7565b6001600160a01b0316336001600160a01b0316146115aa5760405162461bcd60e51b815260040161093590613e83565b6115b3826132cc565b600082815260096020526040812080549091906115da9084906001600160801b0316613f6c565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68836040518263ffffffff1660e01b815260040161164c91815260200190565b6020604051808303816000875af115801561166b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168f9190613d4e565b505050565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117009190613d4e565b61171c5760405162461bcd60e51b815260040161093590613ef4565b610e258282613185565b6000611733826001613335565b92915050565b6000611743613685565b6001600160a01b0316634b94f50e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156117c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ec9190613d4e565b6118085760405162461bcd60e51b815260040161093590613ef4565b604051634c47e71d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634c47e71d906118569085908590600401613cd5565b600060405180830381600087803b15801561187057600080fd5b505af1158015611884573d6000803e3d6000fd5b505050505050565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119039190613d4e565b156119205760405162461bcd60e51b815260040161093590613d6b565b81156119c65761192e6136ac565b6001600160a01b031663fa15af7e85611946846136b8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526cffffffffffffffffffffffffff16602482015260440160408051808303816000875af115801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c39190613f8c565b50505b82156114ff5760006119d661371d565b6001600160a01b031663174e31c486846040518363ffffffff1660e01b8152600401611a03929190613cd5565b6020604051808303816000875af1158015611a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a469190613f53565b905060008111611a685760405162461bcd60e51b815260040161093590613fb0565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90611ab69088908590600401613cd5565b6020604051808303816000875af1158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118849190613d4e565b6000611733826000613335565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7d9190613d4e565b15611b9a5760405162461bcd60e51b815260040161093590613d6b565b60005b8181101561168f5760016000848484818110611bbb57611bbb613dbe565b9050602002016020810190611bd09190613a2b565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290206002015460ff16611df757600060016000858585818110611c1f57611c1f613dbe565b9050602002016020810190611c349190613a2b565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290205490508015611df5576001806000868686818110611c8057611c80613dbe565b9050602002016020810190611c959190613a2b565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b808352935220600201805460ff191692151592909217909155848484818110611ce557611ce5613dbe565b9050602002016020810190611cfa9190613a2b565b6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051611d3491815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb858585818110611d7d57611d7d613dbe565b9050602002016020810190611d929190613a2b565b836040518363ffffffff1660e01b8152600401611db0929190613cd5565b6020604051808303816000875af1158015611dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df39190613d4e565b505b505b80611e0181614003565b915050611b9d565b6000838152600a60205260409020546001600160a01b03163314611e3f5760405162461bcd60e51b81526004016109359061401c565b804210611ea65760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e436f6e74726f6c6c65723a20446561646c696e652063616e6e6f7460448201526e081899481a5b881d1a19481c185cdd608a1b6064820152608401610935565b6040518060400160405280836001600160a01b03168152602001611ec983613729565b6001600160601b039081169091526000948552600b602090815260409095208251929095015116600160a01b026001600160a01b03909116179092555050565b6001600160a01b038216600090815260016020908152604080832084845290915281206002015460ff1661173357506001600160a01b03919091166000908152600160209081526040808320938352929052205490565b6000818152600a60205260409020546001600160a01b03163314611f965760405162461bcd60e51b81526004016109359061401c565b6000908152600b6020526040812055565b60006020528160005260406000208181548110611fc357600080fd5b90600052602060002001600091509150505481565b6000818152600a6020526040908190205490516398fd371f60e01b81526001600160a01b0391821660048201819052917f000000000000000000000000000000000000000000000000000000000000000016906398fd371f90602401602060405180830381865afa158015612051573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120759190613f53565b42116120f55760405162461bcd60e51b815260206004820152604360248201527f546f6b656e436f6e74726f6c6c65723a2043757272656e74206d616e6167657260448201527f206973206c6f636b656420666f7220766f74696e6720696e20676f7665726e616064820152626e636560e81b608482015260a401610935565b6000828152600b60205260409020546001600160a01b031633146121775760405162461bcd60e51b815260206004820152603360248201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f742074604482015272343290383937b837b9b2b21036b0b730b3b2b960691b6064820152608401610935565b6000828152600b602052604090205442600160a01b9091046001600160601b0316116121fa5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204f776e657273686970206f6666657260448201526b081a185cc8195e1c1a5c995960a21b6064820152608401610935565b612204823361378d565b506000908152600b6020526040812055565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122839190613d4e565b61229f5760405162461bcd60e51b815260040161093590613ef4565b60405163079cc67960e41b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906379cc6790906122ed9086908690600401613cd5565b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190613d4e565b9392505050565b604051633f9f3eff60e21b81526001600160a01b038281166004830152606091829160009182917f0000000000000000000000000000000000000000000000000000000000000000169063fe7cfbfc90602401600060405180830381865afa1580156123a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123cf9190810190614085565b90506000815167ffffffffffffffff8111156123ed576123ed61406f565b604051908082528060200260200182016040528015612416578160200160208202803683370190505b5090506000825167ffffffffffffffff8111156124355761243561406f565b60405190808252806020026020018201604052801561245e578160200160208202803683370190505b5090506000805b845181101561253a57600085828151811061248257612482613dbe565b6020026020010151905060008a826040516020016124a1929190613dd4565b60405160208183030381529060405280519060200120905060006124c58c83611f09565b9050801561252457828786815181106124e0576124e0613dbe565b602002602001018181525050818686815181106124ff576124ff613dbe565b6020908102919091010152612514818a613e01565b98508461252081614003565b9550505b505050808061253290614003565b915050612465565b508067ffffffffffffffff8111156125545761255461406f565b60405190808252806020026020018201604052801561257d578160200160208202803683370190505b5096508067ffffffffffffffff8111156125995761259961406f565b6040519080825280602002602001820160405280156125c2578160200160208202803683370190505b50955060005b81811015612651578381815181106125e2576125e2613dbe565b60200260200101518882815181106125fc576125fc613dbe565b60200260200101818152505082818151811061261a5761261a613dbe565b602002602001015187828151811061263457612634613dbe565b60209081029190910101528061264981614003565b9150506125c8565b50505050509193909250565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156126a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c99190613d4e565b6126e55760405162461bcd60e51b815260040161093590613ef4565b6040516237ecc960e31b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906301bf664890602401610de2565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa15801561277a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279e9190613d4e565b6127ba5760405162461bcd60e51b815260040161093590613e41565b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e436f6e74726f6c6c65723a20696e76616c696420706172616d20636044820152626f646560e81b6064820152608401610935565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190613d4e565b6128965760405162461bcd60e51b815260040161093590613ef4565b6001600160a01b0382166000908152600c6020526040812054908190036128bc57505050565b801561168f576001600160a01b0383166000908152600c602052604081206128e5600184613dab565b815481106128f5576128f5613dbe565b90600052602060002001549050600c6000856001600160a01b03166001600160a01b0316815260200190815260200160002080548061293657612936613e14565b6000828152602080822083016000199081018390559092019092556001600160a01b038516808352600c82526040808420805460018101825590855283852001859055848452600a909252912080546001600160a01b03191690911790558161299e81613e2a565b925050506128bc565b6001600160a01b0381166000908152602081815260409182902080548351818402810184019094528084526060939283018282801561156557602002820191906000526020600020908154815260200190600101908083116115515750505050509050919050565b612a18816130e7565b6001600160a01b0316336001600160a01b031614612a485760405162461bcd60e51b815260040161093590613e83565b6000818152600960209081526040918290208251808401909352546001600160801b038082168452600160801b9091041690820152612a86846132cc565b81602001818151612a979190613f6c565b6001600160801b0316905250612aac836132cc565b81518290612abb908390613f6c565b6001600160801b0390811690915260008481526009602090815260409091208451918501518316600160801b0291909216179055506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb86612b2a8688613e01565b6040518363ffffffff1660e01b8152600401611ab6929190613cd5565b6002546001600160a01b031615612b9f576002546001600160a01b03163314612b9f5760405162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b6044820152606401610935565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c389190613d4e565b15612c555760405162461bcd60e51b815260040161093590613d6b565b6000612c5f61371d565b6001600160a01b031663174e31c433846040518363ffffffff1660e01b8152600401612c8c929190613cd5565b6020604051808303816000875af1158015612cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccf9190613f53565b905060008111612cf15760405162461bcd60e51b815260040161093590613fb0565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906114bc9086908590600401613cd5565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dab9190613d4e565b612dc75760405162461bcd60e51b815260040161093590613ef4565b610e25828261378d565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190613d4e565b15612e655760405162461bcd60e51b815260040161093590613d6b565b6000612e6f61371d565b6001600160a01b031663174e31c484846040518363ffffffff1660e01b8152600401612c8c929190613cd5565b612ea5816130e7565b6001600160a01b0316336001600160a01b031614612ed55760405162461bcd60e51b815260040161093590613e83565b612ede826132cc565b600082815260096020526040902080546010906115da908490600160801b90046001600160801b0316613f6c565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f789190613d4e565b612f945760405162461bcd60e51b815260040161093590613ef4565b6040516311fb80e560e21b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906347ee039490602401610de2565b600080612fed6136ac565b6040516379ee54f760e01b81526001600160a01b03858116600483015291909116906379ee54f790602401606060405180830381865afa158015613035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130599190614143565b50509050600061306761371d565b6040516326fceb5d60e11b81526001600160a01b0386811660048301529190911690634df9d6ba90602401602060405180830381865afa1580156130af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d39190613f53565b90506130df8183613e01565b949350505050565b604080516001600160f81b03196020808301919091527f000000000000000000000000000000000000000000000000000000000000000060601b6bffffffffffffffffffffffff19166021830152603582018490527f1eb804b66941a2e8465fa0951be9c8b855b7794ee05b0789ab22a02ee1298ebe6055808401919091528351808403909101815260759092019092528051910120600090611733565b6001600160a01b0382163014806132215750604051633e83f2a160e21b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063fa0fca8490602401602060405180830381865afa1580156131fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132219190613d4e565b61327e5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e436f6e74726f6c6c65723a2041646472657373206973206e6f7420604482015267309036b2b6b132b960c11b6064820152608401610935565b6040516340c10f1960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906118569085908590600401613cd5565b6000600160801b82106133315760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401610935565b5090565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa1580156133a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c49190613f53565b905060005b6001600160a01b038516600090815260208190526040902054811015613447576001600160a01b038516600090815260208190526040902080546134299187918490811061341957613419613dbe565b9060005260206000200154611f09565b6134339083613e01565b91508061343f81614003565b9150506133c9565b50613450613938565b604051630ea474c760e01b81526001600160a01b0386811660048301529190911690630ea474c790602401602060405180830381865afa158015613498573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134bc9190613f53565b6134c69082613e01565b90506134d0613938565b6040516339ac5eb960e01b81526001600160a01b03868116600483015291909116906339ac5eb990602401602060405180830381865afa158015613518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353c9190613f53565b6135469082613e01565b905060006135526136ac565b604051630213119b60e51b81526001600160a01b0387811660048301529190911690634262336090602401606060405180830381865afa15801561359a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135be9190614171565b50506001600160601b031690506135d58183613e01565b9150831561367d576001600160a01b0385166000908152600c6020526040812054905b8181101561367a576001600160a01b0387166000908152600c6020526040812080548390811061362a5761362a613dbe565b60009182526020808320909101548083526009909152604090912054909150613664906001600160801b03600160801b9091041686613e01565b945050808061367290614003565b9150506135f8565b50505b509392505050565b600060038160015b81526020810191909152604001600020546001600160a01b0316919050565b6000600381600a61368d565b6000600160681b82106133315760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663034206269747360c81b6064820152608401610935565b6000600381600761368d565b6000600160601b82106133315760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401610935565b6000828152600a60205260409020546001600160a01b031680156138ed576001600160a01b0381166000908152600c6020526040812054905b818110156138ea576001600160a01b0383166000908152600c602052604090208054869190839081106137fb576137fb613dbe565b9060005260206000200154036138d8576000613818600184613dab565b6001600160a01b0385166000908152600c602052604090208054919250908290811061384657613846613dbe565b9060005260206000200154600c6000866001600160a01b03166001600160a01b03168152602001908152602001600020838154811061388757613887613dbe565b60009182526020808320909101929092556001600160a01b0386168152600c909152604090208054806138bc576138bc613e14565b60019003818190600052602060002001600090559055506138ea565b806138e281614003565b9150506137c6565b50505b506001600160a01b03166000818152600c60209081526040808320805460018101825590845282842001859055938252600a90529190912080546001600160a01b0319169091179055565b6000600381600661368d565b6001600160a01b038116811461395957600080fd5b50565b60008083601f84011261396e57600080fd5b50813567ffffffffffffffff81111561398657600080fd5b6020830191508360208260051b85010111156139a157600080fd5b9250929050565b6000806000806000606086880312156139c057600080fd5b85356139cb81613944565b9450602086013567ffffffffffffffff808211156139e857600080fd5b6139f489838a0161395c565b90965094506040880135915080821115613a0d57600080fd5b50613a1a8882890161395c565b969995985093965092949392505050565b600060208284031215613a3d57600080fd5b813561233081613944565b60008060408385031215613a5b57600080fd5b50508035926020909101359150565b600080600060608486031215613a7f57600080fd5b8335613a8a81613944565b92506020840135613a9a81613944565b929592945050506040919091013590565b600060208284031215613abd57600080fd5b5035919050565b600080600060608486031215613ad957600080fd5b8335613ae481613944565b95602085013595506040909401359392505050565b600081518084526020808501945080840160005b83811015613b2957815187529582019590820190600101613b0d565b509495945050505050565b6020815260006123306020830184613af9565b60008060408385031215613b5a57600080fd5b8235613b6581613944565b946020939093013593505050565b801515811461395957600080fd5b60008060008060808587031215613b9757600080fd5b8435613ba281613944565b93506020850135613bb281613b73565b92506040850135613bc281613b73565b9396929550929360600135925050565b60008060208385031215613be557600080fd5b823567ffffffffffffffff811115613bfc57600080fd5b613c088582860161395c565b90969095509350505050565b600080600060608486031215613c2957600080fd5b833592506020840135613a9a81613944565b606081526000613c4e6060830186613af9565b8281036020840152613c608186613af9565b915050826040830152949350505050565b60008060408385031215613c8457600080fd5b82356001600160c01b031981168114613b6557600080fd5b60008060408385031215613caf57600080fd5b8235613cba81613944565b91506020830135613cca81613944565b809150509250929050565b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215613d0457600080fd5b8435613d0f81613944565b966020860135965060408601359560600135945092505050565b60008060408385031215613d3c57600080fd5b823591506020830135613cca81613944565b600060208284031215613d6057600080fd5b815161233081613b73565b60208082526010908201526f14de5cdd195b481a5cc81c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561173357611733613d95565b634e487b7160e01b600052603260045260246000fd5b6121a760f11b815260609290921b6bffffffffffffffffffffffff19166002830152601682015260360190565b8082018082111561173357611733613d95565b634e487b7160e01b600052603160045260246000fd5b600081613e3957613e39613d95565b506000190190565b60208082526022908201527f43616c6c6572206973206e6f7420617574686f72697a656420746f20676f7665604082015261393760f11b606082015260800190565b6020808252602a908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206e6f742061207374604082015269185ada5b99c81c1bdbdb60b21b606082015260800190565b6001600160801b03818116838216019080821115613eed57613eed613d95565b5092915050565b60208082526022908201527f43616c6c6572206973206e6f7420616e20696e7465726e616c20636f6e74726160408201526118dd60f21b606082015260800190565b600060208284031215613f4857600080fd5b815161233081613944565b600060208284031215613f6557600080fd5b5051919050565b6001600160801b03828116828216039080821115613eed57613eed613d95565b60008060408385031215613f9f57600080fd5b505080516020909101519092909150565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a204e6f20776974686472617761626c6560408201527220676f7665726e616e6365207265776172647360681b606082015260800190565b60006001820161401557614015613d95565b5060010190565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f7420736040820152723a30b5b4b733903837b7b61036b0b730b3b2b960691b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561409857600080fd5b825167ffffffffffffffff808211156140b057600080fd5b818501915085601f8301126140c457600080fd5b8151818111156140d6576140d661406f565b8060051b604051601f19603f830116810181811085821117156140fb576140fb61406f565b60405291825284820192508381018501918883111561411957600080fd5b938501935b828510156141375784518452938501939285019261411e565b98975050505050505050565b60008060006060848603121561415857600080fd5b8351925060208401519150604084015190509250925092565b60008060006060848603121561418657600080fd5b83516001600160601b038116811461419d57600080fd5b60208501519093506cffffffffffffffffffffffffff811681146141c057600080fd5b604085015190925061ffff811681146141d857600080fd5b80915050925092509256fea26469706673582212206331f021a2e524aa6c1af51e1fd76cbb5e00ac151c18eb710474ef2719d024c964736f6c63430008120033000000000000000000000000ce238f1ff7417ef688f29f4dcc12a5131b87ec910000000000000000000000005e5eaee4b516f360ef1f096caad6f42cc75df272000000000000000000000000df431fa3e1fd22f9f7d232bc45456c94d1ec0431000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102f15760003560e01c80638448fa2f1161019d578063d46655f4116100e9578063e41060cd116100a2578063ee97f7f31161007c578063ee97f7f31461082d578063f6ed201714610840578063fc0c546a14610853578063ffd7d66d1461087a57600080fd5b8063e41060cd146107de578063e43252d7146107f1578063eb9623601461080457600080fd5b8063d46655f414610713578063d71be8db14610726578063dd3031c01461077c578063e01cdf0c1461078f578063e0a09646146107b8578063e1324942146107cb57600080fd5b8063aec1f86611610156578063c4927d7e11610130578063c4927d7e14610682578063c4b083fa146106ad578063c58fada9146106b6578063cc35b1b11461070057600080fd5b8063aec1f86614610635578063b31100af14610648578063ba428e681461065b57600080fd5b80638448fa2f146105aa5780638ab1d681146105cc57806398aebc7d146105df5780639dd86e0f146105f25780639e23a46614610605578063a1b8adcb1461060e57600080fd5b80634b0ee02a1161025c5780635c39eaef116102155780636eb6dd71116101ef5780636eb6dd711461054657806371d66f0014610571578063768298391461058457806379cc67901461059757600080fd5b80635c39eaef1461050d5780635ca48d8c146105205780636b80bdd21461053357600080fd5b80634b0ee02a146104a65780634b94f50e146104b95780634c47e71d146104c15780634f8a048f146104d457806351626ddd146104e757806352e2fed2146104fa57600080fd5b806318160ddd116102ae57806318160ddd146103b5578063186c0c22146103cb57806322133fdd146103de578063259767d314610460578063392d5d2e1461048057806340c10f191461049357600080fd5b8063026c0b5f146102f657806306394c9b1461030b57806308cd3d6f1461031e5780630d1af103146103315780630d90cc2f146103595780630ea9c984146103ad575b600080fd5b6103096103043660046139a8565b6108a1565b005b610309610319366004613a2b565b610d10565b61030961032c366004613a48565b610e29565b61034461033f366004613a6a565b610ec4565b60405190151581526020015b60405180910390f35b61038d610367366004613aab565b6009602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610350565b61030961108c565b6103bd611351565b604051908152602001610350565b6103096103d9366004613ac4565b6113da565b61042c6103ec366004613aab565b60086020526000908152604090205461ffff81169060ff62010000820481169163010000008104909116906001600160601b036401000000009091041684565b6040805161ffff90951685529215156020850152901515918301919091526001600160601b03166060820152608001610350565b61047361046e366004613a2b565b611505565b6040516103509190613b34565b61030961048e366004613a48565b611571565b6103096104a1366004613b47565b611694565b6103bd6104b4366004613a2b565b611726565b6103bd611739565b6103096104cf366004613b47565b611780565b6103096104e2366004613b81565b61188c565b6103bd6104f5366004613a2b565b611af9565b610309610508366004613bd2565b611b06565b61030961051b366004613c14565b611e09565b6103bd61052e366004613b47565b611f09565b610309610541366004613aab565b611f60565b600454610559906001600160a01b031681565b6040516001600160a01b039091168152602001610350565b6103bd61057f366004613b47565b611fa7565b610309610592366004613aab565b611fd8565b6103446105a5366004613b47565b612216565b6105bd6105b8366004613a2b565b612337565b60405161035093929190613c3b565b6103096105da366004613a2b565b61265d565b600554610559906001600160a01b031681565b610309610600366004613c71565b612732565b6103bd60065481565b6105597f000000000000000000000000df431fa3e1fd22f9f7d232bc45456c94d1ec043181565b610309610643366004613c9c565b61280e565b610473610656366004613a2b565b6129a7565b6105597f0000000000000000000000005e5eaee4b516f360ef1f096caad6f42cc75df27281565b610344610690366004613a2b565b6001600160a01b03166000908152600c6020526040902054151590565b6103bd60075481565b6106f26106c4366004613aab565b6000908152600b60205260409020546001600160a01b03811691600160a01b9091046001600160601b031690565b604051610350929190613cd5565b61030961070e366004613cee565b612a0f565b610309610721366004613a2b565b612b47565b61075f610734366004613b47565b6001602081815260009384526040808520909152918352912080549181015460029091015460ff1683565b604080519384526020840192909252151590820152606001610350565b61030961078a366004613b47565b612bc1565b61055961079d366004613aab565b6000908152600a60205260409020546001600160a01b031690565b6103096107c6366004613d29565b612d3f565b6103096107d9366004613b47565b612dd1565b6103096107ec366004613a48565b612e9c565b6103096107ff366004613a2b565b612f0c565b610559610812366004613aab565b6003602052600090815260409020546001600160a01b031681565b600254610559906001600160a01b031681565b6103bd61084e366004613a2b565b612fe2565b6105597f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2381565b6105597f000000000000000000000000ce238f1ff7417ef688f29f4dcc12a5131b87ec9181565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108f4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109189190613d4e565b1561093e5760405162461bcd60e51b815260040161093590613d6b565b60405180910390fd5b6001600160a01b038516600090815260208190526040902054806109b95760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204e6f206c6f636b656420636f76657260448201526b081b9bdd195cc8199bdd5b9960a21b6064820152608401610935565b60006109c6600183613dab565b90506000855b8015610c735760008989896109e2600186613dab565b8181106109f1576109f1613dbe565b90506020020135604051602001610a09929190613dd4565b60405160208183030381529060405280519060200120905060008787600185610a329190613dab565b818110610a4157610a41613dbe565b905060200201359050816000808d6001600160a01b03166001600160a01b031681526020019081526020016000208281548110610a8057610a80613dbe565b906000526020600020015414610ae25760405162461bcd60e51b815260206004820152602160248201527f546f6b656e436f6e74726f6c6c65723a2042616420726561736f6e20696e64656044820152600f60fb1b6064820152608401610935565b6001600160a01b038b166000908152600160209081526040808320858452909152902054610b108186613e01565b6001600160a01b038d166000908152600160208181526040808420888552909152822082815590810191909155600201805460ff191690559450858214610bc8576001600160a01b038c166000908152602081905260409020805487908110610b7b57610b7b613dbe565b90600052602060002001546000808e6001600160a01b03166001600160a01b031681526020019081526020016000208381548110610bbb57610bbb613dbe565b6000918252602090912001555b6001600160a01b038c166000908152602081905260409020805480610bef57610bef613e14565b60019003818190600052602060002001600090559055828c6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051610c4191815260200190565b60405180910390a38515610c5d57610c5a600187613dab565b95505b5050508080610c6b90613e2a565b9150506109cc565b5060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23169063a9059cbb90610cc2908b908590600401613cd5565b6020604051808303816000875af1158015610ce1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d059190613d4e565b505050505050505050565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa158015610d58573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d7c9190613d4e565b610d985760405162461bcd60e51b815260040161093590613e41565b6040516306394c9b60e01b81526001600160a01b0382811660048301527f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2316906306394c9b906024015b6020604051808303816000875af1158015610e01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e259190613d4e565b5050565b610e32816130e7565b6001600160a01b0316336001600160a01b031614610e625760405162461bcd60e51b815260040161093590613e83565b610e6c3083613185565b610e75826132cc565b60008281526009602052604081208054909190610e9c9084906001600160801b0316613ecd565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa158015610f0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f319190613d4e565b610f4d5760405162461bcd60e51b815260040161093590613ef4565b60405163b0e65d0760e01b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23169063b0e65d0790610f9b9087908690600401613cd5565b6020604051808303816000875af1158015610fba573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fde9190613d4e565b506001600160a01b03831630146110825760405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23169063a9059cbb9061103d9086908690600401613cd5565b6020604051808303816000875af115801561105c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110809190613d4e565b505b5060019392505050565b6002546040516227050b60e31b815261505360f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa1580156110d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110fc9190613f36565b600660005260036020527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261415360f01b6004820152911690630138285890602401602060405180830381865afa158015611186573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111aa9190613f36565b600a60005260036020527f9dcb9783ba5cd0b54745f65f4f918525e461e91888c334e5342cb380ac558d5380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b81526123ab60f11b6004820152911690630138285890602401602060405180830381865afa158015611234573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112589190613f36565b600760005260036020527ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd280546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261503160f01b6004820152911690630138285890602401602060405180830381865afa1580156112e2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113069190613f36565b600160005260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b0319166001600160a01b0392909216919091179055565b60007f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd236001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113d59190613f53565b905090565b6113e3816130e7565b6001600160a01b0316336001600160a01b0316146114135760405162461bcd60e51b815260040161093590613e83565b61141c826132cc565b6000828152600960205260409020805460109061144a908490600160801b90046001600160801b0316613ecd565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd236001600160a01b031663b0e65d0784846040518363ffffffff1660e01b81526004016114bc929190613cd5565b6020604051808303816000875af11580156114db573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114ff9190613d4e565b50505050565b6001600160a01b0381166000908152600c602090815260409182902080548351818402810184019094528084526060939283018282801561156557602002820191906000526020600020905b815481526020019060010190808311611551575b50505050509050919050565b61157a816130e7565b6001600160a01b0316336001600160a01b0316146115aa5760405162461bcd60e51b815260040161093590613e83565b6115b3826132cc565b600082815260096020526040812080549091906115da9084906001600160801b0316613f6c565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd236001600160a01b03166342966c68836040518263ffffffff1660e01b815260040161164c91815260200190565b6020604051808303816000875af115801561166b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061168f9190613d4e565b505050565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156116dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117009190613d4e565b61171c5760405162461bcd60e51b815260040161093590613ef4565b610e258282613185565b6000611733826001613335565b92915050565b6000611743613685565b6001600160a01b0316634b94f50e6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156113b1573d6000803e3d6000fd5b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156117c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117ec9190613d4e565b6118085760405162461bcd60e51b815260040161093590613ef4565b604051634c47e71d60e01b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd231690634c47e71d906118569085908590600401613cd5565b600060405180830381600087803b15801561187057600080fd5b505af1158015611884573d6000803e3d6000fd5b505050505050565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa1580156118df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119039190613d4e565b156119205760405162461bcd60e51b815260040161093590613d6b565b81156119c65761192e6136ac565b6001600160a01b031663fa15af7e85611946846136b8565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526cffffffffffffffffffffffffff16602482015260440160408051808303816000875af115801561199f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119c39190613f8c565b50505b82156114ff5760006119d661371d565b6001600160a01b031663174e31c486846040518363ffffffff1660e01b8152600401611a03929190613cd5565b6020604051808303816000875af1158015611a22573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a469190613f53565b905060008111611a685760405162461bcd60e51b815260040161093590613fb0565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23169063a9059cbb90611ab69088908590600401613cd5565b6020604051808303816000875af1158015611ad5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118849190613d4e565b6000611733826000613335565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b7d9190613d4e565b15611b9a5760405162461bcd60e51b815260040161093590613d6b565b60005b8181101561168f5760016000848484818110611bbb57611bbb613dbe565b9050602002016020810190611bd09190613a2b565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290206002015460ff16611df757600060016000858585818110611c1f57611c1f613dbe565b9050602002016020810190611c349190613a2b565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290205490508015611df5576001806000868686818110611c8057611c80613dbe565b9050602002016020810190611c959190613a2b565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b808352935220600201805460ff191692151592909217909155848484818110611ce557611ce5613dbe565b9050602002016020810190611cfa9190613a2b565b6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051611d3491815260200190565b60405180910390a37f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd236001600160a01b031663a9059cbb858585818110611d7d57611d7d613dbe565b9050602002016020810190611d929190613a2b565b836040518363ffffffff1660e01b8152600401611db0929190613cd5565b6020604051808303816000875af1158015611dcf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df39190613d4e565b505b505b80611e0181614003565b915050611b9d565b6000838152600a60205260409020546001600160a01b03163314611e3f5760405162461bcd60e51b81526004016109359061401c565b804210611ea65760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e436f6e74726f6c6c65723a20446561646c696e652063616e6e6f7460448201526e081899481a5b881d1a19481c185cdd608a1b6064820152608401610935565b6040518060400160405280836001600160a01b03168152602001611ec983613729565b6001600160601b039081169091526000948552600b602090815260409095208251929095015116600160a01b026001600160a01b03909116179092555050565b6001600160a01b038216600090815260016020908152604080832084845290915281206002015460ff1661173357506001600160a01b03919091166000908152600160209081526040808320938352929052205490565b6000818152600a60205260409020546001600160a01b03163314611f965760405162461bcd60e51b81526004016109359061401c565b6000908152600b6020526040812055565b60006020528160005260406000208181548110611fc357600080fd5b90600052602060002001600091509150505481565b6000818152600a6020526040908190205490516398fd371f60e01b81526001600160a01b0391821660048201819052917f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2316906398fd371f90602401602060405180830381865afa158015612051573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120759190613f53565b42116120f55760405162461bcd60e51b815260206004820152604360248201527f546f6b656e436f6e74726f6c6c65723a2043757272656e74206d616e6167657260448201527f206973206c6f636b656420666f7220766f74696e6720696e20676f7665726e616064820152626e636560e81b608482015260a401610935565b6000828152600b60205260409020546001600160a01b031633146121775760405162461bcd60e51b815260206004820152603360248201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f742074604482015272343290383937b837b9b2b21036b0b730b3b2b960691b6064820152608401610935565b6000828152600b602052604090205442600160a01b9091046001600160601b0316116121fa5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204f776e657273686970206f6666657260448201526b081a185cc8195e1c1a5c995960a21b6064820152608401610935565b612204823361378d565b506000908152600b6020526040812055565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa15801561225f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122839190613d4e565b61229f5760405162461bcd60e51b815260040161093590613ef4565b60405163079cc67960e41b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2316906379cc6790906122ed9086908690600401613cd5565b6020604051808303816000875af115801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190613d4e565b9392505050565b604051633f9f3eff60e21b81526001600160a01b038281166004830152606091829160009182917f000000000000000000000000ce238f1ff7417ef688f29f4dcc12a5131b87ec91169063fe7cfbfc90602401600060405180830381865afa1580156123a7573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526123cf9190810190614085565b90506000815167ffffffffffffffff8111156123ed576123ed61406f565b604051908082528060200260200182016040528015612416578160200160208202803683370190505b5090506000825167ffffffffffffffff8111156124355761243561406f565b60405190808252806020026020018201604052801561245e578160200160208202803683370190505b5090506000805b845181101561253a57600085828151811061248257612482613dbe565b6020026020010151905060008a826040516020016124a1929190613dd4565b60405160208183030381529060405280519060200120905060006124c58c83611f09565b9050801561252457828786815181106124e0576124e0613dbe565b602002602001018181525050818686815181106124ff576124ff613dbe565b6020908102919091010152612514818a613e01565b98508461252081614003565b9550505b505050808061253290614003565b915050612465565b508067ffffffffffffffff8111156125545761255461406f565b60405190808252806020026020018201604052801561257d578160200160208202803683370190505b5096508067ffffffffffffffff8111156125995761259961406f565b6040519080825280602002602001820160405280156125c2578160200160208202803683370190505b50955060005b81811015612651578381815181106125e2576125e2613dbe565b60200260200101518882815181106125fc576125fc613dbe565b60200260200101818152505082818151811061261a5761261a613dbe565b602002602001015187828151811061263457612634613dbe565b60209081029190910101528061264981614003565b9150506125c8565b50505050509193909250565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156126a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126c99190613d4e565b6126e55760405162461bcd60e51b815260040161093590613ef4565b6040516237ecc960e31b81526001600160a01b0382811660048301527f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2316906301bf664890602401610de2565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa15801561277a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061279e9190613d4e565b6127ba5760405162461bcd60e51b815260040161093590613e41565b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e436f6e74726f6c6c65723a20696e76616c696420706172616d20636044820152626f646560e81b6064820152608401610935565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612856573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061287a9190613d4e565b6128965760405162461bcd60e51b815260040161093590613ef4565b6001600160a01b0382166000908152600c6020526040812054908190036128bc57505050565b801561168f576001600160a01b0383166000908152600c602052604081206128e5600184613dab565b815481106128f5576128f5613dbe565b90600052602060002001549050600c6000856001600160a01b03166001600160a01b0316815260200190815260200160002080548061293657612936613e14565b6000828152602080822083016000199081018390559092019092556001600160a01b038516808352600c82526040808420805460018101825590855283852001859055848452600a909252912080546001600160a01b03191690911790558161299e81613e2a565b925050506128bc565b6001600160a01b0381166000908152602081815260409182902080548351818402810184019094528084526060939283018282801561156557602002820191906000526020600020908154815260200190600101908083116115515750505050509050919050565b612a18816130e7565b6001600160a01b0316336001600160a01b031614612a485760405162461bcd60e51b815260040161093590613e83565b6000818152600960209081526040918290208251808401909352546001600160801b038082168452600160801b9091041690820152612a86846132cc565b81602001818151612a979190613f6c565b6001600160801b0316905250612aac836132cc565b81518290612abb908390613f6c565b6001600160801b0390811690915260008481526009602090815260409091208451918501518316600160801b0291909216179055506001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd231663a9059cbb86612b2a8688613e01565b6040518363ffffffff1660e01b8152600401611ab6929190613cd5565b6002546001600160a01b031615612b9f576002546001600160a01b03163314612b9f5760405162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b6044820152606401610935565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612c14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612c389190613d4e565b15612c555760405162461bcd60e51b815260040161093590613d6b565b6000612c5f61371d565b6001600160a01b031663174e31c433846040518363ffffffff1660e01b8152600401612c8c929190613cd5565b6020604051808303816000875af1158015612cab573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612ccf9190613f53565b905060008111612cf15760405162461bcd60e51b815260040161093590613fb0565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23169063a9059cbb906114bc9086908590600401613cd5565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612d87573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612dab9190613d4e565b612dc75760405162461bcd60e51b815260040161093590613ef4565b610e25828261378d565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612e24573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e489190613d4e565b15612e655760405162461bcd60e51b815260040161093590613d6b565b6000612e6f61371d565b6001600160a01b031663174e31c484846040518363ffffffff1660e01b8152600401612c8c929190613cd5565b612ea5816130e7565b6001600160a01b0316336001600160a01b031614612ed55760405162461bcd60e51b815260040161093590613e83565b612ede826132cc565b600082815260096020526040902080546010906115da908490600160801b90046001600160801b0316613f6c565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612f54573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f789190613d4e565b612f945760405162461bcd60e51b815260040161093590613ef4565b6040516311fb80e560e21b81526001600160a01b0382811660048301527f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2316906347ee039490602401610de2565b600080612fed6136ac565b6040516379ee54f760e01b81526001600160a01b03858116600483015291909116906379ee54f790602401606060405180830381865afa158015613035573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130599190614143565b50509050600061306761371d565b6040516326fceb5d60e11b81526001600160a01b0386811660048301529190911690634df9d6ba90602401602060405180830381865afa1580156130af573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906130d39190613f53565b90506130df8183613e01565b949350505050565b604080516001600160f81b03196020808301919091527f000000000000000000000000df431fa3e1fd22f9f7d232bc45456c94d1ec043160601b6bffffffffffffffffffffffff19166021830152603582018490527f1eb804b66941a2e8465fa0951be9c8b855b7794ee05b0789ab22a02ee1298ebe6055808401919091528351808403909101815260759092019092528051910120600090611733565b6001600160a01b0382163014806132215750604051633e83f2a160e21b81526001600160a01b0383811660048301527f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23169063fa0fca8490602401602060405180830381865afa1580156131fd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132219190613d4e565b61327e5760405162461bcd60e51b815260206004820152602860248201527f546f6b656e436f6e74726f6c6c65723a2041646472657373206973206e6f7420604482015267309036b2b6b132b960c11b6064820152608401610935565b6040516340c10f1960e01b81526001600160a01b037f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2316906340c10f19906118569085908590600401613cd5565b6000600160801b82106133315760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401610935565b5090565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182917f000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd2316906370a0823190602401602060405180830381865afa1580156133a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133c49190613f53565b905060005b6001600160a01b038516600090815260208190526040902054811015613447576001600160a01b038516600090815260208190526040902080546134299187918490811061341957613419613dbe565b9060005260206000200154611f09565b6134339083613e01565b91508061343f81614003565b9150506133c9565b50613450613938565b604051630ea474c760e01b81526001600160a01b0386811660048301529190911690630ea474c790602401602060405180830381865afa158015613498573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906134bc9190613f53565b6134c69082613e01565b90506134d0613938565b6040516339ac5eb960e01b81526001600160a01b03868116600483015291909116906339ac5eb990602401602060405180830381865afa158015613518573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061353c9190613f53565b6135469082613e01565b905060006135526136ac565b604051630213119b60e51b81526001600160a01b0387811660048301529190911690634262336090602401606060405180830381865afa15801561359a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135be9190614171565b50506001600160601b031690506135d58183613e01565b9150831561367d576001600160a01b0385166000908152600c6020526040812054905b8181101561367a576001600160a01b0387166000908152600c6020526040812080548390811061362a5761362a613dbe565b60009182526020808320909101548083526009909152604090912054909150613664906001600160801b03600160801b9091041686613e01565b945050808061367290614003565b9150506135f8565b50505b509392505050565b600060038160015b81526020810191909152604001600020546001600160a01b0316919050565b6000600381600a61368d565b6000600160681b82106133315760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663034206269747360c81b6064820152608401610935565b6000600381600761368d565b6000600160601b82106133315760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401610935565b6000828152600a60205260409020546001600160a01b031680156138ed576001600160a01b0381166000908152600c6020526040812054905b818110156138ea576001600160a01b0383166000908152600c602052604090208054869190839081106137fb576137fb613dbe565b9060005260206000200154036138d8576000613818600184613dab565b6001600160a01b0385166000908152600c602052604090208054919250908290811061384657613846613dbe565b9060005260206000200154600c6000866001600160a01b03166001600160a01b03168152602001908152602001600020838154811061388757613887613dbe565b60009182526020808320909101929092556001600160a01b0386168152600c909152604090208054806138bc576138bc613e14565b60019003818190600052602060002001600090559055506138ea565b806138e281614003565b9150506137c6565b50505b506001600160a01b03166000818152600c60209081526040808320805460018101825590845282842001859055938252600a90529190912080546001600160a01b0319169091179055565b6000600381600661368d565b6001600160a01b038116811461395957600080fd5b50565b60008083601f84011261396e57600080fd5b50813567ffffffffffffffff81111561398657600080fd5b6020830191508360208260051b85010111156139a157600080fd5b9250929050565b6000806000806000606086880312156139c057600080fd5b85356139cb81613944565b9450602086013567ffffffffffffffff808211156139e857600080fd5b6139f489838a0161395c565b90965094506040880135915080821115613a0d57600080fd5b50613a1a8882890161395c565b969995985093965092949392505050565b600060208284031215613a3d57600080fd5b813561233081613944565b60008060408385031215613a5b57600080fd5b50508035926020909101359150565b600080600060608486031215613a7f57600080fd5b8335613a8a81613944565b92506020840135613a9a81613944565b929592945050506040919091013590565b600060208284031215613abd57600080fd5b5035919050565b600080600060608486031215613ad957600080fd5b8335613ae481613944565b95602085013595506040909401359392505050565b600081518084526020808501945080840160005b83811015613b2957815187529582019590820190600101613b0d565b509495945050505050565b6020815260006123306020830184613af9565b60008060408385031215613b5a57600080fd5b8235613b6581613944565b946020939093013593505050565b801515811461395957600080fd5b60008060008060808587031215613b9757600080fd5b8435613ba281613944565b93506020850135613bb281613b73565b92506040850135613bc281613b73565b9396929550929360600135925050565b60008060208385031215613be557600080fd5b823567ffffffffffffffff811115613bfc57600080fd5b613c088582860161395c565b90969095509350505050565b600080600060608486031215613c2957600080fd5b833592506020840135613a9a81613944565b606081526000613c4e6060830186613af9565b8281036020840152613c608186613af9565b915050826040830152949350505050565b60008060408385031215613c8457600080fd5b82356001600160c01b031981168114613b6557600080fd5b60008060408385031215613caf57600080fd5b8235613cba81613944565b91506020830135613cca81613944565b809150509250929050565b6001600160a01b03929092168252602082015260400190565b60008060008060808587031215613d0457600080fd5b8435613d0f81613944565b966020860135965060408601359560600135945092505050565b60008060408385031215613d3c57600080fd5b823591506020830135613cca81613944565b600060208284031215613d6057600080fd5b815161233081613b73565b60208082526010908201526f14de5cdd195b481a5cc81c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b8181038181111561173357611733613d95565b634e487b7160e01b600052603260045260246000fd5b6121a760f11b815260609290921b6bffffffffffffffffffffffff19166002830152601682015260360190565b8082018082111561173357611733613d95565b634e487b7160e01b600052603160045260246000fd5b600081613e3957613e39613d95565b506000190190565b60208082526022908201527f43616c6c6572206973206e6f7420617574686f72697a656420746f20676f7665604082015261393760f11b606082015260800190565b6020808252602a908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206e6f742061207374604082015269185ada5b99c81c1bdbdb60b21b606082015260800190565b6001600160801b03818116838216019080821115613eed57613eed613d95565b5092915050565b60208082526022908201527f43616c6c6572206973206e6f7420616e20696e7465726e616c20636f6e74726160408201526118dd60f21b606082015260800190565b600060208284031215613f4857600080fd5b815161233081613944565b600060208284031215613f6557600080fd5b5051919050565b6001600160801b03828116828216039080821115613eed57613eed613d95565b60008060408385031215613f9f57600080fd5b505080516020909101519092909150565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a204e6f20776974686472617761626c6560408201527220676f7665726e616e6365207265776172647360681b606082015260800190565b60006001820161401557614015613d95565b5060010190565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f7420736040820152723a30b5b4b733903837b7b61036b0b730b3b2b960691b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561409857600080fd5b825167ffffffffffffffff808211156140b057600080fd5b818501915085601f8301126140c457600080fd5b8151818111156140d6576140d661406f565b8060051b604051601f19603f830116810181811085821117156140fb576140fb61406f565b60405291825284820192508381018501918883111561411957600080fd5b938501935b828510156141375784518452938501939285019261411e565b98975050505050505050565b60008060006060848603121561415857600080fd5b8351925060208401519150604084015190509250925092565b60008060006060848603121561418657600080fd5b83516001600160601b038116811461419d57600080fd5b60208501519093506cffffffffffffffffffffffffff811681146141c057600080fd5b604085015190925061ffff811681146141d857600080fd5b80915050925092509256fea26469706673582212206331f021a2e524aa6c1af51e1fd76cbb5e00ac151c18eb710474ef2719d024c964736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000ce238f1ff7417ef688f29f4dcc12a5131b87ec910000000000000000000000005e5eaee4b516f360ef1f096caad6f42cc75df272000000000000000000000000df431fa3e1fd22f9f7d232bc45456c94d1ec0431000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23
-----Decoded View---------------
Arg [0] : quotationDataAddress (address): 0xCE238f1FF7417ef688F29F4dcC12A5131B87eC91
Arg [1] : claimsRewardAddress (address): 0x5e5EaEE4b516F360EF1f096caAd6f42Cc75dF272
Arg [2] : stakingPoolFactoryAddress (address): 0xdF431Fa3E1Fd22F9f7d232BC45456c94D1Ec0431
Arg [3] : tokenAddress (address): 0xCb3c294cF415632b87D29CEa59d8D12Fca54Fd23
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000ce238f1ff7417ef688f29f4dcc12a5131b87ec91
Arg [1] : 0000000000000000000000005e5eaee4b516f360ef1f096caad6f42cc75df272
Arg [2] : 000000000000000000000000df431fa3e1fd22f9f7d232bc45456c94d1ec0431
Arg [3] : 000000000000000000000000cb3c294cf415632b87d29cea59d8d12fca54fd23
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.