ETH Price: $2,352.51 (+7.86%)

Contract

0xC605b7077f23170464E202AAE2B690F1F322b2F9
 

Overview

ETH Balance

0.016312876 ETH

Eth Value

$38.38 (@ $2,352.51/ETH)

More Info

Private Name Tags

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer238505982025-11-21 23:19:59115 days ago1763767199IN
0xC605b707...1F322b2F9
0.01040229 ETH0.000005430.22902654
Transfer236618602025-10-26 13:13:47141 days ago1761484427IN
0xC605b707...1F322b2F9
0.01200137 ETH0.000003270.13792346
Transfer231754342025-08-19 13:31:23209 days ago1755610283IN
0xC605b707...1F322b2F9
0.0475739 ETH0.000012660.53431637
Transfer223569532025-04-27 0:58:59324 days ago1745715539IN
0xC605b707...1F322b2F9
0.07848272 ETH0.000011420.48176097
Transfer219901492025-03-06 20:11:35375 days ago1741291895IN
0xC605b707...1F322b2F9
0.01624077 ETH0.000020230.85349673
Transfer214354522024-12-19 8:43:59452 days ago1734597839IN
0xC605b707...1F322b2F9
0.0228283 ETH0.0002525510.65114024
Transfer206802252024-09-04 22:32:11558 days ago1725489131IN
0xC605b707...1F322b2F9
0.09300752 ETH0.000067372.84138576

Latest 25 internal transactions (View All)

Advanced mode:
Parent Transaction Hash Method Block
From
To
Dispatch246000032026-03-06 17:47:4710 days ago1772819267
0xC605b707...1F322b2F9
0.01638853 ETH
Dispatch245516812026-02-27 23:53:5917 days ago1772236439
0xC605b707...1F322b2F9
0.04977818 ETH
Dispatch243614102026-02-01 10:26:5943 days ago1769941619
0xC605b707...1F322b2F9
0.01676 ETH
Dispatch243580452026-01-31 23:09:5944 days ago1769900999
0xC605b707...1F322b2F9
0.05123972 ETH
Dispatch241308442025-12-31 6:33:3575 days ago1767162815
0xC605b707...1F322b2F9
0.05225416 ETH
Dispatch239368042025-12-04 1:43:59103 days ago1764812639
0xC605b707...1F322b2F9
0.01767208 ETH
Dispatch239022512025-11-29 5:31:47107 days ago1764394307
0xC605b707...1F322b2F9
0.11084185 ETH
Dispatch236982462025-10-31 15:30:59136 days ago1761924659
0xC605b707...1F322b2F9
0.11389574 ETH
Dispatch234943352025-10-03 2:41:59165 days ago1759459319
0xC605b707...1F322b2F9
0.0184054 ETH
Dispatch234770182025-09-30 16:32:23167 days ago1759249943
0xC605b707...1F322b2F9
0.05606757 ETH
Dispatch232600992025-08-31 9:01:35197 days ago1756630895
0xC605b707...1F322b2F9
0.15191001 ETH
Dispatch230419432025-07-31 22:05:23228 days ago1753999523
0xC605b707...1F322b2F9
0.01918671 ETH
Dispatch229583342025-07-20 5:32:23239 days ago1752989543
0xC605b707...1F322b2F9
0.03828459 ETH
Dispatch228248572025-07-01 14:02:47258 days ago1751378567
0xC605b707...1F322b2F9
0.01895314 ETH
Dispatch228210922025-07-01 1:24:23259 days ago1751333063
0xC605b707...1F322b2F9
0.03787596 ETH
Dispatch226275052025-06-03 23:48:11286 days ago1748994491
0xC605b707...1F322b2F9
0.01897948 ETH
Dispatch226051022025-05-31 20:30:59289 days ago1748723459
0xC605b707...1F322b2F9
0.05728659 ETH
Dispatch223859922025-05-01 2:20:35320 days ago1746066035
0xC605b707...1F322b2F9
0.18185334 ETH
Dispatch221706102025-04-01 0:55:23350 days ago1743468923
0xC605b707...1F322b2F9
0.11154256 ETH
Dispatch219627402025-03-03 0:20:59379 days ago1740961259
0xC605b707...1F322b2F9
0.07618429 ETH
Dispatch217487482025-02-01 2:40:47409 days ago1738377647
0xC605b707...1F322b2F9
0.05735435 ETH
Dispatch215264442025-01-01 1:50:59440 days ago1735696259
0xC605b707...1F322b2F9
0.12644475 ETH
Dispatch213048712024-12-01 3:07:59470 days ago1733022479
0xC605b707...1F322b2F9
0.07710307 ETH
Dispatch210894432024-11-01 1:14:59501 days ago1730423699
0xC605b707...1F322b2F9
0.05771606 ETH
Dispatch208688612024-10-01 6:29:59531 days ago1727764199
0xC605b707...1F322b2F9
0.19634243 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 64 withdrawals (1.49550042 ETH withdrawn)

Validator Index Block Amount
1540106246588552026-03-14 22:57:592 days ago17735290790.016312876 ETH
1540106245998512026-03-06 17:16:5910 days ago17728174190.016388533 ETH
1540106245404792026-02-26 10:25:2318 days ago17721015230.016489009 ETH
1540106244809962026-02-18 3:21:3526 days ago17713848950.0166497 ETH
1540106244211302026-02-09 18:53:5935 days ago17706632390.016639473 ETH
1540106243610252026-02-01 9:09:3543 days ago17699369750.016760006 ETH
1540106243009642026-01-24 0:07:4752 days ago17692132670.01693423 ETH
1540106242407192026-01-15 14:30:4760 days ago17684874470.017015175 ETH
1540106241803692026-01-07 4:18:5968 days ago17677595390.017290317 ETH
1540106241194002025-12-29 16:08:5977 days ago17670245390.017485774 ETH
1540106240577222025-12-21 1:34:3586 days ago17662808750.017494729 ETH
1540106239959152025-12-12 10:20:2394 days ago17655348230.017273659 ETH
1540106239341222025-12-03 16:31:47103 days ago17647795070.01767208 ETH
1540106238716882025-11-24 22:32:23112 days ago17640235430.065359883 ETH
1540106238095802025-11-16 5:13:11120 days ago17632699910.017525736 ETH
1540106237475822025-11-07 13:07:11129 days ago17625208310.017553935 ETH
1540106236853832025-10-29 20:17:59138 days ago17617690790.065570371 ETH
1540106236220332025-10-20 23:18:47147 days ago17610023270.018021774 ETH
1540106235580692025-10-12 0:29:59156 days ago17602289990.018302228 ETH
1540106234932242025-10-02 22:57:47165 days ago17594458670.018405408 ETH
1540106234282882025-09-23 21:02:47174 days ago17586613670.018463226 ETH
1540106233629392025-09-14 17:53:35183 days ago17578724150.018588199 ETH
1540106232967892025-09-05 12:04:35192 days ago17570738750.019016147 ETH
1540106232295302025-08-27 2:39:59202 days ago17562623990.0659517 ETH
1540106231619392025-08-17 16:22:11211 days ago17554477310.0191673 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.