Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 255 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Safe Withdraw | 15088169 | 948 days ago | IN | 0 ETH | 0.00116656 | ||||
Release | 15049374 | 954 days ago | IN | 0 ETH | 0.00305067 | ||||
Release | 15045912 | 955 days ago | IN | 0 ETH | 0.0031439 | ||||
Release | 15031876 | 957 days ago | IN | 0 ETH | 0.00241611 | ||||
Release | 14995081 | 964 days ago | IN | 0 ETH | 0.0035917 | ||||
Release | 14994591 | 964 days ago | IN | 0 ETH | 0.00125225 | ||||
Release | 14969637 | 968 days ago | IN | 0 ETH | 0.00550264 | ||||
Release | 14956967 | 971 days ago | IN | 0 ETH | 0.00845858 | ||||
Release | 14954828 | 971 days ago | IN | 0 ETH | 0.01411422 | ||||
Release | 14943033 | 973 days ago | IN | 0 ETH | 0.001601 | ||||
Release | 14897410 | 981 days ago | IN | 0 ETH | 0.00536097 | ||||
Release | 14892402 | 981 days ago | IN | 0 ETH | 0.01056253 | ||||
Release | 14885413 | 983 days ago | IN | 0 ETH | 0.00563135 | ||||
Release | 14885391 | 983 days ago | IN | 0 ETH | 0.00841643 | ||||
Release | 14877540 | 984 days ago | IN | 0 ETH | 0.00231602 | ||||
Release | 14874685 | 984 days ago | IN | 0 ETH | 0.0038548 | ||||
Release | 14865992 | 986 days ago | IN | 0 ETH | 0.00150387 | ||||
Release | 14858865 | 987 days ago | IN | 0 ETH | 0.00176266 | ||||
Release | 14846200 | 989 days ago | IN | 0 ETH | 0.00641772 | ||||
Release | 14842081 | 990 days ago | IN | 0 ETH | 0.00297961 | ||||
Release | 14841574 | 990 days ago | IN | 0 ETH | 0.00138167 | ||||
Release | 14831606 | 991 days ago | IN | 0 ETH | 0.00237772 | ||||
Release | 14828953 | 992 days ago | IN | 0 ETH | 0.00194768 | ||||
Release | 14815699 | 994 days ago | IN | 0 ETH | 0.00252811 | ||||
Release | 14810236 | 995 days ago | IN | 0 ETH | 0.00104695 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
13009716 | 1276 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
UnifarmVesting
Compiler Version
v0.8.0+commit.c7dfd78e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-08-12 */ // Sources flattened with hardhat v2.2.1 https://hardhat.org // File contracts/interfaces/IERC20.sol // SPDX-License-Identifier: MIT pragma solidity 0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } // File contracts/libraries/SafeMath.sol pragma solidity 0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b, string memory errorMessage ) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File contracts/libraries/Address.sol pragma solidity 0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @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://diligence.consensys.net/posts/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.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @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, it is bubbled up by this * function (like regular Solidity function calls). * * 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. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @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`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File contracts/libraries/SafeERC20.sol pragma solidity 0.8.0; /** * @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 SafeMath for uint256; using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn( token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value) ); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender).sub( value, "SafeERC20: decreased allowance below zero" ); _callOptionalReturn( token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance) ); } /** * @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, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } // File contracts/access/Context.sol pragma solidity 0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File contracts/security/Pausable.sol pragma solidity 0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File contracts/access/Ownable.sol pragma solidity 0.8.0; abstract contract Ownable is Pausable { /// @notice store owner. address public owner; /// @notice store superAdmin using for reverting ownership. address public superAdmin; /// @notice OwnershipTransferred emit on each ownership transfered. event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor(address ownerAddress) { owner = ownerAddress; superAdmin = ownerAddress; emit OwnershipTransferred(address(0), owner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyAdmin() { require(superAdmin == _msgSender(), "Ownable: caller is not the admin"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public onlyAdmin { emit OwnershipTransferred(owner, superAdmin); owner = superAdmin; } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); emit OwnershipTransferred(owner, newOwner); owner = newOwner; } } // File contracts/interfaces/IUFARMBeneficiaryBook.sol pragma solidity 0.8.0; abstract contract IUFARMBeneficiaryBook { function isBeneficiary(address account, uint256 insertId) public view virtual returns ( bool, address, uint256 ); } // File contracts/abstract/Factory.sol pragma solidity 0.8.0; abstract contract Factory { address public vestToken; } // File contracts/UnifarmVesting.sol pragma solidity 0.8.0; /** * @title Unifarm Vesting Contract * @dev A token holder contract that can release its token balance gradually like a * typical vesting scheme. * @author OpenDefi by Oropocket. */ contract UnifarmVesting is Ownable { /// @notice use of SafeMath for mathematics operations. using SafeMath for uint256; /// @notice use SafeERC20 for IERC20 (interface of ERC20). using SafeERC20 for IERC20; /// @notice event Released emit on every release which is called by Valid Beneficiary of UFARM. event Released(address indexed beneficiary, uint256 amount, uint256 time); /// @notice event Withdrawal emit on every SafeWithdraw. event Withdrawal(address indexed account, uint256 amount, uint256 time); /// @notice when actually token released will be start. uint256 public cliff; /// @notice vesting start time. uint256 public startTime; /// @notice vesting end time. uint256 public endTime; /// @notice A struct to store beneficiary details. struct Beneficiary { uint256 releasedTokens; uint256 lastRelease; } /// @notice store beneficiary details by its address. mapping(address => Beneficiary) public beneficiaryDetails; /// @notice linear unlocking duration. every period token released. uint256 public unlockDuration; /// @notice UFARM factory. Factory public factory; /// @notice UFARM Beneficiary Book Address. address public bookAddress; /// @notice allowReleaseAll works on special condition when there is no vesting schedule. eg Airdrop. bool public allowReleaseAll; /** * @notice construct a UFARM Vesting Contract. endTime should be greater than cliff period. * @param owner_ owner Address Provided by factory contract. * @param cliff_ cliff duration in seconds. eg 30**86400 for 30 days cliff duration. * @param startTime_ when will be vesting start provided by factory contract. * @param endTime_ when vesting going to be end. eg 360**86400 for 1 year. * @param unlockDuration_ duration of linear unlocking. eg 86400 for 1 day linear unlocking. * @param allowReleaseAll_ allow release All once. * @param factoryAddress_ factory address. */ constructor( address owner_, uint256 cliff_, uint256 startTime_, uint256 endTime_, uint256 unlockDuration_, bool allowReleaseAll_, address factoryAddress_ ) Ownable(owner_) { require( endTime_ > cliff_, "UnifarmVesting: endTime_ should be greater than cliff_ duration." ); cliff = cliff_; startTime = startTime_; endTime = endTime_; unlockDuration = unlockDuration_; allowReleaseAll = allowReleaseAll_; factory = Factory(factoryAddress_); } /** * @notice Transfers vested tokens to beneficiary. function will fail when unverified beneficiary try. * @notice function will failed on when allow release All disabled. * @notice beneficiary will be derived from UFARMBeneficiaryBook Contract. * @param insertId insertId of beneficiary. */ function releaseAll(uint256 insertId) external whenNotPaused { require(allowReleaseAll, "UnifarmVesting: invalid attempt"); (bool isBeneficiary, address vestAddress, uint256 claimTokens) = IUFARMBeneficiaryBook(bookAddress).isBeneficiary(_msgSender(), insertId); require(isBeneficiary, "UnifarmVesting: Invalid Beneficiary"); require(vestAddress == address(this), "UnifarmVesting: Invalid Vesting Address"); require( beneficiaryDetails[_msgSender()].releasedTokens < claimTokens, "UnifarmVesting: no claimable tokens remains" ); beneficiaryDetails[_msgSender()].releasedTokens = beneficiaryDetails[_msgSender()] .releasedTokens .add(claimTokens); beneficiaryDetails[_msgSender()].lastRelease = block.timestamp; address vestTokenAddress = factory.vestToken(); IERC20 vestToken = IERC20(vestTokenAddress); require( IERC20(vestToken).balanceOf(address(this)) > claimTokens, "UnifarmVesting: insufficient balance" ); vestToken.safeTransfer(_msgSender(), claimTokens); emit Released(_msgSender(), claimTokens, _getNow()); } /** * @notice Transfers vested tokens to beneficiary. function will fail when invalid beneficiary tries. * @notice function will fail on when beneficiary try to release during cliff period. * @notice beneficiary will be derived from UFARMBeneficiaryBook Contract. * @param insertId insertId of beneficiary. */ function release(uint256 insertId) external whenNotPaused { require(!allowReleaseAll, "UnifarmVesting: invalid attempt"); (bool isBeneficiary, address vestAddress, uint256 claimTokens) = IUFARMBeneficiaryBook(bookAddress).isBeneficiary(_msgSender(), insertId); require(isBeneficiary, "UnifarmVesting: Invalid Beneficiary"); require(vestAddress == address(this), "UnifarmVesting: Invalid Vesting Address"); require(block.timestamp >= cliff, "UnifarmVesting: cliff period exeception"); require( beneficiaryDetails[_msgSender()].releasedTokens <= claimTokens, "UnifarmVesting: no claimable tokens remains" ); address vestTokenAddress = factory.vestToken(); IERC20 vestToken = IERC20(vestTokenAddress); uint256 unlockedTokens = getUnlockedTokens(_msgSender(), claimTokens); distribute(_msgSender(), unlockedTokens, vestToken); } /** * @notice distribution of tokens. it may be failed on insufficient balance or when user have no unlocked token. * @param holder A beneficiary Address. * @param unlockedTokens No of Unlocked Tokens. */ function distribute( address holder, uint256 unlockedTokens, IERC20 vestToken ) internal { require(unlockedTokens > 0, "UnifarmVesting: You dont have unlocked tokens"); beneficiaryDetails[holder].releasedTokens = beneficiaryDetails[holder].releasedTokens.add( unlockedTokens ); beneficiaryDetails[holder].lastRelease = block.timestamp; require( IERC20(vestToken).balanceOf(address(this)) > unlockedTokens, "UnifarmVesting: insufficient balance" ); vestToken.safeTransfer(holder, unlockedTokens); emit Released(holder, unlockedTokens, block.timestamp); } /** * @notice derived block timestamp. * @return block timestamp. */ function _getNow() internal view returns (uint256) { return block.timestamp; } /** * @notice A View Function for calculating unlock tokens of beneficiary. * @notice We have impose very fancy math here if block.timestamp >= endTime `endTime.sub(lastRelease).div(unlockDuration).mul(eachPeriod)` else `_getNow().sub(lastRelease).div(unlockDuration).mul(eachPeriod)` * @return unlockedTokens (Beneficiary Unlocked Tokens). */ function getUnlockedTokens(address holder, uint256 claimableTokens) internal view returns (uint256 unlockedTokens) { Beneficiary storage user = beneficiaryDetails[holder]; uint256 tokens = paymentSpliter(claimableTokens); uint256 lastRelease = user.lastRelease > 0 ? user.lastRelease : cliff; uint256 eachPeriod = unlockDuration.div(1 days); uint256 unlockedDays; if (_getNow() >= endTime) unlockedDays = ~~endTime.sub(lastRelease).div(unlockDuration).mul(eachPeriod); else unlockedDays = ~~_getNow().sub(lastRelease).div(unlockDuration).mul(eachPeriod); unlockedTokens = tokens.mul(unlockedDays); } /** * @notice payment spliter claim-tokens/diff * @param claim total claimble tokens. * @return tokens no Of tokens he receive every unlock duration. */ function paymentSpliter(uint256 claim) internal view returns (uint256 tokens) { uint256 diff = ~~endTime.sub(cliff); tokens = claim.div(diff.div(unlockDuration)); } /** * @notice set UFARM Beneficiary Address. called by only Owner. * @param bookAddress_ UFARM Beneficiary Book Address. */ function setBeneficiaryBook(address bookAddress_) external onlyOwner { bookAddress = bookAddress_; } /** * @notice safe Withdraw Vest Tokens function will failed on insufficient contract balance. * @notice called by Only Owner. * @param noOfTokens number of tokens to withdraw. */ function safeWithdraw(IERC20 tokenAddress, uint256 noOfTokens) external onlyOwner { require(address(tokenAddress) != address(0), "Invalid Token Address"); require( tokenAddress.balanceOf(address(this)) >= noOfTokens, "UnifarmVesting: Insufficient Balance" ); // send the tokens tokenAddress.safeTransfer(owner, noOfTokens); emit Withdrawal(owner, noOfTokens, _getNow()); } /** * @notice for security concern we will paused this contract. * @return true when not paused. */ function doPause() external onlyOwner returns (bool) { _pause(); return true; } /** * @notice vice-versa action like pause. * @return true when unpaused. */ function doUnpause() external onlyOwner returns (bool) { _unpause(); return true; } /** * @notice update the factory instance called by onlyOwner. * @return true on succeed. */ function updateFactory(address _newFactory) external onlyOwner returns (bool) { require(_newFactory != address(0), "new factory address is zero."); factory = Factory(_newFactory); return true; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"uint256","name":"cliff_","type":"uint256"},{"internalType":"uint256","name":"startTime_","type":"uint256"},{"internalType":"uint256","name":"endTime_","type":"uint256"},{"internalType":"uint256","name":"unlockDuration_","type":"uint256"},{"internalType":"bool","name":"allowReleaseAll_","type":"bool"},{"internalType":"address","name":"factoryAddress_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"beneficiary","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"time","type":"uint256"}],"name":"Withdrawal","type":"event"},{"inputs":[],"name":"allowReleaseAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"beneficiaryDetails","outputs":[{"internalType":"uint256","name":"releasedTokens","type":"uint256"},{"internalType":"uint256","name":"lastRelease","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bookAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cliff","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"doPause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"doUnpause","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"insertId","type":"uint256"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"insertId","type":"uint256"}],"name":"releaseAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"noOfTokens","type":"uint256"}],"name":"safeWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"bookAddress_","type":"address"}],"name":"setBeneficiaryBook","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"superAdmin","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unlockDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newFactory","type":"address"}],"name":"updateFactory","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162001d1038038062001d1083398101604081905262000034916200013f565b600080546001600160a81b0319166101006001600160a01b038a811682810293909317808555600180546001600160a01b0319169094179093556040518b949290930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350858411620000ca5760405162461bcd60e51b8152600401620000c190620001b4565b60405180910390fd5b6002959095556003939093556004919091556006556008805460ff60a01b1916600160a01b92151592909202919091179055600780546001600160a01b0319166001600160a01b039092169190911790555062000212565b80516001600160a01b03811681146200013a57600080fd5b919050565b600080600080600080600060e0888a0312156200015a578283fd5b620001658862000122565b96506020880151955060408801519450606088015193506080880151925060a0880151801515811462000196578283fd5b9150620001a660c0890162000122565b905092959891949750929550565b602080825260409082018190527f556e696661726d56657374696e673a20656e6454696d655f2073686f756c6420908201527f62652067726561746572207468616e20636c6966665f206475726174696f6e2e606082015260800190565b611aee80620002226000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c80635c975abb116100ad5780638da5cb5b116100715780638da5cb5b14610220578063c45a015514610228578063c4788bf414610230578063d9f165dc14610238578063f2fde38b1461024b5761012c565b80635c975abb146101f857806367d0661d14610200578063715018a61461020857806378e97925146102105780638a1fcd60146102185761012c565b806330efb8d3116100f457806330efb8d3146101af5780633197cbb6146101b757806337bdc99b146101bf578063432985b3146101d25780635058c460146101e55761012c565b806313d033c0146101315780632081a3e11461014f578063294a57271461016457806329575f6a146101855780632e7a067b1461019a575b600080fd5b61013961025e565b60405161014691906119d5565b60405180910390f35b61016261015d3660046113db565b610264565b005b61017761017236600461131f565b6105f1565b6040516101469291906119de565b61018d61060a565b6040516101469190611427565b6101a2610619565b6040516101469190611454565b6101a2610629565b610139610673565b6101626101cd3660046113db565b610679565b6101626101e036600461131f565b6108b8565b6101626101f33660046113b0565b610914565b6101a2610a84565b6101a2610a8d565b610162610ad1565b610139610b74565b610139610b7a565b61018d610b80565b61018d610b94565b61018d610ba3565b6101a261024636600461131f565b610bb2565b61016261025936600461131f565b610c38565b60025481565b61026c610a84565b156102925760405162461bcd60e51b815260040161028990611685565b60405180910390fd5b600854600160a01b900460ff166102bb5760405162461bcd60e51b815260040161028990611713565b600854600090819081906001600160a01b03166316a59cce6102db610cfe565b866040518363ffffffff1660e01b81526004016102f992919061143b565b60606040518083038186803b15801561031157600080fd5b505afa158015610325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103499190611371565b9250925092508261036c5760405162461bcd60e51b815260040161028990611992565b6001600160a01b03821630146103945760405162461bcd60e51b815260040161028990611506565b80600560006103a1610cfe565b6001600160a01b03168152602081019190915260400160002054106103d85760405162461bcd60e51b815260040161028990611882565b61040881600560006103e8610cfe565b6001600160a01b0316815260208101919091526040016000205490610d02565b60056000610414610cfe565b6001600160a01b03166001600160a01b03168152602001908152602001600020600001819055504260056000610448610cfe565b6001600160a01b039081168252602080830193909352604091820160009081206001019490945560075482516305c4c8c760e51b8152925191169263b89918e09260048082019391829003018186803b1580156104a457600080fd5b505afa1580156104b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dc919061133b565b6040516370a0823160e01b8152909150819083906001600160a01b038316906370a082319061050f903090600401611427565b60206040518083038186803b15801561052757600080fd5b505afa15801561053b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055f91906113f3565b1161057c5760405162461bcd60e51b815260040161028990611904565b610598610587610cfe565b6001600160a01b0383169085610d3a565b6105a0610cfe565b6001600160a01b03167f82e416ba72d10e709b5de7ac16f5f49ff1d94f22d55bf582d353d3c313a1e8dd846105d3610d95565b6040516105e19291906119de565b60405180910390a2505050505050565b6005602052600090815260409020805460019091015482565b6001546001600160a01b031681565b600854600160a01b900460ff1681565b6000610633610cfe565b60005461010090046001600160a01b039081169116146106655760405162461bcd60e51b815260040161028990611809565b61066d610d99565b50600190565b60045481565b610681610a84565b1561069e5760405162461bcd60e51b815260040161028990611685565b600854600160a01b900460ff16156106c85760405162461bcd60e51b815260040161028990611713565b600854600090819081906001600160a01b03166316a59cce6106e8610cfe565b866040518363ffffffff1660e01b815260040161070692919061143b565b60606040518083038186803b15801561071e57600080fd5b505afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190611371565b925092509250826107795760405162461bcd60e51b815260040161028990611992565b6001600160a01b03821630146107a15760405162461bcd60e51b815260040161028990611506565b6002544210156107c35760405162461bcd60e51b815260040161028990611781565b80600560006107d0610cfe565b6001600160a01b0316815260208101919091526040016000205411156108085760405162461bcd60e51b815260040161028990611882565b600754604080516305c4c8c760e51b815290516000926001600160a01b03169163b89918e0916004808301926020929190829003018186803b15801561084d57600080fd5b505afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610885919061133b565b905080600061089b610895610cfe565b85610e07565b90506108af6108a8610cfe565b8284610edd565b50505050505050565b6108c0610cfe565b60005461010090046001600160a01b039081169116146108f25760405162461bcd60e51b815260040161028990611809565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61091c610cfe565b60005461010090046001600160a01b0390811691161461094e5760405162461bcd60e51b815260040161028990611809565b6001600160a01b0382166109745760405162461bcd60e51b8152600401610289906116af565b6040516370a0823160e01b815281906001600160a01b038416906370a08231906109a2903090600401611427565b60206040518083038186803b1580156109ba57600080fd5b505afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f291906113f3565b1015610a105760405162461bcd60e51b81526004016102899061183e565b600054610a2f906001600160a01b038481169161010090041683610d3a565b60005461010090046001600160a01b03167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb82610a6a610d95565b604051610a789291906119de565b60405180910390a25050565b60005460ff1690565b6000610a97610cfe565b60005461010090046001600160a01b03908116911614610ac95760405162461bcd60e51b815260040161028990611809565b61066d611036565b610ad9610cfe565b6001546001600160a01b03908116911614610b065760405162461bcd60e51b8152600401610289906116de565b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60035481565b60065481565b60005461010090046001600160a01b031681565b6007546001600160a01b031681565b6008546001600160a01b031681565b6000610bbc610cfe565b60005461010090046001600160a01b03908116911614610bee5760405162461bcd60e51b815260040161028990611809565b6001600160a01b038216610c145760405162461bcd60e51b81526004016102899061174a565b50600780546001600160a01b0319166001600160a01b03831617905560015b919050565b610c40610cfe565b60005461010090046001600160a01b03908116911614610c725760405162461bcd60e51b815260040161028990611809565b6001600160a01b038116610c985760405162461bcd60e51b8152600401610289906114c0565b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b3390565b600080610d0f83856119ec565b905083811015610d315760405162461bcd60e51b81526004016102899061154d565b90505b92915050565b610d908363a9059cbb60e01b8484604051602401610d5992919061143b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611091565b505050565b4290565b610da1610a84565b610dbd5760405162461bcd60e51b815260040161028990611492565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610df0610cfe565b604051610dfd9190611427565b60405180910390a1565b6001600160a01b038216600090815260056020526040812081610e2984611120565b9050600080836001015411610e4057600254610e46565b82600101545b90506000610e626201518060065461115d90919063ffffffff16565b90506000600454610e71610d95565b10610ea857610ea182610e9b600654610e958760045461118890919063ffffffff16565b9061115d565b906111b4565b9050610ec7565b610ec482610e9b600654610e9587610ebe610d95565b90611188565b90505b610ed184826111b4565b98975050505050505050565b60008211610efd5760405162461bcd60e51b815260040161028990611584565b6001600160a01b038316600090815260056020526040902054610f209083610d02565b6001600160a01b03808516600090815260056020526040908190209283554260019093019290925590516370a0823160e01b815283918316906370a0823190610f6d903090600401611427565b60206040518083038186803b158015610f8557600080fd5b505afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd91906113f3565b11610fda5760405162461bcd60e51b815260040161028990611904565b610fee6001600160a01b0382168484610d3a565b826001600160a01b03167f82e416ba72d10e709b5de7ac16f5f49ff1d94f22d55bf582d353d3c313a1e8dd83426040516110299291906119de565b60405180910390a2505050565b61103e610a84565b1561105b5760405162461bcd60e51b815260040161028990611685565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610df0610cfe565b60006110e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111f99092919063ffffffff16565b805190915015610d9057808060200190518101906111049190611357565b610d905760405162461bcd60e51b815260040161028990611948565b60008061113a60025460045461118890919063ffffffff16565b6006549091506111569061114f90839061115d565b849061115d565b9392505050565b600080821161117e5760405162461bcd60e51b81526004016102899061164e565b610d318284611a04565b6000828211156111aa5760405162461bcd60e51b8152600401610289906115d1565b610d318284611a43565b6000826111c357506000610d34565b60006111cf8385611a24565b9050826111dc8583611a04565b14610d315760405162461bcd60e51b8152600401610289906117c8565b60606112088484600085611210565b949350505050565b6060824710156112325760405162461bcd60e51b815260040161028990611608565b61123b856112d0565b6112575760405162461bcd60e51b8152600401610289906118cd565b600080866001600160a01b03168587604051611273919061140b565b60006040518083038185875af1925050503d80600081146112b0576040519150601f19603f3d011682016040523d82523d6000602084013e6112b5565b606091505b50915091506112c58282866112d6565b979650505050505050565b3b151590565b606083156112e5575081611156565b8251156112f55782518084602001fd5b8160405162461bcd60e51b8152600401610289919061145f565b80518015158114610c3357600080fd5b600060208284031215611330578081fd5b8135610d3181611aa0565b60006020828403121561134c578081fd5b8151610d3181611aa0565b600060208284031215611368578081fd5b610d318261130f565b600080600060608486031215611385578182fd5b61138e8461130f565b9250602084015161139e81611aa0565b80925050604084015190509250925092565b600080604083850312156113c2578182fd5b82356113cd81611aa0565b946020939093013593505050565b6000602082840312156113ec578081fd5b5035919050565b600060208284031215611404578081fd5b5051919050565b6000825161141d818460208701611a5a565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252825180602084015261147e816040850160208701611a5a565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526027908201527f556e696661726d56657374696e673a20496e76616c69642056657374696e67206040820152664164647265737360c81b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602d908201527f556e696661726d56657374696e673a20596f7520646f6e74206861766520756e60408201526c6c6f636b656420746f6b656e7360981b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260159082015274496e76616c696420546f6b656e204164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e604082015260600190565b6020808252601f908201527f556e696661726d56657374696e673a20696e76616c696420617474656d707400604082015260600190565b6020808252601c908201527f6e657720666163746f72792061646472657373206973207a65726f2e00000000604082015260600190565b60208082526027908201527f556e696661726d56657374696e673a20636c69666620706572696f642065786560408201526631b2b83a34b7b760c91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f556e696661726d56657374696e673a20496e73756666696369656e742042616c604082015263616e636560e01b606082015260800190565b6020808252602b908201527f556e696661726d56657374696e673a206e6f20636c61696d61626c6520746f6b60408201526a656e732072656d61696e7360a81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526024908201527f556e696661726d56657374696e673a20696e73756666696369656e742062616c604082015263616e636560e01b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f556e696661726d56657374696e673a20496e76616c69642042656e656669636960408201526261727960e81b606082015260800190565b90815260200190565b918252602082015260400190565b600082198211156119ff576119ff611a8a565b500190565b600082611a1f57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611a3e57611a3e611a8a565b500290565b600082821015611a5557611a55611a8a565b500390565b60005b83811015611a75578181015183820152602001611a5d565b83811115611a84576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611ab557600080fd5b5056fea2646970667358221220fed19e45eba2fe4bdfbea3ba8f43f58833a414090ae2d85ded5c2841283b24af64736f6c6343000800003300000000000000000000000089bcafc0994f8e38051ceab57c0fe14ec3b64fe0000000000000000000000000000000000000000000000000000000006115c41000000000000000000000000000000000000000000000000000000000609f1d10000000000000000000000000000000000000000000000000000000006279b91000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1f28581129f27c11ee0c6c421a4fbf29c3e9bc7
Deployed Bytecode
0x608060405234801561001057600080fd5b506004361061012c5760003560e01c80635c975abb116100ad5780638da5cb5b116100715780638da5cb5b14610220578063c45a015514610228578063c4788bf414610230578063d9f165dc14610238578063f2fde38b1461024b5761012c565b80635c975abb146101f857806367d0661d14610200578063715018a61461020857806378e97925146102105780638a1fcd60146102185761012c565b806330efb8d3116100f457806330efb8d3146101af5780633197cbb6146101b757806337bdc99b146101bf578063432985b3146101d25780635058c460146101e55761012c565b806313d033c0146101315780632081a3e11461014f578063294a57271461016457806329575f6a146101855780632e7a067b1461019a575b600080fd5b61013961025e565b60405161014691906119d5565b60405180910390f35b61016261015d3660046113db565b610264565b005b61017761017236600461131f565b6105f1565b6040516101469291906119de565b61018d61060a565b6040516101469190611427565b6101a2610619565b6040516101469190611454565b6101a2610629565b610139610673565b6101626101cd3660046113db565b610679565b6101626101e036600461131f565b6108b8565b6101626101f33660046113b0565b610914565b6101a2610a84565b6101a2610a8d565b610162610ad1565b610139610b74565b610139610b7a565b61018d610b80565b61018d610b94565b61018d610ba3565b6101a261024636600461131f565b610bb2565b61016261025936600461131f565b610c38565b60025481565b61026c610a84565b156102925760405162461bcd60e51b815260040161028990611685565b60405180910390fd5b600854600160a01b900460ff166102bb5760405162461bcd60e51b815260040161028990611713565b600854600090819081906001600160a01b03166316a59cce6102db610cfe565b866040518363ffffffff1660e01b81526004016102f992919061143b565b60606040518083038186803b15801561031157600080fd5b505afa158015610325573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103499190611371565b9250925092508261036c5760405162461bcd60e51b815260040161028990611992565b6001600160a01b03821630146103945760405162461bcd60e51b815260040161028990611506565b80600560006103a1610cfe565b6001600160a01b03168152602081019190915260400160002054106103d85760405162461bcd60e51b815260040161028990611882565b61040881600560006103e8610cfe565b6001600160a01b0316815260208101919091526040016000205490610d02565b60056000610414610cfe565b6001600160a01b03166001600160a01b03168152602001908152602001600020600001819055504260056000610448610cfe565b6001600160a01b039081168252602080830193909352604091820160009081206001019490945560075482516305c4c8c760e51b8152925191169263b89918e09260048082019391829003018186803b1580156104a457600080fd5b505afa1580156104b8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104dc919061133b565b6040516370a0823160e01b8152909150819083906001600160a01b038316906370a082319061050f903090600401611427565b60206040518083038186803b15801561052757600080fd5b505afa15801561053b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061055f91906113f3565b1161057c5760405162461bcd60e51b815260040161028990611904565b610598610587610cfe565b6001600160a01b0383169085610d3a565b6105a0610cfe565b6001600160a01b03167f82e416ba72d10e709b5de7ac16f5f49ff1d94f22d55bf582d353d3c313a1e8dd846105d3610d95565b6040516105e19291906119de565b60405180910390a2505050505050565b6005602052600090815260409020805460019091015482565b6001546001600160a01b031681565b600854600160a01b900460ff1681565b6000610633610cfe565b60005461010090046001600160a01b039081169116146106655760405162461bcd60e51b815260040161028990611809565b61066d610d99565b50600190565b60045481565b610681610a84565b1561069e5760405162461bcd60e51b815260040161028990611685565b600854600160a01b900460ff16156106c85760405162461bcd60e51b815260040161028990611713565b600854600090819081906001600160a01b03166316a59cce6106e8610cfe565b866040518363ffffffff1660e01b815260040161070692919061143b565b60606040518083038186803b15801561071e57600080fd5b505afa158015610732573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107569190611371565b925092509250826107795760405162461bcd60e51b815260040161028990611992565b6001600160a01b03821630146107a15760405162461bcd60e51b815260040161028990611506565b6002544210156107c35760405162461bcd60e51b815260040161028990611781565b80600560006107d0610cfe565b6001600160a01b0316815260208101919091526040016000205411156108085760405162461bcd60e51b815260040161028990611882565b600754604080516305c4c8c760e51b815290516000926001600160a01b03169163b89918e0916004808301926020929190829003018186803b15801561084d57600080fd5b505afa158015610861573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610885919061133b565b905080600061089b610895610cfe565b85610e07565b90506108af6108a8610cfe565b8284610edd565b50505050505050565b6108c0610cfe565b60005461010090046001600160a01b039081169116146108f25760405162461bcd60e51b815260040161028990611809565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b61091c610cfe565b60005461010090046001600160a01b0390811691161461094e5760405162461bcd60e51b815260040161028990611809565b6001600160a01b0382166109745760405162461bcd60e51b8152600401610289906116af565b6040516370a0823160e01b815281906001600160a01b038416906370a08231906109a2903090600401611427565b60206040518083038186803b1580156109ba57600080fd5b505afa1580156109ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f291906113f3565b1015610a105760405162461bcd60e51b81526004016102899061183e565b600054610a2f906001600160a01b038481169161010090041683610d3a565b60005461010090046001600160a01b03167fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb82610a6a610d95565b604051610a789291906119de565b60405180910390a25050565b60005460ff1690565b6000610a97610cfe565b60005461010090046001600160a01b03908116911614610ac95760405162461bcd60e51b815260040161028990611809565b61066d611036565b610ad9610cfe565b6001546001600160a01b03908116911614610b065760405162461bcd60e51b8152600401610289906116de565b600154600080546040516001600160a01b0393841693610100909204909116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600154600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b60035481565b60065481565b60005461010090046001600160a01b031681565b6007546001600160a01b031681565b6008546001600160a01b031681565b6000610bbc610cfe565b60005461010090046001600160a01b03908116911614610bee5760405162461bcd60e51b815260040161028990611809565b6001600160a01b038216610c145760405162461bcd60e51b81526004016102899061174a565b50600780546001600160a01b0319166001600160a01b03831617905560015b919050565b610c40610cfe565b60005461010090046001600160a01b03908116911614610c725760405162461bcd60e51b815260040161028990611809565b6001600160a01b038116610c985760405162461bcd60e51b8152600401610289906114c0565b600080546040516001600160a01b038085169361010090930416917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b3390565b600080610d0f83856119ec565b905083811015610d315760405162461bcd60e51b81526004016102899061154d565b90505b92915050565b610d908363a9059cbb60e01b8484604051602401610d5992919061143b565b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b031990931692909217909152611091565b505050565b4290565b610da1610a84565b610dbd5760405162461bcd60e51b815260040161028990611492565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa610df0610cfe565b604051610dfd9190611427565b60405180910390a1565b6001600160a01b038216600090815260056020526040812081610e2984611120565b9050600080836001015411610e4057600254610e46565b82600101545b90506000610e626201518060065461115d90919063ffffffff16565b90506000600454610e71610d95565b10610ea857610ea182610e9b600654610e958760045461118890919063ffffffff16565b9061115d565b906111b4565b9050610ec7565b610ec482610e9b600654610e9587610ebe610d95565b90611188565b90505b610ed184826111b4565b98975050505050505050565b60008211610efd5760405162461bcd60e51b815260040161028990611584565b6001600160a01b038316600090815260056020526040902054610f209083610d02565b6001600160a01b03808516600090815260056020526040908190209283554260019093019290925590516370a0823160e01b815283918316906370a0823190610f6d903090600401611427565b60206040518083038186803b158015610f8557600080fd5b505afa158015610f99573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fbd91906113f3565b11610fda5760405162461bcd60e51b815260040161028990611904565b610fee6001600160a01b0382168484610d3a565b826001600160a01b03167f82e416ba72d10e709b5de7ac16f5f49ff1d94f22d55bf582d353d3c313a1e8dd83426040516110299291906119de565b60405180910390a2505050565b61103e610a84565b1561105b5760405162461bcd60e51b815260040161028990611685565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258610df0610cfe565b60006110e6826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166111f99092919063ffffffff16565b805190915015610d9057808060200190518101906111049190611357565b610d905760405162461bcd60e51b815260040161028990611948565b60008061113a60025460045461118890919063ffffffff16565b6006549091506111569061114f90839061115d565b849061115d565b9392505050565b600080821161117e5760405162461bcd60e51b81526004016102899061164e565b610d318284611a04565b6000828211156111aa5760405162461bcd60e51b8152600401610289906115d1565b610d318284611a43565b6000826111c357506000610d34565b60006111cf8385611a24565b9050826111dc8583611a04565b14610d315760405162461bcd60e51b8152600401610289906117c8565b60606112088484600085611210565b949350505050565b6060824710156112325760405162461bcd60e51b815260040161028990611608565b61123b856112d0565b6112575760405162461bcd60e51b8152600401610289906118cd565b600080866001600160a01b03168587604051611273919061140b565b60006040518083038185875af1925050503d80600081146112b0576040519150601f19603f3d011682016040523d82523d6000602084013e6112b5565b606091505b50915091506112c58282866112d6565b979650505050505050565b3b151590565b606083156112e5575081611156565b8251156112f55782518084602001fd5b8160405162461bcd60e51b8152600401610289919061145f565b80518015158114610c3357600080fd5b600060208284031215611330578081fd5b8135610d3181611aa0565b60006020828403121561134c578081fd5b8151610d3181611aa0565b600060208284031215611368578081fd5b610d318261130f565b600080600060608486031215611385578182fd5b61138e8461130f565b9250602084015161139e81611aa0565b80925050604084015190509250925092565b600080604083850312156113c2578182fd5b82356113cd81611aa0565b946020939093013593505050565b6000602082840312156113ec578081fd5b5035919050565b600060208284031215611404578081fd5b5051919050565b6000825161141d818460208701611a5a565b9190910192915050565b6001600160a01b0391909116815260200190565b6001600160a01b03929092168252602082015260400190565b901515815260200190565b600060208252825180602084015261147e816040850160208701611a5a565b601f01601f19169190910160400192915050565b60208082526014908201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604082015260600190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b60208082526027908201527f556e696661726d56657374696e673a20496e76616c69642056657374696e67206040820152664164647265737360c81b606082015260800190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b6020808252602d908201527f556e696661726d56657374696e673a20596f7520646f6e74206861766520756e60408201526c6c6f636b656420746f6b656e7360981b606082015260800190565b6020808252601e908201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604082015260600190565b60208082526026908201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6040820152651c8818d85b1b60d21b606082015260800190565b6020808252601a908201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b602080825260159082015274496e76616c696420546f6b656e204164647265737360581b604082015260600190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f74207468652061646d696e604082015260600190565b6020808252601f908201527f556e696661726d56657374696e673a20696e76616c696420617474656d707400604082015260600190565b6020808252601c908201527f6e657720666163746f72792061646472657373206973207a65726f2e00000000604082015260600190565b60208082526027908201527f556e696661726d56657374696e673a20636c69666620706572696f642065786560408201526631b2b83a34b7b760c91b606082015260800190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526024908201527f556e696661726d56657374696e673a20496e73756666696369656e742042616c604082015263616e636560e01b606082015260800190565b6020808252602b908201527f556e696661726d56657374696e673a206e6f20636c61696d61626c6520746f6b60408201526a656e732072656d61696e7360a81b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b60208082526024908201527f556e696661726d56657374696e673a20696e73756666696369656e742062616c604082015263616e636560e01b606082015260800190565b6020808252602a908201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6040820152691bdd081cdd58d8d9595960b21b606082015260800190565b60208082526023908201527f556e696661726d56657374696e673a20496e76616c69642042656e656669636960408201526261727960e81b606082015260800190565b90815260200190565b918252602082015260400190565b600082198211156119ff576119ff611a8a565b500190565b600082611a1f57634e487b7160e01b81526012600452602481fd5b500490565b6000816000190483118215151615611a3e57611a3e611a8a565b500290565b600082821015611a5557611a55611a8a565b500390565b60005b83811015611a75578181015183820152602001611a5d565b83811115611a84576000848401525b50505050565b634e487b7160e01b600052601160045260246000fd5b6001600160a01b0381168114611ab557600080fd5b5056fea2646970667358221220fed19e45eba2fe4bdfbea3ba8f43f58833a414090ae2d85ded5c2841283b24af64736f6c63430008000033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000089bcafc0994f8e38051ceab57c0fe14ec3b64fe0000000000000000000000000000000000000000000000000000000006115c41000000000000000000000000000000000000000000000000000000000609f1d10000000000000000000000000000000000000000000000000000000006279b91000000000000000000000000000000000000000000000000000000000000151800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000a1f28581129f27c11ee0c6c421a4fbf29c3e9bc7
-----Decoded View---------------
Arg [0] : owner_ (address): 0x89BCAfc0994f8E38051CeAb57C0fe14EC3b64Fe0
Arg [1] : cliff_ (uint256): 1628816400
Arg [2] : startTime_ (uint256): 1621040400
Arg [3] : endTime_ (uint256): 1652144400
Arg [4] : unlockDuration_ (uint256): 86400
Arg [5] : allowReleaseAll_ (bool): False
Arg [6] : factoryAddress_ (address): 0xA1f28581129f27C11ee0C6C421A4fbf29C3E9BC7
-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 00000000000000000000000089bcafc0994f8e38051ceab57c0fe14ec3b64fe0
Arg [1] : 000000000000000000000000000000000000000000000000000000006115c410
Arg [2] : 00000000000000000000000000000000000000000000000000000000609f1d10
Arg [3] : 000000000000000000000000000000000000000000000000000000006279b910
Arg [4] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [6] : 000000000000000000000000a1f28581129f27c11ee0c6c421a4fbf29c3e9bc7
Deployed Bytecode Sourcemap
28802:10065:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29425:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31861:1248;;;;;;:::i;:::-;;:::i;:::-;;29803:57;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;26290:25::-;;;:::i;:::-;;;;;;;:::i;30234:27::-;;;:::i;:::-;;;;;;;:::i;38406:106::-;;;:::i;29559:22::-;;;:::i;33464:975::-;;;;;;:::i;:::-;;:::i;37273:114::-;;;;;;:::i;:::-;;:::i;37604:457::-;;;;;;:::i;:::-;;:::i;24869:86::-;;;:::i;38194:102::-;;;:::i;27530:138::-;;;:::i;29491:24::-;;;:::i;29942:29::-;;;:::i;26196:20::-;;;:::i;30012:22::-;;;:::i;30092:26::-;;;:::i;38638:226::-;;;;;;:::i;:::-;;:::i;27823:242::-;;;;;;:::i;:::-;;:::i;29425:20::-;;;;:::o;31861:1248::-;25195:8;:6;:8::i;:::-;25194:9;25186:38;;;;-1:-1:-1;;;25186:38:0;;;;;;;:::i;:::-;;;;;;;;;31941:15:::1;::::0;-1:-1:-1;;;31941:15:0;::::1;;;31933:59;;;;-1:-1:-1::0;;;31933:59:0::1;;;;;;;:::i;:::-;32105:11;::::0;32006:18:::1;::::0;;;;;-1:-1:-1;;;;;32105:11:0::1;32083:48;32132:12;:10;:12::i;:::-;32146:8;32083:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32005:150;;;;;;32174:13;32166:61;;;;-1:-1:-1::0;;;32166:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;32246:28:0;::::1;32269:4;32246:28;32238:80;;;;-1:-1:-1::0;;;32238:80:0::1;;;;;;;:::i;:::-;32401:11;32351:18;:32;32370:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;32351:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;32351:32:0;:47;:61:::1;32329:154;;;;-1:-1:-1::0;;;32329:154:0::1;;;;;;;:::i;:::-;32546:92;32626:11;32546:18;:32;32565:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;32546:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;32546:32:0;:61;;:79:::1;:92::i;:::-;32496:18;:32;32515:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;32496:32:0::1;-1:-1:-1::0;;;;;32496:32:0::1;;;;;;;;;;;;:47;;:142;;;;32696:15;32649:18;:32;32668:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;32649:32:0;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;32649:32:0;;;:44:::1;;:62:::0;;;;32751:7:::1;::::0;:19;;-1:-1:-1;;;32751:19:0;;;;:7;::::1;::::0;:17:::1;::::0;:19:::1;::::0;;::::1;::::0;;;;;;;:7;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;32859:42;::::0;-1:-1:-1;;;32859:42:0;;32724:46;;-1:-1:-1;32724:46:0;;32904:11;;-1:-1:-1;;;;;32859:27:0;::::1;::::0;::::1;::::0;:42:::1;::::0;32895:4:::1;::::0;32859:42:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;32837:142;;;;-1:-1:-1::0;;;32837:142:0::1;;;;;;;:::i;:::-;32990:49;33013:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;32990:22:0;::::1;::::0;33027:11;32990:22:::1;:49::i;:::-;33064:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;33055:46:0::1;;33078:11;33091:9;:7;:9::i;:::-;33055:46;;;;;;;:::i;:::-;;;;;;;;25235:1;;;;;31861:1248:::0;:::o;29803:57::-;;;;;;;;;;;;;;;;;;;:::o;26290:25::-;;;-1:-1:-1;;;;;26290:25:0;;:::o;30234:27::-;;;-1:-1:-1;;;30234:27:0;;;;;:::o;38406:106::-;38455:4;26894:12;:10;:12::i;:::-;26885:5;;;;;-1:-1:-1;;;;;26885:5:0;;;:21;;;26877:66;;;;-1:-1:-1;;;26877:66:0;;;;;;;:::i;:::-;38472:10:::1;:8;:10::i;:::-;-1:-1:-1::0;38500:4:0::1;38406:106:::0;:::o;29559:22::-;;;;:::o;33464:975::-;25195:8;:6;:8::i;:::-;25194:9;25186:38;;;;-1:-1:-1;;;25186:38:0;;;;;;;:::i;:::-;33542:15:::1;::::0;-1:-1:-1;;;33542:15:0;::::1;;;33541:16;33533:60;;;;-1:-1:-1::0;;;33533:60:0::1;;;;;;;:::i;:::-;33704:11;::::0;33605:18:::1;::::0;;;;;-1:-1:-1;;;;;33704:11:0::1;33682:48;33731:12;:10;:12::i;:::-;33745:8;33682:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;33604:150;;;;;;33775:13;33767:61;;;;-1:-1:-1::0;;;33767:61:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;33847:28:0;::::1;33870:4;33847:28;33839:80;;;;-1:-1:-1::0;;;33839:80:0::1;;;;;;;:::i;:::-;33957:5;;33938:15;:24;;33930:76;;;;-1:-1:-1::0;;;33930:76:0::1;;;;;;;:::i;:::-;34092:11;34041:18;:32;34060:12;:10;:12::i;:::-;-1:-1:-1::0;;;;;34041:32:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;34041:32:0;:47;:62:::1;;34019:155;;;;-1:-1:-1::0;;;34019:155:0::1;;;;;;;:::i;:::-;34214:7;::::0;:19:::1;::::0;;-1:-1:-1;;;34214:19:0;;;;34187:24:::1;::::0;-1:-1:-1;;;;;34214:7:0::1;::::0;:17:::1;::::0;:19:::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;:7;:19;::::1;;::::0;::::1;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;34187:46:::0;-1:-1:-1;34187:46:0;34244:16:::1;34325:44;34343:12;:10;:12::i;:::-;34357:11;34325:17;:44::i;:::-;34300:69;;34380:51;34391:12;:10;:12::i;:::-;34405:14;34421:9;34380:10;:51::i;:::-;25235:1;;;;;;33464:975:::0;:::o;37273:114::-;26894:12;:10;:12::i;:::-;26885:5;;;;;-1:-1:-1;;;;;26885:5:0;;;:21;;;26877:66;;;;-1:-1:-1;;;26877:66:0;;;;;;;:::i;:::-;37353:11:::1;:26:::0;;-1:-1:-1;;;;;;37353:26:0::1;-1:-1:-1::0;;;;;37353:26:0;;;::::1;::::0;;;::::1;::::0;;37273:114::o;37604:457::-;26894:12;:10;:12::i;:::-;26885:5;;;;;-1:-1:-1;;;;;26885:5:0;;;:21;;;26877:66;;;;-1:-1:-1;;;26877:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;37705:35:0;::::1;37697:69;;;;-1:-1:-1::0;;;37697:69:0::1;;;;;;;:::i;:::-;37799:37;::::0;-1:-1:-1;;;37799:37:0;;37840:10;;-1:-1:-1;;;;;37799:22:0;::::1;::::0;::::1;::::0;:37:::1;::::0;37830:4:::1;::::0;37799:37:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;37777:137;;;;-1:-1:-1::0;;;37777:137:0::1;;;;;;;:::i;:::-;37979:5;::::0;37953:44:::1;::::0;-1:-1:-1;;;;;37953:25:0;;::::1;::::0;37979:5:::1;::::0;::::1;;37986:10:::0;37953:25:::1;:44::i;:::-;38024:5;::::0;::::1;::::0;::::1;-1:-1:-1::0;;;;;38024:5:0::1;38013:40;38031:10:::0;38043:9:::1;:7;:9::i;:::-;38013:40;;;;;;;:::i;:::-;;;;;;;;37604:457:::0;;:::o;24869:86::-;24916:4;24940:7;;;24869:86;:::o;38194:102::-;38241:4;26894:12;:10;:12::i;:::-;26885:5;;;;;-1:-1:-1;;;;;26885:5:0;;;:21;;;26877:66;;;;-1:-1:-1;;;26877:66:0;;;;;;;:::i;:::-;38258:8:::1;:6;:8::i;27530:138::-:0;27110:12;:10;:12::i;:::-;27096:10;;-1:-1:-1;;;;;27096:10:0;;;:26;;;27088:71;;;;-1:-1:-1;;;27088:71:0;;;;;;;:::i;:::-;27620:10:::1;::::0;::::1;27613:5:::0;;27592:39:::1;::::0;-1:-1:-1;;;;;27620:10:0;;::::1;::::0;::::1;27613:5:::0;;::::1;::::0;;::::1;::::0;27592:39:::1;::::0;::::1;27650:10;::::0;::::1;27642:18:::0;;-1:-1:-1;;;;;27650:10:0;;::::1;;27642:18;-1:-1:-1::0;;;;;;27642:18:0;;::::1;::::0;;;::::1;::::0;;27530:138::o;29491:24::-;;;;:::o;29942:29::-;;;;:::o;26196:20::-;;;;;;-1:-1:-1;;;;;26196:20:0;;:::o;30012:22::-;;;-1:-1:-1;;;;;30012:22:0;;:::o;30092:26::-;;;-1:-1:-1;;;;;30092:26:0;;:::o;38638:226::-;38710:4;26894:12;:10;:12::i;:::-;26885:5;;;;;-1:-1:-1;;;;;26885:5:0;;;:21;;;26877:66;;;;-1:-1:-1;;;26877:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38735:25:0;::::1;38727:66;;;;-1:-1:-1::0;;;38727:66:0::1;;;;;;;:::i;:::-;-1:-1:-1::0;38804:7:0::1;:30:::0;;-1:-1:-1;;;;;;38804:30:0::1;-1:-1:-1::0;;;;;38804:30:0;::::1;;::::0;;-1:-1:-1;26954:1:0::1;38638:226:::0;;;:::o;27823:242::-;26894:12;:10;:12::i;:::-;26885:5;;;;;-1:-1:-1;;;;;26885:5:0;;;:21;;;26877:66;;;;-1:-1:-1;;;26877:66:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;27912:22:0;::::1;27904:73;;;;-1:-1:-1::0;;;27904:73:0::1;;;;;;;:::i;:::-;28014:5;::::0;;27993:37:::1;::::0;-1:-1:-1;;;;;27993:37:0;;::::1;::::0;28014:5:::1;::::0;;::::1;;::::0;27993:37:::1;::::0;::::1;28041:5;:16:::0;;-1:-1:-1;;;;;28041:16:0;;::::1;;;-1:-1:-1::0;;;;;;28041:16:0;;::::1;::::0;;;::::1;::::0;;27823:242::o;23469:98::-;23549:10;23469:98;:::o;5689:179::-;5747:7;;5779:5;5783:1;5779;:5;:::i;:::-;5767:17;;5808:1;5803;:6;;5795:46;;;;-1:-1:-1;;;5795:46:0;;;;;;;:::i;:::-;5859:1;-1:-1:-1;5689:179:0;;;;;:::o;19399:211::-;19516:86;19536:5;19566:23;;;19591:2;19595:5;19543:58;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;19543:58:0;;;;;;;;;;;;;;-1:-1:-1;;;;;19543:58:0;-1:-1:-1;;;;;;19543:58:0;;;;;;;;;;19516:19;:86::i;:::-;19399:211;;;:::o;35490:92::-;35559:15;35490:92;:::o;25928:120::-;25472:8;:6;:8::i;:::-;25464:41;;;;-1:-1:-1;;;25464:41:0;;;;;;;:::i;:::-;25997:5:::1;25987:15:::0;;-1:-1:-1;;25987:15:0::1;::::0;;26018:22:::1;26027:12;:10;:12::i;:::-;26018:22;;;;;;:::i;:::-;;;;;;;;25928:120::o:0;36008:731::-;-1:-1:-1;;;;;36193:26:0;;36126:22;36193:26;;;:18;:26;;;;;36126:22;36249:31;36264:15;36249:14;:31::i;:::-;36232:48;;36291:19;36332:1;36313:4;:16;;;:20;:47;;36355:5;;36313:47;;;36336:4;:16;;;36313:47;36291:69;;36373:18;36394:26;36413:6;36394:14;;:18;;:26;;;;:::i;:::-;36373:47;;36433:20;36483:7;;36470:9;:7;:9::i;:::-;:20;36466:211;;36522:60;36571:10;36522:44;36551:14;;36522:24;36534:11;36522:7;;:11;;:24;;;;:::i;:::-;:28;;:44::i;:::-;:48;;:60::i;:::-;36521:61;-1:-1:-1;36466:211:0;;;36615:62;36666:10;36615:46;36646:14;;36615:26;36629:11;36615:9;:7;:9::i;:::-;:13;;:26::i;:62::-;36614:63;-1:-1:-1;36466:211:0;36707:24;:6;36718:12;36707:10;:24::i;:::-;36690:41;36008:731;-1:-1:-1;;;;;;;;36008:731:0:o;34683:705::-;34840:1;34823:14;:18;34815:76;;;;-1:-1:-1;;;34815:76:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;34948:26:0;;;;;;:18;:26;;;;;:41;:85;;35008:14;34948:45;:85::i;:::-;-1:-1:-1;;;;;34904:26:0;;;;;;;:18;:26;;;;;;;:129;;;35085:15;35044:38;;;;:56;;;;35135:42;;-1:-1:-1;;;35135:42:0;;35180:14;;35135:27;;;;;:42;;35171:4;;35135:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:59;35113:145;;;;-1:-1:-1;;;35113:145:0;;;;;;;:::i;:::-;35269:46;-1:-1:-1;;;;;35269:22:0;;35292:6;35300:14;35269:22;:46::i;:::-;35340:6;-1:-1:-1;;;;;35331:49:0;;35348:14;35364:15;35331:49;;;;;;;:::i;:::-;;;;;;;;34683:705;;;:::o;25669:118::-;25195:8;:6;:8::i;:::-;25194:9;25186:38;;;;-1:-1:-1;;;25186:38:0;;;;;;;:::i;:::-;25729:7:::1;:14:::0;;-1:-1:-1;;25729:14:0::1;25739:4;25729:14;::::0;;25759:20:::1;25766:12;:10;:12::i;22070:787::-:0;22494:23;22533:69;22561:4;22533:69;;;;;;;;;;;;;;;;;22541:5;-1:-1:-1;;;;;22533:27:0;;;:69;;;;;:::i;:::-;22617:17;;22494:108;;-1:-1:-1;22617:21:0;22613:237;;22772:10;22761:30;;;;;;;;;;;;:::i;:::-;22753:85;;;;-1:-1:-1;;;22753:85:0;;;;;;;:::i;36929:187::-;36991:14;37018:12;37035:18;37047:5;;37035:7;;:11;;:18;;;;:::i;:::-;37092:14;;37034:19;;-1:-1:-1;37073:35:0;;37083:24;;37034:19;;37083:8;:24::i;:::-;37073:5;;:9;:35::i;:::-;37064:44;36929:187;-1:-1:-1;;;36929:187:0:o;7266:153::-;7324:7;7356:1;7352;:5;7344:44;;;;-1:-1:-1;;;7344:44:0;;;;;;;:::i;:::-;7406:5;7410:1;7406;:5;:::i;6151:158::-;6209:7;6242:1;6237;:6;;6229:49;;;;-1:-1:-1;;;6229:49:0;;;;;;;:::i;:::-;6296:5;6300:1;6296;:5;:::i;6568:220::-;6626:7;6650:6;6646:20;;-1:-1:-1;6665:1:0;6658:8;;6646:20;6677:9;6689:5;6693:1;6689;:5;:::i;:::-;6677:17;-1:-1:-1;6722:1:0;6713:5;6717:1;6677:17;6713:5;:::i;:::-;:10;6705:56;;;;-1:-1:-1;;;6705:56:0;;;;;;;:::i;14148:229::-;14285:12;14317:52;14339:6;14347:4;14353:1;14356:12;14317:21;:52::i;:::-;14310:59;14148:229;-1:-1:-1;;;;14148:229:0:o;15281:571::-;15451:12;15509:5;15484:21;:30;;15476:81;;;;-1:-1:-1;;;15476:81:0;;;;;;;:::i;:::-;15576:18;15587:6;15576:10;:18::i;:::-;15568:60;;;;-1:-1:-1;;;15568:60:0;;;;;;;:::i;:::-;15702:12;15716:23;15743:6;-1:-1:-1;;;;;15743:11:0;15762:5;15769:4;15743:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15701:73;;;;15792:52;15810:7;15819:10;15831:12;15792:17;:52::i;:::-;15785:59;15281:571;-1:-1:-1;;;;;;;15281:571:0:o;11208:444::-;11588:20;11636:8;;;11208:444::o;17985:777::-;18135:12;18164:7;18160:595;;;-1:-1:-1;18195:10:0;18188:17;;18160:595;18309:17;;:21;18305:439;;18572:10;18566:17;18633:15;18620:10;18616:2;18612:19;18605:44;18520:148;18715:12;18708:20;;-1:-1:-1;;;18708:20:0;;;;;;;;:::i;14:166:1:-;92:13;;141;;134:21;124:32;;114:2;;170:1;167;160:12;185:259;;297:2;285:9;276:7;272:23;268:32;265:2;;;318:6;310;303:22;265:2;362:9;349:23;381:33;408:5;381:33;:::i;449:263::-;;572:2;560:9;551:7;547:23;543:32;540:2;;;593:6;585;578:22;540:2;630:9;624:16;649:33;676:5;649:33;:::i;717:214::-;;837:2;825:9;816:7;812:23;808:32;805:2;;;858:6;850;843:22;805:2;886:39;915:9;886:39;:::i;936:405::-;;;;1090:2;1078:9;1069:7;1065:23;1061:32;1058:2;;;1111:6;1103;1096:22;1058:2;1139:39;1168:9;1139:39;:::i;:::-;1129:49;;1221:2;1210:9;1206:18;1200:25;1234:33;1261:5;1234:33;:::i;:::-;1286:5;1276:15;;;1331:2;1320:9;1316:18;1310:25;1300:35;;1048:293;;;;;:::o;1346:340::-;;;1488:2;1476:9;1467:7;1463:23;1459:32;1456:2;;;1509:6;1501;1494:22;1456:2;1553:9;1540:23;1572:33;1599:5;1572:33;:::i;:::-;1624:5;1676:2;1661:18;;;;1648:32;;-1:-1:-1;;;1446:240:1:o;1691:190::-;;1803:2;1791:9;1782:7;1778:23;1774:32;1771:2;;;1824:6;1816;1809:22;1771:2;-1:-1:-1;1852:23:1;;1761:120;-1:-1:-1;1761:120:1:o;1886:194::-;;2009:2;1997:9;1988:7;1984:23;1980:32;1977:2;;;2030:6;2022;2015:22;1977:2;-1:-1:-1;2058:16:1;;1967:113;-1:-1:-1;1967:113:1:o;2085:274::-;;2252:6;2246:13;2268:53;2314:6;2309:3;2302:4;2294:6;2290:17;2268:53;:::i;:::-;2337:16;;;;;2222:137;-1:-1:-1;;2222:137:1:o;2364:203::-;-1:-1:-1;;;;;2528:32:1;;;;2510:51;;2498:2;2483:18;;2465:102::o;2572:274::-;-1:-1:-1;;;;;2764:32:1;;;;2746:51;;2828:2;2813:18;;2806:34;2734:2;2719:18;;2701:145::o;2851:187::-;3016:14;;3009:22;2991:41;;2979:2;2964:18;;2946:92::o;3267:383::-;;3416:2;3405:9;3398:21;3448:6;3442:13;3491:6;3486:2;3475:9;3471:18;3464:34;3507:66;3566:6;3561:2;3550:9;3546:18;3541:2;3533:6;3529:15;3507:66;:::i;:::-;3634:2;3613:15;-1:-1:-1;;3609:29:1;3594:45;;;;3641:2;3590:54;;3388:262;-1:-1:-1;;3388:262:1:o;3655:344::-;3857:2;3839:21;;;3896:2;3876:18;;;3869:30;-1:-1:-1;;;3930:2:1;3915:18;;3908:50;3990:2;3975:18;;3829:170::o;4004:402::-;4206:2;4188:21;;;4245:2;4225:18;;;4218:30;4284:34;4279:2;4264:18;;4257:62;-1:-1:-1;;;4350:2:1;4335:18;;4328:36;4396:3;4381:19;;4178:228::o;4411:403::-;4613:2;4595:21;;;4652:2;4632:18;;;4625:30;4691:34;4686:2;4671:18;;4664:62;-1:-1:-1;;;4757:2:1;4742:18;;4735:37;4804:3;4789:19;;4585:229::o;4819:351::-;5021:2;5003:21;;;5060:2;5040:18;;;5033:30;5099:29;5094:2;5079:18;;5072:57;5161:2;5146:18;;4993:177::o;5175:409::-;5377:2;5359:21;;;5416:2;5396:18;;;5389:30;5455:34;5450:2;5435:18;;5428:62;-1:-1:-1;;;5521:2:1;5506:18;;5499:43;5574:3;5559:19;;5349:235::o;5589:354::-;5791:2;5773:21;;;5830:2;5810:18;;;5803:30;5869:32;5864:2;5849:18;;5842:60;5934:2;5919:18;;5763:180::o;5948:402::-;6150:2;6132:21;;;6189:2;6169:18;;;6162:30;6228:34;6223:2;6208:18;;6201:62;-1:-1:-1;;;6294:2:1;6279:18;;6272:36;6340:3;6325:19;;6122:228::o;6355:350::-;6557:2;6539:21;;;6596:2;6576:18;;;6569:30;6635:28;6630:2;6615:18;;6608:56;6696:2;6681:18;;6529:176::o;6710:340::-;6912:2;6894:21;;;6951:2;6931:18;;;6924:30;-1:-1:-1;;;6985:2:1;6970:18;;6963:46;7041:2;7026:18;;6884:166::o;7055:345::-;7257:2;7239:21;;;7296:2;7276:18;;;7269:30;-1:-1:-1;;;7330:2:1;7315:18;;7308:51;7391:2;7376:18;;7229:171::o;7405:356::-;7607:2;7589:21;;;7626:18;;;7619:30;7685:34;7680:2;7665:18;;7658:62;7752:2;7737:18;;7579:182::o;7766:355::-;7968:2;7950:21;;;8007:2;7987:18;;;7980:30;8046:33;8041:2;8026:18;;8019:61;8112:2;8097:18;;7940:181::o;8126:352::-;8328:2;8310:21;;;8367:2;8347:18;;;8340:30;8406;8401:2;8386:18;;8379:58;8469:2;8454:18;;8300:178::o;8483:403::-;8685:2;8667:21;;;8724:2;8704:18;;;8697:30;8763:34;8758:2;8743:18;;8736:62;-1:-1:-1;;;8829:2:1;8814:18;;8807:37;8876:3;8861:19;;8657:229::o;8891:397::-;9093:2;9075:21;;;9132:2;9112:18;;;9105:30;9171:34;9166:2;9151:18;;9144:62;-1:-1:-1;;;9237:2:1;9222:18;;9215:31;9278:3;9263:19;;9065:223::o;9293:356::-;9495:2;9477:21;;;9514:18;;;9507:30;9573:34;9568:2;9553:18;;9546:62;9640:2;9625:18;;9467:182::o;9654:400::-;9856:2;9838:21;;;9895:2;9875:18;;;9868:30;9934:34;9929:2;9914:18;;9907:62;-1:-1:-1;;;10000:2:1;9985:18;;9978:34;10044:3;10029:19;;9828:226::o;10059:407::-;10261:2;10243:21;;;10300:2;10280:18;;;10273:30;10339:34;10334:2;10319:18;;10312:62;-1:-1:-1;;;10405:2:1;10390:18;;10383:41;10456:3;10441:19;;10233:233::o;10471:353::-;10673:2;10655:21;;;10712:2;10692:18;;;10685:30;10751:31;10746:2;10731:18;;10724:59;10815:2;10800:18;;10645:179::o;10829:400::-;11031:2;11013:21;;;11070:2;11050:18;;;11043:30;11109:34;11104:2;11089:18;;11082:62;-1:-1:-1;;;11175:2:1;11160:18;;11153:34;11219:3;11204:19;;11003:226::o;11234:406::-;11436:2;11418:21;;;11475:2;11455:18;;;11448:30;11514:34;11509:2;11494:18;;11487:62;-1:-1:-1;;;11580:2:1;11565:18;;11558:40;11630:3;11615:19;;11408:232::o;11645:399::-;11847:2;11829:21;;;11886:2;11866:18;;;11859:30;11925:34;11920:2;11905:18;;11898:62;-1:-1:-1;;;11991:2:1;11976:18;;11969:33;12034:3;12019:19;;11819:225::o;12049:177::-;12195:25;;;12183:2;12168:18;;12150:76::o;12231:248::-;12405:25;;;12461:2;12446:18;;12439:34;12393:2;12378:18;;12360:119::o;12484:128::-;;12555:1;12551:6;12548:1;12545:13;12542:2;;;12561:18;;:::i;:::-;-1:-1:-1;12597:9:1;;12532:80::o;12617:217::-;;12683:1;12673:2;;-1:-1:-1;;;12708:31:1;;12762:4;12759:1;12752:15;12790:4;12715:1;12780:15;12673:2;-1:-1:-1;12819:9:1;;12663:171::o;12839:168::-;;12945:1;12941;12937:6;12933:14;12930:1;12927:21;12922:1;12915:9;12908:17;12904:45;12901:2;;;12952:18;;:::i;:::-;-1:-1:-1;12992:9:1;;12891:116::o;13012:125::-;;13080:1;13077;13074:8;13071:2;;;13085:18;;:::i;:::-;-1:-1:-1;13122:9:1;;13061:76::o;13142:258::-;13214:1;13224:113;13238:6;13235:1;13232:13;13224:113;;;13314:11;;;13308:18;13295:11;;;13288:39;13260:2;13253:10;13224:113;;;13355:6;13352:1;13349:13;13346:2;;;13390:1;13381:6;13376:3;13372:16;13365:27;13346:2;;13195:205;;;:::o;13405:127::-;13466:10;13461:3;13457:20;13454:1;13447:31;13497:4;13494:1;13487:15;13521:4;13518:1;13511:15;13537:133;-1:-1:-1;;;;;13614:31:1;;13604:42;;13594:2;;13660:1;13657;13650:12;13594:2;13584:86;:::o
Swarm Source
ipfs://fed19e45eba2fe4bdfbea3ba8f43f58833a414090ae2d85ded5c2841283b24af
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ Download: CSV Export ]
[ 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.