Skip to content

feat(pumpfun): config-driven PDA surface + local surfpool TDD - #260

Merged
ernanibmurtinho merged 2 commits into
mainfrom
feat/pumpfun-program-surface
Aug 3, 2026
Merged

feat(pumpfun): config-driven PDA surface + local surfpool TDD#260
ernanibmurtinho merged 2 commits into
mainfrom
feat/pumpfun-program-surface

Conversation

@ernanibmurtinho

Copy link
Copy Markdown
Contributor

What

Comprehends the Pump.fun bonding-curve program (6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P) into the config-driven backbone (PR #259), and proves its PDA derivations with local TDD: offline ($0, pure) + a real surfpool mainnet-fork verification.

First new program on the config backbone — the "add a program = write config, not code" path in action.

Why

Berkay's ask: make local TDD point at real Solana programs so we accumulate proven simulations before any mainnet test. Pump.fun is the highest-volume of the three targets and its "swap" (buy/sell) shape matches the proven Meteora template.

The gap it showcases

creator_vault's seed is bonding_curve.data.creator — a field inside another account's data (a dotted path). Naive IDL→derivation generators silently drop it (Anchor #4057 shape). We model it honestly as a new resolver seed kind (ResolverPdaSeedNode: non-resolvable statically, dependency declared, never fabricated) — and prove that, once the value is resolved, the vault derives first-plan-correct.

How

  • gecko/provider_config.py: new resolver seed kind → ResolverPdaSeedNode; ProgramSpec.orquestra_project now optional (a program can be comprehended for derivation before its execute/build URL is wired).
  • gecko/providers/configs/orquestra/pumpfun.json: 7 PDA recipes (global, mint_authority, event_authority, global/user_volume_accumulator, bonding_curve, creator_vault). Registered under the orquestra provider.
  • tests/test_providers_pumpfun.py: offline derive-match + honest-gap assertions + an env-gated (GECKO_SURFPOOL_E2E=1) real surfpool verification.

Proof (verified, not claimed)

Ground truth is a real mainnet Buy tx; every address independently re-derived by derive_pda. On a live surfpool mainnet fork ($0, read-only, no signing):

  • bonding_curveEExN5XX… — exists, owned by Pump
  • global4wTV1… — exists, owned by Pump
  • creator_vault9B1eLf… — exists, owned by System Program (a SOL vault the program signs for) — derivation correct, owner honest ✅

The vault-owner distinction was surfaced by the fork gate (it initially failed a naive owner-match assertion), then asserted truthfully — the harness catching a real semantic detail is the point.

Scope / follow-ons

Derivation-only for now (no execute URL / buy-sell plan). Follow-ons: the Orquestra project slug + a buy/sell plan with the creator resolution step (fetch bonding_curve + Anchor-decode), and constant-pubkey seeds for metadata/fee_config/associated_bonding_curve. Next programs queued: ORE, then MetaDAO ICO.

Gate

ruff + mypy gecko clean; full suite 2176 passed, 11 skipped; the surfpool E2E passes with GECKO_SURFPOOL_E2E=1.

🤖 Generated with Claude Code

ernanibmurtinho and others added 2 commits August 2, 2026 23:31
…uestra_project

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pump.fun bonding-curve program comprehended into packaged config. bonding_curve,
global, event_authority + globals derive first-plan-correct; creator_vault is the
GAP (seed = bonding_curve.data.creator, a dotted-path seed naive IDL->derivation
drops) modelled as an honest resolver, proven derivable once resolved. All verified
against real mainnet accounts on a surfpool fork ($0): addresses match, owners honest
(Pump-owned data accounts vs the system-owned SOL vault).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@ernanibmurtinho
ernanibmurtinho merged commit b66c92e into main Aug 3, 2026
1 check failed
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