Source Code
Overview
ETH Balance
2,992.549580069 ETH
More Info
ContractCreator
Multichain Info
N/A
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH | ||||
1079778 | 283 days ago | 32 ETH |
Loading...
Loading
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)
/// 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 { } }
/// 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); } }
/// 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(); }
{ "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": {} }
[{"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"}]
Contract Creation Code
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
Loading...
Loading
Latest 25 from a total of 361133 withdrawals (2,992.550964607 ETH withdrawn)
Validator Index | Block | Amount | |
---|---|---|---|
1613699 | 2908830 | 4 days ago | 0.008885713 ETH |
1613698 | 2908830 | 4 days ago | 0.008712246 ETH |
1613697 | 2908830 | 4 days ago | 0.008730761 ETH |
1613696 | 2908830 | 4 days ago | 0.008788229 ETH |
1613695 | 2908830 | 4 days ago | 0.008830517 ETH |
1613694 | 2908830 | 4 days ago | 0.008741492 ETH |
1613693 | 2908830 | 4 days ago | 0.008805452 ETH |
1613692 | 2908830 | 4 days ago | 0.008732841 ETH |
1613691 | 2908830 | 4 days ago | 0.008695065 ETH |
1613690 | 2908830 | 4 days ago | 0.008821463 ETH |
1613689 | 2908830 | 4 days ago | 0.008803845 ETH |
1613688 | 2908830 | 4 days ago | 0.00882238 ETH |
1613687 | 2908830 | 4 days ago | 0.008803125 ETH |
1613686 | 2908830 | 4 days ago | 0.008762965 ETH |
1613685 | 2908830 | 4 days ago | 0.008779676 ETH |
1613684 | 2908830 | 4 days ago | 0.008809858 ETH |
1613683 | 2908829 | 4 days ago | 0.008769415 ETH |
1613682 | 2908829 | 4 days ago | 0.008700546 ETH |
1613681 | 2908829 | 4 days ago | 0.008794159 ETH |
1613680 | 2908829 | 4 days ago | 0.008815183 ETH |
1613679 | 2908829 | 4 days ago | 0.008870129 ETH |
1613678 | 2908829 | 4 days ago | 0.008800899 ETH |
1613677 | 2908829 | 4 days ago | 0.008748989 ETH |
1613676 | 2908829 | 4 days ago | 0.008793218 ETH |
1613675 | 2908829 | 4 days ago | 0.008739261 ETH |
[ 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.