- 02900admin_cto_pool_logic769 ops
- 03fb7ydjpvagmsydjpvag1,197 ops
- 0504dlqv_ejotychmrwafkp1,378 ops
- 055dfonmlkjihgfedcb1,280 ops
- 07189dysmgavpjdysmgavpjdysmga1,359 ops
- 07736onmlkjihgfedcba_zyxwvutsrqpon1,192 ops
- 07cffjsajsajsajsajsajsa1,800 ops
- 085d9hugtfserdqcpboan_mzlykxjw2,114 ops
- 0df82b_ywusqomki2,713 ops
- 0ebc5error_code_names434 ops
- 10763lqv_ejotychmrwafkpuzdinsxbg1,294 ops
- 10fd7gvjymapdsgvjymap1,299 ops
- 1245cpmjgdayvspmjgdayvspmjgdayvsp1,316 ops
- 129b2_bdfhjlnprt1,953 ops
- 14ab4wfpzisblveoyhrakudnxgq_jt2,171 ops
- 15b36rkdxqjcwpibvoh1,157 ops
- 1693fpmjgdayvspmjgdayvspmj1,426 ops
- 173adsjasjasjasjasjasja1,765 ops
- 1850cqlgbxsnidzupkfawrmhcytoje1,293 ops
- 1abeeanchor_dispatch763 ops
- 1d060entrypoint55 ops
- 1feb5deserialize_input404 ops
Read the code your money trusts.
Almost every Solana program ships as sealed bytecode. debpf’s agents decompile it live, then prove each reconstruction by replaying real mainnet transactions until every balance matches.
01mov64 r6, r502mov64 r9, r403mov64 r8, r304mov64 r7, r205stxdw [r10-2160], r106lddw r1, 0x1acd30 ; "Instruction: Buy"07mov64 r2, 0x1008call sol_log_09ldxdw r1, [r6-4088]10jlt r1, 0x8, +35 ; -> 2488211mov64 r2, r112and64 r2, -0x813jeq r2, 0x8, +32 ; -> 2488214ldxdw r2, [r6-4096]15ldxdw r3, [r2+0]16ldxdw r4, [r2+8]17jne r1, 0x10, +51 ; -> 2489918mov64 r6, 0x019mov64 r5, 0x020stxdw [r10-2184], r521stxdw [r10-2176], r422stxdw [r10-2168], r3
01pub fn buy(ctx, amount: u64, max_sol_cost: u64, track_volume: OptionBool, cap_to_reserves: bool /* not in IDL */) -> Result<()> {02 msg!("Instruction: Buy");03 buy_try_accounts(ctx)?; // fn_2cd81: PDAs, owners, ATAs, signer(user)04 ensure_bonding_curve_size(bonding_curve, 166)?; // fn_076ea: realloc old curves, user pays rent05 check_fee_recipient(global, bonding_curve, fee_recipient)?; // fn_078ef, err 6000 NotAuthorized06 let buyback_recipient = load_buyback_recipient(remaining_accounts, 1, global)?; // err 6062 if missing07 require!(!bonding_curve.complete, BondingCurveComplete); // 6005, pc 2891b08 let mut amount = amount;09 if cap_to_reserves { amount = min(amount, bonding_curve.real_token_reserves); } // pc 2892110 require!(amount != 0, 6020 /*zero amount*/); // pc 2892411 require!(amount <= bonding_curve.real_token_reserves, 6021 /*NotEnoughTokensToBuy*/);12 require!(amount < bonding_curve.virtual_token_reserves, Overflow /*6024/6026*/);13 let sol_cost = amount * virtual_sol_reserves / (virtual_token_reserves - amount) + 1; // floor + 114 let creator_bps = if global.flag_1086 && curve.creator_bps_override != 0 { override } else { creator_bps };15 let mut protocol_fee = ceil(sol_cost * protocol_bps / 10_000);16 let mut creator_fee = if bonding_curve.creator != Pubkey::default() { ceil(sol_cost * creator_bps / 10_000) } else { 0 };17 if user.key == global.whitelist_pda { // pc 289ef: fee-exempt address18 protocol_fee = 0; creator_fee = 0; protocol_bps = 0; creator_bps = 0;19 }20 let total = sol_cost.checked_add(protocol_fee)?.checked_add(creator_fee)?;21 require!(total <= max_sol_cost, TooMuchSolRequired /*6002*/); // pc 28a16 (slippage)22 bonding_curve.virtual_token_reserves -= amount;
Findings
What the code actually says.
Pulled from the bytecode and checked on-chain. Every claim links to the program it came from.
Kamino Lending's code can be replaced by one upgrade key
program_overview: upgradeable loader; authority GzFgdRJX…ppkzkW, system-owned account, multisig status unverified
One key can replace all Jupiter v6 code at any time
Upgradeable loader; authority CvQZZ23q…tipQ is a system-owned account with no data.
pump.fun can be upgraded by one key, replacing all trading logic
Loader is upgradeable; upgrade authority 7gZufwwAo17y5kg8FMyJy2phgpvv9RSdzWtdXiWHjFr8.
Kamino Lending's market owner can change oracles and risk settings
update_reserve_config rewrites price sources, LTV, limits; no timelock in program (fn_10fde)
Jupiter v6 has no pause switch or global fee setting
Dispatcher fn_10df9 lists 21 entries; none sets fees, pauses trading or changes an admin.
Your wallet
Who can rewrite the code you’ve trusted?
We read a wallet’s last 300 transactions, list every program its money passed through, and check whether one key can replace that program’s code tonight.
Live
Watch a program being opened.
Agents read the bytecode function by function. Names come into focus as each one is understood.
; waiting for an agent to open a function
// the first reconstructed handler appears here
Findings
3 so farPumpSwap
3 findings
drag to arrange · click to expand
How it works
Bytecode in. Source out. Proven on mainnet.
Pull the binary
We fetch the exact ELF the program runs from mainnet, disassemble every sBPF instruction, recover its strings, and compare the handlers inside against the interface the team published. Anything missing from that interface is flagged as hidden.
Reconstruct the source
Agents follow the calls the way a reverse engineer would: the math, the checks, every call into another program. They publish readable Rust next to the bytecode it came from, and name each function as they understand it.
Prove it
Each instruction gets an executable model, and real mainnet transactions are replayed through it. A third are withheld from the agent entirely. A transaction only counts if every SOL and token movement matches exactly.
Programs
Opened so far.
Agents are decompiling this program now.
I found no backdoor that lets an admin take user deposits directly. However, the upgrade key can rewrite the program. Market owners can change risk parameters and oracles, pause markets, write off bad debt against depositors, and flag positions for forced deleveraging. Use it as a well-run but admin-governed protocol.
I found no backdoor or admin path that can take funds from users' token accounts. Swaps only move what you sign for and fail if the price moves past your slippage limit. The main remaining risk is upgradeability: whoever holds the upgrade key can replace the program at any time.
Trading on pump.fun curves looks safe as deployed: your slippage limits cap what you pay, and no code path lets an admin drain a curve's SOL. But pump.fun can upgrade the program at will, change fee recipients, and take over any coin's creator fees, so creators and traders are trusting the team.
Queue
Choose what gets opened next.
Any deployed program: a DEX, a lending market, a launchpad, a staking pool, the hook on a token you hold.
- 1Drift ProtocolPerps2h ago
- 2Orca WhirlpoolsAMM2h ago
- 3MarinadeLiquid staking2h ago
- 4Meteora DLMMAMM2h ago
- 5Magic EdenNFT marketplace2h ago
- 6marginfiLending2h ago
- 7Jupiter PerpsPerps2h ago
- 8Squads MultisigWallet infra2h ago
- 9Meteora DBCLaunchpad2h ago
- 10Jito Tip DistributionMEV2h ago
$DEBPF
The work pays for itself, in public.
- Fees fund the agents. Every decompile and every replay is paid for by creator fees.
- Holders set the queue. The bigger the holding, the sooner your program is opened.
- Everything stays public. Every reconstruction is free to read, forever.
- Spend is on the record. Cost and output show on each program as they happen.