More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 202 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Withdraw | 18798079 | 427 days ago | IN | 0 ETH | 0.00181089 | ||||
Withdraw | 18763242 | 432 days ago | IN | 0 ETH | 0.00152686 | ||||
Withdraw | 18686563 | 442 days ago | IN | 0 ETH | 0.00322234 | ||||
Withdraw | 18554581 | 461 days ago | IN | 0 ETH | 0.00132217 | ||||
Withdraw | 18483340 | 471 days ago | IN | 0 ETH | 0.00139315 | ||||
Withdraw | 18355897 | 489 days ago | IN | 0 ETH | 0.00030704 | ||||
Withdraw | 18298157 | 497 days ago | IN | 0 ETH | 0.0004112 | ||||
Withdraw | 18262981 | 502 days ago | IN | 0 ETH | 0.00098519 | ||||
Withdraw | 18233629 | 506 days ago | IN | 0 ETH | 0.0005863 | ||||
Withdraw | 18033564 | 534 days ago | IN | 0 ETH | 0.0009077 | ||||
Withdraw | 18013849 | 537 days ago | IN | 0 ETH | 0.00205464 | ||||
Withdraw | 17983561 | 541 days ago | IN | 0 ETH | 0.00116194 | ||||
Withdraw | 17863645 | 558 days ago | IN | 0 ETH | 0.00273413 | ||||
Withdraw | 17858600 | 558 days ago | IN | 0 ETH | 0.00085456 | ||||
Withdraw | 17826663 | 563 days ago | IN | 0 ETH | 0.0013027 | ||||
Withdraw | 17720007 | 578 days ago | IN | 0 ETH | 0.00278618 | ||||
Withdraw | 17641470 | 589 days ago | IN | 0 ETH | 0.00102468 | ||||
Withdraw | 17577792 | 598 days ago | IN | 0 ETH | 0.00084082 | ||||
Withdraw | 17421745 | 620 days ago | IN | 0 ETH | 0.00245097 | ||||
Withdraw | 17321072 | 634 days ago | IN | 0 ETH | 0.00214891 | ||||
Withdraw | 17165440 | 656 days ago | IN | 0 ETH | 0.00300811 | ||||
Withdraw | 16963888 | 684 days ago | IN | 0 ETH | 0.00132906 | ||||
Withdraw | 16827249 | 704 days ago | IN | 0 ETH | 0.00415974 | ||||
Withdraw | 16520178 | 747 days ago | IN | 0 ETH | 0.0015603 | ||||
Withdraw | 16397196 | 764 days ago | IN | 0 ETH | 0.00114279 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
TimelockManager
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-11-08 */ // File: @openzeppelin/contracts/GSN/Context.sol pragma solidity ^0.6.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol pragma solidity ^0.6.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), msgSender); } /** * @dev Returns the address of the current owner. */ function owner() public view returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(_owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { emit OwnershipTransferred(_owner, address(0)); _owner = address(0); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: @openzeppelin/contracts/math/SafeMath.sol pragma solidity ^0.6.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when 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 SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol pragma solidity ^0.6.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); } // File: @api3-contracts/api3-token/contracts/interfaces/IApi3Token.sol pragma solidity 0.6.12; interface IApi3Token is IERC20 { event MinterStatusUpdated( address indexed minterAddress, bool minterStatus ); event BurnerStatusUpdated( address indexed burnerAddress, bool burnerStatus ); function updateMinterStatus( address minterAddress, bool minterStatus ) external; function updateBurnerStatus(bool burnerStatus) external; function mint( address account, uint256 amount ) external; function burn(uint256 amount) external; function getMinterStatus(address minterAddress) external view returns(bool minterStatus); function getBurnerStatus(address burnerAddress) external view returns(bool burnerStatus); } // File: @api3-contracts/api3-pool/contracts/interfaces/IApi3State.sol pragma solidity 0.6.12; interface IApi3State { enum ClaimStatus { Pending, Accepted, Denied } event InflationManagerUpdated(address inflationManagerAddress); event ClaimsManagerUpdated(address claimsManagerAddress); event RewardVestingPeriodUpdated(uint256 rewardVestingPeriod); event UnpoolRequestCooldownUpdated(uint256 unpoolRequestCooldown); event UnpoolWaitingPeriodUpdated(uint256 unpoolWaitingPeriod); function updateInflationManager(address inflationManagerAddress) external; function updateClaimsManager(address claimsManagerAddress) external; function updateRewardVestingPeriod(uint256 _rewardVestingPeriod) external; function updateUnpoolRequestCooldown(uint256 _unpoolRequestCooldown) external; function updateUnpoolWaitingPeriod(uint256 _unpoolWaitingPeriod) external; } // File: @api3-contracts/api3-pool/contracts/interfaces/IEpochUtils.sol pragma solidity 0.6.12; interface IEpochUtils is IApi3State { function getCurrentEpochIndex() external view returns(uint256 currentEpochIndex); function getEpochIndex(uint256 timestamp) external view returns(uint256 epochIndex); } // File: @api3-contracts/api3-pool/contracts/interfaces/IGetterUtils.sol pragma solidity 0.6.12; interface IGetterUtils is IEpochUtils { function getPooled(address userAddress) external view returns(uint256 pooled); function getVotingPower( address delegate, uint256 timestamp ) external view returns(uint256 votingPower); function getTotalRealPooled() external view returns(uint256 totalRealPooled); function getBalance(address userAddress) external view returns(uint256 balance); function getShare(address userAddress) external view returns(uint256 share); function getUnpoolRequestEpoch(address userAddress) external view returns(uint256 unpoolRequestEpoch); function getTotalStaked(uint256 epochIndex) external view returns(uint256 totalStaked); function getStaked( address userAddress, uint256 epochIndex ) external view returns(uint256 staked); function getDelegate(address userAddress) external view returns(address delegate); function getDelegated( address delegate, uint256 epochIndex ) external view returns(uint256 delegated); function getVestedRewards(uint256 epochIndex) external view returns(uint256 vestedRewards); function getUnpaidVestedRewards(uint256 epochIndex) external view returns(uint256 unpaidVestedRewards); function getInstantRewards(uint256 epochIndex) external view returns(uint256 instantRewards); function getUnpaidInstantRewards(uint256 epochIndex) external view returns(uint256 unpaidInstantRewards); function getVesting(bytes32 vestingId) external view returns( address userAddress, uint256 amount, uint256 epoch ); function getUnvestedFund(address userAddress) external view returns(uint256 unvestedFund); function getClaim(bytes32 claimId) external view returns( address beneficiary, uint256 amount, IApi3State.ClaimStatus status ); function getActiveClaims() external view returns(bytes32[] memory _activeClaims); function getIou(bytes32 iouId) external view returns( address userAddress, uint256 amountInShares, bytes32 claimId, IApi3State.ClaimStatus redemptionCondition ); } // File: @api3-contracts/api3-pool/contracts/interfaces/IClaimUtils.sol pragma solidity 0.6.12; interface IClaimUtils is IGetterUtils { event ClaimCreated( bytes32 indexed claimId, address indexed beneficiary, uint256 amount ); event ClaimAccepted(bytes32 indexed claimId); event ClaimDenied(bytes32 indexed claimId); function createClaim( address beneficiary, uint256 amount ) external; function acceptClaim(bytes32 claimId) external; function denyClaim(bytes32 claimId) external; } // File: @api3-contracts/api3-pool/contracts/interfaces/IIouUtils.sol pragma solidity 0.6.12; interface IIouUtils is IClaimUtils { event IouCreated( bytes32 indexed iouId, address indexed userAddress, uint256 amountInShares, bytes32 indexed claimId, IApi3State.ClaimStatus redemptionCondition ); event IouRedeemed(bytes32 indexed iouId, uint256 amount); event IouDeleted(bytes32 indexed iouId); function redeem(bytes32 iouId) external; } // File: @api3-contracts/api3-pool/contracts/interfaces/IVestingUtils.sol pragma solidity 0.6.12; interface IVestingUtils is IIouUtils { event VestingCreated( bytes32 indexed vestingId, address indexed userAddress, uint256 amount, uint256 vestingEpoch ); event VestingResolved(bytes32 indexed vestingId); function vest(bytes32 vestingId) external; } // File: @api3-contracts/api3-pool/contracts/interfaces/IStakeUtils.sol pragma solidity 0.6.12; interface IStakeUtils is IVestingUtils { event Staked( address indexed userAddress, uint256 amountInShares ); event UpdatedDelegate( address indexed userAddress, address indexed delegate ); event Collected( address indexed userAddress, uint256 vestedRewards, uint256 instantRewards ); function stake(address userAddress) external; function updateDelegate(address delegate) external; function collect(address userAddress) external; } // File: @api3-contracts/api3-pool/contracts/interfaces/IPoolUtils.sol pragma solidity 0.6.12; interface IPoolUtils is IStakeUtils { event Pooled( address indexed userAddress, uint256 amount, uint256 amountInShares ); event RequestedToUnpool(address indexed userAddress); event Unpooled( address indexed userAddress, uint256 amount, uint256 amountInShares ); function pool(uint256 amount) external; function requestToUnpool() external; function unpool(uint256 amountInShares) external; } // File: @api3-contracts/api3-pool/contracts/interfaces/ITransferUtils.sol pragma solidity 0.6.12; interface ITransferUtils is IPoolUtils { event Deposited( address indexed sourceAddress, uint256 amount, address indexed userAddress ); event DepositedWithVesting( address indexed sourceAddress, uint256 amount, address indexed userAddress, uint256 vestingEpoch ); event Withdrawn( address indexed userAddress, address destinationAddress, uint256 amount ); event AddedVestedRewards( address indexed sourceAddress, uint256 amount, uint256 indexed epochIndex ); event AddedInstantRewards( address indexed sourceAddress, uint256 amount, uint256 indexed epochIndex ); function deposit( address sourceAddress, uint256 amount, address userAddress ) external; function depositWithVesting( address sourceAddress, uint256 amount, address userAddress, uint256 vestingStart, uint256 vestingEnd ) external; function withdraw( address destinationAddress, uint256 amount ) external; function addVestedRewards( address sourceAddress, uint256 amount ) external; function addInstantRewards( address sourceAddress, uint256 amount ) external; } // File: @api3-contracts/api3-pool/contracts/interfaces/IApi3Pool.sol pragma solidity 0.6.12; interface IApi3Pool is ITransferUtils {} // File: contracts/interfaces/ITimelockManager.sol pragma solidity 0.6.12; interface ITimelockManager { event Api3PoolUpdated(address api3PoolAddress); event RevertedTimelock( address indexed recipient, address destination, uint256 amount ); event PermittedTimelockToBeReverted(address recipient); event TransferredAndLocked( address source, address indexed recipient, uint256 amount, uint256 releaseStart, uint256 releaseEnd ); event Withdrawn( address indexed recipient, uint256 amount ); event WithdrawnToPool( address indexed recipient, address api3PoolAddress, address beneficiary ); function updateApi3Pool(address api3PoolAddress) external; function revertTimelock( address recipient, address destination ) external; function permitTimelockToBeReverted() external; function transferAndLock( address source, address recipient, uint256 amount, uint256 releaseStart, uint256 releaseEnd ) external; function transferAndLockMultiple( address source, address[] calldata recipients, uint256[] calldata amounts, uint256[] calldata releaseStarts, uint256[] calldata releaseEnds ) external; function withdraw() external; function withdrawToPool( address api3PoolAddress, address beneficiary ) external; function getWithdrawable(address recipient) external view returns(uint256 withdrawable); function getTimelock(address recipient) external view returns ( uint256 totalAmount, uint256 remainingAmount, uint256 releaseStart, uint256 releaseEnd ); function getRemainingAmount(address recipient) external view returns (uint256 remainingAmount); function getIfTimelockIsRevertible(address recipient) external view returns (bool revertStatus); } // File: contracts/TimelockManager.sol pragma solidity 0.6.12; /// @title Contract that the API3 DAO uses to timelock API3 tokens /// @notice The owner of TimelockManager (i.e., API3 DAO) can send tokens to /// TimelockManager to timelock them. These tokens will then be vested to their /// recipient linearly, starting from releaseStart and ending at releaseEnd of /// the respective timelock. /// Alternatively, if the owner of TimelockManager (i.e., API3 DAO) sets the /// api3Pool address, the token recipients can transfer their locked tokens /// from TimelockManager to api3Pool. These tokens will remain timelocked /// (i.e., will not be withdrawable) at api3Pool until they are vested /// according to their respective schedule. contract TimelockManager is Ownable, ITimelockManager { using SafeMath for uint256; /// @dev If an address has permitted the owner of this contract (i.e., the /// API3 DAO) to revert (i.e., cancel and withdraw the tokens) their /// timelock mapping(address => bool) private permittedTimelockToBeReverted; struct Timelock { uint256 totalAmount; uint256 remainingAmount; uint256 releaseStart; uint256 releaseEnd; } IApi3Token public immutable api3Token; IApi3Pool public api3Pool; mapping(address => Timelock) public timelocks; /// @dev api3Pool is not initialized in the constructor because this /// contract will be deployed before api3Pool /// @param api3TokenAddress Address of the API3 token contract /// @param timelockManagerOwner Address that will receive the ownership of /// the TimelockManager contract (i.e., the API3 DAO) constructor( address api3TokenAddress, address timelockManagerOwner ) public { api3Token = IApi3Token(api3TokenAddress); transferOwnership(timelockManagerOwner); } /// @notice Called by the owner (i.e., API3 DAO) to set the address of /// api3Pool, which token recipients can transfer their tokens to /// @param api3PoolAddress Address of the API3 pool contract function updateApi3Pool(address api3PoolAddress) external override onlyOwner { require( address(api3Pool) != api3PoolAddress, "Input will not update state" ); api3Pool = IApi3Pool(api3PoolAddress); emit Api3PoolUpdated(api3PoolAddress); } /// @notice Called by the owner (i.e., API3 DAO) to revert the timelock of /// a recipient, given that they have given permission beforehand /// @param recipient Original recipient of tokens /// @param destination Destination of the tokens locked by the reverted /// timelock function revertTimelock( address recipient, address destination ) external override onlyOwner onlyIfRecipientHasRemainingTokens(recipient) { require( destination != address(0), "Invalid destination" ); require( permittedTimelockToBeReverted[recipient], "Not permitted to revert timelock" ); // Reset permission automatically permittedTimelockToBeReverted[recipient] = false; uint256 remaining = timelocks[recipient].remainingAmount; timelocks[recipient].remainingAmount = 0; require( api3Token.transfer(destination, remaining), "API3 token transfer failed" ); emit RevertedTimelock(recipient, destination, remaining); } /// @notice Permit the owner (i.e., API3 DAO) to revert the caller's /// timelock /// @dev To be used when the timelock has been created with incorrect /// parameters (for example with releaseEnd at infinity) function permitTimelockToBeReverted() external override onlyIfRecipientHasRemainingTokens(msg.sender) { require( !permittedTimelockToBeReverted[msg.sender], "Input will not update state" ); permittedTimelockToBeReverted[msg.sender] = true; emit PermittedTimelockToBeReverted(msg.sender); } /// @notice Transfers API3 tokens to this contract and timelocks them /// @dev source needs to approve() this contract to transfer amount number /// of tokens beforehand. /// A recipient cannot have multiple timelocks. /// @param source Source of tokens /// @param recipient Recipient of tokens /// @param amount Amount of tokens /// @param releaseStart Start of release time /// @param releaseEnd End of release time function transferAndLock( address source, address recipient, uint256 amount, uint256 releaseStart, uint256 releaseEnd ) public override onlyOwner { require( timelocks[recipient].remainingAmount == 0, "Recipient has remaining tokens" ); require(amount != 0, "Amount cannot be 0"); require( releaseEnd > releaseStart, "releaseEnd not larger than releaseStart" ); require( releaseStart > now, "releaseStart not in the future" ); timelocks[recipient] = Timelock({ totalAmount: amount, remainingAmount: amount, releaseStart: releaseStart, releaseEnd: releaseEnd }); require( api3Token.transferFrom(source, address(this), amount), "API3 token transferFrom failed" ); emit TransferredAndLocked( source, recipient, amount, releaseStart, releaseEnd ); } /// @notice Convenience function that calls transferAndLock() multiple times /// @dev source is expected to be a single address, i.e., the API3 DAO. /// source needs to approve() this contract to transfer the sum of the /// amounts of tokens to be transferred and locked. /// @param source Source of tokens /// @param recipients Array of recipients of tokens /// @param amounts Array of amounts of tokens /// @param releaseStarts Array of starts of release times /// @param releaseEnds Array of ends of release times function transferAndLockMultiple( address source, address[] calldata recipients, uint256[] calldata amounts, uint256[] calldata releaseStarts, uint256[] calldata releaseEnds ) external override onlyOwner { require( recipients.length == amounts.length && recipients.length == releaseStarts.length && recipients.length == releaseEnds.length, "Parameters are of unequal length" ); require( recipients.length <= 30, "Parameters are longer than 30" ); for (uint256 ind = 0; ind < recipients.length; ind++) { transferAndLock( source, recipients[ind], amounts[ind], releaseStarts[ind], releaseEnds[ind] ); } } /// @notice Used by the recipient to withdraw tokens function withdraw() external override onlyIfRecipientHasRemainingTokens(msg.sender) { address recipient = msg.sender; uint256 withdrawable = getWithdrawable(recipient); require( withdrawable != 0, "No withdrawable tokens yet" ); timelocks[recipient].remainingAmount = timelocks[recipient].remainingAmount.sub(withdrawable); require( api3Token.transfer(recipient, withdrawable), "API3 token transfer failed" ); emit Withdrawn( recipient, withdrawable ); } /// @notice Used by the recipient to withdraw their tokens to the API3 pool /// @dev We ask the recipient to provide api3PoolAddress as a form of /// validation, i.e., the recipient confirms that the API3 pool address set /// at this contract is correct /// @param api3PoolAddress Address of the API3 pool contract /// @param beneficiary Address that the tokens will be deposited to the /// pool contract on behalf of function withdrawToPool( address api3PoolAddress, address beneficiary ) external override onlyIfRecipientHasRemainingTokens(msg.sender) { require( beneficiary != address(0), "beneficiary cannot be 0" ); require(address(api3Pool) != address(0), "API3 pool not set yet"); require( address(api3Pool) == api3PoolAddress, "API3 pool addresses do not match" ); address recipient = msg.sender; uint256 withdrawable = getWithdrawable(recipient); uint256 remaining = timelocks[recipient].remainingAmount; uint256 timelocked = remaining.sub(withdrawable); timelocks[recipient].remainingAmount = 0; // Approve the total amount api3Token.approve(address(api3Pool), remaining); // Deposit the funds that are withdrawable without vesting if (withdrawable != 0) { api3Pool.deposit( address(this), withdrawable, beneficiary ); } // Deposit the funds that are still timelocked with vesting. // The vesting will continue the same way at the pool, released // linearly. if (timelocked != 0) { api3Pool.depositWithVesting( address(this), timelocked, beneficiary, now > timelocks[recipient].releaseStart ? now : timelocks[recipient].releaseStart, timelocks[recipient].releaseEnd ); } emit WithdrawnToPool( recipient, api3PoolAddress, beneficiary ); } /// @notice Returns the amount of tokens a recipient can currently withdraw /// @param recipient Address of the recipient /// @return withdrawable Amount of tokens withdrawable by the recipient function getWithdrawable(address recipient) public view override returns(uint256 withdrawable) { Timelock storage timelock = timelocks[recipient]; uint256 unlocked = getUnlocked(recipient); uint256 withdrawn = timelock.totalAmount.sub(timelock.remainingAmount); withdrawable = unlocked.sub(withdrawn); } /// @notice Returns the amount of tokens that was unlocked for the /// recipient to date. Includes both withdrawn and non-withdrawn tokens. /// @param recipient Address of the recipient /// @return unlocked Amount of tokens unlocked for the recipient function getUnlocked(address recipient) private view returns(uint256 unlocked) { Timelock storage timelock = timelocks[recipient]; if (now <= timelock.releaseStart) { unlocked = 0; } else if (now >= timelock.releaseEnd) { unlocked = timelock.totalAmount; } else { uint256 passedTime = now.sub(timelock.releaseStart); uint256 totalTime = timelock.releaseEnd.sub(timelock.releaseStart); unlocked = timelock.totalAmount.mul(passedTime).div(totalTime); } } /// @notice Returns the details of a timelock /// @param recipient Recipient of tokens /// @return totalAmount Total amount of tokens /// @return remainingAmount Remaining amount of tokens to be withdrawn /// @return releaseStart Release start time /// @return releaseEnd Release end time function getTimelock(address recipient) external view override returns ( uint256 totalAmount, uint256 remainingAmount, uint256 releaseStart, uint256 releaseEnd ) { Timelock storage timelock = timelocks[recipient]; totalAmount = timelock.totalAmount; remainingAmount = timelock.remainingAmount; releaseStart = timelock.releaseStart; releaseEnd = timelock.releaseEnd; } /// @notice Returns remaining amount of a timelock /// @dev Provided separately to be used with Etherscan's "Read" /// functionality, in case getTimelock() output is too complicated for the /// user. /// @param recipient Recipient of tokens /// @return remainingAmount Remaining amount of tokens to be withdrawn function getRemainingAmount(address recipient) external view override returns (uint256 remainingAmount) { remainingAmount = timelocks[recipient].remainingAmount; } /// @notice Returns if the recipient's timelock is revertible /// @param recipient Recipient of tokens /// @return revertStatus If the recipient's timelock is revertible function getIfTimelockIsRevertible(address recipient) external view override returns (bool revertStatus) { revertStatus = permittedTimelockToBeReverted[recipient]; } /// @dev Reverts if the recipient does not have remaining tokens modifier onlyIfRecipientHasRemainingTokens(address recipient) { require( timelocks[recipient].remainingAmount != 0, "Recipient does not have remaining tokens" ); _; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"api3TokenAddress","type":"address"},{"internalType":"address","name":"timelockManagerOwner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"api3PoolAddress","type":"address"}],"name":"Api3PoolUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"PermittedTimelockToBeReverted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"destination","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RevertedTimelock","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"source","type":"address"},{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseStart","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"releaseEnd","type":"uint256"}],"name":"TransferredAndLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"address","name":"api3PoolAddress","type":"address"},{"indexed":false,"internalType":"address","name":"beneficiary","type":"address"}],"name":"WithdrawnToPool","type":"event"},{"inputs":[],"name":"api3Pool","outputs":[{"internalType":"contract IApi3Pool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"api3Token","outputs":[{"internalType":"contract IApi3Token","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"getIfTimelockIsRevertible","outputs":[{"internalType":"bool","name":"revertStatus","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"getRemainingAmount","outputs":[{"internalType":"uint256","name":"remainingAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"getTimelock","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"remainingAmount","type":"uint256"},{"internalType":"uint256","name":"releaseStart","type":"uint256"},{"internalType":"uint256","name":"releaseEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"}],"name":"getWithdrawable","outputs":[{"internalType":"uint256","name":"withdrawable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"permitTimelockToBeReverted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"address","name":"destination","type":"address"}],"name":"revertTimelock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"timelocks","outputs":[{"internalType":"uint256","name":"totalAmount","type":"uint256"},{"internalType":"uint256","name":"remainingAmount","type":"uint256"},{"internalType":"uint256","name":"releaseStart","type":"uint256"},{"internalType":"uint256","name":"releaseEnd","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"source","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"releaseStart","type":"uint256"},{"internalType":"uint256","name":"releaseEnd","type":"uint256"}],"name":"transferAndLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"source","type":"address"},{"internalType":"address[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"uint256[]","name":"releaseStarts","type":"uint256[]"},{"internalType":"uint256[]","name":"releaseEnds","type":"uint256[]"}],"name":"transferAndLockMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"api3PoolAddress","type":"address"}],"name":"updateApi3Pool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"api3PoolAddress","type":"address"},{"internalType":"address","name":"beneficiary","type":"address"}],"name":"withdrawToPool","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b50604051620030f4380380620030f4833981810160405260408110156200003757600080fd5b8101908080519060200190929190805190602001909291905050506000620000646200015260201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508173ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b815250506200014a816200015a60201b60201c565b505062000370565b600033905090565b6200016a6200015260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200022b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620002b3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180620030ce6026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60805160601c612d2c620003a260003980610a995280610ff852806118655280611c67528061247f5250612d2c6000f3fe608060405234801561001057600080fd5b506004361061010b5760003560e01c80636fe2a2d7116100a2578063bf1e799b11610071578063bf1e799b14610551578063cd7cea04146105be578063e1b1c21614610622578063f2fde38b1461067c578063faf7eba6146106c05761010b565b80636fe2a2d7146104d5578063715018a6146105095780638da5cb5b14610513578063aa483e7c146105475761010b565b8063355efbed116100de578063355efbed146102bb5780633ccfd60b146102ff5780635af6025314610309578063613d517d146104a15761010b565b80631369a9271461011057806324dcb3851461017d57806329765acf146101ff57806332cc6ae614610263575b600080fd5b6101526004803603602081101561012657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610718565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6101fd600480360360a081101561019357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050610748565b005b6102616004803603604081101561021557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c76565b005b6102a56004803603602081101561027957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113f8565b6040518082815260200191505060405180910390f35b6102fd600480360360208110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611485565b005b6103076116a2565b005b61049f600480360360a081101561031f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561035c57600080fd5b82018360208201111561036e57600080fd5b8035906020019184602083028401116401000000008311171561039057600080fd5b9091929391929390803590602001906401000000008111156103b157600080fd5b8201836020820111156103c357600080fd5b803590602001918460208302840111640100000000831117156103e557600080fd5b90919293919293908035906020019064010000000081111561040657600080fd5b82018360208201111561041857600080fd5b8035906020019184602083028401116401000000008311171561043a57600080fd5b90919293919293908035906020019064010000000081111561045b57600080fd5b82018360208201111561046d57600080fd5b8035906020019184602083028401116401000000008311171561048f57600080fd5b90919293919293905050506119f4565b005b6104a9611c65565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dd611c89565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610511611caf565b005b61051b611e35565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054f611e5e565b005b6105936004803603602081101561056757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612062565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610620600480360360408110156105d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120cf565b005b6106646004803603602081101561063857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061262d565b60405180821515815260200191505060405180910390f35b6106be6004803603602081101561069257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612683565b005b610702600480360360208110156106d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061288e565b6040518082815260200191505060405180910390f35b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6107506128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154146108c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f526563697069656e74206861732072656d61696e696e6720746f6b656e73000081525060200191505060405180910390fd5b600083141561093f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f416d6f756e742063616e6e6f742062652030000000000000000000000000000081525060200191505060405180910390fd5b818111610997576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612caf6027913960400191505060405180910390fd5b428211610a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f72656c656173655374617274206e6f7420696e2074686520667574757265000081525060200191505060405180910390fd5b604051806080016040528084815260200184815260200183815260200182815250600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166323b872dd8630866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610b4657600080fd5b505af1158015610b5a573d6000803e3d6000fd5b505050506040513d6020811015610b7057600080fd5b8101908080519060200190929190505050610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4150493320746f6b656e207472616e7366657246726f6d206661696c6564000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fd1f652d80d5c06196c1cc9329a51edb16e16aa626e4a7715de03fb8a98547ef686858585604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a25050505050565b336000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541415610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f62656e65666963696172792063616e6e6f74206265203000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4150493320706f6f6c206e6f742073657420796574000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4150493320706f6f6c2061646472657373657320646f206e6f74206d6174636881525060200191505060405180910390fd5b60003390506000610f4e826113f8565b90506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000610fac83836128e290919063ffffffff16565b90506000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110a957600080fd5b505af11580156110bd573d6000803e3d6000fd5b505050506040513d60208110156110d357600080fd5b810190808051906020019092919050505050600083146111b757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f45346dc3085896040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561119e57600080fd5b505af11580156111b2573d6000803e3d6000fd5b505050505b6000811461136d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166356d4a7fe308389600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421161129157600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611293565b425b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200195505050505050600060405180830381600087803b15801561135457600080fd5b505af1158015611368573d6000803e3d6000fd5b505050505b8373ffffffffffffffffffffffffffffffffffffffff167fa2fd4f03989448c5a69bab0c0454f2baf5667413a4e4b87fd7379a8ab69fae3f8888604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a250505050505050565b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006114478461292c565b90506000611466836001015484600001546128e290919063ffffffff16565b905061147b81836128e290919063ffffffff16565b9350505050919050565b61148d6128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f496e7075742077696c6c206e6f7420757064617465207374617465000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9758fe2c5611eaaf02f90cf70038ecb1e23f3d218aed0b239a67c393d142767581604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b336000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141561173f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b6000339050600061174f826113f8565b905060008114156117c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f20776974686472617761626c6520746f6b656e732079657400000000000081525060200191505060405180910390fd5b61181d81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546128e290919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b505050506040513d602081101561191e57600080fd5b81019080805190602001909291905050506119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4150493320746f6b656e207472616e73666572206661696c656400000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040518082815260200191505060405180910390a2505050565b6119fc6128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8585905088889050148015611ad657508383905088889050145b8015611ae757508181905088889050145b611b59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f506172616d657465727320617265206f6620756e657175616c206c656e67746881525060200191505060405180910390fd5b601e888890501115611bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506172616d657465727320617265206c6f6e676572207468616e20333000000081525060200191505060405180910390fd5b60005b88889050811015611c5957611c4c8a8a8a84818110611bf157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16898985818110611c1a57fe5b90506020020135888886818110611c2d57fe5b90506020020135878787818110611c4057fe5b90506020020135610748565b8080600101915050611bd6565b50505050505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cb76128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b336000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541415611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f496e7075742077696c6c206e6f7420757064617465207374617465000000000081525060200191505060405180910390fd5b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f865c01aec16d8b95381881920a512ac95cc026764ba224093ad00b5824136d0b33604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000806000806000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001549450806001015493508060020154925080600301549150509193509193565b6120d76128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b816000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541415612234576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e76616c69642064657374696e6174696f6e0000000000000000000000000081525060200191505060405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612396576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f74207065726d697474656420746f207265766572742074696d656c6f636b81525060200191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561250e57600080fd5b505af1158015612522573d6000803e3d6000fd5b505050506040513d602081101561253857600080fd5b81019080805190602001909291905050506125bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4150493320746f6b656e207472616e73666572206661696c656400000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f57da8465c206f4c67271e5b44533d488e9305cc666290a0b4d56df0e71750c028483604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a250505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61268b6128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461274b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612c616026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b600033905090565b600061292483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a0a565b905092915050565b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806002015442116129845760009150612a04565b8060030154421061299b5780600001549150612a03565b60006129b48260020154426128e290919063ffffffff16565b905060006129d3836002015484600301546128e290919063ffffffff16565b90506129fe816129f0848660000154612aca90919063ffffffff16565b612b5090919063ffffffff16565b935050505b5b50919050565b6000838311158290612ab7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a7c578082015181840152602081019050612a61565b50505050905090810190601f168015612aa95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831415612add5760009050612b4a565b6000828402905082848281612aee57fe5b0414612b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612cd66021913960400191505060405180910390fd5b809150505b92915050565b6000612b9283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b9a565b905092915050565b60008083118290612c46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c0b578082015181840152602081019050612bf0565b50505050905090810190601f168015612c385780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c5257fe5b04905080915050939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526563697069656e7420646f6573206e6f7420686176652072656d61696e696e6720746f6b656e7372656c65617365456e64206e6f74206c6172676572207468616e2072656c656173655374617274536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212203a614fc555c43a31cbccbf1637c9819b3b9e0c046763a63e177c993617c2e54b64736f6c634300060c00334f776e61626c653a206e6577206f776e657220697320746865207a65726f20616464726573730000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a000000000000000000000000e7af7c5982e073ac6525a34821fe1b3e8e432099
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061010b5760003560e01c80636fe2a2d7116100a2578063bf1e799b11610071578063bf1e799b14610551578063cd7cea04146105be578063e1b1c21614610622578063f2fde38b1461067c578063faf7eba6146106c05761010b565b80636fe2a2d7146104d5578063715018a6146105095780638da5cb5b14610513578063aa483e7c146105475761010b565b8063355efbed116100de578063355efbed146102bb5780633ccfd60b146102ff5780635af6025314610309578063613d517d146104a15761010b565b80631369a9271461011057806324dcb3851461017d57806329765acf146101ff57806332cc6ae614610263575b600080fd5b6101526004803603602081101561012657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610718565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b6101fd600480360360a081101561019357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019092919080359060200190929190505050610748565b005b6102616004803603604081101561021557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610c76565b005b6102a56004803603602081101561027957600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113f8565b6040518082815260200191505060405180910390f35b6102fd600480360360208110156102d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611485565b005b6103076116a2565b005b61049f600480360360a081101561031f57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019064010000000081111561035c57600080fd5b82018360208201111561036e57600080fd5b8035906020019184602083028401116401000000008311171561039057600080fd5b9091929391929390803590602001906401000000008111156103b157600080fd5b8201836020820111156103c357600080fd5b803590602001918460208302840111640100000000831117156103e557600080fd5b90919293919293908035906020019064010000000081111561040657600080fd5b82018360208201111561041857600080fd5b8035906020019184602083028401116401000000008311171561043a57600080fd5b90919293919293908035906020019064010000000081111561045b57600080fd5b82018360208201111561046d57600080fd5b8035906020019184602083028401116401000000008311171561048f57600080fd5b90919293919293905050506119f4565b005b6104a9611c65565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6104dd611c89565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610511611caf565b005b61051b611e35565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b61054f611e5e565b005b6105936004803603602081101561056757600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612062565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b610620600480360360408110156105d457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506120cf565b005b6106646004803603602081101561063857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061262d565b60405180821515815260200191505060405180910390f35b6106be6004803603602081101561069257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612683565b005b610702600480360360208110156106d657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061288e565b6040518082815260200191505060405180910390f35b60036020528060005260406000206000915090508060000154908060010154908060020154908060030154905084565b6107506128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610810576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b6000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154146108c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f526563697069656e74206861732072656d61696e696e6720746f6b656e73000081525060200191505060405180910390fd5b600083141561093f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260128152602001807f416d6f756e742063616e6e6f742062652030000000000000000000000000000081525060200191505060405180910390fd5b818111610997576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180612caf6027913960400191505060405180910390fd5b428211610a0c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f72656c656173655374617274206e6f7420696e2074686520667574757265000081525060200191505060405180910390fd5b604051806080016040528084815260200184815260200183815260200182815250600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082015181600001556020820151816001015560408201518160020155606082015181600301559050507f0000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a73ffffffffffffffffffffffffffffffffffffffff166323b872dd8630866040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019350505050602060405180830381600087803b158015610b4657600080fd5b505af1158015610b5a573d6000803e3d6000fd5b505050506040513d6020811015610b7057600080fd5b8101908080519060200190929190505050610bf3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f4150493320746f6b656e207472616e7366657246726f6d206661696c6564000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fd1f652d80d5c06196c1cc9329a51edb16e16aa626e4a7715de03fb8a98547ef686858585604051808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200183815260200182815260200194505050505060405180910390a25050505050565b336000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541415610d13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610db6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260178152602001807f62656e65666963696172792063616e6e6f74206265203000000000000000000081525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610e7b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260158152602001807f4150493320706f6f6c206e6f742073657420796574000000000000000000000081525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f3e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4150493320706f6f6c2061646472657373657320646f206e6f74206d6174636881525060200191505060405180910390fd5b60003390506000610f4e826113f8565b90506000600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000610fac83836128e290919063ffffffff16565b90506000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507f0000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a73ffffffffffffffffffffffffffffffffffffffff1663095ea7b3600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16846040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156110a957600080fd5b505af11580156110bd573d6000803e3d6000fd5b505050506040513d60208110156110d357600080fd5b810190808051906020019092919050505050600083146111b757600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663f45346dc3085896040518463ffffffff1660e01b8152600401808473ffffffffffffffffffffffffffffffffffffffff1681526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b15801561119e57600080fd5b505af11580156111b2573d6000803e3d6000fd5b505050505b6000811461136d57600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166356d4a7fe308389600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154421161129157600360008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060020154611293565b425b600360008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600301546040518663ffffffff1660e01b8152600401808673ffffffffffffffffffffffffffffffffffffffff1681526020018581526020018473ffffffffffffffffffffffffffffffffffffffff16815260200183815260200182815260200195505050505050600060405180830381600087803b15801561135457600080fd5b505af1158015611368573d6000803e3d6000fd5b505050505b8373ffffffffffffffffffffffffffffffffffffffff167fa2fd4f03989448c5a69bab0c0454f2baf5667413a4e4b87fd7379a8ab69fae3f8888604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390a250505050505050565b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006114478461292c565b90506000611466836001015484600001546128e290919063ffffffff16565b905061147b81836128e290919063ffffffff16565b9350505050919050565b61148d6128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461154d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611611576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f496e7075742077696c6c206e6f7420757064617465207374617465000000000081525060200191505060405180910390fd5b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f9758fe2c5611eaaf02f90cf70038ecb1e23f3d218aed0b239a67c393d142767581604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b336000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154141561173f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b6000339050600061174f826113f8565b905060008114156117c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4e6f20776974686472617761626c6520746f6b656e732079657400000000000081525060200191505060405180910390fd5b61181d81600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101546128e290919063ffffffff16565b600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507f0000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b1580156118f457600080fd5b505af1158015611908573d6000803e3d6000fd5b505050506040513d602081101561191e57600080fd5b81019080805190602001909291905050506119a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4150493320746f6b656e207472616e73666572206661696c656400000000000081525060200191505060405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5826040518082815260200191505060405180910390a2505050565b6119fc6128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611abc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b8585905088889050148015611ad657508383905088889050145b8015611ae757508181905088889050145b611b59576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f506172616d657465727320617265206f6620756e657175616c206c656e67746881525060200191505060405180910390fd5b601e888890501115611bd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601d8152602001807f506172616d657465727320617265206c6f6e676572207468616e20333000000081525060200191505060405180910390fd5b60005b88889050811015611c5957611c4c8a8a8a84818110611bf157fe5b9050602002013573ffffffffffffffffffffffffffffffffffffffff16898985818110611c1a57fe5b90506020020135888886818110611c2d57fe5b90506020020135878787818110611c4057fe5b90506020020135610748565b8080600101915050611bd6565b50505050505050505050565b7f0000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a81565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611cb76128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611d77576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b336000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541415611efb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b600160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615611fbb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f496e7075742077696c6c206e6f7420757064617465207374617465000000000081525060200191505060405180910390fd5b60018060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507f865c01aec16d8b95381881920a512ac95cc026764ba224093ad00b5824136d0b33604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150565b6000806000806000600360008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905080600001549450806001015493508060020154925080600301549150509193509193565b6120d76128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612197576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b816000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541415612234576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526028815260200180612c876028913960400191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260138152602001807f496e76616c69642064657374696e6174696f6e0000000000000000000000000081525060200191505060405180910390fd5b600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16612396576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4e6f74207065726d697474656420746f207265766572742074696d656c6f636b81525060200191505060405180910390fd5b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015490506000600360008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101819055507f0000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a73ffffffffffffffffffffffffffffffffffffffff1663a9059cbb84836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561250e57600080fd5b505af1158015612522573d6000803e3d6000fd5b505050506040513d602081101561253857600080fd5b81019080805190602001909291905050506125bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f4150493320746f6b656e207472616e73666572206661696c656400000000000081525060200191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f57da8465c206f4c67271e5b44533d488e9305cc666290a0b4d56df0e71750c028483604051808373ffffffffffffffffffffffffffffffffffffffff1681526020018281526020019250505060405180910390a250505050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b61268b6128da565b73ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461274b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657281525060200191505060405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156127d1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526026815260200180612c616026913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101549050919050565b600033905090565b600061292483836040518060400160405280601e81526020017f536166654d6174683a207375627472616374696f6e206f766572666c6f770000815250612a0a565b905092915050565b600080600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806002015442116129845760009150612a04565b8060030154421061299b5780600001549150612a03565b60006129b48260020154426128e290919063ffffffff16565b905060006129d3836002015484600301546128e290919063ffffffff16565b90506129fe816129f0848660000154612aca90919063ffffffff16565b612b5090919063ffffffff16565b935050505b5b50919050565b6000838311158290612ab7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612a7c578082015181840152602081019050612a61565b50505050905090810190601f168015612aa95780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b5060008385039050809150509392505050565b600080831415612add5760009050612b4a565b6000828402905082848281612aee57fe5b0414612b45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526021815260200180612cd66021913960400191505060405180910390fd5b809150505b92915050565b6000612b9283836040518060400160405280601a81526020017f536166654d6174683a206469766973696f6e206279207a65726f000000000000815250612b9a565b905092915050565b60008083118290612c46576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612c0b578082015181840152602081019050612bf0565b50505050905090810190601f168015612c385780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b506000838581612c5257fe5b04905080915050939250505056fe4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061646472657373526563697069656e7420646f6573206e6f7420686176652072656d61696e696e6720746f6b656e7372656c65617365456e64206e6f74206c6172676572207468616e2072656c656173655374617274536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f77a26469706673582212203a614fc555c43a31cbccbf1637c9819b3b9e0c046763a63e177c993617c2e54b64736f6c634300060c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a000000000000000000000000e7af7c5982e073ac6525a34821fe1b3e8e432099
-----Decoded View---------------
Arg [0] : api3TokenAddress (address): 0x0b38210ea11411557c13457D4dA7dC6ea731B88a
Arg [1] : timelockManagerOwner (address): 0xe7aF7c5982e073aC6525a34821fe1B3e8E432099
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000b38210ea11411557c13457d4da7dc6ea731b88a
Arg [1] : 000000000000000000000000e7af7c5982e073ac6525a34821fe1b3e8e432099
Deployed Bytecode Sourcemap
24521:13431:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25096:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28553:1197;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;32474:1808;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;34499:385;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25930:337;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;31351:662;;;:::i;:::-;;30320:965;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25020:37;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25064:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;2712:148;;;:::i;:::-;;2070:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;27694:388;;;:::i;:::-;;36134:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26576:881;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37418:220;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3015:244;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;37007:218;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25096:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;28553:1197::-;2292:12;:10;:12::i;:::-;2282:22;;:6;;;;;;;;;;:22;;;2274:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28858:1:::1;28818:9;:20;28828:9;28818:20;;;;;;;;;;;;;;;:36;;;:41;28796:125;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28950:1;28940:6;:11;;28932:42;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29020:12;29007:10;:25;28985:118;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29151:3;29136:12;:18;29114:102;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29250:175;;;;;;;;29287:6;29250:175;;;;29325:6;29250:175;;;;29360:12;29250:175;;;;29399:10;29250:175;;::::0;29227:9:::1;:20;29237:9;29227:20;;;;;;;;;;;;;;;:198;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29458:9;:22;;;29481:6;29497:4;29504:6;29458:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;29436:137;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;29645:9;29589:153;;;29624:6;29669;29690:12;29717:10;29589:153;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28553:1197:::0;;;;;:::o;32474:1808::-;32652:10;37856:1;37816:9;:20;37826:9;37816:20;;;;;;;;;;;;;;;:36;;;:41;;37794:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32725:1:::1;32702:25;;:11;:25;;;;32680:102;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32830:1;32801:31;;32809:8;;;;;;;;;;;32801:31;;;;32793:65;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;32912:15;32891:36;;32899:8;;;;;;;;;;;32891:36;;;32869:122;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;33002:17;33022:10;33002:30;;33043:20;33066:26;33082:9;33066:15;:26::i;:::-;33043:49;;33103:17;33123:9;:20;33133:9;33123:20;;;;;;;;;;;;;;;:36;;;33103:56;;33170:18;33191:27;33205:12;33191:9;:13;;:27;;;;:::i;:::-;33170:48;;33268:1;33229:9;:20;33239:9;33229:20;;;;;;;;;;;;;;;:36;;:40;;;;33317:9;:17;;;33343:8;;;;;;;;;;;33354:9;33317:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;33463:1;33447:12;:17;33443:187;;33490:8;;;;;;;;;;;:16;;;33533:4;33557:12;33588:11;33490:128;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33443:187;33823:1;33809:10;:15;33805:344;;33850:8;;;;;;;;;;;:27;;;33904:4;33928:10;33957:11;33993:9;:20;34003:9;33993:20;;;;;;;;;;;;;;;:33;;;33987:3;:39;:81;;34035:9;:20;34045:9;34035:20;;;;;;;;;;;;;;;:33;;;33987:81;;;34029:3;33987:81;34087:9;:20;34097:9;34087:20;;;;;;;;;;;;;;;:31;;;33850:287;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;33805:344;34194:9;34164:110;;;34218:15;34248:11;34164:110;;;;;;;;;;;;;;;;;;;;;;;;;;;;37940:1;;;;32474:1808:::0;;;:::o;34499:385::-;34608:20;34646:25;34674:9;:20;34684:9;34674:20;;;;;;;;;;;;;;;34646:48;;34705:16;34724:22;34736:9;34724:11;:22::i;:::-;34705:41;;34757:17;34777:50;34802:8;:24;;;34777:8;:20;;;:24;;:50;;;;:::i;:::-;34757:70;;34853:23;34866:9;34853:8;:12;;:23;;;;:::i;:::-;34838:38;;34499:385;;;;;;:::o;25930:337::-;2292:12;:10;:12::i;:::-;2282:22;;:6;;;;;;;;;;:22;;;2274:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26093:15:::1;26072:36;;26080:8;;;;;;;;;;;26072:36;;;;26050:113;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;26195:15;26174:8;;:37;;;;;;;;;;;;;;;;;;26227:32;26243:15;26227:32;;;;;;;;;;;;;;;;;;;;25930:337:::0;:::o;31351:662::-;31450:10;37856:1;37816:9;:20;37826:9;37816:20;;;;;;;;;;;;;;;:36;;;:41;;37794:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31478:17:::1;31498:10;31478:30;;31519:20;31542:26;31558:9;31542:15;:26::i;:::-;31519:49;;31617:1;31601:12;:17;;31579:97;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31726:54;31767:12;31726:9;:20;31736:9;31726:20;;;;;;;;;;;;;;;:36;;;:40;;:54;;;;:::i;:::-;31687:9;:20;31697:9;31687:20;;;;;;;;;;;;;;;:36;;:93;;;;31813:9;:18;;;31832:9;31843:12;31813:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;31791:123;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;31954:9;31930:75;;;31978:12;31930:75;;;;;;;;;;;;;;;;;;37940:1;;31351:662:::0;:::o;30320:965::-;2292:12;:10;:12::i;:::-;2282:22;;:6;;;;;;;;;;:22;;;2274:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30664:7:::1;;:14;;30643:10;;:17;;:35;:97;;;;;30720:13;;:20;;30699:10;;:17;;:41;30643:97;:157;;;;;30782:11;;:18;;30761:10;;:17;;:39;30643:157;30621:243;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30918:2;30897:10;;:17;;:23;;30875:106;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;30997:11;30992:286;31020:10;;:17;;31014:3;:23;30992:286;;;31070:196;31104:6;31129:10;;31140:3;31129:15;;;;;;;;;;;;;;;31163:7;;31171:3;31163:12;;;;;;;;;;;;;31194:13;;31208:3;31194:18;;;;;;;;;;;;;31231:11;;31243:3;31231:16;;;;;;;;;;;;;31070:15;:196::i;:::-;31039:5;;;;;;;30992:286;;;;30320:965:::0;;;;;;;;;:::o;25020:37::-;;;:::o;25064:25::-;;;;;;;;;;;;;:::o;2712:148::-;2292:12;:10;:12::i;:::-;2282:22;;:6;;;;;;;;;;:22;;;2274:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2819:1:::1;2782:40;;2803:6;::::0;::::1;;;;;;;;2782:40;;;;;;;;;;;;2850:1;2833:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;2712:148::o:0;2070:79::-;2108:7;2135:6;;;;;;;;;;;2128:13;;2070:79;:::o;27694:388::-;27811:10;37856:1;37816:9;:20;37826:9;37816:20;;;;;;;;;;;;;;;:36;;;:41;;37794:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27862:29:::1;:41;27892:10;27862:41;;;;;;;;;;;;;;;;;;;;;;;;;27861:42;27839:119;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;28013:4;27969:29:::0;:41:::1;27999:10;27969:41;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;28033:41;28063:10;28033:41;;;;;;;;;;;;;;;;;;;;27694:388:::0;:::o;36134:523::-;36256:19;36290:23;36328:20;36363:18;36413:25;36441:9;:20;36451:9;36441:20;;;;;;;;;;;;;;;36413:48;;36486:8;:20;;;36472:34;;36535:8;:24;;;36517:42;;36585:8;:21;;;36570:36;;36630:8;:19;;;36617:32;;36134:523;;;;;;:::o;26576:881::-;2292:12;:10;:12::i;:::-;2282:22;;:6;;;;;;;;;;:22;;;2274:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26767:9:::1;37856:1;37816:9;:20;37826:9;37816:20;;;;;;;;;;;;;;;:36;;;:41;;37794:135;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26839:1:::2;26816:25;;:11;:25;;;;26794:98;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;26925:29;:40;26955:9;26925:40;;;;;;;;;;;;;;;;;;;;;;;;;26903:126;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;27126:5;27083:29;:40;27113:9;27083:40;;;;;;;;;;;;;;;;:48;;;;;;;;;;;;;;;;;;27142:17;27162:9;:20;27172:9;27162:20;;;;;;;;;;;;;;;:36;;;27142:56;;27248:1;27209:9;:20;27219:9;27209:20;;;;;;;;;;;;;;;:36;;:40;;;;27282:9;:18;;;27301:11;27314:9;27282:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;27260:122;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;27415:9;27398:51;;;27426:11;27439:9;27398:51;;;;;;;;;;;;;;;;;;;;;;;;;;37940:1;2352::::1;26576:881:::0;;:::o;37418:220::-;37540:17;37590:29;:40;37620:9;37590:40;;;;;;;;;;;;;;;;;;;;;;;;;37575:55;;37418:220;;;:::o;3015:244::-;2292:12;:10;:12::i;:::-;2282:22;;:6;;;;;;;;;;:22;;;2274:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3124:1:::1;3104:22;;:8;:22;;;;3096:73;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3214:8;3185:38;;3206:6;::::0;::::1;;;;;;;;3185:38;;;;;;;;;;;;3243:8;3234:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;3015:244:::0;:::o;37007:218::-;37122:23;37181:9;:20;37191:9;37181:20;;;;;;;;;;;;;;;:36;;;37163:54;;37007:218;;;:::o;624:106::-;677:15;712:10;705:17;;624:106;:::o;4653:136::-;4711:7;4738:43;4742:1;4745;4738:43;;;;;;;;;;;;;;;;;:3;:43::i;:::-;4731:50;;4653:136;;;;:::o;35163:644::-;35251:16;35285:25;35313:9;:20;35323:9;35313:20;;;;;;;;;;;;;;;35285:48;;35355:8;:21;;;35348:3;:28;35344:456;;35413:1;35402:12;;35344:456;;;35452:8;:19;;;35445:3;:26;35441:359;;35508:8;:20;;;35497:31;;35441:359;;;35579:18;35600:30;35608:8;:21;;;35600:3;:7;;:30;;;;:::i;:::-;35579:51;;35645:17;35665:46;35689:8;:21;;;35665:8;:19;;;:23;;:46;;;;:::i;:::-;35645:66;;35737:51;35778:9;35737:36;35762:10;35737:8;:20;;;:24;;:36;;;;:::i;:::-;:40;;:51;;;;:::i;:::-;35726:62;;35441:359;;;35344:456;35163:644;;;;:::o;5092:192::-;5178:7;5211:1;5206;:6;;5214:12;5198:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5238:9;5254:1;5250;:5;5238:17;;5275:1;5268:8;;;5092:192;;;;;:::o;5543:471::-;5601:7;5851:1;5846;:6;5842:47;;;5876:1;5869:8;;;;5842:47;5901:9;5917:1;5913;:5;5901:17;;5946:1;5941;5937;:5;;;;;;:10;5929:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6005:1;5998:8;;;5543:471;;;;;:::o;6490:132::-;6548:7;6575:39;6579:1;6582;6575:39;;;;;;;;;;;;;;;;;:3;:39::i;:::-;6568:46;;6490:132;;;;:::o;7118:278::-;7204:7;7236:1;7232;:5;7239:12;7224:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7263:9;7279:1;7275;:5;;;;;;7263:17;;7387:1;7380:8;;;7118:278;;;;;:::o
Swarm Source
ipfs://3a614fc555c43a31cbccbf1637c9819b3b9e0c046763a63e177c993617c2e54b
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
ETH | 100.00% | $0.884556 | 407,080.6325 | $360,085.62 |
Loading...
Loading
[ 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.