ETH Price: $2,231.03 (-5.29%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Delete Admin189754222024-01-10 8:41:47755 days ago1704876107IN
0xca3773d1...a79467dA5
0 ETH0.000822228.38036377
Add Admin189754222024-01-10 8:41:47755 days ago1704876107IN
0xca3773d1...a79467dA5
0 ETH0.0014979728.38036377

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
WagyuStaker

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 512 runs

Other Settings:
london EvmVersion
/// 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 and fees 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 The address that protocol fees are sent to.
    address public protocolFeeTo;
    /// @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 Event emitted when the protocolFeeTo address is updated.
    event ProtocolFeeToUpdated(address indexed newProtocolFeeTo);
    /// @notice Event emitted when the protocol fees are sent to the protocolFeeTo address.
    event FeesSent(uint256 indexed feesSent);

    /// @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
    /// @param _protocolFeeTo The address that protocol fees are sent to.
    constructor(address _authority, address _depositContract, address _mevEth, address _protocolFeeTo) Auth(_authority) {
        mevEth = _mevEth;
        BEACON_CHAIN_DEPOSIT_CONTRACT = IBeaconDepositContract(_depositContract);
        protocolFeeTo = _protocolFeeTo;
    }

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

    /// @notice Function to collect the fees owed to the prorotocol.
    function sendFees(uint256 fees) external onlyOperator {
        unchecked {
            record.totalWithdrawn += uint128(fees);
        }

        SafeTransferLib.safeTransferETH(protocolFeeTo, fees);

        emit FeesSent(fees);
    }

    function setProtocolFeeTo(address newProtocolFeeTo) external onlyAdmin {
        if (newProtocolFeeTo == address(0)) {
            revert MevEthErrors.ZeroAddress();
        }
        protocolFeeTo = newProtocolFeeTo;
        emit ProtocolFeeToUpdated(newProtocolFeeTo);
    }

    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 { }
}

/// 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;
}

/// 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;
}

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

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

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

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

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"_authority","type":"address"},{"internalType":"address","name":"_depositContract","type":"address"},{"internalType":"address","name":"_mevEth","type":"address"},{"internalType":"address","name":"_protocolFeeTo","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":"uint256","name":"feesSent","type":"uint256"}],"name":"FeesSent","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":"address","name":"newProtocolFeeTo","type":"address"}],"name":"ProtocolFeeToUpdated","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":"protocolFeeTo","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"uint256","name":"fees","type":"uint256"}],"name":"sendFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newMevEth","type":"address"}],"name":"setNewMevEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newProtocolFeeTo","type":"address"}],"name":"setProtocolFeeTo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"validators","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

60a0346100fa57601f61127838819003918201601f19168301916001600160401b038311848410176100ff578084926080946040528339810103126100fa5761004781610115565b61005360208301610115565b9061006c606061006560408601610115565b9401610115565b9060018060a01b0392838092166000526002602052604060002060ff19906001828254161790556000548160ff60018184160116911617600055600160205260016040600020918254161790558160018060a01b03199516856006541617600655166080521690600754161760075560405161114e908161012a8239608051818181610bb20152610dd70152f35b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036100fa5756fe6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806313e7c9d81461016b57806314b71a8314610166578063266cf1091461016157806327e1f7df1461015c578063429b62e514610157578063442e493d146101525780634ad8d34b1461014d5780635552aa651461014857806360e3a0ac14610143578063704802751461013e578063832b7c6b146101395780639870d7fe14610134578063a7229fd91461012f578063b40992a11461012a578063b778a3a714610125578063badf266314610120578063ca1e78191461011b578063cceab75014610116578063e0e6799f14610111578063ecd4eb741461010c5763ef3692520361000e57610f59565b610e78565b610dfb565b610db7565b610d99565b610d72565b610b3c565b610aae565b6109b8565b610928565b6107cf565b6106fe565b6105f1565b6105cd565b610502565b610473565b610430565b610320565b6102de565b6101d4565b610186565b6001600160a01b0381160361018157565b600080fd5b34610181576020366003190112610181576001600160a01b036004356101ab81610170565b166000526001602052602060ff604060002054166040519015158152f35b600091031261018157565b34610181576000806003193601126102db57338152600160205260ff604082205416156102ca576801bc16d674ec8000004781116102b857816102316102256102256006546001600160a01b031690565b6001600160a01b031690565b803b156102b45760046040518094819363fe18321160e01b83525af180156102af57610296575b50604080513381526801bc16d674ec80000060208201527f12b964a3993d1598dd8a3b627a3b90b4bc6b7a8f4f8bb6afde02a30d178e28ef9190a180f35b806102a36102a992610f80565b806101c9565b38610258565b610fdb565b5080fd5b60405163f14a42b760e01b8152600490fd5b6040516282b42960e81b8152600490fd5b80fd5b34610181576000366003190112610181576080600354600454604051916001600160801b03908181168452841c602084015281166040830152821c6060820152f35b346101815760203660031901126101815760043561033d81610170565b600090338252600260205260ff604083205416156102ca576001600160a01b03811690818352600260205261037e61037a6040852060ff90541690565b1590565b61041e576103a8610398610393855460ff1690565b61113e565b60ff1660ff196000541617600055565b60ff6103b5845460ff1690565b161561040c576103db6103e5916001600160a01b03166000526002602052604060002090565b805460ff19169055565b7f989ddfce057dad219e0ae16f691b121bb0e348f0d8ae0ad400b4d5ac8d616c8b8280a280f35b604051631f8c1dbd60e11b8152600490fd5b60405163a741a04560e01b8152600490fd5b34610181576020366003190112610181576001600160a01b0360043561045581610170565b166000526002602052602060ff604060002054166040519015158152f35b346101815760203660031901126101815760043561049081610170565b600090338252600260205260ff604083205416156102ca576001600160a01b031680156104f057806001600160a01b031960065416176006557f05bf5ca062293de567f843f2e7e8b024d0b1556b679854e79f53c19402a83b078280a280f35b60405163d92e233d60e01b8152600490fd5b34610181576000366003190112610181576001600160a01b036006541633036105bb5761056461054960045460801c6801bc16d674ec8000006001600160801b0391011690565b6001600160801b036004549181199060801b16911617600455565b6105a861058d61057660035460801c90565b6801bc16d674ec800000016001600160801b031690565b6001600160801b036003549181199060801b16911617600355565b600554806105b257005b60001901600555005b60405163e3272bbb60e01b8152600490fd5b346101815760003660031901126101815760206040516801bc16d674ec8000008152f35b3461018157602036600319011261018157600435600090338252600160205260ff604083205416156102ca574781116102b85761068161058d6001600160801b03831661067661065a8261064d6004546001600160801b031690565b016001600160801b031690565b6001600160801b03166001600160801b03196004541617600455565b60035460801c61064d565b6106996102256102256006546001600160a01b031690565b82813b156102db57829160046040518094819363558cb7f760e01b83525af180156102af576106eb575b507fb0c65a5b323022d926c456e1564d86f0bda40160a781c820f571d7635b3488018280a280f35b806102a36106f892610f80565b386106c3565b346101815760203660031901126101815760043561071b81610170565b600090338252600260205260ff604083205416156102ca576001600160a01b03811690818352600260205260ff60408420541661041e5760ff83541660ff81146107ca576107a39161077d6001610796930160ff1660ff196000541617600055565b6001600160a01b03166000526002602052604060002090565b805460ff19166001179055565b7f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3398280a280f35b611128565b34610181576020806003193601126101815767ffffffffffffffff6004358181116101815736602382011215610181578060040135918211610181576024810190602436918460051b01011161018157336000526002835260409060ff82600020541615610918576108806108646001600160801b036801bc16d674ec80000086021661064d6003546001600160801b031690565b6001600160801b03166001600160801b03196003541617600355565b61088d8360055401600555565b60005b83811061089957005b806108a760019286856110f0565b7ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da5566001600160a01b036108d9836110b2565b61090f6108e88b860186610fe7565b95906108f76060830183610fe7565b918c5196879616988d608086013595013591876110bf565b0390a201610890565b81516282b42960e81b8152600490fd5b346101815760203660031901126101815760043561094581610170565b600090338252600260205260ff604083205416156102ca576001600160a01b0316808252600160205260ff60408320541661041e57808252600160205260408220600160ff198254161790557fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d8280a280f35b34610181576060366003190112610181576004356109d581610170565b6024356109e181610170565b60443590600092338452600260205260ff604085205416156102ca576001600160a01b038091169160405163a9059cbb60e01b8652816004528460245260208660448180885af13d15601f3d116001895114161716866060528160405215610a6c5750167f879f92dded0f26b83c3e00b12e0395dc72cfc3077343d1854ed6988edd1f90968480a480f35b62461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606490fd5b3461018157602036600319011261018157600435610acb81610170565b600090338252600260205260ff604083205416156102ca576001600160a01b0316808252600160205260ff6040832054161561041e57808252600160205260408220805460ff191690557f69df2c5ec2ea4d1fbe1e503524f593b356162ca710671263827f2e1992b95ae18280a280f35b600319604036820181136101815760049081359167ffffffffffffffff83116101815760a083820194843603011261018157610b836102256006546001600160a01b031690565b3303610d64576801bc16d674ec80000091823403610d5757805163c5f2892f60e01b81526001600160a01b03937f00000000000000000000000000000000000000000000000000000000000000008516916020818681865afa9081156102af57600091610d29575b5060243503610d1a578592608492610c568993610c166108646105766003546001600160801b031690565b610c24600160055401600555565b6024870197610c338987610fe7565b9190610c6c606460448c01359b610c648d8b51998a916020830160209181520190565b03601f1981018a5289610faa565b018099610fe7565b99909d013598863b1561018157899088519e8f97889687966304512a2360e31b8852870195610c9a9661103b565b03915a94600095f19384156102af577ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da55697610d0295610d07575b50610cf3610ceb610ce48b6110b2565b978b610fe7565b94909a610fe7565b939092519788971699876110bf565b0390a2005b806102a3610d1492610f80565b38610cd4565b50505163c61cf4c560e01b8152fd5b610d4a915060203d8111610d50575b610d428183610faa565b810190610fcc565b38610beb565b503d610d38565b51636ff0acf960e11b8152fd5b905163e3272bbb60e01b8152fd5b346101815760003660031901126101815760206001600160a01b0360065416604051908152f35b34610181576000366003190112610181576020600554604051908152f35b346101815760003660031901126101815760206040516001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168152f35b3461018157602036600319011261018157600435610e1881610170565b600090338252600260205260ff604083205416156102ca576001600160a01b031680156104f057806001600160a01b031960075416176007557f5384cdf4313810fabc89429faf20f012efaa71e0a3bdebc9c0a6ecb9fe1f98e88280a280f35b3461018157602036600319011261018157600435600090338252600160205260ff604083205416156102ca57610ed56001600160801b0380831660035460801c01166001600160801b036003549181199060801b16911617600355565b81808080846001600160a01b03600754165af115610f14577fcc2c7c66f72f6500cd1ce7d3dfd93e02f0306b97ecdac4ed3f40fb453f91d87b8280a280f35b60405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606490fd5b346101815760003660031901126101815760206001600160a01b0360075416604051908152f35b67ffffffffffffffff8111610f9457604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610f9457604052565b90816020910312610181575190565b6040513d6000823e3d90fd5b903590601e1981360301821215610181570180359067ffffffffffffffff82116101815760200191813603831361018157565b908060209392818452848401376000828201840152601f01601f1916010190565b9695949291906110539160808952608089019161101a565b6020918782038389015280519081835260005b82811061109f5750506000828201840152601f01601f1916018681038201604088015260609361109a93919092019161101a565b930152565b8181018501518482018601528401611066565b356110bc81610170565b90565b96959490936110dd60609561109a959460808b5260808b019161101a565b926020890152878303604089015261101a565b91908110156111125760051b81013590609e1981360301821215610181570190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff1680156107ca576000190190560000000000000000000000006d1a501627659b80073f56268d8722c337f5f67c00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa00000000000000000000000024ae2da0f361aa4be46b48eb19c91e02c5e4f27e000000000000000000000000617c8de5bde54ffbb8d92716cc947858ca38f582

Deployed Bytecode

0x6080604052600436101561001b575b361561001957600080fd5b005b60003560e01c806313e7c9d81461016b57806314b71a8314610166578063266cf1091461016157806327e1f7df1461015c578063429b62e514610157578063442e493d146101525780634ad8d34b1461014d5780635552aa651461014857806360e3a0ac14610143578063704802751461013e578063832b7c6b146101395780639870d7fe14610134578063a7229fd91461012f578063b40992a11461012a578063b778a3a714610125578063badf266314610120578063ca1e78191461011b578063cceab75014610116578063e0e6799f14610111578063ecd4eb741461010c5763ef3692520361000e57610f59565b610e78565b610dfb565b610db7565b610d99565b610d72565b610b3c565b610aae565b6109b8565b610928565b6107cf565b6106fe565b6105f1565b6105cd565b610502565b610473565b610430565b610320565b6102de565b6101d4565b610186565b6001600160a01b0381160361018157565b600080fd5b34610181576020366003190112610181576001600160a01b036004356101ab81610170565b166000526001602052602060ff604060002054166040519015158152f35b600091031261018157565b34610181576000806003193601126102db57338152600160205260ff604082205416156102ca576801bc16d674ec8000004781116102b857816102316102256102256006546001600160a01b031690565b6001600160a01b031690565b803b156102b45760046040518094819363fe18321160e01b83525af180156102af57610296575b50604080513381526801bc16d674ec80000060208201527f12b964a3993d1598dd8a3b627a3b90b4bc6b7a8f4f8bb6afde02a30d178e28ef9190a180f35b806102a36102a992610f80565b806101c9565b38610258565b610fdb565b5080fd5b60405163f14a42b760e01b8152600490fd5b6040516282b42960e81b8152600490fd5b80fd5b34610181576000366003190112610181576080600354600454604051916001600160801b03908181168452841c602084015281166040830152821c6060820152f35b346101815760203660031901126101815760043561033d81610170565b600090338252600260205260ff604083205416156102ca576001600160a01b03811690818352600260205261037e61037a6040852060ff90541690565b1590565b61041e576103a8610398610393855460ff1690565b61113e565b60ff1660ff196000541617600055565b60ff6103b5845460ff1690565b161561040c576103db6103e5916001600160a01b03166000526002602052604060002090565b805460ff19169055565b7f989ddfce057dad219e0ae16f691b121bb0e348f0d8ae0ad400b4d5ac8d616c8b8280a280f35b604051631f8c1dbd60e11b8152600490fd5b60405163a741a04560e01b8152600490fd5b34610181576020366003190112610181576001600160a01b0360043561045581610170565b166000526002602052602060ff604060002054166040519015158152f35b346101815760203660031901126101815760043561049081610170565b600090338252600260205260ff604083205416156102ca576001600160a01b031680156104f057806001600160a01b031960065416176006557f05bf5ca062293de567f843f2e7e8b024d0b1556b679854e79f53c19402a83b078280a280f35b60405163d92e233d60e01b8152600490fd5b34610181576000366003190112610181576001600160a01b036006541633036105bb5761056461054960045460801c6801bc16d674ec8000006001600160801b0391011690565b6001600160801b036004549181199060801b16911617600455565b6105a861058d61057660035460801c90565b6801bc16d674ec800000016001600160801b031690565b6001600160801b036003549181199060801b16911617600355565b600554806105b257005b60001901600555005b60405163e3272bbb60e01b8152600490fd5b346101815760003660031901126101815760206040516801bc16d674ec8000008152f35b3461018157602036600319011261018157600435600090338252600160205260ff604083205416156102ca574781116102b85761068161058d6001600160801b03831661067661065a8261064d6004546001600160801b031690565b016001600160801b031690565b6001600160801b03166001600160801b03196004541617600455565b60035460801c61064d565b6106996102256102256006546001600160a01b031690565b82813b156102db57829160046040518094819363558cb7f760e01b83525af180156102af576106eb575b507fb0c65a5b323022d926c456e1564d86f0bda40160a781c820f571d7635b3488018280a280f35b806102a36106f892610f80565b386106c3565b346101815760203660031901126101815760043561071b81610170565b600090338252600260205260ff604083205416156102ca576001600160a01b03811690818352600260205260ff60408420541661041e5760ff83541660ff81146107ca576107a39161077d6001610796930160ff1660ff196000541617600055565b6001600160a01b03166000526002602052604060002090565b805460ff19166001179055565b7f44d6d25963f097ad14f29f06854a01f575648a1ef82f30e562ccd3889717e3398280a280f35b611128565b34610181576020806003193601126101815767ffffffffffffffff6004358181116101815736602382011215610181578060040135918211610181576024810190602436918460051b01011161018157336000526002835260409060ff82600020541615610918576108806108646001600160801b036801bc16d674ec80000086021661064d6003546001600160801b031690565b6001600160801b03166001600160801b03196003541617600355565b61088d8360055401600555565b60005b83811061089957005b806108a760019286856110f0565b7ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da5566001600160a01b036108d9836110b2565b61090f6108e88b860186610fe7565b95906108f76060830183610fe7565b918c5196879616988d608086013595013591876110bf565b0390a201610890565b81516282b42960e81b8152600490fd5b346101815760203660031901126101815760043561094581610170565b600090338252600260205260ff604083205416156102ca576001600160a01b0316808252600160205260ff60408320541661041e57808252600160205260408220600160ff198254161790557fac6fa858e9350a46cec16539926e0fde25b7629f84b5a72bffaae4df888ae86d8280a280f35b34610181576060366003190112610181576004356109d581610170565b6024356109e181610170565b60443590600092338452600260205260ff604085205416156102ca576001600160a01b038091169160405163a9059cbb60e01b8652816004528460245260208660448180885af13d15601f3d116001895114161716866060528160405215610a6c5750167f879f92dded0f26b83c3e00b12e0395dc72cfc3077343d1854ed6988edd1f90968480a480f35b62461bcd60e51b815260206004820152600f60248201527f5452414e534645525f4641494c454400000000000000000000000000000000006044820152606490fd5b3461018157602036600319011261018157600435610acb81610170565b600090338252600260205260ff604083205416156102ca576001600160a01b0316808252600160205260ff6040832054161561041e57808252600160205260408220805460ff191690557f69df2c5ec2ea4d1fbe1e503524f593b356162ca710671263827f2e1992b95ae18280a280f35b600319604036820181136101815760049081359167ffffffffffffffff83116101815760a083820194843603011261018157610b836102256006546001600160a01b031690565b3303610d64576801bc16d674ec80000091823403610d5757805163c5f2892f60e01b81526001600160a01b03937f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa8516916020818681865afa9081156102af57600091610d29575b5060243503610d1a578592608492610c568993610c166108646105766003546001600160801b031690565b610c24600160055401600555565b6024870197610c338987610fe7565b9190610c6c606460448c01359b610c648d8b51998a916020830160209181520190565b03601f1981018a5289610faa565b018099610fe7565b99909d013598863b1561018157899088519e8f97889687966304512a2360e31b8852870195610c9a9661103b565b03915a94600095f19384156102af577ffc9422d796533611e741d6d7744236676f2114b7e01cb7f2cc412b12ce1da55697610d0295610d07575b50610cf3610ceb610ce48b6110b2565b978b610fe7565b94909a610fe7565b939092519788971699876110bf565b0390a2005b806102a3610d1492610f80565b38610cd4565b50505163c61cf4c560e01b8152fd5b610d4a915060203d8111610d50575b610d428183610faa565b810190610fcc565b38610beb565b503d610d38565b51636ff0acf960e11b8152fd5b905163e3272bbb60e01b8152fd5b346101815760003660031901126101815760206001600160a01b0360065416604051908152f35b34610181576000366003190112610181576020600554604051908152f35b346101815760003660031901126101815760206040516001600160a01b037f00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa168152f35b3461018157602036600319011261018157600435610e1881610170565b600090338252600260205260ff604083205416156102ca576001600160a01b031680156104f057806001600160a01b031960075416176007557f5384cdf4313810fabc89429faf20f012efaa71e0a3bdebc9c0a6ecb9fe1f98e88280a280f35b3461018157602036600319011261018157600435600090338252600160205260ff604083205416156102ca57610ed56001600160801b0380831660035460801c01166001600160801b036003549181199060801b16911617600355565b81808080846001600160a01b03600754165af115610f14577fcc2c7c66f72f6500cd1ce7d3dfd93e02f0306b97ecdac4ed3f40fb453f91d87b8280a280f35b60405162461bcd60e51b815260206004820152601360248201527f4554485f5452414e534645525f4641494c4544000000000000000000000000006044820152606490fd5b346101815760003660031901126101815760206001600160a01b0360075416604051908152f35b67ffffffffffffffff8111610f9457604052565b634e487b7160e01b600052604160045260246000fd5b90601f8019910116810190811067ffffffffffffffff821117610f9457604052565b90816020910312610181575190565b6040513d6000823e3d90fd5b903590601e1981360301821215610181570180359067ffffffffffffffff82116101815760200191813603831361018157565b908060209392818452848401376000828201840152601f01601f1916010190565b9695949291906110539160808952608089019161101a565b6020918782038389015280519081835260005b82811061109f5750506000828201840152601f01601f1916018681038201604088015260609361109a93919092019161101a565b930152565b8181018501518482018601528401611066565b356110bc81610170565b90565b96959490936110dd60609561109a959460808b5260808b019161101a565b926020890152878303604089015261101a565b91908110156111125760051b81013590609e1981360301821215610181570190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60ff1680156107ca57600019019056

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

0000000000000000000000006d1a501627659b80073f56268d8722c337f5f67c00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa00000000000000000000000024ae2da0f361aa4be46b48eb19c91e02c5e4f27e000000000000000000000000617c8de5bde54ffbb8d92716cc947858ca38f582

-----Decoded View---------------
Arg [0] : _authority (address): 0x6d1A501627659B80073f56268d8722c337f5f67c
Arg [1] : _depositContract (address): 0x00000000219ab540356cBB839Cbe05303d7705Fa
Arg [2] : _mevEth (address): 0x24Ae2dA0f361AA4BE46b48EB19C91e02c5e4f27E
Arg [3] : _protocolFeeTo (address): 0x617c8dE5BdE54ffbb8d92716CC947858cA38f582

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000006d1a501627659b80073f56268d8722c337f5f67c
Arg [1] : 00000000000000000000000000000000219ab540356cbb839cbe05303d7705fa
Arg [2] : 00000000000000000000000024ae2da0f361aa4be46b48eb19c91e02c5e4f27e
Arg [3] : 000000000000000000000000617c8de5bde54ffbb8d92716cc947858ca38f582


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