ShapeShift conditional ETH splitter (Jul 26, 2016). split(address,uint) routes ETH to a specified address — but only on the ETC chain (where forked() returns fa...
Historical Significance
The only contract in ShapeShifts July 2016 chain-split family with an explicit callable function rather than a pure fallback. The double forked() oracle call pattern may reflect caution during an operationally uncertain post-fork environment.
Context
All four ShapeShift chain-split contracts (0xa2d5c5, 0x3e7756, 0x89afcc, 0xfdc6a6) were deployed by the same wallet (0x9e6316f44baeeee5d41a1070516cc5fa47baf227) between July 24-26, 2016 -- during the six days between the DAO hard fork and when replay protection via EIP-155 was broadly adopted. ShapeShift, funded through a Genesis allocation of approximately 36,000 ETH traceable to Erik Voorhees, was among the first exchanges to deploy on-chain routing logic in response to the fork.
Key Facts
Description
Deployed July 26, 2016, the same day as the ShapeShiftReceiver twins. The split() function takes a target address and ETH amount, calls the forked() oracle twice to verify chain state, and routes funds only on the ETC chain. On the ETH chain (where forked() returns true), it returns false immediately without sending. The double forked() call pattern — first to short-circuit if on ETH, second to confirm before sending — appears intentional for safety. Deployed alongside the two ShapeShiftReceiver contracts within the same hour.
Source Verified
Exact runtime bytecode match (301 bytes). The two forked() calls are present in source — first call short-circuits if on ETH chain, second verifies before sending on ETC chain. Matches solc v0.2.1 through v0.3.5 with optimizer.
DAO Fork Era
The controversial fork to recover funds from The DAO hack.
Bytecode Overview
Verified Source Available
Source verified through compiler archaeology and exact bytecode matching.
View Verification ProofShow source code (Solidity)
contract Forked {
function forked() returns (bool);
}
contract ShapeShiftSplit {
address forkedContract;
function ShapeShiftSplit(address _forkedContract) {
forkedContract = _forkedContract;
}
function split(address _to, uint _value) returns (bool) {
if (Forked(forkedContract).forked()) return false;
if (!Forked(forkedContract).forked() && _to.send(_value)) return true;
throw;
}
}