Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
WagyuStaker
Compiler Version
v0.8.19+commit.7dd6d404
Optimization Enabled:
Yes with 512 runs
Other Settings:
london 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 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);
}
}/// 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": [
"@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
- No Contract Security Audit Submitted- Submit Audit Here
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"}]Contract Creation Code
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
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 34 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.