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.
01Build the seeds
seed 0"streamer"73 74 72 65 61 6d 65 72seed 1platform u8 = 3 (pump.fun)03seed 2user_id "d0d0c3e56b4d4a8f8c3b00000000c003"64 30 64 30 63 33 65 35 36 62 34 64 34 61 38 66 38 63 33 62 30 30 30 30 30 30 30 30 63 30 30 33const seeds = [ utf8("streamer"), Uint8Array.of(3), // pump.fun utf8("d0d0c3e56b4d4a8f8c3b00000000c003"), // 32 hex ASCII (UUID, no dashes) ];02Take the program id
program idMockVau1t111111111111111111111111111111111132 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 00DEMO Placeholder program id until the vault program is deployed.
const programId = bs58.decode( "MockVau1t1111111111111111111111111111111111" ); // 32 bytes03Search 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 63 33 65 35 36 62 34 64 34 61 38 66 38 63 33 62 30 30 30 30 30 30 30 30 63 30 30 33 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 }; }04Result: the vault address
HiMq5UnvM9uHvywk4v6ojKb5wQZjCZRpt5ghtykkQJ4X
Matches the vault we list for mintnight.
// = findProgramAddressSync(seeds, programId) pda === "HiMq5UnvM9uHvywk4v6ojK…"05Read it from a public RPC
Clustersolana-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.
01Derive pump.fun's fee_config address
seed 0"fee_config"66 65 65 5f 63 6f 6e 66 69 67seed 1pump_amm program pAMMBay6oceH9fJKBRHGP5D4bD4sWpmSwMn52FMfXEAprogrampfeeUxB6jkeY1Hxd7CsFCAjcbHA9rWtchMGdZ6VojVZresult5PHirr8joyTMp9JMm6nW7hNDVyEYdkzDqazxPD7RaTjx (bump 255)findProgramAddressSync( [utf8("fee_config"), bs58.decode(PUMP_AMM_PROGRAM)], PUMP_FEES_PROGRAM, );02Read it from the public mainnet RPC
Reading the public mainnet RPC…
getAccountInfo("5PHirr8j…", { encoding: "base64" }) // check: owner === pump_fees program03Decode 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.