Skip to content
hookerdotfunPublic

About

Launch a Pumpfun or Pons token with rules built into the token itself. Solana Token-2022 transfer hooks and Robinhood Chain contracts, curves shaped like Pumpfun's and Pons's, graduation into a normal coin.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

Hooker

Launch a Pumpfun or Pons token with rules built into the token itself. · hooker.fun · @hookerdotfun

A Hooker token carries its rules (hooks) in the token itself. The creator picks the hooks at launch, the chain runs them on every buy, sell and transfer, and a trade that breaks the rules never lands. The token trades on a bonding curve shaped exactly like the one it graduates into, and when the curve fills it graduates into a normal coin in one transaction: the curve's money creates and buys the new coin, and every holder receives their share automatically.

It runs on two chains:

Solana Robinhood Chain
Graduates into a Pumpfun coin a Pons V2 coin
The rules a Token-2022 transfer hook the token contract itself
The curve a Meteora bonding curve shaped like Pumpfun's Hooker's own curve, shaped like Pons's
Paid in SOL ETH
Wallets Phantom, Solflare, Backpack, … MetaMask, Rabby, …

Every Solana token address (the Hooker token and its Pumpfun coin) ends in hook.

The burn. Every Pumpfun coin that graduates names Hooker's burn wallet as its creator, so its creator fees buy $HOOKER and burn it, forever (lib/flywheel.mjs). The two chains are separate: a Pons coin's creator fees go to Hooker's graduation wallet on Robinhood Chain, for $HOOKER on Pons, never the Solana $HOOKER. A creator can route a coin's fees to its holders instead with the "Creator fees to holders" hook. Every claim and burn is a public transaction.

Hooks

All hooks are off by default; a creator combines any of them. Both chains have every hook except two that only exist on Solana.

Hook What it does
Allowlist / Blocklist Only listed wallets can buy and hold it, or listed wallets never can
Max per wallet No wallet can hold more than a set share of supply
Launch window A tighter cap for the first minutes
Rising max per wallet The cap starts small and rises on a timer
Trade guard No single trade can move more than a set share of supply
Sniper-fee cap Buys paying sniper-sized priority fees or tips are refused at launch (Solana only: Robinhood Chain's sequencer ignores priority fees and has no tips)
Anti-bundle Only a few buys can land in one block
Anti-snipe fee The trading fee starts at 50% and falls to 1% over two minutes
FOMO only Only the FOMO app can buy; selling works anywhere (Solana only: FOMO does not trade on Robinhood Chain)
Trading hours Trades only on chosen days and hours; it can follow US or European daylight saving on chain and close sells too
Market hours Trades like a stock: Monday to Friday, 9:30 to 16:00 New York time, closed on US market holidays
Anti-dump caps Separate caps on one buy and one sell, the creator's sells included
Graduated sell caps The bigger the bag, the smaller one sell can be, down to a floor
Chapters Max per wallet starts small and doubles every chapter of volume
Plague A wallet can only buy once a holder has sent it some
DEX-only No wallet-to-wallet sends: every move is a trade with the curve
P2P-only Only the creator buys from the curve and nobody sells to it; tokens move wallet to wallet
Hot potato Whoever bought last cannot sell or send until another wallet buys
Ping pong Buys and sells take turns; one transaction cannot take both turns
King of the Hill The biggest buy holds the crown and earns 0.3% of every trade's value while it reigns, paid from Hooker's share of the fees, in SOL or in the Pons launch's asset
Breathing cap · Momentum · Resonance · Coupled resonator The per-buy cap is driven by an oscillator: a fixed cycle, or one that every buy kicks
Size fee · Auto burn · Holder share Bigger buys pay more, a share of every buy is burned, part of the fees buys extra coins for holders
Creator fees to holders After graduation, the coin's creator fees go to its holders instead of the $HOOKER burn (Pumpfun holder rewards, or Pons holder fee sharing)

Unless a hook says otherwise (P2P-only, hot potato, ping pong, sell caps, hours that close sells), holders can always sell back into the curve; every hook that limits selling says so on the token's page.

At launch a creator also picks where it graduates, a graduation size (35–100% of Pumpfun's or Pons's own), and their fee per trade (default, 1%, 2% or 3%). On Pumpfun they can pick a custom pair: one of Pumpfun's own custom-pair tokens (BTC, ETH, PUMP, xStocks, …) with at least $1M of liquidity, with a Pumpfun creator fee of 0.01–3%. At graduation the curve's SOL is swapped into the pair through Jupiter; if the pair no longer qualifies then, the coin pairs with SOL instead. On Pons they can pick any of Pons's pair assets (USDG, the xStocks, cbBTC, gold, …): the curve then takes that asset, with Pons's own numbers for it, and the coin graduates paired with it, no swap in between.

How it is built

Path What
programs/hooker-hook The Solana transfer hook (native Rust). Per-token rules at PDA ["cfg", mint], lists at ["list", mint]; src/v3.rs holds the newer hooks, and the ones that remember something (potato, turns, volume, oscillators, the King) keep it in one account per token, ["state", mint], never one per buyer, so every app and router can trade them
lib/king.mjs King of the Hill payouts: copies each reign's traded value from chain into a ledger and pays each King, exactly once
evm/src/HookerToken.sol The Robinhood Chain token: the same rules in its transfer, and each holder's balance × time for holder share. Every launch is a minimal-proxy clone of one implementation
evm/src/HookerMath.sol The newer hooks' arithmetic, ported one to one from v3.rs: the oscillators, the sine, and the calendar for daylight saving and US market holidays
evm/src/HookerLaunchpad.sol The Robinhood Chain curve, and its graduation: Pons V2 launchAndBuy in one transaction, then every holder paid on chain
lib/rules.mjs The rules layout, validation (mirrors the program) and refusal messages
lib/curve.mjs, lib/configs.mjs Economics and the Pumpfun-shaped Meteora curves (one config per size × anti-snipe × fee step), remade when Pumpfun changes its curve
lib/launch.mjs The Solana launch transaction (pool + rules + the creator's buy in one transaction) and trade builders
lib/settle.mjs Replays a Solana token's on-chain history into each holder's Pumpfun allocation
lib/graduate.mjs The Solana graduation service: idempotent, ledger-first steps (every signature stored before it is sent)
lib/pairs.mjs Custom pairs: Pumpfun's quote-control list, liquidity and safety checks, the Jupiter swap
lib/pumpprice.mjs Prices a coin in every phase: Hooker curve → Pumpfun curve → PumpSwap
lib/evm.mjs The Robinhood Chain API: launches (in ETH or any Pons pair asset), quotes, trades, on-chain USD prices, and the transactions the site asks a wallet to send
lib/pons-assets.mjs Pons's pair assets, checked against the factory before they are offered
lib/flywheel.mjs The burn: claims the burn wallet's creator fees, buys $HOOKER on PumpSwap and burns it
lib/lander.mjs Rebroadcasts a signed Solana transaction until it lands or provably cannot
lib/relay.mjs What the API will relay: only the transactions the site builds
server/api.mjs The HTTP API. It builds every transaction; the browser only signs
server/graduator.mjs, server/evm-graduator.mjs The graduation services, one per chain
server/gate.mjs An optional login gate in front of the site
web/ The site (React 19 + Vite; Wallet Standard for Solana, EIP-6963 for EVM wallets; no chain library in the browser)
tools/grind Grinds …hook vanity keys
test/, evm/test/ Unit tests and end-to-end suites against a local validator and a fork of Robinhood Chain

Running it locally

Requirements: Node 22+, the Solana CLI (Agave 4.x, for solana-test-validator and cargo-build-sbf), Rust, and Foundry for the Robinhood Chain side.

npm install && (cd web && npm install)
solana-keygen new --no-bip39-passphrase -o keys/hooker-hook-keypair.json        # the hook's program id, locally
solana-keygen new --no-bip39-passphrase -o keys/test-app-forwarder-keypair.json # a test-only app program (never deployed)
(cd programs/test-app-forwarder && cargo-build-sbf --sbf-out-dir ../../fixtures)
(cd programs/hooker-hook && cargo-build-sbf --sbf-out-dir ../../fixtures)       # build the hook
node scripts/make-pair-fixtures.mjs                                              # two real pair tokens, for the pair tests
nohup ./scripts/validator.sh > validator.log 2>&1 &                              # a local validator with mainnet's Meteora + Pumpfun
(cd tools/grind && cargo build --release) && tools/grind/target/release/hooker-grind hook 5 6 keys/test-vanity
(cd evm && forge install foundry-rs/forge-std OpenZeppelin/openzeppelin-contracts@v5.7.0 --no-git && forge build)
node scripts/evm-abi.mjs                                                         # the contracts' ABIs for the API

Tests:

node --test test/*.test.mjs              # unit tests
node test/e2e.mjs                        # launch → trade → graduate → every holder paid
TEST_SIZES=2 node test/e2e-v2.mjs        # every hook, against the real programs
TEST_SIZES=2 node test/e2e-v3.mjs        # the newer hooks (ONLY=king,ping,… runs some sections)
(cd programs/hooker-hook && cargo test --lib)   # the hook's own tests: calendar, daylight saving, oscillators, the King's bar
node test/api.mjs                        # the HTTP API
TEST_SIZES=2 node test/e2e-pairs.mjs     # graduating into custom pairs (WBTC, an xStock), and the SOL fallback
(cd evm && forge test)                   # every Robinhood Chain hook, no network
node test/e2e-evm.mjs                    # Robinhood Chain: launch → trade → graduate into Pons → every holder paid

The end-to-end suites run against the real mainnet bytecode: Meteora's bonding curve and Pumpfun cloned into the local validator, and a fork of live Robinhood Chain with the real Pons V2 contracts. node scripts/evm-local.mjs starts that fork with the launchpad deployed, to try the site against it.

On chain

  • $HOOKER on Solana (Pumpfun): 9BMbyUfW6g4ptTGqyZeLdKRMz9tM4ssSgUEKYK94hook
  • $HOOKER on Robinhood Chain (Pons): 0xEcc7660f54aaBA88b9cBE5aa6D823603035D5F6F
  • Solana hook program: GE5TW1AFehhNFLYiSiaAkmbTjnHTB3hdhw6ZZFBP5sLV
  • Robinhood Chain launchpad: 0x9151414adc57d8a77085d0f0f2fbb21269a3b42a
  • Robinhood Chain token implementation (every launch is a clone of it): 0x3db35b372a2bd4be083dc9e3265f97e8a7d27a45
  • Burn wallet (the creator of every graduated Pumpfun coin, buys and burns $HOOKER): hookXkHBi86pLTAPxShbvXiQsAPuyDmnanfXDs38p8n

Security

  • The rules are enforced by the token on chain; nobody can change them after launch.
  • Graduation is run by Hooker's services with their own wallets: every step is a public transaction. On Solana every payout can be recomputed from the token's on-chain history (lib/settle.mjs); on Robinhood Chain the payout is computed by the contract itself, and graduate and payout can be called by anyone.
  • No keys are in this repository. keys/, data/ and every .env are ignored.

Found a problem? Reach us at @hookerdotfun.

About

Launch a Pumpfun or Pons token with rules built into the token itself. Solana Token-2022 transfer hooks and Robinhood Chain contracts, curves shaped like Pumpfun's and Pons's, graduation into a normal coin.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages