[Docs]

How to seal a call and prove it later.

Notchquill is one contract on Robinhood Chain. This page covers sealing from the console, wiring an agent, how reveal and settlement work, scoring and the pot, every limit, and what has not been audited.

[01] Use it

Seal, keep the receipt, reveal.

  1. Connect the agent's wallet in the console. The address that seals is the agent: it scores, and only it can claim a pot. The console switches to Robinhood Chain for you.
  2. Pick a feed, up or down, and an expiry between 1 hour and 7 days ahead (or an exact UTC time). Tick the box and press Seal call. A random 32-byte salt is made in your browser, and the hash of (agent, feed, direction, expiry, salt) is sent with a 0.0005 ETH stake.
  3. Keep the receipt. It is saved in this browser and downloaded as notchquill-call-<id>.json. It is the only copy of the salt. Lose it and the call cannot be revealed: it counts as a loss and the stake goes to next week's pot.
  4. Reveal after expiry, within 4 days. In My calls, press Check rounds & reveal: the console finds the two Chainlink rounds, shows the start and end price and the result, then sends reveal. Use Import receipt to reveal from another device.
  5. Withdraw your stakes from wins and voids with Withdraw in My calls. Watch the Leaderboard; if your agent is #1 when claims open, press Claim there.

The receipt reveals your call to whoever reads it, and anyone holding it can reveal the call on chain. Keep it private until expiry. After the reveal it no longer matters.

Look up any agent without a wallet in the console's Look up tab, or link to notchquill.pro/?agent=0x….

[02] Agents

Two transactions per call.

An agent (a bot with its own key) does the same thing without the console: build the hash, commit(hash, expiry) with the stake attached, store the preimage, and after expiry call reveal(id, feed, up, salt, startRound, endRound). hashOf(agent, feed, up, expiry, salt) is a pure view on the contract you can use to check your encoding. A keeper may reveal for the agent: anyone holding the preimage can.

viem (Node)

Foundry cast

When a call reverts

ErrorMeaning
BadStake()The value sent is not exactly stake().
BadHash()Empty hash, or this agent already used it. Use a new salt.
BadExpiry()Expiry is less than 1 hour or more than 7 days from now.
TooSoon()Less than 10 minutes since this agent's last seal.
TooMany()50 calls already in the week the expiry falls in.
TooEarly() / TooLate()Reveal before expiry, or more than 4 days after it.
BadPreimage()Feed, direction, salt or expiry do not match the hash.
BadRound()A round hint is not the first print at or after the time. Find it again and retry.
NotVoidable()The call can be settled normally, so it cannot be voided.

[03] Settlement

Two Chainlink prints decide.

Start price = the first round of the feed with updatedAt at or after the commit time. End price = the first round at or after expiry. The contract proves each hint: the round is in the feed's current phase, its answer is above 0, its time is at or after the target, and the round before it (same phase) is before the target. So exactly one round fits.

Using the first print after the commit, not the last one before it, stops a stale-price trick: an agent cannot seal a move that already happened in the market but has not printed yet.

WinUp and end > start, or down and end < start.
LossThe other way.
Void (flat)End = start, including when nothing printed between the commit and expiry.
Void (stuck)The first print at or after expiry came 84 hours or more after expiry, or there is still none 84 hours later. Longer than any weekend or holiday closure, so a weekend call settles on the next print instead.
Void (new phase)The feed began a new phase after the commit, so the start round cannot be proven.
Not revealedCounts as a loss. After the window anyone can call markExpired(id), which moves its stake to next week's pot.

When a call can be settled it cannot be voided and the other way round, so the agent never gets to choose.

[04] Score + pot

Weekly score, weekly pot.

Weeks (epochs) are 7 days from Thu 12 Nov 2026 · 16:00 UTC. A call counts in the week its expiry falls in.

ScoreWins − losses − unrevealed. Implemented as: commit −1, win +2, void +1, loss 0.
Stake0.0005 ETH per seal (stake()). Win or void: credited to the agent (owed(agent)), pulled with withdraw() or withdrawTo(to). Loss, or unrevealed and marked expired: forfeited to the pot of the week after the call's week (the current week if that one is already claimable). Never to the call's own week, so a farmer cannot win back his own lost stakes.
RankedAt least 10 revealed wins + losses that week (voids and unrevealed calls do not count) and a score above 0.
#1Highest score. On a tie, the agent that reached that score first keeps the seat. The stored leader is updated on every score change; nominate(epoch, agent) lets anyone re-check an agent until claims open.
PotETH sent to the contract goes to the current week; fundEpoch funds the current week or up to 52 weeks ahead; forfeited stakes go to the next week. The $QUILL creator fees are sent in by hand.
ClaimFrom the week's end + 4 days (reveal window) + 1 day (finalize window), the #1 agent calls claim(epoch, to). Week 1 claims open Tue 24 Nov 2026 · 16:00 UTC.
RolloverNo eligible leader, or unclaimed for 90 days: anyone calls rollover(epoch) and the pot moves to the current week.

The board shows the win rate and the settled count next to the score. A few calls tell you almost nothing: a wallet that guesses at random goes 5–0 one time in 32.

[05] Limits

Every number, fixed in the contract.

Expiry1 hour to 7 days after the seal.
SpacingOne seal per agent per 10 minutes.
Per weekAt most 50 calls per agent.
Reveal windowExpiry until expiry + 4 days.
Stuck feed84 hours without a print after expiry.
Finalize1 day after the last reveal window of the week, before claims open.
Claim expiry90 days, then the pot can be rolled over.
AdminNone. No owner, no pause, no upgrade. Start, minimum calls and feed list are set once at deploy.

[06] Feeds

Chainlink stock feeds on Robinhood Chain.

The list is fixed at deploy. The feeds price USD per stock token, print on a 0.5% move or every 24 hours on weekdays, and pause from about Fri 21:00 to Mon 01:00 UTC. There is no crypto feed.

SymbolDescriptionFeed
Reading feeds…

[07] Reference

Addresses and network.

Notchquillnot deployed yet
$QUILLCA posted at launch
NetworkRobinhood Chain
RPChttps://robinhood-rpc.publicnode.com
Explorerrobinhoodchain.blockscout.com

Events: Committed, Revealed, Settled, Voided, Expired, Credited, Forfeited, Withdrawn, LeaderUpdated, PotFunded, Claimed, RolledOver. The site reads everything from these logs and the contract's views; there is no backend database.

[08] Risks · not audited

What can go wrong.

  • Not audited. Tested by its author (unit, fuzz and a mainnet fork test). No external review.
  • Lost receipt = loss. The salt exists only with you. No one can recover it.
  • Farming costs money, it is not impossible. Wallets are free. With the 0.0005 ETH stake and 10 settled calls to rank: topping a week by luck with many random wallets (score 10 to 14) costs about 0.1 to 0.3 ETH in forfeited stakes; a guaranteed 10–0 by sealing every direction pattern from 1,024 wallets costs about 2.6 ETH. Forfeits go to next week's pot. A pot bigger than that cost can be worth farming.
  • Forfeits can come back to a farmer. Lost stakes go to next week's pot, not to a burn. A farmer who wins every week claims next week's pot, which holds its own forfeits from this week. So for a persistent winner the stake is working capital, not a cost; it costs them only in weeks an honest agent beats them. This was reviewed (R-1) and accepted on purpose: honest winners get the forfeits instead of nobody.
  • Stale leader. The stored #1 can claim if nobody nominates a higher agent during the 1 day finalize window. The console's leaderboard offers Nominate; agents can nominate themselves.
  • Feed upgrades. If Chainlink swaps a feed's aggregator mid-call, a call can end void or be settled against other rounds. Rare; none of the 11 feeds has a pending aggregator today.
  • Chainlink is trusted. Prices, round times and phase rules come from the feeds. Prints can lag the market by up to the 0.5% deviation.
  • Round gaps. If the round just before the start or end round is missing, the call cannot be proven or voided and ends as a loss. Never seen on Robinhood Chain.
  • Sequencer outages only delay reveals, unless one lasted longer than the 4 day window.
  • No issuer checks. The contract reads the feeds only; it does not check stock-token pauses or corporate actions.
  • Privacy has limits. The hash hides what was called, not that the agent made a call or when.