Source Code
Latest 8 from a total of 8 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim_allocation | 23874780 | 111 days ago | IN | 0 ETH | 0.00011339 | ||||
| Withdraw | 23804897 | 121 days ago | IN | 0 ETH | 0.00004844 | ||||
| Claim_allocation | 23804881 | 121 days ago | IN | 0 ETH | 0.0000864 | ||||
| Claim_allocation | 23787051 | 123 days ago | IN | 0 ETH | 0.00008615 | ||||
| Claim_allocation | 23787048 | 123 days ago | IN | 0 ETH | 0.00010504 | ||||
| Withdraw | 23753305 | 128 days ago | IN | 0 ETH | 0.00008753 | ||||
| Claim_allocation | 23752904 | 128 days ago | IN | 0 ETH | 0.00008959 | ||||
| Claim_allocation | 23751198 | 128 days ago | IN | 0 ETH | 0.00015624 |
Latest 1 internal transaction
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| 0x60e06040 | 23739848 | 130 days ago | Contract Creation | 0 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Similar Match Source Code This contract matches the deployed Bytecode of the Source Code for Contract 0x934aE1CA...59627Ba87 The constructor portion of the code might be different and could alter the actual behaviour of the contract
Contract Name:
vault
Compiler Version
v0.8.30+commit.73712a01
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
import "./interfaces.sol";
import "./errors.sol";
/**
* @title PAI User Vault Contract
* @author EdgeServo
* @notice Secure vault for managing PAI tokens and rewards for individual users
* @dev Implements reentrancy protection, initialization control, and ownership verification mechanisms
*
* Main Features:
* - Receive and store PAI token allocations
* - Support user withdrawals to wallets
* - Handle third-party token reward distribution
* - Prevent reentrancy attacks and unauthorized access
*/
contract vault {
// ========== Immutable State Variables ==========
/// @notice Vault owner address (sole authorized user)
/// @dev Set at construction time, cannot be changed
address public immutable owner;
/// @notice PAI token contract address
/// @dev Primary token type managed by the vault
address public immutable pai_token;
/// @notice Distributor contract address
/// @dev Trusted contract responsible for signature verification and allocation coordination
address public immutable distributor;
// ========== Mutable State Variables ==========
/// @notice Total PAI tokens withdrawn by user from vault to wallet
/// @dev Only counts amounts withdrawn via withdraw() function
uint256 public total_withdrawn;
/// @notice Total PAI tokens claimed by user from project vault to this vault
/// @dev Only counts amounts claimed via claim_allocation() function
uint256 public total_claimed;
/// @notice Vault initialization status flag
/// @dev Prevents unregistered vaults from being used
bool private _initialized;
/// @notice Reentrancy lock state variable
/// @dev Implements reentrancy protection using state machine pattern
uint256 private _locked;
// ========== Constants ==========
/// @notice Reentrancy lock unlocked state
uint256 private constant _NOT_ENTERED = 1;
/// @notice Reentrancy lock locked state
uint256 private constant _ENTERED = 2;
// ========== Events ==========
/**
* @notice User withdrew PAI tokens event
* @param to Recipient address (owner wallet)
* @param amount Withdrawal amount
*/
event Withdrawn(address indexed to, uint256 amount);
/**
* @notice Reward token distribution event
* @param token Reward token contract address
* @param from Reward source address (awarder)
* @param to Reward recipient address
* @param amount Reward amount
*/
event AwardDistributed(
address indexed token,
address indexed from,
address indexed to,
uint256 amount
);
/**
* @notice User claimed PAI allocation event
* @param amount Claimed amount
*/
event Claimed(uint256 amount);
/**
* @notice Vault initialization completed event
* @param distributor Distributor contract address
*/
event Initialized(address indexed distributor);
// ========== Constructor ==========
/**
* @notice Create new user vault instance
* @dev Called by vault_factory via CREATE2 to ensure address uniqueness
*
* @param _owner Vault owner address (user wallet address)
* @param _token PAI token contract address
* @param _distributor Distributor contract address
*
* Requirements:
* - All parameters must not be zero address
*
* Reverts:
* - {ZeroAddress} if any parameter is zero address
*/
constructor(address _owner, address _token, address _distributor) {
// Parameter validation: ensure all critical addresses are valid
if (
_owner == address(0) ||
_token == address(0) ||
_distributor == address(0)
) {
revert ZeroAddress();
}
// Set immutable state variables
owner = _owner;
pai_token = _token;
distributor = _distributor;
// Initialize reentrancy lock to unlocked state
_locked = _NOT_ENTERED;
}
// ========== Function Modifiers ==========
/**
* @notice Modifier to prevent reentrancy attacks
* @dev Implements state machine pattern, more gas efficient than boolean
*
* Working principle:
* 1. Check if already locked (_ENTERED state)
* 2. Set to locked state
* 3. Execute function body
* 4. Restore to unlocked state
*
* Reverts:
* - {Unauthorized} if reentrancy detected
*/
modifier nonReentrant() {
// Reentrancy detection
if (_locked == _ENTERED) revert Unauthorized();
// Lock
_locked = _ENTERED;
// Execute function body
_;
// Unlock
_locked = _NOT_ENTERED;
}
/**
* @notice Modifier to ensure vault has completed initialization
* @dev Prevents unregistered vaults from being used
*
* Reverts:
* - {Unauthorized} if vault is not initialized
*/
modifier onlyInitialized() {
if (!_initialized) revert Unauthorized();
_;
}
// ========== Initialization Function ==========
/**
* @notice Complete vault initialization (final step of registration process)
* @dev Called by distributor after successful vault registration, can only be called once
*
* Call timing:
* - After user successfully registers via distributor.register_vault_with_signature()
*
* Access control:
* - Can only be called by distributor contract
* - Can only be called once
*
* State changes:
* - Set _initialized to true
*
* Reverts:
* - {Unauthorized} if caller is not distributor
* - {AlreadyExists} if already initialized
*
* Emits:
* - {Initialized} initialization completed
*/
function complete_initialization() external {
// Permission verification: only distributor can initialize
if (msg.sender != distributor) revert Unauthorized();
// State verification: prevent duplicate initialization
if (_initialized) revert AlreadyExists();
// Mark as initialized
_initialized = true;
// Emit initialization event
emit Initialized(distributor);
}
// ========== Core Business Functions ==========
/**
* @notice User claims PAI allocation quota via signature
* @dev Claims allocated PAI tokens from project vault to this vault
*
* Execution flow:
* 1. Verify caller is owner
* 2. Update state first (total_claimed)
* 3. Call distributor to execute allocation
* 4. If failed, rollback state and revert
*
* @param amount Claim amount (in wei)
* @param deadline Signature expiration timestamp
* @param signature EIP-712 signature data (65 bytes)
*
* Access control:
* - Can only be called by vault owner
* - Vault must be initialized
*
* Security measures:
* - Reentrancy protection (nonReentrant)
* - Checks-Effects-Interactions (CEI) pattern
* - Rollback state update on failure
*
* Reverts:
* - {Unauthorized} if caller is not owner or vault not initialized
* - {TransferFailed} if allocation execution fails
* - {SignatureExpired} if signature has expired
* - {InvalidSignature} if signature verification fails
*
* Emits:
* - {Claimed} claim successful
*/
function claim_allocation(
uint256 amount,
uint256 deadline,
bytes calldata signature
) external onlyInitialized nonReentrant {
// Permission verification: only owner can claim
if (msg.sender != owner) revert Unauthorized();
// Effect: update state first (CEI pattern)
// Use unchecked to save gas (overflow nearly impossible)
unchecked {
total_claimed += amount;
}
// Interaction: call external contract to execute allocation
bool success = i_distributor(distributor).execute_allocation(
amount,
deadline,
signature
);
// Check: verify execution result
if (!success) {
// If failed, rollback state update
unchecked {
total_claimed -= amount;
}
revert TransferFailed();
}
// Emit claim event
emit Claimed(amount);
}
/**
* @notice Withdraw PAI tokens from vault to owner wallet
* @dev Transfers all PAI balance in vault to owner in one transaction
*
* Execution flow:
* 1. Verify caller is owner
* 2. Query current balance
* 3. Update state first (total_withdrawn)
* 4. Execute token transfer
* 5. Verify transfer result
*
* Access control:
* - Can only be called by vault owner
* - Vault must be initialized
*
* Security measures:
* - Reentrancy protection (nonReentrant)
* - Checks-Effects-Interactions (CEI) pattern
* - Reject execution if balance is zero
*
* Reverts:
* - {Unauthorized} if caller is not owner or vault not initialized
* - {ZeroAmount} if balance is zero
* - {TransferFailed} if transfer fails
*
* Emits:
* - {Withdrawn} withdrawal successful
*/
function withdraw() external onlyInitialized nonReentrant {
// Permission verification: only owner can withdraw
if (msg.sender != owner) revert Unauthorized();
// Check: query current balance
uint256 balance = i_erc20(pai_token).balanceOf(address(this));
if (balance == 0) revert ZeroAmount();
// Effect: update state first (CEI pattern)
unchecked {
total_withdrawn += balance;
}
// Interaction: execute token transfer
bool success = i_erc20(pai_token).transfer(owner, balance);
if (!success) revert TransferFailed();
// Emit withdrawal event
emit Withdrawn(owner, balance);
}
/**
* @notice Distributor-initiated reward distribution operation
* @dev Handles third-party token rewards, transfers from awarder to accepter
*
* Execution flow:
* 1. Verify caller is distributor
* 2. Verify token address is valid and not PAI
* 3. Get project vault address from distributor
* 4. Get award role configuration from project vault
* 5. Check awarder balance
* 6. Execute transferFrom transfer
*
* @param token_address Reward token address to distribute
*
* Access control:
* - Can only be called by distributor contract
* - Vault must be initialized
*
* Restrictions:
* - Cannot withdraw PAI tokens (avoid conflict with main business)
* - Awarder balance must be greater than zero
*
* Reverts:
* - {Unauthorized} if caller not distributor, vault not initialized, or attempting to withdraw PAI
* - {ZeroAddress} if any critical address is zero
* - {ZeroAmount} if reward balance is zero
* - {TransferFailed} if transfer fails
*
* Emits:
* - {AwardDistributed} reward distribution successful
*/
function withdraw_award(address token_address) external onlyInitialized {
// Permission verification: only distributor can initiate reward distribution
if (msg.sender != distributor) revert Unauthorized();
// Parameter validation: token address cannot be zero
if (token_address == address(0)) revert ZeroAddress();
// Business rule: prohibit withdrawing PAI tokens (avoid conflict with main business)
if (token_address == pai_token) revert Unauthorized();
// Get project vault address
address project_vault = i_distributor(distributor).project_vault();
if (project_vault == address(0)) revert ZeroAddress();
// Get award role configuration (awarder and accepter)
(address awarder, address accepter) = i_project_vault(project_vault)
.get_award_roles(address(this));
// Verify role addresses are valid
if (awarder == address(0) || accepter == address(0)) {
revert ZeroAddress();
}
// Check awarder's token balance
uint256 amount = i_erc20(token_address).balanceOf(awarder);
if (amount == 0) revert ZeroAmount();
// Execute transfer from awarder to accepter
// Note: This requires awarder to have pre-approved sufficient allowance to this contract
bool success = i_erc20(token_address).transferFrom(
awarder,
accepter,
amount
);
if (!success) revert TransferFailed();
// Emit reward distribution event
emit AwardDistributed(token_address, awarder, accepter, amount);
}
// ========== Query Functions ==========
/**
* @notice Query PAI token balance in vault
* @dev Returns current amount of PAI tokens stored in vault
*
* @return balance PAI token balance (in wei)
*/
function get_balance() external view returns (uint256) {
return i_erc20(pai_token).balanceOf(address(this));
}
/**
* @notice Query balance of specified token in vault
* @dev Can be used to query reward token balance
*
* @param token_address Token contract address to query
* @return balance Token balance (in wei)
*/
function get_token_balance(
address token_address
) external view returns (uint256) {
return i_erc20(token_address).balanceOf(address(this));
}
/**
* @notice Check if vault has completed initialization
* @dev Used by frontend to verify vault status
*
* @return initialized Whether initialized
*/
function is_initialized() external view returns (bool) {
return _initialized;
}
// ========== Receive Functions ==========
/**
* @notice Reject direct ETH transfers
* @dev Prevents accidental ETH sends to vault
*/
receive() external payable {
revert Unauthorized();
}
/**
* @notice Reject all fallback calls
* @dev Prevents unknown function calls
*/
fallback() external payable {
revert Unauthorized();
}
}// SPDX-License-Identifier: MIT pragma solidity ^0.8.30; /** * @title PAI Token System Custom Error Definitions * @author EdgeServo * @notice Defines all custom errors used throughout the PAI distribution system * @dev Uses Solidity 0.8.4+ custom error feature to save gas costs * * Advantages: * - Gas optimization: significantly reduces deployment and runtime costs compared to require strings * - Type safety: compile-time checking, avoids string typos * - Code clarity: centralized management, easier to maintain and document * - Chain-friendly: error selectors only occupy 4 bytes, more compact than strings * * Usage examples: * ```solidity * if (amount == 0) revert ZeroAmount(); * if (msg.sender != owner) revert Unauthorized(); * ``` */ // ========== General Validation Errors ========== /** * @notice Zero address error * @dev Triggered when function parameter or return value is zero address (0x0) * * Trigger scenarios: * - Constructor parameter validation fails * - Zero address passed when setting critical contract addresses * - Query result is zero address but should not be * * Usage example: * ```solidity * if (_token == address(0)) revert ZeroAddress(); * ``` */ error ZeroAddress(); /** * @notice Zero amount error * @dev Triggered when token amount, value or count is zero but business logic requires non-zero * * Trigger scenarios: * - Attempt to transfer zero amount of tokens * - Allocation authorization amount is zero * - Vault balance is zero when attempting withdrawal * * Usage example: * ```solidity * if (amount == 0) revert ZeroAmount(); * if (balance == 0) revert ZeroAmount(); * ``` */ error ZeroAmount(); /** * @notice Invalid amount error * @dev Triggered when amount exceeds valid range, incorrect format or doesn't satisfy business rules * * Trigger scenarios: * - Signature length is not 65 bytes * - Signature parameter v value is not 27 or 28 * - Amount exceeds maximum limit * - Amount format doesn't meet requirements * * Usage example: * ```solidity * if (signature.length != 65) revert InvalidAmount(); * if (v != 27 && v != 28) revert InvalidAmount(); * ``` */ error InvalidAmount(); /** * @notice Unauthorized access error * @dev Triggered when caller lacks required permissions or operation is unauthorized * * Trigger scenarios: * - Non-owner attempts to call management functions * - Non-EOA attempts to deploy vault * - Unregistered vault attempts to execute operations * - Reentrancy attack detection * - Vault not initialized when calling protected functions * - Attempting to operate resources not owned by caller * * Usage example: * ```solidity * if (msg.sender != owner) revert Unauthorized(); * if (!_initialized) revert Unauthorized(); * if (_locked == _ENTERED) revert Unauthorized(); * ``` */ error Unauthorized(); /** * @notice Entity already exists error * @dev Triggered when attempting to create or register an already existing entity * * Trigger scenarios: * - User already owns a vault, attempts to deploy again * - Vault already registered, duplicate registration * - Attempting to set configuration that can only be set once * - Duplicate vault initialization * * Usage example: * ```solidity * if (user_vaults[user] != address(0)) revert AlreadyExists(); * if (registered_vaults[vault]) revert AlreadyExists(); * if (distributor != address(0)) revert AlreadyExists(); * ``` */ error AlreadyExists(); // ========== Transfer Operation Errors ========== /** * @notice Transfer failed error * @dev Triggered when ERC20 token transfer operation returns false or execution fails * * Trigger scenarios: * - transfer() returns false * - transferFrom() returns false * - Insufficient balance causing transfer failure * - Insufficient allowance causing transferFrom failure * - Allocation execution failure * * Usage example: * ```solidity * bool success = token.transfer(to, amount); * if (!success) revert TransferFailed(); * ``` * * Note: * - Some ERC20 tokens revert on failure instead of returning false * - Recommend using SafeERC20 library for safer transfer operations */ error TransferFailed(); // ========== Signature Verification Errors ========== /** * @notice Invalid signature error * @dev Triggered when EIP-712 signature verification fails * * Trigger scenarios: * - Signer is not the authorized signer * - Signature data has been tampered with * - Signature for wrong data structure * - ecrecover recovery fails (returns zero address) * - Wrong private key used for signing * * Usage example: * ```solidity * address recovered = ecrecover(digest, v, r, s); * if (recovered != signer) revert InvalidSignature(); * if (recovered == address(0)) revert InvalidSignature(); * ``` * * Security recommendations: * - Always verify ecrecover return value is not zero address * - Use correct EIP-712 domain separator * - Ensure nonce mechanism is correctly implemented */ error InvalidSignature(); /** * @notice Signature expired error * @dev Triggered when signature's validity deadline has passed * * Trigger scenarios: * - Current block timestamp > deadline * - Signature created beyond validity period * - Network congestion causing transaction confirmation delay * * Usage example: * ```solidity * if (block.timestamp > deadline) revert SignatureExpired(); * ``` * * Considerations: * - deadline should have reasonable buffer time * - Consider network congestion may cause delays * - Expired signatures cannot be reused, must regenerate */ error SignatureExpired();
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
/**
* @title PAI Token System Interface Definitions
* @author EdgeServo
* @notice Defines all contract interaction interfaces in PAI token distribution system
* @dev Includes ERC20 standard interface and internal system contract interfaces
*
* Interface descriptions:
* - i_erc20: Standard ERC20 token interface (simplified version)
* - i_vault: User vault contract interface
* - i_distributor: Distributor contract interface
* - i_project_vault: Project vault contract interface
* - i_vault_factory: Vault factory contract interface
*/
// ========== ERC20 Token Interface ==========
/**
* @title ERC20 Token Interface (Simplified)
* @notice Defines core ERC20 standard functions needed by PAI system
* @dev Only includes core functions used by system, not complete ERC20 standard
*/
interface i_erc20 {
/**
* @notice Query token balance of specified account
* @dev Standard ERC20 function
*
* @param account Account address to query
* @return Account's token holdings (in wei)
*
* Usage:
* - Vault queries its own PAI balance
* - Query reward token balance
* - Verify sufficient balance before transfer
*/
function balanceOf(address account) external view returns (uint256);
/**
* @notice Transfer tokens to specified address
* @dev Standard ERC20 function, transfers from caller's account
*
* @param to Recipient address
* @param amount Transfer amount (in wei)
* @return Whether transfer succeeded
*
* Requirements:
* - Caller's balance must be >= amount
* - to address cannot be zero address
*
* Usage:
* - Vault transfers PAI to user
* - Project vault allocates tokens to user vault
*/
function transfer(address to, uint256 amount) external returns (bool);
/**
* @notice Transfer tokens from one address to another
* @dev Standard ERC20 function, requires prior approval
*
* @param from Source address (token owner)
* @param to Recipient address
* @param amount Transfer amount (in wei)
* @return Whether transfer succeeded
*
* Requirements:
* - from address balance must be >= amount
* - Caller must have sufficient allowance
* - to address cannot be zero address
*
* Usage:
* - Vault withdraws reward tokens (from awarder to accepter)
* - Requires awarder to pre-call approve() for authorization
*/
function transferFrom(
address from,
address to,
uint256 amount
) external returns (bool);
}
// ========== User Vault Interface ==========
/**
* @title User Vault Contract Interface
* @notice Defines externally exposed functions of user vault
* @dev Used for distributor and project vault to interact with user vaults
*/
interface i_vault {
/**
* @notice Get vault owner address
* @dev Read-only function, returns owner set at vault creation
*
* @return Ethereum address of vault owner
*
* Usage:
* - Distributor verifies registrant identity
* - Frontend displays vault ownership information
* - Other contracts verify operation permissions
*/
function owner() external view returns (address);
/**
* @notice Complete vault initialization
* @dev Called by distributor after successful registration, marks vault as usable
*
* Access control:
* - Can only be called by distributor contract
* - Can only be called once
*
* State changes:
* - Set _initialized flag to true
* - Vault becomes operational
*
* Usage:
* - Complete final step of vault registration
* - Activate all vault functions
*/
function complete_initialization() external;
/**
* @notice Withdraw third-party reward tokens
* @dev Called by distributor, transfers rewards from awarder to accepter
*
* @param token_address Reward token contract address
*
* Access control:
* - Can only be called by distributor contract
* - Vault must be initialized
*
* Restrictions:
* - Cannot withdraw PAI tokens
* - Awarder must have sufficient balance
*
* Usage:
* - Distribute reward tokens provided by project party
* - Handle airdrops and other incentive activities
*/
function withdraw_award(address token_address) external;
}
// ========== Distributor Interface ==========
/**
* @title Distributor Contract Interface
* @notice Defines core functions exposed by distributor
* @dev Used for vaults and project vault to interact with distributor
*/
interface i_distributor {
/**
* @notice Get project vault address
* @dev Read-only function, returns project vault address in system
*
* @return Project vault contract address
*
* Usage:
* - Vault queries project vault location
* - Get award role configuration
* - Verify system configuration completeness
*/
function project_vault() external view returns (address);
/**
* @notice Execute token allocation operation
* @dev Verify signature then transfer from project vault to user vault
*
* @param amount Amount of tokens to allocate (in wei)
* @param deadline Signature validity deadline timestamp
* @param signature EIP-712 signature data (65 bytes)
* @return Whether allocation succeeded
*
* Access control:
* - Can only be called by registered vault contracts
* - Requires valid authorization signature
*
* Verification flow:
* 1. Check if vault is registered
* 2. Verify signature has not expired
* 3. Verify EIP-712 signature
* 4. Call project vault to execute transfer
*
* Usage:
* - User vault claims allocation quota
* - Implement signature-authorized token distribution
*/
function execute_allocation(
uint256 amount,
uint256 deadline,
bytes calldata signature
) external returns (bool);
/**
* @notice Distribute reward tokens
* @dev Coordinate reward token transfer from awarder to accepter
*
* @param vault_address Vault receiving rewards
* @param token_address Reward token contract address
*
* Access control:
* - Can only be called by project vault contract
* - Target vault must be registered
*
* Execution flow:
* - Verify permissions and vault status
* - Call vault's withdraw_award() function
*
* Usage:
* - Project vault initiates reward distribution
* - Handle third-party token rewards
*/
function distribute_award(
address vault_address,
address token_address
) external;
}
// ========== Project Vault Interface ==========
/**
* @title Project Vault Contract Interface
* @notice Defines core functions exposed by project vault
* @dev Used for distributor and user vaults to interact with project vault
*/
interface i_project_vault {
/**
* @notice Register user vault to system
* @dev Called by distributor during user registration, establishes vault-user association
*
* @param vault_address Vault address to register
* @param user Vault owner (user address)
*
* Access control:
* - Can only be called by distributor contract
*
* State changes:
* - Record vault and user mapping relationship
* - May initialize reward configuration, etc.
*
* Usage:
* - Complete vault registration process
* - Establish user and vault association
* - Initialize user-related configuration
*/
function register_vault(address vault_address, address user) external;
/**
* @notice Allocate tokens to user vault
* @dev Transfer specified amount of PAI tokens to user vault
*
* @param user_vault User vault address receiving tokens
* @param amount Allocation amount (in wei)
* @return Whether allocation succeeded
*
* Access control:
* - Can only be called by distributor contract
*
* Preconditions:
* - Project vault has sufficient balance
* - User vault is registered
*
* Usage:
* - Execute actual token transfer
* - Complete final step of allocation authorization
*/
function allocate_to_user(
address user_vault,
uint256 amount
) external returns (bool);
/**
* @notice Get award role configuration for specified vault
* @dev Returns reward token awarder and accepter addresses
*
* @param vault_address Vault address
* @return awarder Reward awarder address (token holder)
* @return accepter Reward accepter address (final beneficiary)
*
* Usage:
* - Vault queries reward configuration
* - Determine reward token transfer path
* - Support flexible reward distribution mechanism
*
* Note:
* - Awarder needs to pre-approve vault sufficient allowance
* - Accepter may be user themselves or other designated address
*/
function get_award_roles(
address vault_address
) external view returns (address awarder, address accepter);
}
// ========== Vault Factory Interface ==========
/**
* @title Vault Factory Contract Interface
* @notice Defines validation functions exposed by vault factory
* @dev Used for distributor to verify vault legitimacy
*/
interface i_vault_factory {
/**
* @notice Verify if address is a valid deployed vault
* @dev Check if address was deployed by this factory via CREATE2
*
* @param vault_address Vault address to verify
* @return Whether it is a valid vault address
*
* Verification logic:
* - Check deployed_vaults mapping
* - Confirm vault was deployed by factory
*
* Usage:
* - Distributor verifies vault legitimacy
* - Prevent registration of unauthorized vaults
* - Ensure vault code is trustworthy
*
* Note:
* - Only verifies deployment source, not initialization status
* - Returns true means deployed by factory, but may not be registered
*/
function is_valid_vault(address vault_address) external view returns (bool);
}{
"optimizer": {
"enabled": true,
"runs": 200,
"details": {
"yul": true,
"yulDetails": {
"stackAllocation": true,
"optimizerSteps": "dhfoDgvulfnTUtnIf"
}
}
},
"viaIR": false,
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"abi"
]
}
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_distributor","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"inputs":[],"name":"ZeroAmount","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"AwardDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"distributor","type":"address"}],"name":"Initialized","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Withdrawn","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"claim_allocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"complete_initialization","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributor","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"get_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token_address","type":"address"}],"name":"get_token_balance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"is_initialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pai_token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_claimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"total_withdrawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token_address","type":"address"}],"name":"withdraw_award","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
0x60e060405234801561001057600080fd5b506040516110fe3803806110fe83398101604081905261002f916100d3565b6001600160a01b038316158061004c57506001600160a01b038216155b8061005e57506001600160a01b038116155b1561007c5760405163d92e233d60e01b815260040160405180910390fd5b6001600160a01b0392831660805290821660a0521660c052600160035561011c565b60006001600160a01b0382165b92915050565b6100ba8161009e565b81146100c557600080fd5b50565b80516100ab816100b1565b6000806000606084860312156100eb576100eb600080fd5b6100f585856100c8565b925061010485602086016100c8565b915061011385604086016100c8565b90509250925092565b60805160a05160c051610f596101a5600039600081816102200152818161033e015281816106dd0152818161079601528181610b8a0152610c0501526000818160f2015281816104d40152818161058c015281816107430152610a8e0152600081816101cc015281816102e00152818161047d015281816105b901526106480152610f596000f3fe6080604052600436106100ab5760003560e01c80638da5cb5b116100645780638da5cb5b146101ba5780639a01873c146101ee578063bfe109281461020e578063c1cfb99a14610242578063d472d6bf14610257578063eb2d8eea14610277576100c8565b806317c11a92146100e057806325793ba71461012a5780633ccfd60b1461014c57806343bfdd5d1461016157806349f7068b146101845780636af904c6146101a4576100c8565b366100c8576040516282b42960e81b815260040160405180910390fd5b6040516282b42960e81b815260040160405180910390fd5b3480156100ec57600080fd5b506101147f000000000000000000000000000000000000000000000000000000000000000081565b6040516101219190610c6e565b60405180910390f35b34801561013657600080fd5b5061014a610145366004610ce9565b61028c565b005b34801561015857600080fd5b5061014a610429565b34801561016d57600080fd5b5061017760005481565b6040516101219190610d58565b34801561019057600080fd5b5061014a61019f366004610d7a565b6106b0565b3480156101b057600080fd5b5061017760015481565b3480156101c657600080fd5b506101147f000000000000000000000000000000000000000000000000000000000000000081565b3480156101fa57600080fd5b5060025460ff166040516101219190610da8565b34801561021a57600080fd5b506101147f000000000000000000000000000000000000000000000000000000000000000081565b34801561024e57600080fd5b50610177610a74565b34801561026357600080fd5b50610177610272366004610d7a565b610b09565b34801561028357600080fd5b5061014a610b7f565b60025460ff166102ae576040516282b42960e81b815260040160405180910390fd5b6002600354036102d0576040516282b42960e81b815260040160405180910390fd5b6002600355336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461031d576040516282b42960e81b815260040160405180910390fd5b600180548501905560405162365db160ea1b81526000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063d976c40090610379908890889088908890600401610de2565b6020604051808303816000875af1158015610398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103bc9190610e2d565b9050806103e657600180548690039055604080516312171d8360e31b815290519081900360040190fd5b7f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb8856040516104159190610d58565b60405180910390a150506001600355505050565b60025460ff1661044b576040516282b42960e81b815260040160405180910390fd5b60026003540361046d576040516282b42960e81b815260040160405180910390fd5b6002600355336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104ba576040516282b42960e81b815260040160405180910390fd5b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610509903090600401610c6e565b602060405180830381865afa158015610526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054a9190610e57565b90508060000361056d57604051631f2a200560e01b815260040160405180910390fd5b600080548201815560405163a9059cbb60e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063a9059cbb906105e3907f0000000000000000000000000000000000000000000000000000000000000000908690600401610e76565b6020604051808303816000875af1158015610602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106269190610e2d565b905080610646576040516312171d8360e31b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58360405161069f9190610d58565b60405180910390a250506001600355565b60025460ff166106d2576040516282b42960e81b815260040160405180910390fd5b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461071a576040516282b42960e81b815260040160405180910390fd5b6001600160a01b0381166107415760405163d92e233d60e01b815260040160405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031603610792576040516282b42960e81b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663af8bc37d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108169190610e9c565b90506001600160a01b03811661083f5760405163d92e233d60e01b815260040160405180910390fd5b600080826001600160a01b0316633d3abc5f306040518263ffffffff1660e01b815260040161086e9190610c6e565b6040805180830381865afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae9190610ebb565b90925090506001600160a01b03821615806108d057506001600160a01b038116155b156108ee5760405163d92e233d60e01b815260040160405180910390fd5b6040516370a0823160e01b81526000906001600160a01b038616906370a082319061091d908690600401610c6e565b602060405180830381865afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e9190610e57565b90508060000361098157604051631f2a200560e01b815260040160405180910390fd5b6040516323b872dd60e01b81526000906001600160a01b038716906323b872dd906109b490879087908790600401610ef3565b6020604051808303816000875af11580156109d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f79190610e2d565b905080610a17576040516312171d8360e31b815260040160405180910390fd5b826001600160a01b0316846001600160a01b0316876001600160a01b03167f5a7a405d83b6323575a4bb6ba0e16eff9504f51605c8324459ce06de9d5fd51c85604051610a649190610d58565b60405180910390a4505050505050565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190610ac3903090600401610c6e565b602060405180830381865afa158015610ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b049190610e57565b905090565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610b38903090600401610c6e565b602060405180830381865afa158015610b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b799190610e57565b92915050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610bc7576040516282b42960e81b815260040160405180910390fd5b60025460ff1615610beb5760405163119b4fd360e11b815260040160405180910390fd5b6002805460ff191660011790556040516001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016907f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e690600090a2565b60006001600160a01b038216610b79565b610c6881610c4e565b82525050565b60208101610b798284610c5f565b805b8114610c8957600080fd5b50565b8035610b7981610c7c565b60008083601f840112610cac57610cac600080fd5b50813567ffffffffffffffff811115610cc757610cc7600080fd5b602083019150836001820283011115610ce257610ce2600080fd5b9250929050565b60008060008060608587031215610d0257610d02600080fd5b610d0c8686610c8c565b9350610d1b8660208701610c8c565b9250604085013567ffffffffffffffff811115610d3a57610d3a600080fd5b610d4687828801610c97565b95989497509550505050565b80610c68565b60208101610b798284610d52565b610c7e81610c4e565b8035610b7981610d66565b600060208284031215610d8f57610d8f600080fd5b610d998383610d6f565b9392505050565b801515610c68565b60208101610b798284610da0565b82818337506000910152565b818352602083019250610dd6828483610db6565b50601f01601f19160190565b60608101610df08287610d52565b610dfd6020830186610d52565b8181036040830152610e10818486610dc2565b9695505050505050565b801515610c7e565b8051610b7981610e1a565b600060208284031215610e4257610e42600080fd5b610d998383610e22565b8051610b7981610c7c565b600060208284031215610e6c57610e6c600080fd5b610d998383610e4c565b60408101610e848285610c5f565b610d996020830184610d52565b8051610b7981610d66565b600060208284031215610eb157610eb1600080fd5b610d998383610e91565b60008060408385031215610ed157610ed1600080fd5b610edb8484610e91565b9150610eea8460208501610e91565b90509250929050565b60608101610f018286610c5f565b610f0e6020830185610c5f565b610f1b6040830184610d52565b94935050505056fea2646970667358221220a38dc2d6eea455d62bee18f1b7139f178f13cbe725a9e7508e438093a90c4d9664736f6c634300081e0033000000000000000000000000d0e8ee169cf206f815f53cb884f8863cc1d42cf2000000000000000000000000b78ecc5a33fe5ba907e37ed60c86d1621e59e20a000000000000000000000000427f6e2d9cc5d7dda2251a2be137dff9f8fc0cab
Deployed Bytecode
0x6080604052600436106100ab5760003560e01c80638da5cb5b116100645780638da5cb5b146101ba5780639a01873c146101ee578063bfe109281461020e578063c1cfb99a14610242578063d472d6bf14610257578063eb2d8eea14610277576100c8565b806317c11a92146100e057806325793ba71461012a5780633ccfd60b1461014c57806343bfdd5d1461016157806349f7068b146101845780636af904c6146101a4576100c8565b366100c8576040516282b42960e81b815260040160405180910390fd5b6040516282b42960e81b815260040160405180910390fd5b3480156100ec57600080fd5b506101147f000000000000000000000000b78ecc5a33fe5ba907e37ed60c86d1621e59e20a81565b6040516101219190610c6e565b60405180910390f35b34801561013657600080fd5b5061014a610145366004610ce9565b61028c565b005b34801561015857600080fd5b5061014a610429565b34801561016d57600080fd5b5061017760005481565b6040516101219190610d58565b34801561019057600080fd5b5061014a61019f366004610d7a565b6106b0565b3480156101b057600080fd5b5061017760015481565b3480156101c657600080fd5b506101147f000000000000000000000000d0e8ee169cf206f815f53cb884f8863cc1d42cf281565b3480156101fa57600080fd5b5060025460ff166040516101219190610da8565b34801561021a57600080fd5b506101147f000000000000000000000000427f6e2d9cc5d7dda2251a2be137dff9f8fc0cab81565b34801561024e57600080fd5b50610177610a74565b34801561026357600080fd5b50610177610272366004610d7a565b610b09565b34801561028357600080fd5b5061014a610b7f565b60025460ff166102ae576040516282b42960e81b815260040160405180910390fd5b6002600354036102d0576040516282b42960e81b815260040160405180910390fd5b6002600355336001600160a01b037f000000000000000000000000d0e8ee169cf206f815f53cb884f8863cc1d42cf2161461031d576040516282b42960e81b815260040160405180910390fd5b600180548501905560405162365db160ea1b81526000906001600160a01b037f000000000000000000000000427f6e2d9cc5d7dda2251a2be137dff9f8fc0cab169063d976c40090610379908890889088908890600401610de2565b6020604051808303816000875af1158015610398573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103bc9190610e2d565b9050806103e657600180548690039055604080516312171d8360e31b815290519081900360040190fd5b7f7a355715549cfe7c1cba26304350343fbddc4b4f72d3ce3e7c27117dd20b5cb8856040516104159190610d58565b60405180910390a150506001600355505050565b60025460ff1661044b576040516282b42960e81b815260040160405180910390fd5b60026003540361046d576040516282b42960e81b815260040160405180910390fd5b6002600355336001600160a01b037f000000000000000000000000d0e8ee169cf206f815f53cb884f8863cc1d42cf216146104ba576040516282b42960e81b815260040160405180910390fd5b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000b78ecc5a33fe5ba907e37ed60c86d1621e59e20a16906370a0823190610509903090600401610c6e565b602060405180830381865afa158015610526573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061054a9190610e57565b90508060000361056d57604051631f2a200560e01b815260040160405180910390fd5b600080548201815560405163a9059cbb60e01b81526001600160a01b037f000000000000000000000000b78ecc5a33fe5ba907e37ed60c86d1621e59e20a169063a9059cbb906105e3907f000000000000000000000000d0e8ee169cf206f815f53cb884f8863cc1d42cf2908690600401610e76565b6020604051808303816000875af1158015610602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106269190610e2d565b905080610646576040516312171d8360e31b815260040160405180910390fd5b7f000000000000000000000000d0e8ee169cf206f815f53cb884f8863cc1d42cf26001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d58360405161069f9190610d58565b60405180910390a250506001600355565b60025460ff166106d2576040516282b42960e81b815260040160405180910390fd5b336001600160a01b037f000000000000000000000000427f6e2d9cc5d7dda2251a2be137dff9f8fc0cab161461071a576040516282b42960e81b815260040160405180910390fd5b6001600160a01b0381166107415760405163d92e233d60e01b815260040160405180910390fd5b7f000000000000000000000000b78ecc5a33fe5ba907e37ed60c86d1621e59e20a6001600160a01b0316816001600160a01b031603610792576040516282b42960e81b815260040160405180910390fd5b60007f000000000000000000000000427f6e2d9cc5d7dda2251a2be137dff9f8fc0cab6001600160a01b031663af8bc37d6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107f2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108169190610e9c565b90506001600160a01b03811661083f5760405163d92e233d60e01b815260040160405180910390fd5b600080826001600160a01b0316633d3abc5f306040518263ffffffff1660e01b815260040161086e9190610c6e565b6040805180830381865afa15801561088a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108ae9190610ebb565b90925090506001600160a01b03821615806108d057506001600160a01b038116155b156108ee5760405163d92e233d60e01b815260040160405180910390fd5b6040516370a0823160e01b81526000906001600160a01b038616906370a082319061091d908690600401610c6e565b602060405180830381865afa15801561093a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061095e9190610e57565b90508060000361098157604051631f2a200560e01b815260040160405180910390fd5b6040516323b872dd60e01b81526000906001600160a01b038716906323b872dd906109b490879087908790600401610ef3565b6020604051808303816000875af11580156109d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f79190610e2d565b905080610a17576040516312171d8360e31b815260040160405180910390fd5b826001600160a01b0316846001600160a01b0316876001600160a01b03167f5a7a405d83b6323575a4bb6ba0e16eff9504f51605c8324459ce06de9d5fd51c85604051610a649190610d58565b60405180910390a4505050505050565b6040516370a0823160e01b81526000906001600160a01b037f000000000000000000000000b78ecc5a33fe5ba907e37ed60c86d1621e59e20a16906370a0823190610ac3903090600401610c6e565b602060405180830381865afa158015610ae0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b049190610e57565b905090565b6040516370a0823160e01b81526000906001600160a01b038316906370a0823190610b38903090600401610c6e565b602060405180830381865afa158015610b55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b799190610e57565b92915050565b336001600160a01b037f000000000000000000000000427f6e2d9cc5d7dda2251a2be137dff9f8fc0cab1614610bc7576040516282b42960e81b815260040160405180910390fd5b60025460ff1615610beb5760405163119b4fd360e11b815260040160405180910390fd5b6002805460ff191660011790556040516001600160a01b037f000000000000000000000000427f6e2d9cc5d7dda2251a2be137dff9f8fc0cab16907f908408e307fc569b417f6cbec5d5a06f44a0a505ac0479b47d421a4b2fd6a1e690600090a2565b60006001600160a01b038216610b79565b610c6881610c4e565b82525050565b60208101610b798284610c5f565b805b8114610c8957600080fd5b50565b8035610b7981610c7c565b60008083601f840112610cac57610cac600080fd5b50813567ffffffffffffffff811115610cc757610cc7600080fd5b602083019150836001820283011115610ce257610ce2600080fd5b9250929050565b60008060008060608587031215610d0257610d02600080fd5b610d0c8686610c8c565b9350610d1b8660208701610c8c565b9250604085013567ffffffffffffffff811115610d3a57610d3a600080fd5b610d4687828801610c97565b95989497509550505050565b80610c68565b60208101610b798284610d52565b610c7e81610c4e565b8035610b7981610d66565b600060208284031215610d8f57610d8f600080fd5b610d998383610d6f565b9392505050565b801515610c68565b60208101610b798284610da0565b82818337506000910152565b818352602083019250610dd6828483610db6565b50601f01601f19160190565b60608101610df08287610d52565b610dfd6020830186610d52565b8181036040830152610e10818486610dc2565b9695505050505050565b801515610c7e565b8051610b7981610e1a565b600060208284031215610e4257610e42600080fd5b610d998383610e22565b8051610b7981610c7c565b600060208284031215610e6c57610e6c600080fd5b610d998383610e4c565b60408101610e848285610c5f565b610d996020830184610d52565b8051610b7981610d66565b600060208284031215610eb157610eb1600080fd5b610d998383610e91565b60008060408385031215610ed157610ed1600080fd5b610edb8484610e91565b9150610eea8460208501610e91565b90509250929050565b60608101610f018286610c5f565b610f0e6020830185610c5f565b610f1b6040830184610d52565b94935050505056fea2646970667358221220a38dc2d6eea455d62bee18f1b7139f178f13cbe725a9e7508e438093a90c4d9664736f6c634300081e0033
Deployed Bytecode Sourcemap
570:13697:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14071:14;;-1:-1:-1;;;14071:14:2;;;;;;;;;;;570:13697;14244:14;;-1:-1:-1;;;14244:14:2;;;;;;;;;;;896:34;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;7447:975;;;;;;;;;;-1:-1:-1;7447:975:2;;;;;:::i;:::-;;:::i;:::-;;9316:700;;;;;;;;;;;;;:::i;1315:30::-;;;;;;;;;;;;;;;;;;;;;;;:::i;11183:1629::-;;;;;;;;;;-1:-1:-1;11183:1629:2;;;;;:::i;:::-;;:::i;1507:28::-;;;;;;;;;;;;;;;;763:30;;;;;;;;;;;;;;;13772:91;;;;;;;;;;-1:-1:-1;13844:12:2;;;;13772:91;;;;;;:::i;1079:36::-;;;;;;;;;;;;;;;13050:122;;;;;;;;;;;;;:::i;13418:167::-;;;;;;;;;;-1:-1:-1;13418:167:2;;;;;:::i;:::-;;:::i;5835:434::-;;;;;;;;;;;;;:::i;7447:975::-;5040:12;;;;5035:40;;5061:14;;-1:-1:-1;;;5061:14:2;;;;;;;;;;;5035:40;2048:1:::1;4585:7;;:19:::0;4581:46:::1;;4613:14;;-1:-1:-1::0;;;4613:14:2::1;;;;;;;;;;;4581:46;2048:1;4654:7;:18:::0;7672:10:::2;-1:-1:-1::0;;;;;7686:5:2::2;7672:19;;7668:46;;7700:14;;-1:-1:-1::0;;;7700:14:2::2;;;;;;;;;;;7668:46;7867:13;:23:::0;;;::::2;::::0;;7995:120:::2;::::0;-1:-1:-1;;;7995:120:2;;7867:13:::2;::::0;-1:-1:-1;;;;;8009:11:2::2;7995:45;::::0;::::2;::::0;:120:::2;::::0;7884:6;;8074:8;;8096:9;;;;7995:120:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;7980:135;;8173:7;8168:189;;8272:13;:23:::0;;;;::::2;::::0;;8330:16:::2;::::0;;-1:-1:-1;;;8330:16:2;;;;;;;;::::2;::::0;;::::2;8168:189;8400:15;8408:6;8400:15;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1959:1:2::1;4746:7;:22:::0;-1:-1:-1;;;7447:975:2:o;9316:700::-;5040:12;;;;5035:40;;5061:14;;-1:-1:-1;;;5061:14:2;;;;;;;;;;;5035:40;2048:1:::1;4585:7;;:19:::0;4581:46:::1;;4613:14;;-1:-1:-1::0;;;4613:14:2::1;;;;;;;;;;;4581:46;2048:1;4654:7;:18:::0;9448:10:::2;-1:-1:-1::0;;;;;9462:5:2::2;9448:19;;9444:46;;9476:14;;-1:-1:-1::0;;;9476:14:2::2;;;;;;;;;;;9444:46;9559:43;::::0;-1:-1:-1;;;9559:43:2;;9541:15:::2;::::0;-1:-1:-1;;;;;9567:9:2::2;9559:28;::::0;::::2;::::0;:43:::2;::::0;9596:4:::2;::::0;9559:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9541:61;;9616:7;9627:1;9616:12:::0;9612:37:::2;;9637:12;;-1:-1:-1::0;;;9637:12:2::2;;;;;;;;;;;9612:37;9736:15;:26:::0;;;::::2;::::0;;9845:43:::2;::::0;-1:-1:-1;;;9845:43:2;;-1:-1:-1;;;;;9853:9:2::2;9845:27;::::0;::::2;::::0;:43:::2;::::0;9873:5:::2;::::0;9755:7;;9845:43:::2;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;9830:58;;9903:7;9898:37;;9919:16;;-1:-1:-1::0;;;9919:16:2::2;;;;;;;;;;;9898:37;9994:5;-1:-1:-1::0;;;;;9984:25:2::2;;10001:7;9984:25;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;1959:1:2::1;4746:7;:22:::0;9316:700::o;11183:1629::-;5040:12;;;;5035:40;;5061:14;;-1:-1:-1;;;5061:14:2;;;;;;;;;;;5035:40;11355:10:::1;-1:-1:-1::0;;;;;11369:11:2::1;11355:25;;11351:52;;11389:14;;-1:-1:-1::0;;;11389:14:2::1;;;;;;;;;;;11351:52;-1:-1:-1::0;;;;;11480:27:2;::::1;11476:53;;11516:13;;-1:-1:-1::0;;;11516:13:2::1;;;;;;;;;;;11476:53;11655:9;-1:-1:-1::0;;;;;11638:26:2::1;:13;-1:-1:-1::0;;;;;11638:26:2::1;::::0;11634:53:::1;;11673:14;;-1:-1:-1::0;;;11673:14:2::1;;;;;;;;;;;11634:53;11735:21;11773:11;-1:-1:-1::0;;;;;11759:40:2::1;;:42;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11735:66:::0;-1:-1:-1;;;;;;11815:27:2;::::1;11811:53;;11851:13;;-1:-1:-1::0;;;11851:13:2::1;;;;;;;;;;;11811:53;11939:15;11956:16:::0;11992:13:::1;-1:-1:-1::0;;;;;11976:59:2::1;;12044:4;11976:74;;;;;;;;;;;;;;;:::i;:::-;;::::0;::::1;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;11938:112:::0;;-1:-1:-1;11938:112:2;-1:-1:-1;;;;;;12108:21:2;::::1;::::0;;:47:::1;;-1:-1:-1::0;;;;;;12133:22:2;::::1;::::0;12108:47:::1;12104:98;;;12178:13;;-1:-1:-1::0;;;12178:13:2::1;;;;;;;;;;;12104:98;12270:41;::::0;-1:-1:-1;;;12270:41:2;;12253:14:::1;::::0;-1:-1:-1;;;;;12270:32:2;::::1;::::0;::::1;::::0;:41:::1;::::0;12303:7;;12270:41:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12253:58;;12325:6;12335:1;12325:11:::0;12321:36:::1;;12345:12;;-1:-1:-1::0;;;12345:12:2::1;;;;;;;;;;;12321:36;12534:108;::::0;-1:-1:-1;;;12534:108:2;;12519:12:::1;::::0;-1:-1:-1;;;;;12534:35:2;::::1;::::0;::::1;::::0;:108:::1;::::0;12583:7;;12604:8;;12626:6;;12534:108:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;12519:123;;12657:7;12652:37;;12673:16;;-1:-1:-1::0;;;12673:16:2::1;;;;;;;;;;;12652:37;12788:8;-1:-1:-1::0;;;;;12747:58:2::1;12779:7;-1:-1:-1::0;;;;;12747:58:2::1;12764:13;-1:-1:-1::0;;;;;12747:58:2::1;;12798:6;12747:58;;;;;;:::i;:::-;;;;;;;;11255:1557;;;;;11183:1629:::0;:::o;13050:122::-;13122:43;;-1:-1:-1;;;13122:43:2;;13096:7;;-1:-1:-1;;;;;13130:9:2;13122:28;;;;:43;;13159:4;;13122:43;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13115:50;;13050:122;:::o;13418:167::-;13531:47;;-1:-1:-1;;;13531:47:2;;13505:7;;-1:-1:-1;;;;;13531:32:2;;;;;:47;;13572:4;;13531:47;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;13524:54;13418:167;-1:-1:-1;;13418:167:2:o;5835:434::-;5961:10;-1:-1:-1;;;;;5975:11:2;5961:25;;5957:52;;5995:14;;-1:-1:-1;;;5995:14:2;;;;;;;;;;;5957:52;6088:12;;;;6084:40;;;6109:15;;-1:-1:-1;;;6109:15:2;;;;;;;;;;;6084:40;6166:12;:19;;-1:-1:-1;;6166:19:2;6181:4;6166:19;;;6238:24;;-1:-1:-1;;;;;6250:11:2;6238:24;;;;6166:12;;6238:24;5835:434::o;124:96:3:-;159:7;-1:-1:-1;;;;;82:31:3;;192:22;14:105;225:95;291:22;307:5;291:22;:::i;:::-;286:3;279:35;;;225:95::o;325:197::-;459:2;444:18;;471:45;448:9;490:6;471:45;:::i;713:122::-;804:5;788:22;781:5;778:33;768:61;;825:1;822;815:12;768:61;713:122;:::o;840:139::-;913:20;;942:31;913:20;942:31;:::i;984:634::-;1035:8;1045:6;1099:3;1092:4;1084:6;1080:17;1076:27;1066:150;;1127:79;632:1;629;622:12;1127:79;-1:-1:-1;1235:20:3;;1278:18;1267:30;;1264:145;;;1320:79;632:1;629;622:12;1320:79;1442:4;1434:6;1430:17;1418:29;;1496:3;1488:4;1480:6;1476:17;1466:8;1462:32;1459:41;1456:156;;;1523:79;632:1;629;622:12;1523:79;984:634;;;;;:::o;1623:711::-;1711:6;1719;1727;1735;1788:2;1776:9;1767:7;1763:23;1759:32;1756:147;;;1814:79;632:1;629;622:12;1814:79;1922:46;1960:7;1945:9;1922:46;:::i;:::-;1912:56;;1987:47;2026:7;2021:2;2010:9;2006:18;1987:47;:::i;:::-;1977:57;;2085:2;2074:9;2070:18;2057:32;2112:18;2104:6;2101:30;2098:145;;;2154:79;632:1;629;622:12;2154:79;2270:58;2320:7;2311:6;2300:9;2296:22;2270:58;:::i;:::-;1623:711;;;;-1:-1:-1;2252:76:3;-1:-1:-1;;;;1623:711:3:o;2339:95::-;2421:5;2405:22;641:67;2439:197;2573:2;2558:18;;2585:45;2562:9;2604:6;2585:45;:::i;2641:122::-;2716:22;2732:5;2716:22;:::i;2768:139::-;2841:20;;2870:31;2841:20;2870:31;:::i;2912:298::-;2971:6;3024:2;3012:9;3003:7;2999:23;2995:32;2992:147;;;3050:79;632:1;629;622:12;3050:79;3158:46;3196:7;3181:9;3158:46;:::i;:::-;3148:56;2912:298;-1:-1:-1;;;2912:298:3:o;3312:89::-;3287:13;;3280:21;3375:19;3215:92;3406:188;3534:2;3519:18;;3546:42;3523:9;3562:6;3546:42;:::i;3753:150::-;3854:6;3849:3;3844;3831:30;-1:-1:-1;3895:1:3;3877:16;;3870:27;3753:150::o;4016:253::-;3685:19;;;3737:4;3728:14;;4092:54;;4155:56;4204:6;4199:3;4192:5;4155:56;:::i;:::-;-1:-1:-1;4001:2:3;3981:14;-1:-1:-1;;3977:28:3;4227:36;;4016:253::o;4274:457::-;4492:2;4477:18;;4504:45;4481:9;4523:6;4504:45;:::i;:::-;4558:46;4600:2;4589:9;4585:18;4577:6;4558:46;:::i;:::-;4650:9;4644:4;4640:20;4635:2;4624:9;4620:18;4613:48;4678:47;4720:4;4712:6;4704;4678:47;:::i;:::-;4670:55;4274:457;-1:-1:-1;;;;;;4274:457:3:o;4736:116::-;3287:13;;3280:21;4808:19;3215:92;4857:137;4938:13;;4960:28;4938:13;4960:28;:::i;4999:314::-;5066:6;5119:2;5107:9;5098:7;5094:23;5090:32;5087:147;;;5145:79;632:1;629;622:12;5145:79;5253:54;5299:7;5284:9;5253:54;:::i;5318:143::-;5402:13;;5424:31;5402:13;5424:31;:::i;5466:320::-;5536:6;5589:2;5577:9;5568:7;5564:23;5560:32;5557:147;;;5615:79;632:1;629;622:12;5615:79;5723:57;5772:7;5757:9;5723:57;:::i;5791:280::-;5953:2;5938:18;;5965:45;5942:9;5984:6;5965:45;:::i;:::-;6019:46;6061:2;6050:9;6046:18;6038:6;6019:46;:::i;6076:143::-;6160:13;;6182:31;6160:13;6182:31;:::i;6224:320::-;6294:6;6347:2;6335:9;6326:7;6322:23;6318:32;6315:147;;;6373:79;632:1;629;622:12;6373:79;6481:57;6530:7;6515:9;6481:57;:::i;6549:414::-;6628:6;6636;6689:2;6677:9;6668:7;6664:23;6660:32;6657:147;;;6715:79;632:1;629;622:12;6715:79;6823:57;6872:7;6857:9;6823:57;:::i;:::-;6813:67;;6899:58;6949:7;6944:2;6933:9;6929:18;6899:58;:::i;:::-;6889:68;;6549:414;;;;;:::o;6968:363::-;7158:2;7143:18;;7170:45;7147:9;7189:6;7170:45;:::i;:::-;7224:46;7266:2;7255:9;7251:18;7243:6;7224:46;:::i;:::-;7279;7321:2;7310:9;7306:18;7298:6;7279:46;:::i;:::-;6968:363;;;;;;:::o
Swarm Source
ipfs://a38dc2d6eea455d62bee18f1b7139f178f13cbe725a9e7508e438093a90c4d96
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 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.