ETH Price: $1,965.57 (-0.92%)

Contract

0x6B8D3530B7E2BbF5B15114cfB4fA2f1a4f0F5a99
 

Overview

ETH Balance

0.083339267 ETH

Eth Value

$163.81 (@ $1,965.57/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer239759532025-12-09 14:57:2388 days ago1765292243IN
0x6B8D3530...a4f0F5a99
0.00459142 ETH0.000005150.21729343
Transfer230395442025-07-31 14:00:59219 days ago1753970459IN
0x6B8D3530...a4f0F5a99
0.04185652 ETH0.00014.21753396
Transfer220362082025-03-13 6:38:23359 days ago1741847903IN
0x6B8D3530...a4f0F5a99
0.06261694 ETH0.000012360.52154889
Transfer215313522025-01-01 18:17:11430 days ago1735755431IN
0x6B8D3530...a4f0F5a99
0.03256262 ETH0.0006193826.12121402

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Dispatch243113802026-01-25 10:58:4741 days ago1769338727
0x6B8D3530...a4f0F5a99
0.05140025 ETH
Dispatch241280672025-12-30 21:15:4766 days ago1767129347
0x6B8D3530...a4f0F5a99
0.01749705 ETH
Dispatch241120862025-12-28 15:40:1169 days ago1766936411
0x6B8D3530...a4f0F5a99
0.01756226 ETH
Dispatch239994392025-12-12 22:12:5984 days ago1765577579
0x6B8D3530...a4f0F5a99
0.08650023 ETH
Dispatch238911462025-11-27 16:10:23100 days ago1764259823
0x6B8D3530...a4f0F5a99
0.03532276 ETH
Dispatch237563222025-11-08 18:26:23119 days ago1762626383
0x6B8D3530...a4f0F5a99
0.01765953 ETH
Dispatch236822032025-10-29 9:37:11129 days ago1761730631
0x6B8D3530...a4f0F5a99
0.01793974 ETH
Dispatch236247622025-10-21 8:30:47137 days ago1761035447
0x6B8D3530...a4f0F5a99
0.01813429 ETH
Dispatch235615582025-10-12 12:10:47146 days ago1760271047
0x6B8D3530...a4f0F5a99
0.01834549 ETH
Dispatch234991342025-10-03 18:46:35155 days ago1759517195
0x6B8D3530...a4f0F5a99
0.01842901 ETH
Dispatch234452982025-09-26 6:06:35162 days ago1758866795
0x6B8D3530...a4f0F5a99
0.01853925 ETH
Dispatch233785152025-09-16 22:07:47171 days ago1758060467
0x6B8D3530...a4f0F5a99
0.01871968 ETH
Dispatch233057432025-09-06 18:08:47182 days ago1757182127
0x6B8D3530...a4f0F5a99
0.01909053 ETH
Dispatch232527182025-08-30 8:19:59189 days ago1756541999
0x6B8D3530...a4f0F5a99
0.01914396 ETH
Dispatch232113392025-08-24 13:46:59195 days ago1756043219
0x6B8D3530...a4f0F5a99
0.01924491 ETH
Dispatch231540412025-08-16 13:57:11203 days ago1755352631
0x6B8D3530...a4f0F5a99
0.06642355 ETH
Dispatch230479082025-08-01 18:05:23218 days ago1754071523
0x6B8D3530...a4f0F5a99
0.08035636 ETH
Dispatch229090192025-07-13 8:19:23237 days ago1752394763
0x6B8D3530...a4f0F5a99
0.03823707 ETH
Dispatch227483992025-06-20 21:35:35259 days ago1750455335
0x6B8D3530...a4f0F5a99
0.03792234 ETH
Dispatch226367082025-06-05 6:44:23275 days ago1749105863
0x6B8D3530...a4f0F5a99
0.03832947 ETH
Dispatch224938672025-05-16 6:29:47295 days ago1747376987
0x6B8D3530...a4f0F5a99
0.03846522 ETH
Dispatch223770682025-04-29 20:22:11312 days ago1745958131
0x6B8D3530...a4f0F5a99
0.01933283 ETH
Dispatch223159202025-04-21 7:35:59320 days ago1745220959
0x6B8D3530...a4f0F5a99
0.03848354 ETH
Dispatch221525332025-03-29 12:22:47343 days ago1743250967
0x6B8D3530...a4f0F5a99
0.01912419 ETH
Dispatch220882202025-03-20 12:57:47352 days ago1742475467
0x6B8D3530...a4f0F5a99
0.14637169 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 76 withdrawals (1.584287816 ETH withdrawn)

Validator Index Block Amount
1360719245942952026-03-05 22:36:5946 hrs ago17727502190.016522665 ETH
1360719245348902026-02-25 15:41:3510 days ago17720340950.016552 ETH
1360719244753792026-02-17 8:32:5918 days ago17713171790.016724354 ETH
1360719244154622026-02-08 23:53:3526 days ago17705948150.01673069 ETH
1360719243553272026-01-31 14:02:4735 days ago17698681670.016809558 ETH
1360719242952452026-01-23 4:57:2343 days ago17691442430.01695378 ETH
1360719242349802026-01-14 19:17:3552 days ago17684182550.017106811 ETH
1360719241744482026-01-06 8:29:5960 days ago17676881990.017339665 ETH
1360719241133972025-12-28 20:02:5969 days ago17669521790.017497059 ETH
1360719240517262025-12-20 5:29:5977 days ago17662085990.017562263 ETH
1360719239899132025-12-11 14:04:2386 days ago17654618630.064217122 ETH
1360719239280342025-12-02 20:03:3595 days ago17647058150.017691684 ETH
1360719238655472025-11-24 1:47:11103 days ago17639488310.017696408 ETH
1360719238033472025-11-15 8:17:59112 days ago17631946790.017626357 ETH
1360719237411652025-11-06 15:34:35121 days ago17624432750.017659539 ETH
1360719236788292025-10-28 22:17:11129 days ago17616898310.017939746 ETH
1360719236153962025-10-20 0:56:11138 days ago17609217710.018134293 ETH
1360719235512972025-10-11 1:47:11147 days ago17601472310.018345495 ETH
1360719234863942025-10-02 0:02:11156 days ago17593633310.018429014 ETH
1360719234212382025-09-22 21:25:23165 days ago17585763230.018539251 ETH
1360719233557332025-09-13 17:46:35175 days ago17577855950.018719687 ETH
1360719232894662025-09-04 11:30:59184 days ago17569854590.019090532 ETH
1360719232221082025-08-26 1:49:35193 days ago17561729750.019143963 ETH
1360719231544072025-08-16 15:10:23203 days ago17553570230.019244911 ETH
1360719230863852025-08-07 3:05:47212 days ago17545359470.066423558 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.