FIND Solana (sol, SOL, mainnet-beta) TRANSACTIONS BY PROGRAM INSTRUCTION — search one WALLET's
value-moving records by the decoded method name and/or the program that produced them
(e.g. "merge" of stake, "mintTo" / "closeAccount" of spl-token, "DecreaseLiquidity" of
Orca), optionally pinned to one token by mint. Returns SLIM per-instruction records
(signature, block, time, program, method, top-level program + method, inner call path,
sender→receiver, amount, currency, mint) — one call instead of scanning whole transactions.
A Currency of unknown:<id> is a token without a known symbol or decimals: Mint identifies
it and its Amount is in RAW base units. Inspect a found transaction with solana_tx_transfers.
WHAT IS SEARCHABLE — only records that move value or touch accounts (transfers, mints,
burns, account create/close, stake operations), and only a FEW programs are decoded into
method names. The common stored names, exactly as they appear:
- spl-token: transfer, transferChecked, mintTo, mintToChecked, burn, burnChecked,
closeAccount, initializeAccount3, setAuthority, syncNative
- system: transfer, createAccount, createAccountWithSeed, transferWithSeed
- spl-associated-token-account: create, createIdempotent; stake: merge, split, withdraw;
address-lookup-table, bpf-upgradeable-loader, vote
- Orca (Whirlpool, PascalCase): Swap, DecreaseLiquidity, CollectFees, CollectReward,
OpenPositionWithMetadata
Everything else is NOT decoded — Raydium (AMM, CPMM, CLMM, LaunchLab), pump.fun, PumpSwap,
Jupiter and other DEX / launchpad / aggregator programs. Their own method names (swap,
swap_base_input, buy_exact_in, migrate_to_cpswap, ...) are never stored in any spelling,
so searching for them returns nothing. Such a program shows up only as its base58 id in
Program / Outer_Program with an EMPTY Method: search it with program=<program id> plus an
address and an empty instruction (or "transferChecked" / "transfer" for just the token
legs it moved).
TWO LEVELS ONLY. Program/Method is the program that executed the record (usually
spl-token or system); Outer_Program/Outer_Method is the TOP-LEVEL instruction of the
transaction it sits in. Programs called in between are not recorded: a Raydium swap
routed through an aggregator shows the aggregator as Outer_Program and Raydium nowhere,
so program=<Raydium id> finds only transactions that called Raydium directly.
ADDRESS must be a wallet (the OWNER that sent or received value). A token MINT, a token
account or a pool / market account is never the sender or receiver of the swaps and
transfers that involve it — pool funds sit under the DEX's shared vault authority, not
under the pool address. Such an account usually appears only as the Receiver of the
createAccount record that funded it, so address=<pool> with instruction=createAccount
finds the transaction that created a pool (e.g. a launchpad migration). For "swaps of
token X" or "trades in pool Y" use pool_recent_trades, tx_trades, early_buyers or
top_traders_by_token (resolve the pool with token_dex_venues); to keep one token within
a wallet's records, pass mint.
FRESHNESS: records arrive with a delay — typically tens of minutes, at times several hours. A
recent transaction may not be searchable yet — retry later instead of concluding it
does not exist.
COST: WITH address → indexed lookup over that wallet's last 90 days (days); it can still
time out when the service is busy — retry later, or lower days. WITHOUT address → scan of
ALL Solana activity in since_time/before_time (default last 7 days, billions of records):
it almost always times out, so give an address whenever you can; it also needs
instruction or program (with neither it returns nothing).
Page back with cursor: pass the Cursor value of the LAST row of a page — unlike
before_block it never skips the other matches in that block.