Holesky Testnet

Contract

0xD26004b2DB8e2e17e074EedE115bF200cb5D10d9

Overview

ETH Balance

2,992.549580069 ETH

Multichain Info

N/A
Transaction Hash
Method
Block
From
To
Pay Rewards9765722024-02-19 10:41:48299 days ago1708339308IN
0xD26004b2...0cb5D10d9
0 ETH0.000239322.49439037
Add Admin8198932024-01-27 6:59:48322 days ago1706338788IN
0xD26004b2...0cb5D10d9
0 ETH0.00021694.1094114

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Block
From
To
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
10797782024-03-05 21:43:24283 days ago1709675004
0xD26004b2...0cb5D10d9
32 ETH
View All Internal Transactions
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WagyuStaker

Compiler Version
v0.8.21+commit.d9974bed

Optimization Enabled:
Yes with 512 runs

Other Settings:
paris EvmVersion

Contract Source Code (Solidity Standard Json-Input format)

File 1 of 8 : WagyuStaker.sol
/// SPDX-License-Identifier: SSPL-1.-0

/**
 * @custom:org.protocol='mevETH LST Protocol'
 * @custom:org.security='mailto:[email protected]'
 * @custom:org.vcs-commit=$GIT_COMMIT_SHA
 * @custom:org.vendor='CommodityStream, Inc'
 * @custom:org.schema-version="1.0"
 * @custom.org.encryption="manifoldfinance.com/.well-known/pgp-key.asc"
 * @custom:org.preferred-languages="en"
 */

pragma solidity ^0.8.19;

import { ITinyMevEth } from "./interfaces/ITinyMevEth.sol";
import { IStakingModule } from "./interfaces/IStakingModule.sol";
import { IBeaconDepositContract } from "./interfaces/IBeaconDepositContract.sol";
import { SafeTransferLib } from "solmate/utils/SafeTransferLib.sol";
import { Auth } from "./libraries/Auth.sol";
import { ERC20 } from "solmate/tokens/ERC20.sol";
import { MevEthErrors } from "./interfaces/Errors.sol";

/// @title 🥩 Wagyu Staker 🥩
/// @dev This contract stakes Ether inside of the BeaconChainDepositContract directly
contract WagyuStaker is Auth, IStakingModule {
    using SafeTransferLib for ERC20;

    struct Record {
        uint128 totalDeposited;
        uint128 totalWithdrawn;
        uint128 totalRewardsPaid;
        uint128 totalValidatorExitsPaid;
    }

    /// @notice Record of total deposits, withdraws, rewards paid and validators exited
    Record public record;
    /// @notice The number of validators on the consensus layer registered under this contract
    uint256 public validators;
    /// @notice The address of the MevEth contract
    address public mevEth;
    /// @notice Validator deposit size.
    uint256 public constant override VALIDATOR_DEPOSIT_SIZE = 32 ether;
    /// @notice The Canonical Address of the BeaconChainDepositContract
    IBeaconDepositContract public immutable BEACON_CHAIN_DEPOSIT_CONTRACT;

    /// @notice Event emitted when a validator is registered
    event NewValidator(address indexed operator, bytes pubkey, bytes32 withdrawalCredentials, bytes signature, bytes32 deposit_data_root);
    /// @notice Event emitted when tokens are recovered from the contract.
    event TokenRecovered(address indexed recipient, address indexed token, uint256 indexed amount);
    /// @notice Event emitted when rewards are paid to the MevEth contract.
    event RewardsPaid(uint256 indexed amount);
    /// @notice Event emitted when funds representing a validator withdrawal are sent to the MevEth contract.
    event ValidatorWithdraw(address sender, uint256 amount);
    /// @notice Event emitted when the mevEth address is updated.
    event MevEthUpdated(address indexed meveth);

    /// @notice Construction sets authority, MevEth, and deposit contract addresses
    /// @param _authority The address of the controlling admin authority
    /// @param _depositContract The address of the beacon deposit contract
    /// @param _mevEth The address of the mevETH contract
    constructor(address _authority, address _depositContract, address _mevEth) Auth(_authority) {
        mevEth = _mevEth;
        BEACON_CHAIN_DEPOSIT_CONTRACT = IBeaconDepositContract(_depositContract);
    }

    /// @notice Function to deposit funds into the BEACON_CHAIN_DEPOSIT_CONTRACT, and register a validator
    function deposit(IStakingModule.ValidatorData calldata data, bytes32 latestDepositRoot) external payable {
        // Only the MevEth contract can call this function
        if (msg.sender != mevEth) {
            revert MevEthErrors.UnAuthorizedCaller();
        }
        // Ensure the deposit amount is equal to the VALIDATOR_DEPOSIT_SIZE
        if (msg.value != VALIDATOR_DEPOSIT_SIZE) {
            revert MevEthErrors.WrongDepositAmount();
        }
        if (BEACON_CHAIN_DEPOSIT_CONTRACT.get_deposit_root() != latestDepositRoot) {
            revert MevEthErrors.DepositWasFrontrun();
        }

        // Update the contract balance and validator count
        unchecked {
            record.totalDeposited += uint128(VALIDATOR_DEPOSIT_SIZE);
            validators += 1;
        }

        // Deposit the funds into the BeaconChainDepositContract
        BEACON_CHAIN_DEPOSIT_CONTRACT.deposit{ value: VALIDATOR_DEPOSIT_SIZE }(
            data.pubkey, abi.encodePacked(data.withdrawal_credentials), data.signature, data.deposit_data_root
        );

        // Emit an event inidicating a new validator has been registered, allowing for offchain listeners to track the validator registry
        emit NewValidator(data.operator, data.pubkey, data.withdrawal_credentials, data.signature, data.deposit_data_root);
    }

    /// @notice Function to pay rewards to the MevEth contract
    /// @dev Only callable by an operator
    /// @param rewards rewards to pay to the MevEth contract
    function payRewards(uint256 rewards) external onlyOperator {
        if (rewards > address(this).balance) revert MevEthErrors.NotEnoughEth();

        unchecked {
            record.totalRewardsPaid += uint128(rewards);
            // lagging withdrawn indicator, as including in receive can cause transfer out of gas
            record.totalWithdrawn += uint128(rewards);
        }

        // Send the rewards to the MevEth contract
        ITinyMevEth(mevEth).grantRewards{ value: rewards }();

        // Emit an event to track the rewards paid
        emit RewardsPaid(rewards);
    }

    function registerExit() external {
        // Only the MevEth contract can call this function
        if (msg.sender != mevEth) {
            revert MevEthErrors.UnAuthorizedCaller();
        }
        uint128 exitSize = uint128(VALIDATOR_DEPOSIT_SIZE);
        unchecked {
            record.totalValidatorExitsPaid += exitSize;
            // lagging withdrawn indicator, as including in receive can cause transfer out of gas
            record.totalWithdrawn += exitSize;
        }
        if (validators > 0) {
            unchecked {
                validators -= 1;
            }
        }
    }

    /// @notice Function to pay MevEth when withdrawing funds from a validator
    /// @dev This function is only callable by an operator and emits an event for offchain validator registry tracking.
    function payValidatorWithdraw() external onlyOperator {
        uint256 exitSize = VALIDATOR_DEPOSIT_SIZE;
        if (exitSize > address(this).balance) revert MevEthErrors.NotEnoughEth();
        ITinyMevEth(mevEth).grantValidatorWithdraw{ value: exitSize }();
        emit ValidatorWithdraw(msg.sender, exitSize);
    }

    /// @notice Function to recover tokens sent to the contract.
    /// @dev This function is only callable by an admin.
    function recoverToken(address token, address recipient, uint256 amount) external onlyAdmin {
        ERC20(token).safeTransfer(recipient, amount);
        emit TokenRecovered(recipient, token, amount);
    }

    /// @notice Function to set a new mevEth address.
    function setNewMevEth(address newMevEth) external onlyAdmin {
        if (newMevEth == address(0)) {
            revert MevEthErrors.ZeroAddress();
        }
        mevEth = newMevEth;
        emit MevEthUpdated(newMevEth);
    }

    /// @notice Batch register Validators for migration
    /// @dev only Admin
    /// @param batchData list of each validators' data struct
    function batchMigrate(IStakingModule.ValidatorData[] calldata batchData) external onlyAdmin {
        uint256 length = batchData.length;
        // Update the contract balance and validator count
        unchecked {
            record.totalDeposited += uint128(length * VALIDATOR_DEPOSIT_SIZE);
            validators += length;
        }

        for (uint256 i = 0; i < length;) {
            IStakingModule.ValidatorData calldata data = batchData[i];
            // Emit an event inidicating a new validator has been registered, allowing for offchain listeners to track the validator registry
            emit NewValidator(data.operator, data.pubkey, data.withdrawal_credentials, data.signature, data.deposit_data_root);
            unchecked {
                ++i;
            }
        }
    }

    /// @notice Function to receive Ether
    receive() external payable { }
}

File 2 of 8 : ITinyMevEth.sol
/// SPDX-License-Identifier: SSPL-1.-0

/**
 * @custom:org.protocol='mevETH LST Protocol'
 * @custom:org.security='mailto:[email protected]'
 * @custom:org.vcs-commit=$GIT_COMMIT_SHA
 * @custom:org.vendor='CommodityStream, Inc'
 * @custom:org.schema-version="1.0"
 * @custom.org.encryption="manifoldfinance.com/.well-known/pgp-key.asc"
 * @custom:org.preferred-languages="en"
 */

pragma solidity ^0.8.19;

/// @title TinyMevEth
/// @notice smol interface for interacting with MevEth
interface ITinyMevEth {
    /**
     * @dev Function to grant rewards to other users.
     * @notice This function is payable and should be called with the amount of rewards to be granted.
     */
    function grantRewards() external payable;
    /**
     * @dev Function to allow a validator to withdraw funds from the contract.
     * @notice This function must be called with a validator address and a payable amount.
     */
    function grantValidatorWithdraw() external payable;
}

File 3 of 8 : IStakingModule.sol
/// SPDX-License-Identifier: SSPL-1.-0

/**
 * @custom:org.protocol='mevETH LST Protocol'
 * @custom:org.security='mailto:[email protected]'
 * @custom:org.vcs-commit=$GIT_COMMIT_SHA
 * @custom:org.vendor='CommodityStream, Inc'
 * @custom:org.schema-version="1.0"
 * @custom.org.encryption="manifoldfinance.com/.well-known/pgp-key.asc"
 * @custom:org.preferred-languages="en"
 */

pragma solidity ^0.8.19;

interface IStakingModule {
    /**
     * @dev Structure for passing information about the validator deposit data.
     * @param operator - address of the operator.
     * @param pubkey - BLS public key of the validator, generated by the operator.
     * @param withdrawal_credentials - withdrawal credentials used for generating the deposit data.
     * @param signature - BLS signature of the validator, generated by the operator.
     * @param deposit_data_root - hash tree root of the deposit data, generated by the operator.
     */
    struct ValidatorData {
        address operator;
        bytes pubkey;
        bytes32 withdrawal_credentials;
        bytes signature;
        bytes32 deposit_data_root; // more efficient to be calculated off-chain
    }

    /**
     * @dev Allows users to deposit funds into the contract.
     * @param data ValidatorData calldata containing the validator's public key, withdrawal credentials, and amount of tokens to be deposited.
     * @param latestDepositRoot bytes32 containing the latest deposit root.
     */
    function deposit(ValidatorData calldata data, bytes32 latestDepositRoot) external payable;

    function validators() external view returns (uint256);

    function mevEth() external view returns (address);

    /**
     * @notice VALIDATOR_DEPOSIT_SIZE()
     *
     * This function returns the size of the validator deposit.
     *
     * @dev This function is used to determine the size of the validator deposit. It is used to ensure that validators have the correct amount of funds in order
     * to participate in the network.
     */
    function VALIDATOR_DEPOSIT_SIZE() external view returns (uint256);

    // onlyAdmin Functions
    /**
     * @notice This function is used to pay rewards to the users.
     * @dev This function is used to pay rewards to the users. It takes in a uint256 rewards parameter which is the amount of rewards to be paid.
     */
    function payRewards(uint256 rewards) external;
    /**
     * @notice This function allows a validator to withdraw their rewards from the contract.
     * @dev This function is called by a validator to withdraw their rewards from the contract. It will transfer the rewards to the validator's address.
     */
    function payValidatorWithdraw() external;
    function recoverToken(address token, address recipient, uint256 amount) external;
    /**
     * @notice record() function is used to record the data in the smart contract.
     * @dev record() function takes no parameters and returns four uint128 values.
     */
    function record() external returns (uint128, uint128, uint128, uint128);
    /**
     * @notice registerExit() allows users to exit the system.
     * @dev registerExit() is a function that allows users to exit the system. It is triggered by an external call.
     */
    function registerExit() external;

    function batchMigrate(IStakingModule.ValidatorData[] calldata batchData) external;
}

File 4 of 8 : IBeaconDepositContract.sol
/// SPDX-License-Identifier: SSPL-1.-0

/**
 * @custom:org.protocol='mevETH LST Protocol'
 * @custom:org.security='mailto:[email protected]'
 * @custom:org.vcs-commit=$GIT_COMMIT_SHA
 * @custom:org.vendor='CommodityStream, Inc'
 * @custom:org.schema-version="1.0"
 * @custom.org.encryption="manifoldfinance.com/.well-known/pgp-key.asc"
 * @custom:org.preferred-languages="en"
 */

pragma solidity ^0.8.19;

/// Interface for the Beacon Chain Deposit Contract
interface IBeaconDepositContract {
    /// @notice Submit a Phase 0 DepositData object.
    /// @param pubkey A BLS12-381 public key.
    /// @param withdrawal_credentials Commitment to a public key for withdrawals.
    /// @param signature A BLS12-381 signature.
    /// @param deposit_data_root The SHA-256 hash of the SSZ-encoded DepositData object.

    /// Used as a protection against malformed input.
    function deposit(bytes calldata pubkey, bytes calldata withdrawal_credentials, bytes calldata signature, bytes32 deposit_data_root) external payable;

    /// @notice Query the current deposit root hash.
    /// @return The deposit root hash.
    function get_deposit_root() external view returns (bytes32);
}

File 5 of 8 : SafeTransferLib.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

import {ERC20} from "../tokens/ERC20.sol";

/// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/SafeTransferLib.sol)
/// @dev Caution! This library won't check that a token has code, responsibility is delegated to the caller.
library SafeTransferLib {
    /*//////////////////////////////////////////////////////////////
                             ETH OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferETH(address to, uint256 amount) internal {
        bool success;

        assembly {
            // Transfer the ETH and store if it succeeded or not.
            success := call(gas(), to, amount, 0, 0, 0, 0)
        }

        require(success, "ETH_TRANSFER_FAILED");
    }

    /*//////////////////////////////////////////////////////////////
                            ERC20 OPERATIONS
    //////////////////////////////////////////////////////////////*/

    function safeTransferFrom(
        ERC20 token,
        address from,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // We'll write our calldata to this slot below, but restore it later.
            let memPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(0, 0x23b872dd00000000000000000000000000000000000000000000000000000000)
            mstore(4, from) // Append the "from" argument.
            mstore(36, to) // Append the "to" argument.
            mstore(68, amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 100 because that's the total length of our calldata (4 + 32 * 3)
                // Counterintuitively, this call() must be positioned after the or() in the
                // surrounding and() because and() evaluates its arguments from right to left.
                call(gas(), token, 0, 0, 100, 0, 32)
            )

            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, memPointer) // Restore the memPointer.
        }

        require(success, "TRANSFER_FROM_FAILED");
    }

    function safeTransfer(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // We'll write our calldata to this slot below, but restore it later.
            let memPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(0, 0xa9059cbb00000000000000000000000000000000000000000000000000000000)
            mstore(4, to) // Append the "to" argument.
            mstore(36, amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because that's the total length of our calldata (4 + 32 * 2)
                // Counterintuitively, this call() must be positioned after the or() in the
                // surrounding and() because and() evaluates its arguments from right to left.
                call(gas(), token, 0, 0, 68, 0, 32)
            )

            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, memPointer) // Restore the memPointer.
        }

        require(success, "TRANSFER_FAILED");
    }

    function safeApprove(
        ERC20 token,
        address to,
        uint256 amount
    ) internal {
        bool success;

        assembly {
            // We'll write our calldata to this slot below, but restore it later.
            let memPointer := mload(0x40)

            // Write the abi-encoded calldata into memory, beginning with the function selector.
            mstore(0, 0x095ea7b300000000000000000000000000000000000000000000000000000000)
            mstore(4, to) // Append the "to" argument.
            mstore(36, amount) // Append the "amount" argument.

            success := and(
                // Set success to whether the call reverted, if not we check it either
                // returned exactly 1 (can't just be non-zero data), or had no return data.
                or(and(eq(mload(0), 1), gt(returndatasize(), 31)), iszero(returndatasize())),
                // We use 68 because that's the total length of our calldata (4 + 32 * 2)
                // Counterintuitively, this call() must be positioned after the or() in the
                // surrounding and() because and() evaluates its arguments from right to left.
                call(gas(), token, 0, 0, 68, 0, 32)
            )

            mstore(0x60, 0) // Restore the zero slot to zero.
            mstore(0x40, memPointer) // Restore the memPointer.
        }

        require(success, "APPROVE_FAILED");
    }
}

File 6 of 8 : Auth.sol
/// SPDX-License-Identifier: SSPL-1.-0

/**
 * @custom:org.protocol='mevETH LST Protocol'
 * @custom:org.security='mailto:[email protected]'
 * @custom:org.vcs-commit=$GIT_COMMIT_SHA
 * @custom:org.vendor='CommodityStream, Inc'
 * @custom:org.schema-version="1.0"
 * @custom.org.encryption="manifoldfinance.com/.well-known/pgp-key.asc"
 * @custom:org.preferred-languages="en"
 */

pragma solidity ^0.8.19;

contract Auth {
    error Unauthorized();
    error AlreadySet();
    error NoAdmin();

    event AdminAdded(address indexed newAdmin);
    event AdminDeleted(address indexed oldAdmin);
    event OperatorAdded(address indexed newOperator);
    event OperatorDeleted(address indexed oldOperator);

    // admin counter (assuming 255 admins to be max)
    uint8 adminsCounter;

    // Keeps track of all operators
    mapping(address => bool) public operators;

    // Keeps track of all admins
    mapping(address => bool) public admins;

    /**
     * @notice This constructor sets the initialAdmin address as an admin and operator.
     * @dev The adminsCounter is incremented unchecked.
     */
    constructor(address initialAdmin) {
        admins[initialAdmin] = true;
        unchecked {
            ++adminsCounter;
        }
        operators[initialAdmin] = true;
    }

    /*//////////////////////////////////////////////////////////////
                           Access Control Modifiers
    //////////////////////////////////////////////////////////////*/

    modifier onlyAdmin() {
        if (!admins[msg.sender]) {
            revert Unauthorized();
        }
        _;
    }

    modifier onlyOperator() {
        if (!operators[msg.sender]) {
            revert Unauthorized();
        }
        _;
    }

    /*//////////////////////////////////////////////////////////////
                           Maintenance Functions
    //////////////////////////////////////////////////////////////*/
    /**
     * @notice addAdmin() function allows an admin to add a new admin to the contract.
     * @dev This function is only accessible to the existing admins and requires the address of the new admin.
     * If the new admin is already set, the function will revert. Otherwise, the adminsCounter will be incremented and the new admin will be added to the admins
     * mapping. An AdminAdded event will be emitted.
     */
    function addAdmin(address newAdmin) external onlyAdmin {
        if (admins[newAdmin]) revert AlreadySet();
        ++adminsCounter;
        admins[newAdmin] = true;
        emit AdminAdded(newAdmin);
    }

    /**
     * @notice Deletes an admin from the list of admins.
     * @dev Only admins can delete other admins. If the adminsCounter is 0, the transaction will revert.
     */
    function deleteAdmin(address oldAdmin) external onlyAdmin {
        if (!admins[oldAdmin]) revert AlreadySet();
        --adminsCounter;
        if (adminsCounter == 0) revert NoAdmin();
        admins[oldAdmin] = false;
        emit AdminDeleted(oldAdmin);
    }

    /**
     * @notice Adds a new operator to the list of operators
     * @dev Only the admin can add a new operator
     * @param newOperator The address of the new operator
     */
    function addOperator(address newOperator) external onlyAdmin {
        if (operators[newOperator]) revert AlreadySet();
        operators[newOperator] = true;
        emit OperatorAdded(newOperator);
    }

    function deleteOperator(address oldOperator) external onlyAdmin {
        if (!operators[oldOperator]) revert AlreadySet();
        operators[oldOperator] = false;
        emit OperatorDeleted(oldOperator);
    }
}

File 7 of 8 : ERC20.sol
// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/// @notice Modern and gas efficient ERC20 + EIP-2612 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC20.sol)
/// @author Modified from Uniswap (https://github.com/Uniswap/uniswap-v2-core/blob/master/contracts/UniswapV2ERC20.sol)
/// @dev Do not manually set balances without updating totalSupply, as the sum of all user balances must not exceed it.
abstract contract ERC20 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 amount);

    event Approval(address indexed owner, address indexed spender, uint256 amount);

    /*//////////////////////////////////////////////////////////////
                            METADATA STORAGE
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    uint8 public immutable decimals;

    /*//////////////////////////////////////////////////////////////
                              ERC20 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 public totalSupply;

    mapping(address => uint256) public balanceOf;

    mapping(address => mapping(address => uint256)) public allowance;

    /*//////////////////////////////////////////////////////////////
                            EIP-2612 STORAGE
    //////////////////////////////////////////////////////////////*/

    uint256 internal immutable INITIAL_CHAIN_ID;

    bytes32 internal immutable INITIAL_DOMAIN_SEPARATOR;

    mapping(address => uint256) public nonces;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals
    ) {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;

        INITIAL_CHAIN_ID = block.chainid;
        INITIAL_DOMAIN_SEPARATOR = computeDomainSeparator();
    }

    /*//////////////////////////////////////////////////////////////
                               ERC20 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 amount) public virtual returns (bool) {
        allowance[msg.sender][spender] = amount;

        emit Approval(msg.sender, spender, amount);

        return true;
    }

    function transfer(address to, uint256 amount) public virtual returns (bool) {
        balanceOf[msg.sender] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(msg.sender, to, amount);

        return true;
    }

    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual returns (bool) {
        uint256 allowed = allowance[from][msg.sender]; // Saves gas for limited approvals.

        if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;

        balanceOf[from] -= amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(from, to, amount);

        return true;
    }

    /*//////////////////////////////////////////////////////////////
                             EIP-2612 LOGIC
    //////////////////////////////////////////////////////////////*/

    function permit(
        address owner,
        address spender,
        uint256 value,
        uint256 deadline,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) public virtual {
        require(deadline >= block.timestamp, "PERMIT_DEADLINE_EXPIRED");

        // Unchecked because the only math done is incrementing
        // the owner's nonce which cannot realistically overflow.
        unchecked {
            address recoveredAddress = ecrecover(
                keccak256(
                    abi.encodePacked(
                        "\x19\x01",
                        DOMAIN_SEPARATOR(),
                        keccak256(
                            abi.encode(
                                keccak256(
                                    "Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)"
                                ),
                                owner,
                                spender,
                                value,
                                nonces[owner]++,
                                deadline
                            )
                        )
                    )
                ),
                v,
                r,
                s
            );

            require(recoveredAddress != address(0) && recoveredAddress == owner, "INVALID_SIGNER");

            allowance[recoveredAddress][spender] = value;
        }

        emit Approval(owner, spender, value);
    }

    function DOMAIN_SEPARATOR() public view virtual returns (bytes32) {
        return block.chainid == INITIAL_CHAIN_ID ? INITIAL_DOMAIN_SEPARATOR : computeDomainSeparator();
    }

    function computeDomainSeparator() internal view virtual returns (bytes32) {
        return
            keccak256(
                abi.encode(
                    keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                    keccak256(bytes(name)),
                    keccak256("1"),
                    block.chainid,
                    address(this)
                )
            );
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 amount) internal virtual {
        totalSupply += amount;

        // Cannot overflow because the sum of all user
        // balances can't exceed the max uint256 value.
        unchecked {
            balanceOf[to] += amount;
        }

        emit Transfer(address(0), to, amount);
    }

    function _burn(address from, uint256 amount) internal virtual {
        balanceOf[from] -= amount;

        // Cannot underflow because a user's balance
        // will never be larger than the total supply.
        unchecked {
            totalSupply -= amount;
        }

        emit Transfer(from, address(0), amount);
    }
}

File 8 of 8 : Errors.sol
/// SPDX-License-Identifier: SSPL-1.-0

/**
 * @custom:org.protocol='mevETH LST Protocol'
 * @custom:org.security='mailto:[email protected]'
 * @custom:org.vcs-commit=$GIT_COMMIT_SHA
 * @custom:org.vendor='CommodityStream, Inc'
 * @custom:org.schema-version="1.0"
 * @custom.org.encryption="manifoldfinance.com/.well-known/pgp-key.asc"
 * @custom:org.preferred-languages="en"
 */

pragma solidity ^0.8.19;

interface MevEthErrors {
    /// Errors
    error StakingPaused();
    error NotEnoughEth();
    error ZeroValue();
    error InvalidOperator();
    error DepositTooSmall();
    error InvalidSender();
    error PrematureStakingModuleUpdateFinalization();
    error PrematureMevEthShareVaultUpdateFinalization();
    error InvalidPendingStakingModule();
    error InvalidPendingMevEthShareVault();
    error TransferExceedsAllowance();
    error TransferFailed();
    error ZeroAddress();
    error AlreadyInitialized();
    error SendError();
    error FeesTooHigh();
    error WrongDepositAmount();
    error WrongWithdrawAmount();
    error UnAuthorizedCaller();
    error WithdrawTooSmall();
    error NotFinalised();
    error AlreadyClaimed();
    error AlreadyFinalised();
    error IndexExceedsQueueLength();
    error DepositWasFrontrun();
    error SandwichProtection();
    error NonZeroVaultBalance();
    error AlreadyDeposited();
    error IncorrectWithdrawalCredentials();
}

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solmate/=lib/solmate/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "safe-contracts/=lib/safe-tools/lib/safe-contracts/contracts/",
    "safe-tools/=lib/safe-tools/src/",
    "properties/=lib/properties/contracts/",
    "solady/utils/=lib/solady/src/utils/",
    "forge-safe/=lib/forge-safe/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 512,
    "details": {
      "constantOptimizer": true,
      "yul": true,
      "yulDetails": {
        "stackAllocation": true
      }
    }
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "viaIR": true,
  "libraries": {}
}

Contract ABI

[{"inputs":[{"internalType":"address","name":"_authority","type":"address"},{"internalType":"address","name":"_depositContract","type":"address"},{"internalType":"address","name":"_mevEth","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadySet","type":"error"},{"inputs":[],"name":"DepositWasFrontrun","type":"error"},{"inputs":[],"name":"NoAdmin","type":"error"},{"inputs":[],"name":"NotEnoughEth","type":"error"},{"inputs":[],"name":"UnAuthorizedCaller","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"WrongDepositAmount","type":"error"},{"inputs":[],"name":"ZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newAdmin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldAdmin","type":"address"}],"name":"AdminDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"meveth","type":"address"}],"name":"MevEthUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bytes","name":"pubkey","type":"bytes"},{"indexed":false,"internalType":"bytes32","name":"withdrawalCredentials","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"signature","type":"bytes"},{"indexed":false,"internalType":"bytes32","name":"deposit_data_root","type":"bytes32"}],"name":"NewValidator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOperator","type":"address"}],"name":"OperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOperator","type":"address"}],"name":"OperatorDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardsPaid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":true,"internalType":"address","name":"token","type":"address"},{"indexed":true,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"TokenRecovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ValidatorWithdraw","type":"event"},{"inputs":[],"name":"BEACON_CHAIN_DEPOSIT_CONTRACT","outputs":[{"internalType":"contract IBeaconDepositContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"VALIDATOR_DEPOSIT_SIZE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newAdmin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOperator","type":"address"}],"name":"addOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"admins","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes","name":"pubkey","type":"bytes"},{"internalType":"bytes32","name":"withdrawal_credentials","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32","name":"deposit_data_root","type":"bytes32"}],"internalType":"struct IStakingModule.ValidatorData[]","name":"batchData","type":"tuple[]"}],"name":"batchMigrate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldAdmin","type":"address"}],"name":"deleteAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"oldOperator","type":"address"}],"name":"deleteOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bytes","name":"pubkey","type":"bytes"},{"internalType":"bytes32","name":"withdrawal_credentials","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"},{"internalType":"bytes32","name":"deposit_data_root","type":"bytes32"}],"internalType":"struct IStakingModule.ValidatorData","name":"data","type":"tuple"},{"internalType":"bytes32","name":"latestDepositRoot","type":"bytes32"}],"name":"deposit","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mevEth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"operators","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"rewards","type":"uint256"}],"name":"payRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"payValidatorWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"record","outputs":[{"internalType":"uint128","name":"totalDeposited","type":"uint128"},{"internalType":"uint128","name":"totalWithdrawn","type":"uint128"},{"internalType":"uint128","name":"totalRewardsPaid","type":"uint128"},{"internalType":"uint128","name":"totalValidatorExitsPaid","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"recoverToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"registerExit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMevEth","type":"address"}],"name":"setNewMevEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validators","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0346100e157601f6110aa38819003918201601f19168301916001600160401b038311848410176100e6578084926060946040528339810103126100e157610047816100fc565b906100606040610059602084016100fc565b92016100fc565b9160018060a01b0392838092166000526002602052604060002060ff19906001828254161790556000548160ff60018184160116911617600055600160205260016040600020918254161790551660018060a01b0319600654161760065516608052604051610f9990816101118239608051818181610b820152610da70152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100e15756fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806313e7c9d81461013b57806314b71a8314610136578063266cf1091461013157806327e1f7df1461012c578063429b62e514610127578063442e493d146101225780634ad8d34b1461011d5780635552aa651461011857806360e3a0ac14610113578063704802751461010e578063832b7c6b146101095780639870d7fe14610104578063a7229fd9146100ff578063b40992a1146100fa578063b778a3a7146100f5578063badf2663146100f0578063ca1e7819146100eb5763cceab7500361000e57610d87565b610d69565b610d42565b610b0c565b610a7e565b610988565b6108f8565b61079f565b6106ce565b6105c1565b61059d565b6104d2565b610443565b610400565b6102f0565b6102ae565b6101a4565b610156565b6001600160a01b0381160361015157565b600080fd5b34610151576020366003190112610151576001600160a01b0360043561017b81610140565b166000526001602052602060ff604060002054166040519015158152f35b600091031261015157565b34610151576000806003193601126102ab57338152600160205260ff6040822054161561029a576801bc16d674ec80000047811161028857816102016101f56101f56006546001600160a01b031690565b6001600160a01b031690565b803b156102845760046040518094819363fe18321160e01b83525af1801561027f57610266575b50604080513381526801bc16d674ec80000060208201527f12b964a3993d1598dd8a3b627a3b90b4bc6b7a8f4f8bb6afde02a30d178e28ef9190a180f35b8061027361027992610dcb565b80610199565b38610228565b610e26565b5080fd5b60405163f14a42b760e01b8152600490fd5b6040516282b42960e81b8152600490fd5b80fd5b346101515760003660031901126101515760806003546001600160801b0360045490604051928181168452841c602084015281166040830152821c6060820152f35b346101515760203660031901126101515760043561030d81610140565b600090338252600260205260ff6040832054161561029a576001600160a01b03811690818352600260205261034e61034a6040852060ff90541690565b1590565b6103ee57610378610368610363855460ff1690565b610f89565b60ff1660ff196000541617600055565b60ff610385845460ff1690565b16156103dc576103ab6103b5916001600160a01b03166000526002602052604060002090565b805460ff19169055565b7f989ddfce057dad219e0ae16f691b121bb0e348f0d8ae0ad400b4d5ac8d616c8b8280a280f35b604051631f8c1dbd60e11b8152600490fd5b60405163a741a04560e01b8152600490fd5b34610151576020366003190112610151576001600160a01b0360043561042581610140565b166000526002602052602060ff604060002054166040519015158152f35b346101515760203660031901126101515760043561046081610140565b600090338252600260205260ff6040832054161561029a576001600160a01b031680156104c057806001600160a01b031960065416176006557f05bf5ca062293de567f843f2e7e8b024d0b1556b679854e79f53c19402a83b078280a280f35b60405163d92e233d60e01b8152600490fd5b34610151576000366003190112610151576001600160a01b0360065416330361058b5761053461051960045460801c6801bc16d674ec8000006001600160801b0391011690565b6001600160801b036004549181199060801b16911617600455565b61057861055d61054660035460801c90565b6801bc16d674ec800000016001600160801b031690565b6001600160801b036003549181199060801b16911617600355565b6005548061058257005b60001901600555005b60405163e3272bbb60e01b8152600490fd5b346101515760003660031901126101515760206040516801bc16d674ec8000008152f35b3461015157602036600319011261015157600435600090338252600160205260ff6040832054161561029a574781116102885761065161055d6001600160801b03831661064661062a8261061d6004546001600160801b031690565b016001600160801b031690565b6001600160801b03166001600160801b03196004541617600455565b60035460801c61061d565b6106696101f56101f56006546001600160a01b031690565b82813b156102ab57829160046040518094819363558cb7f760e01b83525af1801561027f576106bb575b507fb0c65a5b323022d926c456e1564d86f0bda40160a781c820f571d7635b3488018280a280f35b806102736106c892610dcb565b38610693565b34610151576020366003190112610151576004356106eb81610140565b600090338252600260205260ff6040832054161561029a576001600160a01b03811690818352600260205260ff6040842054166103ee5760ff83541660ff811461079a576107739161074d6001610766930160ff1660ff196000541617600055565b6001600160a01b03166000526002602052604060002090565b805460ff19166001179055565b7f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3398280a280f35b610f73565b34610151576020806003193601126101515767ffffffffffffffff6004358181116101515736602382011215610151578060040135918211610151576024810190602436918460051b01011161015157336000526002835260409060ff826000205416156108e8576108506108346001600160801b036801bc16d674ec80000086021661061d6003546001600160801b031690565b6001600160801b03166001600160801b03196003541617600355565b61085d8360055401600555565b60005b83811061086957005b806108776001928685610f3b565b7ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da5566001600160a01b036108a983610efd565b6108df6108b88b860186610e32565b95906108c76060830183610e32565b918c5196879616988d60808601359501359187610f0a565b0390a201610860565b81516282b42960e81b8152600490fd5b346101515760203660031901126101515760043561091581610140565b600090338252600260205260ff6040832054161561029a576001600160a01b0316808252600160205260ff6040832054166103ee57808252600160205260408220600160ff198254161790557fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d8280a280f35b34610151576060366003190112610151576004356109a581610140565b6024356109b181610140565b60443590600092338452600260205260ff6040852054161561029a576001600160a01b038091169160405163a9059cbb60e01b8652816004528460245260208660448180885af13d15601f3d116001895114161716866060528160405215610a3c5750167f879f92dded0f26b83c3e00b12e0395dc72cfc3077343d1854ed6988edd1f90968480a480f35b62461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606490fd5b3461015157602036600319011261015157600435610a9b81610140565b600090338252600260205260ff6040832054161561029a576001600160a01b0316808252600160205260ff604083205416156103ee57808252600160205260408220805460ff191690557f69df2c5ec2ea4d1fbe1e503524f593b356162ca710671263827f2e1992b95ae18280a280f35b600319604036820181136101515760049081359167ffffffffffffffff83116101515760a083820194843603011261015157610b536101f56006546001600160a01b031690565b3303610d34576801bc16d674ec80000091823403610d2757805163c5f2892f60e01b81526001600160a01b03937f00000000000000000000000000000000000000000000000000000000000000008516916020818681865afa90811561027f57600091610cf9575b5060243503610cea578592608492610c268993610be66108346105466003546001600160801b031690565b610bf4600160055401600555565b6024870197610c038987610e32565b9190610c3c606460448c01359b610c348d8b51998a916020830160209181520190565b03601f1981018a5289610df5565b018099610e32565b99909d013598863b1561015157899088519e8f97889687966304512a2360e31b8852870195610c6a96610e86565b03915a94600095f193841561027f577ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da55697610cd295610cd7575b50610cc3610cbb610cb48b610efd565b978b610e32565b94909a610e32565b93909251978897169987610f0a565b0390a2005b80610273610ce492610dcb565b38610ca4565b50505163c61cf4c560e01b8152fd5b610d1a915060203d8111610d20575b610d128183610df5565b810190610e17565b38610bbb565b503d610d08565b51636ff0acf960e11b8152fd5b905163e3272bbb60e01b8152fd5b346101515760003660031901126101515760206001600160a01b0360065416604051908152f35b34610151576000366003190112610151576020600554604051908152f35b346101515760003660031901126101515760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b67ffffffffffffffff8111610ddf57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610ddf57604052565b90816020910312610151575190565b6040513d6000823e3d90fd5b903590601e1981360301821215610151570180359067ffffffffffffffff82116101515760200191813603831361015157565b908060209392818452848401376000828201840152601f01601f1916010190565b969594929190610e9e91608089526080890191610e65565b6020918782038389015280519081835260005b828110610eea5750506000828201840152601f01601f19160186810382016040880152606093610ee5939190920191610e65565b930152565b8181018501518482018601528401610eb1565b35610f0781610140565b90565b9695949093610f28606095610ee5959460808b5260808b0191610e65565b9260208901528783036040890152610e65565b9190811015610f5d5760051b81013590609e1981360301821215610151570190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff16801561079a57600019019056000000000000000000000000a3a771a7c4afa7f0a3f88cc6512542241851c9260000000000000000000000004242424242424242424242424242424242424242000000000000000000000000277058d78307f11e590d91edff3d4b1c0faa240c

Deployed Bytecode

0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806313e7c9d81461013b57806314b71a8314610136578063266cf1091461013157806327e1f7df1461012c578063429b62e514610127578063442e493d146101225780634ad8d34b1461011d5780635552aa651461011857806360e3a0ac14610113578063704802751461010e578063832b7c6b146101095780639870d7fe14610104578063a7229fd9146100ff578063b40992a1146100fa578063b778a3a7146100f5578063badf2663146100f0578063ca1e7819146100eb5763cceab7500361000e57610d87565b610d69565b610d42565b610b0c565b610a7e565b610988565b6108f8565b61079f565b6106ce565b6105c1565b61059d565b6104d2565b610443565b610400565b6102f0565b6102ae565b6101a4565b610156565b6001600160a01b0381160361015157565b600080fd5b34610151576020366003190112610151576001600160a01b0360043561017b81610140565b166000526001602052602060ff604060002054166040519015158152f35b600091031261015157565b34610151576000806003193601126102ab57338152600160205260ff6040822054161561029a576801bc16d674ec80000047811161028857816102016101f56101f56006546001600160a01b031690565b6001600160a01b031690565b803b156102845760046040518094819363fe18321160e01b83525af1801561027f57610266575b50604080513381526801bc16d674ec80000060208201527f12b964a3993d1598dd8a3b627a3b90b4bc6b7a8f4f8bb6afde02a30d178e28ef9190a180f35b8061027361027992610dcb565b80610199565b38610228565b610e26565b5080fd5b60405163f14a42b760e01b8152600490fd5b6040516282b42960e81b8152600490fd5b80fd5b346101515760003660031901126101515760806003546001600160801b0360045490604051928181168452841c602084015281166040830152821c6060820152f35b346101515760203660031901126101515760043561030d81610140565b600090338252600260205260ff6040832054161561029a576001600160a01b03811690818352600260205261034e61034a6040852060ff90541690565b1590565b6103ee57610378610368610363855460ff1690565b610f89565b60ff1660ff196000541617600055565b60ff610385845460ff1690565b16156103dc576103ab6103b5916001600160a01b03166000526002602052604060002090565b805460ff19169055565b7f989ddfce057dad219e0ae16f691b121bb0e348f0d8ae0ad400b4d5ac8d616c8b8280a280f35b604051631f8c1dbd60e11b8152600490fd5b60405163a741a04560e01b8152600490fd5b34610151576020366003190112610151576001600160a01b0360043561042581610140565b166000526002602052602060ff604060002054166040519015158152f35b346101515760203660031901126101515760043561046081610140565b600090338252600260205260ff6040832054161561029a576001600160a01b031680156104c057806001600160a01b031960065416176006557f05bf5ca062293de567f843f2e7e8b024d0b1556b679854e79f53c19402a83b078280a280f35b60405163d92e233d60e01b8152600490fd5b34610151576000366003190112610151576001600160a01b0360065416330361058b5761053461051960045460801c6801bc16d674ec8000006001600160801b0391011690565b6001600160801b036004549181199060801b16911617600455565b61057861055d61054660035460801c90565b6801bc16d674ec800000016001600160801b031690565b6001600160801b036003549181199060801b16911617600355565b6005548061058257005b60001901600555005b60405163e3272bbb60e01b8152600490fd5b346101515760003660031901126101515760206040516801bc16d674ec8000008152f35b3461015157602036600319011261015157600435600090338252600160205260ff6040832054161561029a574781116102885761065161055d6001600160801b03831661064661062a8261061d6004546001600160801b031690565b016001600160801b031690565b6001600160801b03166001600160801b03196004541617600455565b60035460801c61061d565b6106696101f56101f56006546001600160a01b031690565b82813b156102ab57829160046040518094819363558cb7f760e01b83525af1801561027f576106bb575b507fb0c65a5b323022d926c456e1564d86f0bda40160a781c820f571d7635b3488018280a280f35b806102736106c892610dcb565b38610693565b34610151576020366003190112610151576004356106eb81610140565b600090338252600260205260ff6040832054161561029a576001600160a01b03811690818352600260205260ff6040842054166103ee5760ff83541660ff811461079a576107739161074d6001610766930160ff1660ff196000541617600055565b6001600160a01b03166000526002602052604060002090565b805460ff19166001179055565b7f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3398280a280f35b610f73565b34610151576020806003193601126101515767ffffffffffffffff6004358181116101515736602382011215610151578060040135918211610151576024810190602436918460051b01011161015157336000526002835260409060ff826000205416156108e8576108506108346001600160801b036801bc16d674ec80000086021661061d6003546001600160801b031690565b6001600160801b03166001600160801b03196003541617600355565b61085d8360055401600555565b60005b83811061086957005b806108776001928685610f3b565b7ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da5566001600160a01b036108a983610efd565b6108df6108b88b860186610e32565b95906108c76060830183610e32565b918c5196879616988d60808601359501359187610f0a565b0390a201610860565b81516282b42960e81b8152600490fd5b346101515760203660031901126101515760043561091581610140565b600090338252600260205260ff6040832054161561029a576001600160a01b0316808252600160205260ff6040832054166103ee57808252600160205260408220600160ff198254161790557fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d8280a280f35b34610151576060366003190112610151576004356109a581610140565b6024356109b181610140565b60443590600092338452600260205260ff6040852054161561029a576001600160a01b038091169160405163a9059cbb60e01b8652816004528460245260208660448180885af13d15601f3d116001895114161716866060528160405215610a3c5750167f879f92dded0f26b83c3e00b12e0395dc72cfc3077343d1854ed6988edd1f90968480a480f35b62461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606490fd5b3461015157602036600319011261015157600435610a9b81610140565b600090338252600260205260ff6040832054161561029a576001600160a01b0316808252600160205260ff604083205416156103ee57808252600160205260408220805460ff191690557f69df2c5ec2ea4d1fbe1e503524f593b356162ca710671263827f2e1992b95ae18280a280f35b600319604036820181136101515760049081359167ffffffffffffffff83116101515760a083820194843603011261015157610b536101f56006546001600160a01b031690565b3303610d34576801bc16d674ec80000091823403610d2757805163c5f2892f60e01b81526001600160a01b03937f00000000000000000000000042424242424242424242424242424242424242428516916020818681865afa90811561027f57600091610cf9575b5060243503610cea578592608492610c268993610be66108346105466003546001600160801b031690565b610bf4600160055401600555565b6024870197610c038987610e32565b9190610c3c606460448c01359b610c348d8b51998a916020830160209181520190565b03601f1981018a5289610df5565b018099610e32565b99909d013598863b1561015157899088519e8f97889687966304512a2360e31b8852870195610c6a96610e86565b03915a94600095f193841561027f577ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da55697610cd295610cd7575b50610cc3610cbb610cb48b610efd565b978b610e32565b94909a610e32565b93909251978897169987610f0a565b0390a2005b80610273610ce492610dcb565b38610ca4565b50505163c61cf4c560e01b8152fd5b610d1a915060203d8111610d20575b610d128183610df5565b810190610e17565b38610bbb565b503d610d08565b51636ff0acf960e11b8152fd5b905163e3272bbb60e01b8152fd5b346101515760003660031901126101515760206001600160a01b0360065416604051908152f35b34610151576000366003190112610151576020600554604051908152f35b346101515760003660031901126101515760206040516001600160a01b037f0000000000000000000000004242424242424242424242424242424242424242168152f35b67ffffffffffffffff8111610ddf57604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610ddf57604052565b90816020910312610151575190565b6040513d6000823e3d90fd5b903590601e1981360301821215610151570180359067ffffffffffffffff82116101515760200191813603831361015157565b908060209392818452848401376000828201840152601f01601f1916010190565b969594929190610e9e91608089526080890191610e65565b6020918782038389015280519081835260005b828110610eea5750506000828201840152601f01601f19160186810382016040880152606093610ee5939190920191610e65565b930152565b8181018501518482018601528401610eb1565b35610f0781610140565b90565b9695949093610f28606095610ee5959460808b5260808b0191610e65565b9260208901528783036040890152610e65565b9190811015610f5d5760051b81013590609e1981360301821215610151570190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff16801561079a57600019019056

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

000000000000000000000000a3a771a7c4afa7f0a3f88cc6512542241851c9260000000000000000000000004242424242424242424242424242424242424242000000000000000000000000277058d78307f11e590d91edff3d4b1c0faa240c

-----Decoded View---------------
Arg [0] : _authority (address): 0xA3A771A7c4AFA7f0a3f88Cc6512542241851C926
Arg [1] : _depositContract (address): 0x4242424242424242424242424242424242424242
Arg [2] : _mevEth (address): 0x277058D78307F11e590D91eDfF3D4b1C0fAA240c

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000a3a771a7c4afa7f0a3f88cc6512542241851c926
Arg [1] : 0000000000000000000000004242424242424242424242424242424242424242
Arg [2] : 000000000000000000000000277058d78307f11e590d91edff3d4b1c0faa240c


Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Latest 25 from a total of 361133 withdrawals (2,992.550964607 ETH withdrawn)

Validator Index Block Amount
161369929088302024-12-10 13:31:364 days ago17338374960.008885713 ETH
161369829088302024-12-10 13:31:364 days ago17338374960.008712246 ETH
161369729088302024-12-10 13:31:364 days ago17338374960.008730761 ETH
161369629088302024-12-10 13:31:364 days ago17338374960.008788229 ETH
161369529088302024-12-10 13:31:364 days ago17338374960.008830517 ETH
161369429088302024-12-10 13:31:364 days ago17338374960.008741492 ETH
161369329088302024-12-10 13:31:364 days ago17338374960.008805452 ETH
161369229088302024-12-10 13:31:364 days ago17338374960.008732841 ETH
161369129088302024-12-10 13:31:364 days ago17338374960.008695065 ETH
161369029088302024-12-10 13:31:364 days ago17338374960.008821463 ETH
161368929088302024-12-10 13:31:364 days ago17338374960.008803845 ETH
161368829088302024-12-10 13:31:364 days ago17338374960.00882238 ETH
161368729088302024-12-10 13:31:364 days ago17338374960.008803125 ETH
161368629088302024-12-10 13:31:364 days ago17338374960.008762965 ETH
161368529088302024-12-10 13:31:364 days ago17338374960.008779676 ETH
161368429088302024-12-10 13:31:364 days ago17338374960.008809858 ETH
161368329088292024-12-10 13:31:244 days ago17338374840.008769415 ETH
161368229088292024-12-10 13:31:244 days ago17338374840.008700546 ETH
161368129088292024-12-10 13:31:244 days ago17338374840.008794159 ETH
161368029088292024-12-10 13:31:244 days ago17338374840.008815183 ETH
161367929088292024-12-10 13:31:244 days ago17338374840.008870129 ETH
161367829088292024-12-10 13:31:244 days ago17338374840.008800899 ETH
161367729088292024-12-10 13:31:244 days ago17338374840.008748989 ETH
161367629088292024-12-10 13:31:244 days ago17338374840.008793218 ETH
161367529088292024-12-10 13:31:244 days ago17338374840.008739261 ETH
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ 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.