Withdrawal-only wallet that resolves its executor from a registry on every call and delegatecalls it with the request untouched.
Historical Significance
The fee parameters in the signature are the interesting part. A withdrawal here is not just a transfer; it carries a fee and a recipient for it, which means the operator's revenue model is encoded in the customer-facing interface while the logic that enforces it stays swappable. Every wallet in the fleet inherits a fee change the moment the registry is updated, with no migration and no per-wallet transaction.
Key Facts
Description
One address in storage points at a registry. The single function, withdraw, takes a token, a destination, an amount, a fee and a fee recipient, reads none of them, and forwards the whole calldata by delegatecall to whatever address the registry currently names.
All five parameters are read and discarded in the body as bare expression statements. They exist to fix the ABI, not to be used: the executor on the other side of the delegatecall decodes the same calldata itself. That keeps the wallet stable while the withdrawal rules, including how the fee is split, can be rewritten by pointing the registry somewhere new.
Because the call is a delegatecall, the executor's code runs against this wallet's own balances, so the wallet never needs approval to move its own funds and holds no privileged keys of its own.
Source Verified
Byzantium Era
First Metropolis hard fork. Added zk-SNARK precompiles, REVERT opcode, and staticcall.
Bytecode Overview
Verified Source Available
This contract has verified source code.
View Verification ProofShow source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
pragma solidity ^0.4.23;
contract SenderList {
function getSender() public returns (address);
}
contract UserWallet {
SenderList senderList;
constructor(address _senderList) public {
senderList = SenderList(_senderList);
}
function withdraw(address _token, address _to, uint256 _amount, uint256 _fee, address _feeTo) public returns (bool) {
(_token);
(_to);
(_amount);
(_fee);
(_feeTo);
return senderList.getSender().delegatecall(msg.data);
}
}