ETH Price: $1,560.64 (-11.31%)

Contract

0xCFB04433d5473c5C82387c4418A5e7633B4b5446
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To

There are no matching entries

Please try again later

Advanced mode:
Parent Transaction Hash Method Block
From
To
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
VaultFactory2

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion
File 1 of 5 : Vault.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";

contract Vault2 is IERC721Receiver {
    struct Transaction {
        address to;
        bytes data;
        uint256 timestamp;
        bool executed;
        uint256 confirmations;
        uint256 amount;
    }

    struct TokenLimit {
        uint256 fixedLimit; // if set, takes precedence over percentageLimit
        uint256 percentageLimit; // if fixedLimit is 0, use this limit as percentage of total balance
        uint256 useBaseLimit; // 0: no limit, 1: use base daily limit, 2: limit = 0 (disallow withdrawals)
    }

    address public owner;
    string public name;
    address public recoveryAddress;
    address[] public whitelistedAddresses;
    uint256 public dailyLimit; // in percentage
    uint256 public threshold; // number of required signers
    uint256 public delay; // in seconds
    address[] public assets;
    mapping(address => bool) public isWhitelisted;
    mapping(address => uint256) public dailyWithdrawnAmount; // token => withdrawn amount
    mapping(address => uint256) public lastWithdrawTimestamp; // token => timestamp
    mapping(address => TokenLimit) public tokenLimits;
    Transaction[] public queuedTransactions;
    uint public queuedTxs;
    uint public freeze;
    uint public version;
    mapping(uint256 => mapping(address => bool)) public confirmed;

    event TokenDeposited(
        address token,
        uint256 amount,
        address indexed depositor
    );
    event NFTDeposited(address nft, uint256 tokenId, address indexed depositor);
    event TokenWithdrawn(address token, uint256 amount);
    event TransactionQueued(
        uint256 txIndex,
        address to,
        bytes data,
        uint256 amount
    );
    event TransactionExecuted(uint256 txIndex, address to, bytes data);
    event TransactionConfirmed(uint256 txIndex, address confirmer);

    modifier onlyOwner() {
        require(msg.sender == owner, "Not the owner");
        _;
    }

    modifier onlyWhitelisted() {
        require(isWhitelisted[msg.sender], "Not a whitelisted address");
        _;
    }

    modifier onlyRecoveryAddress() {
        require(msg.sender == recoveryAddress, "Not the recovery address");
        _;
    }

function init(
        address _owner,
        string memory _name,
        address _recoveryAddress,
        address[] memory _whitelistedAddresses,
        uint256 _dailyLimit,
        uint256 _threshold,
        uint256 _delay
    )public {
    require(owner == address(0), "Already initialized");
        owner = _owner;
        name = _name;
        recoveryAddress = _recoveryAddress;
        dailyLimit = _dailyLimit;
        threshold = _threshold;
        delay = _delay;
version=1;
        for (uint256 i = 0; i < _whitelistedAddresses.length; i++) {
            isWhitelisted[_whitelistedAddresses[i]] = true;
        }
        whitelistedAddresses = _whitelistedAddresses;
    }

    function depositToken(address token, uint256 amount) public payable {
        if (token == address(0)) {
            require(msg.value == amount, "Incorrect ETH amount");
        } else {
            require(
                IERC20(token).transferFrom(msg.sender, address(this), amount),
                "Transfer failed"
            );
        }
        emit TokenDeposited(token, amount, msg.sender);
    }

    function depositNFT(address nft, uint256 tokenId) public {
        IERC721(nft).safeTransferFrom(msg.sender, address(this), tokenId);
        emit NFTDeposited(nft, tokenId, msg.sender);
    }

    function withdrawToken(
        address to,
        address token,
        uint256 amount
    ) public onlyOwner {
        uint256 balance = token == address(0)
            ? address(this).balance
            : IERC20(token).balanceOf(address(this));
        require(balance >= amount, "Insufficient balance");
        require(freeze == 0, "Freeze is active");

        uint256 limitAmount = getLimitAmount(token);
        uint256 timeSinceLastWithdrawal = block.timestamp -
            lastWithdrawTimestamp[token];

        if (timeSinceLastWithdrawal >= 1 days) {
            dailyWithdrawnAmount[token] = 0;
        }


        uint256 remainingLimit = limitAmount +
            (timeSinceLastWithdrawal * limitAmount) /
            1 days >
            dailyWithdrawnAmount[token]
            ? limitAmount +
                      (timeSinceLastWithdrawal * limitAmount) /
                    1 days -
                  dailyWithdrawnAmount[token]
              : 0;
          if (remainingLimit > limitAmount) {
              remainingLimit = limitAmount;
          }

        if (amount > remainingLimit) {
            queueWithdrawal(token, to, amount);
        } else {
            dailyWithdrawnAmount[token] = limitAmount - remainingLimit+amount;
//            dailyWithdrawnAmount[token] += amount;
            lastWithdrawTimestamp[token] = block.timestamp;

            executeWithdrawal(to, token, amount);
        }
    }

    function getLimit(
        address to,
        address token,
        uint256 amount
    ) public view returns (uint) {
        uint256 balance = token == address(0)
            ? address(this).balance
            : IERC20(token).balanceOf(address(this));
        require(balance >= amount, "Insufficient balance");

        uint256 limitAmount = getLimitAmount(token);
        uint256 timeSinceLastWithdrawal = block.timestamp -
            lastWithdrawTimestamp[token];
        uint dailyWithdrawn = dailyWithdrawnAmount[token];

        if (timeSinceLastWithdrawal >= 1 days) {
            dailyWithdrawn = 0;
        }

        uint256 remainingLimit = limitAmount +
            (timeSinceLastWithdrawal * limitAmount) /
            1 days >
            dailyWithdrawnAmount[token]
            ? limitAmount +
                      (timeSinceLastWithdrawal * limitAmount) /
                    1 days -
                  dailyWithdrawnAmount[token]
              : 0;
          if (remainingLimit > limitAmount) {
              remainingLimit = limitAmount;
          }
 

        if (amount <= remainingLimit) {
            return amount != 0 ? amount : remainingLimit;
        } else {
            return 0;
        }
    }

    function queueWithdrawal(
        address token,
        address to,
        uint256 amount
    ) internal {
        bytes memory data;
        if (token == address(0)) {
            data = "";
            queueTransaction(to, data, amount);
        } else {
            data = abi.encodeWithSignature(
                "transfer(address,uint256)",
                to,
                amount
            );
            queueTransaction(token, data, 0);
        }
    }

    function queueTransaction(
        address to,
        bytes memory data,
        uint256 amount
    ) public onlyOwner {
        require(freeze == 0, "Freeze is active");
        Transaction storage newTransaction = queuedTransactions.push();
        newTransaction.to = to;
        newTransaction.data = data;
        newTransaction.timestamp = block.timestamp;
        newTransaction.executed = false;
        newTransaction.amount = amount;
        queuedTxs += 1;

        emit TransactionQueued(queuedTransactions.length - 1, to, data, amount);
    }

    function confirmTransaction(uint256 txIndex) public {
        require(
            msg.sender == owner || isWhitelisted[msg.sender],
            "Not authorized"
        );
        require(freeze <= 1, "Freeze is active");
        Transaction storage transaction = queuedTransactions[txIndex];
        require(transaction.timestamp != 0, "Transaction not found");
        require(!transaction.executed, "Transaction already executed");
        if (
            isWhitelisted[msg.sender] &&
            !(msg.sender == owner &&
                transaction.timestamp + delay <= block.timestamp)
        ) {
            require(
                !confirmed[txIndex][msg.sender],
                "Transaction already confirmed by this address"
            );
            transaction.confirmations += 1;
            confirmed[txIndex][msg.sender] = true;
        }
        if (
            msg.sender == owner &&
            transaction.timestamp + delay <= block.timestamp
        ) {
            transaction.confirmations = threshold;
        }
        emit TransactionConfirmed(txIndex, msg.sender);

        if (transaction.confirmations >= threshold) {
            executeTransaction(txIndex);
        }
    }
    function cancelTransaction(uint256 txIndex) public {
        require(
            msg.sender == owner || msg.sender == recoveryAddress,
            "Not authorized"
        );
        Transaction storage transaction = queuedTransactions[txIndex];
        require(transaction.timestamp != 0, "Transaction not found");
        require(!transaction.executed, "Transaction already executed");
        transaction.executed = true;
transaction.confirmations=404;
    }

    function executeTransaction(uint256 txIndex) internal {
        Transaction storage transaction = queuedTransactions[txIndex];
        require(
            transaction.confirmations >= threshold,
            "Not enough confirmations"
        );
        require(!transaction.executed, "Transaction already executed");

        transaction.executed = true;

        (bool success, ) = transaction.to.call{value: transaction.amount}(
            transaction.data
        );
        require(success, "Transaction execution failed");

        emit TransactionExecuted(txIndex, transaction.to, transaction.data);
    }

    function executeWithdrawal(
        address to,
        address token,
        uint256 amount
    ) internal {
        if (token == address(0)) {
            (bool success, ) = to.call{value: amount}("");
            require(success, "Transfer failed");
        } else {
            require(IERC20(token).transfer(to, amount), "Transfer failed");
        }
        emit TokenWithdrawn(token, amount);

        // Queue and execute a placeholder transaction
        Transaction storage newTransaction = queuedTransactions.push();
        newTransaction.to = token != address(0) ? token : to;
        newTransaction.data = abi.encodeWithSignature(
            "transfer(address,uint256)",
            to,
            amount
        );
        newTransaction.timestamp = block.timestamp;
        newTransaction.executed = true;
        newTransaction.amount = amount;

        queuedTxs += 1;

        emit TransactionQueued(queuedTransactions.length - 1, to, "", 0);
        emit TransactionExecuted(queuedTransactions.length - 1, to, "");
    }

    function getLimitAmount(address token) public view returns (uint256) {
        uint256 balance = token == address(0)
            ? address(this).balance
            : IERC20(token).balanceOf(address(this));
        TokenLimit storage limit = tokenLimits[token];
        if (limit.fixedLimit > 0) {
            return limit.fixedLimit;
        } else if (limit.percentageLimit > 0) {
            return (balance * limit.percentageLimit) / 100;
        } else if (limit.useBaseLimit == 1) {
            return 0; // disallow withdrawals
        } else if (limit.useBaseLimit == 2) {
            return uint256(1000000000000000000000000000000);
        } else {
            return (balance * dailyLimit) / 100;
        }
    }

    function updateRecoveryAddress(address newRecoveryAddress) external {
        require(
            msg.sender == address(this),
            "Can only be called by contract itself"
        );
        recoveryAddress = newRecoveryAddress;
    }

    function updateWhitelistAddresses(
        address[] memory newWhitelistedAddresses
    ) external {
        require(
            msg.sender == address(this),
            "Can only be called by contract itself"
        );
        for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
            isWhitelisted[whitelistedAddresses[i]] = false;
        }
        for (uint256 i = 0; i < newWhitelistedAddresses.length; i++) {
            isWhitelisted[newWhitelistedAddresses[i]] = true;
        }
        whitelistedAddresses = newWhitelistedAddresses;
    }

    function updateDailyLimit(uint256 newDailyLimit) external {
        require(
            msg.sender == address(this),
            "Can only be called by contract itself"
        );
        dailyLimit = newDailyLimit;
    }

    function updateThreshold(uint256 newThreshold) external {
        require(
            msg.sender == address(this),
            "Can only be called by contract itself"
        );
        threshold = newThreshold;
    }

    function updateDelay(uint256 newDelay) external {
        require(
            msg.sender == address(this),
            "Can only be called by contract itself"
        );
        delay = newDelay;
    }

    function setTokenLimit(
        address token,
        uint256 fixedLimit,
        uint256 percentageLimit,
        uint256 useBaseLimit
    ) external {
        require(
            msg.sender == address(this),
            "Can only be called by contract itself"
        );
        require(useBaseLimit <= 2, "Invalid useBaseLimit value");
        tokenLimits[token] = TokenLimit({
            fixedLimit: fixedLimit,
            percentageLimit: percentageLimit,
            useBaseLimit: useBaseLimit
        });
    }
    function freezeLock(uint freezeL) external {
        require(
            msg.sender == address(this) ||
                msg.sender == owner ||
                msg.sender == recoveryAddress ||
                isWhitelisted[msg.sender],
            "Can only be called by contract itself, owner, recovery address or whitelisted addresses"
        );
        if (msg.sender != recoveryAddress) {
            require(freezeL >= freeze, "Cannot unfreeze");
        }
        freeze = freezeL;
    }
    receive() external payable {
        // Accept ETH deposits
    }

    function recover(
        address token,
        address to,
        uint256 amount,
        bytes memory data,
        uint freezeL
    ) external onlyRecoveryAddress {
        if (token == address(0)) {
            require(address(this).balance >= amount, "Insufficient balance");
            (bool success, ) = to.call{value: amount}(data);
            require(success, "Transfer failed");
        } else {
            require(
                IERC20(token).balanceOf(address(this)) >= amount,
                "Insufficient balance"
            );
            require(IERC20(token).transfer(to, amount), "Transfer failed");
        }
        emit TokenWithdrawn(token, amount);
        freeze = freezeL;
    }

    function updateSettings(
        address newRecoveryAddress,
        address[] memory newWhitelistedAddresses,
        uint256 newDailyLimit,
        uint256 newThreshold,
        uint256 newDelay,
        address[] memory tokens,
        uint256[] memory fixedLimits,
        uint256[] memory percentageLimits,
        uint256[] memory useBaseLimits
    ) external {
        require(
            msg.sender == address(this) || msg.sender == recoveryAddress,
            "Not authorized"
        );

        if (newRecoveryAddress != address(0)) {
            recoveryAddress = newRecoveryAddress;
        }

        if (newWhitelistedAddresses.length > 0) {
            for (uint256 i = 0; i < whitelistedAddresses.length; i++) {
                isWhitelisted[whitelistedAddresses[i]] = false;
            }
            for (uint256 i = 0; i < newWhitelistedAddresses.length; i++) {
                isWhitelisted[newWhitelistedAddresses[i]] = true;
            }
            whitelistedAddresses = newWhitelistedAddresses;
        }

        if (newDailyLimit != 0) {
            dailyLimit = newDailyLimit;
        }

        if (newThreshold != 0) {
            threshold = newThreshold;
        }

        if (newDelay != 0) {
            delay = newDelay;
        }

        if (tokens.length > 0) {
            require(
                tokens.length == fixedLimits.length &&
                    tokens.length == percentageLimits.length &&
                    tokens.length == useBaseLimits.length,
                "Input arrays length mismatch"
            );

            for (uint256 i = 0; i < tokens.length; i++) {
                require(useBaseLimits[i] <= 2, "Invalid useBaseLimit value");
                tokenLimits[tokens[i]] = TokenLimit({
                    fixedLimit: fixedLimits[i],
                    percentageLimit: percentageLimits[i],
                    useBaseLimit: useBaseLimits[i]
                });
            }
        }
    }

    function onERC721Received(
        address _operator,
        address _from,
        uint256 _tokenId,
        bytes memory _data
    ) external override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

contract SimpleProxy {
    /// @notice The address of the implementation contract
    address public immutable implementation;

    /// @notice Constructor to set the implementation address
    /// @param _implementation The address of the implementation contract
    constructor(address _implementation) {
        require(
            _implementation != address(0),
            "Invalid implementation address"
        );
        implementation = _implementation;
    }

    /// @notice Internal function to delegate calls to the implementation contract
    /// @dev Uses inline assembly to perform the delegatecall
    /// @param impl The address of the implementation contract
    function _delegate(address impl) internal virtual {
        assembly {
            calldatacopy(0, 0, calldatasize())

            let result := delegatecall(gas(), impl, 0, calldatasize(), 0, 0)

            returndatacopy(0, 0, returndatasize())

            switch result
            case 0 {
                revert(0, returndatasize())
            }
            default {
                return(0, returndatasize())
            }
        }
    }

    /// @notice Fallback function to delegate all calls to the implementation contract
    /// @dev This function will catch any call to the contract and forward it to the implementation
    fallback() external payable virtual {
        _delegate(implementation);
    }

    /// @notice Receive function to handle plain Ether transfers
    /// @dev This function will catch any plain Ether transfers and forward them to the implementation
    receive() external payable virtual {
        _delegate(implementation);
    }
}

contract VaultFactory2 {
    address public owner;
    uint256 public totalVaults;
    address public vaultImplementation;
    mapping(string => address) public vaultNames;
    mapping(address => address[]) public ownerToVaults;

    event VaultCreated(
        address vaultAddress,
        address indexed owner,
        string name,
        address recoveryAddress
    );

    modifier onlyOwner() {
        require(msg.sender == owner, "Not the owner");
        _;
    }

    constructor(address _vaultImplementation) {
        owner = 0x9D31e30003f253563Ff108BC60B16Fdf2c93abb5;//msg.sender;
        vaultImplementation = _vaultImplementation;
    }

    function createVault(
        string memory _name,
        address _recoveryAddress,
        address[] memory _whitelistedAddresses,
        uint256 _dailyLimit,
        uint256 _threshold,
        uint256 _delay
    ) public returns (address) {
        require(vaultNames[_name] == address(0), "Vault name already exists");

        bytes32 salt = keccak256(
            abi.encodePacked(msg.sender, ownerToVaults[msg.sender].length)
        );

        SimpleProxy proxyc = new SimpleProxy{salt: salt}(vaultImplementation);
        address proxy = address(proxyc);
        Vault2(payable(proxy)).init(
            msg.sender,
            _name,
            _recoveryAddress,
            _whitelistedAddresses,
            _dailyLimit,
            _threshold,
            _delay
        );

        vaultNames[_name] = proxy;
        ownerToVaults[msg.sender].push(proxy);
        totalVaults += 1;

        emit VaultCreated(proxy, msg.sender, _name, _recoveryAddress);
        return proxy;
    }
function updateVaultImplementation(address _vaultImplementation) public onlyOwner {
        vaultImplementation = _vaultImplementation;
    }
    function getVaultsByOwner(
        address _owner
    ) public view returns (address[] memory) {
        return ownerToVaults[_owner];
    }
}

File 2 of 5 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `from` to `to` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) external returns (bool);
}

File 3 of 5 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}

File 4 of 5 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 5 of 5 : IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * 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[EIP 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);
}

Settings
{
  "optimizer": {
    "enabled": false,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_vaultImplementation","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"vaultAddress","type":"address"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"address","name":"recoveryAddress","type":"address"}],"name":"VaultCreated","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_recoveryAddress","type":"address"},{"internalType":"address[]","name":"_whitelistedAddresses","type":"address[]"},{"internalType":"uint256","name":"_dailyLimit","type":"uint256"},{"internalType":"uint256","name":"_threshold","type":"uint256"},{"internalType":"uint256","name":"_delay","type":"uint256"}],"name":"createVault","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"getVaultsByOwner","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerToVaults","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalVaults","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_vaultImplementation","type":"address"}],"name":"updateVaultImplementation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vaultImplementation","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"","type":"string"}],"name":"vaultNames","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

608060405234801562000010575f80fd5b506040516200164838038062001648833981810160405281019062000036919062000135565b739d31e30003f253563ff108bc60b16fdf2c93abb55f806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000165565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f620000ff82620000d4565b9050919050565b6200011181620000f3565b81146200011c575f80fd5b50565b5f815190506200012f8162000106565b92915050565b5f602082840312156200014d576200014c620000d0565b5b5f6200015c848285016200011f565b91505092915050565b6114d580620001735f395ff3fe608060405234801562000010575f80fd5b506004361062000092575f3560e01c80638d65402311620000615780638d65402314620001585780638da5cb5b146200017a578063ac818711146200019c578063bba48a9014620001d25762000092565b80630c5bc6a9146200009657806310195f9514620000cc578063174ef86a14620001025780632cf08fd11462000122575b5f80fd5b620000b46004803603810190620000ae919062000897565b620001f4565b604051620000c39190620008ed565b60405180910390f35b620000ea6004803603810190620000e4919062000b37565b6200023d565b604051620000f99190620008ed565b60405180910390f35b6200012060048036038101906200011a919062000c0d565b620005ac565b005b6200014060048036038101906200013a919062000c3d565b6200067f565b6040516200014f9190620008ed565b60405180910390f35b62000162620006c7565b60405162000171919062000c9d565b60405180910390f35b62000184620006cd565b604051620001939190620008ed565b60405180910390f35b620001ba6004803603810190620001b4919062000c0d565b620006f0565b604051620001c9919062000d7f565b60405180910390f35b620001dc620007ba565b604051620001eb9190620008ed565b60405180910390f35b6004602052815f5260405f2081815481106200020e575f80fd5b905f5260205f20015f915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8073ffffffffffffffffffffffffffffffffffffffff1660038860405162000267919062000e15565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620002ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e59062000e8b565b60405180910390fd5b5f3360045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506040516020016200034492919062000f1c565b6040516020818303038152906040528051906020012090505f8160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200038e90620007df565b6200039a9190620008ed565b8190604051809103905ff5905080158015620003b8573d5f803e3d5ffd5b5090505f8190508073ffffffffffffffffffffffffffffffffffffffff1663d63da95c338c8c8c8c8c8c6040518863ffffffff1660e01b815260040162000406979695949392919062000f8b565b5f604051808303815f87803b1580156200041e575f80fd5b505af115801562000431573d5f803e3d5ffd5b505050508060038b60405162000448919062000e15565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001805f82825462000541919062001041565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f86c9dd70a6de5b89643ead0c76a7d9c215afd05c87f64d8eaff050b89c341bb3828c8c60405162000594939291906200107b565b60405180910390a28093505050509695505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200063c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000633906200110b565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6003818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015620007ae57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000764575b50505050509050919050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610374806200112c83390190565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200082982620007fe565b9050919050565b6200083b816200081d565b811462000846575f80fd5b50565b5f81359050620008598162000830565b92915050565b5f819050919050565b62000873816200085f565b81146200087e575f80fd5b50565b5f81359050620008918162000868565b92915050565b5f8060408385031215620008b057620008af620007f6565b5b5f620008bf8582860162000849565b9250506020620008d28582860162000881565b9150509250929050565b620008e7816200081d565b82525050565b5f602082019050620009025f830184620008dc565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620009588262000910565b810181811067ffffffffffffffff821117156200097a576200097962000920565b5b80604052505050565b5f6200098e620007ed565b90506200099c82826200094d565b919050565b5f67ffffffffffffffff821115620009be57620009bd62000920565b5b620009c98262000910565b9050602081019050919050565b828183375f83830152505050565b5f620009fa620009f484620009a1565b62000983565b90508281526020810184848401111562000a195762000a186200090c565b5b62000a26848285620009d6565b509392505050565b5f82601f83011262000a455762000a4462000908565b5b813562000a57848260208601620009e4565b91505092915050565b5f67ffffffffffffffff82111562000a7d5762000a7c62000920565b5b602082029050602081019050919050565b5f80fd5b5f62000aa862000aa28462000a60565b62000983565b9050808382526020820190506020840283018581111562000ace5762000acd62000a8e565b5b835b8181101562000afb578062000ae6888262000849565b84526020840193505060208101905062000ad0565b5050509392505050565b5f82601f83011262000b1c5762000b1b62000908565b5b813562000b2e84826020860162000a92565b91505092915050565b5f805f805f8060c0878903121562000b545762000b53620007f6565b5b5f87013567ffffffffffffffff81111562000b745762000b73620007fa565b5b62000b8289828a0162000a2e565b965050602062000b9589828a0162000849565b955050604087013567ffffffffffffffff81111562000bb95762000bb8620007fa565b5b62000bc789828a0162000b05565b945050606062000bda89828a0162000881565b935050608062000bed89828a0162000881565b92505060a062000c0089828a0162000881565b9150509295509295509295565b5f6020828403121562000c255762000c24620007f6565b5b5f62000c348482850162000849565b91505092915050565b5f6020828403121562000c555762000c54620007f6565b5b5f82013567ffffffffffffffff81111562000c755762000c74620007fa565b5b62000c838482850162000a2e565b91505092915050565b62000c97816200085f565b82525050565b5f60208201905062000cb25f83018462000c8c565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b62000cec816200081d565b82525050565b5f62000cff838362000ce1565b60208301905092915050565b5f602082019050919050565b5f62000d238262000cb8565b62000d2f818562000cc2565b935062000d3c8362000cd2565b805f5b8381101562000d7257815162000d56888262000cf2565b975062000d638362000d0b565b92505060018101905062000d3f565b5085935050505092915050565b5f6020820190508181035f83015262000d99818462000d17565b905092915050565b5f81519050919050565b5f81905092915050565b5f5b8381101562000dd457808201518184015260208101905062000db7565b5f8484015250505050565b5f62000deb8262000da1565b62000df7818562000dab565b935062000e0981856020860162000db5565b80840191505092915050565b5f62000e22828462000ddf565b915081905092915050565b5f82825260208201905092915050565b7f5661756c74206e616d6520616c726561647920657869737473000000000000005f82015250565b5f62000e7360198362000e2d565b915062000e808262000e3d565b602082019050919050565b5f6020820190508181035f83015262000ea48162000e65565b9050919050565b5f8160601b9050919050565b5f62000ec38262000eab565b9050919050565b5f62000ed68262000eb7565b9050919050565b62000ef262000eec826200081d565b62000eca565b82525050565b5f819050919050565b62000f1662000f10826200085f565b62000ef8565b82525050565b5f62000f29828562000edd565b60148201915062000f3b828462000f01565b6020820191508190509392505050565b5f62000f578262000da1565b62000f63818562000e2d565b935062000f7581856020860162000db5565b62000f808162000910565b840191505092915050565b5f60e08201905062000fa05f83018a620008dc565b818103602083015262000fb4818962000f4b565b905062000fc56040830188620008dc565b818103606083015262000fd9818762000d17565b905062000fea608083018662000c8c565b62000ff960a083018562000c8c565b6200100860c083018462000c8c565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200104d826200085f565b91506200105a836200085f565b925082820190508082111562001075576200107462001014565b5b92915050565b5f606082019050620010905f830186620008dc565b8181036020830152620010a4818562000f4b565b9050620010b56040830184620008dc565b949350505050565b7f4e6f7420746865206f776e6572000000000000000000000000000000000000005f82015250565b5f620010f3600d8362000e2d565b91506200110082620010bd565b602082019050919050565b5f6020820190508181035f8301526200112481620010e5565b905091905056fe60a060405234801561000f575f80fd5b5060405161037438038061037483398181016040528101906100319190610137565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361009f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610096906101bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506101da565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610106826100dd565b9050919050565b610116816100fc565b8114610120575f80fd5b50565b5f815190506101318161010d565b92915050565b5f6020828403121561014c5761014b6100d9565b5b5f61015984828501610123565b91505092915050565b5f82825260208201905092915050565b7f496e76616c696420696d706c656d656e746174696f6e206164647265737300005f82015250565b5f6101a6601e83610162565b91506101b182610172565b602082019050919050565b5f6020820190508181035f8301526101d38161019a565b9050919050565b6080516101776101fd5f395f8181602b015281816056015260c701526101775ff3fe608060405260043610610021575f3560e01c80635c60da1b1461007c57610051565b366100515761004f7f00000000000000000000000000000000000000000000000000000000000000006100a6565b005b61007a7f00000000000000000000000000000000000000000000000000000000000000006100a6565b005b348015610087575f80fd5b506100906100c5565b60405161009d9190610128565b60405180910390f35b365f80375f80365f845af43d5f803e805f81146100c1573d5ff35b3d5ffd5b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610112826100e9565b9050919050565b61012281610108565b82525050565b5f60208201905061013b5f830184610119565b9291505056fea2646970667358221220a70daec4d752db8e44a8b5585fd220d5a4e8d713f843790b34228271f76f8d4b64736f6c63430008150033a2646970667358221220f0498bb8d60a32f7e1e6c36eea825ff76185fcbd0b86cf43273223e83f4f4ec764736f6c63430008150033000000000000000000000000714aec7a2ed000729890c3959accfbac577633b1

Deployed Bytecode

0x608060405234801562000010575f80fd5b506004361062000092575f3560e01c80638d65402311620000615780638d65402314620001585780638da5cb5b146200017a578063ac818711146200019c578063bba48a9014620001d25762000092565b80630c5bc6a9146200009657806310195f9514620000cc578063174ef86a14620001025780632cf08fd11462000122575b5f80fd5b620000b46004803603810190620000ae919062000897565b620001f4565b604051620000c39190620008ed565b60405180910390f35b620000ea6004803603810190620000e4919062000b37565b6200023d565b604051620000f99190620008ed565b60405180910390f35b6200012060048036038101906200011a919062000c0d565b620005ac565b005b6200014060048036038101906200013a919062000c3d565b6200067f565b6040516200014f9190620008ed565b60405180910390f35b62000162620006c7565b60405162000171919062000c9d565b60405180910390f35b62000184620006cd565b604051620001939190620008ed565b60405180910390f35b620001ba6004803603810190620001b4919062000c0d565b620006f0565b604051620001c9919062000d7f565b60405180910390f35b620001dc620007ba565b604051620001eb9190620008ed565b60405180910390f35b6004602052815f5260405f2081815481106200020e575f80fd5b905f5260205f20015f915091509054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b5f8073ffffffffffffffffffffffffffffffffffffffff1660038860405162000267919062000e15565b90815260200160405180910390205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614620002ee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e59062000e8b565b60405180910390fd5b5f3360045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805490506040516020016200034492919062000f1c565b6040516020818303038152906040528051906020012090505f8160025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff166040516200038e90620007df565b6200039a9190620008ed565b8190604051809103905ff5905080158015620003b8573d5f803e3d5ffd5b5090505f8190508073ffffffffffffffffffffffffffffffffffffffff1663d63da95c338c8c8c8c8c8c6040518863ffffffff1660e01b815260040162000406979695949392919062000f8b565b5f604051808303815f87803b1580156200041e575f80fd5b505af115801562000431573d5f803e3d5ffd5b505050508060038b60405162000448919062000e15565b90815260200160405180910390205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060045f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081908060018154018082558091505060019003905f5260205f20015f9091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001805f82825462000541919062001041565b925050819055503373ffffffffffffffffffffffffffffffffffffffff167f86c9dd70a6de5b89643ead0c76a7d9c215afd05c87f64d8eaff050b89c341bb3828c8c60405162000594939291906200107b565b60405180910390a28093505050509695505050505050565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200063c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000633906200110b565b60405180910390fd5b8060025f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6003818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60015481565b5f8054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b606060045f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20805480602002602001604051908101604052809291908181526020018280548015620007ae57602002820191905f5260205f20905b815f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001906001019080831162000764575b50505050509050919050565b60025f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b610374806200112c83390190565b5f604051905090565b5f80fd5b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6200082982620007fe565b9050919050565b6200083b816200081d565b811462000846575f80fd5b50565b5f81359050620008598162000830565b92915050565b5f819050919050565b62000873816200085f565b81146200087e575f80fd5b50565b5f81359050620008918162000868565b92915050565b5f8060408385031215620008b057620008af620007f6565b5b5f620008bf8582860162000849565b9250506020620008d28582860162000881565b9150509250929050565b620008e7816200081d565b82525050565b5f602082019050620009025f830184620008dc565b92915050565b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620009588262000910565b810181811067ffffffffffffffff821117156200097a576200097962000920565b5b80604052505050565b5f6200098e620007ed565b90506200099c82826200094d565b919050565b5f67ffffffffffffffff821115620009be57620009bd62000920565b5b620009c98262000910565b9050602081019050919050565b828183375f83830152505050565b5f620009fa620009f484620009a1565b62000983565b90508281526020810184848401111562000a195762000a186200090c565b5b62000a26848285620009d6565b509392505050565b5f82601f83011262000a455762000a4462000908565b5b813562000a57848260208601620009e4565b91505092915050565b5f67ffffffffffffffff82111562000a7d5762000a7c62000920565b5b602082029050602081019050919050565b5f80fd5b5f62000aa862000aa28462000a60565b62000983565b9050808382526020820190506020840283018581111562000ace5762000acd62000a8e565b5b835b8181101562000afb578062000ae6888262000849565b84526020840193505060208101905062000ad0565b5050509392505050565b5f82601f83011262000b1c5762000b1b62000908565b5b813562000b2e84826020860162000a92565b91505092915050565b5f805f805f8060c0878903121562000b545762000b53620007f6565b5b5f87013567ffffffffffffffff81111562000b745762000b73620007fa565b5b62000b8289828a0162000a2e565b965050602062000b9589828a0162000849565b955050604087013567ffffffffffffffff81111562000bb95762000bb8620007fa565b5b62000bc789828a0162000b05565b945050606062000bda89828a0162000881565b935050608062000bed89828a0162000881565b92505060a062000c0089828a0162000881565b9150509295509295509295565b5f6020828403121562000c255762000c24620007f6565b5b5f62000c348482850162000849565b91505092915050565b5f6020828403121562000c555762000c54620007f6565b5b5f82013567ffffffffffffffff81111562000c755762000c74620007fa565b5b62000c838482850162000a2e565b91505092915050565b62000c97816200085f565b82525050565b5f60208201905062000cb25f83018462000c8c565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f819050602082019050919050565b62000cec816200081d565b82525050565b5f62000cff838362000ce1565b60208301905092915050565b5f602082019050919050565b5f62000d238262000cb8565b62000d2f818562000cc2565b935062000d3c8362000cd2565b805f5b8381101562000d7257815162000d56888262000cf2565b975062000d638362000d0b565b92505060018101905062000d3f565b5085935050505092915050565b5f6020820190508181035f83015262000d99818462000d17565b905092915050565b5f81519050919050565b5f81905092915050565b5f5b8381101562000dd457808201518184015260208101905062000db7565b5f8484015250505050565b5f62000deb8262000da1565b62000df7818562000dab565b935062000e0981856020860162000db5565b80840191505092915050565b5f62000e22828462000ddf565b915081905092915050565b5f82825260208201905092915050565b7f5661756c74206e616d6520616c726561647920657869737473000000000000005f82015250565b5f62000e7360198362000e2d565b915062000e808262000e3d565b602082019050919050565b5f6020820190508181035f83015262000ea48162000e65565b9050919050565b5f8160601b9050919050565b5f62000ec38262000eab565b9050919050565b5f62000ed68262000eb7565b9050919050565b62000ef262000eec826200081d565b62000eca565b82525050565b5f819050919050565b62000f1662000f10826200085f565b62000ef8565b82525050565b5f62000f29828562000edd565b60148201915062000f3b828462000f01565b6020820191508190509392505050565b5f62000f578262000da1565b62000f63818562000e2d565b935062000f7581856020860162000db5565b62000f808162000910565b840191505092915050565b5f60e08201905062000fa05f83018a620008dc565b818103602083015262000fb4818962000f4b565b905062000fc56040830188620008dc565b818103606083015262000fd9818762000d17565b905062000fea608083018662000c8c565b62000ff960a083018562000c8c565b6200100860c083018462000c8c565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6200104d826200085f565b91506200105a836200085f565b925082820190508082111562001075576200107462001014565b5b92915050565b5f606082019050620010905f830186620008dc565b8181036020830152620010a4818562000f4b565b9050620010b56040830184620008dc565b949350505050565b7f4e6f7420746865206f776e6572000000000000000000000000000000000000005f82015250565b5f620010f3600d8362000e2d565b91506200110082620010bd565b602082019050919050565b5f6020820190508181035f8301526200112481620010e5565b905091905056fe60a060405234801561000f575f80fd5b5060405161037438038061037483398181016040528101906100319190610137565b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361009f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610096906101bc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1681525050506101da565b5f80fd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610106826100dd565b9050919050565b610116816100fc565b8114610120575f80fd5b50565b5f815190506101318161010d565b92915050565b5f6020828403121561014c5761014b6100d9565b5b5f61015984828501610123565b91505092915050565b5f82825260208201905092915050565b7f496e76616c696420696d706c656d656e746174696f6e206164647265737300005f82015250565b5f6101a6601e83610162565b91506101b182610172565b602082019050919050565b5f6020820190508181035f8301526101d38161019a565b9050919050565b6080516101776101fd5f395f8181602b015281816056015260c701526101775ff3fe608060405260043610610021575f3560e01c80635c60da1b1461007c57610051565b366100515761004f7f00000000000000000000000000000000000000000000000000000000000000006100a6565b005b61007a7f00000000000000000000000000000000000000000000000000000000000000006100a6565b005b348015610087575f80fd5b506100906100c5565b60405161009d9190610128565b60405180910390f35b365f80375f80365f845af43d5f803e805f81146100c1573d5ff35b3d5ffd5b7f000000000000000000000000000000000000000000000000000000000000000081565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610112826100e9565b9050919050565b61012281610108565b82525050565b5f60208201905061013b5f830184610119565b9291505056fea2646970667358221220a70daec4d752db8e44a8b5585fd220d5a4e8d713f843790b34228271f76f8d4b64736f6c63430008150033a2646970667358221220f0498bb8d60a32f7e1e6c36eea825ff76185fcbd0b86cf43273223e83f4f4ec764736f6c63430008150033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000714aec7a2ed000729890c3959accfbac577633b1

-----Decoded View---------------
Arg [0] : _vaultImplementation (address): 0x714AEc7a2ED000729890C3959acCFbAc577633b1

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000714aec7a2ed000729890c3959accfbac577633b1


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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.