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 = 2 (kick)02seed 2user_id "70000104"37 30 30 30 30 31 30 34const seeds = [ utf8("streamer"), Uint8Array.of(2), // kick utf8("70000104"), // decimal ASCII ];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. Bump 255 landed on the curve and was skipped.
bump254 (try 2)sha256 input · 71 bytes
73 74 72 65 61 6d 65 72 02 37 30 30 30 30 31 30 34 fe 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
59qhCTo4iuL6EgKeWxWdq2ns3Ar8GwYAvmaQoNXnP62J
Matches the vault we list for Mirasolace.
// = findProgramAddressSync(seeds, programId) pda === "59qhCTo4iuL6EgKeWxWdq2…"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.