ETH Price: $2,022.52 (+4.35%)

Contract

0x4300c0D3c0d3c0d3c0d3c0d3C0D3c0d3c0d30001

Overview

ETH Balance

0 ETH

ETH Value

$0.00

More Info

Private Name Tags

ContractCreator

GENESIS at txn GENESIS_4300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d30001

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Distribute Fees116945452025-03-20 3:55:0411 secs ago1742442904IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees116081452025-03-19 3:55:0424 hrs ago1742356504IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees115217452025-03-18 3:55:042 days ago1742270104IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees110033442025-03-12 3:55:038 days ago1741751703IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees109169442025-03-11 3:55:039 days ago1741665303IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees109008232025-03-10 23:26:229 days ago1741649182IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees108341442025-03-10 4:55:039 days ago1741582503IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees107477442025-03-09 4:55:0310 days ago1741496103IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees106613442025-03-08 4:55:0311 days ago1741409703IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees105749452025-03-07 4:55:0412 days ago1741323304IN
0x4300c0D3...3c0d30001
0 ETH00.00000026
Distribute Fees104885452025-03-06 4:55:0413 days ago1741236904IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees104021452025-03-05 4:55:0414 days ago1741150504IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees103157452025-03-04 4:55:0415 days ago1741064104IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees102293452025-03-03 4:55:0416 days ago1740977704IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees101429442025-03-02 4:55:0317 days ago1740891303IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees100565452025-03-01 4:55:0418 days ago1740804904IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees99701452025-02-28 4:55:0419 days ago1740718504IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees98837442025-02-27 4:55:0320 days ago1740632103IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees97973442025-02-26 4:55:0321 days ago1740545703IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees97109452025-02-25 4:55:0422 days ago1740459304IN
0x4300c0D3...3c0d30001
0 ETH0.00000020.00150037
Distribute Fees96245452025-02-24 4:55:0423 days ago1740372904IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees95381442025-02-23 4:55:0324 days ago1740286503IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees94517442025-02-22 4:55:0325 days ago1740200103IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees93653452025-02-21 4:55:0426 days ago1740113704IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
Distribute Fees92789442025-02-20 4:55:0327 days ago1740027303IN
0x4300c0D3...3c0d30001
0 ETH00.00000025
View all transactions

Latest 25 internal transactions (View All)

Parent Transaction Hash Block From To
116945452025-03-20 3:55:0411 secs ago1742442904
0x4300c0D3...3c0d30001
0.10310124 ETH
116945452025-03-20 3:55:0411 secs ago1742442904
0x4300c0D3...3c0d30001
0.00113588 ETH
116945452025-03-20 3:55:0411 secs ago1742442904
0x4300c0D3...3c0d30001
0.01819433 ETH
116945452025-03-20 3:55:0411 secs ago1742442904
0x4300c0D3...3c0d30001
0.00113588 ETH
116945452025-03-20 3:55:0411 secs ago1742442904
0x4300c0D3...3c0d30001
0.00000864 ETH
116945452025-03-20 3:55:0411 secs ago1742442904
0x4300c0D3...3c0d30001
0.12128694 ETH
116081452025-03-19 3:55:0424 hrs ago1742356504
0x4300c0D3...3c0d30001
0.04002002 ETH
116081452025-03-19 3:55:0424 hrs ago1742356504
0x4300c0D3...3c0d30001
0.00278761 ETH
116081452025-03-19 3:55:0424 hrs ago1742356504
0x4300c0D3...3c0d30001
0.00706235 ETH
116081452025-03-19 3:55:0424 hrs ago1742356504
0x4300c0D3...3c0d30001
0.00278761 ETH
116081452025-03-19 3:55:0424 hrs ago1742356504
0x4300c0D3...3c0d30001
0.00267089 ETH
116081452025-03-19 3:55:0424 hrs ago1742356504
0x4300c0D3...3c0d30001
0.04441148 ETH
115217452025-03-18 3:55:042 days ago1742270104
0x4300c0D3...3c0d30001
0.34677075 ETH
115217452025-03-18 3:55:042 days ago1742270104
0x4300c0D3...3c0d30001
0.32054956 ETH
115217452025-03-18 3:55:042 days ago1742270104
0x4300c0D3...3c0d30001
0.06119483 ETH
115217452025-03-18 3:55:042 days ago1742270104
0x4300c0D3...3c0d30001
0.32054956 ETH
115217452025-03-18 3:55:042 days ago1742270104
0x4300c0D3...3c0d30001
0.00025605 ETH
115217452025-03-18 3:55:042 days ago1742270104
0x4300c0D3...3c0d30001
0.40770953 ETH
110033442025-03-12 3:55:038 days ago1741751703
0x4300c0D3...3c0d30001
0.04469484 ETH
110033442025-03-12 3:55:038 days ago1741751703
0x4300c0D3...3c0d30001
0.10399267 ETH
110033442025-03-12 3:55:038 days ago1741751703
0x4300c0D3...3c0d30001
0.00788732 ETH
110033442025-03-12 3:55:038 days ago1741751703
0x4300c0D3...3c0d30001
0.10399267 ETH
110033442025-03-12 3:55:038 days ago1741751703
0x4300c0D3...3c0d30001
0.00000737 ETH
110033442025-03-12 3:55:038 days ago1741751703
0x4300c0D3...3c0d30001
0.0525748 ETH
109169442025-03-11 3:55:039 days ago1741665303
0x4300c0D3...3c0d30001
0.00746138 ETH
View All Internal Transactions

Loading...
Loading

Contract Source Code Verified (Genesis Bytecode Match Only)

Contract Name:
FeeSplitter

Compiler Version
v0.8.26+commit.8a97fa7a

Optimization Enabled:
Yes with 999999 runs

Other Settings:
cancun EvmVersion, MIT license
File 1 of 5 : FeeSplitter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

import {Predeploys} from '@eth-optimism-bedrock/src/libraries/Predeploys.sol';
import {SafeCall} from '@eth-optimism-bedrock/src/libraries/SafeCall.sol';

import {IFeeSplitter} from '../interfaces/FeeSplitter/IFeeSplitter.sol';
import {IFeeVault} from '../interfaces/optimism/IFeeVault.sol';

/// @title FeeSplitter
/// @dev Withdraws funds from system FeeVault contracts, shares revenue with Optimism, sends remaining revenue to L1 and net fee recipients
contract FeeSplitter is IFeeSplitter {
    // bytes32(uint256(keccak256('lock')) - 1);
    bytes32 private constant LOCK_STORAGE_SLOT = 0x6168652c307c1e813ca11cfb3a601f1cf3b22452021a5052d8b05f1f1f8a3e91;
    // bytes32(uint256(keccak256('net.revenue')) - 1);
    bytes32 private constant NET_REVENUE_STORAGE_SLOT =
        0x784be9e5da62c580888dd777e3d4e36ef68053ef5af2fc8f65c4050e4729e434;

    uint32 internal constant BASIS_POINT_SCALE = 1000;
    uint32 internal constant NET_REVENUE_SHARE = 150;
    uint32 internal constant GROSS_REVENUE_SHARE = 25;

    /// @dev The address of the Optimism wallet that will receive Optimism's revenue share.
    address public immutable OPTIMISM_WALLET;

    /// @dev The address of the Rewards Distributor that will receive a share of fees;
    address public immutable NET_FEE_RECIPIENT;

    /// @dev The address of the L1 wallet that will receive the OP chain runner's share of fees.
    address public immutable L1_FEE_RECIPIENT;

    /// @dev Constructor for the FeeSplitter contract which validates and sets immutable variables.
    /// @param optimismWallet The address which receives Optimism's revenue share.
    /// @param l1FeeRecipient The address which receives the L1 fee share.
    /// @param netFeeRecipient The address which receives the net fee share.
    constructor(address optimismWallet, address l1FeeRecipient, address netFeeRecipient) {
        if (optimismWallet == address(0) || netFeeRecipient == address(0) || l1FeeRecipient == address(0)) {
            revert AddressZero();
        }
        OPTIMISM_WALLET = optimismWallet;
        NET_FEE_RECIPIENT = netFeeRecipient;
        L1_FEE_RECIPIENT = l1FeeRecipient;
    }

    /// @inheritdoc IFeeSplitter
    function distributeFees() external virtual returns (bool feesDistributed) {
        if (
            Predeploys.SEQUENCER_FEE_WALLET.balance < IFeeVault(Predeploys.SEQUENCER_FEE_WALLET).minWithdrawalAmount()
                || Predeploys.BASE_FEE_VAULT.balance < IFeeVault(Predeploys.BASE_FEE_VAULT).minWithdrawalAmount()
                || Predeploys.L1_FEE_VAULT.balance < IFeeVault(Predeploys.L1_FEE_VAULT).minWithdrawalAmount()
        ) {
            // only collect fees if all fee vaults can be withdrawn from to guarantee accurate accounting of optimism revenue share
            emit NoFeesCollected();
            return false;
        }

        // unlock
        assembly ("memory-safe") {
            tstore(LOCK_STORAGE_SLOT, 1)
        }
        _feeVaultWithdrawal(Predeploys.SEQUENCER_FEE_WALLET);
        _feeVaultWithdrawal(Predeploys.BASE_FEE_VAULT);
        _feeVaultWithdrawal(Predeploys.L1_FEE_VAULT);

        // lock
        assembly ("memory-safe") {
            tstore(LOCK_STORAGE_SLOT, 0)
        }

        uint256 netFeeRevenue;
        uint256 grossFeeRevenue = address(this).balance;

        assembly ("memory-safe") {
            netFeeRevenue := tload(NET_REVENUE_STORAGE_SLOT)
            tstore(NET_REVENUE_STORAGE_SLOT, 0)
        }

        /// @audit gas savings if min withdrawal amount is set to 0
        if (grossFeeRevenue == 0) {
            emit NoFeesCollected();
            return false;
        }

        uint256 netRevenueShare = netFeeRevenue * NET_REVENUE_SHARE / BASIS_POINT_SCALE;
        uint256 grossRevenueShare = grossFeeRevenue * GROSS_REVENUE_SHARE / BASIS_POINT_SCALE;

        uint256 optimismRevenueShare;
        uint256 l1Fee;
        uint256 remainingNetRevenue;
        if (grossRevenueShare > netRevenueShare) {
            // if the gross revenue share is greater than the net revenue share, 2.5% of the gross revenue is sent to optimism
            // the remaining 97.5% of the L1 fees are sent to L1
            // the remaining 97.5% of the net fees are sent to the net fee recipient
            optimismRevenueShare = grossRevenueShare;
            l1Fee = (grossFeeRevenue - netFeeRevenue) * (BASIS_POINT_SCALE - GROSS_REVENUE_SHARE) / BASIS_POINT_SCALE;
            remainingNetRevenue = netFeeRevenue * (BASIS_POINT_SCALE - GROSS_REVENUE_SHARE) / BASIS_POINT_SCALE;
        } else {
            // if the net revenue share is greater than the gross revenue share, 15% of the net revenue is sent to optimism
            // the entire amount of L1 fees are sent to L1
            // the remaining 85% of the net fees are sent to the net fee recipient
            optimismRevenueShare = netRevenueShare;
            l1Fee = grossFeeRevenue - netFeeRevenue;
            remainingNetRevenue = netFeeRevenue - optimismRevenueShare;
        }

        if (!SafeCall.send(OPTIMISM_WALLET, gasleft(), optimismRevenueShare)) revert TransferFailed();

        if (!SafeCall.send(L1_FEE_RECIPIENT, gasleft(), l1Fee)) revert TransferFailed();

        if (!SafeCall.send(NET_FEE_RECIPIENT, gasleft(), remainingNetRevenue)) revert TransferFailed();

        emit FeesDistributed(optimismRevenueShare, l1Fee, remainingNetRevenue);
        return true;
    }

    /// @dev Receives ETH fees withdrawn from L2 FeeVaults and stores the net revenue in transient storage.
    /// @dev Will revert if ETH is not sent from L2 FeeVaults.
    /// @dev anyone can call the withdraw function on the vaults, the lock ensures that a withdrawal is only successful if the fee splitter is withdrawing the fees to ensure accurate accounting
    receive() external payable virtual {
        uint256 unlocked;
        assembly ("memory-safe") {
            unlocked := tload(LOCK_STORAGE_SLOT)
        }
        if (unlocked == 0) revert Locked();

        // TODO: explore whether the withdraw function can return a value indicating the amount of fees withdrawn
        if (msg.sender == Predeploys.SEQUENCER_FEE_WALLET || msg.sender == Predeploys.BASE_FEE_VAULT) {
            uint256 amount = msg.value;
            // combine the fees from the sequencer and base FeeVaults as net revenue
            assembly ("memory-safe") {
                tstore(NET_REVENUE_STORAGE_SLOT, add(tload(NET_REVENUE_STORAGE_SLOT), amount))
            }
        } else if (msg.sender == Predeploys.L1_FEE_VAULT) {
            // L1 Fee can be retrieved by subtracting the net fee revenue from address(this).balance
            // any dust not distributed in previous distributions is allocated towards L1 fee revenue automatically
        } else {
            revert OnlyVaults();
        }
    }

    function _feeVaultWithdrawal(address _feeVault) internal {
        if (IFeeVault(_feeVault).withdrawalNetwork() != IFeeVault.WithdrawalNetwork.L2) {
            revert MustWithdrawToL2();
        }
        if (IFeeVault(_feeVault).recipient() != address(this)) {
            revert MustWithdrawToFeeSplitter();
        }
        IFeeVault(_feeVault).withdraw();
    }
}

File 2 of 5 : Predeploys.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title Predeploys
/// @notice Contains constant addresses for protocol contracts that are pre-deployed to the L2 system.
//          This excludes the preinstalls (non-protocol contracts).
library Predeploys {
    /// @notice Number of predeploy-namespace addresses reserved for protocol usage.
    uint256 internal constant PREDEPLOY_COUNT = 2048;

    /// @custom:legacy
    /// @notice Address of the LegacyMessagePasser predeploy. Deprecate. Use the updated
    ///         L2ToL1MessagePasser contract instead.
    address internal constant LEGACY_MESSAGE_PASSER = 0x4200000000000000000000000000000000000000;

    /// @custom:legacy
    /// @notice Address of the L1MessageSender predeploy. Deprecated. Use L2CrossDomainMessenger
    ///         or access tx.origin (or msg.sender) in a L1 to L2 transaction instead.
    ///         Not embedded into new OP-Stack chains.
    address internal constant L1_MESSAGE_SENDER = 0x4200000000000000000000000000000000000001;

    /// @custom:legacy
    /// @notice Address of the DeployerWhitelist predeploy. No longer active.
    address internal constant DEPLOYER_WHITELIST = 0x4200000000000000000000000000000000000002;

    /// @notice Address of the canonical WETH contract.
    address internal constant WETH = 0x4200000000000000000000000000000000000006;

    /// @notice Address of the L2CrossDomainMessenger predeploy.
    address internal constant L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000007;

    /// @notice Address of the GasPriceOracle predeploy. Includes fee information
    ///         and helpers for computing the L1 portion of the transaction fee.
    address internal constant GAS_PRICE_ORACLE = 0x420000000000000000000000000000000000000F;

    /// @notice Address of the L2StandardBridge predeploy.
    address internal constant L2_STANDARD_BRIDGE = 0x4200000000000000000000000000000000000010;

    //// @notice Address of the SequencerFeeWallet predeploy.
    address internal constant SEQUENCER_FEE_WALLET = 0x4200000000000000000000000000000000000011;

    /// @notice Address of the OptimismMintableERC20Factory predeploy.
    address internal constant OPTIMISM_MINTABLE_ERC20_FACTORY = 0x4200000000000000000000000000000000000012;

    /// @custom:legacy
    /// @notice Address of the L1BlockNumber predeploy. Deprecated. Use the L1Block predeploy
    ///         instead, which exposes more information about the L1 state.
    address internal constant L1_BLOCK_NUMBER = 0x4200000000000000000000000000000000000013;

    /// @notice Address of the L2ERC721Bridge predeploy.
    address internal constant L2_ERC721_BRIDGE = 0x4200000000000000000000000000000000000014;

    /// @notice Address of the L1Block predeploy.
    address internal constant L1_BLOCK_ATTRIBUTES = 0x4200000000000000000000000000000000000015;

    /// @notice Address of the L2ToL1MessagePasser predeploy.
    address internal constant L2_TO_L1_MESSAGE_PASSER = 0x4200000000000000000000000000000000000016;

    /// @notice Address of the OptimismMintableERC721Factory predeploy.
    address internal constant OPTIMISM_MINTABLE_ERC721_FACTORY = 0x4200000000000000000000000000000000000017;

    /// @notice Address of the ProxyAdmin predeploy.
    address internal constant PROXY_ADMIN = 0x4200000000000000000000000000000000000018;

    /// @notice Address of the BaseFeeVault predeploy.
    address internal constant BASE_FEE_VAULT = 0x4200000000000000000000000000000000000019;

    /// @notice Address of the L1FeeVault predeploy.
    address internal constant L1_FEE_VAULT = 0x420000000000000000000000000000000000001A;

    /// @notice Address of the SchemaRegistry predeploy.
    address internal constant SCHEMA_REGISTRY = 0x4200000000000000000000000000000000000020;

    /// @notice Address of the EAS predeploy.
    address internal constant EAS = 0x4200000000000000000000000000000000000021;

    /// @notice Address of the GovernanceToken predeploy.
    address internal constant GOVERNANCE_TOKEN = 0x4200000000000000000000000000000000000042;

    /// @custom:legacy
    /// @notice Address of the LegacyERC20ETH predeploy. Deprecated. Balances are migrated to the
    ///         state trie as of the Bedrock upgrade. Contract has been locked and write functions
    ///         can no longer be accessed.
    address internal constant LEGACY_ERC20_ETH = 0xDeadDeAddeAddEAddeadDEaDDEAdDeaDDeAD0000;

    /// @notice Address of the CrossL2Inbox predeploy.
    address internal constant CROSS_L2_INBOX = 0x4200000000000000000000000000000000000022;

    /// @notice Address of the L2ToL2CrossDomainMessenger predeploy.
    address internal constant L2_TO_L2_CROSS_DOMAIN_MESSENGER = 0x4200000000000000000000000000000000000023;

    /// @notice Address of the SuperchainWETH predeploy.
    address internal constant SUPERCHAIN_WETH = 0x4200000000000000000000000000000000000024;

    /// @notice Address of the ETHLiquidity predeploy.
    address internal constant ETH_LIQUIDITY = 0x4200000000000000000000000000000000000025;

    /// @notice Address of the OptimismSuperchainERC20Factory predeploy.
    address internal constant OPTIMISM_SUPERCHAIN_ERC20_FACTORY = 0x4200000000000000000000000000000000000026;

    /// @notice Address of the OptimismSuperchainERC20Beacon predeploy.
    address internal constant OPTIMISM_SUPERCHAIN_ERC20_BEACON = 0x4200000000000000000000000000000000000027;

    // TODO: Precalculate the address of the implementation contract
    /// @notice Arbitrary address of the OptimismSuperchainERC20 implementation contract.
    address internal constant OPTIMISM_SUPERCHAIN_ERC20 = 0xB9415c6cA93bdC545D4c5177512FCC22EFa38F28;

    /// @notice Address of the SuperchainTokenBridge predeploy.
    address internal constant SUPERCHAIN_TOKEN_BRIDGE = 0x4200000000000000000000000000000000000028;

    /// @notice Returns the name of the predeploy at the given address.
    function getName(address _addr) internal pure returns (string memory out_) {
        require(isPredeployNamespace(_addr), "Predeploys: address must be a predeploy");
        if (_addr == LEGACY_MESSAGE_PASSER) return "LegacyMessagePasser";
        if (_addr == L1_MESSAGE_SENDER) return "L1MessageSender";
        if (_addr == DEPLOYER_WHITELIST) return "DeployerWhitelist";
        if (_addr == WETH) return "WETH";
        if (_addr == L2_CROSS_DOMAIN_MESSENGER) return "L2CrossDomainMessenger";
        if (_addr == GAS_PRICE_ORACLE) return "GasPriceOracle";
        if (_addr == L2_STANDARD_BRIDGE) return "L2StandardBridge";
        if (_addr == SEQUENCER_FEE_WALLET) return "SequencerFeeVault";
        if (_addr == OPTIMISM_MINTABLE_ERC20_FACTORY) return "OptimismMintableERC20Factory";
        if (_addr == L1_BLOCK_NUMBER) return "L1BlockNumber";
        if (_addr == L2_ERC721_BRIDGE) return "L2ERC721Bridge";
        if (_addr == L1_BLOCK_ATTRIBUTES) return "L1Block";
        if (_addr == L2_TO_L1_MESSAGE_PASSER) return "L2ToL1MessagePasser";
        if (_addr == OPTIMISM_MINTABLE_ERC721_FACTORY) return "OptimismMintableERC721Factory";
        if (_addr == PROXY_ADMIN) return "ProxyAdmin";
        if (_addr == BASE_FEE_VAULT) return "BaseFeeVault";
        if (_addr == L1_FEE_VAULT) return "L1FeeVault";
        if (_addr == SCHEMA_REGISTRY) return "SchemaRegistry";
        if (_addr == EAS) return "EAS";
        if (_addr == GOVERNANCE_TOKEN) return "GovernanceToken";
        if (_addr == LEGACY_ERC20_ETH) return "LegacyERC20ETH";
        if (_addr == CROSS_L2_INBOX) return "CrossL2Inbox";
        if (_addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER) return "L2ToL2CrossDomainMessenger";
        if (_addr == SUPERCHAIN_WETH) return "SuperchainWETH";
        if (_addr == ETH_LIQUIDITY) return "ETHLiquidity";
        if (_addr == OPTIMISM_SUPERCHAIN_ERC20_FACTORY) return "OptimismSuperchainERC20Factory";
        if (_addr == OPTIMISM_SUPERCHAIN_ERC20_BEACON) return "OptimismSuperchainERC20Beacon";
        if (_addr == SUPERCHAIN_TOKEN_BRIDGE) return "SuperchainTokenBridge";
        revert("Predeploys: unnamed predeploy");
    }

    /// @notice Returns true if the predeploy is not proxied.
    function notProxied(address _addr) internal pure returns (bool) {
        return _addr == GOVERNANCE_TOKEN || _addr == WETH;
    }

    /// @notice Returns true if the address is a defined predeploy that is embedded into new OP-Stack chains.
    function isSupportedPredeploy(address _addr, bool _useInterop) internal pure returns (bool) {
        return _addr == LEGACY_MESSAGE_PASSER || _addr == DEPLOYER_WHITELIST || _addr == WETH
            || _addr == L2_CROSS_DOMAIN_MESSENGER || _addr == GAS_PRICE_ORACLE || _addr == L2_STANDARD_BRIDGE
            || _addr == SEQUENCER_FEE_WALLET || _addr == OPTIMISM_MINTABLE_ERC20_FACTORY || _addr == L1_BLOCK_NUMBER
            || _addr == L2_ERC721_BRIDGE || _addr == L1_BLOCK_ATTRIBUTES || _addr == L2_TO_L1_MESSAGE_PASSER
            || _addr == OPTIMISM_MINTABLE_ERC721_FACTORY || _addr == PROXY_ADMIN || _addr == BASE_FEE_VAULT
            || _addr == L1_FEE_VAULT || _addr == SCHEMA_REGISTRY || _addr == EAS || _addr == GOVERNANCE_TOKEN
            || (_useInterop && _addr == CROSS_L2_INBOX) || (_useInterop && _addr == L2_TO_L2_CROSS_DOMAIN_MESSENGER)
            || (_useInterop && _addr == SUPERCHAIN_WETH) || (_useInterop && _addr == ETH_LIQUIDITY)
            || (_useInterop && _addr == OPTIMISM_SUPERCHAIN_ERC20_FACTORY)
            || (_useInterop && _addr == OPTIMISM_SUPERCHAIN_ERC20_BEACON)
            || (_useInterop && _addr == SUPERCHAIN_TOKEN_BRIDGE);
    }

    function isPredeployNamespace(address _addr) internal pure returns (bool) {
        return uint160(_addr) >> 11 == uint160(0x4200000000000000000000000000000000000000) >> 11;
    }

    /// @notice Function to compute the expected address of the predeploy implementation
    ///         in the genesis state.
    function predeployToCodeNamespace(address _addr) internal pure returns (address) {
        require(
            isPredeployNamespace(_addr), "Predeploys: can only derive code-namespace address for predeploy addresses"
        );
        return address(
            uint160(uint256(uint160(_addr)) & 0xffff | uint256(uint160(0xc0D3C0d3C0d3C0D3c0d3C0d3c0D3C0d3c0d30000)))
        );
    }
}

File 3 of 5 : SafeCall.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @title SafeCall
/// @notice Perform low level safe calls
library SafeCall {
    /// @notice Performs a low level call without copying any returndata.
    /// @dev Passes no calldata to the call context.
    /// @param _target   Address to call
    /// @param _gas      Amount of gas to pass to the call
    /// @param _value    Amount of value to pass to the call
    function send(address _target, uint256 _gas, uint256 _value) internal returns (bool success_) {
        assembly {
            success_ :=
                call(
                    _gas, // gas
                    _target, // recipient
                    _value, // ether value
                    0, // inloc
                    0, // inlen
                    0, // outloc
                    0 // outlen
                )
        }
    }

    /// @notice Perform a low level call with all gas without copying any returndata
    /// @param _target   Address to call
    /// @param _value    Amount of value to pass to the call
    function send(address _target, uint256 _value) internal returns (bool success_) {
        success_ = send(_target, gasleft(), _value);
    }

    /// @notice Perform a low level call without copying any returndata
    /// @param _target   Address to call
    /// @param _gas      Amount of gas to pass to the call
    /// @param _value    Amount of value to pass to the call
    /// @param _calldata Calldata to pass to the call
    function call(
        address _target,
        uint256 _gas,
        uint256 _value,
        bytes memory _calldata
    )
        internal
        returns (bool success_)
    {
        assembly {
            success_ :=
                call(
                    _gas, // gas
                    _target, // recipient
                    _value, // ether value
                    add(_calldata, 32), // inloc
                    mload(_calldata), // inlen
                    0, // outloc
                    0 // outlen
                )
        }
    }

    /// @notice Perform a low level call without copying any returndata
    /// @param _target   Address to call
    /// @param _value    Amount of value to pass to the call
    /// @param _calldata Calldata to pass to the call
    function call(address _target, uint256 _value, bytes memory _calldata) internal returns (bool success_) {
        success_ = call({ _target: _target, _gas: gasleft(), _value: _value, _calldata: _calldata });
    }

    /// @notice Perform a low level call without copying any returndata
    /// @param _target   Address to call
    /// @param _calldata Calldata to pass to the call
    function call(address _target, bytes memory _calldata) internal returns (bool success_) {
        success_ = call({ _target: _target, _gas: gasleft(), _value: 0, _calldata: _calldata });
    }

    /// @notice Helper function to determine if there is sufficient gas remaining within the context
    ///         to guarantee that the minimum gas requirement for a call will be met as well as
    ///         optionally reserving a specified amount of gas for after the call has concluded.
    /// @param _minGas      The minimum amount of gas that may be passed to the target context.
    /// @param _reservedGas Optional amount of gas to reserve for the caller after the execution
    ///                     of the target context.
    /// @return `true` if there is enough gas remaining to safely supply `_minGas` to the target
    ///         context as well as reserve `_reservedGas` for the caller after the execution of
    ///         the target context.
    /// @dev !!!!! FOOTGUN ALERT !!!!!
    ///      1.) The 40_000 base buffer is to account for the worst case of the dynamic cost of the
    ///          `CALL` opcode's `address_access_cost`, `positive_value_cost`, and
    ///          `value_to_empty_account_cost` factors with an added buffer of 5,700 gas. It is
    ///          still possible to self-rekt by initiating a withdrawal with a minimum gas limit
    ///          that does not account for the `memory_expansion_cost` & `code_execution_cost`
    ///          factors of the dynamic cost of the `CALL` opcode.
    ///      2.) This function should *directly* precede the external call if possible. There is an
    ///          added buffer to account for gas consumed between this check and the call, but it
    ///          is only 5,700 gas.
    ///      3.) Because EIP-150 ensures that a maximum of 63/64ths of the remaining gas in the call
    ///          frame may be passed to a subcontext, we need to ensure that the gas will not be
    ///          truncated.
    ///      4.) Use wisely. This function is not a silver bullet.
    function hasMinGas(uint256 _minGas, uint256 _reservedGas) internal view returns (bool) {
        bool _hasMinGas;
        assembly {
            // Equation: gas × 63 ≥ minGas × 64 + 63(40_000 + reservedGas)
            _hasMinGas := iszero(lt(mul(gas(), 63), add(mul(_minGas, 64), mul(add(40000, _reservedGas), 63))))
        }
        return _hasMinGas;
    }

    /// @notice Perform a low level call without copying any returndata. This function
    ///         will revert if the call cannot be performed with the specified minimum
    ///         gas.
    /// @param _target   Address to call
    /// @param _minGas   The minimum amount of gas that may be passed to the call
    /// @param _value    Amount of value to pass to the call
    /// @param _calldata Calldata to pass to the call
    function callWithMinGas(
        address _target,
        uint256 _minGas,
        uint256 _value,
        bytes memory _calldata
    )
        internal
        returns (bool)
    {
        bool _success;
        bool _hasMinGas = hasMinGas(_minGas, 0);
        assembly {
            // Assertion: gasleft() >= (_minGas * 64) / 63 + 40_000
            if iszero(_hasMinGas) {
                // Store the "Error(string)" selector in scratch space.
                mstore(0, 0x08c379a0)
                // Store the pointer to the string length in scratch space.
                mstore(32, 32)
                // Store the string.
                //
                // SAFETY:
                // - We pad the beginning of the string with two zero bytes as well as the
                // length (24) to ensure that we override the free memory pointer at offset
                // 0x40. This is necessary because the free memory pointer is likely to
                // be greater than 1 byte when this function is called, but it is incredibly
                // unlikely that it will be greater than 3 bytes. As for the data within
                // 0x60, it is ensured that it is 0 due to 0x60 being the zero offset.
                // - It's fine to clobber the free memory pointer, we're reverting.
                mstore(88, 0x0000185361666543616c6c3a204e6f7420656e6f75676820676173)

                // Revert with 'Error("SafeCall: Not enough gas")'
                revert(28, 100)
            }

            // The call will be supplied at least ((_minGas * 64) / 63) gas due to the
            // above assertion. This ensures that, in all circumstances (except for when the
            // `_minGas` does not account for the `memory_expansion_cost` and `code_execution_cost`
            // factors of the dynamic cost of the `CALL` opcode), the call will receive at least
            // the minimum amount of gas specified.
            _success :=
                call(
                    gas(), // gas
                    _target, // recipient
                    _value, // ether value
                    add(_calldata, 32), // inloc
                    mload(_calldata), // inlen
                    0x00, // outloc
                    0x00 // outlen
                )
        }
        return _success;
    }
}

File 4 of 5 : IFeeSplitter.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.26;

interface IFeeSplitter {
    /// @notice Emitted when `distributeFees` is called and no fees are collected
    event NoFeesCollected();

    /// @notice Emitted when `distributeFees` is called and fees are distributed
    /// @param optimismShare The amount of fees sent to Optimism
    /// @param l1Fees The amount of fees sent to L1 distributor
    /// @param netShare The amount of fees sent to the net fee distributor
    event FeesDistributed(uint256 optimismShare, uint256 l1Fees, uint256 netShare);

    /// @notice Thrown when an address provided in the constructor is zero
    error AddressZero();

    /// @notice Thrown when a transfer fails
    error TransferFailed();

    /// @notice Thrown an address other than the fee splitter tries to withdraw fees from vaults
    error Locked();

    /// @notice Thrown when an address that is not a vault tries to deposit fees
    error OnlyVaults();

    /// @notice Thrown when a fee vault is configured to withdraw to L2
    error MustWithdrawToL2();

    /// @notice Thrown when a fee vault is not configured to withdraw to the fee splitter
    error MustWithdrawToFeeSplitter();

    /// @notice Distributes the fees collected from the fee vaults to their respective destinations
    /// @return feesDistributed Whether any fees were distributed
    function distributeFees() external returns (bool feesDistributed);
}

File 5 of 5 : IFeeVault.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

/// @notice from https://github.com/ethereum-optimism/optimism/blob/develop/packages/contracts-bedrock/src/universal/FeeVault.sol
interface IFeeVault {
    /// @notice Enum representing where the FeeVault withdraws funds to.
    /// @custom:value L1 FeeVault withdraws funds to L1.
    /// @custom:value L2 FeeVault withdraws funds to L2.
    enum WithdrawalNetwork {
        L1,
        L2
    }

    /// @notice Network which the recipient will receive fees on.
    ///         Use the `withdrawalNetwork()` getter as this is deprecated
    ///         and is subject to be removed in the future.
    /// @custom:legacy
    function WITHDRAWAL_NETWORK() external view returns (WithdrawalNetwork);
    function withdrawalNetwork() external view returns (WithdrawalNetwork);

    /// @notice Account that will receive the fees. Can be located on L1 or L2.
    ///         Use the `recipient()` getter as this is deprecated
    ///         and is subject to be removed in the future.
    /// @custom:legacy
    function RECIPIENT() external view returns (address);
    function recipient() external view returns (address);

    /// @notice Minimum balance before a withdrawal can be triggered.
    ///         Use the `minWithdrawalAmount()` getter as this is deprecated
    ///         and is subject to be removed in the future.
    /// @custom:legacy
    function MIN_WITHDRAWAL_AMOUNT() external view returns (uint256);
    function minWithdrawalAmount() external view returns (uint256);

    /// @notice Triggers a withdrawal of funds to the fee wallet on L1 or L2.
    function withdraw() external;
}

Settings
{
  "remappings": [
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@eth-optimism-bedrock/=lib/optimism/packages/contracts-bedrock/",
    "forge-std/=lib/forge-std/src/",
    "@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/",
    "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/",
    "@eth-optimism-bedrock/=lib/optimism/packages/contracts-bedrock/",
    "automate/=lib/optimism/packages/contracts-bedrock/lib/automate/contracts/",
    "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/",
    "forge-gas-snapshot/=lib/forge-gas-snapshot/src/",
    "forge-std/=lib/forge-std/src/",
    "kontrol-cheatcodes/=lib/optimism/packages/contracts-bedrock/lib/kontrol-cheatcodes/src/",
    "lib-keccak/=lib/optimism/packages/contracts-bedrock/lib/lib-keccak/contracts/",
    "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/",
    "openzeppelin-contracts-v5/=lib/optimism/packages/contracts-bedrock/lib/openzeppelin-contracts-v5/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/",
    "optimism/=lib/optimism/",
    "prb-test/=lib/optimism/packages/contracts-bedrock/lib/automate/lib/prb-test/src/",
    "safe-contracts/=lib/optimism/packages/contracts-bedrock/lib/safe-contracts/contracts/",
    "solady/=lib/optimism/packages/contracts-bedrock/lib/solady/",
    "solmate/=lib/optimism/packages/contracts-bedrock/lib/solmate/src/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "ipfs",
    "appendCBOR": true
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "evmVersion": "cancun",
  "viaIR": false,
  "libraries": {}
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"address","name":"optimismWallet","type":"address"},{"internalType":"address","name":"l1FeeRecipient","type":"address"},{"internalType":"address","name":"netFeeRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AddressZero","type":"error"},{"inputs":[],"name":"Locked","type":"error"},{"inputs":[],"name":"MustWithdrawToFeeSplitter","type":"error"},{"inputs":[],"name":"MustWithdrawToL2","type":"error"},{"inputs":[],"name":"OnlyVaults","type":"error"},{"inputs":[],"name":"TransferFailed","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"optimismShare","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"l1Fees","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"netShare","type":"uint256"}],"name":"FeesDistributed","type":"event"},{"anonymous":false,"inputs":[],"name":"NoFeesCollected","type":"event"},{"inputs":[],"name":"L1_FEE_RECIPIENT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NET_FEE_RECIPIENT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OPTIMISM_WALLET","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"distributeFees","outputs":[{"internalType":"bool","name":"feesDistributed","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405260043610610041575f3560e01c80630c8cd0701461016657806383dec159146101c35780639722b289146101f6578063bb57ad2014610229575f80fd5b36610162577f6168652c307c1e813ca11cfb3a601f1cf3b22452021a5052d8b05f1f1f8a3e915c5f8190036100a2576040517f0f2e5b6c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373420000000000000000000000000000000000001114806100d7575033734200000000000000000000000000000000000019145b1561010657347f784be9e5da62c580888dd777e3d4e36ef68053ef5af2fc8f65c4050e4729e434805c8201905d005b7fffffffffffffffffffffffffbdffffffffffffffffffffffffffffffffffffe6330115610160576040517fbaeca5be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b348015610171575f80fd5b506101997f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3000281565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ce575f80fd5b506101997f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3000481565b348015610201575f80fd5b506101997f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3000381565b348015610234575f80fd5b5061023d61024d565b60405190151581526020016101ba565b5f73420000000000000000000000000000000000001173ffffffffffffffffffffffffffffffffffffffff16638312f1496040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cf9190610980565b734200000000000000000000000000000000000011311080610385575073420000000000000000000000000000000000001973ffffffffffffffffffffffffffffffffffffffff16638312f1496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610349573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036d9190610980565b73420000000000000000000000000000000000001931105b80610424575073420000000000000000000000000000000000001a73ffffffffffffffffffffffffffffffffffffffff16638312f1496040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040c9190610980565b73420000000000000000000000000000000000001a31105b15610456576040517f8c887b1215d5e6b119c1c1008fe1d0919b4c438301d5a0357362a13fb56f6a40905f90a1505f90565b60017f6168652c307c1e813ca11cfb3a601f1cf3b22452021a5052d8b05f1f1f8a3e915d610497734200000000000000000000000000000000000011610789565b6104b4734200000000000000000000000000000000000019610789565b6104d173420000000000000000000000000000000000001a610789565b5f7f6168652c307c1e813ca11cfb3a601f1cf3b22452021a5052d8b05f1f1f8a3e915d7f784be9e5da62c580888dd777e3d4e36ef68053ef5af2fc8f65c4050e4729e434805c9047905f905d805f03610554576040517f8c887b1215d5e6b119c1c1008fe1d0919b4c438301d5a0357362a13fb56f6a40905f90a15f9250505090565b5f6103e86105636096856109c4565b61056d91906109e1565b90505f6103e861057e6019856109c4565b61058891906109e1565b90505f805f848411156105fb578392506103e86105a6601982610a19565b63ffffffff166105b68989610a35565b6105c091906109c4565b6105ca91906109e1565b91506103e86105da601982610a19565b6105ea9063ffffffff16896109c4565b6105f491906109e1565b9050610617565b8492506106088787610a35565b91506106148388610a35565b90505b6106427f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d300025a8561096f565b610678576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106a37f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d300035a8461096f565b6106d9576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107047f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d300045a8361096f565b61073a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051848152602081018490529081018290527f312c5308f42848705a866c73dec11fd0783c2d64aac6a97e94467062ad3f40589060600160405180910390a1600197505050505050505090565b60018173ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f89190610a75565b600181111561080957610809610a48565b14610840576040517fb9a574c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c49190610a9a565b73ffffffffffffffffffffffffffffffffffffffff1614610911576040517f9cf31cc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610956575f80fd5b505af1158015610968573d5f803e3d5ffd5b5050505050565b5f805f805f858888f1949350505050565b5f60208284031215610990575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176109db576109db610997565b92915050565b5f82610a14577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b63ffffffff82811682821603908111156109db576109db610997565b818103818111156109db576109db610997565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215610a85575f80fd5b815160028110610a93575f80fd5b9392505050565b5f60208284031215610aaa575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610a93575f80fdfea264697066735822122084f46dd053649380056d74a2d5cc302f0f11be0dcfcdd48a27693c1cdc5a21bf64736f6c634300081a0033

Deployed Bytecode

0x608060405260043610610041575f3560e01c80630c8cd0701461016657806383dec159146101c35780639722b289146101f6578063bb57ad2014610229575f80fd5b36610162577f6168652c307c1e813ca11cfb3a601f1cf3b22452021a5052d8b05f1f1f8a3e915c5f8190036100a2576040517f0f2e5b6c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373420000000000000000000000000000000000001114806100d7575033734200000000000000000000000000000000000019145b1561010657347f784be9e5da62c580888dd777e3d4e36ef68053ef5af2fc8f65c4050e4729e434805c8201905d005b7fffffffffffffffffffffffffbdffffffffffffffffffffffffffffffffffffe6330115610160576040517fbaeca5be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b005b5f80fd5b348015610171575f80fd5b506101997f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3000281565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101ce575f80fd5b506101997f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3000481565b348015610201575f80fd5b506101997f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d3000381565b348015610234575f80fd5b5061023d61024d565b60405190151581526020016101ba565b5f73420000000000000000000000000000000000001173ffffffffffffffffffffffffffffffffffffffff16638312f1496040518163ffffffff1660e01b8152600401602060405180830381865afa1580156102ab573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906102cf9190610980565b734200000000000000000000000000000000000011311080610385575073420000000000000000000000000000000000001973ffffffffffffffffffffffffffffffffffffffff16638312f1496040518163ffffffff1660e01b8152600401602060405180830381865afa158015610349573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061036d9190610980565b73420000000000000000000000000000000000001931105b80610424575073420000000000000000000000000000000000001a73ffffffffffffffffffffffffffffffffffffffff16638312f1496040518163ffffffff1660e01b8152600401602060405180830381865afa1580156103e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061040c9190610980565b73420000000000000000000000000000000000001a31105b15610456576040517f8c887b1215d5e6b119c1c1008fe1d0919b4c438301d5a0357362a13fb56f6a40905f90a1505f90565b60017f6168652c307c1e813ca11cfb3a601f1cf3b22452021a5052d8b05f1f1f8a3e915d610497734200000000000000000000000000000000000011610789565b6104b4734200000000000000000000000000000000000019610789565b6104d173420000000000000000000000000000000000001a610789565b5f7f6168652c307c1e813ca11cfb3a601f1cf3b22452021a5052d8b05f1f1f8a3e915d7f784be9e5da62c580888dd777e3d4e36ef68053ef5af2fc8f65c4050e4729e434805c9047905f905d805f03610554576040517f8c887b1215d5e6b119c1c1008fe1d0919b4c438301d5a0357362a13fb56f6a40905f90a15f9250505090565b5f6103e86105636096856109c4565b61056d91906109e1565b90505f6103e861057e6019856109c4565b61058891906109e1565b90505f805f848411156105fb578392506103e86105a6601982610a19565b63ffffffff166105b68989610a35565b6105c091906109c4565b6105ca91906109e1565b91506103e86105da601982610a19565b6105ea9063ffffffff16896109c4565b6105f491906109e1565b9050610617565b8492506106088787610a35565b91506106148388610a35565b90505b6106427f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d300025a8561096f565b610678576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6106a37f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d300035a8461096f565b6106d9576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107047f0000000000000000000000004300c0d3c0d3c0d3c0d3c0d3c0d3c0d3c0d300045a8361096f565b61073a576040517f90b8ec1800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60408051848152602081018490529081018290527f312c5308f42848705a866c73dec11fd0783c2d64aac6a97e94467062ad3f40589060600160405180910390a1600197505050505050505090565b60018173ffffffffffffffffffffffffffffffffffffffff166382356d8a6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107d4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107f89190610a75565b600181111561080957610809610a48565b14610840576040517fb9a574c300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff166366d003ac6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156108a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c49190610a9a565b73ffffffffffffffffffffffffffffffffffffffff1614610911576040517f9cf31cc900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16633ccfd60b6040518163ffffffff1660e01b81526004015f604051808303815f87803b158015610956575f80fd5b505af1158015610968573d5f803e3d5ffd5b5050505050565b5f805f805f858888f1949350505050565b5f60208284031215610990575f80fd5b5051919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176109db576109db610997565b92915050565b5f82610a14577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b63ffffffff82811682821603908111156109db576109db610997565b818103818111156109db576109db610997565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f60208284031215610a85575f80fd5b815160028110610a93575f80fd5b9392505050565b5f60208284031215610aaa575f80fd5b815173ffffffffffffffffffffffffffffffffffffffff81168114610a93575f80fdfea264697066735822122084f46dd053649380056d74a2d5cc302f0f11be0dcfcdd48a27693c1cdc5a21bf64736f6c634300081a0033

Deployed Bytecode Sourcemap

513:6734:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5965:17;5959:24;5882:16;6006:13;;;6002:34;;6028:8;;;;;;;;;;;;;;6002:34;6165:10;2063:42:0;6165:45:2;;:88;;-1:-1:-1;6214:10:2;3461:42:0;6214:39:2;6165:88;6161:705;;;6286:9;6480:24;6474:31;;6470:44;;;6437:78;6419:110;6161:705;6549:37;:10;:37;6545:321;;;6843:12;;;;;;;;;;;;;;6545:321;5872:1000;513:6734;;;;1166:40;;;;;;;;;;;;;;;;;;190:42:5;178:55;;;160:74;;148:2;133:18;1166:40:2;;;;;;;;1300:42;;;;;;;;;;;;;;;1446:41;;;;;;;;;;;;;;;2243:3223;;;;;;;;;;;;;:::i;:::-;;;410:14:5;;403:22;385:41;;373:2;358:18;2243:3223:2;245:187:5;2243:3223:2;2295:20;2063:42:0;2386:62:2;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2063:42:0;2344:39:2;:106;;:220;;;3461:42:0;2506:56:2;;;:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3461:42:0;2470:33:2;:94;2344:220;:330;;;;3604:42:0;2618:54:2;;;:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3604:42:0;2584:31:2;:90;2344:330;2327:563;;;2836:17;;;;;;;-1:-1:-1;2874:5:2;;2243:3223::o;2327:563::-;2983:1;2964:17;2957:28;3004:52;2063:42:0;3004:19:2;:52::i;:::-;3066:46;3461:42:0;3066:19:2;:46::i;:::-;3122:44;3604:42:0;3122:19:2;:44::i;:::-;3258:1;3239:17;3232:28;3431:24;3425:31;;;3337:21;;3280;;3469:35;3596:15;3615:1;3596:20;3592:99;;3637:17;;;;;;;3675:5;3668:12;;;;2243:3223;:::o;3592:99::-;3701:23;954:4;3727:33;1009:3;3727:13;:33;:::i;:::-;:53;;;;:::i;:::-;3701:79;-1:-1:-1;3790:25:2;954:4;3818:37;1065:2;3818:15;:37;:::i;:::-;:57;;;;:::i;:::-;3790:85;;3886:28;3924:13;3947:27;4008:15;3988:17;:35;3984:1075;;;4339:17;;-1:-1:-1;954:4:2;4415:39;1065:2;954:4;4415:39;:::i;:::-;4378:77;;4379:31;4397:13;4379:15;:31;:::i;:::-;4378:77;;;;:::i;:::-;:97;;;;:::i;:::-;4370:105;-1:-1:-1;954:4:2;4528:39;1065:2;954:4;4528:39;:::i;:::-;4511:57;;;;:13;:57;:::i;:::-;:77;;;;:::i;:::-;4489:99;;3984:1075;;;4908:15;;-1:-1:-1;4945:31:2;4963:13;4945:15;:31;:::i;:::-;4937:39;-1:-1:-1;5012:36:2;5028:20;5012:13;:36;:::i;:::-;4990:58;;3984:1075;5074:63;5088:15;5105:9;5116:20;5074:13;:63::i;:::-;5069:93;;5146:16;;;;;;;;;;;;;;5069:93;5178:49;5192:16;5210:9;5221:5;5178:13;:49::i;:::-;5173:79;;5236:16;;;;;;;;;;;;;;5173:79;5268:64;5282:17;5301:9;5312:19;5268:13;:64::i;:::-;5263:94;;5341:16;;;;;;;;;;;;;;5263:94;5373:65;;;1777:25:5;;;1833:2;1818:18;;1811:34;;;1861:18;;;1854:34;;;5373:65:2;;1765:2:5;1750:18;5373:65:2;;;;;;;5455:4;5448:11;;;;;;;;;2243:3223;:::o;6878:367::-;6993:30;6959:9;6949:38;;;:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:74;;;;;;;;:::i;:::-;;6945:130;;7046:18;;;;;;;;;;;;;;6945:130;7132:4;7088:49;;7098:9;7088:30;;;:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:49;;;7084:114;;7160:27;;;;;;;;;;;;;;7084:114;7217:9;7207:29;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6878:367;:::o;429:441:1:-;508:13;825:1;792;760;728;685:6;643:7;610:4;584:270;556:298;429:441;-1:-1:-1;;;;429:441:1:o;437:184:5:-;507:6;560:2;548:9;539:7;535:23;531:32;528:52;;;576:1;573;566:12;528:52;-1:-1:-1;599:16:5;;437:184;-1:-1:-1;437:184:5:o;626:::-;678:77;675:1;668:88;775:4;772:1;765:15;799:4;796:1;789:15;815:168;888:9;;;919;;936:15;;;930:22;;916:37;906:71;;957:18;;:::i;:::-;815:168;;;;:::o;988:274::-;1028:1;1054;1044:189;;1089:77;1086:1;1079:88;1190:4;1187:1;1180:15;1218:4;1215:1;1208:15;1044:189;-1:-1:-1;1247:9:5;;988:274::o;1267:170::-;1364:10;1357:18;;;1337;;;1333:43;;1388:20;;1385:46;;;1411:18;;:::i;1442:128::-;1509:9;;;1530:11;;;1527:37;;;1544:18;;:::i;1899:184::-;1951:77;1948:1;1941:88;2048:4;2045:1;2038:15;2072:4;2069:1;2062:15;2088:282;2180:6;2233:2;2221:9;2212:7;2208:23;2204:32;2201:52;;;2249:1;2246;2239:12;2201:52;2281:9;2275:16;2320:1;2313:5;2310:12;2300:40;;2336:1;2333;2326:12;2300:40;2359:5;2088:282;-1:-1:-1;;;2088:282:5:o;2375:313::-;2445:6;2498:2;2486:9;2477:7;2473:23;2469:32;2466:52;;;2514:1;2511;2504:12;2466:52;2546:9;2540:16;2596:42;2589:5;2585:54;2578:5;2575:65;2565:93;;2654:1;2651;2644:12

Swarm Source

ipfs://84f46dd053649380056d74a2d5cc302f0f11be0dcfcdd48a27693c1cdc5a21bf

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.