REPRESENTTHE PUBLIC RECORD
RECORD / METHODOLOGY

Don't trust us. Audit us.

This page explains what Represent wrote to Base Sepolia, a public blockchain, for votes cast before October 2026, and how to recount those votes yourself, with no account, no app and no permission needed.

1 · What gets recorded

Before October 2026, each vote on a public yes-or-no or multiple-choice ballot was also sent as a transfer of exactly 1 RPV token from the voter's wallet to a position address: a unique address that stands for one choice on that ballot, such as “support” or “oppose”. Nobody holds the keys to a position address, so tokens sent there can't be moved again.

NETWORKBase Sepolia, a public Ethereum network
VOTE TOKENRepresent Vote Token (RPV) · 0x4a57Cd1C4235cb7Af37625bA59bA00beB2265312
ONE VOTE1 RPV transferred to a position address
TEST NETWORK

These transfers are on Base Sepolia, a public test network, not Base's main network. The arithmetic on this page is the same on both. The vote counts on this site are the authority.

CHANGE, OCTOBER 2026

New votes are no longer recorded on-chain one by one. The transfers described on this page cover votes cast before the change, and those can still be recounted as shown below.

2 · How position addresses are derived

The position address for any ballot is pure arithmetic — no database, no server, no trust required:

address = last 20 bytes of keccak256( utf8( "<ballot-id>-support" ) )

The same rule with -oppose gives the oppose address. Anyone can run it — here it is in JavaScript with the ethers library:

const h = ethers.keccak256(ethers.toUtf8Bytes(ballotId + "-support"));
const supportAddress = ethers.getAddress("0x" + h.slice(-40));

Worked example. Ballot 65bc4f40-ed16-4a0e-8851-9b8903f9ec14 (“Provincial control over immigration”, Alberta Shadow Referendum Q1):

SUPPORT0xe14B064E3AaBB2dbf910897F3714731D982BAf7f
OPPOSE0x90Cdc7C7F432a28330055f4eEA8016E54e7eB665

Run the formula yourself and you will get these exact addresses. If we ever published a different address for this ballot, the mismatch would be provable.

Multiple-choice ballots use the same idea with one address per option, derived from the ballot id, the option's index, and the relay wallet's public address via the standard ABI encoding (ballotId, optionIndex, relayerAddress, "OPTION_VOTE").

3 · Recount a ballot yourself

  1. Derive the ballot's support and oppose addresses with the formula above (or start from the worked example).
  2. Open the RPV token on the block explorer: https://sepolia.basescan.org/token/0x4a57Cd1C4235cb7Af37625bA59bA00beB2265312 and go to the Transfers tab.
  3. Filter transfers to the support address. Each transfer of 1 RPV was recorded for one ballot in support. Count them.
  4. Repeat for the oppose address. Compare both counts to the tally published on this site.

Every transfer carries a timestamp and a transaction hash. A past entry on the network can't be changed or deleted.

4 · What this shows, and what it doesn't

It shows that the transfers are timestamped and that anyone can count them. A transfer can't be changed or deleted once it is on the chain. It doesn't show who cast a ballot: Represent holds the key to every voter's wallet, so the chain can't prove that a person, and not Represent, made a transfer.

Honest limits: