ETH Price: $2,637.37 (-2.18%)

Contract

0xdDfce4367fa5025f36e4c8916Ca618Ccffc61Ad7
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
0x60806040152673322022-08-03 4:29:47820 days ago1659500987IN
 Create: Migration
0 ETH0.00621549.26916523

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

Contract Source Code Verified (Exact Match)

Contract Name:
Migration

Compiler Version
v0.8.8+commit.dddeac2f

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 7 : Migration.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.8.6;

import "@openzeppelin/contracts/token/ERC20/extensions/draft-IERC20Permit.sol";
import "../interfaces/IVaultMetadata.sol";
import "../libs/TransferUtils.sol";

contract Migration {
    using TransferUtils for IERC20;

    function migrate(IVaultMetadata from, IVaultMetadata to) external {
        require(from.asset() == to.asset(), "Vault assets must be the same");

        uint256 shares = from.balanceOf(msg.sender);
        from.redeem(shares, address(this), msg.sender);

        IERC20 asset = IERC20(from.asset());
        uint256 balance = asset.balanceOf(address(this));
        asset.safeApprove(address(to), balance);
        to.deposit(balance, msg.sender);
    }

    function migrateWithPermit(
        IVaultMetadata from,
        IVaultMetadata to,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external {
        require(from.asset() == to.asset(), "Vault assets must be the same");

        uint256 shares = from.balanceOf(msg.sender);
        IERC20Permit(address(from)).permit(msg.sender, address(this), shares, deadline, v, r, s);
        from.redeem(shares, address(this), msg.sender);

        IERC20 asset = IERC20(from.asset());
        uint256 balance = asset.balanceOf(address(this));
        asset.safeApprove(address(to), balance);
        to.deposit(balance, msg.sender);
    }
}

File 2 of 7 : draft-IERC20Permit.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/draft-IERC20Permit.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 Permit extension allowing approvals to be made via signatures, as defined in
 * https://eips.ethereum.org/EIPS/eip-2612[EIP-2612].
 *
 * Adds the {permit} method, which can be used to change an account's ERC20 allowance (see {IERC20-allowance}) by
 * presenting a message signed by the account. By not relying on {IERC20-approve}, the token holder account doesn't
 * need to send a transaction, and thus is not required to hold Ether at all.
 */
interface IERC20Permit {
    /**
     * @dev Sets `value` as the allowance of `spender` over ``owner``'s tokens,
     * given ``owner``'s signed approval.
     *
     * IMPORTANT: The same issues {IERC20-approve} has related to transaction
     * ordering also apply here.
     *
     * Emits an {Approval} event.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     * - `deadline` must be a timestamp in the future.
     * - `v`, `r` and `s` must be a valid `secp256k1` signature from `owner`
     * over the EIP712-formatted function arguments.
     * - the signature must use ``owner``'s current nonce (see {nonces}).
     *
     * For more information on the signature format, see the
     * https://eips.ethereum.org/EIPS/eip-2612#specification[relevant EIP
     * section].
     */
    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external;

    /**
     * @dev Returns the current nonce for `owner`. This value must be
     * included whenever a signature is generated for {permit}.
     *
     * Every successful call to {permit} increases ``owner``'s nonce by one. This
     * prevents a signature from being used multiple times.
     */
    function nonces(address owner) external view returns (uint256);

    /**
     * @dev Returns the domain separator used in the encoding of the signature for {permit}, as defined by {EIP712}.
     */
    // solhint-disable-next-line func-name-mixedcase
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

File 3 of 7 : IVaultMetadata.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.8.6;

import "./IVault.sol";

interface IVaultMetadata is IVault {
    function asset() external view returns (address);
}

File 4 of 7 : TransferUtils.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.8.6;

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

library TransferUtils {
    error TransferUtils__TransferDidNotSucceed();
    error TransferUtils__ApproveDidNotSucceed();

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function safeApprove(
        IERC20 token,
        address spender,
        uint256 amount
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, amount));
    }

    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory result) = address(token).call(data);
        if (!success || result.length > 0) {
            // Return data is optional
            bool transferSucceeded = abi.decode(result, (bool));
            if (!transferSucceeded) revert TransferUtils__TransferDidNotSucceed();
        }
    }
}

File 5 of 7 : IVault.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.8.6;

import "./IERC4626.sol";

interface IVault is IERC4626 {
    error IVault__CallerIsNotTheController();
    error IVault__NotProcessingDeposits();
    error IVault__AlreadyProcessingDeposits();
    error IVault__ForbiddenWhileProcessingDeposits();
    error IVault__ZeroAssets();
    error IVault__ZeroShares();

    event FeeCollected(uint256 fee);
    event StartRound(uint256 indexed roundId, uint256 amountAddedToStrategy);
    event EndRound(uint256 indexed roundId);
    event DepositProcessed(address indexed owner, uint256 indexed roundId, uint256 assets, uint256 shares);

    /**
     * @notice Returns the fee charged on withdraws.
     */
    function withdrawFeeRatio() external view returns (uint256);

    /**
     * @notice Returns the vault controller
     */
    function controller() external view returns (address);

    /**
     * @notice Outputs the amount of asset tokens of an `owner` is idle, waiting for the next round.
     */
    function idleAssetsOf(address owner) external view returns (uint256);

    /**
     * @notice Outputs the amount of asset tokens of an `owner` are either waiting for the next round,
     * deposited or committed.
     */
    function assetsOf(address owner) external view returns (uint256);

    /**
     * @notice Outputs the amount of asset tokens is idle, waiting for the next round.
     */
    function totalIdleAssets() external view returns (uint256);

    /**
     * @notice Outputs current size of the deposit queue.
     */
    function depositQueueSize() external view returns (uint256);

    /**
     * @notice Starts the next round, sending the idle funds to the
     * strategy where it should start accruing yield.
     */
    function startRound() external;

    /**
     * @notice Closes the round, allowing deposits to the next round be processed.
     * and opens the window for withdraws.
     */
    function endRound() external;

    /**
     * @notice Mint shares for deposits accumulated, effectively including their owners in the next round.
     * `processQueuedDeposits` extracts up to but not including endIndex. For example, processQueuedDeposits(1,4)
     * extracts the second element through the fourth element (elements indexed 1, 2, and 3).
     *
     * @param startIndex Zero-based index at which to start processing deposits
     * @param endIndex The index of the first element to exclude from queue
     */
    function processQueuedDeposits(uint256 startIndex, uint256 endIndex) external;
}

File 6 of 7 : IERC4626.sol
// SPDX-License-Identifier: AGPL-3.0-or-later

pragma solidity >=0.8.6;

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

interface IERC4626 is IERC20 {
    event Deposit(address indexed caller, address indexed owner, uint256 assets, uint256 shares);

    event Withdraw(
        address indexed caller,
        address indexed receiver,
        address indexed owner,
        uint256 assets,
        uint256 shares
    );

    /**
     * @notice Total amount of the underlying asset that is “managed” by Vault.
     */
    function totalAssets() external view returns (uint256);

    /**
     * @notice Mints `shares` Vault shares to `receiver` by depositing exactly `amount` of underlying tokens.
     * @return shares Shares minted.
     */
    function deposit(uint256 assets, address receiver) external returns (uint256 shares);

    /**
     * @notice Mints exactly `shares` Vault shares to `receiver` by depositing amount of underlying tokens.
     * @return assets Assets deposited.
     */
    function mint(uint256 shares, address receiver) external returns (uint256 assets);

    /**
     * @notice Burns exactly `shares` from `owner` and sends `assets` of underlying tokens to `receiver`.
     * @return assets Assets withdrawn.
     */
    function redeem(
        uint256 shares,
        address receiver,
        address owner
    ) external returns (uint256 assets);

    /**
     * @notice Burns `shares` from `owner` and sends exactly `assets` of underlying tokens to `receiver`.
     * @return shares Shares burned.
     */
    function withdraw(
        uint256 assets,
        address receiver,
        address owner
    ) external returns (uint256 shares);

    /**
     * @notice Outputs the amount of shares that would be generated by depositing `assets`.
     */
    function previewDeposit(uint256 assets) external view returns (uint256 shares);

    /**
     * @notice Outputs the amount of asset tokens would be necessary to generate the amount of `shares`.
     */
    function previewMint(uint256 shares) external view returns (uint256 amount);

    /**
     * @notice Outputs the amount of shares would be burned to withdraw the `assets` amount.
     */
    function previewWithdraw(uint256 assets) external view returns (uint256 shares);

    /**
     * @notice Outputs the amount of asset tokens would be withdrawn burning a given amount of shares.
     */
    function previewRedeem(uint256 shares) external view returns (uint256 amount);

    /**
     * @notice The amount of shares that the Vault would exchange for
     * the amount of assets provided, in an ideal scenario where all the conditions are met.
     */
    function convertToShares(uint256 assets) external view returns (uint256);

    /**
     * @notice The amount of assets that the Vault would exchange for
     * the amount of shares provided, in an ideal scenario where all the conditions are met.
     */
    function convertToAssets(uint256 shares) external view returns (uint256);

    /**
     * @notice Maximum amount of the underlying asset that can be deposited into
     * the Vault for the `receiver`, through a `deposit` call.
     */
    function maxDeposit(address owner) external view returns (uint256);

    /**
     * @notice Maximum amount of shares that can be minted from the Vault for
     * the `receiver`, through a `mint` call.
     */
    function maxMint(address receiver) external view returns (uint256 maxShares);

    /**
     * @notice Maximum amount of the underlying asset that can be withdrawn from
     * the `owner` balance in the Vault, through a `withdraw` call.
     */
    function maxWithdraw(address owner) external view returns (uint256 maxAssets);

    /**
     * @notice Maximum amount of Vault shares that can be redeemed from
     * the `owner` balance in the Vault, through a `redeem` call.
     */
    function maxRedeem(address owner) external view returns (uint256 maxShares);
}

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @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);

    /**
     * @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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[],"name":"TransferUtils__TransferDidNotSucceed","type":"error"},{"inputs":[{"internalType":"contract IVaultMetadata","name":"from","type":"address"},{"internalType":"contract IVaultMetadata","name":"to","type":"address"}],"name":"migrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IVaultMetadata","name":"from","type":"address"},{"internalType":"contract IVaultMetadata","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"migrateWithPermit","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405234801561001057600080fd5b50610b2c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c80631068361f1461003b578063fb3ceb5d14610050575b600080fd5b61004e6100493660046109b8565b610063565b005b61004e61005e3660046109f1565b61043b565b806001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561009c57600080fd5b505afa1580156100b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d49190610a5c565b6001600160a01b0316826001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561011657600080fd5b505afa15801561012a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061014e9190610a5c565b6001600160a01b0316146101a95760405162461bcd60e51b815260206004820152601d60248201527f5661756c7420617373657473206d757374206265207468652073616d6500000060448201526064015b60405180910390fd5b6040516370a0823160e01b81523360048201526000906001600160a01b038416906370a082319060240160206040518083038186803b1580156101eb57600080fd5b505afa1580156101ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102239190610a80565b604051635d043b2960e11b8152600481018290523060248201523360448201529091506001600160a01b0384169063ba08765290606401602060405180830381600087803b15801561027457600080fd5b505af1158015610288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ac9190610a80565b506000836001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156102e857600080fd5b505afa1580156102fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103209190610a5c565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561036557600080fd5b505afa158015610379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039d9190610a80565b90506103b36001600160a01b0383168583610896565b604051636e553f6560e01b8152600481018290523360248201526001600160a01b03851690636e553f6590604401602060405180830381600087803b1580156103fb57600080fd5b505af115801561040f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104339190610a80565b505050505050565b846001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ac9190610a5c565b6001600160a01b0316866001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ee57600080fd5b505afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105269190610a5c565b6001600160a01b03161461057c5760405162461bcd60e51b815260206004820152601d60248201527f5661756c7420617373657473206d757374206265207468652073616d6500000060448201526064016101a0565b6040516370a0823160e01b81523360048201526000906001600160a01b038816906370a082319060240160206040518083038186803b1580156105be57600080fd5b505afa1580156105d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f69190610a80565b60405163d505accf60e01b8152336004820152306024820152604481018290526064810187905260ff8616608482015260a4810185905260c481018490529091506001600160a01b0388169063d505accf9060e401600060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b5050604051635d043b2960e11b8152600481018490523060248201523360448201526001600160a01b038a16925063ba0876529150606401602060405180830381600087803b1580156106cb57600080fd5b505af11580156106df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107039190610a80565b506000876001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561073f57600080fd5b505afa158015610753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107779190610a5c565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b1580156107bc57600080fd5b505afa1580156107d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f49190610a80565b905061080a6001600160a01b0383168983610896565b604051636e553f6560e01b8152600481018290523360248201526001600160a01b03891690636e553f6590604401602060405180830381600087803b15801561085257600080fd5b505af1158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a9190610a80565b50505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526108e89084906108ed565b505050565b600080836001600160a01b0316836040516109089190610a99565b6000604051808303816000865af19150503d8060008114610945576040519150601f19603f3d011682016040523d82523d6000602084013e61094a565b606091505b509150915081158061095d575060008151115b1561099a576000818060200190518101906109789190610ad4565b9050806109985760405163550bbe1960e11b815260040160405180910390fd5b505b50505050565b6001600160a01b03811681146109b557600080fd5b50565b600080604083850312156109cb57600080fd5b82356109d6816109a0565b915060208301356109e6816109a0565b809150509250929050565b60008060008060008060c08789031215610a0a57600080fd5b8635610a15816109a0565b95506020870135610a25816109a0565b945060408701359350606087013560ff81168114610a4257600080fd5b9598949750929560808101359460a0909101359350915050565b600060208284031215610a6e57600080fd5b8151610a79816109a0565b9392505050565b600060208284031215610a9257600080fd5b5051919050565b6000825160005b81811015610aba5760208186018101518583015201610aa0565b81811115610ac9576000828501525b509190910192915050565b600060208284031215610ae657600080fd5b81518015158114610a7957600080fdfea2646970667358221220348646230c9e0518dfdf9f3f0703035980da1c604765c10ea021b2fd4d95592c64736f6c63430008080033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106100365760003560e01c80631068361f1461003b578063fb3ceb5d14610050575b600080fd5b61004e6100493660046109b8565b610063565b005b61004e61005e3660046109f1565b61043b565b806001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561009c57600080fd5b505afa1580156100b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906100d49190610a5c565b6001600160a01b0316826001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561011657600080fd5b505afa15801561012a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061014e9190610a5c565b6001600160a01b0316146101a95760405162461bcd60e51b815260206004820152601d60248201527f5661756c7420617373657473206d757374206265207468652073616d6500000060448201526064015b60405180910390fd5b6040516370a0823160e01b81523360048201526000906001600160a01b038416906370a082319060240160206040518083038186803b1580156101eb57600080fd5b505afa1580156101ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102239190610a80565b604051635d043b2960e11b8152600481018290523060248201523360448201529091506001600160a01b0384169063ba08765290606401602060405180830381600087803b15801561027457600080fd5b505af1158015610288573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906102ac9190610a80565b506000836001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156102e857600080fd5b505afa1580156102fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906103209190610a5c565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b15801561036557600080fd5b505afa158015610379573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061039d9190610a80565b90506103b36001600160a01b0383168583610896565b604051636e553f6560e01b8152600481018290523360248201526001600160a01b03851690636e553f6590604401602060405180830381600087803b1580156103fb57600080fd5b505af115801561040f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104339190610a80565b505050505050565b846001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561047457600080fd5b505afa158015610488573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104ac9190610a5c565b6001600160a01b0316866001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b1580156104ee57600080fd5b505afa158015610502573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105269190610a5c565b6001600160a01b03161461057c5760405162461bcd60e51b815260206004820152601d60248201527f5661756c7420617373657473206d757374206265207468652073616d6500000060448201526064016101a0565b6040516370a0823160e01b81523360048201526000906001600160a01b038816906370a082319060240160206040518083038186803b1580156105be57600080fd5b505afa1580156105d2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105f69190610a80565b60405163d505accf60e01b8152336004820152306024820152604481018290526064810187905260ff8616608482015260a4810185905260c481018490529091506001600160a01b0388169063d505accf9060e401600060405180830381600087803b15801561066557600080fd5b505af1158015610679573d6000803e3d6000fd5b5050604051635d043b2960e11b8152600481018490523060248201523360448201526001600160a01b038a16925063ba0876529150606401602060405180830381600087803b1580156106cb57600080fd5b505af11580156106df573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107039190610a80565b506000876001600160a01b03166338d52e0f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561073f57600080fd5b505afa158015610753573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107779190610a5c565b6040516370a0823160e01b81523060048201529091506000906001600160a01b038316906370a082319060240160206040518083038186803b1580156107bc57600080fd5b505afa1580156107d0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107f49190610a80565b905061080a6001600160a01b0383168983610896565b604051636e553f6560e01b8152600481018290523360248201526001600160a01b03891690636e553f6590604401602060405180830381600087803b15801561085257600080fd5b505af1158015610866573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061088a9190610a80565b50505050505050505050565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b1790526108e89084906108ed565b505050565b600080836001600160a01b0316836040516109089190610a99565b6000604051808303816000865af19150503d8060008114610945576040519150601f19603f3d011682016040523d82523d6000602084013e61094a565b606091505b509150915081158061095d575060008151115b1561099a576000818060200190518101906109789190610ad4565b9050806109985760405163550bbe1960e11b815260040160405180910390fd5b505b50505050565b6001600160a01b03811681146109b557600080fd5b50565b600080604083850312156109cb57600080fd5b82356109d6816109a0565b915060208301356109e6816109a0565b809150509250929050565b60008060008060008060c08789031215610a0a57600080fd5b8635610a15816109a0565b95506020870135610a25816109a0565b945060408701359350606087013560ff81168114610a4257600080fd5b9598949750929560808101359460a0909101359350915050565b600060208284031215610a6e57600080fd5b8151610a79816109a0565b9392505050565b600060208284031215610a9257600080fd5b5051919050565b6000825160005b81811015610aba5760208186018101518583015201610aa0565b81811115610ac9576000828501525b509190910192915050565b600060208284031215610ae657600080fd5b81518015158114610a7957600080fdfea2646970667358221220348646230c9e0518dfdf9f3f0703035980da1c604765c10ea021b2fd4d95592c64736f6c63430008080033

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
[ 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.