Liquidity-powered launches

Stake LP. Earn the token.

Bulliq turns trading volume into rewards for the people providing liquidity on PumpSwap. This doc explains exactly how SOL becomes LP rewards, end to end.

What is Bulliq

Provide liquidity. Stake your LP tokens. Earn rewards.

Bulliq is a fair-launch meme token launchpad on Solana built on top of pump.fun + PumpSwap. Every launch spins up a custodial treasury wallet that collects trading revenue and custodies all PumpSwap LP tokens that users stake. SOL revenue is harvested, swapped into the launched token via Jupiter, and credited pro-rata to LP stakers. There is no platform emissions token and no inflation.

TL;DR

  • • Launch a token for 0.025 SOL + optional dev buy (≤ 10 SOL).
  • • Token launches on pump.fun. Trading revenue is owned by the launch's treasury wallet.
  • • On graduation, liquidity migrates to PumpSwap and an LP mint is born.
  • • Anyone provides liquidity on PumpSwap, then stakes the LP tokens with Bulliq.
  • • Every 5 min: harvest revenue → swap to token → credit stakers pro-rata.
  • • Stakers claim the launched token or unstake their LP at any time.

The liquidity flow

End-to-end, here is what a single dollar of trading volume does on Bulliq:

1
Trade happens on pump.fun
Trading revenue is generated and sent to the token's revenue account.
2
Treasury collects
Cron pulls SOL into the per-launch treasury wallet every 5 minutes.
3
Jupiter swap
~90% of the harvested SOL is swapped into the launched token. ~10% covers gas + platform.
4
Pro-rata credit
pending_rewards is increased for every staker proportional to their share of total_staked_lp.
5
Staker claims
Phantom-signed claim transfers the token from the treasury ATA → the staker's wallet.
6
Staker unstakes
Phantom-signed unstake returns the staker's LP tokens from the treasury back to their wallet.
SOL revenue ─▶ treasury wallet ─▶ Jupiter swap ─▶ launched token
                                               │
                                               ▼
                         stakers' pending_rewards (pro-rata of total_staked_lp)
                                               │
                                               ▼
                                   claim ─▶ stakers' wallet

Launching a token

  1. Connect Phantom and fill name, symbol, description, image.
  2. (Optional) Dev buy: SOL you spend on your own token at launch (cap 10 SOL).
  3. Confirm. We generate a one-time deposit address and DB row in pending_payment.
  4. You send 0.025 SOL + dev_buy to that address.
  5. Helius RPC detects the deposit. Status → funded.
  6. Image + metadata pin to IPFS. PumpPortal create tx is signed by the treasury. Status → live.
All trading revenue on the token is routed to LP stakers.

Graduation to PumpSwap

Tokens trade on the pump.fun bonding curve until the market cap hits ~$69k (pump.fun standard). At that point pump.fun auto-migrates remaining liquidity into a PumpSwap AMM pool. A PumpSwap LP mint is created — this is the SPL token you receive when you add liquidity on PumpSwap.

Bulliq reads the LP mint from the pool, stores it on the launch's reward_pools row, and stake/unstake flows light up automatically.

Staking LP tokens

  1. Provide liquidity on PumpSwap → receive LP tokens in your wallet.
  2. Open the token detail page on Bulliq and pick an amount (or MAX).
  3. Phantom signs a server-built SPL transfer that sends LP tokens to the treasury ATA.
  4. Server verifies the on-chain transfer via Helius (mint matches the pool's LP mint, recipient = treasury ATA, signer = your wallet, signature is not reused).
  5. Your net_staked_lp is increased and you start earning on the next harvest tick.

Reward accounting

Every harvest tick (~5 min), for each launch with stakers:

harvested_sol  = collectRevenue(treasury)
swapped_tokens = jupiterSwap(harvested_sol * 0.9, SOL -> token)
platform_cut   = harvested_sol * 0.1

for each staker s with net_staked_lp > 0:
    share          = s.net_staked_lp / total_staked_lp
    s.pending     += swapped_tokens * share

pool.total_distributed += swapped_tokens
pool.last_collect_at    = now()

Accounting is checkpoint-based: you earn rewards from every tick where your stake was active. Unstaking after a tick keeps the rewards you already accrued — they sit in pending_rewards until you claim.

Claim & unstake

Both flows are gated by Phantom signMessage (ed25519). The signed payload includes a nonce and timestamp; signatures older than 5 min are rejected. The treasury is the signer of the resulting on-chain transfer.

ActionWhat happens
claimRewardsTreasury sends your pending_rewards (launched token) → your wallet. pending_rewards resets to 0.
requestUnstakeTreasury sends the requested amount of LP tokens → your wallet. net_staked_lp decreases.

Launch states

  • pending_payment — deposit address generated, waiting for SOL.
  • funded — deposit detected on-chain.
  • launching — metadata pinned, pump.fun create tx in flight.
  • live — mint exists, bonding curve trading is open.
  • graduated — PumpSwap pool live, LP mint indexed, staking enabled.
  • failed — launch reverted before going live; deposit refundable.

Fees & numbers

Platform launch fee     0.025 SOL  (covers deposit addr + IPFS + signing)
Dev buy (optional)      0 - 10 SOL
Trading revenue share   0.05%     (pump.fun standard, owned by treasury)
Platform cut on harvest ~10%      (gas + infra)
To LP stakers           ~90%      (swapped into the launched token)
Harvest cadence         every 5 min
Deposit detect          every 1 min
Signature TTL           5 min

Error reference

ErrorMeaning
WalletNotConnectedConnect Phantom to continue.
NotGraduatedToken has not migrated to PumpSwap yet — LP mint does not exist.
NoLpBalanceYour wallet has no PumpSwap LP tokens for this pool.
MintMismatchSubmitted transfer is for a different SPL mint than the pool's LP mint.
RecipientMismatchTransfer recipient is not the treasury ATA.
DuplicateStakeThis transfer signature was already credited.
SignatureExpiredPhantom signature is older than 5 min — re-sign.
SignatureInvalided25519 verify failed for the connected wallet.
InsufficientStakeNet staked LP below requested unstake amount.
NoRewardspending_rewards is 0 — nothing to claim.

Security

  • ✓ Treasury private keys are AES-256-GCM encrypted at rest.
  • ✓ Encrypted columns are revoked from the public Data API — only server-side workers can decrypt.
  • ✓ Cron endpoints require a shared x-cron-secret header.
  • ✓ Claim and unstake require an ed25519 signature from the staker's wallet with a 5-min replay window.
  • ✓ Stake credit requires an on-chain Helius lookup of the transfer signature — never trusted from the client.
  • ✓ Pinned metadata is content-addressed on IPFS (immutable).
  • ✓ No admin path can sweep stakers' LP — every treasury action is constrained by the staker's signed request.

Roadmap

Phase 1 — Liquidity rewards (current)
  • Custodial treasury per launch
  • PumpPortal launch pipeline
  • Helius-verified LP staking
  • Harvest + Jupiter swap → pro-rata credit
  • Phantom signMessage gating
  • Auto-compound option
  • PumpSwap migration webhook
Phase 2 — Staker UX
  • Per-token APR + earnings history
  • One-click add-LP + stake combo
  • Notifications on claim-ready
Phase 3 — Platform token
  • $CASH — revenue share for $CASH stakers
  • Reduced platform cut for $CASH holders

Config

PLATFORM_FEE_LAMPORTS  25_000_000        (0.025 SOL)
DEV_BUY_CAP_LAMPORTS   10_000_000_000    (10 SOL)
HARVEST_INTERVAL       5 min
DEPOSIT_DETECT         1 min
SIG_TTL                300 s
RPC                    Helius (mainnet)
IPFS                   Pinata
SWAP                   Jupiter Aggregator

Open source. Built in public. Not financial advice — meme tokens are highly speculative.