Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Release | 19683235 | 296 days ago | IN | 0 ETH | 0.00141424 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
AKTokenVestingWallets
Compiler Version
v0.8.20+commit.a1b79de6
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-04-18 */ // SPDX-License-Identifier: MIT // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @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) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // 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: @openzeppelin/contracts/finance/VestingWallet.sol // OpenZeppelin Contracts (last updated v5.0.0) (finance/VestingWallet.sol) pragma solidity ^0.8.20; /** * @dev A vesting wallet is an ownable contract that can receive native currency and ERC20 tokens, and release these * assets to the wallet owner, also referred to as "beneficiary", according to a vesting schedule. * * Any assets transferred to this contract will follow the vesting schedule as if they were locked from the beginning. * Consequently, if the vesting has already started, any amount of tokens sent to this contract will (at least partly) * be immediately releasable. * * By setting the duration to 0, one can configure this contract to behave like an asset timelock that hold tokens for * a beneficiary until a specified time. * * NOTE: Since the wallet is {Ownable}, and ownership can be transferred, it is possible to sell unvested tokens. * Preventing this in a smart contract is difficult, considering that: 1) a beneficiary address could be a * counterfactually deployed contract, 2) there is likely to be a migration path for EOAs to become contracts in the * near future. * * NOTE: When using this contract with any token whose balance is adjusted automatically (i.e. a rebase token), make * sure to account the supply/balance adjustment in the vesting schedule to ensure the vested amount is as intended. */ contract VestingWallet is Context, Ownable { event EtherReleased(uint256 amount); event ERC20Released(address indexed token, uint256 amount); uint256 private _released; mapping(address token => uint256) private _erc20Released; uint64 private immutable _start; uint64 private immutable _duration; /** * @dev Sets the sender as the initial owner, the beneficiary as the pending owner, the start timestamp and the * vesting duration of the vesting wallet. */ constructor(address beneficiary, uint64 startTimestamp, uint64 durationSeconds) payable Ownable(beneficiary) { _start = startTimestamp; _duration = durationSeconds; } /** * @dev The contract should be able to receive Eth. */ receive() external payable virtual {} /** * @dev Getter for the start timestamp. */ function start() public view virtual returns (uint256) { return _start; } /** * @dev Getter for the vesting duration. */ function duration() public view virtual returns (uint256) { return _duration; } /** * @dev Getter for the end timestamp. */ function end() public view virtual returns (uint256) { return start() + duration(); } /** * @dev Amount of eth already released */ function released() public view virtual returns (uint256) { return _released; } /** * @dev Amount of token already released */ function released(address token) public view virtual returns (uint256) { return _erc20Released[token]; } /** * @dev Getter for the amount of releasable eth. */ function releasable() public view virtual returns (uint256) { return vestedAmount(uint64(block.timestamp)) - released(); } /** * @dev Getter for the amount of releasable `token` tokens. `token` should be the address of an * IERC20 contract. */ function releasable(address token) public view virtual returns (uint256) { return vestedAmount(token, uint64(block.timestamp)) - released(token); } /** * @dev Release the native token (ether) that have already vested. * * Emits a {EtherReleased} event. */ function release() public virtual { uint256 amount = releasable(); _released += amount; emit EtherReleased(amount); Address.sendValue(payable(owner()), amount); } /** * @dev Release the tokens that have already vested. * * Emits a {ERC20Released} event. */ function release(address token) public virtual { uint256 amount = releasable(token); _erc20Released[token] += amount; emit ERC20Released(token, amount); SafeERC20.safeTransfer(IERC20(token), owner(), amount); } /** * @dev Calculates the amount of ether that has already vested. Default implementation is a linear vesting curve. */ function vestedAmount(uint64 timestamp) public view virtual returns (uint256) { return _vestingSchedule(address(this).balance + released(), timestamp); } /** * @dev Calculates the amount of tokens that has already vested. Default implementation is a linear vesting curve. */ function vestedAmount(address token, uint64 timestamp) public view virtual returns (uint256) { return _vestingSchedule(IERC20(token).balanceOf(address(this)) + released(token), timestamp); } /** * @dev Virtual implementation of the vesting formula. This returns the amount vested, as a function of time, for * an asset given its total historical allocation. */ function _vestingSchedule(uint256 totalAllocation, uint64 timestamp) internal view virtual returns (uint256) { if (timestamp < start()) { return 0; } else if (timestamp >= end()) { return totalAllocation; } else { return (totalAllocation * (timestamp - start())) / duration(); } } } // File: AKTokenVestingWallets.sol // Compatible with OpenZeppelin Contracts ^5.0.0 pragma solidity ^0.8.20; contract AKTokenVestingWallets is VestingWallet { constructor(address beneficiary, uint64 startTimestamp, uint64 durationSeconds) VestingWallet( beneficiary, startTimestamp, durationSeconds ) { } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"beneficiary","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"uint64","name":"durationSeconds","type":"uint64"}],"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":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Released","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EtherReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[],"name":"duration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"end","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"releasable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"vestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint64","name":"timestamp","type":"uint64"}],"name":"vestedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561000f575f80fd5b50604051610be2380380610be283398101604081905261002e916100ef565b828282826001600160a01b03811661005f57604051631e4fbdf760e01b81525f600482015260240160405180910390fd5b61006881610085565b506001600160401b039182166080521660a0525061013c92505050565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160401b03811681146100ea575f80fd5b919050565b5f805f60608486031215610101575f80fd5b83516001600160a01b0381168114610117575f80fd5b9250610125602085016100d4565b9150610133604085016100d4565b90509250925092565b60805160a051610a7761016b5f395f8181610127015281816104d401526105b201525f6104ae0152610a775ff3fe6080604052600436106100dc575f3560e01c8063961325211161007c578063be9a655511610057578063be9a65551461024a578063efbe1c1c1461025e578063f2fde38b14610272578063fbccedae14610291575f80fd5b806396132521146101e35780639852595c146101f7578063a3f8eace1461022b575f80fd5b8063715018a6116100b7578063715018a614610176578063810ec23b1461018a57806386d1a69f146101a95780638da5cb5b146101bd575f80fd5b80630a17b06b146100e75780630fb5a6b4146101195780631916558714610155575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b506101066101013660046108f6565b6102a5565b6040519081526020015b60405180910390f35b348015610124575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff16610106565b348015610160575f80fd5b5061017461016f366004610925565b6102c8565b005b348015610181575f80fd5b50610174610360565b348015610195575f80fd5b506101066101a436600461093e565b610373565b3480156101b4575f80fd5b50610174610406565b3480156101c8575f80fd5b505f546040516001600160a01b039091168152602001610110565b3480156101ee575f80fd5b50600154610106565b348015610202575f80fd5b50610106610211366004610925565b6001600160a01b03165f9081526002602052604090205490565b348015610236575f80fd5b50610106610245366004610925565b610477565b348015610255575f80fd5b506101066104a3565b348015610269575f80fd5b506101066104d1565b34801561027d575f80fd5b5061017461028c366004610925565b610514565b34801561029c575f80fd5b50610106610553565b5f6102c26102b260015490565b6102bc9047610983565b83610570565b92915050565b5f6102d282610477565b6001600160a01b0383165f908152600260205260408120805492935083929091906102fe908490610983565b90915550506040518181526001600160a01b038316907fc0e523490dd523c33b1878c9eb14ff46991e3f5b2cd33710918618f2a39cba1b9060200160405180910390a261035c826103565f546001600160a01b031690565b83610612565b5050565b610368610669565b6103715f610695565b565b6001600160a01b0382165f908152600260205260408120546103ff906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa1580156103d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f59190610996565b6102bc9190610983565b9392505050565b5f61040f610553565b90508060015f8282546104229190610983565b90915550506040518181527fda9d4e5f101b8b9b1c5b76d0c5a9f7923571acfc02376aa076b75a8c080c956b9060200160405180910390a161047461046e5f546001600160a01b031690565b826106e4565b50565b6001600160a01b0381165f908152600260205260408120546104998342610373565b6102c291906109ad565b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690565b5f7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166105056104a3565b61050f9190610983565b905090565b61051c610669565b6001600160a01b03811661054a57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61047481610695565b5f61055d60015490565b610566426102a5565b61050f91906109ad565b5f6105796104a3565b8267ffffffffffffffff16101561059157505f6102c2565b6105996104d1565b8267ffffffffffffffff16106105b05750816102c2565b7f000000000000000000000000000000000000000000000000000000000000000067ffffffffffffffff166105e36104a3565b6105f79067ffffffffffffffff85166109ad565b61060190856109c0565b61060b91906109d7565b90506102c2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610664908490610777565b505050565b5f546001600160a01b031633146103715760405163118cdaa760e01b8152336004820152602401610541565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b804710156107075760405163cd78605960e01b8152306004820152602401610541565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610750576040519150601f19603f3d011682016040523d82523d5f602084013e610755565b606091505b505090508061066457604051630a12f52160e11b815260040160405180910390fd5b5f61078b6001600160a01b038416836107d8565b905080515f141580156107af5750808060200190518101906107ad91906109f6565b155b1561066457604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b60606103ff83835f845f80856001600160a01b031684866040516107fc9190610a15565b5f6040518083038185875af1925050503d805f8114610836576040519150601f19603f3d011682016040523d82523d5f602084013e61083b565b606091505b509150915061084b868383610855565b9695505050505050565b60608261086a57610865826108b1565b6103ff565b815115801561088157506001600160a01b0384163b155b156108aa57604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b50806103ff565b8051156108c15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b803567ffffffffffffffff811681146108f1575f80fd5b919050565b5f60208284031215610906575f80fd5b6103ff826108da565b80356001600160a01b03811681146108f1575f80fd5b5f60208284031215610935575f80fd5b6103ff8261090f565b5f806040838503121561094f575f80fd5b6109588361090f565b9150610966602084016108da565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102c2576102c261096f565b5f602082840312156109a6575f80fd5b5051919050565b818103818111156102c2576102c261096f565b80820281158282048414176102c2576102c261096f565b5f826109f157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610a06575f80fd5b815180151581146103ff575f80fd5b5f82515f5b81811015610a345760208186018101518583015201610a1a565b505f92019182525091905056fea264697066735822122073279cffe8b3e9aad25d7af6f5849e11d8cb54c7770ed515d4cd94569223faa064736f6c634300081400330000000000000000000000002f89fab29441f878d5cc83dcefd0848c5efea08a00000000000000000000000000000000000000000000000000000000662062800000000000000000000000000000000000000000000000000000000007861f80
Deployed Bytecode
0x6080604052600436106100dc575f3560e01c8063961325211161007c578063be9a655511610057578063be9a65551461024a578063efbe1c1c1461025e578063f2fde38b14610272578063fbccedae14610291575f80fd5b806396132521146101e35780639852595c146101f7578063a3f8eace1461022b575f80fd5b8063715018a6116100b7578063715018a614610176578063810ec23b1461018a57806386d1a69f146101a95780638da5cb5b146101bd575f80fd5b80630a17b06b146100e75780630fb5a6b4146101195780631916558714610155575f80fd5b366100e357005b5f80fd5b3480156100f2575f80fd5b506101066101013660046108f6565b6102a5565b6040519081526020015b60405180910390f35b348015610124575f80fd5b507f0000000000000000000000000000000000000000000000000000000007861f8067ffffffffffffffff16610106565b348015610160575f80fd5b5061017461016f366004610925565b6102c8565b005b348015610181575f80fd5b50610174610360565b348015610195575f80fd5b506101066101a436600461093e565b610373565b3480156101b4575f80fd5b50610174610406565b3480156101c8575f80fd5b505f546040516001600160a01b039091168152602001610110565b3480156101ee575f80fd5b50600154610106565b348015610202575f80fd5b50610106610211366004610925565b6001600160a01b03165f9081526002602052604090205490565b348015610236575f80fd5b50610106610245366004610925565b610477565b348015610255575f80fd5b506101066104a3565b348015610269575f80fd5b506101066104d1565b34801561027d575f80fd5b5061017461028c366004610925565b610514565b34801561029c575f80fd5b50610106610553565b5f6102c26102b260015490565b6102bc9047610983565b83610570565b92915050565b5f6102d282610477565b6001600160a01b0383165f908152600260205260408120805492935083929091906102fe908490610983565b90915550506040518181526001600160a01b038316907fc0e523490dd523c33b1878c9eb14ff46991e3f5b2cd33710918618f2a39cba1b9060200160405180910390a261035c826103565f546001600160a01b031690565b83610612565b5050565b610368610669565b6103715f610695565b565b6001600160a01b0382165f908152600260205260408120546103ff906040516370a0823160e01b81523060048201526001600160a01b038616906370a0823190602401602060405180830381865afa1580156103d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906103f59190610996565b6102bc9190610983565b9392505050565b5f61040f610553565b90508060015f8282546104229190610983565b90915550506040518181527fda9d4e5f101b8b9b1c5b76d0c5a9f7923571acfc02376aa076b75a8c080c956b9060200160405180910390a161047461046e5f546001600160a01b031690565b826106e4565b50565b6001600160a01b0381165f908152600260205260408120546104998342610373565b6102c291906109ad565b67ffffffffffffffff7f00000000000000000000000000000000000000000000000000000000662062801690565b5f7f0000000000000000000000000000000000000000000000000000000007861f8067ffffffffffffffff166105056104a3565b61050f9190610983565b905090565b61051c610669565b6001600160a01b03811661054a57604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61047481610695565b5f61055d60015490565b610566426102a5565b61050f91906109ad565b5f6105796104a3565b8267ffffffffffffffff16101561059157505f6102c2565b6105996104d1565b8267ffffffffffffffff16106105b05750816102c2565b7f0000000000000000000000000000000000000000000000000000000007861f8067ffffffffffffffff166105e36104a3565b6105f79067ffffffffffffffff85166109ad565b61060190856109c0565b61060b91906109d7565b90506102c2565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610664908490610777565b505050565b5f546001600160a01b031633146103715760405163118cdaa760e01b8152336004820152602401610541565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b804710156107075760405163cd78605960e01b8152306004820152602401610541565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610750576040519150601f19603f3d011682016040523d82523d5f602084013e610755565b606091505b505090508061066457604051630a12f52160e11b815260040160405180910390fd5b5f61078b6001600160a01b038416836107d8565b905080515f141580156107af5750808060200190518101906107ad91906109f6565b155b1561066457604051635274afe760e01b81526001600160a01b0384166004820152602401610541565b60606103ff83835f845f80856001600160a01b031684866040516107fc9190610a15565b5f6040518083038185875af1925050503d805f8114610836576040519150601f19603f3d011682016040523d82523d5f602084013e61083b565b606091505b509150915061084b868383610855565b9695505050505050565b60608261086a57610865826108b1565b6103ff565b815115801561088157506001600160a01b0384163b155b156108aa57604051639996b31560e01b81526001600160a01b0385166004820152602401610541565b50806103ff565b8051156108c15780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b803567ffffffffffffffff811681146108f1575f80fd5b919050565b5f60208284031215610906575f80fd5b6103ff826108da565b80356001600160a01b03811681146108f1575f80fd5b5f60208284031215610935575f80fd5b6103ff8261090f565b5f806040838503121561094f575f80fd5b6109588361090f565b9150610966602084016108da565b90509250929050565b634e487b7160e01b5f52601160045260245ffd5b808201808211156102c2576102c261096f565b5f602082840312156109a6575f80fd5b5051919050565b818103818111156102c2576102c261096f565b80820281158282048414176102c2576102c261096f565b5f826109f157634e487b7160e01b5f52601260045260245ffd5b500490565b5f60208284031215610a06575f80fd5b815180151581146103ff575f80fd5b5f82515f5b81811015610a345760208186018101518583015201610a1a565b505f92019182525091905056fea264697066735822122073279cffe8b3e9aad25d7af6f5849e11d8cb54c7770ed515d4cd94569223faa064736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000002f89fab29441f878d5cc83dcefd0848c5efea08a00000000000000000000000000000000000000000000000000000000662062800000000000000000000000000000000000000000000000000000000007861f80
-----Decoded View---------------
Arg [0] : beneficiary (address): 0x2f89FAb29441F878d5cc83DCEFD0848c5efEA08a
Arg [1] : startTimestamp (uint64): 1713398400
Arg [2] : durationSeconds (uint64): 126230400
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000002f89fab29441f878d5cc83dcefd0848c5efea08a
Arg [1] : 0000000000000000000000000000000000000000000000000000000066206280
Arg [2] : 0000000000000000000000000000000000000000000000000000000007861f80
Deployed Bytecode Sourcemap
29013:244:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27808:167;;;;;;;;;;-1:-1:-1;27808:167:0;;;;;:::i;:::-;;:::i;:::-;;;525:25:1;;;513:2;498:18;27808:167:0;;;;;;;;25790:93;;;;;;;;;;-1:-1:-1;25866:9:0;25859:16;;25790:93;;27412:251;;;;;;;;;;-1:-1:-1;27412:251:0;;;;;:::i;:::-;;:::i;:::-;;3396:103;;;;;;;;;;;;;:::i;28121:204::-;;;;;;;;;;-1:-1:-1;28121:204:0;;;;;:::i;:::-;;:::i;27078:203::-;;;;;;;;;;;;;:::i;2721:87::-;;;;;;;;;;-1:-1:-1;2767:7:0;2794:6;2721:87;;-1:-1:-1;;;;;2794:6:0;;;1339:51:1;;1327:2;1312:18;2721:87:0;1193:203:1;26121:93:0;;;;;;;;;;-1:-1:-1;26197:9:0;;26121:93;;26286:118;;;;;;;;;;-1:-1:-1;26286:118:0;;;;;:::i;:::-;-1:-1:-1;;;;;26375:21:0;26348:7;26375:21;;;:14;:21;;;;;;;26286:118;26772:161;;;;;;;;;;-1:-1:-1;26772:161:0;;;;;:::i;:::-;;:::i;25631:87::-;;;;;;;;;;;;;:::i;25952:99::-;;;;;;;;;;;;;:::i;3654:220::-;;;;;;;;;;-1:-1:-1;3654:220:0;;;;;:::i;:::-;;:::i;26484:136::-;;;;;;;;;;;;;:::i;27808:167::-;27877:7;27904:63;27945:10;26197:9;;;26121:93;27945:10;27921:34;;:21;:34;:::i;:::-;27957:9;27904:16;:63::i;:::-;27897:70;27808:167;-1:-1:-1;;27808:167:0:o;27412:251::-;27470:14;27487:17;27498:5;27487:10;:17::i;:::-;-1:-1:-1;;;;;27515:21:0;;;;;;:14;:21;;;;;:31;;27470:34;;-1:-1:-1;27470:34:0;;27515:21;;;:31;;27470:34;;27515:31;:::i;:::-;;;;-1:-1:-1;;27562:28:0;;525:25:1;;;-1:-1:-1;;;;;27562:28:0;;;;;513:2:1;498:18;27562:28:0;;;;;;;27601:54;27631:5;27639:7;2767;2794:6;-1:-1:-1;;;;;2794:6:0;;2721:87;27639:7;27648:6;27601:22;:54::i;:::-;27459:204;27412:251;:::o;3396:103::-;2607:13;:11;:13::i;:::-;3461:30:::1;3488:1;3461:18;:30::i;:::-;3396:103::o:0;28121:204::-;-1:-1:-1;;;;;26375:21:0;;28205:7;26375:21;;;:14;:21;;;;;;28232:85;;28249:38;;-1:-1:-1;;;28249:38:0;;28281:4;28249:38;;;1339:51:1;-1:-1:-1;;;;;28249:23:0;;;;;1312:18:1;;28249:38:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:56;;;;:::i;28232:85::-;28225:92;28121:204;-1:-1:-1;;;28121:204:0:o;27078:203::-;27123:14;27140:12;:10;:12::i;:::-;27123:29;;27176:6;27163:9;;:19;;;;;;;:::i;:::-;;;;-1:-1:-1;;27198:21:0;;525:25:1;;;27198:21:0;;513:2:1;498:18;27198:21:0;;;;;;;27230:43;27256:7;2767;2794:6;-1:-1:-1;;;;;2794:6:0;;2721:87;27256:7;27266:6;27230:17;:43::i;:::-;27112:169;27078:203::o;26772:161::-;-1:-1:-1;;;;;26375:21:0;;26836:7;26375:21;;;:14;:21;;;;;;26863:44;26876:5;26890:15;26863:12;:44::i;:::-;:62;;;;:::i;25631:87::-;25697:13;25704:6;25697:13;;25631:87::o;25952:99::-;25996:7;25866:9;25859:16;;26023:7;:5;:7::i;:::-;:20;;;;:::i;:::-;26016:27;;25952:99;:::o;3654:220::-;2607:13;:11;:13::i;:::-;-1:-1:-1;;;;;3739:22:0;::::1;3735:93;;3785:31;::::0;-1:-1:-1;;;3785:31:0;;3813:1:::1;3785:31;::::0;::::1;1339:51:1::0;1312:18;;3785:31:0::1;;;;;;;;3735:93;3838:28;3857:8;3838:18;:28::i;26484:136::-:0;26535:7;26602:10;26197:9;;;26121:93;26602:10;26562:37;26582:15;26562:12;:37::i;:::-;:50;;;;:::i;28526:360::-;28626:7;28662;:5;:7::i;:::-;28650:9;:19;;;28646:233;;;-1:-1:-1;28693:1:0;28686:8;;28646:233;28729:5;:3;:5::i;:::-;28716:9;:18;;;28712:167;;-1:-1:-1;28758:15:0;28751:22;;28712:167;25866:9;25859:16;;28845:7;:5;:7::i;:::-;28833:19;;;;;;:::i;:::-;28814:39;;:15;:39;:::i;:::-;28813:54;;;;:::i;:::-;28806:61;;;;18731:162;18841:43;;;-1:-1:-1;;;;;2572:32:1;;18841:43:0;;;2554:51:1;2621:18;;;;2614:34;;;18841:43:0;;;;;;;;;;2527:18:1;;;;18841:43:0;;;;;;;;-1:-1:-1;;;;;18841:43:0;-1:-1:-1;;;18841:43:0;;;18814:71;;18834:5;;18814:19;:71::i;:::-;18731:162;;;:::o;2886:166::-;2767:7;2794:6;-1:-1:-1;;;;;2794:6:0;810:10;2946:23;2942:103;;2993:40;;-1:-1:-1;;;2993:40:0;;810:10;2993:40;;;1339:51:1;1312:18;;2993:40:0;1193:203:1;4034:191:0;4108:16;4127:6;;-1:-1:-1;;;;;4144:17:0;;;-1:-1:-1;;;;;;4144:17:0;;;;;;4177:40;;4127:6;;;;;;;4177:40;;4108:16;4177:40;4097:128;4034:191;:::o;5826:340::-;5936:6;5912:21;:30;5908:111;;;5966:41;;-1:-1:-1;;;5966:41:0;;6001:4;5966:41;;;1339:51:1;1312:18;;5966:41:0;1193:203:1;5908:111:0;6032:12;6050:9;-1:-1:-1;;;;;6050:14:0;6072:6;6050:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6031:52;;;6099:7;6094:65;;6130:17;;-1:-1:-1;;;6130:17:0;;;;;;;;;;;21542:638;21966:23;21992:33;-1:-1:-1;;;;;21992:27:0;;22020:4;21992:27;:33::i;:::-;21966:59;;22040:10;:17;22061:1;22040:22;;:57;;;;;22078:10;22067:30;;;;;;;;;;;;:::i;:::-;22066:31;22040:57;22036:137;;;22121:40;;-1:-1:-1;;;22121:40:0;;-1:-1:-1;;;;;1357:32:1;;22121:40:0;;;1339:51:1;1312:18;;22121:40:0;1193:203:1;7029:153:0;7104:12;7136:38;7158:6;7166:4;7172:1;7104:12;7762;7776:23;7803:6;-1:-1:-1;;;;;7803:11:0;7822:5;7829:4;7803:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7761:73;;;;7852:55;7879:6;7887:7;7896:10;7852:26;:55::i;:::-;7845:62;7517:398;-1:-1:-1;;;;;;7517:398:0:o;8993:597::-;9141:12;9171:7;9166:417;;9195:19;9203:10;9195:7;:19::i;:::-;9166:417;;;9423:17;;:22;:49;;;;-1:-1:-1;;;;;;9449:18:0;;;:23;9423:49;9419:121;;;9500:24;;-1:-1:-1;;;9500:24:0;;-1:-1:-1;;;;;1357:32:1;;9500:24:0;;;1339:51:1;1312:18;;9500:24:0;1193:203:1;9419:121:0;-1:-1:-1;9561:10:0;9554:17;;10143:528;10276:17;;:21;10272:392;;10508:10;10502:17;10565:15;10552:10;10548:2;10544:19;10537:44;10272:392;10635:17;;-1:-1:-1;;;10635:17:0;;;;;;;;;;;14:171:1;81:20;;141:18;130:30;;120:41;;110:69;;175:1;172;165:12;110:69;14:171;;;:::o;190:184::-;248:6;301:2;289:9;280:7;276:23;272:32;269:52;;;317:1;314;307:12;269:52;340:28;358:9;340:28;:::i;561:173::-;629:20;;-1:-1:-1;;;;;678:31:1;;668:42;;658:70;;724:1;721;714:12;739:186;798:6;851:2;839:9;830:7;826:23;822:32;819:52;;;867:1;864;857:12;819:52;890:29;909:9;890:29;:::i;930:258::-;997:6;1005;1058:2;1046:9;1037:7;1033:23;1029:32;1026:52;;;1074:1;1071;1064:12;1026:52;1097:29;1116:9;1097:29;:::i;:::-;1087:39;;1145:37;1178:2;1167:9;1163:18;1145:37;:::i;:::-;1135:47;;930:258;;;;;:::o;1401:127::-;1462:10;1457:3;1453:20;1450:1;1443:31;1493:4;1490:1;1483:15;1517:4;1514:1;1507:15;1533:125;1598:9;;;1619:10;;;1616:36;;;1632:18;;:::i;1663:184::-;1733:6;1786:2;1774:9;1765:7;1761:23;1757:32;1754:52;;;1802:1;1799;1792:12;1754:52;-1:-1:-1;1825:16:1;;1663:184;-1:-1:-1;1663:184:1:o;1852:128::-;1919:9;;;1940:11;;;1937:37;;;1954:18;;:::i;1985:168::-;2058:9;;;2089;;2106:15;;;2100:22;;2086:37;2076:71;;2127:18;;:::i;2158:217::-;2198:1;2224;2214:132;;2268:10;2263:3;2259:20;2256:1;2249:31;2303:4;2300:1;2293:15;2331:4;2328:1;2321:15;2214:132;-1:-1:-1;2360:9:1;;2158:217::o;2869:277::-;2936:6;2989:2;2977:9;2968:7;2964:23;2960:32;2957:52;;;3005:1;3002;2995:12;2957:52;3037:9;3031:16;3090:5;3083:13;3076:21;3069:5;3066:32;3056:60;;3112:1;3109;3102:12;3151:412;3280:3;3318:6;3312:13;3343:1;3353:129;3367:6;3364:1;3361:13;3353:129;;;3465:4;3449:14;;;3445:25;;3439:32;3426:11;;;3419:53;3382:12;3353:129;;;-1:-1:-1;3537:1:1;3501:16;;3526:13;;;-1:-1:-1;3501:16:1;3151:412;-1:-1:-1;3151:412:1:o
Swarm Source
ipfs://73279cffe8b3e9aad25d7af6f5849e11d8cb54c7770ed515d4cd94569223faa0
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.