debpf
pump.fun / instructions

Instruction

set_quote_control_reserves_admin

DecompiledHidden

Hidden admin instruction (not in the public IDL) that replaces the `reserves_admin` key stored in pump.fun's QuoteControl PDA (seeds "quote-control"). Only the current QuoteControl admin or the global pump.fun authority (Global.authority) can call it; any other signer fails with custom error 6000. It accepts any pubkey as the new value without checking it, emits an event recording the old and new key, and moves no SOL or tokens. The instruction never reads the reserves admin field itself, so what that role controls is not visible here.

Discriminator
0xa1c3dea5e165c03e
Calls in the sample
0
Reproduced, seen by the agent
—
Reproduced, never shown to the agent
—
Bytecodefn_25ae0
25ae0mov64 r6, r5
25ae1mov64 r9, r4
25ae2mov64 r8, r3
25ae3mov64 r7, r2
25ae4stxdw [r10-2768], r1
25ae5lddw r1, 0x1ae78f ; "Instruction: SetQuoteControlReservesAdmin"
25ae7mov64 r2, 0x29
25ae8call sol_log_
25ae9ldxdw r1, [r6-4088]
25aeajlt r1, 0x20, +125 ; -> 25b68
25aebldxdw r1, [r6-4096]
25aecldxdw r2, [r1+6]
25aedldxb r3, [r1+14]
25aeestxb [r10-1344], r3
25aefldxh r3, [r1+0]
25af0stxh [r10-32], r3
25af1ldxb r3, [r1+2]
25af2stxb [r10-30], r3
25af3ldxh r3, [r1+3]
25af4ldxb r4, [r1+5]
25af5stxdw [r10-1352], r2
25af6ldxdw r5, [r10-1351]
25af7stxdw [r10-25], r5
25af8lsh64 r4, 0x10
25af9or64 r3, r4
25afalsh64 r2, 0x18
25afbor64 r2, r3
25afcstxw [r10-29], r2
25afdldxdw r2, [r1+23]
25afestxdw [r10-9], r2
25affldxdw r2, [r1+15]
25b00stxdw [r10-17], r2
25b01ldxb r1, [r1+31]
25b02stxb [r10-1], r1
25b03stb [r10-2689], 0xff
25b04sth [r10-2691], 0xffff
25b05stxdw [r10-2680], r9
25b06stxdw [r10-2688], r8
25b07mov64 r1, r10
25b08add64 r1, -0xa83
25b09stxdw [r10-4088], r1
25b0amov64 r1, r10
25b0badd64 r1, -0x548
25b0cmov64 r3, r10
25b0dadd64 r3, -0xa80
25b0emov64 r5, r10
25b0fmov64 r2, r7
25b10call fn_1b988
25b11ldxdw r8, [r10-1336]
25b12ldxdw r6, [r10-1344]
25b13ldxdw r9, [r10-1352]
25b14lddw r1, 0x8000000000000000
25b16jeq r9, r1, +100 ; -> 25b7b
25b17mov64 r1, r10
25b18add64 r1, -0xa58
25b19mov64 r2, r10
25b1aadd64 r2, -0x530
25b1bmov64 r3, 0x510
25b1ccall fn_35367
25b1dstxdw [r10-2656], r8
25b1estxdw [r10-2664], r6
25b1fstxdw [r10-2672], r9
25b20ldxh r1, [r10-2691]
25b21stxh [r10-1320], r1
25b22ldxb r1, [r10-2689]
25b23stxb [r10-1318], r1
25b24ldxdw r1, [r10-2680]
25b25stxdw [r10-1328], r1
25b26ldxdw r1, [r10-2688]
25b27stxdw [r10-1336], r1
25b28mov64 r1, r10
25b29add64 r1, -0xa70
25b2astxdw [r10-1344], r1
25b2bstxdw [r10-1352], r7
25b2cmov64 r1, r10
25b2dadd64 r1, -0xa98
25b2emov64 r2, r10
25b2fadd64 r2, -0x548
25b30mov64 r3, r10
25b31add64 r3, -0x20
25b32call fn_0c868
25b33ldxdw r6, [r10-2712]
25b34jeq r6, 0x2, +1 ; -> 25b36
25b35ja +73 ; -> 25b7f
25b36mov64 r1, r10
25b37add64 r1, -0xaa8
25b38mov64 r2, r10
25b39add64 r2, -0xa70
25b3alddw r3, 0x1adff9
25b3cmov64 r4, r7
25b3dcall fn_00d61
25b3emov64 r6, 0x2
25b3fldxdw r2, [r10-2728]
25b40jeq r2, 0x2, +9 ; -> 25b4a
25b41ldxdw r3, [r10-2720]
25b42mov64 r1, r10
25b43add64 r1, -0xab8
25b44lddw r4, 0x1adefd ; "quote_control"
25b46mov64 r5, 0xd
25b47call fn_005a9
25b48ldxdw r8, [r10-2736]
25b49ldxdw r6, [r10-2744]
25b4aldxdw r1, [r10-2528]
25b4bldxdw r2, [r10-2536]
25b4cldxdw r3, [r2+0]
25b4dadd64 r3, -0x1
25b4estxdw [r2+0], r3
25b4fjne r3, 0x0, +3 ; -> 25b53
25b50ldxdw r3, [r2+8]
25b51add64 r3, -0x1
25b52stxdw [r2+8], r3
25b53ldxdw r2, [r1+0]
25b54add64 r2, -0x1
25b55stxdw [r1+0], r2
25b56jne r2, 0x0, +3 ; -> 25b5a
25b57ldxdw r2, [r1+8]
25b58add64 r2, -0x1
25b59stxdw [r1+8], r2
25b5aldxdw r1, [r10-2480]
25b5bldxdw r2, [r10-2488]
25b5cldxdw r3, [r2+0]
25b5dadd64 r3, -0x1
25b5estxdw [r2+0], r3
25b5fjne r3, 0x0, +3 ; -> 25b63
25b60ldxdw r3, [r2+8]
25b61add64 r3, -0x1
25b62stxdw [r2+8], r3
25b63ldxdw r2, [r1+0]
25b64add64 r2, -0x1
25b65stxdw [r1+0], r2
25b66jne r2, 0x0, +20 ; -> 25b7b
25b67ja +53 ; -> 25b9d
25b68lddw r1, 0x1b3c60
25b6acall fn_33e71
25b6bmov64 r1, r0
25b6cand64 r1, 0x3
25b6dmov64 r2, r1
25b6eadd64 r2, -0x2
25b6fjlt r2, 0x2, +5 ; -> 25b75
25b70jeq r1, 0x0, +4 ; -> 25b75
25b71ldxdw r1, [r0-1]
25b72ldxdw r2, [r0+7]
25b73ldxdw r2, [r2+0]
25b74callx r2
25b75mov64 r1, r10
25b76add64 r1, -0xac8
25b77mov64 r2, 0x66
25b78call fn_32b09
25b79ldxdw r8, [r10-2752]
25b7aldxdw r6, [r10-2760]
25b7bldxdw r1, [r10-2768]
25b7cstxdw [r1+8], r8
25b7dstxdw [r1+0], r6
25b7eexit
25b7fldxdw r8, [r10-2704]
25b80ldxdw r1, [r10-2528]
25b81ldxdw r2, [r10-2536]
25b82ldxdw r3, [r2+0]
25b83add64 r3, -0x1
25b84stxdw [r2+0], r3
25b85jne r3, 0x0, +3 ; -> 25b89
25b86ldxdw r3, [r2+8]
25b87add64 r3, -0x1
25b88stxdw [r2+8], r3
25b89ldxdw r2, [r1+0]
25b8aadd64 r2, -0x1
25b8bstxdw [r1+0], r2
25b8cjne r2, 0x0, +3 ; -> 25b90
25b8dldxdw r2, [r1+8]
25b8eadd64 r2, -0x1
25b8fstxdw [r1+8], r2
25b90ldxdw r1, [r10-2480]
25b91ldxdw r2, [r10-2488]
25b92ldxdw r3, [r2+0]
25b93add64 r3, -0x1
25b94stxdw [r2+0], r3
25b95jne r3, 0x0, +3 ; -> 25b99
25b96ldxdw r3, [r2+8]
25b97add64 r3, -0x1
25b98stxdw [r2+8], r3
25b99ldxdw r2, [r1+0]
25b9aadd64 r2, -0x1
25b9bstxdw [r1+0], r2
25b9cjne r2, 0x0, -34 ; -> 25b7b
25b9dldxdw r2, [r1+8]
25b9eadd64 r2, -0x1
25b9fstxdw [r1+8], r2
25ba0ja -38 ; -> 25b7b
Reconstructedset_quote_control_reserves_admin
// discriminator a1c3dea5e165c03e — NOT in the published IDL
// args: new_reserves_admin: Pubkey (ix data must be >= 8+32 bytes, else InstructionDidNotDeserialize)
#[account(discriminator = c9a2d5c1ee23f438)] // seeds ["quote-control"]
pub struct QuoteControl {
pub admin: Pubkey, // data[8..40] (checked against signer below)
pub reserves_admin: Pubkey, // data[40..72] (field changed by this ix)
pub third_key: Pubkey, // data[72..104] (role not seen in this handler)
pub entries: Vec<[u8; 40]>, // u32 len @104, 40-byte entries (likely mint + config)
}
#[event_cpi]
#[derive(Accounts)]
pub struct SetQuoteControlReservesAdmin<'info> {
pub authority: Signer<'info>, // fn_02590, error acct "authority"
#[account(seeds = [b"global"], bump)] // ConstraintSeeds(2006) "global"
pub global: Account<'info, Global>,
#[account(mut, seeds = [b"quote-control"], bump)] // ConstraintMut(2000) / ConstraintSeeds(2006)
pub quote_control: Account<'info, QuoteControl>, // owner == program, disc check
// event_authority: seeds ["__event_authority"] (ConstraintSeeds), program
}
// fn_1b988 pc 1ba3c..1ba6a
require!(
authority.key() == quote_control.admin // memcmp #1
|| authority.key() == global.authority, // memcmp #2 (Global data[9..41])
PumpError(6000) /* custom error code 0, account "authority" */
);
pub fn set_quote_control_reserves_admin(ctx, new_reserves_admin: Pubkey) -> Result<()> {
msg!("Instruction: SetQuoteControlReservesAdmin");
let qc = &mut ctx.accounts.quote_control;
let old_reserves_admin = qc.reserves_admin; // pc c86c
qc.reserves_admin = new_reserves_admin; // pc c875 (no validation of the new key)
let ts = Clock::get()?.unix_timestamp; // fn_32dcc
// event disc 0x21a95c57b6b3fb43 (LE bytes 43fbb3b6575ca921), 144 bytes
let ev = QuoteControlReservesAdminSet {
quote_control: qc.key(),
authority: ctx.accounts.authority.key(),
old_reserves_admin,
new_reserves_admin,
timestamp: ts,
};
sol_log_data(&[ev.bytes()]); // pc c8fb (emit!)
// emit_cpi!: invoke_signed(self program, [event_authority (signer)],
// data = e445a52e51cb9a1d || ev, seeds ["__event_authority", bump]) // pc c9cf
Ok(()) // quote_control re-serialized on exit (fn_00d61)
}
// No lamports or tokens move.

Replay model

The executable model the agent wrote. Every tally above comes from running it against mainnet.

// no model entered yet

Accounts

Not published. The accounts and arguments were recovered from the bytecode; see the reconstruction.

program 6EF8rr…BEwF6P