Source Code
Latest 25 from a total of 1,371 transactions
| Transaction Hash |
|
Block
|
From
|
To
|
|||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 25214264 | 2 days ago | IN | 0 HYPE | 0.0000383 | ||||
| Claim | 24974094 | 5 days ago | IN | 0 HYPE | 0.00001984 | ||||
| Claim | 24945613 | 5 days ago | IN | 0 HYPE | 0.00001441 | ||||
| Claim | 24931816 | 5 days ago | IN | 0 HYPE | 0.00004871 | ||||
| Claim | 24812675 | 7 days ago | IN | 0 HYPE | 0.00010985 | ||||
| Claim | 24798643 | 7 days ago | IN | 0 HYPE | 0.00000952 | ||||
| Claim | 24740072 | 8 days ago | IN | 0 HYPE | 0.00004294 | ||||
| Claim | 24736470 | 8 days ago | IN | 0 HYPE | 0.00024577 | ||||
| Claim | 24709249 | 8 days ago | IN | 0 HYPE | 0.00014662 | ||||
| Claim | 24687048 | 8 days ago | IN | 0 HYPE | 0.00016895 | ||||
| Claim | 24511780 | 10 days ago | IN | 0 HYPE | 0.00005318 | ||||
| Claim | 24450892 | 11 days ago | IN | 0 HYPE | 0.00000793 | ||||
| Claim | 24450671 | 11 days ago | IN | 0 HYPE | 0.00005935 | ||||
| Claim | 24392780 | 11 days ago | IN | 0 HYPE | 0.00012703 | ||||
| Claim | 24189552 | 14 days ago | IN | 0 HYPE | 0.00033622 | ||||
| Claim | 24189109 | 14 days ago | IN | 0 HYPE | 0.00006556 | ||||
| Claim | 24188487 | 14 days ago | IN | 0 HYPE | 0.00000984 | ||||
| Claim | 24169151 | 14 days ago | IN | 0 HYPE | 0.0001675 | ||||
| Claim | 24168224 | 14 days ago | IN | 0 HYPE | 0.00000793 | ||||
| Claim | 24152809 | 14 days ago | IN | 0 HYPE | 0.00010869 | ||||
| Claim | 24079695 | 15 days ago | IN | 0 HYPE | 0.00003572 | ||||
| Claim | 24019524 | 16 days ago | IN | 0 HYPE | 0.00006835 | ||||
| Claim | 23943040 | 17 days ago | IN | 0 HYPE | 0.00015773 | ||||
| Claim | 23937255 | 17 days ago | IN | 0 HYPE | 0.00019616 | ||||
| Claim | 23885500 | 17 days ago | IN | 0 HYPE | 0.00002458 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Block | From | To | |||
|---|---|---|---|---|---|---|
| 21374543 | 46 days ago | Contract Creation | 0 HYPE |
Cross-Chain Transactions
Loading...
Loading
Contract Name:
PreDeposit
Compiler Version
v0.8.21+commit.d9974bed
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.21;
import {IERC20} from "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import {SafeERC20} from "@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol";
import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol";
import {Pausable} from "@openzeppelin/contracts/utils/Pausable.sol";
import {ReentrancyGuard} from "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
import {IERC4626} from "@openzeppelin/contracts/interfaces/IERC4626.sol";
error BadAddress();
error ZeroAmount();
error ClaimNotStarted();
error ClaimStarted();
error NotAllowedToken();
error NoNativeToken();
error VaultNotSet();
error InsufficientShares();
error WithdrawWindowOver();
contract PreAVLT is ERC20, Ownable {
constructor()
ERC20("Pre Altura Vault Token", "preAVLT")
Ownable(msg.sender)
{}
function decimals() public pure override returns (uint8) {
return 6;
}
function mint(address to, uint256 amount) external onlyOwner {
_mint(to, amount);
}
function burn(address from, uint256 amount) external onlyOwner {
_burn(from, amount);
}
}
contract PreDeposit is Ownable, Pausable, ReentrancyGuard {
using SafeERC20 for IERC20;
IERC20 public immutable asset;
IERC4626 public vault;
address public pendingVault;
uint256 public vaultActivationTime;
PreAVLT public immutable preToken;
uint256 public claimStart;
event PreDeposited(address indexed user, uint256 assetAmount, uint256 preAvltMinted);
event Claimed(address indexed user, uint256 preAvltBurned, uint256 vaultSharesTransferred);
event ClaimStartUpdated(uint256 newClaimStart);
event VaultSet(address indexed vault);
event VaultActivationScheduled(address indexed pendingVault, uint256 activationTime);
event DepositedToVault(uint256 assets, uint256 shares);
event PreDepositWithdrawn(address indexed user, uint256 preBurned, uint256 assetsReturned);
constructor(address _asset, uint256 _claimStart)
Ownable(msg.sender)
{
if (_asset == address(0)) revert BadAddress();
asset = IERC20(_asset);
claimStart = _claimStart;
PreAVLT _preToken = new PreAVLT();
preToken = _preToken;
}
receive() external payable {
revert NoNativeToken();
}
fallback() external payable {
revert NoNativeToken();
}
function claimableShares(address user) external view returns (uint256) {
return preToken.balanceOf(user);
}
function vaultShareBalance() external view returns (uint256) {
if (address(vault) == address(0)) return 0;
return IERC20(address(vault)).balanceOf(address(this));
}
function assetAddress() external view returns (address) {
return address(asset);
}
function vaultAddress() external view returns (address) {
return address(vault);
}
function pendingVaultAddress() external view returns (address) {
return pendingVault;
}
function setVault(address _vault) external onlyOwner {
if (_vault == address(0)) revert BadAddress();
pendingVault = _vault;
vaultActivationTime = block.timestamp + 2 days;
if(vaultActivationTime >= claimStart) {
claimStart = vaultActivationTime;
}
emit VaultActivationScheduled(_vault, vaultActivationTime);
}
function activateVault() external onlyOwner {
if (pendingVault == address(0)) revert VaultNotSet();
if (block.timestamp < vaultActivationTime) revert ClaimNotStarted();
vault = IERC4626(pendingVault);
pendingVault = address(0);
emit VaultSet(address(vault));
}
function setClaimStart(uint256 ts) external onlyOwner {
claimStart = ts;
emit ClaimStartUpdated(ts);
}
function pause() external onlyOwner {
_pause();
}
function unpause() external onlyOwner {
_unpause();
}
function preDeposit(uint256 assetAmount)
external
whenNotPaused
nonReentrant
returns (uint256 preAvltMinted)
{
if (block.timestamp >= claimStart) revert ClaimStarted();
if (assetAmount == 0) revert ZeroAmount();
asset.safeTransferFrom(msg.sender, address(this), assetAmount);
preAvltMinted = assetAmount;
preToken.mint(msg.sender, preAvltMinted);
emit PreDeposited(msg.sender, assetAmount, preAvltMinted);
}
function withdrawPreDeposit(uint256 preAmount)
external
whenNotPaused
nonReentrant
returns (uint256 assetsOut)
{
if (preAmount == 0) revert ZeroAmount();
if (
pendingVault == address(0) ||
block.timestamp >= vaultActivationTime ||
address(vault) != address(0)
) revert WithdrawWindowOver();
preToken.burn(msg.sender, preAmount);
uint256 bal = asset.balanceOf(address(this));
if (preAmount > bal) revert InsufficientShares();
assetsOut = preAmount;
asset.safeTransfer(msg.sender, assetsOut);
emit PreDepositWithdrawn(msg.sender, preAmount, assetsOut);
}
function depositAllToVault()
external
onlyOwner
nonReentrant
returns (uint256 sharesOut)
{
if (address(vault) == address(0)) revert VaultNotSet();
uint256 balance = asset.balanceOf(address(this));
if (balance == 0) revert ZeroAmount();
asset.safeIncreaseAllowance(address(vault), balance);
sharesOut = vault.deposit(balance, address(this));
emit DepositedToVault(balance, sharesOut);
}
function claim(uint256 preAmount)
external
whenNotPaused
nonReentrant
returns (uint256 sharesOut)
{
if (block.timestamp < claimStart) revert ClaimNotStarted();
if (preAmount == 0) revert ZeroAmount();
if (address(vault) == address(0)) revert VaultNotSet();
preToken.burn(msg.sender, preAmount);
sharesOut = preAmount;
uint256 balance = IERC20(address(vault)).balanceOf(address(this));
if (sharesOut > balance) revert InsufficientShares();
IERC20(address(vault)).safeTransfer(msg.sender, sharesOut);
emit Claimed(msg.sender, preAmount, sharesOut);
}
function rescueTokens(address token, address to, uint256 amount)
external
onlyOwner
{
if (to == address(0)) revert BadAddress();
if (
token == address(asset) ||
token == address(preToken) ||
(address(vault) != address(0) && token == address(vault))
) revert NotAllowedToken();
IERC20(token).safeTransfer(to, amount);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @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);
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/draft-IERC6093.sol)
pragma solidity >=0.8.4;
/**
* @dev Standard ERC-20 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
*/
interface IERC20Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC20InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC20InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
* @param spender Address that may be allowed to operate on tokens without being their owner.
* @param allowance Amount of tokens a `spender` is allowed to operate with.
* @param needed Minimum amount required to perform a transfer.
*/
error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC20InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `spender` to be approved. Used in approvals.
* @param spender Address that may be allowed to operate on tokens without being their owner.
*/
error ERC20InvalidSpender(address spender);
}
/**
* @dev Standard ERC-721 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
*/
interface IERC721Errors {
/**
* @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
* Used in balance queries.
* @param owner Address of the current owner of a token.
*/
error ERC721InvalidOwner(address owner);
/**
* @dev Indicates a `tokenId` whose `owner` is the zero address.
* @param tokenId Identifier number of a token.
*/
error ERC721NonexistentToken(uint256 tokenId);
/**
* @dev Indicates an error related to the ownership over a particular token. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param tokenId Identifier number of a token.
* @param owner Address of the current owner of a token.
*/
error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC721InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC721InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param tokenId Identifier number of a token.
*/
error ERC721InsufficientApproval(address operator, uint256 tokenId);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC721InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC721InvalidOperator(address operator);
}
/**
* @dev Standard ERC-1155 Errors
* Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
*/
interface IERC1155Errors {
/**
* @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
* @param balance Current balance for the interacting account.
* @param needed Minimum amount required to perform a transfer.
* @param tokenId Identifier number of a token.
*/
error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);
/**
* @dev Indicates a failure with the token `sender`. Used in transfers.
* @param sender Address whose tokens are being transferred.
*/
error ERC1155InvalidSender(address sender);
/**
* @dev Indicates a failure with the token `receiver`. Used in transfers.
* @param receiver Address to which tokens are being transferred.
*/
error ERC1155InvalidReceiver(address receiver);
/**
* @dev Indicates a failure with the `operator`’s approval. Used in transfers.
* @param operator Address that may be allowed to operate on tokens without being their owner.
* @param owner Address of the current owner of a token.
*/
error ERC1155MissingApprovalForAll(address operator, address owner);
/**
* @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
* @param approver Address initiating an approval operation.
*/
error ERC1155InvalidApprover(address approver);
/**
* @dev Indicates a failure with the `operator` to be approved. Used in approvals.
* @param operator Address that may be allowed to operate on tokens without being their owner.
*/
error ERC1155InvalidOperator(address operator);
/**
* @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
* Used in batch transfers.
* @param idsLength Length of the array of token identifiers
* @param valuesLength Length of the array of token amounts
*/
error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC1363.sol)
pragma solidity >=0.6.2;
import {IERC20} from "./IERC20.sol";
import {IERC165} from "./IERC165.sol";
/**
* @title IERC1363
* @dev Interface of the ERC-1363 standard as defined in the https://eips.ethereum.org/EIPS/eip-1363[ERC-1363].
*
* Defines an extension interface for ERC-20 tokens that supports executing code on a recipient contract
* after `transfer` or `transferFrom`, or code on a spender contract after `approve`, in a single transaction.
*/
interface IERC1363 is IERC20, IERC165 {
/*
* Note: the ERC-165 identifier for this interface is 0xb0202a11.
* 0xb0202a11 ===
* bytes4(keccak256('transferAndCall(address,uint256)')) ^
* bytes4(keccak256('transferAndCall(address,uint256,bytes)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256)')) ^
* bytes4(keccak256('transferFromAndCall(address,address,uint256,bytes)')) ^
* bytes4(keccak256('approveAndCall(address,uint256)')) ^
* bytes4(keccak256('approveAndCall(address,uint256,bytes)'))
*/
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from the caller's account to `to`
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferAndCall(address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value) external returns (bool);
/**
* @dev Moves a `value` amount of tokens from `from` to `to` using the allowance mechanism
* and then calls {IERC1363Receiver-onTransferReceived} on `to`.
* @param from The address which you want to send tokens from.
* @param to The address which you want to transfer to.
* @param value The amount of tokens to be transferred.
* @param data Additional data with no specified format, sent in call to `to`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function transferFromAndCall(address from, address to, uint256 value, bytes calldata data) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value) external returns (bool);
/**
* @dev Sets a `value` amount of tokens as the allowance of `spender` over the
* caller's tokens and then calls {IERC1363Spender-onApprovalReceived} on `spender`.
* @param spender The address which will spend the funds.
* @param value The amount of tokens to be spent.
* @param data Additional data with no specified format, sent in call to `spender`.
* @return A boolean value indicating whether the operation succeeded unless throwing.
*/
function approveAndCall(address spender, uint256 value, bytes calldata data) external returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC165.sol)
pragma solidity >=0.4.16;
import {IERC165} from "../utils/introspection/IERC165.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC20.sol)
pragma solidity >=0.4.16;
import {IERC20} from "../token/ERC20/IERC20.sol";// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (interfaces/IERC4626.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../token/ERC20/IERC20.sol";
import {IERC20Metadata} from "../token/ERC20/extensions/IERC20Metadata.sol";
/**
* @dev Interface of the ERC-4626 "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 redemption 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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/ERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";
/**
* @dev Implementation of the {IERC20} interface.
*
* This implementation is agnostic to the way tokens are created. This means
* that a supply mechanism has to be added in a derived contract using {_mint}.
*
* TIP: For a detailed writeup see our guide
* https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
* to implement supply mechanisms].
*
* The default value of {decimals} is 18. To change this, you should override
* this function so it returns a different value.
*
* We have followed general OpenZeppelin Contracts guidelines: functions revert
* instead returning `false` on failure. This behavior is nonetheless
* conventional and does not conflict with the expectations of ERC-20
* applications.
*/
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
mapping(address account => uint256) private _balances;
mapping(address account => mapping(address spender => uint256)) private _allowances;
uint256 private _totalSupply;
string private _name;
string private _symbol;
/**
* @dev Sets the values for {name} and {symbol}.
*
* Both values are immutable: they can only be set once during construction.
*/
constructor(string memory name_, string memory symbol_) {
_name = name_;
_symbol = symbol_;
}
/**
* @dev Returns the name of the token.
*/
function name() public view virtual returns (string memory) {
return _name;
}
/**
* @dev Returns the symbol of the token, usually a shorter version of the
* name.
*/
function symbol() public view virtual returns (string memory) {
return _symbol;
}
/**
* @dev Returns the number of decimals used to get its user representation.
* For example, if `decimals` equals `2`, a balance of `505` tokens should
* be displayed to a user as `5.05` (`505 / 10 ** 2`).
*
* Tokens usually opt for a value of 18, imitating the relationship between
* Ether and Wei. This is the default value returned by this function, unless
* it's overridden.
*
* NOTE: This information is only used for _display_ purposes: it in
* no way affects any of the arithmetic of the contract, including
* {IERC20-balanceOf} and {IERC20-transfer}.
*/
function decimals() public view virtual returns (uint8) {
return 18;
}
/// @inheritdoc IERC20
function totalSupply() public view virtual returns (uint256) {
return _totalSupply;
}
/// @inheritdoc IERC20
function balanceOf(address account) public view virtual returns (uint256) {
return _balances[account];
}
/**
* @dev See {IERC20-transfer}.
*
* Requirements:
*
* - `to` cannot be the zero address.
* - the caller must have a balance of at least `value`.
*/
function transfer(address to, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_transfer(owner, to, value);
return true;
}
/// @inheritdoc IERC20
function allowance(address owner, address spender) public view virtual returns (uint256) {
return _allowances[owner][spender];
}
/**
* @dev See {IERC20-approve}.
*
* NOTE: If `value` is the maximum `uint256`, the allowance is not updated on
* `transferFrom`. This is semantically equivalent to an infinite approval.
*
* Requirements:
*
* - `spender` cannot be the zero address.
*/
function approve(address spender, uint256 value) public virtual returns (bool) {
address owner = _msgSender();
_approve(owner, spender, value);
return true;
}
/**
* @dev See {IERC20-transferFrom}.
*
* Skips emitting an {Approval} event indicating an allowance update. This is not
* required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
*
* NOTE: Does not update the allowance if the current allowance
* is the maximum `uint256`.
*
* Requirements:
*
* - `from` and `to` cannot be the zero address.
* - `from` must have a balance of at least `value`.
* - the caller must have allowance for ``from``'s tokens of at least
* `value`.
*/
function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
address spender = _msgSender();
_spendAllowance(from, spender, value);
_transfer(from, to, value);
return true;
}
/**
* @dev Moves a `value` amount of tokens from `from` to `to`.
*
* This internal function is equivalent to {transfer}, and can be used to
* e.g. implement automatic token fees, slashing mechanisms, etc.
*
* Emits a {Transfer} event.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC20InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(from, to, value);
}
/**
* @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
* (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
* this function.
*
* Emits a {Transfer} event.
*/
function _update(address from, address to, uint256 value) internal virtual {
if (from == address(0)) {
// Overflow check required: The rest of the code assumes that totalSupply never overflows
_totalSupply += value;
} else {
uint256 fromBalance = _balances[from];
if (fromBalance < value) {
revert ERC20InsufficientBalance(from, fromBalance, value);
}
unchecked {
// Overflow not possible: value <= fromBalance <= totalSupply.
_balances[from] = fromBalance - value;
}
}
if (to == address(0)) {
unchecked {
// Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
_totalSupply -= value;
}
} else {
unchecked {
// Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
_balances[to] += value;
}
}
emit Transfer(from, to, value);
}
/**
* @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
* Relies on the `_update` mechanism
*
* Emits a {Transfer} event with `from` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead.
*/
function _mint(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidReceiver(address(0));
}
_update(address(0), account, value);
}
/**
* @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
* Relies on the `_update` mechanism.
*
* Emits a {Transfer} event with `to` set to the zero address.
*
* NOTE: This function is not virtual, {_update} should be overridden instead
*/
function _burn(address account, uint256 value) internal {
if (account == address(0)) {
revert ERC20InvalidSender(address(0));
}
_update(account, address(0), value);
}
/**
* @dev Sets `value` as the allowance of `spender` over the `owner`'s tokens.
*
* This internal function is equivalent to `approve`, and can be used to
* e.g. set automatic allowances for certain subsystems, etc.
*
* Emits an {Approval} event.
*
* Requirements:
*
* - `owner` cannot be the zero address.
* - `spender` cannot be the zero address.
*
* Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
*/
function _approve(address owner, address spender, uint256 value) internal {
_approve(owner, spender, value, true);
}
/**
* @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
*
* By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
* `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
* `Approval` event during `transferFrom` operations.
*
* Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
* true using the following override:
*
* ```solidity
* function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
* super._approve(owner, spender, value, true);
* }
* ```
*
* Requirements are the same as {_approve}.
*/
function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
if (owner == address(0)) {
revert ERC20InvalidApprover(address(0));
}
if (spender == address(0)) {
revert ERC20InvalidSpender(address(0));
}
_allowances[owner][spender] = value;
if (emitEvent) {
emit Approval(owner, spender, value);
}
}
/**
* @dev Updates `owner`'s allowance for `spender` based on spent `value`.
*
* Does not update the allowance value in case of infinite allowance.
* Revert if not enough allowance is available.
*
* Does not emit an {Approval} event.
*/
function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
uint256 currentAllowance = allowance(owner, spender);
if (currentAllowance < type(uint256).max) {
if (currentAllowance < value) {
revert ERC20InsufficientAllowance(spender, currentAllowance, value);
}
unchecked {
_approve(owner, spender, currentAllowance - value, false);
}
}
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/extensions/IERC20Metadata.sol)
pragma solidity >=0.6.2;
import {IERC20} from "../IERC20.sol";
/**
* @dev Interface for the optional metadata functions from the ERC-20 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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (token/ERC20/IERC20.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-20 standard as defined in the ERC.
*/
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);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/utils/SafeERC20.sol)
pragma solidity ^0.8.20;
import {IERC20} from "../IERC20.sol";
import {IERC1363} from "../../../interfaces/IERC1363.sol";
/**
* @title SafeERC20
* @dev Wrappers around ERC-20 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 {
/**
* @dev An operation with an ERC-20 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 Variant of {safeTransfer} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransfer(IERC20 token, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(token, abi.encodeCall(token.transfer, (to, value)));
}
/**
* @dev Variant of {safeTransferFrom} that returns a bool instead of reverting if the operation is not successful.
*/
function trySafeTransferFrom(IERC20 token, address from, address to, uint256 value) internal returns (bool) {
return _callOptionalReturnBool(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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
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.
*
* IMPORTANT: If the token implements ERC-7674 (ERC-20 with temporary allowance), and if the "client"
* smart contract uses ERC-7674 to set temporary allowances, then the "client" smart contract should avoid using
* this function. Performing a {safeIncreaseAllowance} or {safeDecreaseAllowance} operation on a token contract
* that has a non-zero temporary allowance (for that particular owner-spender) will result in unexpected behavior.
*/
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.
*
* NOTE: If the token implements ERC-7674, this function will not modify any temporary allowance. This function
* only sets the "standard" allowance. Any temporary allowance will remain active, in addition to the value being
* set here.
*/
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 Performs an {ERC1363} transferAndCall, with a fallback to the simple {ERC20} transfer if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
safeTransfer(token, to, value);
} else if (!token.transferAndCall(to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} transferFromAndCall, with a fallback to the simple {ERC20} transferFrom if the target
* has no code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* Reverts if the returned value is other than `true`.
*/
function transferFromAndCallRelaxed(
IERC1363 token,
address from,
address to,
uint256 value,
bytes memory data
) internal {
if (to.code.length == 0) {
safeTransferFrom(token, from, to, value);
} else if (!token.transferFromAndCall(from, to, value, data)) {
revert SafeERC20FailedOperation(address(token));
}
}
/**
* @dev Performs an {ERC1363} approveAndCall, with a fallback to the simple {ERC20} approve if the target has no
* code. This can be used to implement an {ERC721}-like safe transfer that rely on {ERC1363} checks when
* targeting contracts.
*
* NOTE: When the recipient address (`to`) has no code (i.e. is an EOA), this function behaves as {forceApprove}.
* Opposedly, when the recipient address (`to`) has code, this function only attempts to call {ERC1363-approveAndCall}
* once without retrying, and relies on the returned value to be true.
*
* Reverts if the returned value is other than `true`.
*/
function approveAndCallRelaxed(IERC1363 token, address to, uint256 value, bytes memory data) internal {
if (to.code.length == 0) {
forceApprove(token, to, value);
} else if (!token.approveAndCall(to, value, data)) {
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 {_callOptionalReturnBool} that reverts if call fails to meet the requirements.
*/
function _callOptionalReturn(IERC20 token, bytes memory data) private {
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
let success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
// bubble errors
if iszero(success) {
let ptr := mload(0x40)
returndatacopy(ptr, 0, returndatasize())
revert(ptr, returndatasize())
}
returnSize := returndatasize()
returnValue := mload(0)
}
if (returnSize == 0 ? address(token).code.length == 0 : returnValue != 1) {
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 silently catches all reverts and returns a bool instead.
*/
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
bool success;
uint256 returnSize;
uint256 returnValue;
assembly ("memory-safe") {
success := call(gas(), token, 0, add(data, 0x20), mload(data), 0, 0x20)
returnSize := returndatasize()
returnValue := mload(0)
}
return success && (returnSize == 0 ? address(token).code.length > 0 : returnValue == 1);
}
}// SPDX-License-Identifier: MIT
// 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;
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.4.0) (utils/introspection/IERC165.sol)
pragma solidity >=0.4.16;
/**
* @dev Interface of the ERC-165 standard, as defined in the
* https://eips.ethereum.org/EIPS/eip-165[ERC].
*
* Implementers can declare support of contract interfaces, which can then be
* queried by others ({ERC165Checker}).
*
* For an implementation, see {ERC165}.
*/
interface IERC165 {
/**
* @dev Returns true if this contract implements the interface defined by
* `interfaceId`. See the corresponding
* https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[ERC section]
* to learn more about how these ids are created.
*
* This function call must use less than 30 000 gas.
*/
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (utils/Pausable.sol)
pragma solidity ^0.8.20;
import {Context} from "../utils/Context.sol";
/**
* @dev Contract module which allows children to implement an emergency stop
* mechanism that can be triggered by an authorized account.
*
* This module is used through inheritance. It will make available the
* modifiers `whenNotPaused` and `whenPaused`, which can be applied to
* the functions of your contract. Note that they will not be pausable by
* simply including this module, only once the modifiers are put in place.
*/
abstract contract Pausable is Context {
bool private _paused;
/**
* @dev Emitted when the pause is triggered by `account`.
*/
event Paused(address account);
/**
* @dev Emitted when the pause is lifted by `account`.
*/
event Unpaused(address account);
/**
* @dev The operation failed because the contract is paused.
*/
error EnforcedPause();
/**
* @dev The operation failed because the contract is not paused.
*/
error ExpectedPause();
/**
* @dev Modifier to make a function callable only when the contract is not paused.
*
* Requirements:
*
* - The contract must not be paused.
*/
modifier whenNotPaused() {
_requireNotPaused();
_;
}
/**
* @dev Modifier to make a function callable only when the contract is paused.
*
* Requirements:
*
* - The contract must be paused.
*/
modifier whenPaused() {
_requirePaused();
_;
}
/**
* @dev Returns true if the contract is paused, and false otherwise.
*/
function paused() public view virtual returns (bool) {
return _paused;
}
/**
* @dev Throws if the contract is paused.
*/
function _requireNotPaused() internal view virtual {
if (paused()) {
revert EnforcedPause();
}
}
/**
* @dev Throws if the contract is not paused.
*/
function _requirePaused() internal view virtual {
if (!paused()) {
revert ExpectedPause();
}
}
/**
* @dev Triggers stopped state.
*
* Requirements:
*
* - The contract must not be paused.
*/
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
/**
* @dev Returns to normal state.
*
* Requirements:
*
* - The contract must be paused.
*/
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (utils/ReentrancyGuard.sol)
pragma solidity ^0.8.20;
/**
* @dev Contract module that helps prevent reentrant calls to a function.
*
* Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
* available, which can be applied to functions to make sure there are no nested
* (reentrant) calls to them.
*
* Note that because there is a single `nonReentrant` guard, functions marked as
* `nonReentrant` may not call one another. This can be worked around by making
* those functions `private`, and then adding `external` `nonReentrant` entry
* points to them.
*
* TIP: If EIP-1153 (transient storage) is available on the chain you're deploying at,
* consider using {ReentrancyGuardTransient} instead.
*
* TIP: If you would like to learn more about reentrancy and alternative ways
* to protect against it, check out our blog post
* https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
*/
abstract contract ReentrancyGuard {
// Booleans are more expensive than uint256 or any type that takes up a full
// word because each write operation emits an extra SLOAD to first read the
// slot's contents, replace the bits taken up by the boolean, and then write
// back. This is the compiler's defense against contract upgrades and
// pointer aliasing, and it cannot be disabled.
// The values being non-zero value makes deployment a bit more expensive,
// but in exchange the refund on every call to nonReentrant will be lower in
// amount. Since refunds are capped to a percentage of the total
// transaction's gas, it is best to keep them low in cases like this one, to
// increase the likelihood of the full refund coming into effect.
uint256 private constant NOT_ENTERED = 1;
uint256 private constant ENTERED = 2;
uint256 private _status;
/**
* @dev Unauthorized reentrant call.
*/
error ReentrancyGuardReentrantCall();
constructor() {
_status = NOT_ENTERED;
}
/**
* @dev Prevents a contract from calling itself, directly or indirectly.
* Calling a `nonReentrant` function from another `nonReentrant`
* function is not supported. It is possible to prevent this from happening
* by making the `nonReentrant` function external, and making it call a
* `private` function that does the actual work.
*/
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be NOT_ENTERED
if (_status == ENTERED) {
revert ReentrancyGuardReentrantCall();
}
// Any calls to nonReentrant after this point will fail
_status = ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == ENTERED;
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_asset","type":"address"},{"internalType":"uint256","name":"_claimStart","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BadAddress","type":"error"},{"inputs":[],"name":"ClaimNotStarted","type":"error"},{"inputs":[],"name":"ClaimStarted","type":"error"},{"inputs":[],"name":"EnforcedPause","type":"error"},{"inputs":[],"name":"ExpectedPause","type":"error"},{"inputs":[],"name":"InsufficientShares","type":"error"},{"inputs":[],"name":"NoNativeToken","type":"error"},{"inputs":[],"name":"NotAllowedToken","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":[],"name":"ReentrancyGuardReentrantCall","type":"error"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"SafeERC20FailedOperation","type":"error"},{"inputs":[],"name":"VaultNotSet","type":"error"},{"inputs":[],"name":"WithdrawWindowOver","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newClaimStart","type":"uint256"}],"name":"ClaimStartUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"preAvltBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"vaultSharesTransferred","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"assets","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"DepositedToVault","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"preBurned","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"assetsReturned","type":"uint256"}],"name":"PreDepositWithdrawn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"assetAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"preAvltMinted","type":"uint256"}],"name":"PreDeposited","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"pendingVault","type":"address"},{"indexed":false,"internalType":"uint256","name":"activationTime","type":"uint256"}],"name":"VaultActivationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"vault","type":"address"}],"name":"VaultSet","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"activateVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"assetAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"preAmount","type":"uint256"}],"name":"claim","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimableShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositAllToVault","outputs":[{"internalType":"uint256","name":"sharesOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingVaultAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assetAmount","type":"uint256"}],"name":"preDeposit","outputs":[{"internalType":"uint256","name":"preAvltMinted","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"preToken","outputs":[{"internalType":"contract PreAVLT","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ts","type":"uint256"}],"name":"setClaimStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_vault","type":"address"}],"name":"setVault","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vault","outputs":[{"internalType":"contract IERC4626","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultActivationTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"vaultShareBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"preAmount","type":"uint256"}],"name":"withdrawPreDeposit","outputs":[{"internalType":"uint256","name":"assetsOut","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
60c06040523480156200001157600080fd5b506040516200233238038062002332833981016040819052620000349162000148565b33806200005b57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b6200006681620000ea565b50600180556001600160a01b03821662000093576040516332691b5760e01b815260040160405180910390fd5b6001600160a01b0382166080526005819055604051600090620000b6906200013a565b604051809103906000f080158015620000d3573d6000803e3d6000fd5b506001600160a01b031660a0525062000184915050565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b610bdb806200175783390190565b600080604083850312156200015c57600080fd5b82516001600160a01b03811681146200017457600080fd5b6020939093015192949293505050565b60805160a051611559620001fe6000396000818161035e0152818161056f0152818161079d0152818161091901528181610d7b0152610fa70152600081816101e30152818161026b015281816105ea0152818161069101528181610ab401528181610b5b01528181610d400152610f6001526115596000f3fe60806040526004361061016a5760003560e01c8063715018a6116100d1578063b0aa1e041161008a578063f04d688f11610064578063f04d688f1461045d578063f2fde38b14610473578063f743300c14610493578063fbfa77cf146104b357610188565b8063b0aa1e0414610408578063cea9d26f14610428578063e9ba60681461044857610188565b8063715018a6146103805780638456cb59146103955780638bcbc1f3146103aa5780638da5cb5b146103bf57806391cdc234146103dd57806393a27c91146103f257610188565b8063430bf08a11610123578063430bf08a146102a45780634f5ad9c5146102c257806352113ba7146102e25780635c975abb146103025780636817031b1461032c5780636ffea7bd1461034c57610188565b80631a25d68a146101a15780631ba46cfd146101d457806323764d531461021b578063379607f51461023957806338d52e0f146102595780633f4ba83a1461028d57610188565b36610188576040516357bd46e760e11b815260040160405180910390fd5b6040516357bd46e760e11b815260040160405180910390fd5b3480156101ad57600080fd5b506101c16101bc36600461145b565b6104d3565b6040519081526020015b60405180910390f35b3480156101e057600080fd5b507f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016101cb565b34801561022757600080fd5b506003546001600160a01b0316610203565b34801561024557600080fd5b506101c161025436600461145b565b610702565b34801561026557600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561029957600080fd5b506102a26108e5565b005b3480156102b057600080fd5b506002546001600160a01b0316610203565b3480156102ce57600080fd5b506101c16102dd36600461148b565b6108f7565b3480156102ee57600080fd5b50600354610203906001600160a01b031681565b34801561030e57600080fd5b50600054600160a01b900460ff1660405190151581526020016101cb565b34801561033857600080fd5b506102a261034736600461148b565b61098c565b34801561035857600080fd5b506102037f000000000000000000000000000000000000000000000000000000000000000081565b34801561038c57600080fd5b506102a2610a3f565b3480156103a157600080fd5b506102a2610a51565b3480156103b657600080fd5b506101c1610a61565b3480156103cb57600080fd5b506000546001600160a01b0316610203565b3480156103e957600080fd5b506101c1610c42565b3480156103fe57600080fd5b506101c160045481565b34801561041457600080fd5b506102a261042336600461145b565b610ccc565b34801561043457600080fd5b506102a26104433660046114ad565b610d0f565b34801561045457600080fd5b506102a2610e13565b34801561046957600080fd5b506101c160055481565b34801561047f57600080fd5b506102a261048e36600461148b565b610ebb565b34801561049f57600080fd5b506101c16104ae36600461145b565b610efe565b3480156104bf57600080fd5b50600254610203906001600160a01b031681565b60006104dd61104f565b6104e561107a565b8160000361050657604051631f2a200560e01b815260040160405180910390fd5b6003546001600160a01b0316158061052057506004544210155b8061053557506002546001600160a01b031615155b1561055357604051637d1a427d60e01b815260040160405180910390fd5b604051632770a7eb60e21b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156105bb57600080fd5b505af11580156105cf573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031691506370a0823190602401602060405180830381865afa15801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e91906114e9565b90508083111561068157604051633999656760e01b815260040160405180910390fd5b8291506106b86001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633846110a4565b604080518481526020810184905233917e089b27ab115fc0fccfc57f164ef2ac4bb17c645e38e50cfb7975350b0e49f991015b60405180910390a2506106fd60018055565b919050565b600061070c61104f565b61071461107a565b60055442101561073757604051635874e70f60e11b815260040160405180910390fd5b8160000361075857604051631f2a200560e01b815260040160405180910390fd5b6002546001600160a01b031661078157604051630647140b60e51b815260040160405180910390fd5b604051632770a7eb60e21b8152336004820152602481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156107e957600080fd5b505af11580156107fd573d6000803e3d6000fd5b50506002546040516370a0823160e01b8152306004820152859450600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa15801561084f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087391906114e9565b90508082111561089657604051633999656760e01b815260040160405180910390fd5b6002546108ad906001600160a01b031633846110a4565b604080518481526020810184905233917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a91016106eb565b6108ed611103565b6108f5611130565b565b6040516370a0823160e01b81526001600160a01b0382811660048301526000917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098691906114e9565b92915050565b610994611103565b6001600160a01b0381166109bb576040516332691b5760e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383161790556109e3426202a300611502565b6004819055600554116109f7576004546005555b806001600160a01b03167f51da267c00eb8b9c754a5116e08ae0c9c7423cddd2a10e29d43c541747fe90f1600454604051610a3491815260200190565b60405180910390a250565b610a47611103565b6108f56000611185565b610a59611103565b6108f56111d5565b6000610a6b611103565b610a7361107a565b6002546001600160a01b0316610a9c57604051630647140b60e51b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2791906114e9565b905080600003610b4a57604051631f2a200560e01b815260040160405180910390fd5b600254610b84906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683611218565b600254604051636e553f6560e01b8152600481018390523060248201526001600160a01b0390911690636e553f65906044016020604051808303816000875af1158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906114e9565b60408051838152602081018390529193507f4b8c73bef6e1bd45b4180a4201d607313ad6c1354f597acbb089dbe59a963a63910160405180910390a150610c3f60018055565b90565b6002546000906001600160a01b0316610c5b5750600090565b6002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc791906114e9565b905090565b610cd4611103565b60058190556040518181527f100e80b0884182c579b706a15d9baca9e82a8d00ee6732d57a7012596206ac909060200160405180910390a150565b610d17611103565b6001600160a01b038216610d3e576040516332691b5760e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b03161480610daf57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316836001600160a01b0316145b80610ddc57506002546001600160a01b031615801590610ddc57506002546001600160a01b038481169116145b15610dfa57604051630e1478bb60e41b815260040160405180910390fd5b610e0e6001600160a01b03841683836110a4565b505050565b610e1b611103565b6003546001600160a01b0316610e4457604051630647140b60e51b815260040160405180910390fd5b600454421015610e6757604051635874e70f60e11b815260040160405180910390fd5b60038054600280546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fe7ae49f883c825b05681b3e00e8be6fdea9ed2a8a45e4c6ecb9390fc44cce61590600090a2565b610ec3611103565b6001600160a01b038116610ef257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610efb81611185565b50565b6000610f0861104f565b610f1061107a565b6005544210610f325760405163c2e00d7b60e01b815260040160405180910390fd5b81600003610f5357604051631f2a200560e01b815260040160405180910390fd5b610f886001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163330856112a8565b506040516340c10f1960e01b81523360048201526024810182905281907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906340c10f1990604401600060405180830381600087803b158015610ff357600080fd5b505af1158015611007573d6000803e3d6000fd5b505060408051858152602081018590523393507f769d07232a0e0e8b07c20cbe5fb90cb85632d2438a9efcb1af1ee1886024e95792500160405180910390a26106fd60018055565b600054600160a01b900460ff16156108f55760405163d93c066560e01b815260040160405180910390fd5b60026001540361109d57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6040516001600160a01b03838116602483015260448201839052610e0e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506112e1565b6000546001600160a01b031633146108f55760405163118cdaa760e01b8152336004820152602401610ee9565b611138611352565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6111dd61104f565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111683390565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c91906114e9565b90506112a2848461129d8585611502565b61137c565b50505050565b6040516001600160a01b0384811660248301528381166044830152606482018390526112a29186918216906323b872dd906084016110d1565b600080602060008451602086016000885af180611304576040513d6000823e3d81fd5b50506000513d9150811561131c578060011415611329565b6001600160a01b0384163b155b156112a257604051635274afe760e01b81526001600160a01b0385166004820152602401610ee9565b600054600160a01b900460ff166108f557604051638dfc202b60e01b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526113cd848261140c565b6112a2576040516001600160a01b0384811660248301526000604483015261140291869182169063095ea7b3906064016110d1565b6112a284826112e1565b6000806000806020600086516020880160008a5af192503d91506000519050828015611451575081156114425780600114611451565b6000866001600160a01b03163b115b9695505050505050565b60006020828403121561146d57600080fd5b5035919050565b80356001600160a01b03811681146106fd57600080fd5b60006020828403121561149d57600080fd5b6114a682611474565b9392505050565b6000806000606084860312156114c257600080fd5b6114cb84611474565b92506114d960208501611474565b9150604084013590509250925092565b6000602082840312156114fb57600080fd5b5051919050565b8082018082111561098657634e487b7160e01b600052601160045260246000fdfea26469706673582212201ec8994857ec76c7c2f457ed41060f49d2052de8f736bb7c3f0cfac75488c83e64736f6c6343000815003360806040523480156200001157600080fd5b50336040518060400160405280601681526020017f50726520416c74757261205661756c7420546f6b656e00000000000000000000815250604051806040016040528060078152602001661c1c995055931560ca1b81525081600390816200007a9190620001c4565b506004620000898282620001c4565b5050506001600160a01b038116620000bb57604051631e4fbdf760e01b81526000600482015260240160405180910390fd5b620000c681620000cd565b5062000290565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806200014a57607f821691505b6020821081036200016b57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620001bf57600081815260208120601f850160051c810160208610156200019a5750805b601f850160051c820191505b81811015620001bb57828155600101620001a6565b5050505b505050565b81516001600160401b03811115620001e057620001e06200011f565b620001f881620001f1845462000135565b8462000171565b602080601f831160018114620002305760008415620002175750858301515b600019600386901b1c1916600185901b178555620001bb565b600085815260208120601f198616915b82811015620002615788860151825594840194600190910190840162000240565b5085821015620002805787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b61093b80620002a06000396000f3fe608060405234801561001057600080fd5b50600436106100ea5760003560e01c8063715018a61161008c5780639dc29fac116100665780639dc29fac146101cd578063a9059cbb146101e0578063dd62ed3e146101f3578063f2fde38b1461022c57600080fd5b8063715018a6146101a25780638da5cb5b146101aa57806395d89b41146101c557600080fd5b806323b872dd116100c857806323b872dd14610142578063313ce5671461015557806340c10f191461016457806370a082311461017957600080fd5b806306fdde03146100ef578063095ea7b31461010d57806318160ddd14610130575b600080fd5b6100f761023f565b6040516101049190610785565b60405180910390f35b61012061011b3660046107ef565b6102d1565b6040519015158152602001610104565b6002545b604051908152602001610104565b610120610150366004610819565b6102eb565b60405160068152602001610104565b6101776101723660046107ef565b61030f565b005b610134610187366004610855565b6001600160a01b031660009081526020819052604090205490565b610177610325565b6005546040516001600160a01b039091168152602001610104565b6100f7610339565b6101776101db3660046107ef565b610348565b6101206101ee3660046107ef565b61035a565b610134610201366004610877565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61017761023a366004610855565b610368565b60606003805461024e906108aa565b80601f016020809104026020016040519081016040528092919081815260200182805461027a906108aa565b80156102c75780601f1061029c576101008083540402835291602001916102c7565b820191906000526020600020905b8154815290600101906020018083116102aa57829003601f168201915b5050505050905090565b6000336102df8185856103ab565b60019150505b92915050565b6000336102f98582856103bd565b61030485858561043c565b506001949350505050565b61031761049b565b61032182826104c8565b5050565b61032d61049b565b61033760006104fe565b565b60606004805461024e906108aa565b61035061049b565b6103218282610550565b6000336102df81858561043c565b61037061049b565b6001600160a01b03811661039f57604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b6103a8816104fe565b50565b6103b88383836001610586565b505050565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015610436578181101561042757604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610396565b61043684848484036000610586565b50505050565b6001600160a01b03831661046657604051634b637e8f60e11b815260006004820152602401610396565b6001600160a01b0382166104905760405163ec442f0560e01b815260006004820152602401610396565b6103b883838361065b565b6005546001600160a01b031633146103375760405163118cdaa760e01b8152336004820152602401610396565b6001600160a01b0382166104f25760405163ec442f0560e01b815260006004820152602401610396565b6103216000838361065b565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b03821661057a57604051634b637e8f60e11b815260006004820152602401610396565b6103218260008361065b565b6001600160a01b0384166105b05760405163e602df0560e01b815260006004820152602401610396565b6001600160a01b0383166105da57604051634a1406b160e11b815260006004820152602401610396565b6001600160a01b038085166000908152600160209081526040808320938716835292905220829055801561043657826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9258460405161064d91815260200190565b60405180910390a350505050565b6001600160a01b03831661068657806002600082825461067b91906108e4565b909155506106f89050565b6001600160a01b038316600090815260208190526040902054818110156106d95760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610396565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b03821661071457600280548290039055610733565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8360405161077891815260200190565b60405180910390a3505050565b600060208083528351808285015260005b818110156107b257858101830151858201604001528201610796565b506000604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b03811681146107ea57600080fd5b919050565b6000806040838503121561080257600080fd5b61080b836107d3565b946020939093013593505050565b60008060006060848603121561082e57600080fd5b610837846107d3565b9250610845602085016107d3565b9150604084013590509250925092565b60006020828403121561086757600080fd5b610870826107d3565b9392505050565b6000806040838503121561088a57600080fd5b610893836107d3565b91506108a1602084016107d3565b90509250929050565b600181811c908216806108be57607f821691505b6020821081036108de57634e487b7160e01b600052602260045260246000fd5b50919050565b808201808211156102e557634e487b7160e01b600052601160045260246000fdfea2646970667358221220fc32fae320db424f8629e4c55f4ee0dfdd5e8573803e86e189949f182d3f7b5464736f6c63430008150033000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb0000000000000000000000000000000000000000000000000000000069488a00
Deployed Bytecode
0x60806040526004361061016a5760003560e01c8063715018a6116100d1578063b0aa1e041161008a578063f04d688f11610064578063f04d688f1461045d578063f2fde38b14610473578063f743300c14610493578063fbfa77cf146104b357610188565b8063b0aa1e0414610408578063cea9d26f14610428578063e9ba60681461044857610188565b8063715018a6146103805780638456cb59146103955780638bcbc1f3146103aa5780638da5cb5b146103bf57806391cdc234146103dd57806393a27c91146103f257610188565b8063430bf08a11610123578063430bf08a146102a45780634f5ad9c5146102c257806352113ba7146102e25780635c975abb146103025780636817031b1461032c5780636ffea7bd1461034c57610188565b80631a25d68a146101a15780631ba46cfd146101d457806323764d531461021b578063379607f51461023957806338d52e0f146102595780633f4ba83a1461028d57610188565b36610188576040516357bd46e760e11b815260040160405180910390fd5b6040516357bd46e760e11b815260040160405180910390fd5b3480156101ad57600080fd5b506101c16101bc36600461145b565b6104d3565b6040519081526020015b60405180910390f35b3480156101e057600080fd5b507f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb5b6040516001600160a01b0390911681526020016101cb565b34801561022757600080fd5b506003546001600160a01b0316610203565b34801561024557600080fd5b506101c161025436600461145b565b610702565b34801561026557600080fd5b506102037f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb81565b34801561029957600080fd5b506102a26108e5565b005b3480156102b057600080fd5b506002546001600160a01b0316610203565b3480156102ce57600080fd5b506101c16102dd36600461148b565b6108f7565b3480156102ee57600080fd5b50600354610203906001600160a01b031681565b34801561030e57600080fd5b50600054600160a01b900460ff1660405190151581526020016101cb565b34801561033857600080fd5b506102a261034736600461148b565b61098c565b34801561035857600080fd5b506102037f000000000000000000000000f262511bde0b8b7abc46e2a8bc28fd2b9b195b4581565b34801561038c57600080fd5b506102a2610a3f565b3480156103a157600080fd5b506102a2610a51565b3480156103b657600080fd5b506101c1610a61565b3480156103cb57600080fd5b506000546001600160a01b0316610203565b3480156103e957600080fd5b506101c1610c42565b3480156103fe57600080fd5b506101c160045481565b34801561041457600080fd5b506102a261042336600461145b565b610ccc565b34801561043457600080fd5b506102a26104433660046114ad565b610d0f565b34801561045457600080fd5b506102a2610e13565b34801561046957600080fd5b506101c160055481565b34801561047f57600080fd5b506102a261048e36600461148b565b610ebb565b34801561049f57600080fd5b506101c16104ae36600461145b565b610efe565b3480156104bf57600080fd5b50600254610203906001600160a01b031681565b60006104dd61104f565b6104e561107a565b8160000361050657604051631f2a200560e01b815260040160405180910390fd5b6003546001600160a01b0316158061052057506004544210155b8061053557506002546001600160a01b031615155b1561055357604051637d1a427d60e01b815260040160405180910390fd5b604051632770a7eb60e21b8152336004820152602481018390527f000000000000000000000000f262511bde0b8b7abc46e2a8bc28fd2b9b195b456001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156105bb57600080fd5b505af11580156105cf573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600092507f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb6001600160a01b031691506370a0823190602401602060405180830381865afa15801561063a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065e91906114e9565b90508083111561068157604051633999656760e01b815260040160405180910390fd5b8291506106b86001600160a01b037f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb1633846110a4565b604080518481526020810184905233917e089b27ab115fc0fccfc57f164ef2ac4bb17c645e38e50cfb7975350b0e49f991015b60405180910390a2506106fd60018055565b919050565b600061070c61104f565b61071461107a565b60055442101561073757604051635874e70f60e11b815260040160405180910390fd5b8160000361075857604051631f2a200560e01b815260040160405180910390fd5b6002546001600160a01b031661078157604051630647140b60e51b815260040160405180910390fd5b604051632770a7eb60e21b8152336004820152602481018390527f000000000000000000000000f262511bde0b8b7abc46e2a8bc28fd2b9b195b456001600160a01b031690639dc29fac90604401600060405180830381600087803b1580156107e957600080fd5b505af11580156107fd573d6000803e3d6000fd5b50506002546040516370a0823160e01b8152306004820152859450600093506001600160a01b0390911691506370a0823190602401602060405180830381865afa15801561084f573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061087391906114e9565b90508082111561089657604051633999656760e01b815260040160405180910390fd5b6002546108ad906001600160a01b031633846110a4565b604080518481526020810184905233917f987d620f307ff6b94d58743cb7a7509f24071586a77759b77c2d4e29f75a2f9a91016106eb565b6108ed611103565b6108f5611130565b565b6040516370a0823160e01b81526001600160a01b0382811660048301526000917f000000000000000000000000f262511bde0b8b7abc46e2a8bc28fd2b9b195b45909116906370a0823190602401602060405180830381865afa158015610962573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061098691906114e9565b92915050565b610994611103565b6001600160a01b0381166109bb576040516332691b5760e01b815260040160405180910390fd5b600380546001600160a01b0319166001600160a01b0383161790556109e3426202a300611502565b6004819055600554116109f7576004546005555b806001600160a01b03167f51da267c00eb8b9c754a5116e08ae0c9c7423cddd2a10e29d43c541747fe90f1600454604051610a3491815260200190565b60405180910390a250565b610a47611103565b6108f56000611185565b610a59611103565b6108f56111d5565b6000610a6b611103565b610a7361107a565b6002546001600160a01b0316610a9c57604051630647140b60e51b815260040160405180910390fd5b6040516370a0823160e01b81523060048201526000907f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb6001600160a01b0316906370a0823190602401602060405180830381865afa158015610b03573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b2791906114e9565b905080600003610b4a57604051631f2a200560e01b815260040160405180910390fd5b600254610b84906001600160a01b037f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb8116911683611218565b600254604051636e553f6560e01b8152600481018390523060248201526001600160a01b0390911690636e553f65906044016020604051808303816000875af1158015610bd5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bf991906114e9565b60408051838152602081018390529193507f4b8c73bef6e1bd45b4180a4201d607313ad6c1354f597acbb089dbe59a963a63910160405180910390a150610c3f60018055565b90565b6002546000906001600160a01b0316610c5b5750600090565b6002546040516370a0823160e01b81523060048201526001600160a01b03909116906370a0823190602401602060405180830381865afa158015610ca3573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc791906114e9565b905090565b610cd4611103565b60058190556040518181527f100e80b0884182c579b706a15d9baca9e82a8d00ee6732d57a7012596206ac909060200160405180910390a150565b610d17611103565b6001600160a01b038216610d3e576040516332691b5760e01b815260040160405180910390fd5b7f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb6001600160a01b0316836001600160a01b03161480610daf57507f000000000000000000000000f262511bde0b8b7abc46e2a8bc28fd2b9b195b456001600160a01b0316836001600160a01b0316145b80610ddc57506002546001600160a01b031615801590610ddc57506002546001600160a01b038481169116145b15610dfa57604051630e1478bb60e41b815260040160405180910390fd5b610e0e6001600160a01b03841683836110a4565b505050565b610e1b611103565b6003546001600160a01b0316610e4457604051630647140b60e51b815260040160405180910390fd5b600454421015610e6757604051635874e70f60e11b815260040160405180910390fd5b60038054600280546001600160a01b0383166001600160a01b031991821681179092559091169091556040517fe7ae49f883c825b05681b3e00e8be6fdea9ed2a8a45e4c6ecb9390fc44cce61590600090a2565b610ec3611103565b6001600160a01b038116610ef257604051631e4fbdf760e01b8152600060048201526024015b60405180910390fd5b610efb81611185565b50565b6000610f0861104f565b610f1061107a565b6005544210610f325760405163c2e00d7b60e01b815260040160405180910390fd5b81600003610f5357604051631f2a200560e01b815260040160405180910390fd5b610f886001600160a01b037f000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb163330856112a8565b506040516340c10f1960e01b81523360048201526024810182905281907f000000000000000000000000f262511bde0b8b7abc46e2a8bc28fd2b9b195b456001600160a01b0316906340c10f1990604401600060405180830381600087803b158015610ff357600080fd5b505af1158015611007573d6000803e3d6000fd5b505060408051858152602081018590523393507f769d07232a0e0e8b07c20cbe5fb90cb85632d2438a9efcb1af1ee1886024e95792500160405180910390a26106fd60018055565b600054600160a01b900460ff16156108f55760405163d93c066560e01b815260040160405180910390fd5b60026001540361109d57604051633ee5aeb560e01b815260040160405180910390fd5b6002600155565b6040516001600160a01b03838116602483015260448201839052610e0e91859182169063a9059cbb906064015b604051602081830303815290604052915060e01b6020820180516001600160e01b0383818316178352505050506112e1565b6000546001600160a01b031633146108f55760405163118cdaa760e01b8152336004820152602401610ee9565b611138611352565b6000805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6111dd61104f565b6000805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586111683390565b604051636eb1769f60e11b81523060048201526001600160a01b0383811660248301526000919085169063dd62ed3e90604401602060405180830381865afa158015611268573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061128c91906114e9565b90506112a2848461129d8585611502565b61137c565b50505050565b6040516001600160a01b0384811660248301528381166044830152606482018390526112a29186918216906323b872dd906084016110d1565b600080602060008451602086016000885af180611304576040513d6000823e3d81fd5b50506000513d9150811561131c578060011415611329565b6001600160a01b0384163b155b156112a257604051635274afe760e01b81526001600160a01b0385166004820152602401610ee9565b600054600160a01b900460ff166108f557604051638dfc202b60e01b815260040160405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526113cd848261140c565b6112a2576040516001600160a01b0384811660248301526000604483015261140291869182169063095ea7b3906064016110d1565b6112a284826112e1565b6000806000806020600086516020880160008a5af192503d91506000519050828015611451575081156114425780600114611451565b6000866001600160a01b03163b115b9695505050505050565b60006020828403121561146d57600080fd5b5035919050565b80356001600160a01b03811681146106fd57600080fd5b60006020828403121561149d57600080fd5b6114a682611474565b9392505050565b6000806000606084860312156114c257600080fd5b6114cb84611474565b92506114d960208501611474565b9150604084013590509250925092565b6000602082840312156114fb57600080fd5b5051919050565b8082018082111561098657634e487b7160e01b600052601160045260246000fdfea26469706673582212201ec8994857ec76c7c2f457ed41060f49d2052de8f736bb7c3f0cfac75488c83e64736f6c63430008150033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb0000000000000000000000000000000000000000000000000000000069488a00
-----Decoded View---------------
Arg [0] : _asset (address): 0xB8CE59FC3717ada4C02eaDF9682A9e934F625ebb
Arg [1] : _claimStart (uint256): 1766361600
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b8ce59fc3717ada4c02eadf9682a9e934f625ebb
Arg [1] : 0000000000000000000000000000000000000000000000000000000069488a00
Loading...
Loading
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in HYPE
Multichain Portfolio | 35 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.