Skip to content

docs: add Pons API page for Robinhood Chain (BIT-15195) - #243

Merged
buddies2705 merged 5 commits into
mainfrom
docs/pons-api
Aug 11, 2026
Merged

docs: add Pons API page for Robinhood Chain (BIT-15195)#243
buddies2705 merged 5 commits into
mainfrom
docs/pons-api

Conversation

@buddies2705

Copy link
Copy Markdown
Contributor

Adds docs/blockchain/robinhood/pons-api.md documenting the Pons V2 bonding-curve launchpad on Robinhood Chain, per BIT-15195.

Covers PonsV2LaunchFactory (0x7ed598bc…) and PonsV2LaunchAndBuy (0xe33e9e47…): the launch feed and metadata, bonding-curve trades, snipe tax, graduation, the hooked Uniswap v4 pool, post-graduation Trading/DEXPoolEvents/DEXPoolSlippages queries, and holders.

The problem the page solves

Bitquery has no ABI for any Pons V2 contract, so Log.Signature.Name and Arguments are empty on every Pons event. Worse, TokenLaunched indexes token, curve and deployer — the payload alone never identifies the launched token, and Bitquery does not expose topics as an output field.

Two workarounds, both verified live, and both applicable to any undecoded EVM contract:

  • Call.Output / Call.Input on the Calls cube. The launch selectors return (token, curve[, tokensOut]), and Call.Input carries the full metadata struct — name, symbol, IPFS logo, description, and socials. This is the best launch feed available and stays the best even if the ABI is added later, because the metadata only ever exists in calldata.
  • Topics: {includes: [{Hash: …}]}, which filters on any log topic including an indexed address padded to 32 bytes. Reconstructs a token's whole lifecycle from undecoded events.

Neither appears in the existing Robinhood pages.

Verification

  • 63 event topic0 values computed from the verified contract source with a from-scratch keccak-256 (self-tested against Transfer(address,address,uint256)), then confirmed against live logs. Events that exist in the ABI but rarely fire are marked (rare) rather than presented as usable feeds.
  • All 20 executable GraphQL blocks run against streaming.bitquery.io — 0 failures. The 3 subscriptions were verified over WebSocket with real messages arriving.
  • npm run build passes with onBrokenLinks: "throw"; check-links reports 547 pages / 0 errors; all 47 in-page anchors resolve in the rendered DOM.

Two things worth a reviewer's attention

A caveat inherited from the pools.trade page is false here. That page warns of ~1.9× duplicate trade legs. Pons v4 pools measured 1.0× over 300 rows, so this page says so explicitly and points at the difference rather than copying the warning. Three other inherited caveats were re-tested and did hold.

Pons V1 is out of ticket scope but still live. PonsLaunchFactory (0xa5aab3f0…) is a separate protocol — no bonding curve, a Uniswap V3 WETH pool at launch, different event signatures — and it is still deploying tokens at roughly 5,000 events/day. The page documents V2 only, with a caution box carrying V1's address and topic0s, because a "Pons launches" feed built from V2 alone silently misses it. Say the word if you'd rather V1 got its own page.

Per review decisions: no Bitquery IDE saved-query links (they can't be created or verified from a CLI session), and structural constants only — no dated launch/volume counts, since the realtime window is ~4 days and those numbers would go stale fast.

🤖 Generated with Claude Code

Gaurav Agarwal and others added 5 commits August 11, 2026 21:32
Documents the Pons V2 bonding-curve launchpad (PonsV2LaunchFactory
0x7ed598bc… and PonsV2LaunchAndBuy 0xe33e9e47…) on Robinhood Chain.

Bitquery has no ABI for any Pons V2 contract, and TokenLaunched indexes
token, curve and deployer — so the event payload alone never identifies
the launched token. The page works around that two ways, both verified
live: Call.Output on the launch selectors returns (token, curve), and
the Topics filter matches an indexed address to reconstruct a token's
full lifecycle from undecoded events.

Covers the launch feed and metadata (Call.Input carries name, symbol,
IPFS logo, description and socials), bonding-curve trades, the snipe
tax decay, graduation, the hooked Uniswap v4 pool, post-graduation
Trading/DEXPoolEvents/DEXPoolSlippages queries, and holders.

All 63 event topic0 values were computed from the verified contract
source and confirmed against live logs. Every GraphQL block in the page
was executed against streaming.bitquery.io; the three subscriptions were
verified over WebSocket.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- Drop full contract addresses from three h3 headings; they made the
  right-hand TOC unreadable. Addresses moved to an "Emitter:" line and
  the headings pinned to stable explicit ids.
- Curve trade fee is read from the launch config (curveFeeBps), not a
  protocol constant. Verified in PonsV2LaunchFactory source; every
  sampled launch uses config 0, but the page no longer states 100 bps
  as if it were fixed.

Verified while auditing: graduate() and createGraduatedPool() carry no
access modifier, so "permissionless" is accurate; and a Pons V1 launch
transaction does emit PoolCreated plus Initialize/Mint on a Uniswap V3
WETH pool, confirming the V1 caution box.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The page previously claimed SignatureHash filters, Topics filters and
"the entire Calls cube" were realtime-only, and pointed users at the
launch-mint transfer as the only route to history. Retesting showed
that was wrong on two counts.

What actually forces realtime is `Log.Signature.SignatureHash` and
`Call.Signature.SignatureHash` — and it forces it whether you FILTER on
the field or merely SELECT it, which is the easy trap. The earlier
finding was a false attribution: the failing query happened to select
SignatureHash while filtering on Topics.

Verified working on realtime + archive + combined:
- Topics: {includes: [{Hash: …}]}, including topic0, with multiple
  hashes combined as AND
- Call.Input / Call.Output, including Input: {startsWith: [...]},
  which accepts a list of selectors
So the whole page — the Calls launch feed included — is archive-capable.

Changes:
- New Datasets section: omitting `dataset` silently gives you realtime,
  which is the usual cause of "my query returns nothing older than a few
  days". Includes the per-construct realtime/archive/combined matrix and
  links to the canonical dataset docs.
- All 10 topic0 and selector filters switched to the archive-capable
  forms, and SignatureHash removed from every selection set.
- Launch-mint transfer section reframed: a second, independent route to
  the same list (and the convenient one for metadata), not the only way
  to reach history.

All 20 GraphQL blocks re-executed on realtime; the 7 converted ones also
verified on archive and combined. Build + check-links clean; 48 in-page
anchors resolve.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Bitquery has since added ABIs for all 13 pools.trade events this page
documented as raw, including the entire Crowd Launch (CCA) auction.
Re-measured against the live API on 11 Aug 2026.

- Event reference: all 15 rows now decoded; topic0 column retained
- New "Reading decoded arguments": tuple components flatten into one row
  each, carrying the tuple's type name and distinguished only by Index
  (UERC20Metadata, PoolKey, MigratorParameters)
- Flag the TokenCreated name collision: the entry contract and the factory
  emit different signatures under the same name, so Name alone matches both
- Token metadata: description / external link / image now read straight from
  Arguments, replacing the client-side ABI-decoding instructions
- Crowd Launch bids and clearing price rewritten onto decoded arguments
- Dataset note: SignatureHash remains realtime-only (re-confirmed), and
  archive coverage of these events is still thin

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Full adversarial re-read of the page against the live API. Four real
defects, all measured rather than reasoned:

1. The flagship launch feed double-counted. It matched d6a0eef5
   (launchTokenFor) alongside f85f8e41 (launchAndBuy) while the caution
   directly below it warned against exactly that. Measured 200 rows /
   143 transactions = 1.4x inflation. Dropped d6a0eef5; now 1.000x.

2. "Swap the factory address for the curve address and the same filter
   returns that token's history" was false. Curve events index the
   recipient/account, not the token, so that query returns zero rows.
   Replaced with a caution explaining where the trick does and does not
   apply.

3. The graduated-pool query scoped by Transaction.To on the factory,
   which silently drops graduations triggered by keeper contracts —
   graduation is permissionless. Measured 33 of 34 over three days.
   Rescoped onto the `hooks` argument, which returns all 34 and is the
   semantically correct discriminator. Also archive-capable.

4. The launch-mint section still described the Calls feed as
   "source of truth within the realtime window" and itself as the
   "archive-reachable approximation" — stale after the archive rewrite,
   since both now run on archive.

Also: note that Input.startsWith takes a list and the 0x prefix is
optional; drop a "100 bps baseline" phrase that contradicted the
config-derived fee note; add a tip to check whether Bitquery has since
decoded Pons (the sibling pools.trade page just gained ABIs — re-checked,
Pons is still fully undecoded).

All 20 GraphQL blocks re-executed; build and check-links clean.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@buddies2705
buddies2705 merged commit 2527ff8 into main Aug 11, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant