Holesky Testnet

Contract

0x045dd46212A178428c088573A7d102B9d89a022A

Overview

ETH Balance

0 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Deposit Buffered...18189762024-06-27 15:30:12269 days ago1719502212IN
0x045dd462...9d89a022A
0 ETH0.001308291.86828985
Deposit Buffered...18189622024-06-27 15:26:36269 days ago1719501996IN
0x045dd462...9d89a022A
0 ETH0.001284581.14440835
Deposit Buffered...18180052024-06-27 11:48:00269 days ago1719488880IN
0x045dd462...9d89a022A
0 ETH0.000735621.04755259
Deposit Buffered...18178392024-06-27 11:09:48269 days ago1719486588IN
0x045dd462...9d89a022A
0 ETH0.000707681.01063556
Deposit Buffered...18177122024-06-27 10:41:24269 days ago1719484884IN
0x045dd462...9d89a022A
0 ETH0.001342731.92019921
Deposit Buffered...18176672024-06-27 10:31:36269 days ago1719484296IN
0x045dd462...9d89a022A
0 ETH0.000797711.14982296
Deposit Buffered...18168602024-06-27 7:27:48270 days ago1719473268IN
0x045dd462...9d89a022A
0 ETH0.000753111.05752075
Deposit Buffered...18164742024-06-27 5:58:24270 days ago1719467904IN
0x045dd462...9d89a022A
0 ETH0.002980221.13102832
Deposit Buffered...18144262024-06-26 22:10:24270 days ago1719439824IN
0x045dd462...9d89a022A
0 ETH0.00071621.01201647
Deposit Buffered...18140442024-06-26 20:42:36270 days ago1719434556IN
0x045dd462...9d89a022A
0 ETH0.000739251.0571994
Deposit Buffered...18137182024-06-26 19:28:36270 days ago1719430116IN
0x045dd462...9d89a022A
0 ETH0.0008871.10062092
Deposit Buffered...18130482024-06-26 16:54:00270 days ago1719420840IN
0x045dd462...9d89a022A
0 ETH0.00127991.85003192
Deposit Buffered...18130412024-06-26 16:52:12270 days ago1719420732IN
0x045dd462...9d89a022A
0 ETH0.000736521.0631445
Deposit Buffered...18130182024-06-26 16:46:24270 days ago1719420384IN
0x045dd462...9d89a022A
0 ETH0.001301461.90174301
Deposit Buffered...18130112024-06-26 16:44:48270 days ago1719420288IN
0x045dd462...9d89a022A
0 ETH0.001348731.90730764
Deposit Buffered...18125912024-06-26 15:07:48270 days ago1719414468IN
0x045dd462...9d89a022A
0 ETH0.000695841.00575105
Deposit Buffered...18123142024-06-26 14:04:36270 days ago1719410676IN
0x045dd462...9d89a022A
0 ETH0.000720981.04214233
Deposit Buffered...18121932024-06-26 13:37:12270 days ago1719409032IN
0x045dd462...9d89a022A
0 ETH0.001305721.15071803
Deposit Buffered...18121862024-06-26 13:35:12270 days ago1719408912IN
0x045dd462...9d89a022A
0 ETH0.001265231.10425182
Deposit Buffered...18121622024-06-26 13:29:36270 days ago1719408576IN
0x045dd462...9d89a022A
0 ETH0.000783871.1091867
Deposit Buffered...18118232024-06-26 12:12:36270 days ago1719403956IN
0x045dd462...9d89a022A
0 ETH0.00080821.00408641
Deposit Buffered...18116322024-06-26 11:29:00270 days ago1719401340IN
0x045dd462...9d89a022A
0 ETH0.001340221.91119381
Deposit Buffered...18111602024-06-26 9:39:00271 days ago1719394740IN
0x045dd462...9d89a022A
0 ETH0.000789061.13728747
Deposit Buffered...18093612024-06-26 2:51:24271 days ago1719370284IN
0x045dd462...9d89a022A
0 ETH0.001007561.11812083
Deposit Buffered...18092812024-06-26 2:32:48271 days ago1719369168IN
0x045dd462...9d89a022A
0 ETH0.000715351.0259897
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
DepositSecurityModule

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 2 : DepositSecurityModule.sol
// SPDX-FileCopyrightText: 2023 Lido <[email protected]>
// SPDX-License-Identifier: GPL-3.0

/* See contracts/COMPILERS.md */
pragma solidity 0.8.9;

import {ECDSA} from "../common/lib/ECDSA.sol";

interface ILido {
    function deposit(
        uint256 _maxDepositsCount,
        uint256 _stakingModuleId,
        bytes calldata _depositCalldata
    ) external;
    function canDeposit() external view returns (bool);
}

interface IDepositContract {
    function get_deposit_root() external view returns (bytes32 rootHash);
}

interface IStakingRouter {
    function pauseStakingModule(uint256 _stakingModuleId) external;
    function resumeStakingModule(uint256 _stakingModuleId) external;
    function getStakingModuleIsDepositsPaused(uint256 _stakingModuleId) external view returns (bool);
    function getStakingModuleIsActive(uint256 _stakingModuleId) external view returns (bool);
    function getStakingModuleNonce(uint256 _stakingModuleId) external view returns (uint256);
    function getStakingModuleLastDepositBlock(uint256 _stakingModuleId) external view returns (uint256);
    function hasStakingModule(uint256 _stakingModuleId) external view returns (bool);
}



contract DepositSecurityModule {
    /**
     * Short ECDSA signature as defined in https://eips.ethereum.org/EIPS/eip-2098.
     */
    struct Signature {
        bytes32 r;
        bytes32 vs;
    }

    event OwnerChanged(address newValue);
    event PauseIntentValidityPeriodBlocksChanged(uint256 newValue);
    event MaxDepositsChanged(uint256 newValue);
    event MinDepositBlockDistanceChanged(uint256 newValue);
    event GuardianQuorumChanged(uint256 newValue);
    event GuardianAdded(address guardian);
    event GuardianRemoved(address guardian);
    event DepositsPaused(address indexed guardian, uint24 indexed stakingModuleId);
    event DepositsUnpaused(uint24 indexed stakingModuleId);

    error ZeroAddress(string field);
    error DuplicateAddress(address addr);
    error NotAnOwner(address caller);
    error InvalidSignature();
    error SignaturesNotSorted();
    error DepositNoQuorum();
    error DepositRootChanged();
    error DepositInactiveModule();
    error DepositTooFrequent();
    error DepositUnexpectedBlockHash();
    error DepositNonceChanged();
    error PauseIntentExpired();
    error NotAGuardian(address addr);
    error ZeroParameter(string parameter);

    bytes32 public immutable ATTEST_MESSAGE_PREFIX;
    bytes32 public immutable PAUSE_MESSAGE_PREFIX;

    ILido public immutable LIDO;
    IStakingRouter public immutable STAKING_ROUTER;
    IDepositContract public immutable DEPOSIT_CONTRACT;

    /**
     * NB: both `maxDepositsPerBlock` and `minDepositBlockDistance` values
     * must be harmonized with `OracleReportSanityChecker.churnValidatorsPerDayLimit`
     * (see docs for the `OracleReportSanityChecker.setChurnValidatorsPerDayLimit` function)
     */
    uint256 internal maxDepositsPerBlock;
    uint256 internal minDepositBlockDistance;
    uint256 internal pauseIntentValidityPeriodBlocks;

    address internal owner;

    uint256 internal quorum;
    address[] internal guardians;
    mapping(address => uint256) internal guardianIndicesOneBased; // 1-based

    constructor(
        address _lido,
        address _depositContract,
        address _stakingRouter,
        uint256 _maxDepositsPerBlock,
        uint256 _minDepositBlockDistance,
        uint256 _pauseIntentValidityPeriodBlocks
    ) {
        if (_lido == address(0)) revert ZeroAddress("_lido");
        if (_depositContract == address(0)) revert ZeroAddress ("_depositContract");
        if (_stakingRouter == address(0)) revert ZeroAddress ("_stakingRouter");

        LIDO = ILido(_lido);
        STAKING_ROUTER = IStakingRouter(_stakingRouter);
        DEPOSIT_CONTRACT = IDepositContract(_depositContract);

        ATTEST_MESSAGE_PREFIX = keccak256(
            abi.encodePacked(
                // keccak256("lido.DepositSecurityModule.ATTEST_MESSAGE")
                bytes32(0x1085395a994e25b1b3d0ea7937b7395495fb405b31c7d22dbc3976a6bd01f2bf),
                block.chainid,
                address(this)
            )
        );

        PAUSE_MESSAGE_PREFIX = keccak256(
            abi.encodePacked(
                // keccak256("lido.DepositSecurityModule.PAUSE_MESSAGE")
                bytes32(0x9c4c40205558f12027f21204d6218b8006985b7a6359bcab15404bcc3e3fa122),
                block.chainid,
                address(this)
            )
        );

        _setOwner(msg.sender);
        _setMaxDeposits(_maxDepositsPerBlock);
        _setMinDepositBlockDistance(_minDepositBlockDistance);
        _setPauseIntentValidityPeriodBlocks(_pauseIntentValidityPeriodBlocks);
    }

    /**
     * Returns the owner address.
     */
    function getOwner() external view returns (address) {
        return owner;
    }

    modifier onlyOwner() {
        if (msg.sender != owner) revert NotAnOwner(msg.sender);
        _;
    }

    /**
     * Sets new owner. Only callable by the current owner.
     */
    function setOwner(address newValue) external onlyOwner {
        _setOwner(newValue);
    }

    function _setOwner(address _newOwner) internal {
        if (_newOwner == address(0)) revert ZeroAddress("_newOwner");
        owner = _newOwner;
        emit OwnerChanged(_newOwner);
    }

    /**
     * Returns current `pauseIntentValidityPeriodBlocks` contract parameter (see `pauseDeposits`).
     */
    function getPauseIntentValidityPeriodBlocks() external view returns (uint256) {
        return pauseIntentValidityPeriodBlocks;
    }

    /**
     * Sets `pauseIntentValidityPeriodBlocks`. Only callable by the owner.
     */
    function setPauseIntentValidityPeriodBlocks(uint256 newValue) external onlyOwner {
        _setPauseIntentValidityPeriodBlocks(newValue);
    }

    function _setPauseIntentValidityPeriodBlocks(uint256 newValue) internal {
        if (newValue == 0) revert ZeroParameter("pauseIntentValidityPeriodBlocks");
        pauseIntentValidityPeriodBlocks = newValue;
        emit PauseIntentValidityPeriodBlocksChanged(newValue);
    }

    /**
     * Returns `maxDepositsPerBlock` (see `depositBufferedEther`).
     */
    function getMaxDeposits() external view returns (uint256) {
        return maxDepositsPerBlock;
    }

    /**
     * Sets `maxDepositsPerBlock`. Only callable by the owner.
     *
     * NB: the value must be harmonized with `OracleReportSanityChecker.churnValidatorsPerDayLimit`
     * (see docs for the `OracleReportSanityChecker.setChurnValidatorsPerDayLimit` function)
     */
    function setMaxDeposits(uint256 newValue) external onlyOwner {
        _setMaxDeposits(newValue);
    }

    function _setMaxDeposits(uint256 newValue) internal {
        maxDepositsPerBlock = newValue;
        emit MaxDepositsChanged(newValue);
    }

    /**
     * Returns `minDepositBlockDistance`  (see `depositBufferedEther`).
     */
    function getMinDepositBlockDistance() external view returns (uint256) {
        return minDepositBlockDistance;
    }

    /**
     * Sets `minDepositBlockDistance`. Only callable by the owner.
     *
     * NB: the value must be harmonized with `OracleReportSanityChecker.churnValidatorsPerDayLimit`
     * (see docs for the `OracleReportSanityChecker.setChurnValidatorsPerDayLimit` function)
     */
    function setMinDepositBlockDistance(uint256 newValue) external onlyOwner {
        _setMinDepositBlockDistance(newValue);
    }

    function _setMinDepositBlockDistance(uint256 newValue) internal {
        if (newValue == 0) revert ZeroParameter("minDepositBlockDistance");
        if (newValue != minDepositBlockDistance) {
            minDepositBlockDistance = newValue;
            emit MinDepositBlockDistanceChanged(newValue);
        }
    }

    /**
     * Returns number of valid guardian signatures required to vet (depositRoot, nonce) pair.
     */
    function getGuardianQuorum() external view returns (uint256) {
        return quorum;
    }

    function setGuardianQuorum(uint256 newValue) external onlyOwner {
        _setGuardianQuorum(newValue);
    }

    function _setGuardianQuorum(uint256 newValue) internal {
        // we're intentionally allowing setting quorum value higher than the number of guardians
        if (quorum != newValue) {
            quorum = newValue;
            emit GuardianQuorumChanged(newValue);
        }
    }

    /**
     * Returns guardian committee member list.
     */
    function getGuardians() external view returns (address[] memory) {
        return guardians;
    }

    /**
     * Checks whether the given address is a guardian.
     */
    function isGuardian(address addr) external view returns (bool) {
        return _isGuardian(addr);
    }

    function _isGuardian(address addr) internal view returns (bool) {
        return guardianIndicesOneBased[addr] > 0;
    }

    /**
     * Returns index of the guardian, or -1 if the address is not a guardian.
     */
    function getGuardianIndex(address addr) external view returns (int256) {
        return _getGuardianIndex(addr);
    }

    function _getGuardianIndex(address addr) internal view returns (int256) {
        return int256(guardianIndicesOneBased[addr]) - 1;
    }

    /**
     * Adds a guardian address and sets a new quorum value.
     * Reverts if the address is already a guardian.
     *
     * Only callable by the owner.
     */
    function addGuardian(address addr, uint256 newQuorum) external onlyOwner {
        _addGuardian(addr);
        _setGuardianQuorum(newQuorum);
    }

    /**
     * Adds a set of guardian addresses and sets a new quorum value.
     * Reverts any of them is already a guardian.
     *
     * Only callable by the owner.
     */
    function addGuardians(address[] memory addresses, uint256 newQuorum) external onlyOwner {
        for (uint256 i = 0; i < addresses.length; ++i) {
            _addGuardian(addresses[i]);
        }
        _setGuardianQuorum(newQuorum);
    }

    function _addGuardian(address _newGuardian) internal {
        if (_newGuardian == address(0)) revert ZeroAddress("_newGuardian");
        if (_isGuardian(_newGuardian)) revert DuplicateAddress(_newGuardian);
        guardians.push(_newGuardian);
        guardianIndicesOneBased[_newGuardian] = guardians.length;
        emit GuardianAdded(_newGuardian);
    }

    /**
     * Removes a guardian with the given address and sets a new quorum value.
     *
     * Only callable by the owner.
     */
    function removeGuardian(address addr, uint256 newQuorum) external onlyOwner {
        uint256 indexOneBased = guardianIndicesOneBased[addr];
        if (indexOneBased == 0) revert NotAGuardian(addr);

        uint256 totalGuardians = guardians.length;
        assert(indexOneBased <= totalGuardians);

        if (indexOneBased != totalGuardians) {
            address addrToMove = guardians[totalGuardians - 1];
            guardians[indexOneBased - 1] = addrToMove;
            guardianIndicesOneBased[addrToMove] = indexOneBased;
        }

        guardianIndicesOneBased[addr] = 0;
        guardians.pop();

        _setGuardianQuorum(newQuorum);

        emit GuardianRemoved(addr);
    }

    /**
     * Pauses deposits for staking module given that both conditions are satisfied (reverts otherwise):
     *
     *   1. The function is called by the guardian with index guardianIndex OR sig
     *      is a valid signature by the guardian with index guardianIndex of the data
     *      defined below.
     *
     *   2. block.number - blockNumber <= pauseIntentValidityPeriodBlocks
     *
     * The signature, if present, must be produced for keccak256 hash of the following
     * message (each component taking 32 bytes):
     *
     * | PAUSE_MESSAGE_PREFIX | blockNumber | stakingModuleId |
     */
    function pauseDeposits(
        uint256 blockNumber,
        uint256 stakingModuleId,
        Signature memory sig
    ) external {
        // In case of an emergency function `pauseDeposits` is supposed to be called
        // by all guardians. Thus only the first call will do the actual change. But
        // the other calls would be OK operations from the point of view of protocol’s logic.
        // Thus we prefer not to use “error” semantics which is implied by `require`.

        /// @dev pause only active modules (not already paused, nor full stopped)
        if (!STAKING_ROUTER.getStakingModuleIsActive(stakingModuleId)) {
            return;
        }

        address guardianAddr = msg.sender;
        int256 guardianIndex = _getGuardianIndex(msg.sender);

        if (guardianIndex == -1) {
            bytes32 msgHash = keccak256(abi.encodePacked(PAUSE_MESSAGE_PREFIX, blockNumber, stakingModuleId));
            guardianAddr = ECDSA.recover(msgHash, sig.r, sig.vs);
            guardianIndex = _getGuardianIndex(guardianAddr);
            if (guardianIndex == -1) revert InvalidSignature();
        }

        if (block.number - blockNumber >  pauseIntentValidityPeriodBlocks) revert PauseIntentExpired();

        STAKING_ROUTER.pauseStakingModule(stakingModuleId);
        emit DepositsPaused(guardianAddr, uint24(stakingModuleId));
    }

    /**
     * Unpauses deposits for staking module
     *
     * Only callable by the owner.
     */
    function unpauseDeposits(uint256 stakingModuleId) external onlyOwner {
         /// @dev unpause only paused modules (skip stopped)
        if (STAKING_ROUTER.getStakingModuleIsDepositsPaused(stakingModuleId)) {
            STAKING_ROUTER.resumeStakingModule(stakingModuleId);
            emit DepositsUnpaused(uint24(stakingModuleId));
        }
    }

    /**
     * Returns whether LIDO.deposit() can be called, given that the caller will provide
     * guardian attestations of non-stale deposit root and `nonce`, and the number of
     * such attestations will be enough to reach quorum.
     */
    function canDeposit(uint256 stakingModuleId) external view returns (bool) {
        if (!STAKING_ROUTER.hasStakingModule(stakingModuleId)) return false;

        bool isModuleActive = STAKING_ROUTER.getStakingModuleIsActive(stakingModuleId);
        uint256 lastDepositBlock = STAKING_ROUTER.getStakingModuleLastDepositBlock(stakingModuleId);
        bool isLidoCanDeposit = LIDO.canDeposit();
        return (
            isModuleActive
            && quorum > 0
            && block.number - lastDepositBlock >= minDepositBlockDistance
            && isLidoCanDeposit
        );
    }

    /**
     * Calls LIDO.deposit(maxDepositsPerBlock, stakingModuleId, depositCalldata).
     *
     * Reverts if any of the following is true:
     *   1. IDepositContract.get_deposit_root() != depositRoot.
     *   2. StakingModule.getNonce() != nonce.
     *   3. The number of guardian signatures is less than getGuardianQuorum().
     *   4. An invalid or non-guardian signature received.
     *   5. block.number - StakingModule.getLastDepositBlock() < minDepositBlockDistance.
     *   6. blockhash(blockNumber) != blockHash.
     *
     * Signatures must be sorted in ascending order by address of the guardian. Each signature must
     * be produced for the keccak256 hash of the following message (each component taking 32 bytes):
     *
     * | ATTEST_MESSAGE_PREFIX | blockNumber | blockHash | depositRoot | stakingModuleId | nonce |
     */
    function depositBufferedEther(
        uint256 blockNumber,
        bytes32 blockHash,
        bytes32 depositRoot,
        uint256 stakingModuleId,
        uint256 nonce,
        bytes calldata depositCalldata,
        Signature[] calldata sortedGuardianSignatures
    ) external {
        if (quorum == 0 || sortedGuardianSignatures.length < quorum) revert DepositNoQuorum();

        bytes32 onchainDepositRoot = IDepositContract(DEPOSIT_CONTRACT).get_deposit_root();
        if (depositRoot != onchainDepositRoot) revert DepositRootChanged();

        if (!STAKING_ROUTER.getStakingModuleIsActive(stakingModuleId)) revert DepositInactiveModule();

        uint256 lastDepositBlock = STAKING_ROUTER.getStakingModuleLastDepositBlock(stakingModuleId);
        if (block.number - lastDepositBlock < minDepositBlockDistance) revert DepositTooFrequent();
        if (blockHash == bytes32(0) || blockhash(blockNumber) != blockHash) revert DepositUnexpectedBlockHash();

        uint256 onchainNonce = STAKING_ROUTER.getStakingModuleNonce(stakingModuleId);
        if (nonce != onchainNonce) revert DepositNonceChanged();

        _verifySignatures(depositRoot, blockNumber, blockHash, stakingModuleId, nonce, sortedGuardianSignatures);

        LIDO.deposit(maxDepositsPerBlock, stakingModuleId, depositCalldata);
    }

    function _verifySignatures(
        bytes32 depositRoot,
        uint256 blockNumber,
        bytes32 blockHash,
        uint256 stakingModuleId,
        uint256 nonce,
        Signature[] memory sigs
    ) internal view {
        bytes32 msgHash = keccak256(
            abi.encodePacked(ATTEST_MESSAGE_PREFIX, blockNumber, blockHash, depositRoot, stakingModuleId, nonce)
        );

        address prevSignerAddr = address(0);

        for (uint256 i = 0; i < sigs.length; ++i) {
            address signerAddr = ECDSA.recover(msgHash, sigs[i].r, sigs[i].vs);
            if (!_isGuardian(signerAddr)) revert InvalidSignature();
            if (signerAddr <= prevSignerAddr) revert SignaturesNotSorted();
            prevSignerAddr = signerAddr;
        }
    }
}

File 2 of 2 : ECDSA.sol
// SPDX-License-Identifier: MIT

// Extracted from:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.4.0/contracts/cryptography/ECDSA.sol#L53
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/541e821/contracts/utils/cryptography/ECDSA.sol#L112

/* See contracts/COMPILERS.md */
// solhint-disable-next-line
pragma solidity >=0.4.24 <0.9.0;


library ECDSA {
    /**
     * @dev Returns the address that signed a hashed message (`hash`).
     * This address can then be used for verification purposes.
     * Receives the `v`, `r` and `s` signature fields separately.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data.
     */
    function recover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) internal pure returns (address)
    {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        require(uint256(s) <= 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0, "ECDSA: invalid signature 's' value");

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        require(signer != address(0), "ECDSA: invalid signature");

        return signer;
    }

    /**
     * @dev Overload of `recover` that receives the `r` and `vs` short-signature fields separately.
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     */
    function recover(bytes32 hash, bytes32 r, bytes32 vs) internal pure returns (address) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return recover(hash, v, r, s);
    }
}

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

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_lido","type":"address"},{"internalType":"address","name":"_depositContract","type":"address"},{"internalType":"address","name":"_stakingRouter","type":"address"},{"internalType":"uint256","name":"_maxDepositsPerBlock","type":"uint256"},{"internalType":"uint256","name":"_minDepositBlockDistance","type":"uint256"},{"internalType":"uint256","name":"_pauseIntentValidityPeriodBlocks","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"DepositInactiveModule","type":"error"},{"inputs":[],"name":"DepositNoQuorum","type":"error"},{"inputs":[],"name":"DepositNonceChanged","type":"error"},{"inputs":[],"name":"DepositRootChanged","type":"error"},{"inputs":[],"name":"DepositTooFrequent","type":"error"},{"inputs":[],"name":"DepositUnexpectedBlockHash","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"DuplicateAddress","type":"error"},{"inputs":[],"name":"InvalidSignature","type":"error"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"NotAGuardian","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"NotAnOwner","type":"error"},{"inputs":[],"name":"PauseIntentExpired","type":"error"},{"inputs":[],"name":"SignaturesNotSorted","type":"error"},{"inputs":[{"internalType":"string","name":"field","type":"string"}],"name":"ZeroAddress","type":"error"},{"inputs":[{"internalType":"string","name":"parameter","type":"string"}],"name":"ZeroParameter","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"guardian","type":"address"},{"indexed":true,"internalType":"uint24","name":"stakingModuleId","type":"uint24"}],"name":"DepositsPaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint24","name":"stakingModuleId","type":"uint24"}],"name":"DepositsUnpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"GuardianQuorumChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MaxDepositsChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"MinDepositBlockDistanceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newValue","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"PauseIntentValidityPeriodBlocksChanged","type":"event"},{"inputs":[],"name":"ATTEST_MESSAGE_PREFIX","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEPOSIT_CONTRACT","outputs":[{"internalType":"contract IDepositContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LIDO","outputs":[{"internalType":"contract ILido","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSE_MESSAGE_PREFIX","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"STAKING_ROUTER","outputs":[{"internalType":"contract IStakingRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"addGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"addGuardians","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingModuleId","type":"uint256"}],"name":"canDeposit","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"bytes32","name":"blockHash","type":"bytes32"},{"internalType":"bytes32","name":"depositRoot","type":"bytes32"},{"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"internalType":"uint256","name":"nonce","type":"uint256"},{"internalType":"bytes","name":"depositCalldata","type":"bytes"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"vs","type":"bytes32"}],"internalType":"struct DepositSecurityModule.Signature[]","name":"sortedGuardianSignatures","type":"tuple[]"}],"name":"depositBufferedEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"getGuardianIndex","outputs":[{"internalType":"int256","name":"","type":"int256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGuardianQuorum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getGuardians","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxDeposits","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMinDepositBlockDistance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPauseIntentValidityPeriodBlocks","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isGuardian","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"blockNumber","type":"uint256"},{"internalType":"uint256","name":"stakingModuleId","type":"uint256"},{"components":[{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"vs","type":"bytes32"}],"internalType":"struct DepositSecurityModule.Signature","name":"sig","type":"tuple"}],"name":"pauseDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"newQuorum","type":"uint256"}],"name":"removeGuardian","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setGuardianQuorum","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMaxDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setMinDepositBlockDistance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newValue","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newValue","type":"uint256"}],"name":"setPauseIntentValidityPeriodBlocks","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"stakingModuleId","type":"uint256"}],"name":"unpauseDeposits","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6101206040523480156200001257600080fd5b50604051620022b0380380620022b0833981016040819052620000359162000433565b6001600160a01b0386166200007a5760405163eac0d38960e01b81526020600482015260056024820152645f6c69646f60d81b60448201526064015b60405180910390fd5b6001600160a01b038516620000c65760405163eac0d38960e01b815260206004820152601060248201526f17d9195c1bdcda5d10dbdb9d1c9858dd60821b604482015260640162000071565b6001600160a01b038416620001105760405163eac0d38960e01b815260206004820152600e60248201526d2fb9ba30b5b4b733a937baba32b960911b604482015260640162000071565b6001600160a01b0380871660c05284811660e0528516610100526040516200017e907f1085395a994e25b1b3d0ea7937b7395495fb405b31c7d22dbc3976a6bd01f2bf9046903090602001928352602083019190915260601b6001600160601b031916604082015260540190565b60408051601f1981840301815282825280516020918201206080527f9c4c40205558f12027f21204d6218b8006985b7a6359bcab15404bcc3e3fa12290830152469082015230606090811b6001600160601b0319169082015260740160408051601f19818403018152919052805160209091012060a05262000200336200022d565b6200020b83620002c7565b6200021682620002fd565b620002218162000390565b50505050505062000499565b6001600160a01b038116620002725760405163eac0d38960e01b81526020600482015260096024820152682fb732bba7bbb732b960b91b604482015260640162000071565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf36906020015b60405180910390a150565b60008190556040518181527f4d72502b63cfe737b98b225a53708fe347cf8274baed31e0c4e4941b758da99290602001620002bc565b806200034d57604051631fd43b6f60e21b815260206004820152601760248201527f6d696e4465706f736974426c6f636b44697374616e6365000000000000000000604482015260640162000071565b60015481146200038d5760018190556040518181527fdb69cbc4aa6648b506b7854c26807bfd811c27feaf97ac8847e3a66356cace1490602001620002bc565b50565b80620003e057604051631fd43b6f60e21b815260206004820152601f60248201527f7061757365496e74656e7456616c6964697479506572696f64426c6f636b7300604482015260640162000071565b60028190556040518181527f8120886d27fee35672e5d5a482d6c858105aebb26caf12178b8c0034fa88c2ba90602001620002bc565b80516001600160a01b03811681146200042e57600080fd5b919050565b60008060008060008060c087890312156200044d57600080fd5b620004588762000416565b9550620004686020880162000416565b9450620004786040880162000416565b9350606087015192506080870151915060a087015190509295509295509295565b60805160a05160c05160e05161010051611d69620005476000396000818161026d01526104b70152600081816103680152818161057e015281816106360152818161072c01528181610956015281816109fd01528181610aa301528181610c2f01528181610ccc01528181610daf0152610f2e0152600081816102d00152818161084a0152610b2301526000818161030a0152610e5801526000818161033901526112b10152611d696000f3fe608060405234801561001057600080fd5b50600436106101725760003560e01c80636b96736b116100de578063b7b7a40811610097578063c8a5f8e611610071578063c8a5f8e614610363578063c8f712d51461038a578063eccd085f1461039d578063f47610e6146103b057600080fd5b8063b7b7a4081461032c578063c6dda2c314610334578063c7062e981461035b57600080fd5b80636b96736b146102685780637e923312146102a7578063893d20e8146102ba5780638b21f170146102cb5780638d71a6f4146102f2578063a50833d61461030557600080fd5b806313af40351161013057806313af403514610201578063251e3a211461021457806339443b8e1461021c5780633bab964e1461022f5780633e6f6d68146102425780634acd54c31461025557600080fd5b8062fed90214610177578063062b662e1461018c5780630665f04b146101a35780630c68ba21146101b85780630df9a86d146101db578063111e5313146101ee575b600080fd5b61018a61018536600461186d565b6103c3565b005b6004545b6040519081526020015b60405180910390f35b6101ab610401565b60405161019a9190611886565b6101cb6101c63660046118ef565b610463565b604051901515815260200161019a565b61018a6101e936600461195d565b610485565b61018a6101fc366004611a2d565b6108c4565b61018a61020f3660046118ef565b610907565b600154610190565b6101cb61022a36600461186d565b61093d565b61018a61023d36600461186d565b610bec565b61018a61025036600461186d565b610d63565b61018a610263366004611aed565b610d99565b61028f7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161019a565b61018a6102b536600461186d565b610fd4565b6003546001600160a01b031661028f565b61028f7f000000000000000000000000000000000000000000000000000000000000000081565b61018a610300366004611a2d565b61100a565b6101907f000000000000000000000000000000000000000000000000000000000000000081565b600054610190565b6101907f000000000000000000000000000000000000000000000000000000000000000081565b600254610190565b61028f7f000000000000000000000000000000000000000000000000000000000000000081565b61018a610398366004611b23565b6111b9565b61018a6103ab36600461186d565b61122e565b6101906103be3660046118ef565b611264565b6003546001600160a01b031633146103f55760405163351c880f60e01b81523360048201526024015b60405180910390fd5b6103fe8161126f565b50565b6060600580548060200260200160405190810160405280929190818152602001828054801561045957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161043b575b5050505050905090565b6001600160a01b03811660009081526006602052604081205415155b92915050565b6004541580610495575060045481105b156104b357604051630833b4e360e41b815260040160405180910390fd5b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663c5f2892f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050e57600080fd5b505afa158015610522573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105469190611bd6565b9050808814610568576040516302d654b160e41b815260040160405180910390fd5b604051636608b11b60e01b8152600481018890527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636608b11b9060240160206040518083038186803b1580156105c857600080fd5b505afa1580156105dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106009190611bef565b61061d5760405163fa7f287160e01b815260040160405180910390fd5b60405163473e043360e01b8152600481018890526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063473e04339060240160206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611bd6565b6001549091506106c88243611c27565b10156106e757604051633ec3745360e11b815260040160405180910390fd5b8915806106f55750898b4014155b15610713576040516328aada8b60e21b815260040160405180910390fd5b604051630519fbbf60e01b8152600481018990526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630519fbbf9060240160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190611bd6565b90508088146107d057604051632e8f7e7360e11b815260040160405180910390fd5b6108308a8d8d8c8c8a8a808060200260200160405190810160405280939291908181526020016000905b828210156108265761081760408302860136819003810190611c3e565b815260200190600101906107fa565b50505050506112ab565b60005460405163aa0b7db760e01b81526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169163aa0b7db79161088491908d908c908c90600401611c5a565b600060405180830381600087803b15801561089e57600080fd5b505af11580156108b2573d6000803e3d6000fd5b50505050505050505050505050505050565b6003546001600160a01b031633146108f15760405163351c880f60e01b81523360048201526024016103ec565b6108fa826113f8565b6109038161150c565b5050565b6003546001600160a01b031633146109345760405163351c880f60e01b81523360048201526024016103ec565b6103fe8161154a565b6040516329cd0ca760e21b8152600481018290526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063a734329c9060240160206040518083038186803b1580156109a057600080fd5b505afa1580156109b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d89190611bef565b6109e457506000919050565b604051636608b11b60e01b8152600481018390526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636608b11b9060240160206040518083038186803b158015610a4757600080fd5b505afa158015610a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7f9190611bef565b60405163473e043360e01b8152600481018590529091506000906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063473e04339060240160206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190611bd6565b905060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e78a58756040518163ffffffff1660e01b815260040160206040518083038186803b158015610b7a57600080fd5b505afa158015610b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb29190611bef565b9050828015610bc357506000600454115b8015610bda5750600154610bd78343611c27565b10155b8015610be35750805b95945050505050565b6003546001600160a01b03163314610c195760405163351c880f60e01b81523360048201526024016103ec565b60405163e24ce9f160e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063e24ce9f19060240160206040518083038186803b158015610c7957600080fd5b505afa158015610c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb19190611bef565b156103fe57604051633618716160e21b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03169063d861c58490602401600060405180830381600087803b158015610d1857600080fd5b505af1158015610d2c573d6000803e3d6000fd5b505060405162ffffff841692507fb861fabb6dfce807f39e6f400693b8a826dcd89a4ce4ff8e955f6c4ddec398a39150600090a250565b6003546001600160a01b03163314610d905760405163351c880f60e01b81523360048201526024016103ec565b6103fe8161150c565b604051636608b11b60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636608b11b9060240160206040518083038186803b158015610df957600080fd5b505afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190611bef565b610e3a57505050565b336000610e46826115db565b9050806000191415610eec57604080517f0000000000000000000000000000000000000000000000000000000000000000602082015290810186905260608101859052600090608001604051602081830303815290604052805190602001209050610eba8185600001518660200151611600565b9250610ec5836115db565b9150816000191415610eea57604051638baa579f60e01b815260040160405180910390fd5b505b600254610ef98643611c27565b1115610f185760405163664af4ed60e01b815260040160405180910390fd5b60405163016fd57960e61b8152600481018590527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635bf55e4090602401600060405180830381600087803b158015610f7a57600080fd5b505af1158015610f8e573d6000803e3d6000fd5b505060405162ffffff871692506001600160a01b03851691507fa0b7f0a9bb410971c133acc48cc1b77dc067cb188643c832d0b11593f59c301b90600090a35050505050565b6003546001600160a01b031633146110015760405163351c880f60e01b81523360048201526024016103ec565b6103fe8161162a565b6003546001600160a01b031633146110375760405163351c880f60e01b81523360048201526024016103ec565b6001600160a01b03821660009081526006602052604090205480611079576040516302333ca160e51b81526001600160a01b03841660048201526024016103ec565b6005548082111561108c5761108c611c97565b80821461112257600060056110a2600184611c27565b815481106110b2576110b2611cad565b6000918252602090912001546001600160a01b031690508060056110d7600186611c27565b815481106110e7576110e7611cad565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526006909152604090208290555b6001600160a01b038416600090815260066020526040812055600580548061114c5761114c611cc3565b600082815260209020810160001990810180546001600160a01b03191690550190556111778361150c565b6040516001600160a01b03851681527fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529060200160405180910390a150505050565b6003546001600160a01b031633146111e65760405163351c880f60e01b81523360048201526024016103ec565b60005b82518110156112245761121483828151811061120757611207611cad565b60200260200101516113f8565b61121d81611cd9565b90506111e9565b506109038161150c565b6003546001600160a01b0316331461125b5760405163351c880f60e01b81523360048201526024016103ec565b6103fe816116b6565b600061047f826115db565b60008190556040518181527f4d72502b63cfe737b98b225a53708fe347cf8274baed31e0c4e4941b758da992906020015b60405180910390a150565b604080517f00000000000000000000000000000000000000000000000000000000000000006020820152908101869052606081018590526080810187905260a0810184905260c0810183905260009060e0016040516020818303038152906040528051906020012090506000805b83518110156113ed5760006113698486848151811061133a5761133a611cad565b60200260200101516000015187858151811061135857611358611cad565b602002602001015160200151611600565b905061138c816001600160a01b0316600090815260066020526040902054151590565b6113a957604051638baa579f60e01b815260040160405180910390fd5b826001600160a01b0316816001600160a01b0316116113db576040516301eba55160e01b815260040160405180910390fd5b91506113e681611cd9565b9050611319565b505050505050505050565b6001600160a01b03811661143e5760405163eac0d38960e01b815260206004820152600c60248201526b2fb732bba3bab0b93234b0b760a11b60448201526064016103ec565b6001600160a01b0381166000908152600660205260409020541561148057604051639f2277f360e01b81526001600160a01b03821660048201526024016103ec565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b038416908117909155905460008281526006602090815260409182902092909255519182527f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f96991016112a0565b80600454146103fe5760048190556040518181527f70d7432f2ec830b36e5b8c45176a8079968714429c4be85665c06ec1b8fde4bb906020016112a0565b6001600160a01b03811661158d5760405163eac0d38960e01b81526020600482015260096024820152682fb732bba7bbb732b960b91b60448201526064016103ec565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf36906020016112a0565b6001600160a01b03811660009081526006602052604081205461047f90600190611cf4565b60006001600160ff1b03821660ff83901c601b0161162086828785611739565b9695505050505050565b8061167857604051631fd43b6f60e21b815260206004820152601760248201527f6d696e4465706f736974426c6f636b44697374616e636500000000000000000060448201526064016103ec565b60015481146103fe5760018190556040518181527fdb69cbc4aa6648b506b7854c26807bfd811c27feaf97ac8847e3a66356cace14906020016112a0565b8061170457604051631fd43b6f60e21b815260206004820152601f60248201527f7061757365496e74656e7456616c6964697479506572696f64426c6f636b730060448201526064016103ec565b60028190556040518181527f8120886d27fee35672e5d5a482d6c858105aebb26caf12178b8c0034fa88c2ba906020016112a0565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156117b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016103ec565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801561180a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610be35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016103ec565b60006020828403121561187f57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156118c75783516001600160a01b0316835292840192918401916001016118a2565b50909695505050505050565b80356001600160a01b03811681146118ea57600080fd5b919050565b60006020828403121561190157600080fd5b61190a826118d3565b9392505050565b60008083601f84011261192357600080fd5b50813567ffffffffffffffff81111561193b57600080fd5b6020830191508360208260061b850101111561195657600080fd5b9250929050565b600080600080600080600080600060e08a8c03121561197b57600080fd5b8935985060208a0135975060408a0135965060608a0135955060808a0135945060a08a013567ffffffffffffffff808211156119b657600080fd5b818c0191508c601f8301126119ca57600080fd5b8135818111156119d957600080fd5b8d60208285010111156119eb57600080fd5b6020830196508095505060c08c0135915080821115611a0957600080fd5b50611a168c828d01611911565b915080935050809150509295985092959850929598565b60008060408385031215611a4057600080fd5b611a49836118d3565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611a9657611a96611a57565b604052919050565b600060408284031215611ab057600080fd5b6040516040810181811067ffffffffffffffff82111715611ad357611ad3611a57565b604052823581526020928301359281019290925250919050565b600080600060808486031215611b0257600080fd5b8335925060208401359150611b1a8560408601611a9e565b90509250925092565b60008060408385031215611b3657600080fd5b823567ffffffffffffffff80821115611b4e57600080fd5b818501915085601f830112611b6257600080fd5b8135602082821115611b7657611b76611a57565b8160051b9250611b87818401611a6d565b8281529284018101928181019089851115611ba157600080fd5b948201945b84861015611bc657611bb7866118d3565b82529482019490820190611ba6565b9997909101359750505050505050565b600060208284031215611be857600080fd5b5051919050565b600060208284031215611c0157600080fd5b8151801515811461190a57600080fd5b634e487b7160e01b600052601160045260246000fd5b600082821015611c3957611c39611c11565b500390565b600060408284031215611c5057600080fd5b61190a8383611a9e565b84815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000600019821415611ced57611ced611c11565b5060010190565b60008083128015600160ff1b850184121615611d1257611d12611c11565b6001600160ff1b0384018313811615611d2d57611d2d611c11565b5050039056fea2646970667358221220c67caad31e99e2d8c4f8bfd5c91287351d70825481939df9bad07689237cc68b64736f6c634300080900330000000000000000000000003f1c547b21f65e10480de3ad8e19faac46c950340000000000000000000000004242424242424242424242424242424242424242000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2290000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000019f6

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101725760003560e01c80636b96736b116100de578063b7b7a40811610097578063c8a5f8e611610071578063c8a5f8e614610363578063c8f712d51461038a578063eccd085f1461039d578063f47610e6146103b057600080fd5b8063b7b7a4081461032c578063c6dda2c314610334578063c7062e981461035b57600080fd5b80636b96736b146102685780637e923312146102a7578063893d20e8146102ba5780638b21f170146102cb5780638d71a6f4146102f2578063a50833d61461030557600080fd5b806313af40351161013057806313af403514610201578063251e3a211461021457806339443b8e1461021c5780633bab964e1461022f5780633e6f6d68146102425780634acd54c31461025557600080fd5b8062fed90214610177578063062b662e1461018c5780630665f04b146101a35780630c68ba21146101b85780630df9a86d146101db578063111e5313146101ee575b600080fd5b61018a61018536600461186d565b6103c3565b005b6004545b6040519081526020015b60405180910390f35b6101ab610401565b60405161019a9190611886565b6101cb6101c63660046118ef565b610463565b604051901515815260200161019a565b61018a6101e936600461195d565b610485565b61018a6101fc366004611a2d565b6108c4565b61018a61020f3660046118ef565b610907565b600154610190565b6101cb61022a36600461186d565b61093d565b61018a61023d36600461186d565b610bec565b61018a61025036600461186d565b610d63565b61018a610263366004611aed565b610d99565b61028f7f000000000000000000000000424242424242424242424242424242424242424281565b6040516001600160a01b03909116815260200161019a565b61018a6102b536600461186d565b610fd4565b6003546001600160a01b031661028f565b61028f7f0000000000000000000000003f1c547b21f65e10480de3ad8e19faac46c9503481565b61018a610300366004611a2d565b61100a565b6101907fdd244d9fdde3e6b6fe5af5a9b8516c29d9a2bfb15c3fd5740309f33d8d82d1e581565b600054610190565b6101907f4c5ce4a5b1abcdffc1471eb22f152e8ae479c2259a5f5b3929bc6637a47ebf5781565b600254610190565b61028f7f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe22981565b61018a610398366004611b23565b6111b9565b61018a6103ab36600461186d565b61122e565b6101906103be3660046118ef565b611264565b6003546001600160a01b031633146103f55760405163351c880f60e01b81523360048201526024015b60405180910390fd5b6103fe8161126f565b50565b6060600580548060200260200160405190810160405280929190818152602001828054801561045957602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831161043b575b5050505050905090565b6001600160a01b03811660009081526006602052604081205415155b92915050565b6004541580610495575060045481105b156104b357604051630833b4e360e41b815260040160405180910390fd5b60007f00000000000000000000000042424242424242424242424242424242424242426001600160a01b031663c5f2892f6040518163ffffffff1660e01b815260040160206040518083038186803b15801561050e57600080fd5b505afa158015610522573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105469190611bd6565b9050808814610568576040516302d654b160e41b815260040160405180910390fd5b604051636608b11b60e01b8152600481018890527f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b031690636608b11b9060240160206040518083038186803b1580156105c857600080fd5b505afa1580156105dc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106009190611bef565b61061d5760405163fa7f287160e01b815260040160405180910390fd5b60405163473e043360e01b8152600481018890526000907f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b03169063473e04339060240160206040518083038186803b15801561068057600080fd5b505afa158015610694573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106b89190611bd6565b6001549091506106c88243611c27565b10156106e757604051633ec3745360e11b815260040160405180910390fd5b8915806106f55750898b4014155b15610713576040516328aada8b60e21b815260040160405180910390fd5b604051630519fbbf60e01b8152600481018990526000907f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b031690630519fbbf9060240160206040518083038186803b15801561077657600080fd5b505afa15801561078a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ae9190611bd6565b90508088146107d057604051632e8f7e7360e11b815260040160405180910390fd5b6108308a8d8d8c8c8a8a808060200260200160405190810160405280939291908181526020016000905b828210156108265761081760408302860136819003810190611c3e565b815260200190600101906107fa565b50505050506112ab565b60005460405163aa0b7db760e01b81526001600160a01b037f0000000000000000000000003f1c547b21f65e10480de3ad8e19faac46c95034169163aa0b7db79161088491908d908c908c90600401611c5a565b600060405180830381600087803b15801561089e57600080fd5b505af11580156108b2573d6000803e3d6000fd5b50505050505050505050505050505050565b6003546001600160a01b031633146108f15760405163351c880f60e01b81523360048201526024016103ec565b6108fa826113f8565b6109038161150c565b5050565b6003546001600160a01b031633146109345760405163351c880f60e01b81523360048201526024016103ec565b6103fe8161154a565b6040516329cd0ca760e21b8152600481018290526000907f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b03169063a734329c9060240160206040518083038186803b1580156109a057600080fd5b505afa1580156109b4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109d89190611bef565b6109e457506000919050565b604051636608b11b60e01b8152600481018390526000907f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b031690636608b11b9060240160206040518083038186803b158015610a4757600080fd5b505afa158015610a5b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7f9190611bef565b60405163473e043360e01b8152600481018590529091506000906001600160a01b037f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe229169063473e04339060240160206040518083038186803b158015610ae557600080fd5b505afa158015610af9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b1d9190611bd6565b905060007f0000000000000000000000003f1c547b21f65e10480de3ad8e19faac46c950346001600160a01b031663e78a58756040518163ffffffff1660e01b815260040160206040518083038186803b158015610b7a57600080fd5b505afa158015610b8e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bb29190611bef565b9050828015610bc357506000600454115b8015610bda5750600154610bd78343611c27565b10155b8015610be35750805b95945050505050565b6003546001600160a01b03163314610c195760405163351c880f60e01b81523360048201526024016103ec565b60405163e24ce9f160e01b8152600481018290527f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b03169063e24ce9f19060240160206040518083038186803b158015610c7957600080fd5b505afa158015610c8d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cb19190611bef565b156103fe57604051633618716160e21b8152600481018290527f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b03169063d861c58490602401600060405180830381600087803b158015610d1857600080fd5b505af1158015610d2c573d6000803e3d6000fd5b505060405162ffffff841692507fb861fabb6dfce807f39e6f400693b8a826dcd89a4ce4ff8e955f6c4ddec398a39150600090a250565b6003546001600160a01b03163314610d905760405163351c880f60e01b81523360048201526024016103ec565b6103fe8161150c565b604051636608b11b60e01b8152600481018390527f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b031690636608b11b9060240160206040518083038186803b158015610df957600080fd5b505afa158015610e0d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e319190611bef565b610e3a57505050565b336000610e46826115db565b9050806000191415610eec57604080517fdd244d9fdde3e6b6fe5af5a9b8516c29d9a2bfb15c3fd5740309f33d8d82d1e5602082015290810186905260608101859052600090608001604051602081830303815290604052805190602001209050610eba8185600001518660200151611600565b9250610ec5836115db565b9150816000191415610eea57604051638baa579f60e01b815260040160405180910390fd5b505b600254610ef98643611c27565b1115610f185760405163664af4ed60e01b815260040160405180910390fd5b60405163016fd57960e61b8152600481018590527f000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2296001600160a01b031690635bf55e4090602401600060405180830381600087803b158015610f7a57600080fd5b505af1158015610f8e573d6000803e3d6000fd5b505060405162ffffff871692506001600160a01b03851691507fa0b7f0a9bb410971c133acc48cc1b77dc067cb188643c832d0b11593f59c301b90600090a35050505050565b6003546001600160a01b031633146110015760405163351c880f60e01b81523360048201526024016103ec565b6103fe8161162a565b6003546001600160a01b031633146110375760405163351c880f60e01b81523360048201526024016103ec565b6001600160a01b03821660009081526006602052604090205480611079576040516302333ca160e51b81526001600160a01b03841660048201526024016103ec565b6005548082111561108c5761108c611c97565b80821461112257600060056110a2600184611c27565b815481106110b2576110b2611cad565b6000918252602090912001546001600160a01b031690508060056110d7600186611c27565b815481106110e7576110e7611cad565b600091825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526006909152604090208290555b6001600160a01b038416600090815260066020526040812055600580548061114c5761114c611cc3565b600082815260209020810160001990810180546001600160a01b03191690550190556111778361150c565b6040516001600160a01b03851681527fb8107d0c6b40be480ce3172ee66ba6d64b71f6b1685a851340036e6e2e3e3c529060200160405180910390a150505050565b6003546001600160a01b031633146111e65760405163351c880f60e01b81523360048201526024016103ec565b60005b82518110156112245761121483828151811061120757611207611cad565b60200260200101516113f8565b61121d81611cd9565b90506111e9565b506109038161150c565b6003546001600160a01b0316331461125b5760405163351c880f60e01b81523360048201526024016103ec565b6103fe816116b6565b600061047f826115db565b60008190556040518181527f4d72502b63cfe737b98b225a53708fe347cf8274baed31e0c4e4941b758da992906020015b60405180910390a150565b604080517f4c5ce4a5b1abcdffc1471eb22f152e8ae479c2259a5f5b3929bc6637a47ebf576020820152908101869052606081018590526080810187905260a0810184905260c0810183905260009060e0016040516020818303038152906040528051906020012090506000805b83518110156113ed5760006113698486848151811061133a5761133a611cad565b60200260200101516000015187858151811061135857611358611cad565b602002602001015160200151611600565b905061138c816001600160a01b0316600090815260066020526040902054151590565b6113a957604051638baa579f60e01b815260040160405180910390fd5b826001600160a01b0316816001600160a01b0316116113db576040516301eba55160e01b815260040160405180910390fd5b91506113e681611cd9565b9050611319565b505050505050505050565b6001600160a01b03811661143e5760405163eac0d38960e01b815260206004820152600c60248201526b2fb732bba3bab0b93234b0b760a11b60448201526064016103ec565b6001600160a01b0381166000908152600660205260409020541561148057604051639f2277f360e01b81526001600160a01b03821660048201526024016103ec565b600580546001810182557f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db00180546001600160a01b0319166001600160a01b038416908117909155905460008281526006602090815260409182902092909255519182527f038596bb31e2e7d3d9f184d4c98b310103f6d7f5830e5eec32bffe6f1728f96991016112a0565b80600454146103fe5760048190556040518181527f70d7432f2ec830b36e5b8c45176a8079968714429c4be85665c06ec1b8fde4bb906020016112a0565b6001600160a01b03811661158d5760405163eac0d38960e01b81526020600482015260096024820152682fb732bba7bbb732b960b91b60448201526064016103ec565b600380546001600160a01b0319166001600160a01b0383169081179091556040519081527fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf36906020016112a0565b6001600160a01b03811660009081526006602052604081205461047f90600190611cf4565b60006001600160ff1b03821660ff83901c601b0161162086828785611739565b9695505050505050565b8061167857604051631fd43b6f60e21b815260206004820152601760248201527f6d696e4465706f736974426c6f636b44697374616e636500000000000000000060448201526064016103ec565b60015481146103fe5760018190556040518181527fdb69cbc4aa6648b506b7854c26807bfd811c27feaf97ac8847e3a66356cace14906020016112a0565b8061170457604051631fd43b6f60e21b815260206004820152601f60248201527f7061757365496e74656e7456616c6964697479506572696f64426c6f636b730060448201526064016103ec565b60028190556040518181527f8120886d27fee35672e5d5a482d6c858105aebb26caf12178b8c0034fa88c2ba906020016112a0565b60007f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08211156117b65760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016103ec565b6040805160008082526020820180845288905260ff871692820192909252606081018590526080810184905260019060a0016020604051602081039080840390855afa15801561180a573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b038116610be35760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016103ec565b60006020828403121561187f57600080fd5b5035919050565b6020808252825182820181905260009190848201906040850190845b818110156118c75783516001600160a01b0316835292840192918401916001016118a2565b50909695505050505050565b80356001600160a01b03811681146118ea57600080fd5b919050565b60006020828403121561190157600080fd5b61190a826118d3565b9392505050565b60008083601f84011261192357600080fd5b50813567ffffffffffffffff81111561193b57600080fd5b6020830191508360208260061b850101111561195657600080fd5b9250929050565b600080600080600080600080600060e08a8c03121561197b57600080fd5b8935985060208a0135975060408a0135965060608a0135955060808a0135945060a08a013567ffffffffffffffff808211156119b657600080fd5b818c0191508c601f8301126119ca57600080fd5b8135818111156119d957600080fd5b8d60208285010111156119eb57600080fd5b6020830196508095505060c08c0135915080821115611a0957600080fd5b50611a168c828d01611911565b915080935050809150509295985092959850929598565b60008060408385031215611a4057600080fd5b611a49836118d3565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611a9657611a96611a57565b604052919050565b600060408284031215611ab057600080fd5b6040516040810181811067ffffffffffffffff82111715611ad357611ad3611a57565b604052823581526020928301359281019290925250919050565b600080600060808486031215611b0257600080fd5b8335925060208401359150611b1a8560408601611a9e565b90509250925092565b60008060408385031215611b3657600080fd5b823567ffffffffffffffff80821115611b4e57600080fd5b818501915085601f830112611b6257600080fd5b8135602082821115611b7657611b76611a57565b8160051b9250611b87818401611a6d565b8281529284018101928181019089851115611ba157600080fd5b948201945b84861015611bc657611bb7866118d3565b82529482019490820190611ba6565b9997909101359750505050505050565b600060208284031215611be857600080fd5b5051919050565b600060208284031215611c0157600080fd5b8151801515811461190a57600080fd5b634e487b7160e01b600052601160045260246000fd5b600082821015611c3957611c39611c11565b500390565b600060408284031215611c5057600080fd5b61190a8383611a9e565b84815283602082015260606040820152816060820152818360808301376000818301608090810191909152601f909201601f191601019392505050565b634e487b7160e01b600052600160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b6000600019821415611ced57611ced611c11565b5060010190565b60008083128015600160ff1b850184121615611d1257611d12611c11565b6001600160ff1b0384018313811615611d2d57611d2d611c11565b5050039056fea2646970667358221220c67caad31e99e2d8c4f8bfd5c91287351d70825481939df9bad07689237cc68b64736f6c63430008090033

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

0000000000000000000000003f1c547b21f65e10480de3ad8e19faac46c950340000000000000000000000004242424242424242424242424242424242424242000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe2290000000000000000000000000000000000000000000000000000000000000096000000000000000000000000000000000000000000000000000000000000000500000000000000000000000000000000000000000000000000000000000019f6

-----Decoded View---------------
Arg [0] : _lido (address): 0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034
Arg [1] : _depositContract (address): 0x4242424242424242424242424242424242424242
Arg [2] : _stakingRouter (address): 0xd6EbF043D30A7fe46D1Db32BA90a0A51207FE229
Arg [3] : _maxDepositsPerBlock (uint256): 150
Arg [4] : _minDepositBlockDistance (uint256): 5
Arg [5] : _pauseIntentValidityPeriodBlocks (uint256): 6646

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000003f1c547b21f65e10480de3ad8e19faac46c95034
Arg [1] : 0000000000000000000000004242424242424242424242424242424242424242
Arg [2] : 000000000000000000000000d6ebf043d30a7fe46d1db32ba90a0a51207fe229
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000096
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [5] : 00000000000000000000000000000000000000000000000000000000000019f6


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
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.