Overview
ETH Balance
Eth Value
$0.00Latest 1 from a total of 1 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Transfer | 21805892 | 402 days ago | IN | 0.03272668 ETH | 0.00001909 |
Latest 17 internal transactions
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Dispatch | 22074273 | 364 days ago | 32.00806998 ETH | ||||
| Dispatch | 22032174 | 370 days ago | 0.1548573 ETH | ||||
| Dispatch | 21777356 | 406 days ago | 0.19344841 ETH | ||||
| Dispatch | 21083267 | 503 days ago | 0.11584393 ETH | ||||
| Dispatch | 20685168 | 558 days ago | 0.21551489 ETH | ||||
| Dispatch | 20100803 | 640 days ago | 0.03726254 ETH | ||||
| Dispatch | 19991944 | 655 days ago | 0.03691628 ETH | ||||
| Dispatch | 19883029 | 670 days ago | 0.01840594 ETH | ||||
| Dispatch | 19780030 | 685 days ago | 0.03657135 ETH | ||||
| Dispatch | 19673634 | 700 days ago | 0.03641428 ETH | ||||
| Dispatch | 19561567 | 715 days ago | 0.03641951 ETH | ||||
| Dispatch | 19436080 | 733 days ago | 0.03640882 ETH | ||||
| Dispatch | 19313490 | 750 days ago | 0.05309997 ETH | ||||
| Dispatch | 19170395 | 770 days ago | 0.08711758 ETH | ||||
| Dispatch | 18892600 | 809 days ago | 0.03471238 ETH | ||||
| Dispatch | 18751911 | 829 days ago | 0.05239194 ETH | ||||
| 0x3d602d80 | 18751911 | 829 days ago | Contract Creation | 0 ETH |
Cross-Chain Transactions
Withdrawals
Latest 25 from a total of 57 withdrawals (33.120728488 ETH withdrawn)
| Validator Index | Block | Amount | |
|---|---|---|---|
| 1024958 | 22072693 | 365 days ago | 32.008069987 ETH |
| 1024958 | 22006903 | 374 days ago | 0.019059685 ETH |
| 1024958 | 21941463 | 383 days ago | 0.019113007 ETH |
| 1024958 | 21875997 | 392 days ago | 0.019133857 ETH |
| 1024958 | 21810384 | 401 days ago | 0.064824073 ETH |
| 1024958 | 21744611 | 410 days ago | 0.019298915 ETH |
| 1024958 | 21678307 | 420 days ago | 0.019279777 ETH |
| 1024958 | 21612068 | 429 days ago | 0.019108024 ETH |
| 1024958 | 21545866 | 438 days ago | 0.019257222 ETH |
| 1024958 | 21479694 | 447 days ago | 0.019353653 ETH |
| 1024958 | 21413026 | 457 days ago | 0.019399462 ETH |
| 1024958 | 21345915 | 466 days ago | 0.019420935 ETH |
| 1024958 | 21278757 | 475 days ago | 0.019458628 ETH |
| 1024958 | 21211541 | 485 days ago | 0.019468932 ETH |
| 1024958 | 21143940 | 494 days ago | 0.01940287 ETH |
| 1024958 | 21076629 | 504 days ago | 0.019327317 ETH |
| 1024958 | 21009589 | 513 days ago | 0.019447909 ETH |
| 1024958 | 20942458 | 522 days ago | 0.019404186 ETH |
| 1024958 | 20875280 | 532 days ago | 0.019271032 ETH |
| 1024958 | 20808557 | 541 days ago | 0.019145952 ETH |
| 1024958 | 20741913 | 550 days ago | 0.019247541 ETH |
| 1024958 | 20675486 | 560 days ago | 0.019113248 ETH |
| 1024958 | 20609437 | 569 days ago | 0.019026888 ETH |
| 1024958 | 20543522 | 578 days ago | 0.019120717 ETH |
| 1024958 | 20477676 | 587 days ago | 0.018966225 ETH |
Minimal Proxy Contract for 0x933fbfeb4ed1f111d12a39c2ab48657e6fc875c6
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();
}
}{
"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"}]Net Worth in USD
Net Worth in ETH
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.