ETH Price: $2,103.61 (+0.52%)

Contract

0x9B495F6b0bBcC613b8dC1DD4D4B5A4cFB2AD7cEA
 

Overview

ETH Balance

0.134300116 ETH

Eth Value

$282.51 (@ $2,103.61/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer230394672025-07-31 13:45:35226 days ago1753969535IN
0x9B495F6b...FB2AD7cEA
0.05025147 ETH0.000125115.27661472
Transfer228924862025-07-11 0:53:35247 days ago1752195215IN
0x9B495F6b...FB2AD7cEA
0.0246219 ETH0.000060162.53734336
Transfer228014182025-06-28 7:23:11259 days ago1751095391IN
0x9B495F6b...FB2AD7cEA
0.03067267 ETH0.000007470.31508339
Transfer221964462025-04-04 15:27:23344 days ago1743780443IN
0x9B495F6b...FB2AD7cEA
0.01917625 ETH0.000039991.68654898
Transfer198705952024-05-14 20:26:11669 days ago1715718371IN
0x9B495F6b...FB2AD7cEA
0.05165199 ETH0.000149846.31934959
Transfer198040062024-05-05 12:51:11678 days ago1714913471IN
0x9B495F6b...FB2AD7cEA
0.03404887 ETH0.000124285.24126544

Latest 17 internal transactions

Advanced mode:
Parent Transaction Hash Method Block
From
To
Dispatch242188782026-01-12 13:17:3561 days ago1768223855
0x9B495F6b...FB2AD7cEA
0.08797418 ETH
Dispatch239183622025-12-01 11:34:23103 days ago1764588863
0x9B495F6b...FB2AD7cEA
0.14474504 ETH
Dispatch233968272025-09-19 11:28:35176 days ago1758281315
0x9B495F6b...FB2AD7cEA
0.05710484 ETH
Dispatch231546722025-08-16 16:03:23210 days ago1755360203
0x9B495F6b...FB2AD7cEA
0.15538327 ETH
Dispatch229453402025-07-18 9:58:47239 days ago1752832727
0x9B495F6b...FB2AD7cEA
0.26326434 ETH
Dispatch225615612025-05-25 18:15:47293 days ago1748196947
0x9B495F6b...FB2AD7cEA
0.057623 ETH
Dispatch223799242025-04-30 5:58:11318 days ago1745992691
0x9B495F6b...FB2AD7cEA
0.14231727 ETH
Dispatch220813392025-03-19 13:53:35360 days ago1742392415
0x9B495F6b...FB2AD7cEA
0.05714977 ETH
Dispatch219236872025-02-25 13:37:47382 days ago1740490667
0x9B495F6b...FB2AD7cEA
0.05758231 ETH
Dispatch217387852025-01-30 17:15:35408 days ago1738257335
0x9B495F6b...FB2AD7cEA
0.1155429 ETH
Dispatch212934262024-11-29 12:43:11470 days ago1732884191
0x9B495F6b...FB2AD7cEA
0.1737567 ETH
Dispatch207224992024-09-10 20:08:59550 days ago1725998939
0x9B495F6b...FB2AD7cEA
0.01904002 ETH
Dispatch206298782024-08-28 21:49:35563 days ago1724881775
0x9B495F6b...FB2AD7cEA
0.11323685 ETH
Dispatch202341112024-07-04 15:41:59618 days ago1720107719
0x9B495F6b...FB2AD7cEA
0.03749635 ETH
Dispatch201123302024-06-17 15:13:47635 days ago1718637227
0x9B495F6b...FB2AD7cEA
0.3029197 ETH
Dispatch196850222024-04-18 21:28:11695 days ago1713475691
0x9B495F6b...FB2AD7cEA
0.14625622 ETH
0x3d602d80196850222024-04-18 21:28:11695 days ago1713475691  Contract Creation0 ETH
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Withdrawals

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Latest 25 from a total of 86 withdrawals (1.855269779 ETH withdrawn)

Validator Index Block Amount
1189055246507072026-03-13 19:42:4733 hrs ago17734309670.016479954 ETH
1189055245913002026-03-05 12:34:359 days ago17727140750.016543954 ETH
1189055245318702026-02-25 5:35:2317 days ago17719977230.016571911 ETH
1189055244723272026-02-16 22:19:5926 days ago17712803990.016715169 ETH
1189055244123462026-02-08 13:24:5934 days ago17705570990.016882031 ETH
1189055243521152026-01-31 3:18:4743 days ago17698295270.01689612 ETH
1189055242919562026-01-22 17:56:3551 days ago17691045950.016998769 ETH
1189055242316542026-01-14 8:09:3559 days ago17683781750.017212208 ETH
1189055241709732026-01-05 20:53:1168 days ago17676463910.017400106 ETH
1189055241098442025-12-28 8:10:1176 days ago17669094110.017587039 ETH
1189055240481162025-12-19 17:24:2385 days ago17661650630.017601814 ETH
1189055239862962025-12-11 1:55:1194 days ago17654181110.017562343 ETH
1189055239243562025-12-02 7:40:59102 days ago17646612590.017822883 ETH
1189055238618002025-11-23 13:10:35111 days ago17639034350.017650631 ETH
1189055237995962025-11-14 19:44:23120 days ago17631494630.01764959 ETH
1189055237373042025-11-06 2:36:47129 days ago17623966070.017709462 ETH
1189055236747612025-10-28 8:33:59137 days ago17616404390.018003103 ETH
1189055236112432025-10-19 10:59:35146 days ago17608715750.018133663 ETH
1189055235470232025-10-10 11:26:11155 days ago17600955710.018440747 ETH
1189055234820692025-10-01 9:29:47164 days ago17593109870.018532146 ETH
1189055234168312025-09-22 6:38:23173 days ago17585231030.018625706 ETH
1189055233511702025-09-13 2:29:47183 days ago17577305870.018802183 ETH
1189055232847292025-09-03 19:39:23192 days ago17569283630.019076213 ETH
1189055232172932025-08-25 9:41:47201 days ago17561149070.019226447 ETH
1189055231493752025-08-15 22:17:59211 days ago17552962790.019327526 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.