Bytecode verified via sibling
This contract shares identical runtime bytecode with a verified contract (0x2ccc0067...) which has been verified through compiler archaeology.
Single-use token drainer that copies a preset token address into its working slot, sends the full balance to its owner, and reports the owner's new balance.
Historical Significance
Returning the recipient's resulting balance rather than the amount moved is the useful detail. A caller sweeping many of these in sequence can confirm each step landed without a separate query per contract, which matters when the alternative is one extra read call for every deposit address being drained.
Key Facts
Description
Three storage values: a working token slot, a preset token address and an owner. sendTokens requires the caller to be the owner, then copies the preset address into the working slot, reads this contract's balance of that token, transfers all of it to the caller, requires the transfer to report success, and returns the caller's balance afterwards.
The copy from the preset slot to the working slot on every call is redundant but harmless, and it is what makes the compiled code distinctive. The return value gives the caller confirmation of the new balance in the same transaction rather than requiring a follow up read.
Heuristic Analysis
The following characteristics were detected through bytecode analysis and may not be accurate.
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 on Etherscan.
Show source code (Solidity)
{{
"language": "Solidity",
"sources": {
"Sender.sol": {
"content": "// Submitted by EthereumHistory (ethereumhistory.com)\npragma solidity ^0.4.21;\n\ncontract ERC20 {\n function transfer(address _to, uint256 _value) public returns (bool);\n function balanceOf(address _owner) public returns (uint256);\n}\n\ncontract Sender {\n ERC20 token;\n ERC20 preset;\n address public owner;\n\n function sendTokens() public returns (uint256) {\n require(owner == msg.sender);\n token = preset;\n require(token.transfer(msg.sender, token.balanceOf(this)));\n return token.balanceOf(msg.sender);\n }\n}\n"
}
},
"settings": {
"optimizer": {
"enabled": false,
"runs": 200
},
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
}
}
}}External Links
Related contracts
Sender
Same deployerThe same single-use token drainer as its sibling, compiled by an earlier solc release.
0x009660...87e100June 22, 2018Msg
Same eraMinimal contract that stores a single public string in state, exposed via the auto-generated m() getter. First of 281 identical siblings. Source verified by EthereumHistory.
0x2c8f58...37b173January 13, 2018Wallet
Same eraToken collection wallet that moves an entire token balance to a chosen address, without the ERC223 callback handler.
0x002204...531195January 19, 2018Wallet
Same eraOwner wallet that forwards ether to its owner, logs any call from a stranger with the full calldata, and lets the owner execute arbitrary calls.
0x001feb...9e7a4fJanuary 20, 2018Forwarder
Same eraNinety-three bytes with one hardcoded destination: every payment received is transferred straight back out to the same address.
0x458353...a562deJanuary 20, 2018Sweeper
Same eraMinimal ETH sweeper, first of 1,900 identical deployments in a 2-day burst in January 2018. All sweep to a single hardcoded destination. Source verified by EthereumHistory.
0xeb15f6...6cb3e1January 23, 2018