Source Code
Overview
S Balance
More Info
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Loading...
Loading
Contract Name:
DisposableTokenController
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/ISAFURAToken.sol"; import "../../modules/token/TokenController.sol"; contract DisposableTokenController is TokenController { constructor( address quotationDataAddress, address claimsRewardAddress, address stakingPoolFactoryAddress, address tokenAddress ) TokenController(quotationDataAddress, claimsRewardAddress, stakingPoolFactoryAddress, tokenAddress) {} function initialize( address payable _masterAddress, address payable _pooledStakingAddress, address payable _assessmentAddress ) external { token.changeOperator(address(this)); changeMasterAddress(_masterAddress); internalContracts[uint(ID.PS)] = _pooledStakingAddress; internalContracts[uint(ID.AS)] = _assessmentAddress; } function addToWhitelist(address _member) public override { token.addToWhiteList(_member); } function lock( address _of, bytes32 _reason, uint256 _amount, uint256 _time ) external returns (bool) { // If tokens are already locked, then functions extendLock or // increaseLockAmount should be used to make any changes _lock(_of, _reason, _amount, _time); return true; } /** * @dev Locks a specified amount of tokens against an address, * for a specified reason and time * @param _of address whose tokens are to be locked * @param _reason The reason to lock tokens * @param _amount Number of tokens to be locked * @param _time Lock time in seconds */ function _lock(address _of, bytes32 _reason, uint256 _amount, uint256 _time) internal { require(tokensLocked(_of, _reason) == 0, "TokenController: An amount of tokens is already locked"); require(_amount != 0, "TokenController: Amount shouldn't be zero"); if (locked[_of][_reason].amount == 0) { lockReason[_of].push(_reason); } token.operatorTransfer(_of, _amount); uint256 validUntil = block.timestamp + _time; locked[_of][_reason] = LockToken(_amount, validUntil, false); emit Locked(_of, _reason, _amount, validUntil); } }
// 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); }
// 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); } }
{ "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":"address payable","name":"_masterAddress","type":"address"},{"internalType":"address payable","name":"_pooledStakingAddress","type":"address"},{"internalType":"address payable","name":"_assessmentAddress","type":"address"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","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":"bytes32","name":"_reason","type":"bytes32"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_time","type":"uint256"}],"name":"lock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","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
6101006040523480156200001257600080fd5b506040516200476a3803806200476a833981016040819052620000359162000075565b6001600160a01b0393841660a05291831660c052821660e05216608052620000d2565b80516001600160a01b03811681146200007057600080fd5b919050565b600080600080608085870312156200008c57600080fd5b620000978562000058565b9350620000a76020860162000058565b9250620000b76040860162000058565b9150620000c76060860162000058565b905092959194509250565b60805160a05160c05160e0516145bd620001ad6000396000818161065c0152613463015260006106a90152600081816108db01526123d50152600081816108b401528181610ce701528181610e1301528181610fd90152818161107b015281816113ca015281816114e5015281816116750152818161189401528181611af401528181611db30152818161207f0152818161232b0152818161277801528181612a9901528181612c7a01528181612e88015281816130ab015281816133220152818161351a015281816135f901526136bd01526145bd6000f3fe608060405234801561001057600080fd5b50600436106103275760003560e01c80638448fa2f116101b8578063cc35b1b111610104578063e41060cd116100a2578063ee97f7f31161007c578063ee97f7f314610889578063f6ed20171461089c578063fc0c546a146108af578063ffd7d66d146108d657600080fd5b8063e41060cd1461083a578063e43252d71461084d578063eb9623601461086057600080fd5b8063dd3031c0116100de578063dd3031c0146107d8578063e01cdf0c146107eb578063e0a0964614610814578063e13249421461082757600080fd5b8063cc35b1b11461075c578063d46655f41461076f578063d71be8db1461078257600080fd5b8063aec1f86611610171578063c0c53b8b1161014b578063c0c53b8b146106cb578063c4927d7e146106de578063c4b083fa14610709578063c58fada91461071257600080fd5b8063aec1f8661461067e578063b31100af14610691578063ba428e68146106a457600080fd5b80638448fa2f146105f35780638ab1d6811461061557806398aebc7d146106285780639dd86e0f1461063b5780639e23a4661461064e578063a1b8adcb1461065757600080fd5b80634b0ee02a116102775780635c39eaef116102305780636eb6dd711161020a5780636eb6dd711461058f57806371d66f00146105ba57806376829839146105cd57806379cc6790146105e057600080fd5b80635c39eaef146105565780635ca48d8c146105695780636b80bdd21461057c57600080fd5b80634b0ee02a146104ef5780634b94f50e146105025780634c47e71d1461050a5780634f8a048f1461051d57806351626ddd1461053057806352e2fed21461054357600080fd5b80630ea9c984116102e457806322133fdd116102be57806322133fdd14610427578063259767d3146104a9578063392d5d2e146104c957806340c10f19146104dc57600080fd5b80630ea9c984146103f657806318160ddd146103fe578063186c0c221461041457600080fd5b8063026c0b5f1461032c57806306394c9b14610341578063087fad411461035457806308cd3d6f1461037c5780630d1af1031461038f5780630d90cc2f146103a2575b600080fd5b61033f61033a366004613d0c565b6108fd565b005b61033f61034f366004613d8f565b610d6c565b610367610362366004613dac565b610e85565b60405190151581526020015b60405180910390f35b61033f61038a366004613de7565b610e9e565b61036761039d366004613e09565b610f39565b6103d66103b0366004613e4a565b6009602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610373565b61033f611101565b6104066113c6565b604051908152602001610373565b61033f610422366004613e63565b61144f565b610475610435366004613e4a565b60086020526000908152604090205461ffff81169060ff62010000820481169163010000008104909116906001600160601b036401000000009091041684565b6040805161ffff90951685529215156020850152901515918301919091526001600160601b03166060820152608001610373565b6104bc6104b7366004613d8f565b61157a565b6040516103739190613ed3565b61033f6104d7366004613de7565b6115e6565b61033f6104ea366004613ee6565b611709565b6104066104fd366004613d8f565b61179b565b6104066117ae565b61033f610518366004613ee6565b6117f5565b61033f61052b366004613f20565b611901565b61040661053e366004613d8f565b611b6e565b61033f610551366004613f71565b611b7b565b61033f610564366004613fb3565b611e7e565b610406610577366004613ee6565b611f7e565b61033f61058a366004613e4a565b611fd5565b6004546105a2906001600160a01b031681565b6040516001600160a01b039091168152602001610373565b6104066105c8366004613ee6565b61201c565b61033f6105db366004613e4a565b61204d565b6103676105ee366004613ee6565b61228b565b610606610601366004613d8f565b6123ac565b60405161037393929190613fda565b61033f610623366004613d8f565b6126d2565b6005546105a2906001600160a01b031681565b61033f610649366004614010565b6127a7565b61040660065481565b6105a27f000000000000000000000000000000000000000000000000000000000000000081565b61033f61068c36600461403b565b612883565b6104bc61069f366004613d8f565b612a1c565b6105a27f000000000000000000000000000000000000000000000000000000000000000081565b61033f6106d9366004614074565b612a84565b6103676106ec366004613d8f565b6001600160a01b03166000908152600c6020526040902054151590565b61040660075481565b61074e610720366004613e4a565b6000908152600b60205260409020546001600160a01b03811691600160a01b9091046001600160601b031690565b6040516103739291906140bf565b61033f61076a366004613dac565b612b8f565b61033f61077d366004613d8f565b612cc7565b6107bb610790366004613ee6565b6001602081815260009384526040808520909152918352912080549181015460029091015460ff1683565b604080519384526020840192909252151590820152606001610373565b61033f6107e6366004613ee6565b612d41565b6105a26107f9366004613e4a565b6000908152600a60205260409020546001600160a01b031690565b61033f6108223660046140d8565b612ebf565b61033f610835366004613ee6565b612f51565b61033f610848366004613de7565b61301c565b61033f61085b366004613d8f565b61308c565b6105a261086e366004613e4a565b6003602052600090815260409020546001600160a01b031681565b6002546105a2906001600160a01b031681565b6104066108aa366004613d8f565b6130da565b6105a27f000000000000000000000000000000000000000000000000000000000000000081565b6105a27f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097491906140fd565b1561099a5760405162461bcd60e51b81526004016109919061411a565b60405180910390fd5b6001600160a01b03851660009081526020819052604090205480610a155760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204e6f206c6f636b656420636f76657260448201526b081b9bdd195cc8199bdd5b9960a21b6064820152608401610991565b6000610a2260018361415a565b90506000855b8015610ccf576000898989610a3e60018661415a565b818110610a4d57610a4d61416d565b90506020020135604051602001610a65929190614183565b60405160208183030381529060405280519060200120905060008787600185610a8e919061415a565b818110610a9d57610a9d61416d565b905060200201359050816000808d6001600160a01b03166001600160a01b031681526020019081526020016000208281548110610adc57610adc61416d565b906000526020600020015414610b3e5760405162461bcd60e51b815260206004820152602160248201527f546f6b656e436f6e74726f6c6c65723a2042616420726561736f6e20696e64656044820152600f60fb1b6064820152608401610991565b6001600160a01b038b166000908152600160209081526040808320858452909152902054610b6c81866141b0565b6001600160a01b038d166000908152600160208181526040808420888552909152822082815590810191909155600201805460ff191690559450858214610c24576001600160a01b038c166000908152602081905260409020805487908110610bd757610bd761416d565b90600052602060002001546000808e6001600160a01b03166001600160a01b031681526020019081526020016000208381548110610c1757610c1761416d565b6000918252602090912001555b6001600160a01b038c166000908152602081905260409020805480610c4b57610c4b6141c3565b60019003818190600052602060002001600090559055828c6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051610c9d91815260200190565b60405180910390a38515610cb957610cb660018761415a565b95505b5050508080610cc7906141d9565b915050610a28565b5060405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90610d1e908b9085906004016140bf565b6020604051808303816000875af1158015610d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6191906140fd565b505050505050505050565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa158015610db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd891906140fd565b610df45760405162461bcd60e51b8152600401610991906141f0565b6040516306394c9b60e01b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906306394c9b906024015b6020604051808303816000875af1158015610e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8191906140fd565b5050565b6000610e93858585856131df565b506001949350505050565b610ea78161344b565b6001600160a01b0316336001600160a01b031614610ed75760405162461bcd60e51b815260040161099190614232565b610ee130836134e9565b610eea82613630565b60008281526009602052604081208054909190610f119084906001600160801b031661427c565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa158015610f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa691906140fd565b610fc25760405162461bcd60e51b8152600401610991906142a3565b60405163b0e65d0760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e65d079061101090879086906004016140bf565b6020604051808303816000875af115801561102f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105391906140fd565b506001600160a01b03831630146110f75760405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906110b290869086906004016140bf565b6020604051808303816000875af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906140fd565b505b5060019392505050565b6002546040516227050b60e31b815261505360f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa15801561114d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117191906142e5565b600660005260036020527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261415360f01b6004820152911690630138285890602401602060405180830381865afa1580156111fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121f91906142e5565b600a60005260036020527f9dcb9783ba5cd0b54745f65f4f918525e461e91888c334e5342cb380ac558d5380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b81526123ab60f11b6004820152911690630138285890602401602060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd91906142e5565b600760005260036020527ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd280546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261503160f01b6004820152911690630138285890602401602060405180830381865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b91906142e5565b600160005260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b0319166001600160a01b0392909216919091179055565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144a9190614302565b905090565b6114588161344b565b6001600160a01b0316336001600160a01b0316146114885760405162461bcd60e51b815260040161099190614232565b61149182613630565b600082815260096020526040902080546010906114bf908490600160801b90046001600160801b031661427c565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b0e65d0784846040518363ffffffff1660e01b81526004016115319291906140bf565b6020604051808303816000875af1158015611550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157491906140fd565b50505050565b6001600160a01b0381166000908152600c60209081526040918290208054835181840281018401909452808452606093928301828280156115da57602002820191906000526020600020905b8154815260200190600101908083116115c6575b50505050509050919050565b6115ef8161344b565b6001600160a01b0316336001600160a01b03161461161f5760405162461bcd60e51b815260040161099190614232565b61162882613630565b6000828152600960205260408120805490919061164f9084906001600160801b031661431b565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166342966c68836040518263ffffffff1660e01b81526004016116c191815260200190565b6020604051808303816000875af11580156116e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170491906140fd565b505050565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015611751573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177591906140fd565b6117915760405162461bcd60e51b8152600401610991906142a3565b610e8182826134e9565b60006117a8826001613699565b92915050565b60006117b86139e9565b6001600160a01b0316634b94f50e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611426573d6000803e3d6000fd5b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186191906140fd565b61187d5760405162461bcd60e51b8152600401610991906142a3565b604051634c47e71d60e01b81526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690634c47e71d906118cb90859085906004016140bf565b600060405180830381600087803b1580156118e557600080fd5b505af11580156118f9573d6000803e3d6000fd5b505050505050565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197891906140fd565b156119955760405162461bcd60e51b81526004016109919061411a565b8115611a3b576119a3613a10565b6001600160a01b031663fa15af7e856119bb84613a1c565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526cffffffffffffffffffffffffff16602482015260440160408051808303816000875af1158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a38919061433b565b50505b8215611574576000611a4b613a81565b6001600160a01b031663174e31c486846040518363ffffffff1660e01b8152600401611a789291906140bf565b6020604051808303816000875af1158015611a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abb9190614302565b905060008111611add5760405162461bcd60e51b81526004016109919061435f565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb90611b2b90889085906004016140bf565b6020604051808303816000875af1158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f991906140fd565b60006117a8826000613699565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf291906140fd565b15611c0f5760405162461bcd60e51b81526004016109919061411a565b60005b818110156117045760016000848484818110611c3057611c3061416d565b9050602002016020810190611c459190613d8f565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290206002015460ff16611e6c57600060016000858585818110611c9457611c9461416d565b9050602002016020810190611ca99190613d8f565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290205490508015611e6a576001806000868686818110611cf557611cf561416d565b9050602002016020810190611d0a9190613d8f565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b808352935220600201805460ff191692151592909217909155848484818110611d5a57611d5a61416d565b9050602002016020810190611d6f9190613d8f565b6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051611da991815260200190565b60405180910390a37f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb858585818110611df257611df261416d565b9050602002016020810190611e079190613d8f565b836040518363ffffffff1660e01b8152600401611e259291906140bf565b6020604051808303816000875af1158015611e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6891906140fd565b505b505b80611e76816143b2565b915050611c12565b6000838152600a60205260409020546001600160a01b03163314611eb45760405162461bcd60e51b8152600401610991906143cb565b804210611f1b5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e436f6e74726f6c6c65723a20446561646c696e652063616e6e6f7460448201526e081899481a5b881d1a19481c185cdd608a1b6064820152608401610991565b6040518060400160405280836001600160a01b03168152602001611f3e83613a8d565b6001600160601b039081169091526000948552600b602090815260409095208251929095015116600160a01b026001600160a01b03909116179092555050565b6001600160a01b038216600090815260016020908152604080832084845290915281206002015460ff166117a857506001600160a01b03919091166000908152600160209081526040808320938352929052205490565b6000818152600a60205260409020546001600160a01b0316331461200b5760405162461bcd60e51b8152600401610991906143cb565b6000908152600b6020526040812055565b6000602052816000526040600020818154811061203857600080fd5b90600052602060002001600091509150505481565b6000818152600a6020526040908190205490516398fd371f60e01b81526001600160a01b0391821660048201819052917f000000000000000000000000000000000000000000000000000000000000000016906398fd371f90602401602060405180830381865afa1580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190614302565b421161216a5760405162461bcd60e51b815260206004820152604360248201527f546f6b656e436f6e74726f6c6c65723a2043757272656e74206d616e6167657260448201527f206973206c6f636b656420666f7220766f74696e6720696e20676f7665726e616064820152626e636560e81b608482015260a401610991565b6000828152600b60205260409020546001600160a01b031633146121ec5760405162461bcd60e51b815260206004820152603360248201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f742074604482015272343290383937b837b9b2b21036b0b730b3b2b960691b6064820152608401610991565b6000828152600b602052604090205442600160a01b9091046001600160601b03161161226f5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204f776e657273686970206f6666657260448201526b081a185cc8195e1c1a5c995960a21b6064820152608401610991565b6122798233613af1565b506000908152600b6020526040812055565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa1580156122d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f891906140fd565b6123145760405162461bcd60e51b8152600401610991906142a3565b60405163079cc67960e41b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906379cc67909061236290869086906004016140bf565b6020604051808303816000875af1158015612381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a591906140fd565b9392505050565b604051633f9f3eff60e21b81526001600160a01b038281166004830152606091829160009182917f0000000000000000000000000000000000000000000000000000000000000000169063fe7cfbfc90602401600060405180830381865afa15801561241c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124449190810190614434565b90506000815167ffffffffffffffff8111156124625761246261441e565b60405190808252806020026020018201604052801561248b578160200160208202803683370190505b5090506000825167ffffffffffffffff8111156124aa576124aa61441e565b6040519080825280602002602001820160405280156124d3578160200160208202803683370190505b5090506000805b84518110156125af5760008582815181106124f7576124f761416d565b6020026020010151905060008a82604051602001612516929190614183565b604051602081830303815290604052805190602001209050600061253a8c83611f7e565b9050801561259957828786815181106125555761255561416d565b602002602001018181525050818686815181106125745761257461416d565b6020908102919091010152612589818a6141b0565b985084612595816143b2565b9550505b50505080806125a7906143b2565b9150506124da565b508067ffffffffffffffff8111156125c9576125c961441e565b6040519080825280602002602001820160405280156125f2578160200160208202803683370190505b5096508067ffffffffffffffff81111561260e5761260e61441e565b604051908082528060200260200182016040528015612637578160200160208202803683370190505b50955060005b818110156126c6578381815181106126575761265761416d565b60200260200101518882815181106126715761267161416d565b60200260200101818152505082818151811061268f5761268f61416d565b60200260200101518782815181106126a9576126a961416d565b6020908102919091010152806126be816143b2565b91505061263d565b50505050509193909250565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa15801561271a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273e91906140fd565b61275a5760405162461bcd60e51b8152600401610991906142a3565b6040516237ecc960e31b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906301bf664890602401610e3e565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa1580156127ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281391906140fd565b61282f5760405162461bcd60e51b8152600401610991906141f0565b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e436f6e74726f6c6c65723a20696e76616c696420706172616d20636044820152626f646560e81b6064820152608401610991565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156128cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ef91906140fd565b61290b5760405162461bcd60e51b8152600401610991906142a3565b6001600160a01b0382166000908152600c60205260408120549081900361293157505050565b8015611704576001600160a01b0383166000908152600c6020526040812061295a60018461415a565b8154811061296a5761296a61416d565b90600052602060002001549050600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208054806129ab576129ab6141c3565b6000828152602080822083016000199081018390559092019092556001600160a01b038516808352600c82526040808420805460018101825590855283852001859055848452600a909252912080546001600160a01b031916909117905581612a13816141d9565b92505050612931565b6001600160a01b038116600090815260208181526040918290208054835181840281018401909452808452606093928301828280156115da57602002820191906000526020600020908154815260200190600101908083116115c65750505050509050919050565b6040516306394c9b60e01b81523060048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906306394c9b906024016020604051808303816000875af1158015612aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0e91906140fd565b50612b1883612cc7565b60036020527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f380546001600160a01b039384166001600160a01b031991821617909155600a6000527f9dcb9783ba5cd0b54745f65f4f918525e461e91888c334e5342cb380ac558d53805492909316911617905550565b612b988161344b565b6001600160a01b0316336001600160a01b031614612bc85760405162461bcd60e51b815260040161099190614232565b6000818152600960209081526040918290208251808401909352546001600160801b038082168452600160801b9091041690820152612c0684613630565b81602001818151612c17919061431b565b6001600160801b0316905250612c2c83613630565b81518290612c3b90839061431b565b6001600160801b0390811690915260008481526009602090815260409091208451918501518316600160801b0291909216179055506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663a9059cbb86612caa86886141b0565b6040518363ffffffff1660e01b8152600401611b2b9291906140bf565b6002546001600160a01b031615612d1f576002546001600160a01b03163314612d1f5760405162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b6044820152606401610991565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db891906140fd565b15612dd55760405162461bcd60e51b81526004016109919061411a565b6000612ddf613a81565b6001600160a01b031663174e31c433846040518363ffffffff1660e01b8152600401612e0c9291906140bf565b6020604051808303816000875af1158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f9190614302565b905060008111612e715760405162461bcd60e51b81526004016109919061435f565b60405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb9061153190869085906004016140bf565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2b91906140fd565b612f475760405162461bcd60e51b8152600401610991906142a3565b610e818282613af1565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc891906140fd565b15612fe55760405162461bcd60e51b81526004016109919061411a565b6000612fef613a81565b6001600160a01b031663174e31c484846040518363ffffffff1660e01b8152600401612e0c9291906140bf565b6130258161344b565b6001600160a01b0316336001600160a01b0316146130555760405162461bcd60e51b815260040161099190614232565b61305e82613630565b6000828152600960205260409020805460109061164f908490600160801b90046001600160801b031661431b565b6040516311fb80e560e21b81526001600160a01b0382811660048301527f000000000000000000000000000000000000000000000000000000000000000016906347ee039490602401610e3e565b6000806130e5613a10565b6040516379ee54f760e01b81526001600160a01b03858116600483015291909116906379ee54f790602401606060405180830381865afa15801561312d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315191906144f2565b50509050600061315f613a81565b6040516326fceb5d60e11b81526001600160a01b0386811660048301529190911690634df9d6ba90602401602060405180830381865afa1580156131a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131cb9190614302565b90506131d781836141b0565b949350505050565b6131e98484611f7e565b156132555760405162461bcd60e51b815260206004820152603660248201527f546f6b656e436f6e74726f6c6c65723a20416e20616d6f756e74206f6620746f6044820152751ad95b9cc81a5cc8185b1c9958591e481b1bd8dad95960521b6064820152608401610991565b816000036132b75760405162461bcd60e51b815260206004820152602960248201527f546f6b656e436f6e74726f6c6c65723a20416d6f756e742073686f756c646e2760448201526874206265207a65726f60b81b6064820152608401610991565b6001600160a01b0384166000908152600160209081526040808320868452909152812054900361330b576001600160a01b038416600090815260208181526040822080546001810182559083529120018390555b60405163b0e65d0760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063b0e65d079061335990879086906004016140bf565b6020604051808303816000875af1158015613378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339c91906140fd565b5060006133a982426141b0565b60408051606081018252858152602080820184815260008385018181526001600160a01b038c1680835260018086528784208d855286529287902095518655925191850191909155516002909301805460ff1916931515939093179092558251878152908101849052929350869290917fea90ef40963535482537f0689e05cb8d259e459ebd21530e826702294d0eafdd910160405180910390a35050505050565b604080516001600160f81b03196020808301919091527f000000000000000000000000000000000000000000000000000000000000000060601b6bffffffffffffffffffffffff19166021830152603582018490527f1eb804b66941a2e8465fa0951be9c8b855b7794ee05b0789ab22a02ee1298ebe60558084019190915283518084039091018152607590920190925280519101206000906117a8565b6001600160a01b0382163014806135855750604051633e83f2a160e21b81526001600160a01b0383811660048301527f0000000000000000000000000000000000000000000000000000000000000000169063fa0fca8490602401602060405180830381865afa158015613561573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358591906140fd565b6135e25760405162461bcd60e51b815260206004820152602860248201527f546f6b656e436f6e74726f6c6c65723a2041646472657373206973206e6f7420604482015267309036b2b6b132b960c11b6064820152608401610991565b6040516340c10f1960e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906340c10f19906118cb90859085906004016140bf565b6000600160801b82106136955760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401610991565b5090565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182917f000000000000000000000000000000000000000000000000000000000000000016906370a0823190602401602060405180830381865afa158015613704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137289190614302565b905060005b6001600160a01b0385166000908152602081905260409020548110156137ab576001600160a01b0385166000908152602081905260409020805461378d9187918490811061377d5761377d61416d565b9060005260206000200154611f7e565b61379790836141b0565b9150806137a3816143b2565b91505061372d565b506137b4613c9c565b604051630ea474c760e01b81526001600160a01b0386811660048301529190911690630ea474c790602401602060405180830381865afa1580156137fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138209190614302565b61382a90826141b0565b9050613834613c9c565b6040516339ac5eb960e01b81526001600160a01b03868116600483015291909116906339ac5eb990602401602060405180830381865afa15801561387c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a09190614302565b6138aa90826141b0565b905060006138b6613a10565b604051630213119b60e51b81526001600160a01b0387811660048301529190911690634262336090602401606060405180830381865afa1580156138fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139229190614520565b50506001600160601b0316905061393981836141b0565b915083156139e1576001600160a01b0385166000908152600c6020526040812054905b818110156139de576001600160a01b0387166000908152600c6020526040812080548390811061398e5761398e61416d565b600091825260208083209091015480835260099091526040909120549091506139c8906001600160801b03600160801b90910416866141b0565b94505080806139d6906143b2565b91505061395c565b50505b509392505050565b600060038160015b81526020810191909152604001600020546001600160a01b0316919050565b6000600381600a6139f1565b6000600160681b82106136955760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663034206269747360c81b6064820152608401610991565b600060038160076139f1565b6000600160601b82106136955760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401610991565b6000828152600a60205260409020546001600160a01b03168015613c51576001600160a01b0381166000908152600c6020526040812054905b81811015613c4e576001600160a01b0383166000908152600c60205260409020805486919083908110613b5f57613b5f61416d565b906000526020600020015403613c3c576000613b7c60018461415a565b6001600160a01b0385166000908152600c6020526040902080549192509082908110613baa57613baa61416d565b9060005260206000200154600c6000866001600160a01b03166001600160a01b031681526020019081526020016000208381548110613beb57613beb61416d565b60009182526020808320909101929092556001600160a01b0386168152600c90915260409020805480613c2057613c206141c3565b6001900381819060005260206000200160009055905550613c4e565b80613c46816143b2565b915050613b2a565b50505b506001600160a01b03166000818152600c60209081526040808320805460018101825590845282842001859055938252600a90529190912080546001600160a01b0319169091179055565b600060038160066139f1565b6001600160a01b0381168114613cbd57600080fd5b50565b60008083601f840112613cd257600080fd5b50813567ffffffffffffffff811115613cea57600080fd5b6020830191508360208260051b8501011115613d0557600080fd5b9250929050565b600080600080600060608688031215613d2457600080fd5b8535613d2f81613ca8565b9450602086013567ffffffffffffffff80821115613d4c57600080fd5b613d5889838a01613cc0565b90965094506040880135915080821115613d7157600080fd5b50613d7e88828901613cc0565b969995985093965092949392505050565b600060208284031215613da157600080fd5b81356123a581613ca8565b60008060008060808587031215613dc257600080fd5b8435613dcd81613ca8565b966020860135965060408601359560600135945092505050565b60008060408385031215613dfa57600080fd5b50508035926020909101359150565b600080600060608486031215613e1e57600080fd5b8335613e2981613ca8565b92506020840135613e3981613ca8565b929592945050506040919091013590565b600060208284031215613e5c57600080fd5b5035919050565b600080600060608486031215613e7857600080fd5b8335613e8381613ca8565b95602085013595506040909401359392505050565b600081518084526020808501945080840160005b83811015613ec857815187529582019590820190600101613eac565b509495945050505050565b6020815260006123a56020830184613e98565b60008060408385031215613ef957600080fd5b8235613f0481613ca8565b946020939093013593505050565b8015158114613cbd57600080fd5b60008060008060808587031215613f3657600080fd5b8435613f4181613ca8565b93506020850135613f5181613f12565b92506040850135613f6181613f12565b9396929550929360600135925050565b60008060208385031215613f8457600080fd5b823567ffffffffffffffff811115613f9b57600080fd5b613fa785828601613cc0565b90969095509350505050565b600080600060608486031215613fc857600080fd5b833592506020840135613e3981613ca8565b606081526000613fed6060830186613e98565b8281036020840152613fff8186613e98565b915050826040830152949350505050565b6000806040838503121561402357600080fd5b82356001600160c01b031981168114613f0457600080fd5b6000806040838503121561404e57600080fd5b823561405981613ca8565b9150602083013561406981613ca8565b809150509250929050565b60008060006060848603121561408957600080fd5b833561409481613ca8565b925060208401356140a481613ca8565b915060408401356140b481613ca8565b809150509250925092565b6001600160a01b03929092168252602082015260400190565b600080604083850312156140eb57600080fd5b82359150602083013561406981613ca8565b60006020828403121561410f57600080fd5b81516123a581613f12565b60208082526010908201526f14de5cdd195b481a5cc81c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156117a8576117a8614144565b634e487b7160e01b600052603260045260246000fd5b6121a760f11b815260609290921b6bffffffffffffffffffffffff19166002830152601682015260360190565b808201808211156117a8576117a8614144565b634e487b7160e01b600052603160045260246000fd5b6000816141e8576141e8614144565b506000190190565b60208082526022908201527f43616c6c6572206973206e6f7420617574686f72697a656420746f20676f7665604082015261393760f11b606082015260800190565b6020808252602a908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206e6f742061207374604082015269185ada5b99c81c1bdbdb60b21b606082015260800190565b6001600160801b0381811683821601908082111561429c5761429c614144565b5092915050565b60208082526022908201527f43616c6c6572206973206e6f7420616e20696e7465726e616c20636f6e74726160408201526118dd60f21b606082015260800190565b6000602082840312156142f757600080fd5b81516123a581613ca8565b60006020828403121561431457600080fd5b5051919050565b6001600160801b0382811682821603908082111561429c5761429c614144565b6000806040838503121561434e57600080fd5b505080516020909101519092909150565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a204e6f20776974686472617761626c6560408201527220676f7665726e616e6365207265776172647360681b606082015260800190565b6000600182016143c4576143c4614144565b5060010190565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f7420736040820152723a30b5b4b733903837b7b61036b0b730b3b2b960691b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561444757600080fd5b825167ffffffffffffffff8082111561445f57600080fd5b818501915085601f83011261447357600080fd5b8151818111156144855761448561441e565b8060051b604051601f19603f830116810181811085821117156144aa576144aa61441e565b6040529182528482019250838101850191888311156144c857600080fd5b938501935b828510156144e6578451845293850193928501926144cd565b98975050505050505050565b60008060006060848603121561450757600080fd5b8351925060208401519150604084015190509250925092565b60008060006060848603121561453557600080fd5b83516001600160601b038116811461454c57600080fd5b60208501519093506cffffffffffffffffffffffffff8116811461456f57600080fd5b604085015190925061ffff811681146140b457600080fdfea264697066735822122083923f05434cb76fed6b8e10a4325fa5dcd495a4be60cadfd3d8a7502882ea2d64736f6c63430008120033000000000000000000000000b15646f79eb13df44eb48e9046dac1a3b0448117000000000000000000000000d672794da0148a614efa2a702bc337432cbbda1700000000000000000000000028556b2c28cb6991a306093e67d1959905a8d28d000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106103275760003560e01c80638448fa2f116101b8578063cc35b1b111610104578063e41060cd116100a2578063ee97f7f31161007c578063ee97f7f314610889578063f6ed20171461089c578063fc0c546a146108af578063ffd7d66d146108d657600080fd5b8063e41060cd1461083a578063e43252d71461084d578063eb9623601461086057600080fd5b8063dd3031c0116100de578063dd3031c0146107d8578063e01cdf0c146107eb578063e0a0964614610814578063e13249421461082757600080fd5b8063cc35b1b11461075c578063d46655f41461076f578063d71be8db1461078257600080fd5b8063aec1f86611610171578063c0c53b8b1161014b578063c0c53b8b146106cb578063c4927d7e146106de578063c4b083fa14610709578063c58fada91461071257600080fd5b8063aec1f8661461067e578063b31100af14610691578063ba428e68146106a457600080fd5b80638448fa2f146105f35780638ab1d6811461061557806398aebc7d146106285780639dd86e0f1461063b5780639e23a4661461064e578063a1b8adcb1461065757600080fd5b80634b0ee02a116102775780635c39eaef116102305780636eb6dd711161020a5780636eb6dd711461058f57806371d66f00146105ba57806376829839146105cd57806379cc6790146105e057600080fd5b80635c39eaef146105565780635ca48d8c146105695780636b80bdd21461057c57600080fd5b80634b0ee02a146104ef5780634b94f50e146105025780634c47e71d1461050a5780634f8a048f1461051d57806351626ddd1461053057806352e2fed21461054357600080fd5b80630ea9c984116102e457806322133fdd116102be57806322133fdd14610427578063259767d3146104a9578063392d5d2e146104c957806340c10f19146104dc57600080fd5b80630ea9c984146103f657806318160ddd146103fe578063186c0c221461041457600080fd5b8063026c0b5f1461032c57806306394c9b14610341578063087fad411461035457806308cd3d6f1461037c5780630d1af1031461038f5780630d90cc2f146103a2575b600080fd5b61033f61033a366004613d0c565b6108fd565b005b61033f61034f366004613d8f565b610d6c565b610367610362366004613dac565b610e85565b60405190151581526020015b60405180910390f35b61033f61038a366004613de7565b610e9e565b61036761039d366004613e09565b610f39565b6103d66103b0366004613e4a565b6009602052600090815260409020546001600160801b0380821691600160801b90041682565b604080516001600160801b03938416815292909116602083015201610373565b61033f611101565b6104066113c6565b604051908152602001610373565b61033f610422366004613e63565b61144f565b610475610435366004613e4a565b60086020526000908152604090205461ffff81169060ff62010000820481169163010000008104909116906001600160601b036401000000009091041684565b6040805161ffff90951685529215156020850152901515918301919091526001600160601b03166060820152608001610373565b6104bc6104b7366004613d8f565b61157a565b6040516103739190613ed3565b61033f6104d7366004613de7565b6115e6565b61033f6104ea366004613ee6565b611709565b6104066104fd366004613d8f565b61179b565b6104066117ae565b61033f610518366004613ee6565b6117f5565b61033f61052b366004613f20565b611901565b61040661053e366004613d8f565b611b6e565b61033f610551366004613f71565b611b7b565b61033f610564366004613fb3565b611e7e565b610406610577366004613ee6565b611f7e565b61033f61058a366004613e4a565b611fd5565b6004546105a2906001600160a01b031681565b6040516001600160a01b039091168152602001610373565b6104066105c8366004613ee6565b61201c565b61033f6105db366004613e4a565b61204d565b6103676105ee366004613ee6565b61228b565b610606610601366004613d8f565b6123ac565b60405161037393929190613fda565b61033f610623366004613d8f565b6126d2565b6005546105a2906001600160a01b031681565b61033f610649366004614010565b6127a7565b61040660065481565b6105a27f00000000000000000000000028556b2c28cb6991a306093e67d1959905a8d28d81565b61033f61068c36600461403b565b612883565b6104bc61069f366004613d8f565b612a1c565b6105a27f000000000000000000000000d672794da0148a614efa2a702bc337432cbbda1781565b61033f6106d9366004614074565b612a84565b6103676106ec366004613d8f565b6001600160a01b03166000908152600c6020526040902054151590565b61040660075481565b61074e610720366004613e4a565b6000908152600b60205260409020546001600160a01b03811691600160a01b9091046001600160601b031690565b6040516103739291906140bf565b61033f61076a366004613dac565b612b8f565b61033f61077d366004613d8f565b612cc7565b6107bb610790366004613ee6565b6001602081815260009384526040808520909152918352912080549181015460029091015460ff1683565b604080519384526020840192909252151590820152606001610373565b61033f6107e6366004613ee6565b612d41565b6105a26107f9366004613e4a565b6000908152600a60205260409020546001600160a01b031690565b61033f6108223660046140d8565b612ebf565b61033f610835366004613ee6565b612f51565b61033f610848366004613de7565b61301c565b61033f61085b366004613d8f565b61308c565b6105a261086e366004613e4a565b6003602052600090815260409020546001600160a01b031681565b6002546105a2906001600160a01b031681565b6104066108aa366004613d8f565b6130da565b6105a27f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a281565b6105a27f000000000000000000000000b15646f79eb13df44eb48e9046dac1a3b044811781565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015610950573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061097491906140fd565b1561099a5760405162461bcd60e51b81526004016109919061411a565b60405180910390fd5b6001600160a01b03851660009081526020819052604090205480610a155760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204e6f206c6f636b656420636f76657260448201526b081b9bdd195cc8199bdd5b9960a21b6064820152608401610991565b6000610a2260018361415a565b90506000855b8015610ccf576000898989610a3e60018661415a565b818110610a4d57610a4d61416d565b90506020020135604051602001610a65929190614183565b60405160208183030381529060405280519060200120905060008787600185610a8e919061415a565b818110610a9d57610a9d61416d565b905060200201359050816000808d6001600160a01b03166001600160a01b031681526020019081526020016000208281548110610adc57610adc61416d565b906000526020600020015414610b3e5760405162461bcd60e51b815260206004820152602160248201527f546f6b656e436f6e74726f6c6c65723a2042616420726561736f6e20696e64656044820152600f60fb1b6064820152608401610991565b6001600160a01b038b166000908152600160209081526040808320858452909152902054610b6c81866141b0565b6001600160a01b038d166000908152600160208181526040808420888552909152822082815590810191909155600201805460ff191690559450858214610c24576001600160a01b038c166000908152602081905260409020805487908110610bd757610bd761416d565b90600052602060002001546000808e6001600160a01b03166001600160a01b031681526020019081526020016000208381548110610c1757610c1761416d565b6000918252602090912001555b6001600160a01b038c166000908152602081905260409020805480610c4b57610c4b6141c3565b60019003818190600052602060002001600090559055828c6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051610c9d91815260200190565b60405180910390a38515610cb957610cb660018761415a565b95505b5050508080610cc7906141d9565b915050610a28565b5060405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2169063a9059cbb90610d1e908b9085906004016140bf565b6020604051808303816000875af1158015610d3d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d6191906140fd565b505050505050505050565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa158015610db4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dd891906140fd565b610df45760405162461bcd60e51b8152600401610991906141f0565b6040516306394c9b60e01b81526001600160a01b0382811660048301527f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a216906306394c9b906024015b6020604051808303816000875af1158015610e5d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e8191906140fd565b5050565b6000610e93858585856131df565b506001949350505050565b610ea78161344b565b6001600160a01b0316336001600160a01b031614610ed75760405162461bcd60e51b815260040161099190614232565b610ee130836134e9565b610eea82613630565b60008281526009602052604081208054909190610f119084906001600160801b031661427c565b92506101000a8154816001600160801b0302191690836001600160801b031602179055505050565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa158015610f82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fa691906140fd565b610fc25760405162461bcd60e51b8152600401610991906142a3565b60405163b0e65d0760e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2169063b0e65d079061101090879086906004016140bf565b6020604051808303816000875af115801561102f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061105391906140fd565b506001600160a01b03831630146110f75760405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2169063a9059cbb906110b290869086906004016140bf565b6020604051808303816000875af11580156110d1573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f591906140fd565b505b5060019392505050565b6002546040516227050b60e31b815261505360f01b60048201526001600160a01b0390911690630138285890602401602060405180830381865afa15801561114d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061117191906142e5565b600660005260036020527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261415360f01b6004820152911690630138285890602401602060405180830381865afa1580156111fb573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061121f91906142e5565b600a60005260036020527f9dcb9783ba5cd0b54745f65f4f918525e461e91888c334e5342cb380ac558d5380546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b81526123ab60f11b6004820152911690630138285890602401602060405180830381865afa1580156112a9573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112cd91906142e5565b600760005260036020527ff2c49132ed1cee2a7e75bde50d332a2f81f1d01e5456d8a19d1df09bd561dbd280546001600160a01b039283166001600160a01b03199091161790556002546040516227050b60e31b815261503160f01b6004820152911690630138285890602401602060405180830381865afa158015611357573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061137b91906142e5565b600160005260036020527fa15bc60c955c405d20d9149c709e2460f1c2d9a497496a7f46004d1772c3054c80546001600160a01b0319166001600160a01b0392909216919091179055565b60007f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a26001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611426573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061144a9190614302565b905090565b6114588161344b565b6001600160a01b0316336001600160a01b0316146114885760405162461bcd60e51b815260040161099190614232565b61149182613630565b600082815260096020526040902080546010906114bf908490600160801b90046001600160801b031661427c565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a26001600160a01b031663b0e65d0784846040518363ffffffff1660e01b81526004016115319291906140bf565b6020604051808303816000875af1158015611550573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061157491906140fd565b50505050565b6001600160a01b0381166000908152600c60209081526040918290208054835181840281018401909452808452606093928301828280156115da57602002820191906000526020600020905b8154815260200190600101908083116115c6575b50505050509050919050565b6115ef8161344b565b6001600160a01b0316336001600160a01b03161461161f5760405162461bcd60e51b815260040161099190614232565b61162882613630565b6000828152600960205260408120805490919061164f9084906001600160801b031661431b565b92506101000a8154816001600160801b0302191690836001600160801b031602179055507f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a26001600160a01b03166342966c68836040518263ffffffff1660e01b81526004016116c191815260200190565b6020604051808303816000875af11580156116e0573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061170491906140fd565b505050565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015611751573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061177591906140fd565b6117915760405162461bcd60e51b8152600401610991906142a3565b610e8182826134e9565b60006117a8826001613699565b92915050565b60006117b86139e9565b6001600160a01b0316634b94f50e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611426573d6000803e3d6000fd5b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa15801561183d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061186191906140fd565b61187d5760405162461bcd60e51b8152600401610991906142a3565b604051634c47e71d60e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a21690634c47e71d906118cb90859085906004016140bf565b600060405180830381600087803b1580156118e557600080fd5b505af11580156118f9573d6000803e3d6000fd5b505050505050565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611954573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061197891906140fd565b156119955760405162461bcd60e51b81526004016109919061411a565b8115611a3b576119a3613a10565b6001600160a01b031663fa15af7e856119bb84613a1c565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526cffffffffffffffffffffffffff16602482015260440160408051808303816000875af1158015611a14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a38919061433b565b50505b8215611574576000611a4b613a81565b6001600160a01b031663174e31c486846040518363ffffffff1660e01b8152600401611a789291906140bf565b6020604051808303816000875af1158015611a97573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611abb9190614302565b905060008111611add5760405162461bcd60e51b81526004016109919061435f565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2169063a9059cbb90611b2b90889085906004016140bf565b6020604051808303816000875af1158015611b4a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118f991906140fd565b60006117a8826000613699565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015611bce573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bf291906140fd565b15611c0f5760405162461bcd60e51b81526004016109919061411a565b60005b818110156117045760016000848484818110611c3057611c3061416d565b9050602002016020810190611c459190613d8f565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290206002015460ff16611e6c57600060016000858585818110611c9457611c9461416d565b9050602002016020810190611ca99190613d8f565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b825290925290205490508015611e6a576001806000868686818110611cf557611cf561416d565b9050602002016020810190611d0a9190613d8f565b6001600160a01b031681526020808201929092526040908101600090812062434c4160e81b808352935220600201805460ff191692151592909217909155848484818110611d5a57611d5a61416d565b9050602002016020810190611d6f9190613d8f565b6001600160a01b03167f11f87fd5adcd05786919b8b868f59a70d78ae4eb6f305c5927f9c5b1659841a483604051611da991815260200190565b60405180910390a37f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a26001600160a01b031663a9059cbb858585818110611df257611df261416d565b9050602002016020810190611e079190613d8f565b836040518363ffffffff1660e01b8152600401611e259291906140bf565b6020604051808303816000875af1158015611e44573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e6891906140fd565b505b505b80611e76816143b2565b915050611c12565b6000838152600a60205260409020546001600160a01b03163314611eb45760405162461bcd60e51b8152600401610991906143cb565b804210611f1b5760405162461bcd60e51b815260206004820152602f60248201527f546f6b656e436f6e74726f6c6c65723a20446561646c696e652063616e6e6f7460448201526e081899481a5b881d1a19481c185cdd608a1b6064820152608401610991565b6040518060400160405280836001600160a01b03168152602001611f3e83613a8d565b6001600160601b039081169091526000948552600b602090815260409095208251929095015116600160a01b026001600160a01b03909116179092555050565b6001600160a01b038216600090815260016020908152604080832084845290915281206002015460ff166117a857506001600160a01b03919091166000908152600160209081526040808320938352929052205490565b6000818152600a60205260409020546001600160a01b0316331461200b5760405162461bcd60e51b8152600401610991906143cb565b6000908152600b6020526040812055565b6000602052816000526040600020818154811061203857600080fd5b90600052602060002001600091509150505481565b6000818152600a6020526040908190205490516398fd371f60e01b81526001600160a01b0391821660048201819052917f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a216906398fd371f90602401602060405180830381865afa1580156120c6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ea9190614302565b421161216a5760405162461bcd60e51b815260206004820152604360248201527f546f6b656e436f6e74726f6c6c65723a2043757272656e74206d616e6167657260448201527f206973206c6f636b656420666f7220766f74696e6720696e20676f7665726e616064820152626e636560e81b608482015260a401610991565b6000828152600b60205260409020546001600160a01b031633146121ec5760405162461bcd60e51b815260206004820152603360248201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f742074604482015272343290383937b837b9b2b21036b0b730b3b2b960691b6064820152608401610991565b6000828152600b602052604090205442600160a01b9091046001600160601b03161161226f5760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e436f6e74726f6c6c65723a204f776e657273686970206f6666657260448201526b081a185cc8195e1c1a5c995960a21b6064820152608401610991565b6122798233613af1565b506000908152600b6020526040812055565b6002546040516323c5b10760e21b81523360048201526000916001600160a01b031690638f16c41c90602401602060405180830381865afa1580156122d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122f891906140fd565b6123145760405162461bcd60e51b8152600401610991906142a3565b60405163079cc67960e41b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a216906379cc67909061236290869086906004016140bf565b6020604051808303816000875af1158015612381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a591906140fd565b9392505050565b604051633f9f3eff60e21b81526001600160a01b038281166004830152606091829160009182917f000000000000000000000000b15646f79eb13df44eb48e9046dac1a3b0448117169063fe7cfbfc90602401600060405180830381865afa15801561241c573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526124449190810190614434565b90506000815167ffffffffffffffff8111156124625761246261441e565b60405190808252806020026020018201604052801561248b578160200160208202803683370190505b5090506000825167ffffffffffffffff8111156124aa576124aa61441e565b6040519080825280602002602001820160405280156124d3578160200160208202803683370190505b5090506000805b84518110156125af5760008582815181106124f7576124f761416d565b6020026020010151905060008a82604051602001612516929190614183565b604051602081830303815290604052805190602001209050600061253a8c83611f7e565b9050801561259957828786815181106125555761255561416d565b602002602001018181525050818686815181106125745761257461416d565b6020908102919091010152612589818a6141b0565b985084612595816143b2565b9550505b50505080806125a7906143b2565b9150506124da565b508067ffffffffffffffff8111156125c9576125c961441e565b6040519080825280602002602001820160405280156125f2578160200160208202803683370190505b5096508067ffffffffffffffff81111561260e5761260e61441e565b604051908082528060200260200182016040528015612637578160200160208202803683370190505b50955060005b818110156126c6578381815181106126575761265761416d565b60200260200101518882815181106126715761267161416d565b60200260200101818152505082818151811061268f5761268f61416d565b60200260200101518782815181106126a9576126a961416d565b6020908102919091010152806126be816143b2565b91505061263d565b50505050509193909250565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa15801561271a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061273e91906140fd565b61275a5760405162461bcd60e51b8152600401610991906142a3565b6040516237ecc960e31b81526001600160a01b0382811660048301527f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a216906301bf664890602401610e3e565b600254604051632c1a733d60e11b81523360048201526001600160a01b0390911690635834e67a90602401602060405180830381865afa1580156127ef573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061281391906140fd565b61282f5760405162461bcd60e51b8152600401610991906141f0565b60405162461bcd60e51b815260206004820152602360248201527f546f6b656e436f6e74726f6c6c65723a20696e76616c696420706172616d20636044820152626f646560e81b6064820152608401610991565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa1580156128cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906128ef91906140fd565b61290b5760405162461bcd60e51b8152600401610991906142a3565b6001600160a01b0382166000908152600c60205260408120549081900361293157505050565b8015611704576001600160a01b0383166000908152600c6020526040812061295a60018461415a565b8154811061296a5761296a61416d565b90600052602060002001549050600c6000856001600160a01b03166001600160a01b031681526020019081526020016000208054806129ab576129ab6141c3565b6000828152602080822083016000199081018390559092019092556001600160a01b038516808352600c82526040808420805460018101825590855283852001859055848452600a909252912080546001600160a01b031916909117905581612a13816141d9565b92505050612931565b6001600160a01b038116600090815260208181526040918290208054835181840281018401909452808452606093928301828280156115da57602002820191906000526020600020908154815260200190600101908083116115c65750505050509050919050565b6040516306394c9b60e01b81523060048201527f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a26001600160a01b0316906306394c9b906024016020604051808303816000875af1158015612aea573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612b0e91906140fd565b50612b1883612cc7565b60036020527fc69056f16cbaa3c616b828e333ab7d3a32310765507f8f58359e99ebb7a885f380546001600160a01b039384166001600160a01b031991821617909155600a6000527f9dcb9783ba5cd0b54745f65f4f918525e461e91888c334e5342cb380ac558d53805492909316911617905550565b612b988161344b565b6001600160a01b0316336001600160a01b031614612bc85760405162461bcd60e51b815260040161099190614232565b6000818152600960209081526040918290208251808401909352546001600160801b038082168452600160801b9091041690820152612c0684613630565b81602001818151612c17919061431b565b6001600160801b0316905250612c2c83613630565b81518290612c3b90839061431b565b6001600160801b0390811690915260008481526009602090815260409091208451918501518316600160801b0291909216179055506001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a21663a9059cbb86612caa86886141b0565b6040518363ffffffff1660e01b8152600401611b2b9291906140bf565b6002546001600160a01b031615612d1f576002546001600160a01b03163314612d1f5760405162461bcd60e51b815260206004820152600a6024820152692737ba1036b0b9ba32b960b11b6044820152606401610991565b600280546001600160a01b0319166001600160a01b0392909216919091179055565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612d94573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612db891906140fd565b15612dd55760405162461bcd60e51b81526004016109919061411a565b6000612ddf613a81565b6001600160a01b031663174e31c433846040518363ffffffff1660e01b8152600401612e0c9291906140bf565b6020604051808303816000875af1158015612e2b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e4f9190614302565b905060008111612e715760405162461bcd60e51b81526004016109919061435f565b60405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2169063a9059cbb9061153190869085906004016140bf565b6002546040516323c5b10760e21b81523360048201526001600160a01b0390911690638f16c41c90602401602060405180830381865afa158015612f07573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612f2b91906140fd565b612f475760405162461bcd60e51b8152600401610991906142a3565b610e818282613af1565b600260009054906101000a90046001600160a01b03166001600160a01b031663ff0938a76040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fa4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612fc891906140fd565b15612fe55760405162461bcd60e51b81526004016109919061411a565b6000612fef613a81565b6001600160a01b031663174e31c484846040518363ffffffff1660e01b8152600401612e0c9291906140bf565b6130258161344b565b6001600160a01b0316336001600160a01b0316146130555760405162461bcd60e51b815260040161099190614232565b61305e82613630565b6000828152600960205260409020805460109061164f908490600160801b90046001600160801b031661431b565b6040516311fb80e560e21b81526001600160a01b0382811660048301527f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a216906347ee039490602401610e3e565b6000806130e5613a10565b6040516379ee54f760e01b81526001600160a01b03858116600483015291909116906379ee54f790602401606060405180830381865afa15801561312d573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061315191906144f2565b50509050600061315f613a81565b6040516326fceb5d60e11b81526001600160a01b0386811660048301529190911690634df9d6ba90602401602060405180830381865afa1580156131a7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131cb9190614302565b90506131d781836141b0565b949350505050565b6131e98484611f7e565b156132555760405162461bcd60e51b815260206004820152603660248201527f546f6b656e436f6e74726f6c6c65723a20416e20616d6f756e74206f6620746f6044820152751ad95b9cc81a5cc8185b1c9958591e481b1bd8dad95960521b6064820152608401610991565b816000036132b75760405162461bcd60e51b815260206004820152602960248201527f546f6b656e436f6e74726f6c6c65723a20416d6f756e742073686f756c646e2760448201526874206265207a65726f60b81b6064820152608401610991565b6001600160a01b0384166000908152600160209081526040808320868452909152812054900361330b576001600160a01b038416600090815260208181526040822080546001810182559083529120018390555b60405163b0e65d0760e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2169063b0e65d079061335990879086906004016140bf565b6020604051808303816000875af1158015613378573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061339c91906140fd565b5060006133a982426141b0565b60408051606081018252858152602080820184815260008385018181526001600160a01b038c1680835260018086528784208d855286529287902095518655925191850191909155516002909301805460ff1916931515939093179092558251878152908101849052929350869290917fea90ef40963535482537f0689e05cb8d259e459ebd21530e826702294d0eafdd910160405180910390a35050505050565b604080516001600160f81b03196020808301919091527f00000000000000000000000028556b2c28cb6991a306093e67d1959905a8d28d60601b6bffffffffffffffffffffffff19166021830152603582018490527f1eb804b66941a2e8465fa0951be9c8b855b7794ee05b0789ab22a02ee1298ebe60558084019190915283518084039091018152607590920190925280519101206000906117a8565b6001600160a01b0382163014806135855750604051633e83f2a160e21b81526001600160a01b0383811660048301527f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2169063fa0fca8490602401602060405180830381865afa158015613561573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061358591906140fd565b6135e25760405162461bcd60e51b815260206004820152602860248201527f546f6b656e436f6e74726f6c6c65723a2041646472657373206973206e6f7420604482015267309036b2b6b132b960c11b6064820152608401610991565b6040516340c10f1960e01b81526001600160a01b037f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a216906340c10f19906118cb90859085906004016140bf565b6000600160801b82106136955760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663238206269747360c81b6064820152608401610991565b5090565b6040516370a0823160e01b81526001600160a01b03838116600483015260009182917f000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a216906370a0823190602401602060405180830381865afa158015613704573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906137289190614302565b905060005b6001600160a01b0385166000908152602081905260409020548110156137ab576001600160a01b0385166000908152602081905260409020805461378d9187918490811061377d5761377d61416d565b9060005260206000200154611f7e565b61379790836141b0565b9150806137a3816143b2565b91505061372d565b506137b4613c9c565b604051630ea474c760e01b81526001600160a01b0386811660048301529190911690630ea474c790602401602060405180830381865afa1580156137fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138209190614302565b61382a90826141b0565b9050613834613c9c565b6040516339ac5eb960e01b81526001600160a01b03868116600483015291909116906339ac5eb990602401602060405180830381865afa15801561387c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138a09190614302565b6138aa90826141b0565b905060006138b6613a10565b604051630213119b60e51b81526001600160a01b0387811660048301529190911690634262336090602401606060405180830381865afa1580156138fe573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139229190614520565b50506001600160601b0316905061393981836141b0565b915083156139e1576001600160a01b0385166000908152600c6020526040812054905b818110156139de576001600160a01b0387166000908152600c6020526040812080548390811061398e5761398e61416d565b600091825260208083209091015480835260099091526040909120549091506139c8906001600160801b03600160801b90910416866141b0565b94505080806139d6906143b2565b91505061395c565b50505b509392505050565b600060038160015b81526020810191909152604001600020546001600160a01b0316919050565b6000600381600a6139f1565b6000600160681b82106136955760405162461bcd60e51b815260206004820152602760248201527f53616665436173743a2076616c756520646f65736e27742066697420696e20316044820152663034206269747360c81b6064820152608401610991565b600060038160076139f1565b6000600160601b82106136955760405162461bcd60e51b815260206004820152602660248201527f53616665436173743a2076616c756520646f65736e27742066697420696e203960448201526536206269747360d01b6064820152608401610991565b6000828152600a60205260409020546001600160a01b03168015613c51576001600160a01b0381166000908152600c6020526040812054905b81811015613c4e576001600160a01b0383166000908152600c60205260409020805486919083908110613b5f57613b5f61416d565b906000526020600020015403613c3c576000613b7c60018461415a565b6001600160a01b0385166000908152600c6020526040902080549192509082908110613baa57613baa61416d565b9060005260206000200154600c6000866001600160a01b03166001600160a01b031681526020019081526020016000208381548110613beb57613beb61416d565b60009182526020808320909101929092556001600160a01b0386168152600c90915260409020805480613c2057613c206141c3565b6001900381819060005260206000200160009055905550613c4e565b80613c46816143b2565b915050613b2a565b50505b506001600160a01b03166000818152600c60209081526040808320805460018101825590845282842001859055938252600a90529190912080546001600160a01b0319169091179055565b600060038160066139f1565b6001600160a01b0381168114613cbd57600080fd5b50565b60008083601f840112613cd257600080fd5b50813567ffffffffffffffff811115613cea57600080fd5b6020830191508360208260051b8501011115613d0557600080fd5b9250929050565b600080600080600060608688031215613d2457600080fd5b8535613d2f81613ca8565b9450602086013567ffffffffffffffff80821115613d4c57600080fd5b613d5889838a01613cc0565b90965094506040880135915080821115613d7157600080fd5b50613d7e88828901613cc0565b969995985093965092949392505050565b600060208284031215613da157600080fd5b81356123a581613ca8565b60008060008060808587031215613dc257600080fd5b8435613dcd81613ca8565b966020860135965060408601359560600135945092505050565b60008060408385031215613dfa57600080fd5b50508035926020909101359150565b600080600060608486031215613e1e57600080fd5b8335613e2981613ca8565b92506020840135613e3981613ca8565b929592945050506040919091013590565b600060208284031215613e5c57600080fd5b5035919050565b600080600060608486031215613e7857600080fd5b8335613e8381613ca8565b95602085013595506040909401359392505050565b600081518084526020808501945080840160005b83811015613ec857815187529582019590820190600101613eac565b509495945050505050565b6020815260006123a56020830184613e98565b60008060408385031215613ef957600080fd5b8235613f0481613ca8565b946020939093013593505050565b8015158114613cbd57600080fd5b60008060008060808587031215613f3657600080fd5b8435613f4181613ca8565b93506020850135613f5181613f12565b92506040850135613f6181613f12565b9396929550929360600135925050565b60008060208385031215613f8457600080fd5b823567ffffffffffffffff811115613f9b57600080fd5b613fa785828601613cc0565b90969095509350505050565b600080600060608486031215613fc857600080fd5b833592506020840135613e3981613ca8565b606081526000613fed6060830186613e98565b8281036020840152613fff8186613e98565b915050826040830152949350505050565b6000806040838503121561402357600080fd5b82356001600160c01b031981168114613f0457600080fd5b6000806040838503121561404e57600080fd5b823561405981613ca8565b9150602083013561406981613ca8565b809150509250929050565b60008060006060848603121561408957600080fd5b833561409481613ca8565b925060208401356140a481613ca8565b915060408401356140b481613ca8565b809150509250925092565b6001600160a01b03929092168252602082015260400190565b600080604083850312156140eb57600080fd5b82359150602083013561406981613ca8565b60006020828403121561410f57600080fd5b81516123a581613f12565b60208082526010908201526f14de5cdd195b481a5cc81c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156117a8576117a8614144565b634e487b7160e01b600052603260045260246000fd5b6121a760f11b815260609290921b6bffffffffffffffffffffffff19166002830152601682015260360190565b808201808211156117a8576117a8614144565b634e487b7160e01b600052603160045260246000fd5b6000816141e8576141e8614144565b506000190190565b60208082526022908201527f43616c6c6572206973206e6f7420617574686f72697a656420746f20676f7665604082015261393760f11b606082015260800190565b6020808252602a908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206e6f742061207374604082015269185ada5b99c81c1bdbdb60b21b606082015260800190565b6001600160801b0381811683821601908082111561429c5761429c614144565b5092915050565b60208082526022908201527f43616c6c6572206973206e6f7420616e20696e7465726e616c20636f6e74726160408201526118dd60f21b606082015260800190565b6000602082840312156142f757600080fd5b81516123a581613ca8565b60006020828403121561431457600080fd5b5051919050565b6001600160801b0382811682821603908082111561429c5761429c614144565b6000806040838503121561434e57600080fd5b505080516020909101519092909150565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a204e6f20776974686472617761626c6560408201527220676f7665726e616e6365207265776172647360681b606082015260800190565b6000600182016143c4576143c4614144565b5060010190565b60208082526033908201527f546f6b656e436f6e74726f6c6c65723a2043616c6c6572206973206e6f7420736040820152723a30b5b4b733903837b7b61036b0b730b3b2b960691b606082015260800190565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561444757600080fd5b825167ffffffffffffffff8082111561445f57600080fd5b818501915085601f83011261447357600080fd5b8151818111156144855761448561441e565b8060051b604051601f19603f830116810181811085821117156144aa576144aa61441e565b6040529182528482019250838101850191888311156144c857600080fd5b938501935b828510156144e6578451845293850193928501926144cd565b98975050505050505050565b60008060006060848603121561450757600080fd5b8351925060208401519150604084015190509250925092565b60008060006060848603121561453557600080fd5b83516001600160601b038116811461454c57600080fd5b60208501519093506cffffffffffffffffffffffffff8116811461456f57600080fd5b604085015190925061ffff811681146140b457600080fdfea264697066735822122083923f05434cb76fed6b8e10a4325fa5dcd495a4be60cadfd3d8a7502882ea2d64736f6c63430008120033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b15646f79eb13df44eb48e9046dac1a3b0448117000000000000000000000000d672794da0148a614efa2a702bc337432cbbda1700000000000000000000000028556b2c28cb6991a306093e67d1959905a8d28d000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2
-----Decoded View---------------
Arg [0] : quotationDataAddress (address): 0xB15646F79Eb13df44eB48e9046dAC1A3B0448117
Arg [1] : claimsRewardAddress (address): 0xD672794dA0148a614efa2a702bC337432cBBda17
Arg [2] : stakingPoolFactoryAddress (address): 0x28556B2C28CB6991A306093E67d1959905a8D28D
Arg [3] : tokenAddress (address): 0xeceF1e050432c9304B23b3226659bF8981Cf83a2
-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000b15646f79eb13df44eb48e9046dac1a3b0448117
Arg [1] : 000000000000000000000000d672794da0148a614efa2a702bc337432cbbda17
Arg [2] : 00000000000000000000000028556b2c28cb6991a306093e67d1959905a8d28d
Arg [3] : 000000000000000000000000ecef1e050432c9304b23b3226659bf8981cf83a2
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.