FRAX Price: $0.82 (-1.46%)

Contract

0x36C7E1295590D70EbE6d81A4f666C092DbA96514

Overview

FRAX Balance | FXTL Balance

0 FRAX | 60 FXTL

FRAX Value

$0.00

Token Holdings

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Block
From
To

There are no matching entries

1 Token Transfer found.

View more zero value Internal Transactions in Advanced View mode

Advanced mode:

Cross-Chain Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
RouterModuleRewardsFetcher

Compiler Version
v0.8.28+commit.7893614a

Optimization Enabled:
Yes with 200 runs

Other Settings:
cancun EvmVersion
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

import {RouterModuleBase} from "src/router/modules/RouterModuleBase.sol";

/// @title RouterModuleRewardsFetcher
/// @notice Single entrypoint to claim rewards from supported reward distributors.
/// @dev This module unifies reward claims across two on-chain conventions:
///      - UniversalRewardsDistributor (URD): Morpho-like merkle distributor with per-account cumulative amounts.
///      - MultiMerkleStash (MMS): per-token merkle distributor with index-based claims.
/// @dev Functions are restricted by `onlyDelegateCall`. They are meant to be invoked
///      via the Router using delegatecall so that transfers and state changes happen
///      in the Router context, enabling composition with other modules in the same transaction.
contract RouterModuleRewardsFetcher is RouterModuleBase {
    string public constant name = type(RouterModuleRewardsFetcher).name;
    string public constant version = "1.0.0";

    /// @notice Thrown when `distributors` and payload arrays length mismatch
    error InvalidParamsLength();
    /// @notice Thrown when a provided distributor type is not supported
    error InvalidDistributorType();

    ///////////////////////////////////////////////////////////////
    // IUniversalRewardsDistributor
    ///////////////////////////////////////////////////////////////

    /// @notice Batched claim payload for a UniversalRewardsDistributor.
    /// @dev Mirrors the URD `claim` function parameters per item.
    struct UniversalRewardsDistributorClaimData {
        /// @notice Address to claim rewards for.
        address account;
        /// @notice Reward token address.
        address reward;
        /// @notice Overall cumulative claimable amount encoded in the merkle tree.
        uint256 claimable;
        /// @notice Merkle proof proving the (account, reward, claimable) leaf.
        bytes32[] proof;
    }

    /// @notice Claim rewards from a UniversalRewardsDistributor.
    /// @param distributor Address of the URD distributor.
    /// @param account Address to claim rewards for.
    /// @param reward Reward token address.
    /// @param claimable Overall cumulative claimable amount proved by the merkle tree.
    /// @param proof Merkle proof for (account, reward, claimable).
    /// @return amount Newly claimed amount (delta since last claim) returned by the URD.
    /// @dev Anyone can claim on behalf of `account`. Reverts bubble from the distributor
    ///      (e.g., invalid proof, root not set, or claimable too low). Tokens are transferred
    ///      by the distributor to its configured recipient logic (may be `account` or another recipient).
    function claim(address distributor, address account, address reward, uint256 claimable, bytes32[] calldata proof)
        external
        onlyDelegateCall
        returns (uint256 amount)
    {
        return IUniversalRewardsDistributor(distributor).claim(account, reward, claimable, proof);
    }

    /// @notice Batch claim rewards across multiple UniversalRewardsDistributor contracts.
    /// @param distributors Array of URD distributor addresses.
    /// @param claimData Array of per-URD claim parameters matching `distributors` order.
    /// @return amounts Array of newly claimed amounts per distributor.
    /// @dev Reverts with `InvalidParamsLength` if array lengths mismatch. Each claim is executed
    ///      independently in a loop; any revert from a distributor will revert the whole call.
    function claims(address[] calldata distributors, UniversalRewardsDistributorClaimData[] calldata claimData)
        external
        onlyDelegateCall
        returns (uint256[] memory amounts)
    {
        if (distributors.length != claimData.length) revert InvalidParamsLength();
        amounts = new uint256[](distributors.length);

        for (uint256 i; i < distributors.length; i++) {
            amounts[i] = IUniversalRewardsDistributor(distributors[i])
                .claim(claimData[i].account, claimData[i].reward, claimData[i].claimable, claimData[i].proof);
        }
    }

    ///////////////////////////////////////////////////////////////
    // IMultiMerkleStash
    ///////////////////////////////////////////////////////////////

    /// @notice Per-claim parameters for a MultiMerkleStash distributor.
    /// @dev Mirrors the MMS `claim` function signature per token.
    struct MultiMerkleStashClaimParams {
        /// @notice Reward token address.
        address token;
        /// @notice Leaf index used by the MMS bitmap for idempotency.
        uint256 index;
        /// @notice Amount to claim for this leaf.
        uint256 amount;
        /// @notice Merkle proof proving (index, account, amount) for `token`.
        bytes32[] merkleProof;
    }

    /// @notice Batched claim payload for a MultiMerkleStash distributor.
    struct MultiMerkleStashClaimData {
        /// @notice Address to claim rewards for.
        address account;
        /// @notice List of per-token claim parameters.
        MultiMerkleStashClaimParams[] claimParams;
    }

    /// @notice Claim rewards from a MultiMerkleStash distributor for a single token leaf.
    /// @param distributor Address of the MultiMerkleStash distributor.
    /// @param token Reward token address.
    /// @param index Leaf index used by the MMS claimed bitmap.
    /// @param account Address to claim rewards for.
    /// @param amount Amount to claim for the leaf.
    /// @param merkleProof Merkle proof proving (index, account, amount) in the token tree.
    /// @dev Reverts bubble from the distributor (e.g., already claimed or invalid proof). Tokens
    ///      are transferred by the distributor to `account`.
    function claim(
        address distributor,
        address token,
        uint256 index,
        address account,
        uint256 amount,
        bytes32[] calldata merkleProof
    ) external onlyDelegateCall {
        return IMultiMerkleStash(distributor).claim(token, index, account, amount, merkleProof);
    }

    /// @notice Batch claim rewards across multiple MultiMerkleStash distributors.
    /// @param distributors Array of MMS distributor addresses.
    /// @param claimData Array of per-distributor batched claim payloads matching `distributors` order.
    /// @dev Reverts with `InvalidParamsLength` if array lengths mismatch. Each distributor call
    ///      uses `claimMulti` and may revert independently; any revert bubbles and reverts the whole call.
    function claims(address[] calldata distributors, MultiMerkleStashClaimData[] calldata claimData)
        external
        onlyDelegateCall
    {
        if (distributors.length != claimData.length) revert InvalidParamsLength();

        for (uint256 i; i < distributors.length; i++) {
            IMultiMerkleStash(distributors[i]).claimMulti(claimData[i].account, claimData[i].claimParams);
        }
    }

    ///////////////////////////////////////////////////////////////
    // BOTH IUniversalRewardsDistributor AND IMultiMerkleStash
    ///////////////////////////////////////////////////////////////

    /// @notice Supported reward distributor types for batched claims.
    /// @dev Extend this enum when adding new distributor conventions.
    enum DistributorType {
        /// @notice Morpho-like UniversalRewardsDistributor.
        UniversalRewardsDistributor,
        /// @notice MultiMerkleStash with per-token merkle trees and index-based claims.
        MultiMerkleStash
    }

    /// @notice Batch claim rewards from distributors with per-item interface types.
    /// @param distributors Array of distributor addresses.
    /// @param distributorTypes Array of distributor types, one for each distributor in `distributors`.
    /// @param claimData ABI-encoded per-item claim parameters, matching `distributors` order.
    ///        - If `distributorTypes[i] == DistributorType.UniversalRewardsDistributor`, each item must be
    ///          abi.encode(account, reward, claimable, proof) where:
    ///             account: address
    ///             reward: address
    ///             claimable: uint256
    ///             proof: bytes32[]
    ///        - If `distributorTypes[i] == DistributorType.MultiMerkleStash`, each item must be
    ///          abi.encode(token, index, account, amount, merkleProof) where:
    ///             token: address
    ///             index: uint256
    ///             account: address
    ///             amount: uint256
    ///             merkleProof: bytes32[]
    /// @dev Use this function to claim rewards from multiple distributors with
    ///      different implementations. Reverts with `InvalidParamsLength` if array lengths mismatch
    ///      and `InvalidDistributorType` if the type is not supported. Any revert from a target distributor
    ///      bubbles up and reverts the entire call.
    ///      The contracts IMultiMerkleStash are called using the `claim` function not the `claimMulti` function.
    function claims(
        address[] calldata distributors,
        DistributorType[] calldata distributorTypes,
        bytes[] calldata claimData
    ) external onlyDelegateCall {
        if (distributors.length != distributorTypes.length) {
            revert InvalidParamsLength();
        }
        if (distributors.length != claimData.length) revert InvalidParamsLength();

        for (uint256 i; i < distributors.length; i++) {
            if (distributorTypes[i] == DistributorType.UniversalRewardsDistributor) {
                (address account, address reward, uint256 claimable, bytes32[] memory proof) =
                    abi.decode(claimData[i], (address, address, uint256, bytes32[]));
                IUniversalRewardsDistributor(distributors[i]).claim(account, reward, claimable, proof);
            } else if (distributorTypes[i] == DistributorType.MultiMerkleStash) {
                (address token, uint256 index, address account, uint256 amount, bytes32[] memory merkleProof) =
                    abi.decode(claimData[i], (address, uint256, address, uint256, bytes32[]));
                IMultiMerkleStash(distributors[i]).claim(token, index, account, amount, merkleProof);
            } else {
                revert InvalidDistributorType();
            }
        }
    }
}

interface IUniversalRewardsDistributor {
    function claim(address account, address reward, uint256 claimable, bytes32[] memory proof)
        external
        returns (uint256 amount);
}

interface IMultiMerkleStash {
    function claim(address token, uint256 index, address account, uint256 amount, bytes32[] calldata merkleProof)
        external;

    function claimMulti(address account, RouterModuleRewardsFetcher.MultiMerkleStashClaimParams[] calldata claims)
        external;
}

File 2 of 3 : RouterModuleBase.sol
// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

import {IRouterModule} from "src/router/interfaces/IRouterModule.sol";

/// @title RouterModuleBase
/// @notice An abstract contract that serves as the base for all router modules
/// @dev Exposes the onlyDelegateCall modifier to restrict functions to be called only by delegatecall
abstract contract RouterModuleBase is IRouterModule {
    address private immutable THIS;

    error OnlyDelegateCall();

    constructor() {
        THIS = address(this);
    }

    modifier onlyDelegateCall() {
        require(address(this) != THIS, OnlyDelegateCall());
        _;
    }
}

// SPDX-License-Identifier: BUSL-1.1
pragma solidity 0.8.28;

interface IRouterModule {
    function name() external view returns (string memory name);
    function version() external view returns (string memory version);
}

Settings
{
  "remappings": [
    "forge-std/=node_modules/forge-std/",
    "@shared/=node_modules/@stake-dao/shared/",
    "@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/",
    "@interfaces/=node_modules/@stake-dao/interfaces/src/interfaces/",
    "@address-book/=node_modules/@stake-dao/address-book/",
    "@strategies/=node_modules/@stake-dao/strategies/",
    "@lockers/=node_modules/@stake-dao/lockers/",
    "@safe/=node_modules/@stake-dao/strategies/node_modules/@safe-global/safe-smart-account/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false
}

Contract Security Audit

Contract ABI

API
[{"inputs":[],"name":"InvalidDistributorType","type":"error"},{"inputs":[],"name":"InvalidParamsLength","type":"error"},{"inputs":[],"name":"OnlyDelegateCall","type":"error"},{"inputs":[{"internalType":"address","name":"distributor","type":"address"},{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"claim","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"distributor","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"distributors","type":"address[]"},{"components":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"reward","type":"address"},{"internalType":"uint256","name":"claimable","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"internalType":"struct RouterModuleRewardsFetcher.UniversalRewardsDistributorClaimData[]","name":"claimData","type":"tuple[]"}],"name":"claims","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"distributors","type":"address[]"},{"components":[{"internalType":"address","name":"account","type":"address"},{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"internalType":"struct RouterModuleRewardsFetcher.MultiMerkleStashClaimParams[]","name":"claimParams","type":"tuple[]"}],"internalType":"struct RouterModuleRewardsFetcher.MultiMerkleStashClaimData[]","name":"claimData","type":"tuple[]"}],"name":"claims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"distributors","type":"address[]"},{"internalType":"enum RouterModuleRewardsFetcher.DistributorType[]","name":"distributorTypes","type":"uint8[]"},{"internalType":"bytes[]","name":"claimData","type":"bytes[]"}],"name":"claims","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"version","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60a0604052348015600e575f5ffd5b50306080526080516111846100475f395f818161017c015281816103b701528181610522015281816105ea01526106a001526111845ff3fe608060405234801561000f575f5ffd5b506004361061007a575f3560e01c806354fd4d501161005857806354fd4d5014610105578063a21d1ade14610129578063ad1c662b1461014a578063b10fb3c31461015d575f5ffd5b806306fdde031461007e5780633a3b369f146100d05780634f3ebd52146100f0575b5f5ffd5b6100ba60405180604001604052601a8152806020017f526f757465724d6f64756c65526577617264734665746368657200000000000081525081565b6040516100c79190610977565b60405180910390f35b6100e36100de3660046109f3565b610170565b6040516100c79190610a5d565b6101036100fe3660046109f3565b6103ad565b005b6100ba604051806040016040528060058152602001640312e302e360dc1b81525081565b61013c610137366004610ab6565b610517565b6040519081526020016100c7565b610103610158366004610b35565b6105e0565b61010361016b366004610bbd565b610696565b60606001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036101bb57604051633c64f99360e21b815260040160405180910390fd5b8382146101db57604051633e5431b160e21b815260040160405180910390fd5b836001600160401b038111156101f3576101f3610c3b565b60405190808252806020026020018201604052801561021c578160200160208202803683370190505b5090505f5b848110156103a45785858281811061023b5761023b610c4f565b90506020020160208101906102509190610c63565b6001600160a01b031663fabed41285858481811061027057610270610c4f565b90506020028101906102829190610c85565b610290906020810190610c63565b8686858181106102a2576102a2610c4f565b90506020028101906102b49190610c85565b6102c5906040810190602001610c63565b8787868181106102d7576102d7610c4f565b90506020028101906102e99190610c85565b604001358888878181106102ff576102ff610c4f565b90506020028101906103119190610c85565b61031f906060810190610ca3565b6040518663ffffffff1660e01b815260040161033f959493929190610d18565b6020604051808303815f875af115801561035b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037f9190610d4b565b82828151811061039157610391610c4f565b6020908102919091010152600101610221565b50949350505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036103f657604051633c64f99360e21b815260040160405180910390fd5b82811461041657604051633e5431b160e21b815260040160405180910390fd5b5f5b838110156105105784848281811061043257610432610c4f565b90506020020160208101906104479190610c63565b6001600160a01b03166320ce64de84848481811061046757610467610c4f565b90506020028101906104799190610d62565b610487906020810190610c63565b85858581811061049957610499610c4f565b90506020028101906104ab9190610d62565b6104b9906020810190610ca3565b6040518463ffffffff1660e01b81526004016104d793929190610d76565b5f604051808303815f87803b1580156104ee575f5ffd5b505af1158015610500573d5f5f3e3d5ffd5b5050600190920191506104189050565b5050505050565b5f6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361056157604051633c64f99360e21b815260040160405180910390fd5b604051637d5f6a0960e11b81526001600160a01b0388169063fabed412906105959089908990899089908990600401610d18565b6020604051808303815f875af11580156105b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d59190610d4b565b979650505050505050565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016300361062957604051633c64f99360e21b815260040160405180910390fd5b604051630968c76b60e11b81526001600160a01b038816906312d18ed69061065f90899089908990899089908990600401610e74565b5f604051808303815f87803b158015610676575f5ffd5b505af1158015610688573d5f5f3e3d5ffd5b505050505b50505050505050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001630036106df57604051633c64f99360e21b815260040160405180910390fd5b8483146106ff57604051633e5431b160e21b815260040160405180910390fd5b84811461071f57604051633e5431b160e21b815260040160405180910390fd5b5f5b8581101561068d575f85858381811061073c5761073c610c4f565b90506020020160208101906107519190610ece565b600181111561076257610762610eba565b03610846575f5f5f5f86868681811061077d5761077d610c4f565b905060200281019061078f9190610eec565b81019061079c9190610fc8565b93509350935093508a8a868181106107b6576107b6610c4f565b90506020020160208101906107cb9190610c63565b6001600160a01b031663fabed412858585856040518563ffffffff1660e01b81526004016107fc9493929190611069565b6020604051808303815f875af1158015610818573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083c9190610d4b565b505050505061096f565b600185858381811061085a5761085a610c4f565b905060200201602081019061086f9190610ece565b600181111561088057610880610eba565b03610956575f5f5f5f5f87878781811061089c5761089c610c4f565b90506020028101906108ae9190610eec565b8101906108bb91906110a5565b945094509450945094508b8b878181106108d7576108d7610c4f565b90506020020160208101906108ec9190610c63565b6001600160a01b03166312d18ed686868686866040518663ffffffff1660e01b815260040161091f959493929190611115565b5f604051808303815f87803b158015610936575f5ffd5b505af1158015610948573d5f5f3e3d5ffd5b50505050505050505061096f565b60405163e5ef70af60e01b815260040160405180910390fd5b600101610721565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126109bc575f5ffd5b5081356001600160401b038111156109d2575f5ffd5b6020830191508360208260051b85010111156109ec575f5ffd5b9250929050565b5f5f5f5f60408587031215610a06575f5ffd5b84356001600160401b03811115610a1b575f5ffd5b610a27878288016109ac565b90955093505060208501356001600160401b03811115610a45575f5ffd5b610a51878288016109ac565b95989497509550505050565b602080825282518282018190525f918401906040840190835b81811015610a94578351835260209384019390920191600101610a76565b509095945050505050565b6001600160a01b0381168114610ab3575f5ffd5b50565b5f5f5f5f5f5f60a08789031215610acb575f5ffd5b8635610ad681610a9f565b95506020870135610ae681610a9f565b94506040870135610af681610a9f565b93506060870135925060808701356001600160401b03811115610b17575f5ffd5b610b2389828a016109ac565b979a9699509497509295939492505050565b5f5f5f5f5f5f5f60c0888a031215610b4b575f5ffd5b8735610b5681610a9f565b96506020880135610b6681610a9f565b9550604088013594506060880135610b7d81610a9f565b93506080880135925060a08801356001600160401b03811115610b9e575f5ffd5b610baa8a828b016109ac565b989b979a50959850939692959293505050565b5f5f5f5f5f5f60608789031215610bd2575f5ffd5b86356001600160401b03811115610be7575f5ffd5b610bf389828a016109ac565b90975095505060208701356001600160401b03811115610c11575f5ffd5b610c1d89828a016109ac565b90955093505060408701356001600160401b03811115610b17575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c73575f5ffd5b8135610c7e81610a9f565b9392505050565b5f8235607e19833603018112610c99575f5ffd5b9190910192915050565b5f5f8335601e19843603018112610cb8575f5ffd5b8301803591506001600160401b03821115610cd1575f5ffd5b6020019150600581901b36038213156109ec575f5ffd5b8183525f6001600160fb1b03831115610cff575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03868116825285166020820152604081018490526080606082018190525f906105d59083018486610ce8565b5f60208284031215610d5b575f5ffd5b5051919050565b5f8235603e19833603018112610c99575f5ffd5b6001600160a01b038416815260406020820181905281018290525f6060600584901b830181019083018583607e1936839003015b87821015610e6657868503605f190184528235818112610dc8575f5ffd5b89018035610dd581610a9f565b6001600160a01b031686526020818101359087015260408082013590870152606081013536829003601e19018112610e0b575f5ffd5b016020810190356001600160401b03811115610e25575f5ffd5b8060051b3603821315610e36575f5ffd5b60806060880152610e4b608088018284610ce8565b96505050602083019250602084019350600182019150610daa565b509298975050505050505050565b6001600160a01b03878116825260208201879052851660408201526060810184905260a0608082018190525f90610eae9083018486610ce8565b98975050505050505050565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215610ede575f5ffd5b813560028110610c7e575f5ffd5b5f5f8335601e19843603018112610f01575f5ffd5b8301803591506001600160401b03821115610f1a575f5ffd5b6020019150368190038213156109ec575f5ffd5b5f82601f830112610f3d575f5ffd5b81356001600160401b03811115610f5657610f56610c3b565b8060051b604051601f19603f83011681018181106001600160401b0382111715610f8257610f82610c3b565b604052918252602081850181019290810186841115610f9f575f5ffd5b6020860192505b83831015610fbe578235815260209283019201610fa6565b5095945050505050565b5f5f5f5f60808587031215610fdb575f5ffd5b8435610fe681610a9f565b93506020850135610ff681610a9f565b92506040850135915060608501356001600160401b03811115611017575f5ffd5b61102387828801610f2e565b91505092959194509250565b5f8151808452602084019350602083015f5b8281101561105f578151865260209586019590910190600101611041565b5093949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061109b9083018461102f565b9695505050505050565b5f5f5f5f5f60a086880312156110b9575f5ffd5b85356110c481610a9f565b94506020860135935060408601356110db81610a9f565b92506060860135915060808601356001600160401b038111156110fc575f5ffd5b61110888828901610f2e565b9150509295509295909350565b6001600160a01b03868116825260208201869052841660408201526060810183905260a0608082018190525f906105d59083018461102f56fea2646970667358221220e09dd18032dd1a8408f938cac7d332657847fd4ed91e993d80f4a4b8f8cc5cb164736f6c634300081c0033

Deployed Bytecode

0x608060405234801561000f575f5ffd5b506004361061007a575f3560e01c806354fd4d501161005857806354fd4d5014610105578063a21d1ade14610129578063ad1c662b1461014a578063b10fb3c31461015d575f5ffd5b806306fdde031461007e5780633a3b369f146100d05780634f3ebd52146100f0575b5f5ffd5b6100ba60405180604001604052601a8152806020017f526f757465724d6f64756c65526577617264734665746368657200000000000081525081565b6040516100c79190610977565b60405180910390f35b6100e36100de3660046109f3565b610170565b6040516100c79190610a5d565b6101036100fe3660046109f3565b6103ad565b005b6100ba604051806040016040528060058152602001640312e302e360dc1b81525081565b61013c610137366004610ab6565b610517565b6040519081526020016100c7565b610103610158366004610b35565b6105e0565b61010361016b366004610bbd565b610696565b60606001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba965141630036101bb57604051633c64f99360e21b815260040160405180910390fd5b8382146101db57604051633e5431b160e21b815260040160405180910390fd5b836001600160401b038111156101f3576101f3610c3b565b60405190808252806020026020018201604052801561021c578160200160208202803683370190505b5090505f5b848110156103a45785858281811061023b5761023b610c4f565b90506020020160208101906102509190610c63565b6001600160a01b031663fabed41285858481811061027057610270610c4f565b90506020028101906102829190610c85565b610290906020810190610c63565b8686858181106102a2576102a2610c4f565b90506020028101906102b49190610c85565b6102c5906040810190602001610c63565b8787868181106102d7576102d7610c4f565b90506020028101906102e99190610c85565b604001358888878181106102ff576102ff610c4f565b90506020028101906103119190610c85565b61031f906060810190610ca3565b6040518663ffffffff1660e01b815260040161033f959493929190610d18565b6020604051808303815f875af115801561035b573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061037f9190610d4b565b82828151811061039157610391610c4f565b6020908102919091010152600101610221565b50949350505050565b6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba965141630036103f657604051633c64f99360e21b815260040160405180910390fd5b82811461041657604051633e5431b160e21b815260040160405180910390fd5b5f5b838110156105105784848281811061043257610432610c4f565b90506020020160208101906104479190610c63565b6001600160a01b03166320ce64de84848481811061046757610467610c4f565b90506020028101906104799190610d62565b610487906020810190610c63565b85858581811061049957610499610c4f565b90506020028101906104ab9190610d62565b6104b9906020810190610ca3565b6040518463ffffffff1660e01b81526004016104d793929190610d76565b5f604051808303815f87803b1580156104ee575f5ffd5b505af1158015610500573d5f5f3e3d5ffd5b5050600190920191506104189050565b5050505050565b5f6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba9651416300361056157604051633c64f99360e21b815260040160405180910390fd5b604051637d5f6a0960e11b81526001600160a01b0388169063fabed412906105959089908990899089908990600401610d18565b6020604051808303815f875af11580156105b1573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105d59190610d4b565b979650505050505050565b6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba9651416300361062957604051633c64f99360e21b815260040160405180910390fd5b604051630968c76b60e11b81526001600160a01b038816906312d18ed69061065f90899089908990899089908990600401610e74565b5f604051808303815f87803b158015610676575f5ffd5b505af1158015610688573d5f5f3e3d5ffd5b505050505b50505050505050565b6001600160a01b037f00000000000000000000000036c7e1295590d70ebe6d81a4f666c092dba965141630036106df57604051633c64f99360e21b815260040160405180910390fd5b8483146106ff57604051633e5431b160e21b815260040160405180910390fd5b84811461071f57604051633e5431b160e21b815260040160405180910390fd5b5f5b8581101561068d575f85858381811061073c5761073c610c4f565b90506020020160208101906107519190610ece565b600181111561076257610762610eba565b03610846575f5f5f5f86868681811061077d5761077d610c4f565b905060200281019061078f9190610eec565b81019061079c9190610fc8565b93509350935093508a8a868181106107b6576107b6610c4f565b90506020020160208101906107cb9190610c63565b6001600160a01b031663fabed412858585856040518563ffffffff1660e01b81526004016107fc9493929190611069565b6020604051808303815f875af1158015610818573d5f5f3e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061083c9190610d4b565b505050505061096f565b600185858381811061085a5761085a610c4f565b905060200201602081019061086f9190610ece565b600181111561088057610880610eba565b03610956575f5f5f5f5f87878781811061089c5761089c610c4f565b90506020028101906108ae9190610eec565b8101906108bb91906110a5565b945094509450945094508b8b878181106108d7576108d7610c4f565b90506020020160208101906108ec9190610c63565b6001600160a01b03166312d18ed686868686866040518663ffffffff1660e01b815260040161091f959493929190611115565b5f604051808303815f87803b158015610936575f5ffd5b505af1158015610948573d5f5f3e3d5ffd5b50505050505050505061096f565b60405163e5ef70af60e01b815260040160405180910390fd5b600101610721565b602081525f82518060208401528060208501604085015e5f604082850101526040601f19601f83011684010191505092915050565b5f5f83601f8401126109bc575f5ffd5b5081356001600160401b038111156109d2575f5ffd5b6020830191508360208260051b85010111156109ec575f5ffd5b9250929050565b5f5f5f5f60408587031215610a06575f5ffd5b84356001600160401b03811115610a1b575f5ffd5b610a27878288016109ac565b90955093505060208501356001600160401b03811115610a45575f5ffd5b610a51878288016109ac565b95989497509550505050565b602080825282518282018190525f918401906040840190835b81811015610a94578351835260209384019390920191600101610a76565b509095945050505050565b6001600160a01b0381168114610ab3575f5ffd5b50565b5f5f5f5f5f5f60a08789031215610acb575f5ffd5b8635610ad681610a9f565b95506020870135610ae681610a9f565b94506040870135610af681610a9f565b93506060870135925060808701356001600160401b03811115610b17575f5ffd5b610b2389828a016109ac565b979a9699509497509295939492505050565b5f5f5f5f5f5f5f60c0888a031215610b4b575f5ffd5b8735610b5681610a9f565b96506020880135610b6681610a9f565b9550604088013594506060880135610b7d81610a9f565b93506080880135925060a08801356001600160401b03811115610b9e575f5ffd5b610baa8a828b016109ac565b989b979a50959850939692959293505050565b5f5f5f5f5f5f60608789031215610bd2575f5ffd5b86356001600160401b03811115610be7575f5ffd5b610bf389828a016109ac565b90975095505060208701356001600160401b03811115610c11575f5ffd5b610c1d89828a016109ac565b90955093505060408701356001600160401b03811115610b17575f5ffd5b634e487b7160e01b5f52604160045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b5f60208284031215610c73575f5ffd5b8135610c7e81610a9f565b9392505050565b5f8235607e19833603018112610c99575f5ffd5b9190910192915050565b5f5f8335601e19843603018112610cb8575f5ffd5b8301803591506001600160401b03821115610cd1575f5ffd5b6020019150600581901b36038213156109ec575f5ffd5b8183525f6001600160fb1b03831115610cff575f5ffd5b8260051b80836020870137939093016020019392505050565b6001600160a01b03868116825285166020820152604081018490526080606082018190525f906105d59083018486610ce8565b5f60208284031215610d5b575f5ffd5b5051919050565b5f8235603e19833603018112610c99575f5ffd5b6001600160a01b038416815260406020820181905281018290525f6060600584901b830181019083018583607e1936839003015b87821015610e6657868503605f190184528235818112610dc8575f5ffd5b89018035610dd581610a9f565b6001600160a01b031686526020818101359087015260408082013590870152606081013536829003601e19018112610e0b575f5ffd5b016020810190356001600160401b03811115610e25575f5ffd5b8060051b3603821315610e36575f5ffd5b60806060880152610e4b608088018284610ce8565b96505050602083019250602084019350600182019150610daa565b509298975050505050505050565b6001600160a01b03878116825260208201879052851660408201526060810184905260a0608082018190525f90610eae9083018486610ce8565b98975050505050505050565b634e487b7160e01b5f52602160045260245ffd5b5f60208284031215610ede575f5ffd5b813560028110610c7e575f5ffd5b5f5f8335601e19843603018112610f01575f5ffd5b8301803591506001600160401b03821115610f1a575f5ffd5b6020019150368190038213156109ec575f5ffd5b5f82601f830112610f3d575f5ffd5b81356001600160401b03811115610f5657610f56610c3b565b8060051b604051601f19603f83011681018181106001600160401b0382111715610f8257610f82610c3b565b604052918252602081850181019290810186841115610f9f575f5ffd5b6020860192505b83831015610fbe578235815260209283019201610fa6565b5095945050505050565b5f5f5f5f60808587031215610fdb575f5ffd5b8435610fe681610a9f565b93506020850135610ff681610a9f565b92506040850135915060608501356001600160401b03811115611017575f5ffd5b61102387828801610f2e565b91505092959194509250565b5f8151808452602084019350602083015f5b8281101561105f578151865260209586019590910190600101611041565b5093949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061109b9083018461102f565b9695505050505050565b5f5f5f5f5f60a086880312156110b9575f5ffd5b85356110c481610a9f565b94506020860135935060408601356110db81610a9f565b92506060860135915060808601356001600160401b038111156110fc575f5ffd5b61110888828901610f2e565b9150509295509295909350565b6001600160a01b03868116825260208201869052841660408201526060810183905260a0608082018190525f906105d59083018461102f56fea2646970667358221220e09dd18032dd1a8408f938cac7d332657847fd4ed91e993d80f4a4b8f8cc5cb164736f6c634300081c0033

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
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.