Skip to content
COMING SOON

Figures here are a preview.

What is real?

Verify

Check our math. In your own browser.

Everything on this page runs in your browser. It derives addresses with the same code the program uses and reads them from a public Solana RPC, not from our API.

01Streamer vaultDEMO

A streamer's vault is a program-derived address from three seeds: "streamer", the platform byte and their numeric user ID. Same inputs, same address, on any machine.

Platform
  1. 01Build the seeds

    seed 0"streamer"73 74 72 65 61 6d 65 72
    seed 1platform u8 = 3 (pump.fun)03
    seed 2user_id "d0d0a1c34f2b4e6d8a1f00000000c001"64 30 64 30 61 31 63 33 34 66 32 62 34 65 36 64 38 61 31 66 30 30 30 30 30 30 30 30 63 30 30 31
    const seeds = [
      utf8("streamer"),
      Uint8Array.of(3),  // pump.fun
      utf8("d0d0a1c34f2b4e6d8a1f00000000c001"),  // 32 hex ASCII (UUID, no dashes)
    ];
  2. 02Take the program id

    program idMockVau1t1111111111111111111111111111111111
    32 bytes05 54 53 53 21 5f c8 89 c9 1e ac c4 9c 54 4f 49 b9 f5 7c a0 52 c4 fa 65 91 58 5e 8c 00 00 00 00

    DEMO Placeholder program id until the vault program is deployed.

    const programId = bs58.decode(
      "MockVau1t1111111111111111111111111111111111"
    ); // 32 bytes
  3. 03Search the bump from 255 down

    A PDA must be off the ed25519 curve, so nobody can hold a private key for it. The first try was already off the curve.

    bump255 (try 1)
    sha256 input · 95 bytes

    73 74 72 65 61 6d 65 72 03 64 30 64 30 61 31 63 33 34 66 32 62 34 65 36 64 38 61 31 66 30 30 30 30 30 30 30 30 63 30 30 31 ff 05 54 53 53 21 5f c8 89 c9 1e ac c4 9c 54 4f 49 b9 f5 7c a0 52 c4 fa 65 91 58 5e 8c 00 00 00 00 50 72 6f 67 72 61 6d 44 65 72 69 76 65 64 41 64 64 72 65 73 73

    for (let bump = 255; bump >= 0; bump--) {
      const h = sha256(concat(...seeds, [bump],
        programId, utf8("ProgramDerivedAddress")));
      if (!isOnEd25519Curve(h)) return { pda: h, bump };
    }
  4. 04Result: the vault address

    He8av2E7ZU6VErrRkt17vRx8Nuyhdwn9TuPGKaSbpQFQ

    Matches the vault we list for dustledger.

    // = findProgramAddressSync(seeds, programId)
    pda === "He8av2E7ZU6VErrRkt17vR…"
  5. 05Read it from a public RPC

    Cluster

    solana-rpc.publicnode.com

    await fetch("https://solana-rpc.publicnode.com", {
      method: "POST",
      body: JSON.stringify({ jsonrpc: "2.0", id: 1,
        method: "getAccountInfo",
        params: [pda, { encoding: "base64" }] }),
    });

02Real-chain check: pump.fun fee tiersLIVE DATA

The same technique on an account that exists today. Your browser derives pump.fun's fee_config address, reads it from solana-rpc.publicnode.com and decodes the creator-fee tiers.

Fee config of
  1. 01Derive pump.fun's fee_config address

    seed 0"fee_config"66 65 65 5f 63 6f 6e 66 69 67
    seed 1pump_amm program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEA
    programpfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZ
    result5PHirr8joyTMp9JMm6nW7hNDVyEYdkzDqazxPD7RaTjx (bump 255)
    findProgramAddressSync(
      [utf8("fee_config"), bs58.decode(PUMP_AMM_PROGRAM)],
      PUMP_FEES_PROGRAM,
    );
  2. 02Read it from the public mainnet RPC

    Reading the public mainnet RPC…

    getAccountInfo("5PHirr8j…",
      { encoding: "base64" })
    // check: owner === pump_fees program
  3. 03Decode the creator-fee tiers

    Waiting for the account data.

    let o = 8 + 1 + 32 + 24;   // disc, bump, admin, flat fees
    const n = view.getUint32(o, true); o += 4;
    for (let i = 0; i < n; i++) {
      const threshold = u128(o);      // market cap, lamports
      const [lp, protocol, creator] = u64x3(o + 16);  // bps
      o += 40;
    }

03Attestation decoder

A claim or payout binding needs a 244-byte message (layout v2) signed by our attestor key. Paste one to see every field and check the signature, or generate a sample.

import { ed25519 } from "@noble/curves/ed25519";
const ok = ed25519.verify(signature, message, attestorPubkey);

Paste a message, or generate a sample, to see its fields.