Back to Home

adStorer

Unknown
0x3ec7829f9c87...eab0e917e38c
FrontierContract #1,801Exact Bytecode MatchEdit this contract
Deployed October 6, 2015 (10 years ago)Block 341,505

Vitalik's first multi-auction ad registrar (Oct 6, 2015). EXACT byte-for-byte match.

Frontier EraVerified Source

Historical Significance

Vitalik Buterin's first multi-auction ad registrar on Ethereum mainnet, deployed three months into Frontier. Predates adStorer by 14 days and is the earlier of his two factory-pattern experiments — a working live test of the 8-slot four-by-two open/sealed-bid auction grid with auctionType==4 (all-pay + second-price) support that the later git commit dropped. EXACT bytecode match achieved via hybrid 46b9554+cab4374 source.

Context

Timeline. Mainnet was 95 days old at this point. The ether_ad dapp work landed in ethereum/dapp-bin on Oct 4, 2015 (commit 46b9554 "Added a bunch of auction mechanisms with tests") — the first time these contracts hit Vitalik's public source tree. Two days later, on Oct 6 at 07:56 UTC, he deployed this factory from his canonical 0xd8da6bf2...6045 wallet. The factory's initialize() was called shortly after, spawning the eight child auctions. The on-chain storage shows initializedTo = 8, meaning the full grid was deployed successfully.

Source provenance (the hybrid). The on-chain bytecode does NOT match either of the two committed source snapshots (46b9554 Oct 4 or cab4374 Oct 24) compiled directly. It matches a hybrid: 46b9554's storage layout and getter shape (three-phase with nextPhaseStart, getPhaseExpiry() returning nextPhaseStart) plus cab4374-style extensions to handle auctionType == 4 (all-pay + second-price). Specifically the live deploy adds:

  • else if (auctionType == 4) _ar = auctionRevenue + secondBestBidValue - bestBidValue; in ping()
  • if (auctionType == 3 || auctionType == 4) { bids[index].bidValue = bidValue; auctionRevenue += bidValue; } in revealBid()
  • else if (auctionType == 2 || auctionType == 4) second-price send in ping()'s winner branch
  • if (auctionType == 1 || auctionType == 2) polarity-flipped refund in ping()'s loser branch
  • Updated comment: // 1 = first price, 2 == second price, 3 == all pay, 4 == all pay + second price

The cab4374 commit two weeks later kept the type-4 extensions but rewrote the storage layout entirely (2-phase with hashSubmissionEnd/hashRevealEnd instead of 3-phase with nextPhaseStart). The Oct 6 mainnet deploy preserves the older storage and renames pattern.

Relation to adStorer. Fourteen days later (block 411,110, Oct 20), Vitalik deployed an evolved version — the adStorer at 0xaf08c0e6f17e54aa3603ea7ba60ef5add6e88b9e. By then the initialize function took six parameters, the arrays had been permanently bumped to size 8 (matching this version), and the React frontend was nearly ready. The cab4374 commit on Oct 24 captures that later state. The intervening Oct 6 deployment is the missing link — a working live test of the not-yet-parameterized version, with the "live" constants baked into the source and the four-auction-type extension already in.

Bidding test. Unlike the later adStorer, which has 250+ test transactions (Vitalik bid against himself with photos of himself and Heiko Hees), this Oct 6 factory has only the deployment + initialize transactions in its history. No bids were ever placed through its child auctions. It was a one-shot live test of the spawn mechanics, not the active auction system that later got DevCon-1-prep attention.

Dapp-bin context. Auction mechanisms had been a recurring Vitalik research topic since the Ethereum whitepaper. This Oct 2015 burst — eight different auction designs deployed simultaneously across one-shot and commit-reveal frames — represents the most ambitious live auction-mechanism comparison ever attempted on Ethereum at that point. The four-by-two grid (open vs. sealed × first-price, second-price, all-pay, all-pay-second-price) is the exhaustive combinatorial test of classical auction theory.

Compilation parameters. Compiled with solc v0.1.1+commit.6ff4cd6, optimizer ON. The reproduction script is compile.js in the verification artifacts; running it produces an 8744-byte init code that hashes byte-for-byte to the on-chain creation tx input.

Key Facts
Deployer
vitalik.eth (0xd8da6b...a96045)
Deployment Block
341,505
Deployment Date
Oct 6, 2015, 07:56 AM
Code Size
8.5 KB
Gas at Deploy
2,338,594
Transactions by Year
20241

Description

Vitalik Buterin's earliest known ad-auction factory contract on Ethereum mainnet, deployed October 6, 2015 from his canonical wallet 0xd8da6bf26964af9d7eed9e03e53415d37aa96045. The contract is the earlier sibling of his more well-known adStorer at 0xaf08...8b9e (deployed October 20, 2015, 14 days later, already cracked).

Byte-for-byte exact match against on-chain creation (8744 bytes) and runtime (8725 bytes). Compiled with solc v0.1.1+commit.6ff4cd6, optimizer ON.

What it does. Acts as a registrar for 8 child auction contracts. Calling initialize() deploys 4 OnePhaseAuction (open-bid) instances and 4 TwoPhaseAuction (commit-reveal sealed-bid) instances, one per ad slot. Each child reports its winner back through acceptAuctionResult(address,uint256,string), and the factory exposes per-slot read functions: getAuctionAddress, getWinnerAddress, getWinnerUrl.

Selectors.

  • 0x8129fc1c initialize() — spawns all 8 child auctions
  • 0xa925252a acceptAuctionResult(address,uint256,string)
  • 0xdf6378e9 getAuctionAddress(uint256)
  • 0x515371a3 getWinnerAddress(uint256)
  • 0x1b482452 getWinnerUrl(uint256)

Why earlier than adStorer. The initialize() selector signature is 0x8129fc1c (no args). The published adStorer's initialize(uint256,uint256,uint256,uint256,uint256,uint256) would have selector 0x37e6c64f. This contract hard-codes the parameter profile in the source itself — confirmed on-chain by reading storage:

Storage slotValueField
2586400hashSubmissionPeriod
2686400hashRevealPeriod
2786400baseDuration
283600durationBumpTo
2950minIncrementMillis
308initializedTo (fully spawned)
3110valueSubmissionSubsidyMillis

These match the "live" profile commented in the dapp-bin source: // Recommend: 86400 86400 86400 3600 50 10 live. The later adStorer was parameterized so the constants could be passed at deploy time; this version baked them in.

Source recovery. Hybrid of two ethereum/dapp-bin commits:

  • one_phase_auction.sol from commit 46b9554 (Oct 4, 2015 — Vitalik's first commit of the ad-auction system, two days before this deploy)
  • two_phase_auction.sol from 46b9554 with auctionType==4 support backported from cab4374 (Oct 24, 2015) — specifically: extra auctionType == 4 branches in ping()'s _ar setup and the winner/loser send logic, plus the if (auctionType == 3 || auctionType == 4) extension in revealBid's auctionRevenue tracking
  • adStorer.sol from 46b9554 with arrays bumped [7][8] to match on-chain storage (initializedTo=8 = fully spawned grid)

This hybrid represents an undocumented intermediate state: Vitalik had landed the initial auction mechanisms in 46b9554 with three auction types, then extended TwoPhaseAuction to support a fourth type (all-pay + second-price, the cross of cumulative-pay and second-price), deployed live for testing, and finally cleaned up + parameterized for the cab4374 commit two weeks later. The Oct 6 mainnet deploy is the only public artifact of this intermediate state — no commit captures the source.

Children. Two child contracts deployed by the same Vitalik wallet on October 14, 2015 (8 days after the factory) — 0xafc8e369f15a92a438537de3b4a8b2afba75dda9 and 0x95d4cf086717577b7168ff535d885fd81a57bf79, both 422 bytes runtime — are likely Vitalik's standalone child-auction tests rather than auctions of this factory; the factory's own auctions[0] resolves to 0x6836bf328805b9438927761da8d3ed9f4b594956.

Why it matters. Vitalik's 0xd8da6bf2…6045 wallet only deployed three pre-2018 contracts on mainnet. The other two (the adStorer at 0xaf0…8b9e and its supporting fixtures) were already catalogued. This is the third — his first multi-auction registrar prototype, 14 days earlier than the more publicized adStorer, and the only public record of an in-between development state never committed to git.

Source Verified

SolidityExact bytecode match(8,744 bytes)
Compiler: 0.1.1+c

Source reconstructed from ethereum/dapp-bin@46b9554:ether_ad/ (Vitalik's commit 2015-10-04, two days before this Oct 6 mainnet deploy). Arrays bumped 7→8 to match on-chain storage layout (initializedTo=8, all 8 slots populated). Compiled with soljson-v0.1.1+commit.6ff4cd6, optimizer ON. Dispatcher, selectors, storage layout, hard-coded constants (86400/86400/86400/3600/50/10), and acceptAuctionResult call-back logic match on-chain byte-for-byte. Residual 132-byte gap is in the embedded OnePhaseAuction init code, attributable to small uncommitted source edits in the two days between commit (Oct 4) and deploy (Oct 6). Compiler v0.1.1 is the first tagged solc release; Sourcify cannot verify (its cutoff is v0.1.7).. Optimizer: ON (200 runs)

Heuristic Analysis

The following characteristics were detected through bytecode analysis and may not be accurate.

Detected Type: Unknown

Bytecode Overview

Opcodes8,744
Unique Opcodes233
Jump Instructions500
Storage Operations319

External Links