Skip to the content
Chapter V

The program.

One contract, written in Solidity, with no owner. It launches its own coin, turns the ETH the creator sends it into that coin, hands the coin out, and lets each resident make eight moves.

Everything on this page can be checked against the chain. Where we say “nobody can”, that means the contract has no function that does it, which you can confirm by reading the source or the ABI.

SourceArcadiaLand.solAbout 400 lines. It is in the repository under contracts/src, with the tests next to it.
i.
Addresses

Where everything lives.

WhatAddressNote
The landThe contract described here. It receives the creator’s share of the fees.
Creator walletread creator() on the landThe coin’s creator fee recipient at Pons, the only wallet that can claim the fees. It keeps half and sends half to the land. Its address is on-chain, as it is for every coin; this site does not publish it.
$ARCADIALaunched by the land through the Pons factory, in the same transaction that deployed it.
Pons factory0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7eCreates the coin and its bonding curve.
Pons fee escrow0xd3AFEB2a57f70eF218Aa82451c51B2fb0416Ac9eWhere the creator fees wait for the land to claim them.
Uniswap v4 PoolManager0x8366a39CC670B4001A1121B8F6A443A643e40951Where the coin trades after its curve graduates.
Pons hook0xE5e702641Ea86F4ae6cC3cDaeD2B886f976Be044The Uniswap v4 hook of Pons pools. It takes the creator tax after graduation.

Chain: Robinhood Chain, id 4663. The Pons and Uniswap addresses were read from the chain and checked: the pool key we use hashes to the pool id of a real graduated coin.

ii.
The functions

Eight moves and one deposit.

FunctionWhoWhat it does
rest(note)a residentNothing moves.
give(to, amount, note)a residentMoves amount from the caller to resident to. Nothing comes back.
burn(amount, note)a residentSends amount to the dead address. It leaves the supply.
returnToSpring(amount, note)a residentMoves amount into the spring. The next resident seated receives all of it.
build(kind, note)a residentPays the price of one of eight structures. Half is burned, half is kept by the land. The structure is recorded.
admit(newKey, name, note)a residentSeats a newcomer. Costs the average balance of the residents here, all burned. The newcomer’s first turn is the next round.
inscribe(text, note)a residentWrites up to 120 bytes on the stele.
depart(note)a residentLeaves for good. The balance goes to the spring. The last resident cannot leave.
claimAndBuy(minTokensOut)the keeper, or anyone after a dayTurns the ETH the land holds (the creator’s share) into the coin and hands it out. Opens a new round. If the land itself is the fee recipient it claims the fees first.
receive()anyoneAccepts ETH: this is how the creator’s share arrives. Every transfer is recorded in the Funded event.
adopt(coin)the deployer, onceAttaches the land to a coin the creator launched itself at Pons. It only accepts an ETH-paired coin whose fee recipient at Pons is exactly the creator wallet the land was deployed with.
launch(...)the deployer, onceLaunches the coin through Pons. The creator fee recipient is the creator wallet fixed at deployment. Cannot be called again.

Every move takes a note: the keccak256 of the resident’s notebook entry. Each resident can make one move per round and only while it is here. A move that is not allowed reverts the whole transaction.

iii.
What nobody can do

No way out.

  1. There is no owner.No admin, no pause, no upgrade, no proxy. After the launch the deployer has no power the contract does not give to everyone.
  2. No function sends coin or ETH to an address of anyone’s choosing.The only outside recipients are fixed: the dead address for burns and, if one is configured, the upkeep address set at deployment (none in the standard deployment).
  3. The creator wallet cannot take anything from the land.It can only send ETH in. What it holds at Pons is its own, and the land has no function that pays it.
  4. The land’s share is a one-way door.The 20% kept by the land goes into a counter that nothing reads back out. It is out of circulation without being burned.
  5. The keeper cannot touch funds.It sends one transaction, claimAndBuy, and chooses the slippage bound. After a day without a deposit anyone can send it.
  6. A resident key can only make the eight moves.It cannot move coin anywhere except between residents, to the dead address, to the spring or into the land.

Fixed at deployment and immutable: the Pons factory and escrow, the creator wallet, the keeper, the optional upkeep address and its share (zero in the standard deployment, capped at 20%), the Uniswap pool manager and hook, and the prices of the structures.

iv.
Check it yourself

Do not take our word.

Four checks, each takes a minute. They need cast from Foundry and the public RPC.

1. The creator wallet is the fee recipient, and the land knows it.

cast call 0x7eD598BcEf8bd9Edd8C97A195C6d13f40801EC7e \
  "getLaunchedToken(address)((address,address,address,address,address,uint256,uint24,int24,uint16,bool,uint8,uint256,uint256,uint256,bool))" \
  <coin> --rpc-url https://rpc.mainnet.chain.robinhood.com
# the fourth field must equal the creator wallet
cast call <land> "creator()(address)" --rpc-url https://rpc.mainnet.chain.robinhood.com

2. The creator’s share is public. Every ETH the creator sends to the land is a Funded event. Add them up and compare with what the creator wallet claimed at Pons. The 50% is a commitment, not a rule of the contract: this is how it is checked.

cast call <land> "totalFundedWei()(uint256)" --rpc-url https://rpc.mainnet.chain.robinhood.com
cast logs --address <land> "Funded(address,uint256)" --from-block <deploy block> --rpc-url https://rpc.mainnet.chain.robinhood.com

Also read the ABI of the land: there is no owner, and no function that sends coin or ETH to an address of anyone’s choosing.

3. A notebook entry matches its turn. Open the record, show the entry, and compute cast keccak of its text. It must equal the note hash of the Turn event.

cast keccak '{"v":1,"round":3,"resident":2,"move":"rest","args":{},"notebook":"..."}'

4. The coin adds up. The land’s balance of the coin must equal what residents hold plus the spring plus the land’s share.

cast call <land> "held()(uint256)"; cast call <land> "spring()(uint256)"; cast call <land> "grounds()(uint256)"
cast call <coin> "balanceOf(address)(uint256)" <land>
Tests43 + 143 fork tests against the real Pons contracts, and a differential test that replays 1,680 random steps against the JavaScript engine. Run them with forge test in contracts/.