Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 133 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Lock | 21072548 | 2 days ago | IN | 0 ETH | 0.00253391 | ||||
Lock | 21070988 | 2 days ago | IN | 0 ETH | 0.0008974 | ||||
Lock | 21070837 | 2 days ago | IN | 0 ETH | 0.00100849 | ||||
Lock | 21070829 | 2 days ago | IN | 0 ETH | 0.00110946 | ||||
Lock | 21070821 | 2 days ago | IN | 0 ETH | 0.00122125 | ||||
Lock | 21070815 | 2 days ago | IN | 0 ETH | 0.00114988 | ||||
Lock | 21070714 | 2 days ago | IN | 0 ETH | 0.00086613 | ||||
Lock | 21063732 | 3 days ago | IN | 0 ETH | 0.00172698 | ||||
Lock | 21013537 | 10 days ago | IN | 0 ETH | 0.00101252 | ||||
Lock | 21013487 | 10 days ago | IN | 0 ETH | 0.00095667 | ||||
Lock | 20980305 | 15 days ago | IN | 0 ETH | 0.00144945 | ||||
Lock | 20980273 | 15 days ago | IN | 0 ETH | 0.00207325 | ||||
Lock | 20977195 | 15 days ago | IN | 0 ETH | 0.00157577 | ||||
Lock | 20977194 | 15 days ago | IN | 0 ETH | 0.00158584 | ||||
Lock | 20947798 | 20 days ago | IN | 0 ETH | 0.00100348 | ||||
Lock | 20935415 | 21 days ago | IN | 0 ETH | 0.00158789 | ||||
Lock | 20926283 | 23 days ago | IN | 0 ETH | 0.00139422 | ||||
Lock | 20921000 | 23 days ago | IN | 0 ETH | 0.00043787 | ||||
Lock | 20920996 | 23 days ago | IN | 0 ETH | 0.0022979 | ||||
Lock | 20913717 | 24 days ago | IN | 0 ETH | 0.00671386 | ||||
Lock | 20840942 | 35 days ago | IN | 0 ETH | 0.00181003 | ||||
Lock | 20840526 | 35 days ago | IN | 0 ETH | 0.00155869 | ||||
Lock | 20829383 | 36 days ago | IN | 0 ETH | 0.0037728 | ||||
Lock | 20829376 | 36 days ago | IN | 0 ETH | 0.00361206 | ||||
Lock | 20829361 | 36 days ago | IN | 0 ETH | 0.00481562 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Name:
LakeVestingPrivate
Compiler Version
v0.8.21+commit.d9974bed
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-10-12 */ // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v5.0.0) (utils/Address.sol) pragma solidity ^0.8.20; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev The ETH balance of the account is not enough to perform the operation. */ error AddressInsufficientBalance(address account); /** * @dev There's no code at `target` (it is not a contract). */ error AddressEmptyCode(address target); /** * @dev A call to an address target failed. The target may have reverted. */ error FailedInnerCall(); /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.8.20/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { if (address(this).balance < amount) { revert AddressInsufficientBalance(address(this)); } (bool success, ) = recipient.call{value: amount}(""); if (!success) { revert FailedInnerCall(); } } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason or custom error, it is bubbled * up by this function (like regular Solidity function calls). However, if * the call reverted with no returned reason, this function reverts with a * {FailedInnerCall} error. * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCallWithValue(target, data, 0); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { if (address(this).balance < value) { revert AddressInsufficientBalance(address(this)); } (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResultFromTarget(target, success, returndata); } /** * @dev Tool to verify that a low level call to smart-contract was successful, and reverts if the target * was not a contract or bubbling up the revert reason (falling back to {FailedInnerCall}) in case of an * unsuccessful call. */ function verifyCallResultFromTarget( address target, bool success, bytes memory returndata ) internal view returns (bytes memory) { if (!success) { _revert(returndata); } else { // only check if target is a contract if the call was successful and the return data is empty // otherwise we already know that it was a contract if (returndata.length == 0 && target.code.length == 0) { revert AddressEmptyCode(target); } return returndata; } } /** * @dev Tool to verify that a low level call was successful, and reverts if it wasn't, either by bubbling the * revert reason or with a default {FailedInnerCall} error. */ function verifyCallResult(bool success, bytes memory returndata) internal pure returns (bytes memory) { if (!success) { _revert(returndata); } else { return returndata; } } /** * @dev Reverts with returndata if present. Otherwise reverts with {FailedInnerCall}. */ function _revert(bytes memory returndata) private pure { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly /// @solidity memory-safe-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert FailedInnerCall(); } } } // File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Permit.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Permit.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612]. * * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't * need to send a transaction, and thus is not required to hold Ether at all. * * ==== Security Considerations * * There are two important considerations concerning the use of `permit`. The first is that a valid permit signature * expresses an allowance, and it should not be assumed to convey additional meaning. In particular, it should not be * considered as an intention to spend the allowance in any specific way. The second is that because permits have * built-in replay protection and can be submitted by anyone, they can be frontrun. A protocol that uses permits should * take this into consideration and allow a `permit` call to fail. Combining these two aspects, a pattern that may be * generally recommended is: * * ```solidity * function doThingWithPermit(..., uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) public { * try token.permit(msg.sender, address(this), value, deadline, v, r, s) {} catch {} * doThing(..., value); * } * * function doThing(..., uint256 value) public { * token.safeTransferFrom(msg.sender, address(this), value); * ... * } * ``` * * Observe that: 1) `msg.sender` is used as the owner, leaving no ambiguity as to the signer intent, and 2) the use of * `try/catch` allows the permit to fail and makes the code tolerant to frontrunning. (See also * {SafeERC20-safeTransferFrom}). * * Additionally, note that smart contract wallets (such as Argent or Safe) are not able to produce permit signatures, so * contracts should have entry points that don't rely on permit. */ interface IERC20Permit { /** * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens, * given ``owner``'s signed approval. * * IMPORTANT: The same issues {IERC20-approve} has related to transaction * ordering also apply here. * * Emits an {Approval} event. * * Requirements: * * - `spender` cannot be the zero address. * - `deadline` must be a timestamp in the future. * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner` * over the EIP712-formatted function arguments. * - the signature must use ``owner``'s current nonce (see {nonces}). * * For more information on the signature format, see the * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP * section]. * * CAUTION: See Security Considerations above. */ function permit( address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s ) external; /** * @dev Returns the current nonce for `owner`. This value must be * included whenever a signature is generated for {permit}. * * Every successful call to {permit} increases ``owner``'s nonce by one. This * prevents a signature from being used multiple times. */ function nonces(address owner) external view returns (uint256); /** * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}. */ // solhint-disable-next-line func-name-mixedcase function DOMAIN_SEPARATOR() external view returns (bytes32); } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @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); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) 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 a `value` amount of tokens 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 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); } // File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/utils/SafeERC20.sol) pragma solidity ^0.8.20; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; /** * @dev An operation with an ERC20 token failed. */ error SafeERC20FailedOperation(address token); /** * @dev Indicates a failed `decreaseAllowance` request. */ error SafeERC20FailedDecreaseAllowance(address spender, uint256 currentAllowance, uint256 requestedDecrease); /** * @dev Transfer `value` amount of `token` from the calling contract to `to`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeTransfer(IERC20 token, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transfer, (to, value))); } /** * @dev Transfer `value` amount of `token` from `from` to `to`, spending the approval given by `from` to the * calling contract. If `token` returns no value, non-reverting calls are assumed to be successful. */ function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { _callOptionalReturn(token, abi.encodeCall(token.transferFrom, (from, to, value))); } /** * @dev Increase the calling contract's allowance toward `spender` by `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. */ function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 oldAllowance = token.allowance(address(this), spender); forceApprove(token, spender, oldAllowance + value); } /** * @dev Decrease the calling contract's allowance toward `spender` by `requestedDecrease`. If `token` returns no * value, non-reverting calls are assumed to be successful. */ function safeDecreaseAllowance(IERC20 token, address spender, uint256 requestedDecrease) internal { unchecked { uint256 currentAllowance = token.allowance(address(this), spender); if (currentAllowance < requestedDecrease) { revert SafeERC20FailedDecreaseAllowance(spender, currentAllowance, requestedDecrease); } forceApprove(token, spender, currentAllowance - requestedDecrease); } } /** * @dev Set the calling contract's allowance toward `spender` to `value`. If `token` returns no value, * non-reverting calls are assumed to be successful. Meant to be used with tokens that require the approval * to be set to zero before setting it to a non-zero value, such as USDT. */ function forceApprove(IERC20 token, address spender, uint256 value) internal { bytes memory approvalCall = abi.encodeCall(token.approve, (spender, value)); if (!_callOptionalReturnBool(token, approvalCall)) { _callOptionalReturn(token, abi.encodeCall(token.approve, (spender, 0))); _callOptionalReturn(token, approvalCall); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address-functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data); if (returndata.length != 0 && !abi.decode(returndata, (bool))) { revert SafeERC20FailedOperation(address(token)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). * * This is a variant of {_callOptionalReturn} that silents catches all reverts and returns a bool instead. */ function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We cannot use {Address-functionCall} here since this should return false // and not revert is the subcall reverts. (bool success, bytes memory returndata) = address(token).call(data); return success && (returndata.length == 0 || abi.decode(returndata, (bool))) && address(token).code.length > 0; } } // File: LAKE_Vesting_Private.sol pragma solidity = 0.8.21; interface Token { function balanceOf(address) external view returns(uint); } /* LOCKING WITH REWARDS CONTRACT - Allows to deposit [DEPOSIT_TOKEN_ADDRESS] - Allows to claim and withdraw [TOKEN_ADDRESS] - Each user goes through 3 phases: - Everything locked - Claiming Mode: Divided in [TOTAL_WITHDRAWS] periods - Unlocking Mode: Divided in [TOTAL_WITHDRAWS] periods - Each phase has a duration of [FULL_LOCKUP_PERIOD] - Claiming is only available once per period during the Claiming Mode, and has a max amount to be claimed equal to [MAX_MONTHLY_REWARDS] - Unlocking is only available once per period during the Unlocking Mode, and will also claim the claimable rewards (up to [MAX_MONTHLY_REWARDS]) - The last unlock will unlock and claim all the non-unlocked and non-claimed tokens without limit - To claim for the first time, user has to wait for [FULL_LOCKUP_PERIOD] + [TIME_1_MONTH_ADJUSTED] - To unlock for the first time, user has to wait for [FULL_LOCKUP_PERIOD] * 2 + [TIME_1_MONTH_ADJUSTED] - The total claimed amount must be 100% of the deposited amount. Meaning the total amount received at the end by an user must be 200% of the deposited amount - Naming of rewards: - Claimable rewards: Amount of rewards that can be redeemed - Pending rewards: Amount of generated rewards less the already claimed rewards - Generated rewards: Amount of generated rewards since tokens were deposited by the user - Times considerations for phases & periods: - 1 month = 30 days - 1 year = 12 months of 30 days */ contract LakeVestingPrivate { address public immutable TOKEN_ADDRESS; // ERC20 withdraw token contract address address public immutable DEPOSIT_TOKEN_ADDRESS; // ERC20 deposit token contract address address public constant BURN_ADDRESS = 0x000000000000000000000000000000000000dEaD; // Burn address uint256 public constant FULL_LOCKUP_PERIOD = 360 days; // Time for each phase = 360 days uint256 public constant TIME_1_MONTH_ADJUSTED = 30 days; // Time for each period = 30 days uint256 public constant TOTAL_WITHDRAWS = 12; // Num periods = Max number of withdraws/claims = 12 uint8 public constant TOKEN_RATIO = 2; // Amount of tokens to be claimed + withdrawn has to be 2 times the amount deposited uint256 public totalDeposited; // Total amount deposited uint256 public totalPendingToGet; // Total amount deposited * 2 - Total amount withdrawn or claimed (Total amount pending to be gotten by users from the contract) uint256 public constant REWARD_RATE = 6666; // 66.66% APY uint256 public constant REWARD_INTERVAL = 365 days; uint256 public constant MAX_MONTHLY_REWARDS = 1e5 ether; mapping(address => uint64) public lockingTime; // Depositing time by an address mapping(address => uint256) public depositedAmount; // Total deposited ERC-20 tokens by an address mapping(address => uint256) public remainingAmount; // Remaining locked ERC-20 tokens by an address [deposited - withdrawn] mapping(address => uint256) public withdrawnAmount; // Total unlocked ERC-20 tokens by an address mapping(address => uint256) public claimedAmount; // Total claimed ERC-20 tokens (as rewards) by an address [ MAX(claimedAmount) = depositedAmount ] // bool[23] --> last month not needed mapping(address => bool[TOTAL_WITHDRAWS * 2 - 1]) private monthlyClaim; // Indicate if the user already claimed during the current period event Locked(address indexed, uint256 indexed amount); event Unlocked(address indexed, uint256 indexed amount); event Claimed(address indexed, uint256 indexed amount); constructor(address _lockToken, address _unlockToken) { require(_lockToken != address(0) && _unlockToken != address(0), "Null address"); DEPOSIT_TOKEN_ADDRESS = _lockToken; TOKEN_ADDRESS = _unlockToken; } /* Allows to deposit tokens [DEPOSIT_TOKEN_ADDRESS] @param amount: Amount to deposit. */ function lock(uint256 amount) external { require(depositedAmount[msg.sender] == 0, "Already locked tokens"); require(amount > 0, "Cannot deposit 0 tokens"); /* Check the contract holds enough tokens to withdraw by doing a externall call "balanceOf()", which is a view function from a trusted contract (LAK3 token contract), avoiding "checks-effects-interactions" pattern violation risks */ require(Token(TOKEN_ADDRESS).balanceOf(address(this)) >= (TOKEN_RATIO * amount) + totalPendingToGet , "Contract does not hold enough tokens"); depositedAmount[msg.sender] = amount; remainingAmount[msg.sender] = amount; lockingTime[msg.sender] = uint64(block.timestamp); totalDeposited += amount; totalPendingToGet += TOKEN_RATIO * amount; SafeERC20.safeTransferFrom(IERC20(DEPOSIT_TOKEN_ADDRESS), msg.sender, BURN_ADDRESS, amount); emit Locked(msg.sender, amount); } /* Allows to withdraw all unlockable tokens [TOKEN_ADDRESS], as well as claim all claimable rewards [TOKEN_ADDRESS] */ function unLock() external { uint256 _amount = getUnlockableAmount(msg.sender); require(_amount > 0, "Nothing to unlock"); uint256 _rewards = getClaimableRewards(msg.sender); if ( block.timestamp - lockingTime[msg.sender] < FULL_LOCKUP_PERIOD * 3 ) { uint256 currentPeriodIndex = (block.timestamp - lockingTime[msg.sender] - FULL_LOCKUP_PERIOD) / TIME_1_MONTH_ADJUSTED; monthlyClaim[msg.sender][currentPeriodIndex - 1] = true; } /* underflow/overflow cannot happen: - Max of _rewards = Max of _amount = remainingAmount - Max of withdrawnAmount = Max of claimedAmount = depositedAmount - Max of (_amount + _rewards) = totalPendingToGet */ unchecked { claimedAmount[msg.sender] += _rewards; remainingAmount[msg.sender] -= _amount; withdrawnAmount[msg.sender] += _amount; totalPendingToGet -= (_amount + _rewards); } _amount += _rewards; SafeERC20.safeTransfer(IERC20(TOKEN_ADDRESS), msg.sender, _amount); emit Unlocked(msg.sender, _amount); } /* Allows to claim all claimable rewards [TOKEN_ADDRESS] */ function claim() external { require(isInClaimingMode(msg.sender), "Not claiming period"); uint256 _toSend = getClaimableRewards(msg.sender); require(_toSend > 0, "Nothing to claim"); uint256 currentPeriodIndex = (block.timestamp - lockingTime[msg.sender] - FULL_LOCKUP_PERIOD) / TIME_1_MONTH_ADJUSTED; monthlyClaim[msg.sender][currentPeriodIndex - 1] = true; /* underflow/overflow cannot happen: - Max of _toSend = deposited - Max of _toSend = totalPendingToGet */ unchecked { claimedAmount[msg.sender] += _toSend; totalPendingToGet -= _toSend; } SafeERC20.safeTransfer(IERC20(TOKEN_ADDRESS), msg.sender, _toSend); emit Claimed(msg.sender, _toSend); } /* Get the amount of claimable rewards [TOKEN_ADDRESS] @param _wallet: Address to check */ function getClaimableRewards(address _wallet) public view returns (uint256) { if ( block.timestamp - lockingTime[_wallet] < FULL_LOCKUP_PERIOD + TIME_1_MONTH_ADJUSTED ) return 0; uint256 claimableAmount = getPendingRewards(_wallet); // Check the monthly limit if (block.timestamp - lockingTime[_wallet] < FULL_LOCKUP_PERIOD * 3) { uint256 currentPeriodIndex = (block.timestamp - lockingTime[_wallet] - FULL_LOCKUP_PERIOD) / TIME_1_MONTH_ADJUSTED; if (monthlyClaim[_wallet][currentPeriodIndex - 1]) return 0; if (claimableAmount > MAX_MONTHLY_REWARDS) claimableAmount = MAX_MONTHLY_REWARDS; } return claimableAmount; } /* Get the amount of pending rewards [TOKEN_ADDRESS] @param _wallet: Address to check */ function getPendingRewards(address _wallet) public view returns (uint256) { if (remainingAmount[_wallet] == 0) return 0; uint256 pendingRewards = getGeneratedRewards(_wallet); /* underflow/overflow cannot happen: - pendingRewards is always >= claimedAmount */ unchecked { pendingRewards -= claimedAmount[_wallet]; } return pendingRewards; } /* Get the amount of generated rewards [TOKEN_ADDRESS] @param _wallet: Address to check */ function getGeneratedRewards(address _wallet) public view returns (uint256) { if (remainingAmount[_wallet] == 0) return 0; uint256 generatedRewards; if ( // >= 18 months (540 days) --> all the rewards are generated (100% of the deposited amount) block.timestamp - lockingTime[_wallet] >= FULL_LOCKUP_PERIOD + (FULL_LOCKUP_PERIOD / 2) ) { generatedRewards = depositedAmount[_wallet]; } else { // < 18 months --> Needs calculation (66.66% APY) uint256 timeDiff = block.timestamp - lockingTime[_wallet]; generatedRewards = (((depositedAmount[_wallet] * REWARD_RATE) / 1e4) * timeDiff) / REWARD_INTERVAL; } return generatedRewards; } /* Get the amount of unlockable tokens [TOKEN_ADDRESS] @param _wallet: Address to check */ function getUnlockableAmount(address _wallet) public view returns (uint256) { if (remainingAmount[_wallet] == 0) return 0; if (!isInUnlockingMode(_wallet)) return 0; uint256 numWithdraws = getNumUnlockPeriods(_wallet); uint256 _toSend = (numWithdraws * depositedAmount[_wallet]) / TOTAL_WITHDRAWS - withdrawnAmount[_wallet]; if ( _toSend > remainingAmount[_wallet] || remainingAmount[_wallet] - _toSend < numWithdraws // decimals check (for the last withdraw) - 0,000000000000000012 ) { _toSend = remainingAmount[_wallet]; } return _toSend; } /* Get the number of unlockable periods (30 days) @param _wallet: Address to check */ function getNumUnlockPeriods(address _wallet) internal view returns (uint256) { return (block.timestamp - lockingTime[_wallet] - (FULL_LOCKUP_PERIOD * 2)) / TIME_1_MONTH_ADJUSTED; } /* Get if is in the claiming phase or not @param _wallet: Address to check */ function isInClaimingMode(address _wallet) public view returns (bool) { if (remainingAmount[_wallet] == 0) return false; return (block.timestamp - lockingTime[_wallet] >= FULL_LOCKUP_PERIOD + TIME_1_MONTH_ADJUSTED) && (block.timestamp - lockingTime[_wallet] < FULL_LOCKUP_PERIOD * 2 + TIME_1_MONTH_ADJUSTED); } /* Get if is in the unlocking phase or not @param _wallet: Address to check */ function isInUnlockingMode(address _wallet) public view returns (bool) { if (remainingAmount[_wallet] == 0) return false; return (block.timestamp - lockingTime[_wallet] >= FULL_LOCKUP_PERIOD * 2 + TIME_1_MONTH_ADJUSTED); } /* Get the time (in seconds) till the next unlock @param _wallet: Address to check returns 0 if remaining tokens is 0 returns 0 if unlockable amount is greater than 0 */ function getTimeUntilNextUnlock(address _wallet) public view returns (uint256) { uint _res = 0; if ( remainingAmount[_wallet] == 0 || getUnlockableAmount(_wallet) > 0 ){ // must return 0 } else if (!isInUnlockingMode(_wallet)){ _res = lockingTime[_wallet] + FULL_LOCKUP_PERIOD * 2 + TIME_1_MONTH_ADJUSTED - block.timestamp; } else { uint256 numPeriods = getNumUnlockPeriods(_wallet); _res = lockingTime[_wallet] + (FULL_LOCKUP_PERIOD * 2) + (numPeriods + 1) * TIME_1_MONTH_ADJUSTED - block.timestamp; } return _res; } /* Get the time (in seconds) till the next claim @param _wallet: Address to check returns 0 if remaining tokens is 0 returns 0 if claimable amount is greater than 0 returns 0 if unlocking phase is completed */ function getTimeUntilNextClaim(address _wallet) external view returns (uint256) { uint256 _res = 0; if ( remainingAmount[_wallet] == 0 || block.timestamp - lockingTime[_wallet] >= FULL_LOCKUP_PERIOD * 3 || getClaimableRewards(_wallet) > 0 ){ // must return 0 } else if (isInUnlockingMode(_wallet)) { _res = getTimeUntilNextUnlock(_wallet); } else if (isInClaimingMode(_wallet)) { uint256 numPeriods = (block.timestamp - lockingTime[_wallet] - FULL_LOCKUP_PERIOD) / TIME_1_MONTH_ADJUSTED; _res = lockingTime[_wallet] + FULL_LOCKUP_PERIOD + (numPeriods + 1) * TIME_1_MONTH_ADJUSTED - block.timestamp; } else { _res = lockingTime[_wallet] + FULL_LOCKUP_PERIOD + TIME_1_MONTH_ADJUSTED - block.timestamp; } return _res; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_lockToken","type":"address"},{"internalType":"address","name":"_unlockToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unlocked","type":"event"},{"inputs":[],"name":"BURN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FULL_LOCKUP_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MONTHLY_REWARDS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_INTERVAL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"REWARD_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TIME_1_MONTH_ADJUSTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_RATIO","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_WITHDRAWS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"depositedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getClaimableRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getGeneratedRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getTimeUntilNextClaim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getTimeUntilNextUnlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"getUnlockableAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isInClaimingMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"isInUnlockingMode","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"lock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lockingTime","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"remainingAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDeposited","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPendingToGet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"withdrawnAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
60c060405234801562000010575f80fd5b5060405162002b8438038062002b848339818101604052810190620000369190620001b6565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141580156200009f57505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614155b620000e1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620000d89062000259565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff16815250508073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050505062000279565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620001808262000155565b9050919050565b620001928162000174565b81146200019d575f80fd5b50565b5f81519050620001b08162000187565b92915050565b5f8060408385031215620001cf57620001ce62000151565b5b5f620001de85828601620001a0565b9250506020620001f185828601620001a0565b9150509250929050565b5f82825260208201905092915050565b7f4e756c6c206164647265737300000000000000000000000000000000000000005f82015250565b5f62000241600c83620001fb565b91506200024e826200020b565b602082019050919050565b5f6020820190508181035f830152620002728162000233565b9050919050565b60805160a0516128cd620002b75f395f8181611407015261170a01525f81816107a301528181610d2f015281816115090152611c4801526128cd5ff3fe608060405234801561000f575f80fd5b50600436106101c2575f3560e01c80635dbdda69116100f7578063dd46706411610095578063f3c0f4d71161006f578063f3c0f4d714610544578063f6ed201714610562578063fccc281314610592578063ff50abdc146105b0576101c2565b8063dd467064146104ee578063e680be4d1461050a578063ed10e33c1461053a576101c2565b8063900e2b26116100d1578063900e2b2614610464578063bf6a67b914610482578063c2d975a9146104b2578063d8d818eb146104d0576101c2565b80635dbdda69146103f85780636d07b7e5146104165780636fe5db1414610446576101c2565b806344227d35116101645780635043dc9e1161013e5780635043dc9e1461035c578063596b2b841461038c5780635997bb37146103aa5780635a849419146103c8576101c2565b806344227d35146102f25780634a4643f7146103225780634e71d92d14610352576101c2565b806310b20139116101a057806310b20139146102445780632293f97314610274578063308e401e146102925780633fbb2c01146102c2576101c2565b806304e86903146101c657806309afda18146101f65780630bdf530014610226575b5f80fd5b6101e060048036038101906101db91906121a6565b6105ce565b6040516101ed91906121e9565b60405180910390f35b610210600480360381019061020b91906121a6565b6105e3565b60405161021d91906121e9565b60405180910390f35b61022e6107a1565b60405161023b9190612211565b60405180910390f35b61025e600480360381019061025991906121a6565b6107c5565b60405161026b91906121e9565b60405180910390f35b61027c6107da565b60405161028991906121e9565b60405180910390f35b6102ac60048036038101906102a791906121a6565b6107e1565b6040516102b991906121e9565b60405180910390f35b6102dc60048036038101906102d791906121a6565b610a24565b6040516102e9919061224c565b60405180910390f35b61030c600480360381019061030791906121a6565b610a48565b604051610319919061227f565b60405180910390f35b61033c600480360381019061033791906121a6565b610b24565b60405161034991906121e9565b60405180910390f35b61035a610b39565b005b610376600480360381019061037191906121a6565b610d9d565b60405161038391906121e9565b60405180910390f35b610394610fa4565b6040516103a191906121e9565b60405180910390f35b6103b2610fac565b6040516103bf91906121e9565b60405180910390f35b6103e260048036038101906103dd91906121a6565b610fb2565b6040516103ef91906121e9565b60405180910390f35b610400610fc7565b60405161040d91906121e9565b60405180910390f35b610430600480360381019061042b91906121a6565b610fcf565b60405161043d91906121e9565b60405180910390f35b61044e61128f565b60405161045b91906121e9565b60405180910390f35b61046c61129d565b60405161047991906121e9565b60405180910390f35b61049c600480360381019061049791906121a6565b6112a2565b6040516104a9919061227f565b60405180910390f35b6104ba611400565b6040516104c791906122b3565b60405180910390f35b6104d8611405565b6040516104e59190612211565b60405180910390f35b610508600480360381019061050391906122f6565b611429565b005b610524600480360381019061051f91906121a6565b61177a565b60405161053191906121e9565b60405180910390f35b61054261196b565b005b61054c611cb6565b60405161055991906121e9565b60405180910390f35b61057c600480360381019061057791906121a6565b611cbc565b60405161058991906121e9565b60405180910390f35b61059a611d61565b6040516105a79190612211565b60405180910390f35b6105b8611d67565b6040516105c591906121e9565b60405180910390f35b6006602052805f5260405f205f915090505481565b5f805f90505f60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054148061063a57505f6106388461177a565b115b6107985761064783610a48565b6106e1574262278d0060026301da9c00610661919061234e565b60025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff166106c6919061238f565b6106d0919061238f565b6106da91906123c2565b9050610797565b5f6106eb84611d6c565b90504262278d006001836106ff919061238f565b610709919061234e565b60026301da9c0061071a919061234e565b60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1661077f919061238f565b610789919061238f565b61079391906123c2565b9150505b5b80915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6005602052805f5260405f205f915090505481565b62278d0081565b5f62278d006301da9c006107f5919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261085b91906123c2565b1015610869575f9050610a1f565b5f61087383611cbc565b905060036301da9c00610886919061234e565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16426108ec91906123c2565b1015610a1a575f62278d006301da9c0060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261096291906123c2565b61096c91906123c2565b6109769190612422565b905060075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001826109c291906123c2565b601781106109d3576109d2612452565b5b602091828204019190069054906101000a900460ff16156109f8575f92505050610a1f565b69152d02c7e14af6800000821115610a185769152d02c7e14af680000091505b505b809150505b919050565b6002602052805f5260405f205f915054906101000a900467ffffffffffffffff1681565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610a95575f9050610b1f565b62278d0060026301da9c00610aaa919061234e565b610ab4919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610b1a91906123c2565b101590505b919050565b6003602052805f5260405f205f915090505481565b610b42336112a2565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b78906124d9565b60405180910390fd5b5f610b8b336107e1565b90505f8111610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc690612541565b60405180910390fd5b5f62278d006301da9c0060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610c3f91906123c2565b610c4991906123c2565b610c539190612422565b9050600160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600183610ca191906123c2565b60178110610cb257610cb1612452565b5b602091828204019190066101000a81548160ff0219169083151502179055508160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160015f8282540392505081905550610d557f00000000000000000000000000000000000000000000000000000000000000003384611e03565b813373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a60405160405180910390a35050565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610dea575f9050610f9f565b5f60026301da9c00610dfc9190612422565b6301da9c00610e0b919061238f565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610e7191906123c2565b10610ebb5760035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050610f9a565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610f2291906123c2565b90506301e1338081612710611a0a60035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610f78919061234e565b610f829190612422565b610f8c919061234e565b610f969190612422565b9150505b809150505b919050565b6301da9c0081565b611a0a81565b6004602052805f5260405f205f915090505481565b6301e1338081565b5f805f90505f60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541480611094575060036301da9c0061102b919061234e565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261109191906123c2565b10155b806110a657505f6110a4846107e1565b115b611286576110b383610a48565b156110c8576110c1836105e3565b9050611285565b6110d1836112a2565b156111fe575f62278d006301da9c0060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261114691906123c2565b61115091906123c2565b61115a9190612422565b90504262278d0060018361116e919061238f565b611178919061234e565b6301da9c0060025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff166111e2919061238f565b6111ec919061238f565b6111f691906123c2565b915050611284565b4262278d006301da9c0060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1661126d919061238f565b611277919061238f565b61128191906123c2565b90505b5b5b80915050919050565b69152d02c7e14af680000081565b600c81565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036112ef575f90506113fb565b62278d006301da9c00611302919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261136891906123c2565b101580156113f8575062278d0060026301da9c00611386919061234e565b611390919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16426113f691906123c2565b105b90505b919050565b600281565b7f000000000000000000000000000000000000000000000000000000000000000081565b5f60035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054146114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f906125a9565b60405180910390fd5b5f81116114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190612611565b60405180910390fd5b60015481600260ff166114fd919061234e565b611507919061238f565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115609190612211565b602060405180830381865afa15801561157b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f9190612643565b10156115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d7906126de565b60405180910390fd5b8060035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550805f808282546116d7919061238f565b9250508190555080600260ff166116ee919061234e565b60015f8282546116fe919061238f565b925050819055506117337f00000000000000000000000000000000000000000000000000000000000000003361dead84611e82565b803373ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860405160405180910390a350565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036117c7575f9050611966565b6117d082610a48565b6117dc575f9050611966565b5f6117e683611d6c565b90505f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600c60035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205484611872919061234e565b61187c9190612422565b61188691906123c2565b905060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481118061191a5750818160045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461191891906123c2565b105b156119605760045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505b80925050505b919050565b5f6119753361177a565b90505f81116119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090612746565b60405180910390fd5b5f6119c3336107e1565b905060036301da9c006119d6919061234e565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642611a3c91906123c2565b1015611b46575f62278d006301da9c0060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642611ab291906123c2565b611abc91906123c2565b611ac69190612422565b9050600160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600183611b1491906123c2565b60178110611b2557611b24612452565b5b602091828204019190066101000a81548160ff021916908315150217905550505b8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055508160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555080820160015f82825403925050819055508082611c41919061238f565b9150611c6e7f00000000000000000000000000000000000000000000000000000000000000003384611e03565b813373ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d60405160405180910390a35050565b60015481565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403611d09575f9050611d5c565b5f611d1383610d9d565b905060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481039050809150505b919050565b61dead81565b5f5481565b5f62278d0060026301da9c00611d82919061234e565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642611de891906123c2565b611df291906123c2565b611dfc9190612422565b9050919050565b611e7d838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611e36929190612764565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f04565b505050565b611efe848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401611eb79392919061278b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f04565b50505050565b5f611f2e828473ffffffffffffffffffffffffffffffffffffffff16611f9990919063ffffffff16565b90505f815114158015611f52575080806020019051810190611f5091906127ea565b155b15611f9457826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611f8b9190612211565b60405180910390fd5b505050565b6060611fa683835f611fae565b905092915050565b606081471015611ff557306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611fec9190612211565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161201d9190612881565b5f6040518083038185875af1925050503d805f8114612057576040519150601f19603f3d011682016040523d82523d5f602084013e61205c565b606091505b509150915061206c868383612077565b925050509392505050565b60608261208c5761208782612104565b6120fc565b5f82511480156120b257505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156120f457836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016120eb9190612211565b60405180910390fd5b8190506120fd565b5b9392505050565b5f815111156121165780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6121758261214c565b9050919050565b6121858161216b565b811461218f575f80fd5b50565b5f813590506121a08161217c565b92915050565b5f602082840312156121bb576121ba612148565b5b5f6121c884828501612192565b91505092915050565b5f819050919050565b6121e3816121d1565b82525050565b5f6020820190506121fc5f8301846121da565b92915050565b61220b8161216b565b82525050565b5f6020820190506122245f830184612202565b92915050565b5f67ffffffffffffffff82169050919050565b6122468161222a565b82525050565b5f60208201905061225f5f83018461223d565b92915050565b5f8115159050919050565b61227981612265565b82525050565b5f6020820190506122925f830184612270565b92915050565b5f60ff82169050919050565b6122ad81612298565b82525050565b5f6020820190506122c65f8301846122a4565b92915050565b6122d5816121d1565b81146122df575f80fd5b50565b5f813590506122f0816122cc565b92915050565b5f6020828403121561230b5761230a612148565b5b5f612318848285016122e2565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612358826121d1565b9150612363836121d1565b9250828202612371816121d1565b9150828204841483151761238857612387612321565b5b5092915050565b5f612399826121d1565b91506123a4836121d1565b92508282019050808211156123bc576123bb612321565b5b92915050565b5f6123cc826121d1565b91506123d7836121d1565b92508282039050818111156123ef576123ee612321565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61242c826121d1565b9150612437836121d1565b925082612447576124466123f5565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b7f4e6f7420636c61696d696e6720706572696f64000000000000000000000000005f82015250565b5f6124c360138361247f565b91506124ce8261248f565b602082019050919050565b5f6020820190508181035f8301526124f0816124b7565b9050919050565b7f4e6f7468696e6720746f20636c61696d000000000000000000000000000000005f82015250565b5f61252b60108361247f565b9150612536826124f7565b602082019050919050565b5f6020820190508181035f8301526125588161251f565b9050919050565b7f416c7265616479206c6f636b656420746f6b656e7300000000000000000000005f82015250565b5f61259360158361247f565b915061259e8261255f565b602082019050919050565b5f6020820190508181035f8301526125c081612587565b9050919050565b7f43616e6e6f74206465706f736974203020746f6b656e730000000000000000005f82015250565b5f6125fb60178361247f565b9150612606826125c7565b602082019050919050565b5f6020820190508181035f830152612628816125ef565b9050919050565b5f8151905061263d816122cc565b92915050565b5f6020828403121561265857612657612148565b5b5f6126658482850161262f565b91505092915050565b7f436f6e747261637420646f6573206e6f7420686f6c6420656e6f75676820746f5f8201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b5f6126c860248361247f565b91506126d38261266e565b604082019050919050565b5f6020820190508181035f8301526126f5816126bc565b9050919050565b7f4e6f7468696e6720746f20756e6c6f636b0000000000000000000000000000005f82015250565b5f61273060118361247f565b915061273b826126fc565b602082019050919050565b5f6020820190508181035f83015261275d81612724565b9050919050565b5f6040820190506127775f830185612202565b61278460208301846121da565b9392505050565b5f60608201905061279e5f830186612202565b6127ab6020830185612202565b6127b860408301846121da565b949350505050565b6127c981612265565b81146127d3575f80fd5b50565b5f815190506127e4816127c0565b92915050565b5f602082840312156127ff576127fe612148565b5b5f61280c848285016127d6565b91505092915050565b5f81519050919050565b5f81905092915050565b5f5b8381101561284657808201518184015260208101905061282b565b5f8484015250505050565b5f61285b82612815565b612865818561281f565b9350612875818560208601612829565b80840191505092915050565b5f61288c8284612851565b91508190509291505056fea26469706673582212206333d7788fa5644e342ab0c604145fd9f7f19201f0f631cc4f807ef5d033d32164736f6c63430008150033000000000000000000000000bb2ed33bf0dd4b8a4abf4b091bfbf499341ba6c600000000000000000000000013d074303c95a34d304f29928dc8a16dec797e9e
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101c2575f3560e01c80635dbdda69116100f7578063dd46706411610095578063f3c0f4d71161006f578063f3c0f4d714610544578063f6ed201714610562578063fccc281314610592578063ff50abdc146105b0576101c2565b8063dd467064146104ee578063e680be4d1461050a578063ed10e33c1461053a576101c2565b8063900e2b26116100d1578063900e2b2614610464578063bf6a67b914610482578063c2d975a9146104b2578063d8d818eb146104d0576101c2565b80635dbdda69146103f85780636d07b7e5146104165780636fe5db1414610446576101c2565b806344227d35116101645780635043dc9e1161013e5780635043dc9e1461035c578063596b2b841461038c5780635997bb37146103aa5780635a849419146103c8576101c2565b806344227d35146102f25780634a4643f7146103225780634e71d92d14610352576101c2565b806310b20139116101a057806310b20139146102445780632293f97314610274578063308e401e146102925780633fbb2c01146102c2576101c2565b806304e86903146101c657806309afda18146101f65780630bdf530014610226575b5f80fd5b6101e060048036038101906101db91906121a6565b6105ce565b6040516101ed91906121e9565b60405180910390f35b610210600480360381019061020b91906121a6565b6105e3565b60405161021d91906121e9565b60405180910390f35b61022e6107a1565b60405161023b9190612211565b60405180910390f35b61025e600480360381019061025991906121a6565b6107c5565b60405161026b91906121e9565b60405180910390f35b61027c6107da565b60405161028991906121e9565b60405180910390f35b6102ac60048036038101906102a791906121a6565b6107e1565b6040516102b991906121e9565b60405180910390f35b6102dc60048036038101906102d791906121a6565b610a24565b6040516102e9919061224c565b60405180910390f35b61030c600480360381019061030791906121a6565b610a48565b604051610319919061227f565b60405180910390f35b61033c600480360381019061033791906121a6565b610b24565b60405161034991906121e9565b60405180910390f35b61035a610b39565b005b610376600480360381019061037191906121a6565b610d9d565b60405161038391906121e9565b60405180910390f35b610394610fa4565b6040516103a191906121e9565b60405180910390f35b6103b2610fac565b6040516103bf91906121e9565b60405180910390f35b6103e260048036038101906103dd91906121a6565b610fb2565b6040516103ef91906121e9565b60405180910390f35b610400610fc7565b60405161040d91906121e9565b60405180910390f35b610430600480360381019061042b91906121a6565b610fcf565b60405161043d91906121e9565b60405180910390f35b61044e61128f565b60405161045b91906121e9565b60405180910390f35b61046c61129d565b60405161047991906121e9565b60405180910390f35b61049c600480360381019061049791906121a6565b6112a2565b6040516104a9919061227f565b60405180910390f35b6104ba611400565b6040516104c791906122b3565b60405180910390f35b6104d8611405565b6040516104e59190612211565b60405180910390f35b610508600480360381019061050391906122f6565b611429565b005b610524600480360381019061051f91906121a6565b61177a565b60405161053191906121e9565b60405180910390f35b61054261196b565b005b61054c611cb6565b60405161055991906121e9565b60405180910390f35b61057c600480360381019061057791906121a6565b611cbc565b60405161058991906121e9565b60405180910390f35b61059a611d61565b6040516105a79190612211565b60405180910390f35b6105b8611d67565b6040516105c591906121e9565b60405180910390f35b6006602052805f5260405f205f915090505481565b5f805f90505f60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054148061063a57505f6106388461177a565b115b6107985761064783610a48565b6106e1574262278d0060026301da9c00610661919061234e565b60025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff166106c6919061238f565b6106d0919061238f565b6106da91906123c2565b9050610797565b5f6106eb84611d6c565b90504262278d006001836106ff919061238f565b610709919061234e565b60026301da9c0061071a919061234e565b60025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1661077f919061238f565b610789919061238f565b61079391906123c2565b9150505b5b80915050919050565b7f00000000000000000000000013d074303c95a34d304f29928dc8a16dec797e9e81565b6005602052805f5260405f205f915090505481565b62278d0081565b5f62278d006301da9c006107f5919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261085b91906123c2565b1015610869575f9050610a1f565b5f61087383611cbc565b905060036301da9c00610886919061234e565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16426108ec91906123c2565b1015610a1a575f62278d006301da9c0060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261096291906123c2565b61096c91906123c2565b6109769190612422565b905060075f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206001826109c291906123c2565b601781106109d3576109d2612452565b5b602091828204019190069054906101000a900460ff16156109f8575f92505050610a1f565b69152d02c7e14af6800000821115610a185769152d02c7e14af680000091505b505b809150505b919050565b6002602052805f5260405f205f915054906101000a900467ffffffffffffffff1681565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610a95575f9050610b1f565b62278d0060026301da9c00610aaa919061234e565b610ab4919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610b1a91906123c2565b101590505b919050565b6003602052805f5260405f205f915090505481565b610b42336112a2565b610b81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b78906124d9565b60405180910390fd5b5f610b8b336107e1565b90505f8111610bcf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc690612541565b60405180910390fd5b5f62278d006301da9c0060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610c3f91906123c2565b610c4991906123c2565b610c539190612422565b9050600160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600183610ca191906123c2565b60178110610cb257610cb1612452565b5b602091828204019190066101000a81548160ff0219169083151502179055508160065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160015f8282540392505081905550610d557f00000000000000000000000013d074303c95a34d304f29928dc8a16dec797e9e3384611e03565b813373ffffffffffffffffffffffffffffffffffffffff167fd8138f8a3f377c5259ca548e70e4c2de94f129f5a11036a15b69513cba2b426a60405160405180910390a35050565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403610dea575f9050610f9f565b5f60026301da9c00610dfc9190612422565b6301da9c00610e0b919061238f565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610e7191906123c2565b10610ebb5760035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050610f9a565b5f60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642610f2291906123c2565b90506301e1338081612710611a0a60035f8973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610f78919061234e565b610f829190612422565b610f8c919061234e565b610f969190612422565b9150505b809150505b919050565b6301da9c0081565b611a0a81565b6004602052805f5260405f205f915090505481565b6301e1338081565b5f805f90505f60045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541480611094575060036301da9c0061102b919061234e565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261109191906123c2565b10155b806110a657505f6110a4846107e1565b115b611286576110b383610a48565b156110c8576110c1836105e3565b9050611285565b6110d1836112a2565b156111fe575f62278d006301da9c0060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261114691906123c2565b61115091906123c2565b61115a9190612422565b90504262278d0060018361116e919061238f565b611178919061234e565b6301da9c0060025f8873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff166111e2919061238f565b6111ec919061238f565b6111f691906123c2565b915050611284565b4262278d006301da9c0060025f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1661126d919061238f565b611277919061238f565b61128191906123c2565b90505b5b5b80915050919050565b69152d02c7e14af680000081565b600c81565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036112ef575f90506113fb565b62278d006301da9c00611302919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff164261136891906123c2565b101580156113f8575062278d0060026301da9c00611386919061234e565b611390919061238f565b60025f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff16426113f691906123c2565b105b90505b919050565b600281565b7f000000000000000000000000bb2ed33bf0dd4b8a4abf4b091bfbf499341ba6c681565b5f60035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054146114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f906125a9565b60405180910390fd5b5f81116114ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114e190612611565b60405180910390fd5b60015481600260ff166114fd919061234e565b611507919061238f565b7f00000000000000000000000013d074303c95a34d304f29928dc8a16dec797e9e73ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016115609190612211565b602060405180830381865afa15801561157b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061159f9190612643565b10156115e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115d7906126de565b60405180910390fd5b8060035f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055504260025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550805f808282546116d7919061238f565b9250508190555080600260ff166116ee919061234e565b60015f8282546116fe919061238f565b925050819055506117337f000000000000000000000000bb2ed33bf0dd4b8a4abf4b091bfbf499341ba6c63361dead84611e82565b803373ffffffffffffffffffffffffffffffffffffffff167f9f1ec8c880f76798e7b793325d625e9b60e4082a553c98f42b6cda368dd6000860405160405180910390a350565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054036117c7575f9050611966565b6117d082610a48565b6117dc575f9050611966565b5f6117e683611d6c565b90505f60055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054600c60035f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205484611872919061234e565b61187c9190612422565b61188691906123c2565b905060045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481118061191a5750818160045f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461191891906123c2565b105b156119605760045f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505b80925050505b919050565b5f6119753361177a565b90505f81116119b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b090612746565b60405180910390fd5b5f6119c3336107e1565b905060036301da9c006119d6919061234e565b60025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642611a3c91906123c2565b1015611b46575f62278d006301da9c0060025f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642611ab291906123c2565b611abc91906123c2565b611ac69190612422565b9050600160075f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600183611b1491906123c2565b60178110611b2557611b24612452565b5b602091828204019190066101000a81548160ff021916908315150217905550505b8060065f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825401925050819055508160045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825403925050819055508160055f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254019250508190555080820160015f82825403925050819055508082611c41919061238f565b9150611c6e7f00000000000000000000000013d074303c95a34d304f29928dc8a16dec797e9e3384611e03565b813373ffffffffffffffffffffffffffffffffffffffff167f0f0bc5b519ddefdd8e5f9e6423433aa2b869738de2ae34d58ebc796fc749fa0d60405160405180910390a35050565b60015481565b5f8060045f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205403611d09575f9050611d5c565b5f611d1383610d9d565b905060065f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205481039050809150505b919050565b61dead81565b5f5481565b5f62278d0060026301da9c00611d82919061234e565b60025f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900467ffffffffffffffff1667ffffffffffffffff1642611de891906123c2565b611df291906123c2565b611dfc9190612422565b9050919050565b611e7d838473ffffffffffffffffffffffffffffffffffffffff1663a9059cbb8585604051602401611e36929190612764565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f04565b505050565b611efe848573ffffffffffffffffffffffffffffffffffffffff166323b872dd868686604051602401611eb79392919061278b565b604051602081830303815290604052915060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611f04565b50505050565b5f611f2e828473ffffffffffffffffffffffffffffffffffffffff16611f9990919063ffffffff16565b90505f815114158015611f52575080806020019051810190611f5091906127ea565b155b15611f9457826040517f5274afe7000000000000000000000000000000000000000000000000000000008152600401611f8b9190612211565b60405180910390fd5b505050565b6060611fa683835f611fae565b905092915050565b606081471015611ff557306040517fcd786059000000000000000000000000000000000000000000000000000000008152600401611fec9190612211565b60405180910390fd5b5f808573ffffffffffffffffffffffffffffffffffffffff16848660405161201d9190612881565b5f6040518083038185875af1925050503d805f8114612057576040519150601f19603f3d011682016040523d82523d5f602084013e61205c565b606091505b509150915061206c868383612077565b925050509392505050565b60608261208c5761208782612104565b6120fc565b5f82511480156120b257505f8473ffffffffffffffffffffffffffffffffffffffff163b145b156120f457836040517f9996b3150000000000000000000000000000000000000000000000000000000081526004016120eb9190612211565b60405180910390fd5b8190506120fd565b5b9392505050565b5f815111156121165780518082602001fd5b6040517f1425ea4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6121758261214c565b9050919050565b6121858161216b565b811461218f575f80fd5b50565b5f813590506121a08161217c565b92915050565b5f602082840312156121bb576121ba612148565b5b5f6121c884828501612192565b91505092915050565b5f819050919050565b6121e3816121d1565b82525050565b5f6020820190506121fc5f8301846121da565b92915050565b61220b8161216b565b82525050565b5f6020820190506122245f830184612202565b92915050565b5f67ffffffffffffffff82169050919050565b6122468161222a565b82525050565b5f60208201905061225f5f83018461223d565b92915050565b5f8115159050919050565b61227981612265565b82525050565b5f6020820190506122925f830184612270565b92915050565b5f60ff82169050919050565b6122ad81612298565b82525050565b5f6020820190506122c65f8301846122a4565b92915050565b6122d5816121d1565b81146122df575f80fd5b50565b5f813590506122f0816122cc565b92915050565b5f6020828403121561230b5761230a612148565b5b5f612318848285016122e2565b91505092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f612358826121d1565b9150612363836121d1565b9250828202612371816121d1565b9150828204841483151761238857612387612321565b5b5092915050565b5f612399826121d1565b91506123a4836121d1565b92508282019050808211156123bc576123bb612321565b5b92915050565b5f6123cc826121d1565b91506123d7836121d1565b92508282039050818111156123ef576123ee612321565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f61242c826121d1565b9150612437836121d1565b925082612447576124466123f5565b5b828204905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f82825260208201905092915050565b7f4e6f7420636c61696d696e6720706572696f64000000000000000000000000005f82015250565b5f6124c360138361247f565b91506124ce8261248f565b602082019050919050565b5f6020820190508181035f8301526124f0816124b7565b9050919050565b7f4e6f7468696e6720746f20636c61696d000000000000000000000000000000005f82015250565b5f61252b60108361247f565b9150612536826124f7565b602082019050919050565b5f6020820190508181035f8301526125588161251f565b9050919050565b7f416c7265616479206c6f636b656420746f6b656e7300000000000000000000005f82015250565b5f61259360158361247f565b915061259e8261255f565b602082019050919050565b5f6020820190508181035f8301526125c081612587565b9050919050565b7f43616e6e6f74206465706f736974203020746f6b656e730000000000000000005f82015250565b5f6125fb60178361247f565b9150612606826125c7565b602082019050919050565b5f6020820190508181035f830152612628816125ef565b9050919050565b5f8151905061263d816122cc565b92915050565b5f6020828403121561265857612657612148565b5b5f6126658482850161262f565b91505092915050565b7f436f6e747261637420646f6573206e6f7420686f6c6420656e6f75676820746f5f8201527f6b656e7300000000000000000000000000000000000000000000000000000000602082015250565b5f6126c860248361247f565b91506126d38261266e565b604082019050919050565b5f6020820190508181035f8301526126f5816126bc565b9050919050565b7f4e6f7468696e6720746f20756e6c6f636b0000000000000000000000000000005f82015250565b5f61273060118361247f565b915061273b826126fc565b602082019050919050565b5f6020820190508181035f83015261275d81612724565b9050919050565b5f6040820190506127775f830185612202565b61278460208301846121da565b9392505050565b5f60608201905061279e5f830186612202565b6127ab6020830185612202565b6127b860408301846121da565b949350505050565b6127c981612265565b81146127d3575f80fd5b50565b5f815190506127e4816127c0565b92915050565b5f602082840312156127ff576127fe612148565b5b5f61280c848285016127d6565b91505092915050565b5f81519050919050565b5f81905092915050565b5f5b8381101561284657808201518184015260208101905061282b565b5f8484015250505050565b5f61285b82612815565b612865818561281f565b9350612875818560208601612829565b80840191505092915050565b5f61288c8284612851565b91508190509291505056fea26469706673582212206333d7788fa5644e342ab0c604145fd9f7f19201f0f631cc4f807ef5d033d32164736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000bb2ed33bf0dd4b8a4abf4b091bfbf499341ba6c600000000000000000000000013d074303c95a34d304f29928dc8a16dec797e9e
-----Decoded View---------------
Arg [0] : _lockToken (address): 0xBb2ed33BF0dD4b8a4ABF4b091bfbF499341bA6C6
Arg [1] : _unlockToken (address): 0x13d074303C95a34d304F29928dC8A16dEc797e9E
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000bb2ed33bf0dd4b8a4abf4b091bfbf499341ba6c6
Arg [1] : 00000000000000000000000013d074303c95a34d304f29928dc8a16dec797e9e
Deployed Bytecode Sourcemap
20778:12958:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22475:48;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31489:870;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20813:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22372:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21208:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26799:837;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22049:45;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31023:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22139:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25813:867;;;:::i;:::-;;28330:860;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21110:53;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21863:42;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22243:50;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21926;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32612:1121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21985:55;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21306:44;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30523:393;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21423:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20900:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23357:976;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29309:720;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24475:1255;;;:::i;:::-;;21662:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27753:458;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20994:90;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21572:29;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22475:48;;;;;;;;;;;;;;;;;:::o;31489:870::-;31586:7;31614:9;31626:1;31614:13;;31684:1;31656:15;:24;31672:7;31656:24;;;;;;;;;;;;;;;;:29;:78;;;;31733:1;31702:28;31722:7;31702:19;:28::i;:::-;:32;31656:78;31638:681;;31799:26;31817:7;31799:17;:26::i;:::-;31794:525;;32000:15;21256:7;31932:1;21155:8;31891:42;;;;:::i;:::-;31848:11;:20;31860:7;31848:20;;;;;;;;;;;;;;;;;;;;;;;;;:85;;;;;;:::i;:::-;:129;;;;:::i;:::-;:167;;;;:::i;:::-;31841:174;;31794:525;;;32048:18;32069:28;32089:7;32069:19;:28::i;:::-;32048:49;;32292:15;21256:7;32223:1;32210:10;:14;;;;:::i;:::-;32209:60;;;;:::i;:::-;32184:1;21155:8;32163:22;;;;:::i;:::-;32119:11;:20;32131:7;32119:20;;;;;;;;;;;;;;;;;;;;;;;;;:67;;;;;;:::i;:::-;:150;;;;:::i;:::-;:188;;;;:::i;:::-;32112:195;;32033:286;31794:525;31638:681;32337:4;32330:11;;;31489:870;;;:::o;20813:38::-;;;:::o;22372:50::-;;;;;;;;;;;;;;;;;:::o;21208:55::-;21256:7;21208:55;:::o;26799:837::-;26893:7;21256;21155:8;26990:42;;;;:::i;:::-;26954:11;:20;26966:7;26954:20;;;;;;;;;;;;;;;;;;;;;;;;;26936:38;;:15;:38;;;;:::i;:::-;:96;26918:134;;;27051:1;27044:8;;;;26918:134;27065:23;27091:26;27109:7;27091:17;:26::i;:::-;27065:52;;27232:1;21155:8;27211:22;;;;:::i;:::-;27188:11;:20;27200:7;27188:20;;;;;;;;;;;;;;;;;;;;;;;;;27170:38;;:15;:38;;;;:::i;:::-;:63;27166:430;;;27250:26;21256:7;21155:8;27315:11;:20;27327:7;27315:20;;;;;;;;;;;;;;;;;;;;;;;;;27280:55;;:15;:55;;;;:::i;:::-;:93;;;;:::i;:::-;27279:119;;;;:::i;:::-;27250:148;;27417:12;:21;27430:7;27417:21;;;;;;;;;;;;;;;27460:1;27439:18;:22;;;;:::i;:::-;27417:45;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;27413:59;;;27471:1;27464:8;;;;;;27413:59;22031:9;27491:15;:37;27487:97;;;22031:9;27547:37;;27487:97;27235:361;27166:430;27613:15;27606:22;;;26799:837;;;;:::o;22049:45::-;;;;;;;;;;;;;;;;;;;;;;:::o;31023:258::-;31088:4;31137:1;31109:15;:24;31125:7;31109:24;;;;;;;;;;;;;;;;:29;31105:47;;31147:5;31140:12;;;;31105:47;21256:7;31247:1;21155:8;31226:22;;;;:::i;:::-;:46;;;;:::i;:::-;31189:11;:20;31201:7;31189:20;;;;;;;;;;;;;;;;;;;;;;;;;31171:38;;:15;:38;;;;:::i;:::-;:101;;31163:110;;31023:258;;;;:::o;22139:50::-;;;;;;;;;;;;;;;;;:::o;25813:867::-;25858:28;25875:10;25858:16;:28::i;:::-;25850:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;25923:15;25941:31;25961:10;25941:19;:31::i;:::-;25923:49;;26003:1;25993:7;:11;25985:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;26038:26;21256:7;21155:8;26099:11;:23;26111:10;26099:23;;;;;;;;;;;;;;;;;;;;;;;;;26068:54;;:15;:54;;;;:::i;:::-;:88;;;;:::i;:::-;26067:114;;;;:::i;:::-;26038:143;;26257:4;26206:12;:24;26219:10;26206:24;;;;;;;;;;;;;;;26252:1;26231:18;:22;;;;:::i;:::-;26206:48;;;;;;;:::i;:::-;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;26478:7;26449:13;:25;26463:10;26449:25;;;;;;;;;;;;;;;;:36;;;;;;;;;;;26521:7;26500:17;;:28;;;;;;;;;;;26560:66;26590:13;26606:10;26618:7;26560:22;:66::i;:::-;26664:7;26652:10;26644:28;;;;;;;;;;;;25839:841;;25813:867::o;28330:860::-;28424:7;28481:1;28453:15;:24;28469:7;28453:24;;;;;;;;;;;;;;;;:29;28449:43;;28491:1;28484:8;;;;28449:43;28503:24;28761:1;21155:8;28740:22;;;;:::i;:::-;21155:8;28718:45;;;;:::i;:::-;28681:11;:20;28693:7;28681:20;;;;;;;;;;;;;;;;;;;;;;;;;28663:38;;:15;:38;;;;:::i;:::-;:100;28540:607;;28809:15;:24;28825:7;28809:24;;;;;;;;;;;;;;;;28790:43;;28540:607;;;28929:16;28966:11;:20;28978:7;28966:20;;;;;;;;;;;;;;;;;;;;;;;;;28948:38;;:15;:38;;;;:::i;:::-;28929:57;;21968:8;29091;29084:3;21901:4;29042:15;:24;29058:7;29042:24;;;;;;;;;;;;;;;;:38;;;;:::i;:::-;29041:46;;;;:::i;:::-;29040:59;;;;:::i;:::-;29039:96;;;;:::i;:::-;29003:132;;28851:296;28540:607;29166:16;29159:23;;;28330:860;;;;:::o;21110:53::-;21155:8;21110:53;:::o;21863:42::-;21901:4;21863:42;:::o;22243:50::-;;;;;;;;;;;;;;;;;:::o;21926:::-;21968:8;21926:50;:::o;32612:1121::-;32710:7;32737:12;32752:1;32737:16;;32810:1;32782:15;:24;32798:7;32782:24;;;;;;;;;;;;;;;;:29;:111;;;;32892:1;21155:8;32871:22;;;;:::i;:::-;32847:11;:20;32859:7;32847:20;;;;;;;;;;;;;;;;;;;;;;;;;32829:38;;:15;:38;;;;:::i;:::-;:64;;32782:111;:160;;;;32941:1;32910:28;32930:7;32910:19;:28::i;:::-;:32;32782:160;32764:938;;33005:26;33023:7;33005:17;:26::i;:::-;33001:701;;;33055:31;33078:7;33055:22;:31::i;:::-;33048:38;;33001:701;;;33108:25;33125:7;33108:16;:25::i;:::-;33104:598;;;33150:18;21256:7;21155:8;33207:11;:20;33219:7;33207:20;;;;;;;;;;;;;;;;;;;;;;;;;33172:55;;:15;:55;;;;:::i;:::-;:93;;;;:::i;:::-;33171:119;;;;:::i;:::-;33150:140;;33484:15;21256:7;33421:1;33408:10;:14;;;;:::i;:::-;33407:57;;;;:::i;:::-;21155:8;33329:11;:20;33341:7;33329:20;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;;;:::i;:::-;:135;;;;:::i;:::-;:170;;;;:::i;:::-;33305:194;;33135:376;33104:598;;;33675:15;21256:7;21155:8;33556:11;:20;33568:7;33556:20;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;;;:::i;:::-;:99;;;;:::i;:::-;:134;;;;:::i;:::-;33532:158;;33104:598;33001:701;32764:938;33721:4;33714:11;;;32612:1121;;;:::o;21985:55::-;22031:9;21985:55;:::o;21306:44::-;21348:2;21306:44;:::o;30523:393::-;30587:4;30636:1;30608:15;:24;30624:7;30608:24;;;;;;;;;;;;;;;;:29;30604:47;;30646:5;30639:12;;;;30604:47;21256:7;21155:8;30742:42;;;;:::i;:::-;30701:11;:20;30713:7;30701:20;;;;;;;;;;;;;;;;;;;;;;;;;30683:38;;:15;:38;;;;:::i;:::-;:101;;30682:226;;;;;21256:7;30882:1;21155:8;30861:22;;;;:::i;:::-;:46;;;;:::i;:::-;30821:11;:20;30833:7;30821:20;;;;;;;;;;;;;;;;;;;;;;;;;30803:38;;:15;:38;;;;:::i;:::-;:104;30682:226;30662:246;;30523:393;;;;:::o;21423:37::-;21459:1;21423:37;:::o;20900:46::-;;;:::o;23357:976::-;23446:1;23415:15;:27;23431:10;23415:27;;;;;;;;;;;;;;;;:32;23407:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;23501:1;23492:6;:10;23484:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;23875:17;;23865:6;21459:1;23851:20;;;;;;:::i;:::-;23850:42;;;;:::i;:::-;23807:13;23801:30;;;23840:4;23801:45;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:91;;23793:141;;;;;;;;;;;;:::i;:::-;;;;;;;;;23977:6;23947:15;:27;23963:10;23947:27;;;;;;;;;;;;;;;:36;;;;24024:6;23994:15;:27;24010:10;23994:27;;;;;;;;;;;;;;;:36;;;;24074:15;24041:11;:23;24053:10;24041:23;;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;;;24119:6;24101:14;;:24;;;;;;;:::i;:::-;;;;;;;;24171:6;21459:1;24157:20;;;;;;:::i;:::-;24136:17;;:41;;;;;;;:::i;:::-;;;;;;;;24190:91;24224:21;24248:10;21042:42;24274:6;24190:26;:91::i;:::-;24318:6;24306:10;24299:26;;;;;;;;;;;;23357:976;:::o;29309:720::-;29403:7;29460:1;29432:15;:24;29448:7;29432:24;;;;;;;;;;;;;;;;:29;29428:43;;29470:1;29463:8;;;;29428:43;29487:26;29505:7;29487:17;:26::i;:::-;29482:41;;29522:1;29515:8;;;;29482:41;29534:20;29557:28;29577:7;29557:19;:28::i;:::-;29534:51;;29596:15;29702;:24;29718:7;29702:24;;;;;;;;;;;;;;;;21348:2;29630:15;:24;29646:7;29630:24;;;;;;;;;;;;;;;;29615:12;:39;;;;:::i;:::-;29614:72;;;;:::i;:::-;:112;;;;:::i;:::-;29596:130;;29767:15;:24;29783:7;29767:24;;;;;;;;;;;;;;;;29757:7;:34;:100;;;;29845:12;29835:7;29808:15;:24;29824:7;29808:24;;;;;;;;;;;;;;;;:34;;;;:::i;:::-;:49;29757:100;29739:256;;;29959:15;:24;29975:7;29959:24;;;;;;;;;;;;;;;;29949:34;;29739:256;30014:7;30007:14;;;;29309:720;;;;:::o;24475:1255::-;24513:15;24531:31;24551:10;24531:19;:31::i;:::-;24513:49;;24591:1;24581:7;:11;24573:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;24627:16;24646:31;24666:10;24646:19;:31::i;:::-;24627:50;;24783:1;21155:8;24762:22;;;;:::i;:::-;24736:11;:23;24748:10;24736:23;;;;;;;;;;;;;;;;;;;;;;;;;24718:41;;:15;:41;;;;:::i;:::-;:66;24700:344;;;24811:26;21256:7;21155:8;24876:11;:23;24888:10;24876:23;;;;;;;;;;;;;;;;;;;;;;;;;24841:58;;:15;:58;;;;:::i;:::-;:96;;;;:::i;:::-;24840:122;;;;:::i;:::-;24811:151;;25028:4;24977:12;:24;24990:10;24977:24;;;;;;;;;;;;;;;25023:1;25002:18;:22;;;;:::i;:::-;24977:48;;;;;;;:::i;:::-;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;24796:248;24700:344;25377:8;25348:13;:25;25362:10;25348:25;;;;;;;;;;;;;;;;:37;;;;;;;;;;;25431:7;25400:15;:27;25416:10;25400:27;;;;;;;;;;;;;;;;:38;;;;;;;;;;;25484:7;25453:15;:27;25469:10;25453:27;;;;;;;;;;;;;;;;:38;;;;;;;;;;;25538:8;25528:7;:18;25506:17;;:41;;;;;;;;;;;25580:8;25569:19;;;;;:::i;:::-;;;25609:66;25639:13;25655:10;25667:7;25609:22;:66::i;:::-;25714:7;25702:10;25693:29;;;;;;;;;;;;24502:1228;;24475:1255::o;21662:32::-;;;;:::o;27753:458::-;27818:7;27870:1;27842:15;:24;27858:7;27842:24;;;;;;;;;;;;;;;;:29;27838:43;;27880:1;27873:8;;;;27838:43;27894:22;27919:28;27939:7;27919:19;:28::i;:::-;27894:53;;28126:13;:22;28140:7;28126:22;;;;;;;;;;;;;;;;28108:40;;;;28189:14;28182:21;;;27753:458;;;;:::o;20994:90::-;21042:42;20994:90;:::o;21572:29::-;;;;:::o;30143:274::-;30239:7;21256;30382:1;21155:8;30361:22;;;;:::i;:::-;30320:11;:20;30332:7;30320:20;;;;;;;;;;;;;;;;;;;;;;;;;30285:55;;:15;:55;;;;:::i;:::-;:99;;;;:::i;:::-;30284:125;;;;:::i;:::-;30264:145;;30143:274;;;:::o;14499:162::-;14582:71;14602:5;14624;:14;;;14641:2;14645:5;14609:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14582:19;:71::i;:::-;14499:162;;;:::o;14906:190::-;15007:81;15027:5;15049;:18;;;15070:4;15076:2;15080:5;15034:53;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15007:19;:81::i;:::-;14906:190;;;;:::o;17310:638::-;17734:23;17760:33;17788:4;17768:5;17760:27;;;;:33;;;;:::i;:::-;17734:59;;17829:1;17808:10;:17;:22;;:57;;;;;17846:10;17835:30;;;;;;;;;;;;:::i;:::-;17834:31;17808:57;17804:137;;;17922:5;17889:40;;;;;;;;;;;:::i;:::-;;;;;;;;17804:137;17380:568;17310:638;;:::o;2797:153::-;2872:12;2904:38;2926:6;2934:4;2940:1;2904:21;:38::i;:::-;2897:45;;2797:153;;;;:::o;3285:398::-;3384:12;3437:5;3413:21;:29;3409:110;;;3501:4;3466:41;;;;;;;;;;;:::i;:::-;;;;;;;;3409:110;3530:12;3544:23;3571:6;:11;;3590:5;3597:4;3571:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3529:73;;;;3620:55;3647:6;3655:7;3664:10;3620:26;:55::i;:::-;3613:62;;;;3285:398;;;;;:::o;4761:597::-;4909:12;4939:7;4934:417;;4963:19;4971:10;4963:7;:19::i;:::-;4934:417;;;5212:1;5191:10;:17;:22;:49;;;;;5239:1;5217:6;:18;;;:23;5191:49;5187:121;;;5285:6;5268:24;;;;;;;;;;;:::i;:::-;;;;;;;;5187:121;5329:10;5322:17;;;;4934:417;4761:597;;;;;;:::o;5911:528::-;6064:1;6044:10;:17;:21;6040:392;;;6276:10;6270:17;6333:15;6320:10;6316:2;6312:19;6305:44;6040:392;6403:17;;;;;;;;;;;;;;88:117:1;197:1;194;187:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:77::-;1213:7;1242:5;1231:16;;1176:77;;;:::o;1259:118::-;1346:24;1364:5;1346:24;:::i;:::-;1341:3;1334:37;1259:118;;:::o;1383:222::-;1476:4;1514:2;1503:9;1499:18;1491:26;;1527:71;1595:1;1584:9;1580:17;1571:6;1527:71;:::i;:::-;1383:222;;;;:::o;1611:118::-;1698:24;1716:5;1698:24;:::i;:::-;1693:3;1686:37;1611:118;;:::o;1735:222::-;1828:4;1866:2;1855:9;1851:18;1843:26;;1879:71;1947:1;1936:9;1932:17;1923:6;1879:71;:::i;:::-;1735:222;;;;:::o;1963:101::-;1999:7;2039:18;2032:5;2028:30;2017:41;;1963:101;;;:::o;2070:115::-;2155:23;2172:5;2155:23;:::i;:::-;2150:3;2143:36;2070:115;;:::o;2191:218::-;2282:4;2320:2;2309:9;2305:18;2297:26;;2333:69;2399:1;2388:9;2384:17;2375:6;2333:69;:::i;:::-;2191:218;;;;:::o;2415:90::-;2449:7;2492:5;2485:13;2478:21;2467:32;;2415:90;;;:::o;2511:109::-;2592:21;2607:5;2592:21;:::i;:::-;2587:3;2580:34;2511:109;;:::o;2626:210::-;2713:4;2751:2;2740:9;2736:18;2728:26;;2764:65;2826:1;2815:9;2811:17;2802:6;2764:65;:::i;:::-;2626:210;;;;:::o;2842:86::-;2877:7;2917:4;2910:5;2906:16;2895:27;;2842:86;;;:::o;2934:112::-;3017:22;3033:5;3017:22;:::i;:::-;3012:3;3005:35;2934:112;;:::o;3052:214::-;3141:4;3179:2;3168:9;3164:18;3156:26;;3192:67;3256:1;3245:9;3241:17;3232:6;3192:67;:::i;:::-;3052:214;;;;:::o;3272:122::-;3345:24;3363:5;3345:24;:::i;:::-;3338:5;3335:35;3325:63;;3384:1;3381;3374:12;3325:63;3272:122;:::o;3400:139::-;3446:5;3484:6;3471:20;3462:29;;3500:33;3527:5;3500:33;:::i;:::-;3400:139;;;;:::o;3545:329::-;3604:6;3653:2;3641:9;3632:7;3628:23;3624:32;3621:119;;;3659:79;;:::i;:::-;3621:119;3779:1;3804:53;3849:7;3840:6;3829:9;3825:22;3804:53;:::i;:::-;3794:63;;3750:117;3545:329;;;;:::o;3880:180::-;3928:77;3925:1;3918:88;4025:4;4022:1;4015:15;4049:4;4046:1;4039:15;4066:410;4106:7;4129:20;4147:1;4129:20;:::i;:::-;4124:25;;4163:20;4181:1;4163:20;:::i;:::-;4158:25;;4218:1;4215;4211:9;4240:30;4258:11;4240:30;:::i;:::-;4229:41;;4419:1;4410:7;4406:15;4403:1;4400:22;4380:1;4373:9;4353:83;4330:139;;4449:18;;:::i;:::-;4330:139;4114:362;4066:410;;;;:::o;4482:191::-;4522:3;4541:20;4559:1;4541:20;:::i;:::-;4536:25;;4575:20;4593:1;4575:20;:::i;:::-;4570:25;;4618:1;4615;4611:9;4604:16;;4639:3;4636:1;4633:10;4630:36;;;4646:18;;:::i;:::-;4630:36;4482:191;;;;:::o;4679:194::-;4719:4;4739:20;4757:1;4739:20;:::i;:::-;4734:25;;4773:20;4791:1;4773:20;:::i;:::-;4768:25;;4817:1;4814;4810:9;4802:17;;4841:1;4835:4;4832:11;4829:37;;;4846:18;;:::i;:::-;4829:37;4679:194;;;;:::o;4879:180::-;4927:77;4924:1;4917:88;5024:4;5021:1;5014:15;5048:4;5045:1;5038:15;5065:185;5105:1;5122:20;5140:1;5122:20;:::i;:::-;5117:25;;5156:20;5174:1;5156:20;:::i;:::-;5151:25;;5195:1;5185:35;;5200:18;;:::i;:::-;5185:35;5242:1;5239;5235:9;5230:14;;5065:185;;;;:::o;5256:180::-;5304:77;5301:1;5294:88;5401:4;5398:1;5391:15;5425:4;5422:1;5415:15;5442:169;5526:11;5560:6;5555:3;5548:19;5600:4;5595:3;5591:14;5576:29;;5442:169;;;;:::o;5617:::-;5757:21;5753:1;5745:6;5741:14;5734:45;5617:169;:::o;5792:366::-;5934:3;5955:67;6019:2;6014:3;5955:67;:::i;:::-;5948:74;;6031:93;6120:3;6031:93;:::i;:::-;6149:2;6144:3;6140:12;6133:19;;5792:366;;;:::o;6164:419::-;6330:4;6368:2;6357:9;6353:18;6345:26;;6417:9;6411:4;6407:20;6403:1;6392:9;6388:17;6381:47;6445:131;6571:4;6445:131;:::i;:::-;6437:139;;6164:419;;;:::o;6589:166::-;6729:18;6725:1;6717:6;6713:14;6706:42;6589:166;:::o;6761:366::-;6903:3;6924:67;6988:2;6983:3;6924:67;:::i;:::-;6917:74;;7000:93;7089:3;7000:93;:::i;:::-;7118:2;7113:3;7109:12;7102:19;;6761:366;;;:::o;7133:419::-;7299:4;7337:2;7326:9;7322:18;7314:26;;7386:9;7380:4;7376:20;7372:1;7361:9;7357:17;7350:47;7414:131;7540:4;7414:131;:::i;:::-;7406:139;;7133:419;;;:::o;7558:171::-;7698:23;7694:1;7686:6;7682:14;7675:47;7558:171;:::o;7735:366::-;7877:3;7898:67;7962:2;7957:3;7898:67;:::i;:::-;7891:74;;7974:93;8063:3;7974:93;:::i;:::-;8092:2;8087:3;8083:12;8076:19;;7735:366;;;:::o;8107:419::-;8273:4;8311:2;8300:9;8296:18;8288:26;;8360:9;8354:4;8350:20;8346:1;8335:9;8331:17;8324:47;8388:131;8514:4;8388:131;:::i;:::-;8380:139;;8107:419;;;:::o;8532:173::-;8672:25;8668:1;8660:6;8656:14;8649:49;8532:173;:::o;8711:366::-;8853:3;8874:67;8938:2;8933:3;8874:67;:::i;:::-;8867:74;;8950:93;9039:3;8950:93;:::i;:::-;9068:2;9063:3;9059:12;9052:19;;8711:366;;;:::o;9083:419::-;9249:4;9287:2;9276:9;9272:18;9264:26;;9336:9;9330:4;9326:20;9322:1;9311:9;9307:17;9300:47;9364:131;9490:4;9364:131;:::i;:::-;9356:139;;9083:419;;;:::o;9508:143::-;9565:5;9596:6;9590:13;9581:22;;9612:33;9639:5;9612:33;:::i;:::-;9508:143;;;;:::o;9657:351::-;9727:6;9776:2;9764:9;9755:7;9751:23;9747:32;9744:119;;;9782:79;;:::i;:::-;9744:119;9902:1;9927:64;9983:7;9974:6;9963:9;9959:22;9927:64;:::i;:::-;9917:74;;9873:128;9657:351;;;;:::o;10014:223::-;10154:34;10150:1;10142:6;10138:14;10131:58;10223:6;10218:2;10210:6;10206:15;10199:31;10014:223;:::o;10243:366::-;10385:3;10406:67;10470:2;10465:3;10406:67;:::i;:::-;10399:74;;10482:93;10571:3;10482:93;:::i;:::-;10600:2;10595:3;10591:12;10584:19;;10243:366;;;:::o;10615:419::-;10781:4;10819:2;10808:9;10804:18;10796:26;;10868:9;10862:4;10858:20;10854:1;10843:9;10839:17;10832:47;10896:131;11022:4;10896:131;:::i;:::-;10888:139;;10615:419;;;:::o;11040:167::-;11180:19;11176:1;11168:6;11164:14;11157:43;11040:167;:::o;11213:366::-;11355:3;11376:67;11440:2;11435:3;11376:67;:::i;:::-;11369:74;;11452:93;11541:3;11452:93;:::i;:::-;11570:2;11565:3;11561:12;11554:19;;11213:366;;;:::o;11585:419::-;11751:4;11789:2;11778:9;11774:18;11766:26;;11838:9;11832:4;11828:20;11824:1;11813:9;11809:17;11802:47;11866:131;11992:4;11866:131;:::i;:::-;11858:139;;11585:419;;;:::o;12010:332::-;12131:4;12169:2;12158:9;12154:18;12146:26;;12182:71;12250:1;12239:9;12235:17;12226:6;12182:71;:::i;:::-;12263:72;12331:2;12320:9;12316:18;12307:6;12263:72;:::i;:::-;12010:332;;;;;:::o;12348:442::-;12497:4;12535:2;12524:9;12520:18;12512:26;;12548:71;12616:1;12605:9;12601:17;12592:6;12548:71;:::i;:::-;12629:72;12697:2;12686:9;12682:18;12673:6;12629:72;:::i;:::-;12711;12779:2;12768:9;12764:18;12755:6;12711:72;:::i;:::-;12348:442;;;;;;:::o;12796:116::-;12866:21;12881:5;12866:21;:::i;:::-;12859:5;12856:32;12846:60;;12902:1;12899;12892:12;12846:60;12796:116;:::o;12918:137::-;12972:5;13003:6;12997:13;12988:22;;13019:30;13043:5;13019:30;:::i;:::-;12918:137;;;;:::o;13061:345::-;13128:6;13177:2;13165:9;13156:7;13152:23;13148:32;13145:119;;;13183:79;;:::i;:::-;13145:119;13303:1;13328:61;13381:7;13372:6;13361:9;13357:22;13328:61;:::i;:::-;13318:71;;13274:125;13061:345;;;;:::o;13412:98::-;13463:6;13497:5;13491:12;13481:22;;13412:98;;;:::o;13516:147::-;13617:11;13654:3;13639:18;;13516:147;;;;:::o;13669:246::-;13750:1;13760:113;13774:6;13771:1;13768:13;13760:113;;;13859:1;13854:3;13850:11;13844:18;13840:1;13835:3;13831:11;13824:39;13796:2;13793:1;13789:10;13784:15;;13760:113;;;13907:1;13898:6;13893:3;13889:16;13882:27;13731:184;13669:246;;;:::o;13921:386::-;14025:3;14053:38;14085:5;14053:38;:::i;:::-;14107:88;14188:6;14183:3;14107:88;:::i;:::-;14100:95;;14204:65;14262:6;14257:3;14250:4;14243:5;14239:16;14204:65;:::i;:::-;14294:6;14289:3;14285:16;14278:23;;14029:278;13921:386;;;;:::o;14313:271::-;14443:3;14465:93;14554:3;14545:6;14465:93;:::i;:::-;14458:100;;14575:3;14568:10;;14313:271;;;;:::o
Swarm Source
ipfs://6333d7788fa5644e342ab0c604145fd9f7f19201f0f631cc4f807ef5d033d321
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.