Exchange deposit wallet that accepts ether and delegates token sweeps to a shared sweeper.
Historical Significance
The same wallet design appears across several deployment runs at different sizes, because operators added or removed the ether fallback and the token hook and changed compiler settings between batches. Turning the optimizer off costs real deployment gas on every one of a very large number of contracts, so it was most likely an oversight in the build rather than a decision.
Token Information
Key Facts
Description
A per-customer deposit wallet in the Bittrex pattern. Its payable fallback accepts ether and does nothing else, and sweep(address,uint256) asks a sweeper registry which sweeper handles a given token, then delegatecalls into it with the original calldata so the sweeping logic runs in the wallet's own context. Unlike the fuller version of this design it carries no ERC-223 tokenFallback hook. Compiled with the optimizer disabled, which is why it is considerably larger than the optimized builds of the same shape. The runtime code matches the deployed bytecode byte for byte. Only the trailing swarm metadata hash differs, because the EthereumHistory attribution comment changes the source text. Sourcify records this as a partial match and Etherscan shows it as verified.
Source Verified
Byzantium Era
First Metropolis hard fork. Added zk-SNARK precompiles, REVERT opcode, and staticcall.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
// Submitted by EthereumHistory (ethereumhistory.com)
pragma solidity ^0.4.10;
// Copyright 2017 Bittrex
contract AbstractSweeperList {
function sweeperOf(address _token) returns (address);
}
contract UserWallet {
AbstractSweeperList sweeperList;
function UserWallet(address _sweeperlist) {
sweeperList = AbstractSweeperList(_sweeperlist);
}
function () public payable { }
function sweep(address _token, uint _amount)
returns (bool) {
(_amount);
return sweeperList.sweeperOf(_token).delegatecall(msg.data);
}
}