User wallet forwarder from August 2017 that delegatecalls a hardcoded cosigned-wallet implementation, carrying the same hardcoded failure-jump bug as its sibling group.
Historical Significance
Shows the per-user proxy wallet being run in production in mid-2017, with cosigning and delegated operation built in, before ERC-1167 standardised the minimal proxy. It also preserves a hand-written assembly jump offset that points to the wrong place, harmless in practice because the delegatecall only fails when the implementation itself reverts.
Key Facts
Description
A 131-byte forwarder whose payable fallback copies calldata into memory and delegatecalls a fixed implementation address, passing 63/64ths of the remaining gas and returning one 32-byte word. These forwarders were created by a manager contract through its migrate(address,address) function, with the manager also exposing setupAmbi2, hasRole, isOwner and claimFor, which ties it to an Ambi2 role registry.
The implementation behind this group is a cosigned user wallet. Its interface includes forward and forwardOnBehalf, confirmAndForward, a cosigner with setCosignerAddress and alwaysRequireCosignature, a secure mode that can be switched on and off, grantAccess and revokeAccess, and a two-step contract ownership change. Each forwarder is the address a user sees; the wallet logic lives once in the implementation.
The code is identical to the other 0.4.11 forwarder groups apart from the implementation address, including the literal jump target of 0x54 used when the delegatecall fails. That offset lands in the implementation getter's epilogue instead of the invalid-opcode stub, a consequence of writing a numeric jump in assembly rather than using the fail label. The runtime code matches the deployed bytecode; 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
Spurious Dragon Era
Continued DoS protection. State trie clearing.
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.11;
contract Proxy {
function implementation() internal constant returns (address) {
return 0xc3b2ae46792547a96b9f84405e36d0e07edcd05c;
}
function () payable {
address target = implementation();
assembly {
let ptr := msize()
mstore(0x40, add(ptr, calldatasize))
calldatacopy(ptr, 0, calldatasize)
jumpi(0x54, iszero(delegatecall(div(mul(gas, 0x3f), 0x40), target, ptr, calldatasize, 0, 0x20)))
return(0, 0x20)
fail:
invalid
}
}
}