ETH Price: $4,516.58 (+1.50%)

Contract

0xc8D22B1adD3D176600E9952e7876e9249254cAAF

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

Multichain Info

N/A
Transaction Hash
Method
Block
From
To

There are no matching entries

2 Internal Transactions found.

Latest 2 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
130966292025-10-07 12:17:2034 hrs ago1759839440
0xc8D22B1a...49254cAAF
 Contract Creation0 ETH
130966292025-10-07 12:17:2034 hrs ago1759839440  Contract Creation0 ETH

Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
MorphoVaultV1AdapterFactory

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 100000 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity 0.8.28;

import {MorphoVaultV1Adapter} from "./MorphoVaultV1Adapter.sol";
import {IMorphoVaultV1AdapterFactory} from "./interfaces/IMorphoVaultV1AdapterFactory.sol";

contract MorphoVaultV1AdapterFactory is IMorphoVaultV1AdapterFactory {
    /* STORAGE */

    mapping(address parentVault => mapping(address morphoVaultV1 => address)) public morphoVaultV1Adapter;
    mapping(address account => bool) public isMorphoVaultV1Adapter;

    /* FUNCTIONS */

    /// @dev Returns the address of the deployed MorphoVaultV1Adapter.
    function createMorphoVaultV1Adapter(address parentVault, address morphoVaultV1) external returns (address) {
        address _morphoVaultV1Adapter = address(new MorphoVaultV1Adapter{salt: bytes32(0)}(parentVault, morphoVaultV1));
        morphoVaultV1Adapter[parentVault][morphoVaultV1] = _morphoVaultV1Adapter;
        isMorphoVaultV1Adapter[_morphoVaultV1Adapter] = true;
        emit CreateMorphoVaultV1Adapter(parentVault, morphoVaultV1, _morphoVaultV1Adapter);
        return _morphoVaultV1Adapter;
    }
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity 0.8.28;

import {IVaultV2} from "../interfaces/IVaultV2.sol";
import {IERC4626} from "../interfaces/IERC4626.sol";
import {IERC20} from "../interfaces/IERC20.sol";
import {IMorphoVaultV1Adapter} from "./interfaces/IMorphoVaultV1Adapter.sol";
import {SafeERC20Lib} from "../libraries/SafeERC20Lib.sol";

/// @dev Designed, developed and audited for Morpho Vaults v1 (v1.0 and v1.1) (also known as MetaMorpho). Integration
/// with other vaults must be carefully assessed from a security standpoint.
/// @dev This adapter must be used with Morpho Vaults v1 that are protected against inflation attacks with an initial
/// deposit. See https://docs.openzeppelin.com/contracts/5.x/erc4626#inflation-attack.
/// @dev Must not be used with a Morpho Vault v1 which has a market with an Irm that can re-enter the parent vault or
/// the adapter.
/// @dev Morpho Vaults v1.1 do not realize bad debt, so Morpho Vaults v2 supplying in them will not realize the
/// corresponding bad debt.
/// @dev Losses that correspond to rounding errors are realizable.
/// @dev Shares of the Morpho Vault v1 cannot be skimmed (unlike any other token).
/// @dev If expectedSupplyAssets reverts for a market of the morphoVaultV1, realAssets will revert and the vault will
/// not be able to accrueInterest.
/// @dev Shouldn't be used alongside another adapter that re-uses the id (abi.encode("this", address(this)).
contract MorphoVaultV1Adapter is IMorphoVaultV1Adapter {
    /* IMMUTABLES */

    address public immutable factory;
    address public immutable parentVault;
    address public immutable morphoVaultV1;
    bytes32 public immutable adapterId;

    /* STORAGE */

    address public skimRecipient;

    /* FUNCTIONS */

    constructor(address _parentVault, address _morphoVaultV1) {
        factory = msg.sender;
        parentVault = _parentVault;
        morphoVaultV1 = _morphoVaultV1;
        adapterId = keccak256(abi.encode("this", address(this)));
        address asset = IVaultV2(_parentVault).asset();
        require(asset == IERC4626(_morphoVaultV1).asset(), AssetMismatch());
        SafeERC20Lib.safeApprove(asset, _parentVault, type(uint256).max);
        SafeERC20Lib.safeApprove(asset, _morphoVaultV1, type(uint256).max);
    }

    function setSkimRecipient(address newSkimRecipient) external {
        require(msg.sender == IVaultV2(parentVault).owner(), NotAuthorized());
        skimRecipient = newSkimRecipient;
        emit SetSkimRecipient(newSkimRecipient);
    }

    /// @dev Skims the adapter's balance of `token` and sends it to `skimRecipient`.
    /// @dev This is useful to handle rewards that the adapter has earned.
    function skim(address token) external {
        require(msg.sender == skimRecipient, NotAuthorized());
        require(token != morphoVaultV1, CannotSkimMorphoVaultV1Shares());
        uint256 balance = IERC20(token).balanceOf(address(this));
        SafeERC20Lib.safeTransfer(token, skimRecipient, balance);
        emit Skim(token, balance);
    }

    /// @dev Does not log anything because the ids (logged in the parent vault) are enough.
    /// @dev Returns the ids of the allocation and the change in allocation.
    function allocate(bytes memory data, uint256 assets, bytes4, address) external returns (bytes32[] memory, int256) {
        require(data.length == 0, InvalidData());
        require(msg.sender == parentVault, NotAuthorized());

        if (assets > 0) IERC4626(morphoVaultV1).deposit(assets, address(this));
        uint256 oldAllocation = allocation();
        uint256 newAllocation = IERC4626(morphoVaultV1).previewRedeem(IERC4626(morphoVaultV1).balanceOf(address(this)));

        // Safe casts because Market v1 bounds the total supply of the underlying token, and allocation is less than the
        // max total assets of the vault.
        return (ids(), int256(newAllocation) - int256(oldAllocation));
    }

    /// @dev Does not log anything because the ids (logged in the parent vault) are enough.
    /// @dev Returns the ids of the deallocation and the change in allocation.
    function deallocate(bytes memory data, uint256 assets, bytes4, address)
        external
        returns (bytes32[] memory, int256)
    {
        require(data.length == 0, InvalidData());
        require(msg.sender == parentVault, NotAuthorized());

        if (assets > 0) IERC4626(morphoVaultV1).withdraw(assets, address(this), address(this));
        uint256 oldAllocation = allocation();
        uint256 newAllocation = IERC4626(morphoVaultV1).previewRedeem(IERC4626(morphoVaultV1).balanceOf(address(this)));

        // Safe casts because Market v1 bounds the total supply of the underlying token, and allocation is less than the
        // max total assets of the vault.
        return (ids(), int256(newAllocation) - int256(oldAllocation));
    }

    /// @dev Returns adapter's ids.
    function ids() public view returns (bytes32[] memory) {
        bytes32[] memory ids_ = new bytes32[](1);
        ids_[0] = adapterId;
        return ids_;
    }

    function allocation() public view returns (uint256) {
        return IVaultV2(parentVault).allocation(adapterId);
    }

    function realAssets() external view returns (uint256) {
        return allocation() != 0
            ? IERC4626(morphoVaultV1).previewRedeem(IERC4626(morphoVaultV1).balanceOf(address(this)))
            : 0;
    }
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;

interface IMorphoVaultV1AdapterFactory {
    /* EVENTS */

    event CreateMorphoVaultV1Adapter(
        address indexed parentVault, address indexed morphoVaultV1, address indexed morphoVaultV1Adapter
    );

    /* FUNCTIONS */

    function morphoVaultV1Adapter(address parentVault, address morphoVaultV1) external view returns (address);
    function isMorphoVaultV1Adapter(address account) external view returns (bool);
    function createMorphoVaultV1Adapter(address parentVault, address morphoVaultV1)
        external
        returns (address morphoVaultV1Adapter);
}

File 4 of 11 : IVaultV2.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;

import {IERC20} from "./IERC20.sol";
import {IERC4626} from "./IERC4626.sol";
import {IERC2612} from "./IERC2612.sol";

struct Caps {
    uint256 allocation;
    uint128 absoluteCap;
    uint128 relativeCap;
}

interface IVaultV2 is IERC4626, IERC2612 {
    // State variables
    function virtualShares() external view returns (uint256);
    function owner() external view returns (address);
    function curator() external view returns (address);
    function receiveSharesGate() external view returns (address);
    function sendSharesGate() external view returns (address);
    function receiveAssetsGate() external view returns (address);
    function sendAssetsGate() external view returns (address);
    function adapterRegistry() external view returns (address);
    function isSentinel(address account) external view returns (bool);
    function isAllocator(address account) external view returns (bool);
    function firstTotalAssets() external view returns (uint256);
    function _totalAssets() external view returns (uint128);
    function lastUpdate() external view returns (uint64);
    function maxRate() external view returns (uint64);
    function adapters(uint256 index) external view returns (address);
    function adaptersLength() external view returns (uint256);
    function isAdapter(address account) external view returns (bool);
    function allocation(bytes32 id) external view returns (uint256);
    function absoluteCap(bytes32 id) external view returns (uint256);
    function relativeCap(bytes32 id) external view returns (uint256);
    function forceDeallocatePenalty(address adapter) external view returns (uint256);
    function liquidityAdapter() external view returns (address);
    function liquidityData() external view returns (bytes memory);
    function timelock(bytes4 selector) external view returns (uint256);
    function abdicated(bytes4 selector) external view returns (bool);
    function executableAt(bytes memory data) external view returns (uint256);
    function performanceFee() external view returns (uint96);
    function performanceFeeRecipient() external view returns (address);
    function managementFee() external view returns (uint96);
    function managementFeeRecipient() external view returns (address);

    // Gating
    function canSendShares(address account) external view returns (bool);
    function canReceiveShares(address account) external view returns (bool);
    function canSendAssets(address account) external view returns (bool);
    function canReceiveAssets(address account) external view returns (bool);

    // Multicall
    function multicall(bytes[] memory data) external;

    // Owner functions
    function setOwner(address newOwner) external;
    function setCurator(address newCurator) external;
    function setIsSentinel(address account, bool isSentinel) external;
    function setName(string memory newName) external;
    function setSymbol(string memory newSymbol) external;

    // Timelocks for curator functions
    function submit(bytes memory data) external;
    function revoke(bytes memory data) external;

    // Curator functions
    function setIsAllocator(address account, bool newIsAllocator) external;
    function setReceiveSharesGate(address newReceiveSharesGate) external;
    function setSendSharesGate(address newSendSharesGate) external;
    function setReceiveAssetsGate(address newReceiveAssetsGate) external;
    function setSendAssetsGate(address newSendAssetsGate) external;
    function setAdapterRegistry(address newAdapterRegistry) external;
    function addAdapter(address account) external;
    function removeAdapter(address account) external;
    function increaseTimelock(bytes4 selector, uint256 newDuration) external;
    function decreaseTimelock(bytes4 selector, uint256 newDuration) external;
    function abdicate(bytes4 selector) external;
    function setPerformanceFee(uint256 newPerformanceFee) external;
    function setManagementFee(uint256 newManagementFee) external;
    function setPerformanceFeeRecipient(address newPerformanceFeeRecipient) external;
    function setManagementFeeRecipient(address newManagementFeeRecipient) external;
    function increaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external;
    function decreaseAbsoluteCap(bytes memory idData, uint256 newAbsoluteCap) external;
    function increaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external;
    function decreaseRelativeCap(bytes memory idData, uint256 newRelativeCap) external;
    function setMaxRate(uint256 newMaxRate) external;
    function setForceDeallocatePenalty(address adapter, uint256 newForceDeallocatePenalty) external;

    // Allocator functions
    function allocate(address adapter, bytes memory data, uint256 assets) external;
    function deallocate(address adapter, bytes memory data, uint256 assets) external;
    function setLiquidityAdapterAndData(address newLiquidityAdapter, bytes memory newLiquidityData) external;

    // Exchange rate
    function accrueInterest() external;
    function accrueInterestView()
        external
        view
        returns (uint256 newTotalAssets, uint256 performanceFeeShares, uint256 managementFeeShares);

    // Force deallocate
    function forceDeallocate(address adapter, bytes memory data, uint256 assets, address onBehalf)
        external
        returns (uint256 penaltyShares);
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;

import {IERC20} from "./IERC20.sol";

interface IERC4626 is IERC20 {
    function asset() external view returns (address);
    function totalAssets() external view returns (uint256);
    function convertToAssets(uint256 shares) external view returns (uint256 assets);
    function convertToShares(uint256 assets) external view returns (uint256 shares);
    function deposit(uint256 assets, address onBehalf) external returns (uint256 shares);
    function mint(uint256 shares, address onBehalf) external returns (uint256 assets);
    function withdraw(uint256 assets, address onBehalf, address receiver) external returns (uint256 shares);
    function redeem(uint256 shares, address onBehalf, address receiver) external returns (uint256 assets);
    function previewDeposit(uint256 assets) external view returns (uint256 shares);
    function previewMint(uint256 shares) external view returns (uint256 assets);
    function previewWithdraw(uint256 assets) external view returns (uint256 shares);
    function previewRedeem(uint256 shares) external view returns (uint256 assets);
    function maxDeposit(address onBehalf) external view returns (uint256 assets);
    function maxMint(address onBehalf) external view returns (uint256 shares);
    function maxWithdraw(address onBehalf) external view returns (uint256 assets);
    function maxRedeem(address onBehalf) external view returns (uint256 shares);
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;

interface IERC20 {
    function decimals() external view returns (uint8);
    function name() external view returns (string memory);
    function symbol() external view returns (string memory);
    function totalSupply() external view returns (uint256);
    function balanceOf(address account) external view returns (uint256);
    function transfer(address to, uint256 shares) external returns (bool success);
    function transferFrom(address from, address to, uint256 shares) external returns (bool success);
    function approve(address spender, uint256 shares) external returns (bool success);
    function allowance(address owner, address spender) external view returns (uint256);
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >= 0.5.0;

import {IAdapter} from "../../interfaces/IAdapter.sol";

interface IMorphoVaultV1Adapter is IAdapter {
    /* EVENTS */

    event SetSkimRecipient(address indexed newSkimRecipient);
    event Skim(address indexed token, uint256 assets);

    /* ERRORS */

    error AssetMismatch();
    error CannotSkimMorphoVaultV1Shares();
    error InvalidData();
    error NotAuthorized();

    /* FUNCTIONS */

    function factory() external view returns (address);
    function parentVault() external view returns (address);
    function morphoVaultV1() external view returns (address);
    function adapterId() external view returns (bytes32);
    function skimRecipient() external view returns (address);
    function allocation() external view returns (uint256);
    function ids() external view returns (bytes32[] memory);
    function setSkimRecipient(address newSkimRecipient) external;
    function skim(address token) external;
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity ^0.8.0;

import {IERC20} from "../interfaces/IERC20.sol";
import {ErrorsLib} from "./ErrorsLib.sol";

library SafeERC20Lib {
    function safeTransfer(address token, address to, uint256 value) internal {
        require(token.code.length > 0, ErrorsLib.NoCode());

        (bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.transfer, (to, value)));
        require(success, ErrorsLib.TransferReverted());
        require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.TransferReturnedFalse());
    }

    function safeTransferFrom(address token, address from, address to, uint256 value) internal {
        require(token.code.length > 0, ErrorsLib.NoCode());

        (bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.transferFrom, (from, to, value)));
        require(success, ErrorsLib.TransferFromReverted());
        require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.TransferFromReturnedFalse());
    }

    function safeApprove(address token, address spender, uint256 value) internal {
        require(token.code.length > 0, ErrorsLib.NoCode());

        (bool success, bytes memory returndata) = token.call(abi.encodeCall(IERC20.approve, (spender, value)));
        require(success, ErrorsLib.ApproveReverted());
        require(returndata.length == 0 || abi.decode(returndata, (bool)), ErrorsLib.ApproveReturnedFalse());
    }
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;

interface IERC2612 {
    function permit(address owner, address spender, uint256 shares, uint256 deadline, uint8 v, bytes32 r, bytes32 s)
        external;
    function nonces(address owner) external view returns (uint256);
    function DOMAIN_SEPARATOR() external view returns (bytes32);
}

// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity >=0.5.0;

/// @dev See VaultV2 NatSpec comments for more details on adapter's spec.
interface IAdapter {
    /// @dev Returns the market' ids and the change in assets on this market.
    function allocate(bytes memory data, uint256 assets, bytes4 selector, address sender)
        external
        returns (bytes32[] memory ids, int256 change);

    /// @dev Returns the market' ids and the change in assets on this market.
    function deallocate(bytes memory data, uint256 assets, bytes4 selector, address sender)
        external
        returns (bytes32[] memory ids, int256 change);

    /// @dev Returns the current value of the investments of the adapter (in underlying asset).
    function realAssets() external view returns (uint256 assets);
}

File 11 of 11 : ErrorsLib.sol
// SPDX-License-Identifier: GPL-2.0-or-later
// Copyright (c) 2025 Morpho Association
pragma solidity ^0.8.0;

library ErrorsLib {
    error Abdicated();
    error AbsoluteCapExceeded();
    error AbsoluteCapNotDecreasing();
    error AbsoluteCapNotIncreasing();
    error ApproveReturnedFalse();
    error ApproveReverted();
    error CannotReceiveShares();
    error CannotReceiveAssets();
    error CannotSendShares();
    error CannotSendAssets();
    error CapExceeded();
    error CastOverflow();
    error DataAlreadyPending();
    error DataNotTimelocked();
    error FeeInvariantBroken();
    error FeeTooHigh();
    error InvalidSigner();
    error MaxRateTooHigh();
    error NoCode();
    error NotAdapter();
    error NotInAdapterRegistry();
    error PenaltyTooHigh();
    error PermitDeadlineExpired();
    error RelativeCapAboveOne();
    error RelativeCapExceeded();
    error RelativeCapNotDecreasing();
    error RelativeCapNotIncreasing();
    error AutomaticallyTimelocked();
    error TimelockNotDecreasing();
    error TimelockNotExpired();
    error TimelockNotIncreasing();
    error TransferFromReturnedFalse();
    error TransferFromReverted();
    error TransferReturnedFalse();
    error TransferReverted();
    error Unauthorized();
    error ZeroAbsoluteCap();
    error ZeroAddress();
    error ZeroAllocation();
}

Settings
{
  "remappings": [
    "solmate/=lib/bundler3/lib/permit2/lib/solmate/",
    "@openzeppelin/contracts/=lib/metamorpho-1.1/lib/openzeppelin-contracts/contracts/",
    "bundler3/=lib/bundler3/",
    "ds-test/=lib/metamorpho-1.1/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/metamorpho-1.1/lib/erc4626-tests/",
    "forge-gas-snapshot/=lib/bundler3/lib/permit2/lib/forge-gas-snapshot/src/",
    "forge-std/=lib/forge-std/src/",
    "halmos-cheatcodes/=lib/morpho-blue/lib/halmos-cheatcodes/src/",
    "metamorpho-1.1/=lib/metamorpho-1.1/",
    "metamorpho-v1.1/=lib/vault-v2/lib/metamorpho-v1.1/",
    "metamorpho/=lib/vault-v2/lib/metamorpho/",
    "morpho-blue-irm/=lib/morpho-blue-irm/src/",
    "morpho-blue-oracles/=lib/morpho-blue-oracles/src/",
    "morpho-blue/=lib/morpho-blue/",
    "murky/=lib/universal-rewards-distributor/lib/murky/src/",
    "openzeppelin-contracts/=lib/metamorpho-1.1/lib/openzeppelin-contracts/",
    "openzeppelin/=lib/universal-rewards-distributor/lib/openzeppelin-contracts/contracts/",
    "permit2/=lib/bundler3/lib/permit2/",
    "pre-liquidation/=lib/pre-liquidation/src/",
    "public-allocator/=lib/public-allocator/src/",
    "safe-smart-account/=lib/safe-smart-account/",
    "universal-rewards-distributor/=lib/universal-rewards-distributor/src/",
    "vault-v2-adapter-registries/=lib/vault-v2-adapter-registries/src/",
    "vault-v2/=lib/vault-v2/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 100000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": true
}

Contract Security Audit

Contract ABI

API
[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"parentVault","type":"address"},{"indexed":true,"internalType":"address","name":"morphoVaultV1","type":"address"},{"indexed":true,"internalType":"address","name":"morphoVaultV1Adapter","type":"address"}],"name":"CreateMorphoVaultV1Adapter","type":"event"},{"inputs":[{"internalType":"address","name":"parentVault","type":"address"},{"internalType":"address","name":"morphoVaultV1","type":"address"}],"name":"createMorphoVaultV1Adapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isMorphoVaultV1Adapter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"parentVault","type":"address"},{"internalType":"address","name":"morphoVaultV1","type":"address"}],"name":"morphoVaultV1Adapter","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"}]

6080806040523460155761168f908161001a8239f35b5f80fdfe6080806040526004361015610012575f80fd5b5f3560e01c9081632c7756651461026757508063760c79d2146101c65763e9752c691461003d575f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576100746102cb565b61007c6102ee565b604051611371908181019381851067ffffffffffffffff861117610195578173ffffffffffffffffffffffffffffffffffffffff806040935f9661031285391695868852169586602082015203019082f591821561018a5773ffffffffffffffffffffffffffffffffffffffff602093168091835f525f855260405f20815f52855260405f20827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055815f526001855260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051937f2621b71f5d8a3bc363b4162b5e19dcabcba43cfefb95daeda63ba18a54572bc65f80a48152f35b6040513d5f823e3d90fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576101fd6102cb565b73ffffffffffffffffffffffffffffffffffffffff61021a6102ee565b91165f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b346101c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c25760209073ffffffffffffffffffffffffffffffffffffffff6102b66102cb565b165f526001825260ff60405f20541615158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101c257565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101c25756fe61010080604052346101c85760408161137180380380916100208285610219565b8339810103126101c85761003f602061003883610250565b9201610250565b336080528160a0528060c05260405160208101906040825260046060820152637468697360e01b60808201523060408201526080815261008060a082610219565b51902060e0526040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f916101df575b506040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f91610196575b506001600160a01b0390811690821603610187576101026101079382610264565b610264565b60405161101b90816103568239608051816101ad015260a0518181816106ee01528181610a1201528181610b5301528181610c640152610f37015260c05181818161013f01528181610256015281816105a10152818161073a015281816108c40152610bd7015260e05181818161052c01528181610ef60152610fbd0152f35b6341e0808560e11b5f5260045ffd5b90506020813d6020116101cc575b816101b160209383610219565b810103126101c8576101c290610250565b5f6100e1565b5f80fd5b3d91506101a4565b6040513d5f823e3d90fd5b90506020813d602011610211575b816101fa60209383610219565b810103126101c85761020b90610250565b5f6100b3565b3d91506101ed565b601f909101601f19168101906001600160401b0382119082101761023c57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c857565b90813b15610346575f91829182604051602081019263095ea7b360e01b845260018060a01b0316602482015281196044820152604481526102a6606482610219565b51925af13d1561033e573d906001600160401b03821161023c57604051916102d8601f8201601f191660200184610219565b82523d5f602084013e5b1561032f57805190811591821561030c575b5050156102fd57565b631f55ddd960e21b5f5260045ffd5b81925090602091810103126101c8576020015180151581036101c8575f806102f4565b637cceae2560e01b5f5260045ffd5b6060906102e2565b633c11a9c560e21b5f5260045ffdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630fe3653614610c1c575080631eadd77814610b265780632b30997b14610998578063388af5b5146109485780634e45f1ff146106c157806356c075731461054f5780635fb86b01146104f757806388a17bde146104b7578063bc25cf77146101d1578063c45a015514610163578063e4baaddf146100f55763e7657e15146100a0575f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576100ed6100d9610f99565b604051918291602083526020830190610e2b565b0390f35b5f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610208610d30565b73ffffffffffffffffffffffffffffffffffffffff5f541680330361048f5773ffffffffffffffffffffffffffffffffffffffff82169173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016831461046757604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481875afa92831561045c575f93610428575b50813b15610400575f9182918260405160208101927fa9059cbb000000000000000000000000000000000000000000000000000000008452602482015286604482015260448152610312606482610c88565b51925af13d156103f8573d9061032782610cf6565b916103356040519384610c88565b82523d5f602084013e5b156103d05780519081159182156103ad575b5050156103855760207f5e99aaf6d3588fb2497fde044168e8c046704a3223559cfe107f8f94b42cefdd91604051908152a2005b7f2f0470fc000000000000000000000000000000000000000000000000000000005f5260045ffd5b81925090602091810103126100f1576020015180151581036100f1578380610351565b7face2a47e000000000000000000000000000000000000000000000000000000005f5260045ffd5b60609061033f565b7ff046a714000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d602011610454575b8161044460209383610c88565b810103126100f1575191846102c0565b3d9150610437565b6040513d5f823e3d90fd5b7fd60904b7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fea8e4eb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206104ef610ece565b604051908152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610585610ece565b156106b95773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa801561045c575f90610686575b602091506024604051809481937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa801561045c575f90610653575b60209150604051908152f35b506020813d60201161067e575b8161066d60209383610c88565b810103126100f15760209051610647565b3d9150610660565b506020813d6020116106b1575b816106a060209383610c88565b810103126100f15760209051610603565b3d9150610693565b60205f6104ef565b346100f1576106cf36610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f578061086e575b50610723610ece565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481865afa801561045c575f9061083b575b602091506024604051809581937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa91821561045c575f92610805575b506107f5906107ef610f99565b92610e89565b906100ed60405192839283610e5e565b9091506020813d602011610833575b8161082160209383610c88565b810103126100f15751906107f56107e2565b3d9150610814565b506020813d602011610866575b8161085560209383610c88565b810103126100f1576020905161079d565b3d9150610848565b604051907fb460af9400000000000000000000000000000000000000000000000000000000825260048201523060248201523060448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d602011610919575b61090a8183610c88565b810190610e7a565b508061071a565b503d610900565b7f5cb045db000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576109cf610d30565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561045c575f90610ac3575b73ffffffffffffffffffffffffffffffffffffffff915016330361048f5773ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f557f2e7908865670e21b9779422cadf5f1cba271a62bb95c71eaaf615c0a1c48ebee5f80a2005b506020813d602011610b1e575b81610add60209383610c88565b810103126100f1575173ffffffffffffffffffffffffffffffffffffffff811681036100f15773ffffffffffffffffffffffffffffffffffffffff90610a41565b3d9150610ad0565b346100f157610b3436610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f5780610b875750610723610ece565b604051907f6e553f6500000000000000000000000000000000000000000000000000000000825260048201523060248201526020816044815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d6020116109195761090a8183610c88565b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cc957604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff8111610cc957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f157565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100f15760043567ffffffffffffffff81116100f157816023820112156100f157806004013590610da982610cf6565b92610db76040519485610c88565b828452602483830101116100f157815f92602460209301838601378301015290602435906044357fffffffff00000000000000000000000000000000000000000000000000000000811681036100f1579060643573ffffffffffffffffffffffffffffffffffffffff811681036100f15790565b90602080835192838152019201905f5b818110610e485750505090565b8251845260209384019390920191600101610e3b565b929190610e75602091604086526040860190610e2b565b930152565b908160209103126100f1575190565b81810392915f138015828513169184121617610ea157565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6040517fc69507dd0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561045c575f91610f6a575090565b90506020813d602011610f91575b81610f8560209383610c88565b810103126100f1575190565b3d9150610f78565b604051610fa7604082610c88565b60018152602080820190368237815115610fe1577f0000000000000000000000000000000000000000000000000000000000000000905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c634300081c000aa164736f6c634300081c000a

Deployed Bytecode

0x6080806040526004361015610012575f80fd5b5f3560e01c9081632c7756651461026757508063760c79d2146101c65763e9752c691461003d575f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576100746102cb565b61007c6102ee565b604051611371908181019381851067ffffffffffffffff861117610195578173ffffffffffffffffffffffffffffffffffffffff806040935f9661031285391695868852169586602082015203019082f591821561018a5773ffffffffffffffffffffffffffffffffffffffff602093168091835f525f855260405f20815f52855260405f20827fffffffffffffffffffffffff0000000000000000000000000000000000000000825416179055815f526001855260405f2060017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00825416179055604051937f2621b71f5d8a3bc363b4162b5e19dcabcba43cfefb95daeda63ba18a54572bc65f80a48152f35b6040513d5f823e3d90fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f80fd5b346101c25760407ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c2576101fd6102cb565b73ffffffffffffffffffffffffffffffffffffffff61021a6102ee565b91165f525f60205273ffffffffffffffffffffffffffffffffffffffff60405f2091165f52602052602073ffffffffffffffffffffffffffffffffffffffff60405f205416604051908152f35b346101c25760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126101c25760209073ffffffffffffffffffffffffffffffffffffffff6102b66102cb565b165f526001825260ff60405f20541615158152f35b6004359073ffffffffffffffffffffffffffffffffffffffff821682036101c257565b6024359073ffffffffffffffffffffffffffffffffffffffff821682036101c25756fe61010080604052346101c85760408161137180380380916100208285610219565b8339810103126101c85761003f602061003883610250565b9201610250565b336080528160a0528060c05260405160208101906040825260046060820152637468697360e01b60808201523060408201526080815261008060a082610219565b51902060e0526040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f916101df575b506040516338d52e0f60e01b81526020816004816001600160a01b0387165afa9081156101d4575f91610196575b506001600160a01b0390811690821603610187576101026101079382610264565b610264565b60405161101b90816103568239608051816101ad015260a0518181816106ee01528181610a1201528181610b5301528181610c640152610f37015260c05181818161013f01528181610256015281816105a10152818161073a015281816108c40152610bd7015260e05181818161052c01528181610ef60152610fbd0152f35b6341e0808560e11b5f5260045ffd5b90506020813d6020116101cc575b816101b160209383610219565b810103126101c8576101c290610250565b5f6100e1565b5f80fd5b3d91506101a4565b6040513d5f823e3d90fd5b90506020813d602011610211575b816101fa60209383610219565b810103126101c85761020b90610250565b5f6100b3565b3d91506101ed565b601f909101601f19168101906001600160401b0382119082101761023c57604052565b634e487b7160e01b5f52604160045260245ffd5b51906001600160a01b03821682036101c857565b90813b15610346575f91829182604051602081019263095ea7b360e01b845260018060a01b0316602482015281196044820152604481526102a6606482610219565b51925af13d1561033e573d906001600160401b03821161023c57604051916102d8601f8201601f191660200184610219565b82523d5f602084013e5b1561032f57805190811591821561030c575b5050156102fd57565b631f55ddd960e21b5f5260045ffd5b81925090602091810103126101c8576020015180151581036101c8575f806102f4565b637cceae2560e01b5f5260045ffd5b6060906102e2565b633c11a9c560e21b5f5260045ffdfe6080806040526004361015610012575f80fd5b5f3560e01c9081630fe3653614610c1c575080631eadd77814610b265780632b30997b14610998578063388af5b5146109485780634e45f1ff146106c157806356c075731461054f5780635fb86b01146104f757806388a17bde146104b7578063bc25cf77146101d1578063c45a015514610163578063e4baaddf146100f55763e7657e15146100a0575f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576100ed6100d9610f99565b604051918291602083526020830190610e2b565b0390f35b5f80fd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602060405173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610208610d30565b73ffffffffffffffffffffffffffffffffffffffff5f541680330361048f5773ffffffffffffffffffffffffffffffffffffffff82169173ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016831461046757604051917f70a08231000000000000000000000000000000000000000000000000000000008352306004840152602083602481875afa92831561045c575f93610428575b50813b15610400575f9182918260405160208101927fa9059cbb000000000000000000000000000000000000000000000000000000008452602482015286604482015260448152610312606482610c88565b51925af13d156103f8573d9061032782610cf6565b916103356040519384610c88565b82523d5f602084013e5b156103d05780519081159182156103ad575b5050156103855760207f5e99aaf6d3588fb2497fde044168e8c046704a3223559cfe107f8f94b42cefdd91604051908152a2005b7f2f0470fc000000000000000000000000000000000000000000000000000000005f5260045ffd5b81925090602091810103126100f1576020015180151581036100f1578380610351565b7face2a47e000000000000000000000000000000000000000000000000000000005f5260045ffd5b60609061033f565b7ff046a714000000000000000000000000000000000000000000000000000000005f5260045ffd5b9092506020813d602011610454575b8161044460209383610c88565b810103126100f1575191846102c0565b3d9150610437565b6040513d5f823e3d90fd5b7fd60904b7000000000000000000000000000000000000000000000000000000005f5260045ffd5b7fea8e4eb5000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206104ef610ece565b604051908152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760206040517f00000000000000000000000000000000000000000000000000000000000000008152f35b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157610585610ece565b156106b95773ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000166040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481855afa801561045c575f90610686575b602091506024604051809481937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa801561045c575f90610653575b60209150604051908152f35b506020813d60201161067e575b8161066d60209383610c88565b810103126100f15760209051610647565b3d9150610660565b506020813d6020116106b1575b816106a060209383610c88565b810103126100f15760209051610603565b3d9150610693565b60205f6104ef565b346100f1576106cf36610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f578061086e575b50610723610ece565b73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016906040517f70a08231000000000000000000000000000000000000000000000000000000008152306004820152602081602481865afa801561045c575f9061083b575b602091506024604051809581937f4cdad50600000000000000000000000000000000000000000000000000000000835260048301525afa91821561045c575f92610805575b506107f5906107ef610f99565b92610e89565b906100ed60405192839283610e5e565b9091506020813d602011610833575b8161082160209383610c88565b810103126100f15751906107f56107e2565b3d9150610814565b506020813d602011610866575b8161085560209383610c88565b810103126100f1576020905161079d565b3d9150610848565b604051907fb460af9400000000000000000000000000000000000000000000000000000000825260048201523060248201523060448201526020816064815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d602011610919575b61090a8183610c88565b810190610e7a565b508061071a565b503d610900565b7f5cb045db000000000000000000000000000000000000000000000000000000005f5260045ffd5b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f157602073ffffffffffffffffffffffffffffffffffffffff5f5416604051908152f35b346100f15760207ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f1576109cf610d30565b6040517f8da5cb5b00000000000000000000000000000000000000000000000000000000815260208160048173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa801561045c575f90610ac3575b73ffffffffffffffffffffffffffffffffffffffff915016330361048f5773ffffffffffffffffffffffffffffffffffffffff16807fffffffffffffffffffffffff00000000000000000000000000000000000000005f5416175f557f2e7908865670e21b9779422cadf5f1cba271a62bb95c71eaaf615c0a1c48ebee5f80a2005b506020813d602011610b1e575b81610add60209383610c88565b810103126100f1575173ffffffffffffffffffffffffffffffffffffffff811681036100f15773ffffffffffffffffffffffffffffffffffffffff90610a41565b3d9150610ad0565b346100f157610b3436610d53565b505090516109205773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016330361048f5780610b875750610723610ece565b604051907f6e553f6500000000000000000000000000000000000000000000000000000000825260048201523060248201526020816044815f73ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165af1801561045c571561071a576109129060203d6020116109195761090a8183610c88565b346100f1575f7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc3601126100f15760209073ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000168152f35b90601f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0910116810190811067ffffffffffffffff821117610cc957604052565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b67ffffffffffffffff8111610cc957601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b6004359073ffffffffffffffffffffffffffffffffffffffff821682036100f157565b60807ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc8201126100f15760043567ffffffffffffffff81116100f157816023820112156100f157806004013590610da982610cf6565b92610db76040519485610c88565b828452602483830101116100f157815f92602460209301838601378301015290602435906044357fffffffff00000000000000000000000000000000000000000000000000000000811681036100f1579060643573ffffffffffffffffffffffffffffffffffffffff811681036100f15790565b90602080835192838152019201905f5b818110610e485750505090565b8251845260209384019390920191600101610e3b565b929190610e75602091604086526040860190610e2b565b930152565b908160209103126100f1575190565b81810392915f138015828513169184121617610ea157565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6040517fc69507dd0000000000000000000000000000000000000000000000000000000081527f0000000000000000000000000000000000000000000000000000000000000000600482015260208160248173ffffffffffffffffffffffffffffffffffffffff7f0000000000000000000000000000000000000000000000000000000000000000165afa90811561045c575f91610f6a575090565b90506020813d602011610f91575b81610f8560209383610c88565b810103126100f1575190565b3d9150610f78565b604051610fa7604082610c88565b60018152602080820190368237815115610fe1577f0000000000000000000000000000000000000000000000000000000000000000905290565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c634300081c000aa164736f6c634300081c000a

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
0xc8D22B1adD3D176600E9952e7876e9249254cAAF
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.