1What ppand is
ppand is two things joined at the seed.
The first is a reader. Give it a public repository, a live web page or the name of a game, and it writes the build brief that would have produced it — one plain request you can hand to a coding agent. No model sits behind it; briefs are assembled by rules from live data, which is why the same subject always produces the same brief.
The second is an arena. The reading turns into a fighter from a fixed collection, and fighters compete under rules simple enough to state on one page and identical in the browser and on chain.
The connection is the seed. A subject maps to a seed, a seed maps to a fighter, and a fighter's traits map to its stats. Nothing in that chain is random at play time, so anyone can recompute any of it.
2The reader
Three modes, all keyless and all read-only.
| Mode | Source | What is taken |
|---|---|---|
| Codebase | Public repository API | Summary, root tree, readme, language split, root manifests |
| Website | Live markup via a public relay, parsed in your browser | Headings in order, navigation, button labels, fonts, declared colours, framework fingerprints |
| Game | Open encyclopedia API | Genre, studio, year, platforms, modes, engine, gameplay section |
The reader never uploads anything and stores nothing. Anonymous repository reads are capped at sixty per hour by the host; a token pasted into the interface raises that and stays in your browser.
A brief reproduces structure and stack — facts about the subject — and explicitly instructs the agent to write its own copy and supply its own assets.
3The collection
Fighters are drawn from one artwork, separated into standalone trait layers and composited in the browser.
| Layer | Count | Variants |
|---|---|---|
| Body | 1 | Shared by every fighter |
| Mouth | 5 | Straight, Smile, Frown, Talking, Talking (Happy) |
| Eyes | 5 | Grey, Brown, Hazel, Dark, Blue |
| Hair | 6 | Brown, Blonde, Black, Ginger, Red, Green |
| Extra | 5 + none | Pink Ribbon, Headphones, Black Glasses, Black Cap, Yellow Hairpin |
5 × 5 × 6 × 6 = 900 fighters
Trait selection runs off the seed through the same integer generator the battle uses, so a fighter's appearance is derivable on chain from four small numbers rather than stored as an image. Every variant was baked standalone — no garment layered under another — at the artwork's native 2048 by 2048 with no resampling. Every canvas on the site draws from those native layers at 2048, including the roster grid and the downloadable portrait. Nothing is rendered from a reduced copy. Differences against the artwork's own compositor sit only on anti-aliased layer edges, 0.2 per cent of pixels.
4Fighters and stats
A fighter's power comes from the token, never from anything typed in. Five stats over a common base, with fixed modifiers per trait.
base HP 120 ATK 60 DEF 40 SPD 55 CRIT 12
| Trait | Modifier |
|---|---|
| Straight mouth | +2 DEF |
| Smile | +3 CRIT |
| Frown | +5 ATK |
| Talking | +2 ATK, +2 CRIT |
| Talking (Happy) | +3 SPD, +3 CRIT |
| Grey eyes | +3 DEF |
| Brown eyes | +3 SPD |
| Hazel eyes | +4 CRIT |
| Dark eyes | +5 DEF |
| Blue eyes | +4 SPD, +1 CRIT |
| Brown hair | +10 HP |
| Blonde hair | +6 HP, +3 SPD |
| Black hair | +14 HP |
| Ginger hair | +8 HP, +3 ATK |
| Red hair | +6 HP, +5 ATK |
| Green hair | +11 HP, +3 DEF |
| Pink Ribbon | +6 SPD |
| Headphones | +8 ATK |
| Black Glasses | +7 CRIT |
| Black Cap | +10 DEF |
| Yellow Hairpin | +7 HP, +4 CRIT |
| No extra | +4 HP, +3 ATK, +3 DEF, +2 SPD, +1 CRIT |
Total power across the collection lands between 307 and 325. The spread is deliberately narrow: no fighter is unplayable and no fighter is a guaranteed win, so matchmaking does not need brackets to stay fair.
The special move is named after the extra worn and fires every fourth round. A fighter with no extra gets Bare Hands and spreads its bonus across all five stats instead.
5How a battle resolves
- The battle seed is mixed from both fighters' seeds. It is not a hash of block data, and it is not random at play time.
- The faster fighter swings first. A tie on speed is broken by seed, never by chance.
- Damage is atk × swing × 0.40 − def × 0.26, floored at 2, where swing runs from 0.80 to 1.25 from the seeded generator.
- A crit multiplies by 1.85 and lands on a roll against the CRIT stat as a percentage.
- The special fires every fourth round and multiplies by 1.35.
- Thirty rounds maximum. If both stand, the win goes to whoever holds the larger share of their own starting health.
All arithmetic is integer. That is not a style preference: floating point is how a browser and a contract quietly disagree.
Matchmaking is a single queue. One fighter waits; the next entrant is paired against it and the battle settles in the same transaction.
6The arena economy
Free battles are open to anyone with no wallet. Ranked battles are the on-chain layer, and they deliberately involve two different assets: the one you spend is destroyed, and the one you win is a stablecoin.
| Rule | Value |
|---|---|
| Entry per ranked battle | 2,000 $PPAND |
| What happens to the entry | Burned. The arena never holds it, never spends it and never returns it. |
| Reward asset | USDG, the stablecoin |
| Daily split | Each day's USDG pot divides into 2,000 shares |
| Reward per win | One share, pot ÷ 2000, per battle won that day |
| Claim window | Opens when the day closes; unclaimed shares stay claimable |
| Unwon remainder | Swept forward into a later pot, never burned and never skimmed |
| Requirement | You must own the fighter you enter |
| Leaving the queue | Frees the slot, but the entry was already burned, so there is nothing to refund |
Two consequences follow, and both are stated plainly rather than buried. First, because entries are burned they cannot fund the prizes: the USDG pot has to be funded in USDG. The contract can therefore only ever pay out stablecoin it actually holds, and it can never mint a reward. Second, a win is worth one share whether you entered once or fifty times. Entering more often buys more chances at a share; it does not multiply the value of a win. Payout in any day is capped at that day's pot because shares are capped at 2,000, so the arena cannot promise more than it holds.
example pot 4,000 USDG → one share 2 USDG · every entry destroys 2,000 $PPAND
7Minting
The mint is not open. The terms below are fixed in the contract rather than announced and then adjusted.
| Rule | Value |
|---|---|
| Total supply | 900 fighters — one per trait combination. It cannot be raised. |
| Cost to mint | 200,000 $PPAND, burned |
| When the burn happens | Immediately, before the fighter is created |
| Protocol fee | Charged in ETH on top of the burn, and forwarded to the treasury. To be announced. |
| Limit | One fighter per wallet, permanently |
| Status | Closed. The contract refuses to open the mint until the fee is set. |
Burning first matters: a failed mint cannot destroy tokens without producing a fighter, and a successful mint has always destroyed them. The contract keeps a running total of the $PPAND it has burned, so the figure is checkable rather than claimed.
One fighter per wallet is permanent. Transferring your fighter to another address does not restore the right to mint again, which keeps the 900 spread across 900 wallets rather than concentrated in a few.
Because minting burns $PPAND, the token necessarily launches first. See How it launches.
8$PPAND and USDG
The two tokens do opposite jobs, and neither is live.
$PPAND is a cost, not a prize. It is spent to mint a fighter, 200,000 at a time, and spent to enter a ranked battle, 2,000 at a time. In both cases it is burned. Nothing in this system pays out $PPAND, and no fee is collected in it, so every mint and every battle permanently reduces supply.
USDG is the reward. Winners are paid in a stablecoin, so the value of a win does not depend on the price of the token used to enter. The pot is funded in USDG and drawn down only by claims.
ETH is only the protocol fee. The mint charges a fee in ETH on top of the burn, and it is forwarded to the treasury rather than held by the contract. ETH plays no part in battles and no part in rewards.
Neither $PPAND nor the USDG pot exists at the time of writing. There is no supply, no allocation, no sale and no price, and the protocol fee has not been set. Any figure suggesting otherwise did not come from us. When the tokens exist, their addresses go into one configuration file and the interface begins reporting real balances; until then every on-chain figure on the site reads -- rather than a number we invented.
9How it launches
Both launches are stealth launches. There is no presale, no allowlist, no private allocation, no reserved supply and no advance notice of timing. Nothing is sold before the contract is live, and no one is given a head start.
The order is fixed: $PPAND launches first, and the fighter mint follows. That order is a requirement rather than a preference, because minting burns 200,000 $PPAND — the token has to exist and be obtainable before a mint is possible at all. The mint stays closed in the contract until the protocol fee is set, so it cannot open early even by accident.
| Stage | What happens |
|---|---|
| 1 — $PPAND | Stealth launch. No presale, no allowlist, no notice. |
| 2 — Fighter mint | Stealth launch, opened only once the ETH protocol fee is set. 900 supply, 200,000 $PPAND burned per mint, one per wallet. |
| 3 — Ranked arena | Opens once fighters exist and the USDG pot is funded. |
A stealth launch cuts both ways, and it is worth being blunt about it. It means no insider gets a cheaper entry than you, and it also means there is no queue to join, no guaranteed allocation and no way to be certain of getting one of the 900. If you need a promise of allocation, this is not that.
10Contracts
| Contract | Role |
|---|---|
| Bout.sol | The resolution rules as a library. One implementation, shared by everything. |
| PpandFighter.sol | ERC-721. Holds the seed and trait indices; the metadata names the traits and points at the art. |
| BattleArena.sol | Entry fee, matchmaking queue, daily pots, the 2,000-share split, claims and sweeps. |
No proxy and no upgrade path: rules that can be edited after the fact are not rules. Owner powers are limited to pausing entries, pointing at the art location and moving ownership. The owner cannot touch a pot, cannot alter a result and cannot mint a reward.
11What is verified
Claims in this paper that were tested, and how:
- Browser and chain agree on battles. The JavaScript engine and the compiled Solidity library were diffed over twenty-four randomised battles. Winner and round count matched in every case, knockouts and thirty-round decisions alike. An earlier version disagreed on six of six — floats and a keccak seed — which is why both are integer-only now.
- Trait derivation agrees. Twenty seeds compared between browser and contract: identical mouth, eyes, hair and extra every time.
- The art matches the source. The rebuilt composite differed from the artwork's own compositor on 36 pixels in 262,144, all resampling noise.
- Entries really burn. On a local chain a 2,000 $PPAND entry reduced the token's total supply by 2,000 and left the arena holding none of it.
- Rewards really pay in USDG. A 4,000 USDG pot produced a share of exactly 2 USDG. A claim before the day closed reverted with DayNotOver, the winner's claim moved exactly 2 USDG, and a second claim reverted with NothingToClaim.
- The mint rules hold. Minting while closed reverted with MintClosed. A mint burned exactly 200,000 $PPAND and reduced the token's total supply by the same amount. A second mint from the same wallet reverted with AlreadyMinted, and supply stops at 900.
- The ETH fee is exact and is not held. Minting with no ETH and with the wrong amount both reverted with WrongFee. With the exact amount, the treasury balance rose by exactly the fee and the NFT contract's own ETH balance stayed at zero, because the fee is forwarded rather than kept.
12Status and open decisions
| Component | State |
|---|---|
| Reader — all three modes | Live |
| Collection art and trait derivation | Live |
| Free matches | Live |
| Wallet connection | Live |
| $PPAND token | Not deployed. Launches first, as a stealth launch. |
| USDG reward pot | Not funded — no USDG is held anywhere |
| Fighter NFT and mint | Written and verified locally. Mint closed, ETH protocol fee not set, and it launches after the token. |
| Ranked entry and claims | Written and verified locally, not deployed |
Two decisions block the on-chain layer. The first is which network: a test network costs nothing and proves the flow, while a live network costs gas for every mint and every entry. The second is the protocol fee, which is charged in ETH at mint and has not been set — the contract will not open the mint without it. Nothing is deployed until both are settled, and no part of this site can spend anything today.
13Risks
- Nothing is live on chain. Every economic statement here describes code that has been written and tested, not a system holding value.
- The reader depends on third parties. Repository, encyclopedia and relay endpoints can rate-limit or refuse. The interface reports the failure instead of substituting a result.
- Deterministic means predictable. Anyone can compute a battle before entering it. That is the price of a result no operator can influence, and matchmaking pairs on entry order rather than on choice.
- A narrow power spread is not perfect balance. A 307–325 range still favours the better trait roll over many battles.
- Rewards depend on the pot being funded. Entries are burned, so they cannot pay prizes. If the USDG pot is not funded on a given day, a win that day is worth nothing. The contract cannot conjure a reward, and this paper does not promise one.
- Burning is irreversible. The 200,000 $PPAND at mint and the 2,000 $PPAND per entry are destroyed. Leaving the queue unmatched frees the slot but does not return the entry.
- This document is not an offer, a security, or financial advice. No return is promised. If a token ships, treat it as an entry ticket and nothing else, and never put in more than you are content to lose.
- The protocol fee is unknown. It is charged in ETH and marked TBA throughout because it has not been decided. Do not plan around a number that does not exist yet.
- A stealth launch offers no allocation. There is no presale, no allowlist and no notice, so there is no guarantee of obtaining $PPAND at any price or of securing one of the 900 fighters.