sources and limits
we show the live shared story text and every signed addition from this site's public log, where anyone can re-verify each signature. animal token volume is displayed for flavor when available from public endpoints. nothing is custodied.
the yarn
- one story, yarn-1. it only grows at its head; nothing is edited or removed.
- a word is at most 24 letters: letters or digits, one ' or - inside, one punctuation mark at the end.
- each wallet may add one word every 5 minutes.
- the curtain falls at 2026-09-18T20:00:00Z. after that the form closes and the yarn stays readable.
- signatures are EIP-712 typed data on chain id 4663. signing sends no transaction, costs no gas and moves nothing. this site holds no one's funds.
- words #1 and #2 ("Once upon") were set by Rocket Frog's house wallets, one key per word, each used once and thrown away: 0x8c8c8e50f423dc77e0b4b2558868e5d5eb51711f, 0xedfd88efbc27add56bafee2fc4ae75c42746d7ae. every word after that is a frog's own.
re-verify any word
every row in /api/v1/words (50 per page, ?page=N) carries its signer, signature, prev_hash, hash, snapshot id and deadline. /api/v1/head gives the index and hash the next word must sign. with viem:
import { recoverTypedDataAddress, hashTypedData } from "viem";
const domain = { name: "RIBBIT", version: "1", chainId: 4663 };
const types = { Word: [
{ name: "storyId", type: "string" }, { name: "index", type: "uint256" },
{ name: "word", type: "string" }, { name: "prevHash", type: "bytes32" },
{ name: "snapshotId", type: "string" }, { name: "deadline", type: "uint256" } ] };
// w = one item from GET /api/v1/words
const message = { storyId: "yarn-1", index: BigInt(w.idx), word: w.word,
prevHash: w.prev_hash, snapshotId: w.snapshot_id, deadline: BigInt(w.deadline) };
const signer = await recoverTypedDataAddress({ domain, types, primaryType: "Word", message, signature: w.signature });
signer.toLowerCase() === w.signer; // who wrote it
hashTypedData({ domain, types, primaryType: "Word", message }) === w.hash; // the row's hash
// and the next word's prev_hash must equal this hash; word #1's prev_hash is 0x5179162ebeb557c15129f6e052adbc1799a3ce536282d5a6dab91b07981f0bcbthe frog-pool number
- each word signs the id of a market reading taken that minute: the busiest frog-token pool on Robinhood Chain by 24h volume (frog, pepe, toad, robin the frog).
- source: GeckoTerminal's public API (network robinhood), DexScreener's public search when GeckoTerminal fails. both are free, rate-limited and in beta.
- 24h volume is what the indexer reports. a Uniswap v3 pool does not store a volume figure on chain, so this is a reading, not a proof.
- when both sources fail the word still lands and its reading says "unavailable". no number is ever filled in.
what this site does not claim
- the words are written by whoever signs them. the yarn is a public joke, not a statement by anyone else.
- the signatures live in this site's log, not in a contract. what makes them trustworthy is that anyone can recompute them.