Source Code
Overview
ETH Balance
0 ETH
Eth Value
$0.00Latest 5 from a total of 5 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Release Ether | 23470544 | 157 days ago | IN | 0 ETH | 0.00004078 | ||||
| Start Vesting Pe... | 23255731 | 187 days ago | IN | 0 ETH | 0.00000716 | ||||
| Withdraw Validat... | 23137711 | 203 days ago | IN | 0 ETH | 0.00010408 | ||||
| Release Ether | 22884894 | 239 days ago | IN | 0 ETH | 0.00005293 | ||||
| Transfer | 22863698 | 242 days ago | IN | 0.02552277 ETH | 0.00000473 |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Withdrawals
Loading...
Loading
Contract Name:
WithdrawalControlContract
Compiler Version
v0.8.30+commit.73712a01
Contract Source Code (Solidity)
/**
*Submitted for verification at Etherscan.io on 2025-07-06
*/
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.30;
/// @author powsey.eth
/// @title Validator withdrawal control contract enforcing caps and vesting periods
contract WithdrawalControlContract {
//
// Constants
//
// Releases within allowance: maximum cummulative amount that can be released over a period
uint256 private constant ALLOWANCE_AMOUNT_WEI = 4 ether;
// Releases within allowance: duration of a period
uint256 private constant ALLOWANCE_PERIOD = 30 days;
// Vesting mechanism: balance threshold above which a vesting period can be started, and below which it is closed
uint256 private constant VESTING_THRESHOLD_WEI = 16 ether;
// Vesting mechanism: duration of the vesting period, after which the balance can be released in full
uint256 private constant VESTING_PERIOD = 30 days;
// Constants for EIP-7002 execution layer triggerred validator withdrawals
address private constant WITHDRAWAL_CONTRACT_ADDRESS = 0x00000961Ef480Eb55e80D19ad83579A64c007002;
uint64 private constant WITHDRAWAL_AMOUNT_GWEI_RANGE_MIN = 1;
uint64 private constant WITHDRAWAL_AMOUNT_GWEI_RANGE_MAX = 2048000000000; /* 2048 ETH */
uint256 private constant WITHDRAWAL_FEE_WEI_RANGE_MIN = 1;
uint256 private constant WITHDRAWAL_FEE_WEI_RANGE_MAX = 1000000000000000; /* 0.001 ETH */
//
// State variables
//
// Contract owner: the address that deployed the contract (cold wallet) for large withdrawal of vested assets
address private _owner;
// Hot wallet: address chosen at contract creation for small withdrawals within the allowance
address private _hotwallet;
// Vesting period: start timestamp
uint256 private _vestingPeriodStartTs;
// Release within allowance: start timestamp and remaining allowance
uint256 private _allowanceStartTs;
uint256 private _allowanceRemainingWei;
// Timestamp after which the hotwallet can make the next validator withdrawal request
uint256 private _nextHotwalletWithdrawalTs;
// Reentrency guard state
bool private transient _locked;
//
// Events
//
/// @notice Emitted when a vesting period is started
/// @param startsat timestamp at which the vesting period starts
/// @param endsat timestamp at which the vesting period will end
event VestingPeriodStarted(uint256 startsat, uint256 endsat);
/// @notice Emitted when funds are released from the smart contract
/// @param receiver address to which the funds were released
/// @param amount amount released in wei
event FundsReleased(address receiver, uint256 amount);
/// @notice Emitted when execution layer validator withdrawal is initiated by the contract
/// @param validator_pubkey public key of the validator from which funds are withdrawn
/// @param amount_gwei amount withdrawn in gwei
/// @param fee_wei withdrawal fees in wei (value of the withdrawai transaction)
event ValidatorWithdrawalInitiated(bytes validator_pubkey, uint64 amount_gwei, uint256 fee_wei);
/// @notice Emitted when execution layer validator voluntary exit is initiated by the contract
/// @param validator_pubkey public key of the validator from which funds are withdrawn
/// @param fee_wei withdrawal fees in wei (value of the withdrawai transaction)
event ValidatorExitInitiated(bytes validator_pubkey, uint256 fee_wei);
//
// Errors
//
// Raised if Reentrancy check failed
error ReentrancyCheckFailed();
/// @notice Raised when the caller is not allowed to perform the requested action (has to be the owner)
/// @param caller address of the caller that attempted the unauthorized operation
/// @param owner address of the owner (cold wallet) allowed to interact with this contract
/// @param hotwallet address of the hot wallet allowed to interact with this contract
error Unauthorized(address caller, address owner, address hotwallet);
/// @notice Raised if the requested amount is greated than the defined limit
/// @param requested amount requested to be released in wei
/// @param limit maximum amount that can be released at once in wei
error AmountOffLimit(uint256 requested, uint256 limit);
/// @notice Raised if the requested operation is not allowed at this time
/// @param now current timestamp
/// @param possibleafter time after which the operation will be possible
error NotPossibleYet(uint256 now, uint256 possibleafter);
/// @notice Raised when the contract balance is too low to perform the requested operation
/// @param needed amount needed to perform the requested operation
/// @param balance current balance available in the contract in wei
error InsufficientBalance(uint256 needed, uint256 balance);
/// @notice Raised if a provided parameter did not pass input validation
error InvalidParamValue();
/// @notice Raised if a call to an external function failed
error ExternalCallFailed();
//
// Modifiers
//
/// @notice Prevents reentrancy attacks on functions calling external code
modifier nonReentrant {
if (_locked)
revert ReentrancyCheckFailed();
_locked = true;
_;
_locked = false;
}
//
// Functions: constructor, receive, fallback
//
/// @notice Constructor that initializes the contract with the given release constraints
/// @param hotwallet hot wallet address (disabled if set to 0)
constructor(address hotwallet) {
_owner = msg.sender;
_hotwallet = hotwallet;
_vestingPeriodStartTs = 0;
_allowanceStartTs = block.timestamp;
_allowanceRemainingWei = ALLOWANCE_AMOUNT_WEI;
_nextHotwalletWithdrawalTs = block.timestamp;
}
// Allow to receive inbound transactions with funds
receive() external payable {
}
fallback() external payable {
}
//
// Functions: public
//
/// @notice Start a vesting period
function startVestingPeriod() public {
// only the contract owner can call this function
if (msg.sender != _owner)
revert Unauthorized({caller: msg.sender, owner: _owner, hotwallet: _hotwallet});
// there must be at least VESTING_THRESHOLD_WEI in the contract
if (address(this).balance < VESTING_THRESHOLD_WEI)
revert InsufficientBalance({needed: VESTING_THRESHOLD_WEI, balance: address(this).balance});
// there must not be another ongoing vesting period
if (_vestingPeriodStartTs != 0)
revert NotPossibleYet({now: block.timestamp, possibleafter: block.timestamp + VESTING_PERIOD});
_vestingPeriodStartTs = block.timestamp;
emit VestingPeriodStarted({startsat: block.timestamp, endsat: block.timestamp + VESTING_PERIOD});
}
/// @notice Request release of funds held in the contract
/// @param amountWei amount to release in wei
function releaseEther(uint256 amountWei) public nonReentrant {
// make sure that the requested amount is valid and does not exceed the contract balance
if (amountWei < 1)
revert InvalidParamValue();
if (amountWei > address(this).balance)
revert InsufficientBalance({needed: amountWei, balance: address(this).balance});
// only the contract owner and hot wallet (if defined) can call this function
if (msg.sender == _owner)
return releaseEtherToOwner(amountWei);
else if (_hotwallet != address(0) && msg.sender == _hotwallet)
return releaseEtherWithinAllowance(amountWei, false);
revert Unauthorized({caller: msg.sender, owner: _owner, hotwallet: _hotwallet});
}
/// @notice Request an EL triggered withdrawal or exit for the specified validator (EIP-7002)
/// @param validatorPubkey public key of the validator from which funds will be withdrawn
/// @param amountGwei amount to withdraw in gwei or the special value of 0 to exit the validator
/// @param feeWei withdrawal fees to pay in wei (value of the transaction)
function withdrawValidator(bytes calldata validatorPubkey, uint64 amountGwei, uint256 feeWei) public nonReentrant {
// input validation on parameters
if (validatorPubkey.length != 48 ||
!((amountGwei >= WITHDRAWAL_AMOUNT_GWEI_RANGE_MIN && amountGwei <= WITHDRAWAL_AMOUNT_GWEI_RANGE_MAX) || amountGwei == 0) ||
feeWei < WITHDRAWAL_FEE_WEI_RANGE_MIN || feeWei > WITHDRAWAL_FEE_WEI_RANGE_MAX)
revert InvalidParamValue();
// contract balance must be enough to cover withdrawal fees
if (address(this).balance < feeWei)
revert InsufficientBalance({needed: feeWei, balance: address(this).balance});
// only the contract owner or hotwallet can call this function
if (_hotwallet != address(0) && msg.sender == _hotwallet) {
// for hotwallet: only once per allowance period, and no more than the maximum allowance amount
if (amountGwei < WITHDRAWAL_AMOUNT_GWEI_RANGE_MIN || amountGwei > (ALLOWANCE_AMOUNT_WEI / 1 gwei))
revert AmountOffLimit({requested: amountGwei * 1 gwei, limit: ALLOWANCE_AMOUNT_WEI});
if (block.timestamp < _nextHotwalletWithdrawalTs)
revert NotPossibleYet(block.timestamp, _nextHotwalletWithdrawalTs);
_nextHotwalletWithdrawalTs = block.timestamp + ALLOWANCE_PERIOD;
}
else if (msg.sender != _owner)
{
revert Unauthorized({caller: msg.sender, owner: _owner, hotwallet: _hotwallet});
}
(bool success,) = WITHDRAWAL_CONTRACT_ADDRESS.call{value: feeWei}(abi.encodePacked(validatorPubkey, amountGwei));
if (!success)
revert ExternalCallFailed();
if (amountGwei > 0)
emit ValidatorWithdrawalInitiated(validatorPubkey, amountGwei, feeWei);
else
emit ValidatorExitInitiated(validatorPubkey, feeWei);
}
/// @notice Revoke the defined hotwallet, preventing it from interacting with the contract
function revokeHotwallet() public {
// only the contract owner can call this function
if (msg.sender != _owner)
revert Unauthorized({caller: msg.sender, owner: _owner, hotwallet: _hotwallet});
_hotwallet = address(0);
}
/// @notice Get information about the contract state
/// @return ownerAddress contract owner address
/// @return hotwalletAddress hotwallet address (0 if not defined or revoked)
/// @return balanceWei amount currently held in the contract in wei
/// @return nextHotwalletWithdrawalTs time after which the hotwallet can make the next validator withdrawal request
/// @return nextHotwalletWithdrawalMaxWei maximum amount the hotwallet can withdraw from the validator at once
/// @return allowanceRemainingWei maximum amount that can still be released within the allowance
/// @return vestingPeriodEndTs when vested funds will be fully available, or 0 if there are no vested funds
function getState() public view returns (
address ownerAddress,
address hotwalletAddress,
uint256 balanceWei,
uint256 nextHotwalletWithdrawalTs,
uint256 nextHotwalletWithdrawalMaxWei,
uint256 allowanceRemainingWei,
uint256 vestingPeriodEndTs
) {
return (
_owner,
_hotwallet,
address(this).balance,
_nextHotwalletWithdrawalTs,
ALLOWANCE_AMOUNT_WEI,
((block.timestamp > _allowanceStartTs + ALLOWANCE_PERIOD) ? ALLOWANCE_AMOUNT_WEI : _allowanceRemainingWei),
getVestingPeriodEndTs()
);
}
//
// Functions: private
//
/// @notice Calculate the time at which the vesting period ends
/// @return timestamp of the end of the current vesting period or 0 if no vesting period is active
function getVestingPeriodEndTs() private view returns (uint256) {
return ((_vestingPeriodStartTs != 0) ? _vestingPeriodStartTs + VESTING_PERIOD : 0);
}
/// @notice Handle fund release requests within allowance constraints
/// @param amountWei requested amount in wei
/// @param releaseToOwner whether the funds are released to the owner address (true) or the hot wallet (false)
function releaseEtherWithinAllowance(uint256 amountWei, bool releaseToOwner) private {
// replenish the allowance if the previous period had expired
if (block.timestamp > _allowanceStartTs + ALLOWANCE_PERIOD) {
_allowanceStartTs = block.timestamp;
_allowanceRemainingWei = ALLOWANCE_AMOUNT_WEI;
}
// make sure that the requested amount does not exceed the remaining allowance
if (amountWei > _allowanceRemainingWei)
revert AmountOffLimit({requested: amountWei, limit: _allowanceRemainingWei});
// update state
_allowanceRemainingWei -= amountWei;
if (_vestingPeriodStartTs != 0 && address(this).balance - amountWei < VESTING_THRESHOLD_WEI)
_vestingPeriodStartTs = 0;
// send the funds to the requested recipient
address recipient = ((releaseToOwner) ? _owner : _hotwallet);
(bool success,) = recipient.call{value: amountWei}("");
if (!success)
revert ExternalCallFailed();
emit FundsReleased(recipient, amountWei);
}
/// @notice Handle fund release requests to the owner (cold wallet)
/// @param amountWei requested amount in wei
function releaseEtherToOwner(uint256 amountWei) private {
uint256 vestingPeriodEndTs = getVestingPeriodEndTs();
// if the vesting period has not ended yet, allow releases to the owner within the hot wallet allowance
// this allows the cold wallet to be used as backup in case the hot wallet is lost or revoked
if (vestingPeriodEndTs == 0 || block.timestamp < vestingPeriodEndTs)
return releaseEtherWithinAllowance(amountWei, true);
// update state
if (_vestingPeriodStartTs != 0 && address(this).balance - amountWei < VESTING_THRESHOLD_WEI)
_vestingPeriodStartTs = 0;
// send the funds to owner
(bool success,) = _owner.call{value: amountWei}("");
if (!success)
revert ExternalCallFailed();
emit FundsReleased(_owner, amountWei);
}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"hotwallet","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"AmountOffLimit","type":"error"},{"inputs":[],"name":"ExternalCallFailed","type":"error"},{"inputs":[{"internalType":"uint256","name":"needed","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"}],"name":"InsufficientBalance","type":"error"},{"inputs":[],"name":"InvalidParamValue","type":"error"},{"inputs":[{"internalType":"uint256","name":"now","type":"uint256"},{"internalType":"uint256","name":"possibleafter","type":"uint256"}],"name":"NotPossibleYet","type":"error"},{"inputs":[],"name":"ReentrancyCheckFailed","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"hotwallet","type":"address"}],"name":"Unauthorized","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"receiver","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"validator_pubkey","type":"bytes"},{"indexed":false,"internalType":"uint256","name":"fee_wei","type":"uint256"}],"name":"ValidatorExitInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bytes","name":"validator_pubkey","type":"bytes"},{"indexed":false,"internalType":"uint64","name":"amount_gwei","type":"uint64"},{"indexed":false,"internalType":"uint256","name":"fee_wei","type":"uint256"}],"name":"ValidatorWithdrawalInitiated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"startsat","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"endsat","type":"uint256"}],"name":"VestingPeriodStarted","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"getState","outputs":[{"internalType":"address","name":"ownerAddress","type":"address"},{"internalType":"address","name":"hotwalletAddress","type":"address"},{"internalType":"uint256","name":"balanceWei","type":"uint256"},{"internalType":"uint256","name":"nextHotwalletWithdrawalTs","type":"uint256"},{"internalType":"uint256","name":"nextHotwalletWithdrawalMaxWei","type":"uint256"},{"internalType":"uint256","name":"allowanceRemainingWei","type":"uint256"},{"internalType":"uint256","name":"vestingPeriodEndTs","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountWei","type":"uint256"}],"name":"releaseEther","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revokeHotwallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startVestingPeriod","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes","name":"validatorPubkey","type":"bytes"},{"internalType":"uint64","name":"amountGwei","type":"uint64"},{"internalType":"uint256","name":"feeWei","type":"uint256"}],"name":"withdrawValidator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
6080604052348015600e575f5ffd5b50604051610ccf380380610ccf833981016040819052602b916074565b5f8054336001600160a01b0319918216178255600180549091166001600160a01b039390931692909217909155600255426003819055673782dace9d900000600455600555609f565b5f602082840312156083575f5ffd5b81516001600160a01b03811681146098575f5ffd5b9392505050565b610c23806100ac5f395ff3fe608060405260043610610049575f3560e01c80631865c57d1461004b5780632126e259146100a357806336cc9732146100c2578063b326b8a5146100d6578063d73bb3d0146100ea575b005b348015610056575f5ffd5b5061005f610109565b604080516001600160a01b039889168152979096166020880152948601939093526060850191909152608084015260a083015260c082015260e00160405180910390f35b3480156100ae575f5ffd5b506100496100bd3660046109e7565b610181565b3480156100cd575f5ffd5b506100496104df565b3480156100e1575f5ffd5b506100496105df565b3480156100f5575f5ffd5b50610049610104366004610a78565b610631565b5f80546001546005546003548493849384938493849384936001600160a01b0391821693911691479190673782dace9d9000009061014b9062278d0090610aa3565b421161015957600454610163565b673782dace9d9000005b61016b61073c565b959d949c50929a50909850965094509092509050565b60ff5f5c16156101a45760405163e0d691a160e01b815260040160405180910390fd5b60015f805c60ff19168217905d506030831415806101fd5750600167ffffffffffffffff8316108015906101e857506501dcd650000067ffffffffffffffff831611155b806101fb575067ffffffffffffffff8216155b155b806102085750600181105b80610219575066038d7ea4c6800081115b156102375760405163abc45dc760e01b815260040160405180910390fd5b804710156102665760405163cf47918160e01b8152600481018290524760248201526044015b60405180910390fd5b6001546001600160a01b03161580159061028a57506001546001600160a01b031633145b1561035257600167ffffffffffffffff831610806102c657506102b9633b9aca00673782dace9d900000610abc565b8267ffffffffffffffff16115b1561030d576102d982633b9aca00610adb565b604051637087783f60e01b815267ffffffffffffffff9091166004820152673782dace9d900000602482015260440161025d565b60055442101561033d5760055460405163e9312a8f60e01b8152426004820152602481019190915260440161025d565b61034a62278d0042610aa3565b600555610392565b5f546001600160a01b03163314610392575f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b5f710961ef480eb55e80d19ad83579a64c0070026001600160a01b0316828686866040516020016103c593929190610b28565b60408051601f19818403018152908290526103df91610b49565b5f6040518083038185875af1925050503d805f8114610419576040519150601f19603f3d011682016040523d82523d5f602084013e61041e565b606091505b50509050806104405760405163350c20f160e01b815260040160405180910390fd5b67ffffffffffffffff831615610492577fa71d17b90b5090694c5e2c3fdd2657654697dcc24ff3779bcf65b4adba73c28a858585856040516104859493929190610b87565b60405180910390a16104ce565b7f21840d740fee2d45b716e64f302d83edda3f569262110b180701e1b9059296758585846040516104c593929190610bb7565b60405180910390a15b505f60ff19815c16815d5050505050565b5f546001600160a01b0316331461051f575f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b67de0b6b3a764000004710156105585760405163cf47918160e01b815267de0b6b3a76400000600482015247602482015260440161025d565b60025415610590574261056e62278d0082610aa3565b60405163e9312a8f60e01b81526004810192909252602482015260440161025d565b4260028190557fb3e49202be74b934be95292192066de813483fc0133fabc3ae2db77cd3844a2b906105c562278d0082610aa3565b6040805192835260208301919091520160405180910390a1565b5f546001600160a01b0316331461061f575f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b600180546001600160a01b0319169055565b60ff5f5c16156106545760405163e0d691a160e01b815260040160405180910390fd5b60015f805c60ff19168217905d5060018110156106845760405163abc45dc760e01b815260040160405180910390fd5b478111156106ae5760405163cf47918160e01b81526004810182905247602482015260440161025d565b5f546001600160a01b031633036106cd576106c881610761565b61072f565b6001546001600160a01b0316158015906106f157506001546001600160a01b031633145b15610700576106c8815f610872565b5f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b5f60ff19815c16815d5050565b5f6002545f0361074b57505f90565b62278d0060025461075c9190610aa3565b905090565b5f61076a61073c565b905080158061077857508042105b1561078c57610788826001610872565b5050565b600254158015906107ad575067de0b6b3a764000006107ab8347610bda565b105b156107b7575f6002555b5f80546040516001600160a01b039091169084908381818185875af1925050503d805f8114610801576040519150601f19603f3d011682016040523d82523d5f602084013e610806565b606091505b50509050806108285760405163350c20f160e01b815260040160405180910390fd5b5f54604080516001600160a01b039092168252602082018590527f221c08a06b07a64803b3787861a3f276212fcccb51c2e6234077a9b8cb13047a910160405180910390a1505050565b62278d006003546108839190610aa3565b42111561089b5742600355673782dace9d9000006004555b6004548211156108c95760048054604051637087783f60e01b8152918201849052602482015260440161025d565b8160045f8282546108da9190610bda565b909155505060025415801590610900575067de0b6b3a764000006108fe8347610bda565b105b1561090a575f6002555b5f81610921576001546001600160a01b031661092d565b5f546001600160a01b03165b90505f816001600160a01b0316846040515f6040518083038185875af1925050503d805f8114610978576040519150601f19603f3d011682016040523d82523d5f602084013e61097d565b606091505b505090508061099f5760405163350c20f160e01b815260040160405180910390fd5b604080516001600160a01b0384168152602081018690527f221c08a06b07a64803b3787861a3f276212fcccb51c2e6234077a9b8cb13047a910160405180910390a150505050565b5f5f5f5f606085870312156109fa575f5ffd5b843567ffffffffffffffff811115610a10575f5ffd5b8501601f81018713610a20575f5ffd5b803567ffffffffffffffff811115610a36575f5ffd5b876020828401011115610a47575f5ffd5b60209182019550935085013567ffffffffffffffff81168114610a68575f5ffd5b9396929550929360400135925050565b5f60208284031215610a88575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ab657610ab6610a8f565b92915050565b5f82610ad657634e487b7160e01b5f52601260045260245ffd5b500490565b67ffffffffffffffff8181168382160290811690818114610afe57610afe610a8f565b5092915050565b6001600160a01b0393841681529183166020830152909116604082015260600190565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f82518060208501845e5f920191825250919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f610b9a606083018688610b5f565b67ffffffffffffffff949094166020830152506040015292915050565b604081525f610bca604083018587610b5f565b9050826020830152949350505050565b81810381811115610ab657610ab6610a8f56fea2646970667358221220c19461eaa019bf199e071601a62710f803c4b8e497f1ce4ace6ac1e035fb780564736f6c634300081e0033000000000000000000000000c2ac6204f37889977d92a236ceb6f98b04667d11
Deployed Bytecode
0x608060405260043610610049575f3560e01c80631865c57d1461004b5780632126e259146100a357806336cc9732146100c2578063b326b8a5146100d6578063d73bb3d0146100ea575b005b348015610056575f5ffd5b5061005f610109565b604080516001600160a01b039889168152979096166020880152948601939093526060850191909152608084015260a083015260c082015260e00160405180910390f35b3480156100ae575f5ffd5b506100496100bd3660046109e7565b610181565b3480156100cd575f5ffd5b506100496104df565b3480156100e1575f5ffd5b506100496105df565b3480156100f5575f5ffd5b50610049610104366004610a78565b610631565b5f80546001546005546003548493849384938493849384936001600160a01b0391821693911691479190673782dace9d9000009061014b9062278d0090610aa3565b421161015957600454610163565b673782dace9d9000005b61016b61073c565b959d949c50929a50909850965094509092509050565b60ff5f5c16156101a45760405163e0d691a160e01b815260040160405180910390fd5b60015f805c60ff19168217905d506030831415806101fd5750600167ffffffffffffffff8316108015906101e857506501dcd650000067ffffffffffffffff831611155b806101fb575067ffffffffffffffff8216155b155b806102085750600181105b80610219575066038d7ea4c6800081115b156102375760405163abc45dc760e01b815260040160405180910390fd5b804710156102665760405163cf47918160e01b8152600481018290524760248201526044015b60405180910390fd5b6001546001600160a01b03161580159061028a57506001546001600160a01b031633145b1561035257600167ffffffffffffffff831610806102c657506102b9633b9aca00673782dace9d900000610abc565b8267ffffffffffffffff16115b1561030d576102d982633b9aca00610adb565b604051637087783f60e01b815267ffffffffffffffff9091166004820152673782dace9d900000602482015260440161025d565b60055442101561033d5760055460405163e9312a8f60e01b8152426004820152602481019190915260440161025d565b61034a62278d0042610aa3565b600555610392565b5f546001600160a01b03163314610392575f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b5f710961ef480eb55e80d19ad83579a64c0070026001600160a01b0316828686866040516020016103c593929190610b28565b60408051601f19818403018152908290526103df91610b49565b5f6040518083038185875af1925050503d805f8114610419576040519150601f19603f3d011682016040523d82523d5f602084013e61041e565b606091505b50509050806104405760405163350c20f160e01b815260040160405180910390fd5b67ffffffffffffffff831615610492577fa71d17b90b5090694c5e2c3fdd2657654697dcc24ff3779bcf65b4adba73c28a858585856040516104859493929190610b87565b60405180910390a16104ce565b7f21840d740fee2d45b716e64f302d83edda3f569262110b180701e1b9059296758585846040516104c593929190610bb7565b60405180910390a15b505f60ff19815c16815d5050505050565b5f546001600160a01b0316331461051f575f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b67de0b6b3a764000004710156105585760405163cf47918160e01b815267de0b6b3a76400000600482015247602482015260440161025d565b60025415610590574261056e62278d0082610aa3565b60405163e9312a8f60e01b81526004810192909252602482015260440161025d565b4260028190557fb3e49202be74b934be95292192066de813483fc0133fabc3ae2db77cd3844a2b906105c562278d0082610aa3565b6040805192835260208301919091520160405180910390a1565b5f546001600160a01b0316331461061f575f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b600180546001600160a01b0319169055565b60ff5f5c16156106545760405163e0d691a160e01b815260040160405180910390fd5b60015f805c60ff19168217905d5060018110156106845760405163abc45dc760e01b815260040160405180910390fd5b478111156106ae5760405163cf47918160e01b81526004810182905247602482015260440161025d565b5f546001600160a01b031633036106cd576106c881610761565b61072f565b6001546001600160a01b0316158015906106f157506001546001600160a01b031633145b15610700576106c8815f610872565b5f54600154604051631011975160e01b815261025d9233926001600160a01b0391821692911690600401610b05565b5f60ff19815c16815d5050565b5f6002545f0361074b57505f90565b62278d0060025461075c9190610aa3565b905090565b5f61076a61073c565b905080158061077857508042105b1561078c57610788826001610872565b5050565b600254158015906107ad575067de0b6b3a764000006107ab8347610bda565b105b156107b7575f6002555b5f80546040516001600160a01b039091169084908381818185875af1925050503d805f8114610801576040519150601f19603f3d011682016040523d82523d5f602084013e610806565b606091505b50509050806108285760405163350c20f160e01b815260040160405180910390fd5b5f54604080516001600160a01b039092168252602082018590527f221c08a06b07a64803b3787861a3f276212fcccb51c2e6234077a9b8cb13047a910160405180910390a1505050565b62278d006003546108839190610aa3565b42111561089b5742600355673782dace9d9000006004555b6004548211156108c95760048054604051637087783f60e01b8152918201849052602482015260440161025d565b8160045f8282546108da9190610bda565b909155505060025415801590610900575067de0b6b3a764000006108fe8347610bda565b105b1561090a575f6002555b5f81610921576001546001600160a01b031661092d565b5f546001600160a01b03165b90505f816001600160a01b0316846040515f6040518083038185875af1925050503d805f8114610978576040519150601f19603f3d011682016040523d82523d5f602084013e61097d565b606091505b505090508061099f5760405163350c20f160e01b815260040160405180910390fd5b604080516001600160a01b0384168152602081018690527f221c08a06b07a64803b3787861a3f276212fcccb51c2e6234077a9b8cb13047a910160405180910390a150505050565b5f5f5f5f606085870312156109fa575f5ffd5b843567ffffffffffffffff811115610a10575f5ffd5b8501601f81018713610a20575f5ffd5b803567ffffffffffffffff811115610a36575f5ffd5b876020828401011115610a47575f5ffd5b60209182019550935085013567ffffffffffffffff81168114610a68575f5ffd5b9396929550929360400135925050565b5f60208284031215610a88575f5ffd5b5035919050565b634e487b7160e01b5f52601160045260245ffd5b80820180821115610ab657610ab6610a8f565b92915050565b5f82610ad657634e487b7160e01b5f52601260045260245ffd5b500490565b67ffffffffffffffff8181168382160290811690818114610afe57610afe610a8f565b5092915050565b6001600160a01b0393841681529183166020830152909116604082015260600190565b8284823760c09190911b6001600160c01b0319169101908152600801919050565b5f82518060208501845e5f920191825250919050565b81835281816020850137505f828201602090810191909152601f909101601f19169091010190565b606081525f610b9a606083018688610b5f565b67ffffffffffffffff949094166020830152506040015292915050565b604081525f610bca604083018587610b5f565b9050826020830152949350505050565b81810381811115610ab657610ab6610a8f56fea2646970667358221220c19461eaa019bf199e071601a62710f803c4b8e497f1ce4ace6ac1e035fb780564736f6c634300081e0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c2ac6204f37889977d92a236ceb6f98b04667d11
-----Decoded View---------------
Arg [0] : hotwallet (address): 0xC2aC6204f37889977D92A236CEB6f98b04667d11
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000c2ac6204f37889977d92a236ceb6f98b04667d11
Deployed Bytecode Sourcemap
170:14592:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11338:666;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;347:32:1;;;329:51;;416:32;;;;411:2;396:18;;389:60;465:18;;;458:34;;;;523:2;508:18;;501:34;;;;566:3;551:19;;544:35;367:3;595:19;;588:35;654:3;639:19;;632:35;316:3;301:19;11338:666:0;;;;;;;8307:1935;;;;;;;;;;-1:-1:-1;8307:1935:0;;;;;:::i;:::-;;:::i;6172:846::-;;;;;;;;;;;;;:::i;10346:266::-;;;;;;;;;;;;;:::i;7140:783::-;;;;;;;;;;-1:-1:-1;7140:783:0;;;;;:::i;:::-;;:::i;11338:666::-;11389:20;11683:6;;;11704:10;11765:26;;11861:17;;11389:20;;;;;;;;;;;;-1:-1:-1;;;;;11683:6:0;;;;11704:10;;;11729:21;;11765:26;395:7;;11861:36;;509:7;;11861:36;:::i;:::-;11843:15;:54;11842:104;;11924:22;;11842:104;;;395:7;11842:104;11962:23;:21;:23::i;:::-;11661:335;;;;-1:-1:-1;11661:335:0;;-1:-1:-1;11661:335:0;;-1:-1:-1;11661:335:0;-1:-1:-1;11661:335:0;-1:-1:-1;11661:335:0;;-1:-1:-1;11338:666:0;-1:-1:-1;11338:666:0:o;8307:1935::-;5282:7;;;;5278:56;;;5311:23;;-1:-1:-1;;;5311:23:0;;;;;;;;;;;5278:56;5355:4;5345:7;:14;;-1:-1:-1;;5345:14:0;;;;;-1:-1:-1;8505:2:0::1;8479:28:::0;::::1;;::::0;:165:::1;;-1:-1:-1::0;1116:1:0::1;8527:46;::::0;::::1;;::::0;::::1;::::0;:96:::1;;-1:-1:-1::0;1183:13:0::1;8577:46;::::0;::::1;;;8527:96;8526:117;;;-1:-1:-1::0;8628:15:0::1;::::0;::::1;::::0;8526:117:::1;8524:120;8479:165;:219;;;;1274:1;8661:6;:37;8479:219;:260;;;;1338:16;8702:6;:37;8479:260;8475:305;;;8761:19;;-1:-1:-1::0;;;8761:19:0::1;;;;;;;;;;;8475:305;8890:6;8866:21;:30;8862:125;;;8918:69;::::0;-1:-1:-1;;;8918:69:0;;::::1;::::0;::::1;2234:25:1::0;;;8964:21:0::1;2275:18:1::0;;;2268:34;2207:18;;8918:69:0::1;;;;;;;;8862:125;9076:10;::::0;-1:-1:-1;;;;;9076:10:0::1;:24:::0;;::::1;::::0;:52:::1;;-1:-1:-1::0;9118:10:0::1;::::0;-1:-1:-1;;;;;9118:10:0::1;9104;:24;9076:52;9072:776;;;1116:1;9258:45;::::0;::::1;;::::0;:93:::1;;-1:-1:-1::0;9321:29:0::1;9344:6;395:7;9321:29;:::i;:::-;9307:10;:44;;;9258:93;9254:200;;;9404:19;:10:::0;9417:6:::1;9404:19;:::i;:::-;9377:77;::::0;-1:-1:-1;;;9377:77:0;;3011:18:1;2999:31;;;9377:77:0::1;::::0;::::1;2981:50:1::0;395:7:0::1;3047:18:1::0;;;3040:34;2954:18;;9377:77:0::1;2808:272:1::0;9254:200:0::1;9491:26;;9473:15;:44;9469:133;;;9575:26;::::0;9543:59:::1;::::0;-1:-1:-1;;;9543:59:0;;9558:15:::1;9543:59;::::0;::::1;2234:25:1::0;2275:18;;;2268:34;;;;2207:18;;9543:59:0::1;2060:248:1::0;9469:133:0::1;9646:34;509:7;9646:15;:34;:::i;:::-;9617:26;:63:::0;9072:776:::1;;;9725:6;::::0;-1:-1:-1;;;;;9725:6:0::1;9711:10;:20;9707:141;;9805:6;::::0;;9824:10;9764:72:::1;::::0;-1:-1:-1;;;9764:72:0;;::::1;::::0;9786:10:::1;::::0;-1:-1:-1;;;;;9805:6:0;;::::1;::::0;9824:10;::::1;::::0;9764:72:::1;;;:::i;9707:141::-;9861:12;1008:42;-1:-1:-1::0;;;;;9878:32:0::1;9918:6;9943:15;;9960:10;9926:45;;;;;;;;;;:::i;:::-;;::::0;;-1:-1:-1;;9926:45:0;;::::1;::::0;;;;;;;9878:94:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9860:112;;;9988:7;9983:54;;10017:20;;-1:-1:-1::0;;;10017:20:0::1;;;;;;;;;;;9983:54;10054:14;::::0;::::1;::::0;10050:184:::1;;10088:65;10117:15;;10134:10;10146:6;10088:65;;;;;;;;;:::i;:::-;;;;;;;;10050:184;;;10187:47;10210:15;;10227:6;10187:47;;;;;;;;:::i;:::-;;;;;;;;10050:184;-1:-1:-1::0;5392:5:0;-1:-1:-1;;5382:15:0;;;5392:5;5382:15;;8307:1935;;;;:::o;6172:846::-;6297:6;;-1:-1:-1;;;;;6297:6:0;6283:10;:20;6279:118;;6366:6;;;6385:10;6325:72;;-1:-1:-1;;;6325:72:0;;;;6347:10;;-1:-1:-1;;;;;6366:6:0;;;;6385:10;;;6325:72;;;:::i;6279:118::-;693:8;6487:21;:45;6483:155;;;6554:84;;-1:-1:-1;;;6554:84:0;;693:8;6554:84;;;2234:25:1;6615:21:0;2275:18:1;;;2268:34;2207:18;;6554:84:0;2060:248:1;6483:155:0;6716:21;;:26;6712:139;;6785:15;6817:32;857:7;6785:15;6817:32;:::i;:::-;6764:87;;-1:-1:-1;;;6764:87:0;;;;;2234:25:1;;;;2275:18;;;2268:34;2207:18;;6764:87:0;2060:248:1;6712:139:0;6888:15;6864:21;:39;;;6919:91;;6976:32;857:7;6888:15;6976:32;:::i;:::-;6919:91;;;2234:25:1;;;2290:2;2275:18;;2268:34;;;;2207:18;6919:91:0;;;;;;;6172:846::o;10346:266::-;10468:6;;-1:-1:-1;;;;;10468:6:0;10454:10;:20;10450:118;;10537:6;;;10556:10;10496:72;;-1:-1:-1;;;10496:72:0;;;;10518:10;;-1:-1:-1;;;;;10537:6:0;;;;10556:10;;;10496:72;;;:::i;10450:118::-;10581:10;:23;;-1:-1:-1;;;;;;10581:23:0;;;10346:266::o;7140:783::-;5282:7;;;;5278:56;;;5311:23;;-1:-1:-1;;;5311:23:0;;;;;;;;;;;5278:56;5355:4;5345:7;:14;;-1:-1:-1;;5345:14:0;;;;;;7326:1:::1;7314:9;:13;7310:58;;;7349:19;;-1:-1:-1::0;;;7349:19:0::1;;;;;;;;;;;7310:58;7395:21;7383:9;:33;7379:131;;;7438:72;::::0;-1:-1:-1;;;7438:72:0;;::::1;::::0;::::1;2234:25:1::0;;;7487:21:0::1;2275:18:1::0;;;2268:34;2207:18;;7438:72:0::1;2060:248:1::0;7379:131:0::1;7628:6;::::0;-1:-1:-1;;;;;7628:6:0::1;7614:10;:20:::0;7610:215:::1;;7656:30;7676:9;7656:19;:30::i;:::-;7649:37;;7610:215;7706:10;::::0;-1:-1:-1;;;;;7706:10:0::1;:24:::0;;::::1;::::0;:52:::1;;-1:-1:-1::0;7748:10:0::1;::::0;-1:-1:-1;;;;;7748:10:0::1;7734;:24;7706:52;7702:123;;;7780:45;7808:9;7819:5;7780:27;:45::i;7702:123::-;7884:6;::::0;;7903:10;7843:72:::1;::::0;-1:-1:-1;;;7843:72:0;;::::1;::::0;7865:10:::1;::::0;-1:-1:-1;;;;;7884:6:0;;::::1;::::0;7903:10;::::1;::::0;7843:72:::1;;;:::i;5370:1::-;5392:5:::0;-1:-1:-1;;5382:15:0;;;5392:5;5382:15;;7140:783;:::o;12230:165::-;12285:7;12314:21;;12339:1;12314:26;12313:73;;-1:-1:-1;12385:1:0;;12230:165::o;12313:73::-;857:7;12344:21;;:38;;;;:::i;:::-;12305:82;;12230:165;:::o;13886:873::-;13953:26;13982:23;:21;:23::i;:::-;13953:52;-1:-1:-1;14238:23:0;;;:63;;;14283:18;14265:15;:36;14238:63;14234:133;;;14323:44;14351:9;14362:4;14323:27;:44::i;:::-;14316:51;13886:873;:::o;14234:133::-;14409:21;;:26;;;;:87;;-1:-1:-1;693:8:0;14439:33;14463:9;14439:21;:33;:::i;:::-;:57;14409:87;14405:131;;;14535:1;14511:21;:25;14405:131;14586:12;14603:6;;:33;;-1:-1:-1;;;;;14603:6:0;;;;14622:9;;14586:12;14603:33;14586:12;14603:33;14622:9;14603:6;:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14585:51;;;14652:7;14647:54;;14681:20;;-1:-1:-1;;;14681:20:0;;;;;;;;;;;14647:54;14733:6;;14719:32;;;-1:-1:-1;;;;;14733:6:0;;;5675:51:1;;5757:2;5742:18;;5735:34;;;14719:32:0;;5648:18:1;14719:32:0;;;;;;;13942:817;;13886:873;:::o;12644:1111::-;509:7;12833:17;;:36;;;;:::i;:::-;12815:15;:54;12811:182;;;12906:15;12886:17;:35;395:7;12936:22;:45;12811:182;13109:22;;13097:9;:34;13093:129;;;13198:22;;;13153:69;;-1:-1:-1;;;13153:69:0;;;;;2234:25:1;;;2275:18;;;2268:34;2207:18;;13153:69:0;2060:248:1;13093:129:0;13286:9;13260:22;;:35;;;;;;;:::i;:::-;;;;-1:-1:-1;;13310:21:0;;:26;;;;:87;;-1:-1:-1;693:8:0;13340:33;13364:9;13340:21;:33;:::i;:::-;:57;13310:87;13306:131;;;13436:1;13412:21;:25;13306:131;13504:17;13526:14;13525:38;;13553:10;;-1:-1:-1;;;;;13553:10:0;13525:38;;;13544:6;;-1:-1:-1;;;;;13544:6:0;13525:38;13504:60;;13576:12;13593:9;-1:-1:-1;;;;;13593:14:0;13615:9;13593:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13575:54;;;13645:7;13640:54;;13674:20;;-1:-1:-1;;;13674:20:0;;;;;;;;;;;13640:54;13712:35;;;-1:-1:-1;;;;;5693:32:1;;5675:51;;5757:2;5742:18;;5735:34;;;13712:35:0;;5648:18:1;13712:35:0;;;;;;;12729:1026;;12644:1111;;:::o;678:884:1:-;765:6;773;781;789;842:2;830:9;821:7;817:23;813:32;810:52;;;858:1;855;848:12;810:52;898:9;885:23;931:18;923:6;920:30;917:50;;;963:1;960;953:12;917:50;986:22;;1039:4;1031:13;;1027:27;-1:-1:-1;1017:55:1;;1068:1;1065;1058:12;1017:55;1108:2;1095:16;1134:18;1126:6;1123:30;1120:50;;;1166:1;1163;1156:12;1120:50;1213:7;1206:4;1197:6;1193:2;1189:15;1185:26;1182:39;1179:59;;;1234:1;1231;1224:12;1179:59;1265:4;1257:13;;;;-1:-1:-1;1289:6:1;-1:-1:-1;1330:20:1;;1317:34;1391:18;1380:30;;1370:41;;1360:69;;1425:1;1422;1415:12;1360:69;678:884;;;;-1:-1:-1;1448:5:1;;1526:2;1511:18;1498:32;;-1:-1:-1;;678:884:1:o;1567:226::-;1626:6;1679:2;1667:9;1658:7;1654:23;1650:32;1647:52;;;1695:1;1692;1685:12;1647:52;-1:-1:-1;1740:23:1;;1567:226;-1:-1:-1;1567:226:1:o;1798:127::-;1859:10;1854:3;1850:20;1847:1;1840:31;1890:4;1887:1;1880:15;1914:4;1911:1;1904:15;1930:125;1995:9;;;2016:10;;;2013:36;;;2029:18;;:::i;:::-;1930:125;;;;:::o;2313:217::-;2353:1;2379;2369:132;;2423:10;2418:3;2414:20;2411:1;2404:31;2458:4;2455:1;2448:15;2486:4;2483:1;2476:15;2369:132;-1:-1:-1;2515:9:1;;2313:217::o;2535:268::-;2654:18;2619:26;;;2647;;;2615:59;2694:36;;;;2749:24;;;2739:58;;2777:18;;:::i;:::-;2739:58;2535:268;;;;:::o;3085:397::-;-1:-1:-1;;;;;3305:32:1;;;3287:51;;3374:32;;;3369:2;3354:18;;3347:60;3443:32;;;3438:2;3423:18;;3416:60;3275:2;3260:18;;3085:397::o;3487:355::-;3696:6;3688;3683:3;3670:33;3784:3;3762:16;;;;-1:-1:-1;;;;;;3758:51:1;3722:16;;3747:63;;;3834:1;3826:10;;3487:355;-1:-1:-1;3487:355:1:o;3847:301::-;3976:3;4014:6;4008:13;4060:6;4053:4;4045:6;4041:17;4036:3;4030:37;4122:1;4086:16;;4111:13;;;-1:-1:-1;4086:16:1;3847:301;-1:-1:-1;3847:301:1:o;4153:266::-;4241:6;4236:3;4229:19;4293:6;4286:5;4279:4;4274:3;4270:14;4257:43;-1:-1:-1;4345:1:1;4320:16;;;4338:4;4316:27;;;4309:38;;;;4401:2;4380:15;;;-1:-1:-1;;4376:29:1;4367:39;;;4363:50;;4153:266::o;4424:409::-;4635:2;4624:9;4617:21;4598:4;4655:61;4712:2;4701:9;4697:18;4689:6;4681;4655:61;:::i;:::-;4764:18;4752:31;;;;4747:2;4732:18;;4725:59;-1:-1:-1;4815:2:1;4800:18;4793:34;4647:69;4424:409;-1:-1:-1;;4424:409:1:o;4838:315::-;5023:2;5012:9;5005:21;4986:4;5043:61;5100:2;5089:9;5085:18;5077:6;5069;5043:61;:::i;:::-;5035:69;;5140:6;5135:2;5124:9;5120:18;5113:34;4838:315;;;;;;:::o;5158:128::-;5225:9;;;5246:11;;;5243:37;;;5260:18;;:::i
Swarm Source
ipfs://c19461eaa019bf199e071601a62710f803c4b8e497f1ce4ace6ac1e035fb7805
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
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.