More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 737 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Migrate With Gas... | 21502450 | 3 hrs ago | IN | 0 ETH | 0.00092749 | ||||
Migrate With Gas... | 21500321 | 10 hrs ago | IN | 0 ETH | 0.00041207 | ||||
Migrate Gasless ... | 21487599 | 2 days ago | IN | 0 ETH | 0.00109267 | ||||
Migrate With Gas... | 21481947 | 2 days ago | IN | 0 ETH | 0.00057868 | ||||
Migrate With Gas... | 21480891 | 3 days ago | IN | 0 ETH | 0.00085872 | ||||
Migrate Gasless ... | 21474332 | 4 days ago | IN | 0 ETH | 0.0009531 | ||||
Migrate With Gas... | 21472401 | 4 days ago | IN | 0 ETH | 0.00064445 | ||||
Migrate With Gas... | 21472392 | 4 days ago | IN | 0 ETH | 0.00059449 | ||||
Migrate With Gas... | 21471673 | 4 days ago | IN | 0 ETH | 0.0006382 | ||||
Migrate With Gas... | 21466582 | 5 days ago | IN | 0 ETH | 0.00162359 | ||||
Migrate With Gas... | 21466115 | 5 days ago | IN | 0 ETH | 0.00231742 | ||||
Migrate Gasless ... | 21465902 | 5 days ago | IN | 0 ETH | 0.00353722 | ||||
Migrate With Gas... | 21453733 | 6 days ago | IN | 0 ETH | 0.00084504 | ||||
Migrate With Gas... | 21451538 | 7 days ago | IN | 0 ETH | 0.00113976 | ||||
Migrate Gasless ... | 21450526 | 7 days ago | IN | 0 ETH | 0.00088986 | ||||
Migrate With Gas... | 21450519 | 7 days ago | IN | 0 ETH | 0.00074449 | ||||
Migrate With Gas... | 21450060 | 7 days ago | IN | 0 ETH | 0.00084355 | ||||
Migrate With Gas... | 21442801 | 8 days ago | IN | 0 ETH | 0.00431295 | ||||
Migrate With Gas... | 21442160 | 8 days ago | IN | 0 ETH | 0.00135232 | ||||
Migrate | 21441617 | 8 days ago | IN | 0 ETH | 0.00074397 | ||||
Migrate With Gas... | 21438353 | 9 days ago | IN | 0 ETH | 0.00893089 | ||||
Migrate With Gas... | 21437919 | 9 days ago | IN | 0 ETH | 0.00210684 | ||||
Migrate | 21437492 | 9 days ago | IN | 0 ETH | 0.00337896 | ||||
Migrate With Gas... | 21433072 | 9 days ago | IN | 0 ETH | 0.00150064 | ||||
Migrate With Gas... | 21432467 | 9 days ago | IN | 0 ETH | 0.00171681 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
XdefiToCtrlMigration
Compiler Version
v0.8.26+commit.8a97fa7a
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-09-11 */ // 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/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/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/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/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/token/ERC20/extensions/IERC20Metadata.sol // OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol) pragma solidity ^0.8.20; /** * @dev Interface for the optional metadata functions from the ERC20 standard. */ interface IERC20Metadata is IERC20 { /** * @dev Returns the name of the token. */ function name() external view returns (string memory); /** * @dev Returns the symbol of the token. */ function symbol() external view returns (string memory); /** * @dev Returns the decimals places of the token. */ function decimals() external view returns (uint8); } // File: @openzeppelin/contracts/interfaces/IERC4626.sol // OpenZeppelin Contracts (last updated v5.0.0) (interfaces/IERC4626.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC4626 "Tokenized Vault Standard", as defined in * https://eips.ethereum.org/EIPS/eip-4626[ERC-4626]. */ interface IERC4626 is IERC20, IERC20Metadata { event Deposit(address indexed sender, address indexed owner, uint256 assets, uint256 shares); event Withdraw( address indexed sender, address indexed receiver, address indexed owner, uint256 assets, uint256 shares ); /** * @dev Returns the address of the underlying token used for the Vault for accounting, depositing, and withdrawing. * * - MUST be an ERC-20 token contract. * - MUST NOT revert. */ function asset() external view returns (address assetTokenAddress); /** * @dev Returns the total amount of the underlying asset that is “managed” by Vault. * * - SHOULD include any compounding that occurs from yield. * - MUST be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT revert. */ function totalAssets() external view returns (uint256 totalManagedAssets); /** * @dev Returns the amount of shares that the Vault would exchange for the amount of assets provided, in an ideal * scenario where all the conditions are met. * * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT show any variations depending on the caller. * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. * - MUST NOT revert. * * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and * from. */ function convertToShares(uint256 assets) external view returns (uint256 shares); /** * @dev Returns the amount of assets that the Vault would exchange for the amount of shares provided, in an ideal * scenario where all the conditions are met. * * - MUST NOT be inclusive of any fees that are charged against assets in the Vault. * - MUST NOT show any variations depending on the caller. * - MUST NOT reflect slippage or other on-chain conditions, when performing the actual exchange. * - MUST NOT revert. * * NOTE: This calculation MAY NOT reflect the “per-user” price-per-share, and instead should reflect the * “average-user’s” price-per-share, meaning what the average user should expect to see when exchanging to and * from. */ function convertToAssets(uint256 shares) external view returns (uint256 assets); /** * @dev Returns the maximum amount of the underlying asset that can be deposited into the Vault for the receiver, * through a deposit call. * * - MUST return a limited value if receiver is subject to some deposit limit. * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of assets that may be deposited. * - MUST NOT revert. */ function maxDeposit(address receiver) external view returns (uint256 maxAssets); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given * current on-chain conditions. * * - MUST return as close to and no more than the exact amount of Vault shares that would be minted in a deposit * call in the same transaction. I.e. deposit should return the same or more shares as previewDeposit if called * in the same transaction. * - MUST NOT account for deposit limits like those returned from maxDeposit and should always act as though the * deposit would be accepted, regardless if the user has enough tokens approved, etc. * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToShares and previewDeposit SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by depositing. */ function previewDeposit(uint256 assets) external view returns (uint256 shares); /** * @dev Mints shares Vault shares to receiver by depositing exactly amount of underlying tokens. * * - MUST emit the Deposit event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * deposit execution, and are accounted for during deposit. * - MUST revert if all of assets cannot be deposited (due to deposit limit being reached, slippage, the user not * approving enough underlying tokens to the Vault contract, etc). * * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. */ function deposit(uint256 assets, address receiver) external returns (uint256 shares); /** * @dev Returns the maximum amount of the Vault shares that can be minted for the receiver, through a mint call. * - MUST return a limited value if receiver is subject to some mint limit. * - MUST return 2 ** 256 - 1 if there is no limit on the maximum amount of shares that may be minted. * - MUST NOT revert. */ function maxMint(address receiver) external view returns (uint256 maxShares); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given * current on-chain conditions. * * - MUST return as close to and no fewer than the exact amount of assets that would be deposited in a mint call * in the same transaction. I.e. mint should return the same or fewer assets as previewMint if called in the * same transaction. * - MUST NOT account for mint limits like those returned from maxMint and should always act as though the mint * would be accepted, regardless if the user has enough tokens approved, etc. * - MUST be inclusive of deposit fees. Integrators should be aware of the existence of deposit fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToAssets and previewMint SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by minting. */ function previewMint(uint256 shares) external view returns (uint256 assets); /** * @dev Mints exactly shares Vault shares to receiver by depositing amount of underlying tokens. * * - MUST emit the Deposit event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the mint * execution, and are accounted for during mint. * - MUST revert if all of shares cannot be minted (due to deposit limit being reached, slippage, the user not * approving enough underlying tokens to the Vault contract, etc). * * NOTE: most implementations will require pre-approval of the Vault with the Vault’s underlying asset token. */ function mint(uint256 shares, address receiver) external returns (uint256 assets); /** * @dev Returns the maximum amount of the underlying asset that can be withdrawn from the owner balance in the * Vault, through a withdraw call. * * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. * - MUST NOT revert. */ function maxWithdraw(address owner) external view returns (uint256 maxAssets); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, * given current on-chain conditions. * * - MUST return as close to and no fewer than the exact amount of Vault shares that would be burned in a withdraw * call in the same transaction. I.e. withdraw should return the same or fewer shares as previewWithdraw if * called * in the same transaction. * - MUST NOT account for withdrawal limits like those returned from maxWithdraw and should always act as though * the withdrawal would be accepted, regardless if the user has enough shares, etc. * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToShares and previewWithdraw SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by depositing. */ function previewWithdraw(uint256 assets) external view returns (uint256 shares); /** * @dev Burns shares from owner and sends exactly assets of underlying tokens to receiver. * * - MUST emit the Withdraw event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * withdraw execution, and are accounted for during withdraw. * - MUST revert if all of assets cannot be withdrawn (due to withdrawal limit being reached, slippage, the owner * not having enough shares, etc). * * Note that some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ function withdraw(uint256 assets, address receiver, address owner) external returns (uint256 shares); /** * @dev Returns the maximum amount of Vault shares that can be redeemed from the owner balance in the Vault, * through a redeem call. * * - MUST return a limited value if owner is subject to some withdrawal limit or timelock. * - MUST return balanceOf(owner) if owner is not subject to any withdrawal limit or timelock. * - MUST NOT revert. */ function maxRedeem(address owner) external view returns (uint256 maxShares); /** * @dev Allows an on-chain or off-chain user to simulate the effects of their redeemption at the current block, * given current on-chain conditions. * * - MUST return as close to and no more than the exact amount of assets that would be withdrawn in a redeem call * in the same transaction. I.e. redeem should return the same or more assets as previewRedeem if called in the * same transaction. * - MUST NOT account for redemption limits like those returned from maxRedeem and should always act as though the * redemption would be accepted, regardless if the user has enough shares, etc. * - MUST be inclusive of withdrawal fees. Integrators should be aware of the existence of withdrawal fees. * - MUST NOT revert. * * NOTE: any unfavorable discrepancy between convertToAssets and previewRedeem SHOULD be considered slippage in * share price or some other type of condition, meaning the depositor will lose assets by redeeming. */ function previewRedeem(uint256 shares) external view returns (uint256 assets); /** * @dev Burns exactly shares from owner and sends assets of underlying tokens to receiver. * * - MUST emit the Withdraw event. * - MAY support an additional flow in which the underlying tokens are owned by the Vault contract before the * redeem execution, and are accounted for during redeem. * - MUST revert if all of shares cannot be redeemed (due to withdrawal limit being reached, slippage, the owner * not having enough shares, etc). * * NOTE: some implementations will require pre-requesting to the Vault before a withdrawal may be performed. * Those methods should be performed separately. */ function redeem(uint256 shares, address receiver, address owner) external returns (uint256 assets); } // File: migration/contracts/XdefiToCtrlMigration.sol pragma solidity ^0.8.0; contract XdefiToCtrlMigration is Ownable { using SafeERC20 for IERC20; IERC20 public oldToken; IERC20 public newToken; IERC4626 public poolToken; uint256 public validUntil; event Migrated(address indexed user, uint256 amount); /** * @dev Throws if the migration is disabled. * The migration is disabled after the validUntil timestamp. */ modifier timeLock() { require(block.timestamp < validUntil, "Migration is disabled"); _; } /** * @dev Initializes the contract with the old token, new token, and pool token addresses. * @param _oldToken The address of the old token (XDEFI). * @param _newToken The address of the new token (CTRL). * @param _poolToken The address of the pool token (vXDEFI). */ constructor(IERC20 _oldToken, IERC20 _newToken, IERC4626 _poolToken) Ownable(msg.sender) { require(address(_oldToken) != address(0), "Old token address cannot be zero"); require(address(_newToken) != address(0), "New token address cannot be zero"); require(address(_poolToken) != address(0), "Pool token address cannot be zero"); oldToken = _oldToken; newToken = _newToken; poolToken = _poolToken; } /** * @dev Sets the validUntil timestamp for the migration. * function can only be called by the owner. * @param _validUntil The new validUntil timestamp. */ function setTimeLock(uint256 _validUntil) external onlyOwner { validUntil = _validUntil; } /** * @dev Migrates old tokens (XDEFI) to new tokens (CTRL) for the caller. * @param amount The amount of old tokens to migrate. * @param deadline The permit deadline for the old token. * @param v The recovery byte of the old token's signature. * @param r The first 32 bytes of the old token's signature. * @param s The second 32 bytes of the old token's signature. */ function migrate(uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external timeLock { // Approve oldToken with EIP-2612 try IERC20Permit(address(oldToken)).permit(msg.sender, address(this), amount, deadline, v, r, s) {} catch {} // Transfer old tokens from the user to this contract oldToken.safeTransferFrom(msg.sender, address(this), amount); // Transfer new tokens to the user newToken.safeTransfer(msg.sender, amount); emit Migrated(msg.sender, amount); } /** * @dev Migrates old tokens (XDEFI) to new tokens (CTRL) on behalf of a user in a gasless manner. * @param user The address of the user on whose behalf the migration is performed. * @param amount The amount of old tokens to migrate. * @param deadline The permit deadline for the old token. * @param v The recovery byte of the old token's signature. * @param r The first 32 bytes of the old token's signature. * @param s The second 32 bytes of the old token's signature. */ function migrateWithGaslessApproval(address user, uint256 amount, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external timeLock { // Approve oldToken with EIP-2612 on behalf of the user try IERC20Permit(address(oldToken)).permit(user, address(this), amount, deadline, v, r, s) {} catch {} // Transfer old tokens from the user to this contract oldToken.safeTransferFrom(user, address(this), amount); // Transfer new tokens to the user newToken.safeTransfer(user, amount); emit Migrated(user, amount); } /** * @dev Migrates pool tokens (vXDEFI) to new tokens (CTRL) for the caller. * @param shares The amount of pool tokens to migrate. * @param deadline The permit deadline for the pool token. * @param v The recovery byte of the pool token's signature. * @param r The first 32 bytes of the pool token's signature. * @param s The second 32 bytes of the pool token's signature. */ function migrateFromVXDEFI(uint256 shares, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external timeLock { // Approve vXDEFI with EIP-2612 try IERC20Permit(address(poolToken)).permit(msg.sender, address(this), shares, deadline, v, r, s) {} catch {} // Transfer vXDEFI tokens from the user to this contract poolToken.transferFrom(msg.sender, address(this), shares); // Redeem vXDEFI for XDEFI uint256 xdefiAmount = poolToken.redeem(shares, address(this), address(this)); // Transfer new tokens to the user newToken.safeTransfer(msg.sender, xdefiAmount); emit Migrated(msg.sender, xdefiAmount); } /** * @dev Migrates pool tokens (vXDEFI) to new tokens (CTRL) on behalf of a user in a gasless manner. * @param user The address of the user on whose behalf the migration is performed. * @param shares The amount of pool tokens to migrate. * @param deadline The permit deadline for the pool token. * @param v The recovery byte of the pool token's signature. * @param r The first 32 bytes of the pool token's signature. * @param s The second 32 bytes of the pool token's signature. */ function migrateGaslessFromVXDEFI(address user, uint256 shares, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external timeLock { // Approve vXDEFI with EIP-2612 on behalf of the user try IERC20Permit(address(poolToken)).permit(user, address(this), shares, deadline, v, r, s) {} catch {} // Transfer vXDEFI tokens from the user to this contract poolToken.transferFrom(user, address(this), shares); // Redeem vXDEFI for XDEFI uint256 xdefiAmount = poolToken.redeem(shares, address(this), address(this)); // Transfer new tokens to the user newToken.safeTransfer(user, xdefiAmount); emit Migrated(user, xdefiAmount); } /** * @dev Withdraws old tokens (XDEFI) from the contract. * @param amount The amount of old tokens to withdraw. */ function withdrawOldTokens(uint256 amount) external onlyOwner { oldToken.safeTransfer(msg.sender, amount); } /** * @dev Withdraws new tokens (CTRL) from the contract. * @param amount The amount of new tokens to withdraw. */ function withdrawNewTokens(uint256 amount) external onlyOwner { newToken.safeTransfer(msg.sender, amount); } /** * @dev Withdraws pool tokens (vXDEFI) from the contract. * @param amount The amount of pool tokens to withdraw. */ function withdrawPoolTokens(uint256 amount) external onlyOwner { poolToken.transfer(msg.sender, amount); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract IERC20","name":"_oldToken","type":"address"},{"internalType":"contract IERC20","name":"_newToken","type":"address"},{"internalType":"contract IERC4626","name":"_poolToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"target","type":"address"}],"name":"AddressEmptyCode","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"AddressInsufficientBalance","type":"error"},{"inputs":[],"name":"FailedInnerCall","type":"error"},{"inputs":[{"internalType":"address","name":"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":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Migrated","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":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"migrateFromVXDEFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"shares","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"migrateGaslessFromVXDEFI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"migrateWithGaslessApproval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"newToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"oldToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolToken","outputs":[{"internalType":"contract IERC4626","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_validUntil","type":"uint256"}],"name":"setTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validUntil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawNewTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawOldTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdrawPoolTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801561000f575f80fd5b50604051610fab380380610fab83398101604081905261002e91610212565b338061005457604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b61005d816101ac565b506001600160a01b0383166100b45760405162461bcd60e51b815260206004820181905260248201527f4f6c6420746f6b656e20616464726573732063616e6e6f74206265207a65726f604482015260640161004b565b6001600160a01b03821661010a5760405162461bcd60e51b815260206004820181905260248201527f4e657720746f6b656e20616464726573732063616e6e6f74206265207a65726f604482015260640161004b565b6001600160a01b03811661016a5760405162461bcd60e51b815260206004820152602160248201527f506f6f6c20746f6b656e20616464726573732063616e6e6f74206265207a65726044820152606f60f81b606482015260840161004b565b600180546001600160a01b039485166001600160a01b03199182161790915560028054938516938216939093179092556003805491909316911617905561025c565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b038116811461020f575f80fd5b50565b5f805f60608486031215610224575f80fd5b835161022f816101fb565b6020850151909350610240816101fb565b6040850151909250610251816101fb565b809150509250925092565b610d42806102695f395ff3fe608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063b31c710a11610093578063d7dfc7c211610063578063d7dfc7c2146101d2578063ddac6654146101e5578063e33f2499146101fc578063f2fde38b1461020f575f80fd5b8063b31c710a14610186578063c42bd05a14610199578063ca212509146101ac578063cbdf382c146101bf575f80fd5b806380ea5961116100ce57806380ea59611461012457806381620863146101375780638da5cb5b1461014a5780639dd1ed1b14610173575f80fd5b806327669255146100f45780635bcb318a14610109578063715018a61461011c575b5f80fd5b610107610102366004610b69565b610222565b005b610107610117366004610bbd565b610318565b610107610325565b610107610132366004610bd4565b610338565b610107610145366004610bbd565b610416565b5f546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b610107610181366004610bbd565b610438565b600154610156906001600160a01b031681565b600254610156906001600160a01b031681565b6101076101ba366004610bd4565b6104b6565b600354610156906001600160a01b031681565b6101076101e0366004610b69565b610667565b6101ee60045481565b60405190815260200161016a565b61010761020a366004610bbd565b610834565b61010761021d366004610c17565b610853565b600454421061024c5760405162461bcd60e51b815260040161024390610c30565b60405180910390fd5b60015460405163d505accf60e01b81526001600160a01b039091169063d505accf9061028890899030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b15801561029f575f80fd5b505af19250505080156102b0575060015b506001546102c9906001600160a01b031687308861088d565b6002546102e0906001600160a01b031687876108fa565b856001600160a01b03165f80516020610ced8339815191528660405161030891815260200190565b60405180910390a2505050505050565b610320610930565b600455565b61032d610930565b6103365f61095c565b565b60045442106103595760405162461bcd60e51b815260040161024390610c30565b60015460405163d505accf60e01b81526001600160a01b039091169063d505accf9061039590339030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b1580156103ac575f80fd5b505af19250505080156103bd575060015b506001546103d6906001600160a01b031633308861088d565b6002546103ed906001600160a01b031633876108fa565b60405185815233905f80516020610ced8339815191529060200160405180910390a25050505050565b61041e610930565b600154610435906001600160a01b031633836108fa565b50565b610440610930565b60035460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303815f875af115801561048e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b29190610ca0565b5050565b60045442106104d75760405162461bcd60e51b815260040161024390610c30565b60035460405163d505accf60e01b81526001600160a01b039091169063d505accf9061051390339030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b15801561052a575f80fd5b505af192505050801561053b575060015b506003546040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015610590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190610ca0565b50600354604051635d043b2960e11b815260048101879052306024820181905260448201525f916001600160a01b03169063ba087652906064016020604051808303815f875af115801561060a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062e9190610cbf565b600254909150610648906001600160a01b031633836108fa565b60405181815233905f80516020610ced83398151915290602001610308565b60045442106106885760405162461bcd60e51b815260040161024390610c30565b60035460405163d505accf60e01b81526001600160a01b039091169063d505accf906106c490899030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b1580156106db575f80fd5b505af19250505080156106ec575060015b506003546040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201889052909116906323b872dd906064016020604051808303815f875af1158015610743573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107679190610ca0565b50600354604051635d043b2960e11b815260048101879052306024820181905260448201525f916001600160a01b03169063ba087652906064016020604051808303815f875af11580156107bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e19190610cbf565b6002549091506107fb906001600160a01b031688836108fa565b866001600160a01b03165f80516020610ced8339815191528260405161082391815260200190565b60405180910390a250505050505050565b61083c610930565b600254610435906001600160a01b031633836108fa565b61085b610930565b6001600160a01b03811661088457604051631e4fbdf760e01b81525f6004820152602401610243565b6104358161095c565b6040516001600160a01b0384811660248301528381166044830152606482018390526108f49186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506109ab565b50505050565b6040516001600160a01b0383811660248301526044820183905261092b91859182169063a9059cbb906064016108c2565b505050565b5f546001600160a01b031633146103365760405163118cdaa760e01b8152336004820152602401610243565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6109bf6001600160a01b03841683610a0c565b905080515f141580156109e35750808060200190518101906109e19190610ca0565b155b1561092b57604051635274afe760e01b81526001600160a01b0384166004820152602401610243565b6060610a1983835f610a20565b9392505050565b606081471015610a455760405163cd78605960e01b8152306004820152602401610243565b5f80856001600160a01b03168486604051610a609190610cd6565b5f6040518083038185875af1925050503d805f8114610a9a576040519150601f19603f3d011682016040523d82523d5f602084013e610a9f565b606091505b5091509150610aaf868383610ab9565b9695505050505050565b606082610ace57610ac982610b15565b610a19565b8151158015610ae557506001600160a01b0384163b155b15610b0e57604051639996b31560e01b81526001600160a01b0385166004820152602401610243565b5080610a19565b805115610b255780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114610b54575f80fd5b919050565b803560ff81168114610b54575f80fd5b5f805f805f8060c08789031215610b7e575f80fd5b610b8787610b3e565b95506020870135945060408701359350610ba360608801610b59565b9598949750929560808101359460a0909101359350915050565b5f60208284031215610bcd575f80fd5b5035919050565b5f805f805f60a08688031215610be8575f80fd5b8535945060208601359350610bff60408701610b59565b94979396509394606081013594506080013592915050565b5f60208284031215610c27575f80fd5b610a1982610b3e565b602080825260159082015274135a59dc985d1a5bdb881a5cc8191a5cd8589b1959605a1b604082015260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b5f60208284031215610cb0575f80fd5b81518015158114610a19575f80fd5b5f60208284031215610ccf575f80fd5b5051919050565b5f82518060208501845e5f92019182525091905056fe8b80bd19aea7b735bc6d75db8d6adbe18b28c30d62b3555245eb67b2340caedca2646970667358221220eec787246d1f3b74fabe29031c566e72fcd100d1ccb4ead1d311125b2588fe6c64736f6c634300081a003300000000000000000000000072b886d09c117654ab7da13a14d603001de0b777000000000000000000000000e50e009ddb1a4d8ec668eac9d8b2df1f96348707000000000000000000000000e1a3864dbf62fb94834b108ff6bf439ce70183ac
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106100f0575f3560e01c8063b31c710a11610093578063d7dfc7c211610063578063d7dfc7c2146101d2578063ddac6654146101e5578063e33f2499146101fc578063f2fde38b1461020f575f80fd5b8063b31c710a14610186578063c42bd05a14610199578063ca212509146101ac578063cbdf382c146101bf575f80fd5b806380ea5961116100ce57806380ea59611461012457806381620863146101375780638da5cb5b1461014a5780639dd1ed1b14610173575f80fd5b806327669255146100f45780635bcb318a14610109578063715018a61461011c575b5f80fd5b610107610102366004610b69565b610222565b005b610107610117366004610bbd565b610318565b610107610325565b610107610132366004610bd4565b610338565b610107610145366004610bbd565b610416565b5f546001600160a01b03165b6040516001600160a01b0390911681526020015b60405180910390f35b610107610181366004610bbd565b610438565b600154610156906001600160a01b031681565b600254610156906001600160a01b031681565b6101076101ba366004610bd4565b6104b6565b600354610156906001600160a01b031681565b6101076101e0366004610b69565b610667565b6101ee60045481565b60405190815260200161016a565b61010761020a366004610bbd565b610834565b61010761021d366004610c17565b610853565b600454421061024c5760405162461bcd60e51b815260040161024390610c30565b60405180910390fd5b60015460405163d505accf60e01b81526001600160a01b039091169063d505accf9061028890899030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b15801561029f575f80fd5b505af19250505080156102b0575060015b506001546102c9906001600160a01b031687308861088d565b6002546102e0906001600160a01b031687876108fa565b856001600160a01b03165f80516020610ced8339815191528660405161030891815260200190565b60405180910390a2505050505050565b610320610930565b600455565b61032d610930565b6103365f61095c565b565b60045442106103595760405162461bcd60e51b815260040161024390610c30565b60015460405163d505accf60e01b81526001600160a01b039091169063d505accf9061039590339030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b1580156103ac575f80fd5b505af19250505080156103bd575060015b506001546103d6906001600160a01b031633308861088d565b6002546103ed906001600160a01b031633876108fa565b60405185815233905f80516020610ced8339815191529060200160405180910390a25050505050565b61041e610930565b600154610435906001600160a01b031633836108fa565b50565b610440610930565b60035460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303815f875af115801561048e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b29190610ca0565b5050565b60045442106104d75760405162461bcd60e51b815260040161024390610c30565b60035460405163d505accf60e01b81526001600160a01b039091169063d505accf9061051390339030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b15801561052a575f80fd5b505af192505050801561053b575060015b506003546040516323b872dd60e01b8152336004820152306024820152604481018790526001600160a01b03909116906323b872dd906064016020604051808303815f875af1158015610590573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105b49190610ca0565b50600354604051635d043b2960e11b815260048101879052306024820181905260448201525f916001600160a01b03169063ba087652906064016020604051808303815f875af115801561060a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062e9190610cbf565b600254909150610648906001600160a01b031633836108fa565b60405181815233905f80516020610ced83398151915290602001610308565b60045442106106885760405162461bcd60e51b815260040161024390610c30565b60035460405163d505accf60e01b81526001600160a01b039091169063d505accf906106c490899030908a908a908a908a908a90600401610c5f565b5f604051808303815f87803b1580156106db575f80fd5b505af19250505080156106ec575060015b506003546040516323b872dd60e01b81526001600160a01b03888116600483015230602483015260448201889052909116906323b872dd906064016020604051808303815f875af1158015610743573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107679190610ca0565b50600354604051635d043b2960e11b815260048101879052306024820181905260448201525f916001600160a01b03169063ba087652906064016020604051808303815f875af11580156107bd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107e19190610cbf565b6002549091506107fb906001600160a01b031688836108fa565b866001600160a01b03165f80516020610ced8339815191528260405161082391815260200190565b60405180910390a250505050505050565b61083c610930565b600254610435906001600160a01b031633836108fa565b61085b610930565b6001600160a01b03811661088457604051631e4fbdf760e01b81525f6004820152602401610243565b6104358161095c565b6040516001600160a01b0384811660248301528381166044830152606482018390526108f49186918216906323b872dd906084015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506109ab565b50505050565b6040516001600160a01b0383811660248301526044820183905261092b91859182169063a9059cbb906064016108c2565b505050565b5f546001600160a01b031633146103365760405163118cdaa760e01b8152336004820152602401610243565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f6109bf6001600160a01b03841683610a0c565b905080515f141580156109e35750808060200190518101906109e19190610ca0565b155b1561092b57604051635274afe760e01b81526001600160a01b0384166004820152602401610243565b6060610a1983835f610a20565b9392505050565b606081471015610a455760405163cd78605960e01b8152306004820152602401610243565b5f80856001600160a01b03168486604051610a609190610cd6565b5f6040518083038185875af1925050503d805f8114610a9a576040519150601f19603f3d011682016040523d82523d5f602084013e610a9f565b606091505b5091509150610aaf868383610ab9565b9695505050505050565b606082610ace57610ac982610b15565b610a19565b8151158015610ae557506001600160a01b0384163b155b15610b0e57604051639996b31560e01b81526001600160a01b0385166004820152602401610243565b5080610a19565b805115610b255780518082602001fd5b604051630a12f52160e11b815260040160405180910390fd5b80356001600160a01b0381168114610b54575f80fd5b919050565b803560ff81168114610b54575f80fd5b5f805f805f8060c08789031215610b7e575f80fd5b610b8787610b3e565b95506020870135945060408701359350610ba360608801610b59565b9598949750929560808101359460a0909101359350915050565b5f60208284031215610bcd575f80fd5b5035919050565b5f805f805f60a08688031215610be8575f80fd5b8535945060208601359350610bff60408701610b59565b94979396509394606081013594506080013592915050565b5f60208284031215610c27575f80fd5b610a1982610b3e565b602080825260159082015274135a59dc985d1a5bdb881a5cc8191a5cd8589b1959605a1b604082015260600190565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b5f60208284031215610cb0575f80fd5b81518015158114610a19575f80fd5b5f60208284031215610ccf575f80fd5b5051919050565b5f82518060208501845e5f92019182525091905056fe8b80bd19aea7b735bc6d75db8d6adbe18b28c30d62b3555245eb67b2340caedca2646970667358221220eec787246d1f3b74fabe29031c566e72fcd100d1ccb4ead1d311125b2588fe6c64736f6c634300081a0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000072b886d09c117654ab7da13a14d603001de0b777000000000000000000000000e50e009ddb1a4d8ec668eac9d8b2df1f96348707000000000000000000000000e1a3864dbf62fb94834b108ff6bf439ce70183ac
-----Decoded View---------------
Arg [0] : _oldToken (address): 0x72B886d09C117654aB7dA13A14d603001dE0B777
Arg [1] : _newToken (address): 0xe50E009Ddb1A4d8Ec668EAc9D8b2dF1F96348707
Arg [2] : _poolToken (address): 0xe1A3864DbF62Fb94834B108Ff6Bf439cE70183Ac
-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 00000000000000000000000072b886d09c117654ab7da13a14d603001de0b777
Arg [1] : 000000000000000000000000e50e009ddb1a4d8ec668eac9d8b2df1f96348707
Arg [2] : 000000000000000000000000e1a3864dbf62fb94834b108ff6bf439ce70183ac
Deployed Bytecode Sourcemap
36378:6879:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39487:580;;;;;;:::i;:::-;;:::i;:::-;;37873:104;;;;;;:::i;:::-;;:::i;22412:103::-;;;:::i;38401:549::-;;;;;;:::i;:::-;;:::i;42594:122::-;;;;;;:::i;:::-;;:::i;21737:87::-;21783:7;21810:6;-1:-1:-1;;;;;21810:6:0;21737:87;;;-1:-1:-1;;;;;2149:32:1;;;2131:51;;2119:2;2104:18;21737:87:0;;;;;;;;43134:120;;;;;;:::i;:::-;;:::i;36461:22::-;;;;;-1:-1:-1;;;;;36461:22:0;;;36490;;;;;-1:-1:-1;;;;;36490:22:0;;;40498:693;;;;;;:::i;:::-;;:::i;36519:25::-;;;;;-1:-1:-1;;;;;36519:25:0;;;41735:712;;;;;;:::i;:::-;;:::i;36551:25::-;;;;;;;;;2785::1;;;2773:2;2758:18;36551:25:0;2639:177:1;42862:122:0;;;;;;:::i;:::-;;:::i;22670:220::-;;;;;;:::i;:::-;;:::i;39487:580::-;36842:10;;36824:15;:28;36816:62;;;;-1:-1:-1;;;36816:62:0;;;;;;;:::i;:::-;;;;;;;;;39721:8:::1;::::0;39700:86:::1;::::0;-1:-1:-1;;;39700:86:0;;-1:-1:-1;;;;;39721:8:0;;::::1;::::0;39700:38:::1;::::0;:86:::1;::::0;39739:4;;39753::::1;::::0;39760:6;;39768:8;;39778:1;;39781;;39784;;39700:86:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;39696:102:::0;39873:8:::1;::::0;:54:::1;::::0;-1:-1:-1;;;;;39873:8:0::1;39899:4:::0;39913::::1;39920:6:::0;39873:25:::1;:54::i;:::-;39984:8;::::0;:35:::1;::::0;-1:-1:-1;;;;;39984:8:0::1;40006:4:::0;40012:6;39984:21:::1;:35::i;:::-;40046:4;-1:-1:-1::0;;;;;40037:22:0::1;-1:-1:-1::0;;;;;;;;;;;40052:6:0::1;40037:22;;;;2785:25:1::0;;2773:2;2758:18;;2639:177;40037:22:0::1;;;;;;;;39487:580:::0;;;;;;:::o;37873:104::-;21623:13;:11;:13::i;:::-;37945:10:::1;:24:::0;37873:104::o;22412:103::-;21623:13;:11;:13::i;:::-;22477:30:::1;22504:1;22477:18;:30::i;:::-;22412:103::o:0;38401:549::-;36842:10;;36824:15;:28;36816:62;;;;-1:-1:-1;;;36816:62:0;;;;;;;:::i;:::-;38580:8:::1;::::0;38559:92:::1;::::0;-1:-1:-1;;;38559:92:0;;-1:-1:-1;;;;;38580:8:0;;::::1;::::0;38559:38:::1;::::0;:92:::1;::::0;38598:10:::1;::::0;38618:4:::1;::::0;38625:6;;38633:8;;38643:1;;38646;;38649;;38559:92:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;38555:108:::0;38738:8:::1;::::0;:60:::1;::::0;-1:-1:-1;;;;;38738:8:0::1;38764:10;38784:4;38791:6:::0;38738:25:::1;:60::i;:::-;38855:8;::::0;:41:::1;::::0;-1:-1:-1;;;;;38855:8:0::1;38877:10;38889:6:::0;38855:21:::1;:41::i;:::-;38914:28;::::0;2785:25:1;;;38923:10:0::1;::::0;-1:-1:-1;;;;;;;;;;;38914:28:0;2773:2:1;2758:18;38914:28:0::1;;;;;;;38401:549:::0;;;;;:::o;42594:122::-;21623:13;:11;:13::i;:::-;42667:8:::1;::::0;:41:::1;::::0;-1:-1:-1;;;;;42667:8:0::1;42689:10;42701:6:::0;42667:21:::1;:41::i;:::-;42594:122:::0;:::o;43134:120::-;21623:13;:11;:13::i;:::-;43208:9:::1;::::0;:38:::1;::::0;-1:-1:-1;;;43208:38:0;;43227:10:::1;43208:38;::::0;::::1;4207:51:1::0;4274:18;;;4267:34;;;-1:-1:-1;;;;;43208:9:0;;::::1;::::0;:18:::1;::::0;4180::1;;43208:38:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;43134:120:::0;:::o;40498:693::-;36842:10;;36824:15;:28;36816:62;;;;-1:-1:-1;;;36816:62:0;;;;;;;:::i;:::-;40685:9:::1;::::0;40664:93:::1;::::0;-1:-1:-1;;;40664:93:0;;-1:-1:-1;;;;;40685:9:0;;::::1;::::0;40664:39:::1;::::0;:93:::1;::::0;40704:10:::1;::::0;40724:4:::1;::::0;40731:6;;40739:8;;40749:1;;40752;;40755;;40664:93:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;40660:109:::0;40847:9:::1;::::0;:57:::1;::::0;-1:-1:-1;;;40847:57:0;;40870:10:::1;40847:57;::::0;::::1;4796:51:1::0;40890:4:0::1;4863:18:1::0;;;4856:60;4932:18;;;4925:34;;;-1:-1:-1;;;;;40847:9:0;;::::1;::::0;:22:::1;::::0;4769:18:1;;40847:57:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;40975:9:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;40975:54:0;;::::1;::::0;::::1;5172:25:1::0;;;41008:4:0::1;5213:18:1::0;;;5206:60;;;5282:18;;;5275:60;40953:19:0::1;::::0;-1:-1:-1;;;;;40975:9:0::1;::::0;:16:::1;::::0;5145:18:1;;40975:54:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;41086:8;::::0;40953:76;;-1:-1:-1;41086:46:0::1;::::0;-1:-1:-1;;;;;41086:8:0::1;41108:10;40953:76:::0;41086:21:::1;:46::i;:::-;41150:33;::::0;2785:25:1;;;41159:10:0::1;::::0;-1:-1:-1;;;;;;;;;;;41150:33:0;2773:2:1;2758:18;41150:33:0::1;2639:177:1::0;41735:712:0;36842:10;;36824:15;:28;36816:62;;;;-1:-1:-1;;;36816:62:0;;;;;;;:::i;:::-;41965:9:::1;::::0;41944:87:::1;::::0;-1:-1:-1;;;41944:87:0;;-1:-1:-1;;;;;41965:9:0;;::::1;::::0;41944:39:::1;::::0;:87:::1;::::0;41984:4;;41998::::1;::::0;42005:6;;42013:8;;42023:1;;42026;;42029;;41944:87:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;41940:103:::0;42121:9:::1;::::0;:51:::1;::::0;-1:-1:-1;;;42121:51:0;;-1:-1:-1;;;;;4814:32:1;;;42121:51:0::1;::::0;::::1;4796::1::0;42158:4:0::1;4863:18:1::0;;;4856:60;4932:18;;;4925:34;;;42121:9:0;;::::1;::::0;:22:::1;::::0;4769:18:1;;42121:51:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;42243:9:0::1;::::0;:54:::1;::::0;-1:-1:-1;;;42243:54:0;;::::1;::::0;::::1;5172:25:1::0;;;42276:4:0::1;5213:18:1::0;;;5206:60;;;5282:18;;;5275:60;42221:19:0::1;::::0;-1:-1:-1;;;;;42243:9:0::1;::::0;:16:::1;::::0;5145:18:1;;42243:54:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;42354:8;::::0;42221:76;;-1:-1:-1;42354:40:0::1;::::0;-1:-1:-1;;;;;42354:8:0::1;42376:4:::0;42221:76;42354:21:::1;:40::i;:::-;42421:4;-1:-1:-1::0;;;;;42412:27:0::1;-1:-1:-1::0;;;;;;;;;;;42427:11:0::1;42412:27;;;;2785:25:1::0;;2773:2;2758:18;;2639:177;42412:27:0::1;;;;;;;;41866:581;41735:712:::0;;;;;;:::o;42862:122::-;21623:13;:11;:13::i;:::-;42935:8:::1;::::0;:41:::1;::::0;-1:-1:-1;;;;;42935:8:0::1;42957:10;42969:6:::0;42935:21:::1;:41::i;22670:220::-:0;21623:13;:11;:13::i;:::-;-1:-1:-1;;;;;22755:22:0;::::1;22751:93;;22801:31;::::0;-1:-1:-1;;;22801:31:0;;22829:1:::1;22801:31;::::0;::::1;2131:51:1::0;2104:18;;22801:31:0::1;1985:203:1::0;22751:93:0::1;22854:28;22873:8;22854:18;:28::i;14906:190::-:0;15034:53;;-1:-1:-1;;;;;4814:32:1;;;15034:53:0;;;4796:51:1;4883:32;;;4863:18;;;4856:60;4932:18;;;4925:34;;;15007:81:0;;15027:5;;15049:18;;;;;4769::1;;15034:53:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15034:53:0;;;;;;;;;;;15007:19;:81::i;:::-;14906:190;;;;:::o;14499:162::-;14609:43;;-1:-1:-1;;;;;4225:32:1;;;14609:43:0;;;4207:51:1;4274:18;;;4267:34;;;14582:71:0;;14602:5;;14624:14;;;;;4180:18:1;;14609:43:0;4033:274:1;14582:71:0;14499:162;;;:::o;21902:166::-;21783:7;21810:6;-1:-1:-1;;;;;21810:6:0;19826:10;21962:23;21958:103;;22009:40;;-1:-1:-1;;;22009:40:0;;19826:10;22009:40;;;2131:51:1;2104:18;;22009:40:0;1985:203:1;23050:191:0;23124:16;23143:6;;-1:-1:-1;;;;;23160:17:0;;;-1:-1:-1;;;;;;23160:17:0;;;;;;23193:40;;23143:6;;;;;;;23193:40;;23124:16;23193:40;23113:128;23050:191;:::o;17310:638::-;17734:23;17760:33;-1:-1:-1;;;;;17760:27:0;;17788:4;17760:27;:33::i;:::-;17734:59;;17808:10;:17;17829:1;17808:22;;:57;;;;;17846:10;17835:30;;;;;;;;;;;;:::i;:::-;17834:31;17808:57;17804:137;;;17889:40;;-1:-1:-1;;;17889:40:0;;-1:-1:-1;;;;;2149:32:1;;17889:40:0;;;2131:51:1;2104:18;;17889:40:0;1985:203:1;9625:153:0;9700:12;9732:38;9754:6;9762:4;9768:1;9732:21;:38::i;:::-;9725:45;9625:153;-1:-1:-1;;;9625:153:0:o;10113:398::-;10212:12;10265:5;10241:21;:29;10237:110;;;10294:41;;-1:-1:-1;;;10294:41:0;;10329:4;10294:41;;;2131:51:1;2104:18;;10294:41:0;1985:203:1;10237:110:0;10358:12;10372:23;10399:6;-1:-1:-1;;;;;10399:11:0;10418:5;10425:4;10399:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10357:73;;;;10448:55;10475:6;10483:7;10492:10;10448:26;:55::i;:::-;10441:62;10113:398;-1:-1:-1;;;;;;10113:398:0:o;11589:597::-;11737:12;11767:7;11762:417;;11791:19;11799:10;11791:7;:19::i;:::-;11762:417;;;12019:17;;:22;:49;;;;-1:-1:-1;;;;;;12045:18:0;;;:23;12019:49;12015:121;;;12096:24;;-1:-1:-1;;;12096:24:0;;-1:-1:-1;;;;;2149:32:1;;12096:24:0;;;2131:51:1;2104:18;;12096:24:0;1985:203:1;12015:121:0;-1:-1:-1;12157:10:0;12150:17;;12739:528;12872:17;;:21;12868:392;;13104:10;13098:17;13161:15;13148:10;13144:2;13140:19;13133:44;12868:392;13231:17;;-1:-1:-1;;;13231:17:0;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:156::-;258:20;;318:4;307:16;;297:27;;287:55;;338:1;335;328:12;353:733;455:6;463;471;479;487;495;548:3;536:9;527:7;523:23;519:33;516:53;;;565:1;562;555:12;516:53;588:29;607:9;588:29;:::i;:::-;578:39;-1:-1:-1;686:2:1;671:18;;658:32;;-1:-1:-1;787:2:1;772:18;;759:32;;-1:-1:-1;836:36:1;868:2;853:18;;836:36;:::i;:::-;353:733;;;;-1:-1:-1;353:733:1;;945:3;930:19;;917:33;;1049:3;1034:19;;;1021:33;;-1:-1:-1;353:733:1;-1:-1:-1;;353:733:1:o;1091:226::-;1150:6;1203:2;1191:9;1182:7;1178:23;1174:32;1171:52;;;1219:1;1216;1209:12;1171:52;-1:-1:-1;1264:23:1;;1091:226;-1:-1:-1;1091:226:1:o;1322:658::-;1415:6;1423;1431;1439;1447;1500:3;1488:9;1479:7;1475:23;1471:33;1468:53;;;1517:1;1514;1507:12;1468:53;1562:23;;;-1:-1:-1;1682:2:1;1667:18;;1654:32;;-1:-1:-1;1731:36:1;1763:2;1748:18;;1731:36;:::i;:::-;1322:658;;;;-1:-1:-1;1721:46:1;;1840:2;1825:18;;1812:32;;-1:-1:-1;1943:3:1;1928:19;1915:33;;1322:658;-1:-1:-1;;1322:658:1:o;2821:186::-;2880:6;2933:2;2921:9;2912:7;2908:23;2904:32;2901:52;;;2949:1;2946;2939:12;2901:52;2972:29;2991:9;2972:29;:::i;3012:345::-;3214:2;3196:21;;;3253:2;3233:18;;;3226:30;-1:-1:-1;;;3287:2:1;3272:18;;3265:51;3348:2;3333:18;;3012:345::o;3362:666::-;-1:-1:-1;;;;;3691:32:1;;;3673:51;;3760:32;;;;3755:2;3740:18;;3733:60;3824:2;3809:18;;3802:34;;;;3867:2;3852:18;;3845:34;;;;3928:4;3916:17;3910:3;3895:19;;3888:46;3711:3;3950:19;;3943:35;4009:3;3994:19;;3987:35;;;;3660:3;3645:19;;3362:666::o;4312:277::-;4379:6;4432:2;4420:9;4411:7;4407:23;4403:32;4400:52;;;4448:1;4445;4438:12;4400:52;4480:9;4474:16;4533:5;4526:13;4519:21;4512:5;4509:32;4499:60;;4555:1;4552;4545:12;5346:184;5416:6;5469:2;5457:9;5448:7;5444:23;5440:32;5437:52;;;5485:1;5482;5475:12;5437:52;-1:-1:-1;5508:16:1;;5346:184;-1:-1:-1;5346:184:1:o;5535:301::-;5664:3;5702:6;5696:13;5748:6;5741:4;5733:6;5729:17;5724:3;5718:37;5810:1;5774:16;;5799:13;;;-1:-1:-1;5774:16:1;5535:301;-1:-1:-1;5535:301:1:o
Swarm Source
ipfs://eec787246d1f3b74fabe29031c566e72fcd100d1ccb4ead1d311125b2588fe6c
Loading...
Loading
Loading...
Loading
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.