Developers / Local tools
Solana Inspector.
When the transfers and balances do not add up.
For developers debugging Solana transactions. Inspect a saved JSON file, identify who paid the fee, separate swap legs from other transfers and locate unexplained balance differences — with the instructions behind each conclusion.
Start with a synthetic report. No installation or wallet connection to read it. Your own files are inspected locally, not uploaded here.
Start here / Three questions
See what an inspection can answer.
These three examples are synthetic teaching files, not blockchain records or evidence of general accuracy. Open the same report reader used by the local tool. It displays an already generated result; there is no browser analysis or transaction fetching.
Who actually paid the network fee?
- Evidence
- The wallet sends 0.1 SOL. The supplied record names a different account as the payer of the 5,000-lamport network fee.
- Conclusion
- The wallet's direct network fee is 0 lamports. Its 0.1 SOL transfer remains a separate movement.
- Limit
- A sponsored network fee does not prove that rent, reimbursements or every other wallet cost are zero.
- Next check
- Open the observation, compare the fee payer with the subject wallet, then follow the transfer's instruction reference.
Did the swap receive 2.5 tokens, or only 2?
- Evidence
- The synthetic swap exchanges 5 USDC for 2.5 TOKEN. A later instruction transfers 0.5 TOKEN away, leaving a net increase of 2 TOKEN.
- Conclusion
- The received swap leg and the later transfer are different movements. The final balance alone is not the swap's received amount.
- Limit
- Instruction order does not establish the later payment's commercial purpose or prove common ownership.
- Next check
- Compare the swap's received leg, the later transfer and their distinct instruction references. Do not label the transfer a fee without evidence.
Why is 0.01 SOL still unexplained?
- Evidence
- An instruction sends 0.1 SOL, but the supplied balance falls by only 0.09 SOL. This teaching file deliberately does not reconcile.
- Conclusion
- The +0.01 SOL residual is an unexplained difference, not a proven incoming payment or profit.
- Limit
- The inspector identifies the gap; it does not invent a missing instruction or prove which program caused it.
- Next check
- Open the affected account's balance check and the admitted instructions. Obtain corroborating execution evidence before changing the explanation.
GitHub discussions are public. Do not post private transaction files, credentials, wallet identities or local paths. A minimal synthetic reproduction is preferable. Reading the examples does not require a GitHub account; posting there does.
01 / Workflow
Your files. A bounded inspection.
You do not need access to the source repository. Use Node.js 22.12 or later in the 22.x line, or Node.js 24.x. Node installation and downloading the package are separate from offline inspection.
One wallet, up to 1,000 observations and 32 MiB of input. All final output files together are limited to 128 MiB. The worker has a 30-second processing deadline; that is not a deadline for the whole command, installation or report browsing.
Version 0.4.0 was checked on Windows x64 and Ubuntu 24.04 x64 with Node 22.12.0, 22.23.2, 24.0.0, 24.21.0. Other platforms are not claimed as verified.
Prepare your transaction JSON
Use a saved Solana
getTransactionresponse from your own provider, withjsonParsedencoding. Retain the transaction, signatures, slot, account references, instructions and execution metadata, including the supplied balances and logs.Accepted shapes: a JSON-RPC response envelope, its transaction result object, or an array of those objects. The input must retain the original execution record, not only a decoded summary.
A screenshot, a wallet address or signature alone, or a provider’s summarized swap object is not the same input. The inspector does not download transactions. Keep original address casing. Do not put API keys, provider URLs, seed phrases or private keys in the file.
Download, verify, then install
Download the package, checksum file and synthetic example JSON from the release panel. Put them in a new, empty working folder and open your terminal there. Do not rename the files. The commands below verify the package and example before installing; a mismatch means stop and download again from this site.
The local package is named
@z7onlabs/solana-inspectorand its command isz7on-inspect. It has no registry dependencies or install scripts. Installation uses your downloaded archive, not a package fetched from npm. The 0.4.0 inspector source is separate from the private application repository.PowerShell / Windows
1. Verify both files and install offline
$ErrorActionPreference = 'Stop' $expectedPackage = '25af612df021347a7b14522c0f325f0f3f37fb83ceaf19f3d07433e1295f26c6' $expectedExample = 'c006074402127c2988cb17d984bc5e00860d89d5e5d5641327868183bc9b7c14' if ((Get-FileHash -LiteralPath './z7onlabs-solana-inspector-0.4.0.tgz' -Algorithm SHA256).Hash.ToLowerInvariant() -ne $expectedPackage) { throw 'Package checksum mismatch. Do not install.' } if ((Get-FileHash -LiteralPath './example.json' -Algorithm SHA256).Hash.ToLowerInvariant() -ne $expectedExample) { throw 'Example checksum mismatch. Do not run.' } npm install './z7onlabs-solana-inspector-0.4.0.tgz' --ignore-scripts --offline --no-audit --no-fund if ($LASTEXITCODE -ne 0) { throw 'Installation failed.' }2. Inspect the synthetic example and reproduce it
npx --no-install z7on-inspect --input ./example.json --wallet 11111111111111111111111111111112 --out ./example-report if ($LASTEXITCODE -ne 0) { throw 'Inspection failed.' } npx --no-install z7on-inspect --input ./example-report/manifest.json --wallet 11111111111111111111111111111112 --out ./example-replay if ($LASTEXITCODE -ne 0) { throw 'Replay failed.' }3. Open the report from your disk
Start-Process -FilePath './example-report/report.html'The command opens your default browser. No local server is required.
Shell / Linux
1. Verify both files and install offline
set -eu printf '%s %s\n' '25af612df021347a7b14522c0f325f0f3f37fb83ceaf19f3d07433e1295f26c6' 'z7onlabs-solana-inspector-0.4.0.tgz' | sha256sum --check - printf '%s %s\n' 'c006074402127c2988cb17d984bc5e00860d89d5e5d5641327868183bc9b7c14' 'example.json' | sha256sum --check - npm install './z7onlabs-solana-inspector-0.4.0.tgz' --ignore-scripts --offline --no-audit --no-fund2. Inspect the synthetic example and reproduce it
npx --no-install z7on-inspect --input ./example.json --wallet 11111111111111111111111111111112 --out ./example-report npx --no-install z7on-inspect --input ./example-report/manifest.json --wallet 11111111111111111111111111111112 --out ./example-replay3. Open the report from your disk
xdg-open ./example-report/report.htmlOn desktop Linux this opens your default browser. On a headless machine, open report.html later in a browser; a desktop opener is not needed for inspection or replay. No local server is required.
The example is synthetic, not from blockchain. It demonstrates a sponsored fee and a deliberate unexplained balance difference. Its explanation lists the expected exact amounts. A completed command with an unresolved observation is expected; do not turn its residual into a proven incoming payment.
Use your own file and wallet
npx --no-install z7on-inspect --input "./your-transaction.json" --wallet "REPLACE_WITH_YOUR_WALLET_ADDRESS" --out "./your-report"After installation, replace the placeholders with your local JSON path, the subject wallet’s exact Solana address and a new output directory. Keep inputs and outputs separate. The parent directory must already exist; the output directory must not. The inspection runs offline: it does not query a provider or send the file to this website. The command uses the installed local binary, without fetching a missing package. Open
your-report/report.htmlfrom disk. To reproduce it, useyour-report/manifest.jsonas the input with the same wallet and another new output folder.
Maintainer-only source checkout
For maintainers with an authorized source checkout and its dependencies already installed. Package recipients do not need this route or access to the private application repository. These are application-maintainer commands, not instructions for the standalone open-source checkout. Follow its own README to build or contribute there.
pnpm inspector:buildpnpm inspector -- --input <file> --wallet <address> --out <new-dir>The local build produces a candidate package; it does not publish to a registry or make a download available on this website. The package README documents its installation, output files and limitations.
02 / Interpretation
Amounts first. Conclusions second.
An explained transaction is not a complete wallet history. An input hash identifies the bytes inspected; it does not independently authenticate a provider’s account of execution.
- Exact movements
- Token quantities, account effects and fees with their evidence. Preserve raw amounts and decimals rather than relying on a rounded display value.
- Scoped reconciliation
- Which observed amounts agree, which accounts are affected and where ownership, ordering or an unexplained difference blocks interpretation. Missing observations are not zero balances.
- Reproducible evidence
- Input fingerprints, methodology and source references alongside the conclusions. Keep the original files with the result so a later inspection can use the same evidence. A manifest from a different inspector version is rejected explicitly, not converted.
- Explicit limitations
- Unknown effects stay unresolved. The local inspector does not provide complete wallet PnL, tax advice, identity verification or a safety certification.
Files you can keep and inspect
input.json retains the inspected input; manifest.json records its provenance and hashes; report.json is the structured result; and report.html is the local, readable report. Search for a signature or account, filter observations, open evidence and return without losing your page. The global summary does not change when you filter. Original addresses keep their casing.
The HTML has its own data and reader, with no remote resources, browser storage or telemetry. You can move that file and still browse it. With JavaScript disabled, keep the accompanying report JSON beside it to use the fallback link. Review reports before sharing: they contain your supplied transaction data.
Optional --feedback creates a local feedback.json file. Nothing is submitted automatically. Treat these files as potentially sensitive; review them before sharing.
It inspects supplied execution records. It cannot recover missing funds, predict a trade’s outcome or make incomplete evidence complete.
03 / Support boundary
Specific support. Visible limits.
Support depends on the instruction variant and available evidence, not just a protocol name. A partial transaction can contain a demonstrated movement without making its other effects known.
- SPL Token
- Evidence-based account movements. Transfers and supported account lifecycles are reconstructed where amounts, ownership and order can be demonstrated. Unknown inventory stays unknown.
- DFlow
- Bounded, observed v4 variants. Swap attribution requires matching invocation evidence and reconciled movements. Another user’s swap is not assigned to the subject wallet.
- Token-2022
- Conditional support, not all extensions. A temporary account path must have a stable demonstrated owner, linear movements and reconciled endpoints. Unknown hooks, mixed funds and unexplained differences remain blocked; a difference is not automatically a fee.
- Other programs and variants
- No blanket interpretation. Retain observable movements and unresolved effects. Recognition of a program does not establish a swap, an app of origin or profit.
04 / Existing evidence
Three archived checks, not a success score.
These selected cases come from the existing 472-transaction pilot, with the archive cutoff of September 6, 2026, 11:00 UTC. Expected quantities are independently checked against original instructions and balance observations, not copied from the inspector’s result. They are not a representative accuracy benchmark.
All three examples have been compared with compiled inspector output and independently checked original quantities. The third preserves the unexplained discrepancy. A separate comparison ran solana-dex-parser 2.6.7 on the same archived files, using parseAll and parseTransfers. Both tools retained the compared transfers; the inspector explicitly presents fee-payer attribution and unexplained residuals, while the parser exposes other protocol details. Their scopes differ. Three selected cases do not establish general superiority or measured time savings.
Raw amounts are indivisible token units; network fees are lamports. These are not US dollars or PnL. No USDC = US$1 assumption is applied.
01 / A sponsor pays the network feeAug 17, 2026 / 13:32:42 UTC
Slot 439858959 / Signature 2fcrizMaicQtCkaCnaV934aMzJas5tSoaKBTMGX1Yt3dxKZyy4kFPGoKPesLsqbgnEza51ByquL6awaAZGPUedXw
The successful record identifies a different signer as the fee payer. Its network fee must not be charged directly to the subject wallet. The observed USDC debit includes the separately located transfer; the token account receives 359762514646 raw units of mint 9LbBjxBiinbq76oJF9PRFyaPWGnggPyJcTARuiGEZZh9.
- Transaction network fee
- 410000 lamports
- Direct network fee charged to the subject wallet
- 0 lamports
- Observed USDC net debit
- 7169600 raw
Required behavior: Preserve the sponsor/subject distinction. A zero direct network fee does not declare rent, reimbursements or other fees zero.
Evidence limit: These observations do not certify the complete SOL/WSOL lifecycle, opening inventory or financial cost basis.
Compiled CLI check: The network fee appears exactly once, with the sponsor as payer and no direct charge to the subject wallet. The transaction still remains partial.
02 / Swap legs and separate transfersAug 21, 2026 / 18:10:59 UTC
Slot 440742350 / Signature ptupYGvoRAWASezfKxMpagSfu5dJ5SMFrkubL5ERUFCaAwGCZPeTSddbHcaLhZee4Q6LrpE39XcikATZgzcYNau
Outer instruction 2 invokes DFlow. Its inner positions 7 and 13 show the USDC debit and a credit of 660469342113 raw units of mint 2wMTr4ZttVr5tmS4wLStee59wi8f9QQfMtT2Hoispump. Outer instructions 3 and 4 then send USDC to two different destinations. Positions are zero-based.
- USDC debit within the DFlow invocation
- 123839209 raw
- Later USDC transfers / distinct destinations
- 570000 + 380000 raw
- Observed USDC account / before → after
- 124789209 → 0 raw
Required behavior: Keep the invocation and both later transfers separate: 123839209 + 570000 + 380000 = 124789209. A later payment is not automatically a fee, app attribution or proof of common ownership.
Evidence limit: The raw-evidence check proves positions and quantities, not the payments’ commercial purpose. It does not decode DFlow events or independently certify app-fee semantics.
Compiled CLI check: The inspector reconstructs one swap. Its existing parser classifies the 570000 raw payment as an app fee; the later 380000 raw payment remains a separate transfer, absent from the fee list and ordered after the swap. The transaction remains partial.
03 / An unexplained SOL balance differenceAug 15, 2026 / 14:36:11 UTC
Slot 439452186 / Signature AydmegAF4iPV3GvAHn3Sptth6hksjyGCD5sX365EaUW7U6uYafMJ3JEUPwM9mfSgi2HG55LkjM3tiMk8x8VRDdE
The original wallet account is observed at 0 lamports before and after. Outer instruction 2, inner position 9 explicitly transfers 1991393129 lamports out. Network fees and the temporary account’s rent are sponsored; its close sends funds to the sponsor, not this wallet. Positions are zero-based.
- Observed native balance change
- 0 lamports
- Net change explained by admitted instructions
- -1991393129 lamports
- Unexplained residual / not a proven credit
- +1991393129 lamports
Required behavior: Keep the native account blocked: 0 - (-1991393129) = 1991393129. Do not convert this residual into a fee, a fabricated credit or a verified protocol payout.
Evidence limit: This is a gap in the admitted instruction explanation, not a contradiction of the chain. A preceding opaque invocation is a possible source of missing effects, not verified causality. Resolving it requires validated program-specific evidence or corroborating account/instruction traces.
Compiled CLI check: The offline CLI preserves the exact 1991393129-lamport residual and the unexplained_balance_change blocker. It does not create an incoming transfer or an additional fee, and financial results remain unavailable.
05 / Troubleshooting
A report is not a green light.
Exit 0 means the report was generated, not that the evidence is complete. Unknown effects remain visible. No output proves chain authenticity, shared ownership or financial performance.
- Incomplete or contradictory evidence
- Open the observation’s limitations and instruction references. Contradictory revisions of the same signature stay separate in the reader, but are excluded from economic totals. Missing identity is not counted as an identified transaction. Supply corroborating execution evidence; do not delete a revision just to obtain a complete-looking report.
- Input rejected / exit 2
- Check the wallet’s exact address, valid UTF-8 JSON, the original getTransaction result and the size/count limits. An RPC error or null result is not a transaction. A manifest hash mismatch means its inputs or results changed; preserve the original set.
- Output or processing failure / exit 3
- Use a new output folder under an existing, writable parent. Existing reports are never overwritten. Check free disk space and use a local filesystem that supports hard links. Do not disable security controls or run as administrator to bypass an unexplained error. An incomplete output is not a completed run.
- Timeout / exit 124 · cancelled / exit 130
- Ctrl+C cancels a running inspection. For the worker deadline, inspect a smaller, clearly labelled subset and keep the source file. A smaller sample does not inherit the original sample’s scope or establish a full wallet history.
- Command or installation unavailable
- Confirm a supported Node/npm installation and run inside the working folder where you installed the verified archive. Do not replace the documented command with an unpinned online npx download. Use
npx --no-install z7on-inspect --helpto see the installed command’s arguments.
06 / Optional feedback
Did it resolve a real question?
Tell us what you tried, whether you used your own file, what worked or blocked you, and whether you used it again on another day. This is a free usability trial, not validated commercial demand.
No email, files, wallet addresses, transaction signatures, secrets or local paths are requested. Do not include them in free-text answers. Package version and a local receipt code are optional. The inspector never opens this form or sends a receipt automatically.
The form is hosted by Google. Responses are private to the brand account and used to improve the tool and assess usefulness. Individual responses are retained until 90 days after the experiment closes; afterwards, only aggregated conclusions are kept. This does not promise anonymity from Google. There is no inspector telemetry or embedded survey in your offline report.