ETH Price: $1,982.03 (-5.07%)

Contract

0x2FB077955dd622f2bae14FEBf0851e8A43aDd8F5
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer243495942026-01-30 18:51:4735 days ago1769799107IN
0x2FB07795...A43aDd8F5
0.02471274 ETH0.000031291.31961325
Transfer226230302025-06-03 8:47:11276 days ago1748940431IN
0x2FB07795...A43aDd8F5
0.02274338 ETH0.000042571.79557261
Transfer222987562025-04-18 22:05:35322 days ago1745013935IN
0x2FB07795...A43aDd8F5
0.01818787 ETH0.000007670.3235519
Transfer222799672025-04-16 7:09:23324 days ago1744787363IN
0x2FB07795...A43aDd8F5
0.00665833 ETH0.000009420.3972929
Transfer219445022025-02-28 11:19:35371 days ago1740741575IN
0x2FB07795...A43aDd8F5
0.01446543 ETH0.000018690.78838632
Transfer213842702024-12-12 5:15:23449 days ago1733980523IN
0x2FB07795...A43aDd8F5
0.0266149 ETH0.0003544414.94779996
Transfer208003252024-09-21 17:04:35531 days ago1726938275IN
0x2FB07795...A43aDd8F5
0.0645956 ETH0.00022549.50600519

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Dispatch246000032026-03-06 17:47:478 hrs ago1772819267
0x2FB07795...A43aDd8F5
0.01649262 ETH
Dispatch245516812026-02-27 23:53:597 days ago1772236439
0x2FB07795...A43aDd8F5
0.04995612 ETH
Dispatch243614102026-02-01 10:26:5933 days ago1769941619
0x2FB07795...A43aDd8F5
0.06479053 ETH
Dispatch243580452026-01-31 23:09:5934 days ago1769900999
0x2FB07795...A43aDd8F5
0.07595657 ETH
Dispatch241308442025-12-31 6:33:3565 days ago1767162815
0x2FB07795...A43aDd8F5
0.05262744 ETH
Dispatch239368042025-12-04 1:43:5993 days ago1764812639
0x2FB07795...A43aDd8F5
0.01772513 ETH
Dispatch239022512025-11-29 5:31:4797 days ago1764394307
0x2FB07795...A43aDd8F5
0.05287034 ETH
Dispatch236982462025-10-31 15:30:59126 days ago1761924659
0x2FB07795...A43aDd8F5
0.05440961 ETH
Dispatch234943352025-10-03 2:41:59154 days ago1759459319
0x2FB07795...A43aDd8F5
0.01841642 ETH
Dispatch234770182025-09-30 16:32:23157 days ago1759249943
0x2FB07795...A43aDd8F5
0.0562053 ETH
Dispatch232600992025-08-31 9:01:35187 days ago1756630895
0x2FB07795...A43aDd8F5
0.05757879 ETH
Dispatch230419432025-07-31 22:05:23218 days ago1753999523
0x2FB07795...A43aDd8F5
0.01925825 ETH
Dispatch229583342025-07-20 5:32:23229 days ago1752989543
0x2FB07795...A43aDd8F5
0.0381896 ETH
Dispatch228248572025-07-01 14:02:47248 days ago1751378567
0x2FB07795...A43aDd8F5
0.01891616 ETH
Dispatch228210922025-07-01 1:24:23249 days ago1751333063
0x2FB07795...A43aDd8F5
0.03772234 ETH
Dispatch226275052025-06-03 23:48:11276 days ago1748994491
0x2FB07795...A43aDd8F5
0.08825239 ETH
Dispatch226051022025-05-31 20:30:59279 days ago1748723459
0x2FB07795...A43aDd8F5
0.05736143 ETH
Dispatch223859922025-05-01 2:20:35309 days ago1746066035
0x2FB07795...A43aDd8F5
0.17398179 ETH
Dispatch221706102025-04-01 0:55:23340 days ago1743468923
0x2FB07795...A43aDd8F5
0.05671127 ETH
Dispatch219627402025-03-03 0:20:59369 days ago1740961259
0x2FB07795...A43aDd8F5
0.13612637 ETH
Dispatch217487482025-02-01 2:40:47398 days ago1738377647
0x2FB07795...A43aDd8F5
0.05721736 ETH
Dispatch215264442025-01-01 1:50:59430 days ago1735696259
0x2FB07795...A43aDd8F5
0.12989657 ETH
Dispatch213048712024-12-01 3:07:59460 days ago1733022479
0x2FB07795...A43aDd8F5
0.07722216 ETH
Dispatch210894432024-11-01 1:14:59491 days ago1730423699
0x2FB07795...A43aDd8F5
0.05773403 ETH
Dispatch208688612024-10-01 6:29:59521 days ago1727764199
0x2FB07795...A43aDd8F5
0.20080976 ETH
View All Internal Transactions
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Withdrawals

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Latest 25 from a total of 63 withdrawals (1.517821816 ETH withdrawn)

Validator Index Block Amount
1540093245998502026-03-06 17:16:478 hrs ago17728174070.016492626 ETH
1540093245404792026-02-26 10:25:238 days ago17721015230.01653035 ETH
1540093244809952026-02-18 3:21:2316 days ago17713848830.01665858 ETH
1540093244211292026-02-09 18:53:4725 days ago17706632270.016767196 ETH
1540093243610252026-02-01 9:09:3533 days ago17699369750.064790535 ETH
1540093243009632026-01-24 0:07:3542 days ago17692132550.01691353 ETH
1540093242407182026-01-15 14:30:3550 days ago17684874350.017014661 ETH
1540093241803682026-01-07 4:18:4758 days ago17677595270.017315642 ETH
1540093241193992025-12-29 16:08:4767 days ago17670245270.017547377 ETH
1540093240577212025-12-21 1:34:2376 days ago17662808630.017559595 ETH
1540093239959142025-12-12 10:20:1184 days ago17655348110.017520471 ETH
1540093239341212025-12-03 16:31:3593 days ago17647794950.017725136 ETH
1540093238716872025-11-24 22:32:11102 days ago17640235310.017687503 ETH
1540093238095792025-11-16 5:12:59110 days ago17632699790.017564472 ETH
1540093237475812025-11-07 13:06:59119 days ago17625208190.017618368 ETH
1540093236853822025-10-29 20:17:47128 days ago17617690670.017952034 ETH
1540093236220322025-10-20 23:18:35137 days ago17610023150.018055691 ETH
1540093235580692025-10-12 0:29:59146 days ago17602289990.018401894 ETH
1540093234932232025-10-02 22:57:35155 days ago17594458550.018416427 ETH
1540093234282872025-09-23 21:02:35164 days ago17586613550.018518479 ETH
1540093233629382025-09-14 17:53:23173 days ago17578724030.018683432 ETH
1540093232967892025-09-05 12:04:35182 days ago17570738750.019003393 ETH
1540093232295292025-08-27 2:39:47191 days ago17562623870.019128561 ETH
1540093231619382025-08-17 16:21:59201 days ago17554477190.019200342 ETH
1540093230940102025-08-08 4:38:59210 days ago17546279390.019249896 ETH
View All Withdrawals

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

Minimal Proxy Contract for 0xfe1b6a789e2bd96a69c49a14353e51116b48107f

Similar Match Source Code
This contract matches the deployed Bytecode of the Source Code for Contract 0x933fBfeb...e6fc875C6
The constructor portion of the code might be different and could alter the actual behaviour of the contract

Contract Name:
FeeRecipient

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, BSL 1.1 license

Contract Source Code (Solidity Standard Json-Input format)

//SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.8.10;

import "./interfaces/IFeeDispatcher.sol";

contract FeeRecipient {
    /// @notice Constructor replay prevention
    bool internal initialized;
    /// @notice Address where funds are sent to be dispatched
    IFeeDispatcher internal dispatcher;
    /// @notice Public Key root assigned to this receiver
    bytes32 internal publicKeyRoot;

    error AlreadyInitialized();

    /// @notice Initializes the receiver
    /// @param _dispatcher Address that will handle the fee dispatching
    /// @param _publicKeyRoot Public Key root assigned to this receiver
    function init(address _dispatcher, bytes32 _publicKeyRoot) external {
        if (initialized) {
            revert AlreadyInitialized();
        }
        initialized = true;
        dispatcher = IFeeDispatcher(_dispatcher);
        publicKeyRoot = _publicKeyRoot;
    }

    /// @notice Empty calldata fallback
    receive() external payable {}

    /// @notice Non-empty calldata fallback
    fallback() external payable {}

    /// @notice Triggers a withdrawal by sending its funds + its public key root to the dispatcher
    /// @dev Can be called by any wallet as recipients are not parameters
    function withdraw() external {
        dispatcher.dispatch{value: address(this).balance}(publicKeyRoot);
    }

    /// @notice Retrieve the assigned public key root
    function getPublicKeyRoot() external view returns (bytes32) {
        return publicKeyRoot;
    }

    /// @notice retrieve the assigned withdrawer
    function getWithdrawer() external view returns (address) {
        return dispatcher.getWithdrawer(publicKeyRoot);
    }
}

//SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.8.10;

import "./libs/DispatchersStorageLib.sol";
import "./interfaces/IStakingContractFeeDetails.sol";
import "./interfaces/IFeeDispatcher.sol";

/// @title Consensus Layer Fee Recipient
/// @author Kiln
/// @notice This contract can be used to receive fees from a validator and split them with a node operator
contract ConsensusLayerFeeDispatcher is IFeeDispatcher {
    using DispatchersStorageLib for bytes32;

    event Withdrawal(
        address indexed withdrawer,
        address indexed feeRecipient,
        bytes32 pubKeyRoot,
        uint256 rewards,
        uint256 nodeOperatorFee,
        uint256 treasuryFee
    );

    error TreasuryReceiveError(bytes errorData);
    error FeeRecipientReceiveError(bytes errorData);
    error WithdrawerReceiveError(bytes errorData);
    error ZeroBalanceWithdrawal();
    error AlreadyInitialized();
    error InvalidCall();
    error NotImplemented();

    bytes32 internal constant STAKING_CONTRACT_ADDRESS_SLOT =
        keccak256("ConsensusLayerFeeRecipient.stakingContractAddress");
    uint256 internal constant BASIS_POINTS = 10_000;
    bytes32 internal constant VERSION_SLOT = keccak256("ConsensusLayerFeeRecipient.version");

    /// @notice Ensures an initialisation call has been called only once per _version value
    /// @param _version The current initialisation value
    modifier init(uint256 _version) {
        if (_version != VERSION_SLOT.getUint256() + 1) {
            revert AlreadyInitialized();
        }

        VERSION_SLOT.setUint256(_version);

        _;
    }

    /// @notice Constructor method allowing us to prevent calls to initCLFR by setting the appropriate version
    constructor(uint256 _version) {
        VERSION_SLOT.setUint256(_version);
    }

    /// @notice Initialize the contract by storing the staking contract
    /// @param _stakingContract Address of the Staking Contract
    function initCLD(address _stakingContract) external init(1) {
        STAKING_CONTRACT_ADDRESS_SLOT.setAddress(_stakingContract);
    }

    /// @notice Performs a withdrawal on this contract's balance
    function dispatch(bytes32) external payable {
        revert NotImplemented();
        /*
        uint256 balance = address(this).balance; // this has taken into account msg.value
        if (balance == 0) {
            revert ZeroBalanceWithdrawal();
        }
        IStakingContractFeeDetails stakingContract = IStakingContractFeeDetails(
            STAKING_CONTRACT_ADDRESS_SLOT.getAddress()
        );
        address withdrawer = stakingContract.getWithdrawerFromPublicKeyRoot(_publicKeyRoot);
        address operator = stakingContract.getOperatorFeeRecipient(_publicKeyRoot);
        address treasury = stakingContract.getTreasury();
        uint256 globalFee;

        if (balance >= 32 ether) {
            // withdrawing a healthy & exited validator
            globalFee = ((balance - 32 ether) * stakingContract.getGlobalFee()) / BASIS_POINTS;
        } else if (balance <= 16 ether) {
            // withdrawing from what looks like skimming
            globalFee = (balance * stakingContract.getGlobalFee()) / BASIS_POINTS;
        }

        uint256 operatorFee = (globalFee * stakingContract.getOperatorFee()) / BASIS_POINTS;

        (bool status, bytes memory data) = withdrawer.call{value: balance - globalFee}("");
        if (status == false) {
            revert WithdrawerReceiveError(data);
        }
        if (globalFee > 0) {
            (status, data) = treasury.call{value: globalFee - operatorFee}("");
            if (status == false) {
                revert FeeRecipientReceiveError(data);
            }
        }
        if (operatorFee > 0) {
            (status, data) = operator.call{value: operatorFee}("");
            if (status == false) {
                revert TreasuryReceiveError(data);
            }
        }
        emit Withdrawal(withdrawer, operator, balance - globalFee, operatorFee, globalFee - operatorFee);
        */
    }

    /// @notice Retrieve the staking contract address
    function getStakingContract() external view returns (address) {
        return STAKING_CONTRACT_ADDRESS_SLOT.getAddress();
    }

    /// @notice Retrieve the assigned withdrawer for the given public key root
    /// @param _publicKeyRoot Public key root to get the owner
    function getWithdrawer(bytes32 _publicKeyRoot) external view returns (address) {
        IStakingContractFeeDetails stakingContract = IStakingContractFeeDetails(
            STAKING_CONTRACT_ADDRESS_SLOT.getAddress()
        );
        return stakingContract.getWithdrawerFromPublicKeyRoot(_publicKeyRoot);
    }

    receive() external payable {
        revert InvalidCall();
    }

    fallback() external payable {
        revert InvalidCall();
    }
}

//SPDX-License-Identifier: MIT
pragma solidity >=0.8.10;

library DispatchersStorageLib {
    function getUint256(bytes32 position) internal view returns (uint256 data) {
        assembly {
            data := sload(position)
        }
    }

    function setUint256(bytes32 position, uint256 data) internal {
        assembly {
            sstore(position, data)
        }
    }

    function getAddress(bytes32 position) internal view returns (address data) {
        assembly {
            data := sload(position)
        }
    }

    function setAddress(bytes32 position, address data) internal {
        assembly {
            sstore(position, data)
        }
    }
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.10;

interface IStakingContractFeeDetails {
    function getWithdrawerFromPublicKeyRoot(bytes32 _publicKeyRoot) external view returns (address);

    function getTreasury() external view returns (address);

    function getOperatorFeeRecipient(bytes32 pubKeyRoot) external view returns (address);

    function getGlobalFee() external view returns (uint256);

    function getOperatorFee() external view returns (uint256);
}

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.10;

interface IFeeDispatcher {
    function dispatch(bytes32 _publicKeyRoot) external payable;

    function getWithdrawer(bytes32 _publicKeyRoot) external view returns (address);
}

//SPDX-License-Identifier: BUSL-1.1
pragma solidity >=0.8.10;

import "./libs/DispatchersStorageLib.sol";
import "./interfaces/IStakingContractFeeDetails.sol";
import "./interfaces/IFeeDispatcher.sol";

/// @title Execution Layer Fee Recipient
/// @author Kiln
/// @notice This contract can be used to receive fees from a validator and split them with a node operator
contract ExecutionLayerFeeDispatcher is IFeeDispatcher {
    using DispatchersStorageLib for bytes32;

    event Withdrawal(
        address indexed withdrawer,
        address indexed feeRecipient,
        bytes32 pubKeyRoot,
        uint256 rewards,
        uint256 nodeOperatorFee,
        uint256 treasuryFee
    );

    error TreasuryReceiveError(bytes errorData);
    error FeeRecipientReceiveError(bytes errorData);
    error WithdrawerReceiveError(bytes errorData);
    error ZeroBalanceWithdrawal();
    error AlreadyInitialized();
    error InvalidCall();

    bytes32 internal constant STAKING_CONTRACT_ADDRESS_SLOT =
        keccak256("ExecutionLayerFeeRecipient.stakingContractAddress");
    uint256 internal constant BASIS_POINTS = 10_000;
    bytes32 internal constant VERSION_SLOT = keccak256("ExecutionLayerFeeRecipient.version");

    /// @notice Ensures an initialisation call has been called only once per _version value
    /// @param _version The current initialisation value
    modifier init(uint256 _version) {
        if (_version != VERSION_SLOT.getUint256() + 1) {
            revert AlreadyInitialized();
        }

        VERSION_SLOT.setUint256(_version);

        _;
    }

    /// @notice Constructor method allowing us to prevent calls to initCLFR by setting the appropriate version
    constructor(uint256 _version) {
        VERSION_SLOT.setUint256(_version);
    }

    /// @notice Initialize the contract by storing the staking contract and the public key in storage
    /// @param _stakingContract Address of the Staking Contract
    function initELD(address _stakingContract) external init(1) {
        STAKING_CONTRACT_ADDRESS_SLOT.setAddress(_stakingContract);
    }

    /// @notice Performs a withdrawal on this contract's balance
    function dispatch(bytes32 _publicKeyRoot) external payable {
        uint256 balance = address(this).balance;
        if (balance == 0) {
            revert ZeroBalanceWithdrawal();
        }
        IStakingContractFeeDetails stakingContract = IStakingContractFeeDetails(
            STAKING_CONTRACT_ADDRESS_SLOT.getAddress()
        );
        address withdrawer = stakingContract.getWithdrawerFromPublicKeyRoot(_publicKeyRoot);
        address operator = stakingContract.getOperatorFeeRecipient(_publicKeyRoot);
        address treasury = stakingContract.getTreasury();
        uint256 globalFee = (balance * stakingContract.getGlobalFee()) / BASIS_POINTS;
        uint256 operatorFee = (globalFee * stakingContract.getOperatorFee()) / BASIS_POINTS;

        (bool status, bytes memory data) = withdrawer.call{value: balance - globalFee}("");
        if (status == false) {
            revert WithdrawerReceiveError(data);
        }
        if (globalFee > 0) {
            (status, data) = treasury.call{value: globalFee - operatorFee}("");
            if (status == false) {
                revert FeeRecipientReceiveError(data);
            }
        }
        if (operatorFee > 0) {
            (status, data) = operator.call{value: operatorFee}("");
            if (status == false) {
                revert TreasuryReceiveError(data);
            }
        }
        emit Withdrawal(
            withdrawer,
            operator,
            _publicKeyRoot,
            balance - globalFee,
            operatorFee,
            globalFee - operatorFee
        );
    }

    /// @notice Retrieve the staking contract address
    function getStakingContract() external view returns (address) {
        return STAKING_CONTRACT_ADDRESS_SLOT.getAddress();
    }

    /// @notice Retrieve the assigned withdrawer for the given public key root
    /// @param _publicKeyRoot Public key root to get the owner
    function getWithdrawer(bytes32 _publicKeyRoot) external view returns (address) {
        IStakingContractFeeDetails stakingContract = IStakingContractFeeDetails(
            STAKING_CONTRACT_ADDRESS_SLOT.getAddress()
        );
        return stakingContract.getWithdrawerFromPublicKeyRoot(_publicKeyRoot);
    }

    receive() external payable {
        revert InvalidCall();
    }

    fallback() external payable {
        revert InvalidCall();
    }
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "useLiteralContent": true
  }
}

Contract ABI

API
[{"inputs":[],"name":"AlreadyInitialized","type":"error"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"getPublicKeyRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWithdrawer","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_dispatcher","type":"address"},{"internalType":"bytes32","name":"_publicKeyRoot","type":"bytes32"}],"name":"init","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

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