Bytecode verified via sibling
This contract shares identical runtime bytecode with a verified contract (0x5d200d14...) which has been verified through compiler archaeology.
First Poloniex deposit forwarder on Ethereum, part of over 400,000 identical contracts. Compiled with solc 0.4.11, source verified by EthereumHistory.
Key Facts
Description
Poloniex deployed over 400,000 identical deposit forwarding contracts on Ethereum between late 2017 and early 2018. Each contract assigned a unique deposit address to a Poloniex user. When ETH arrived at the contract, the fallback function forwarded it to the Poloniex hot wallet (0x209c4784) via a low-level call. An event was emitted on successful forwarding.
The contract was written in 30 lines of Solidity, compiled with solc 0.4.11 without optimization. It used an onlyAdmin modifier for access control, with three admin functions: usurp(address) to transfer admin rights, revise(address) to change the forwarding destination, and contractCall(address,bytes) to make arbitrary calls through the contract.
The deployer address is 0xb42b20ddbEabdC2a288Be7FF847fF94fB48d2579. Source was reconstructed from bytecode and verified on Etherscan by EthereumHistory.
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)
// Submitted by EthereumHistory (ethereumhistory.com)
pragma solidity ^0.4.10;
contract PoloniexDeposit {
address destination;
address admin;
event e(address destination);
modifier onlyAdmin {
if (msg.sender != admin) revert();
_;
}
function PoloniexDeposit() {
destination = 0x209c4784AB1E8183Cf58cA33cb740efbF3FC18EF;
admin = 0xb42b20ddbEabdC2a288Be7FF847fF94fB48d2579;
}
function() payable {
if (destination.call.value(msg.value)()) {
e(destination);
} else {
revert();
}
}
function usurp(address _admin) onlyAdmin {
admin = _admin;
}
function revise(address _destination) onlyAdmin {
destination = _destination;
}
function contractCall(address _contract, bytes _data) payable onlyAdmin {
if (!_contract.call.value(msg.value)(_data)) revert();
}
}