Basic · practical evidence lab · ungraded

Read the transaction record

Practice moving from a transaction response to a narrow, evidence-backed conclusion. These three records are fictional teaching data, not real signatures or addresses. Work from the fields shown; no wallet, RPC request, signing, SOL, account, or internet connection is needed.

Safety: Never paste a recovery phrase or private key into a learning exercise. This page does not send or save your answers. The exercise does not identify a real person or prove why anyone signed.

Follow the evidence workflow

  1. 1 · Identify scopeCluster, commitment, signature
  2. 2 · Read executionCheck meta.err and fee
  3. 3 · Match accountsUse account keys and indices
  4. 4 · Bound the claimSeparate observation from identity

Case 1 · successful native SOL transfer

What amount reached the destination?

This fictional legacy transaction was read at finalized commitment. Its parsed instruction summary shows one System Program transfer from account 0 to account 1. All balance values are lamports. The transaction fee is paid by the fee payer in SOL.

Selected getTransaction fields · synthetic response
{
  "cluster": "Fictional Mainnet",
  "commitment": "finalized",
  "transaction": {
    "message": {
      "accountKeys": ["SENDER_AND_FEE_PAYER", "DESTINATION", "SYSTEM_PROGRAM", "COMPUTE_BUDGET_PROGRAM"],
      "instructions": [
        {"program": "computeBudget", "programId": "COMPUTE_BUDGET_PROGRAM", "parsed": {"type": "setComputeUnitLimit", "info": {"units": 200000}}, "stackHeight": 1},
        {"program": "system", "programId": "SYSTEM_PROGRAM", "parsed": {"type": "transfer", "info": {
          "source": "SENDER_AND_FEE_PAYER", "destination": "DESTINATION", "lamports": 200000000
        }}, "stackHeight": 1}
      ]
    }
  },
  "meta": {
    "err": null,
    "fee": 5000,
    "preBalances": [1000000000, 50000000, 0, 0],
    "postBalances": [799995000, 250000000, 0, 0]
  }
}
Calculate the changes before you choose a conclusion.

Pre-balance minus post-balance.

Post-balance minus pre-balance.

Separate the reported fee from the sender's total decrease.

Reveal the worked example and limits

The sender decreases by 200,005,000 lamports. The 5,000-lamport fee is separate, leaving 200,000,000 lamports for the transfer. The destination increases by that same 200,000,000 lamports, or 0.2 SOL. This fictional response supports the stated account changes at the displayed cluster and commitment. It does not establish a person's real-world identity or intent.

Case 2 · failed instruction

Did the requested state change commit?

The second synthetic response contains a System Program transfer followed by a fictional program instruction. Instruction 1 fails, so the entire transaction's requested state changes roll back. The fee payer's balance falls by the reported network fee; the destination's balance does not change.

Selected getTransaction fields · synthetic response
{
  "cluster": "Fictional Devnet",
  "commitment": "confirmed",
  "transaction": {
    "message": {
      "accountKeys": ["SENDER_AND_FEE_PAYER", "DESTINATION", "SYSTEM_PROGRAM", "FICTIONAL_TEST_PROGRAM"],
      "instructions": [
        {"program": "system", "programId": "SYSTEM_PROGRAM", "parsed": {"type": "transfer", "info": {
          "source": "SENDER_AND_FEE_PAYER", "destination": "DESTINATION", "lamports": 200000000
        }}, "stackHeight": 1},
        {"program": "fictionalTestProgram", "programId": "FICTIONAL_TEST_PROGRAM", "accounts": [], "data": "SYNTHETIC_FAILING_INSTRUCTION"}
      ]
    }
  },
  "meta": {
    "err": {"InstructionError": [1, {"Custom": 1}]},
    "fee": 5000,
    "preBalances": [1000000000, 50000000, 0, 1],
    "postBalances": [999995000, 50000000, 0, 1]
  }
}
Separate transaction execution from fee payment.
Reveal the worked example and limits

meta.err is not null, so the transaction's instruction execution failed. The destination remains at 50,000,000 lamports; the earlier requested transfer did not commit because the full transaction is atomic. The sender decreases by exactly the reported 5,000-lamport fee. Solana transaction fees can still be charged when execution fails. See the linked current fee documentation rather than assuming a fixed fee for a real transaction.

Case 3 · token-account evidence

Match the token balances to the right accounts.

This synthetic response uses a legacy message so every account key appears in one short list. accountIndex points into that transaction account list. Match the same mint and index across pre- and post-token balances; the token account's authority is not the same thing as its runtime program owner.

Selected getTransaction fields · synthetic response
{
  "cluster": "Fictional Devnet",
  "commitment": "confirmed",
  "transaction": {"message": {"accountKeys": [
    "FEE_PAYER", "SOURCE_TOKEN_ACCOUNT", "SOURCE_AUTHORITY", "DESTINATION_TOKEN_ACCOUNT",
    "DESTINATION_AUTHORITY", "EXAMPLE_MINT", "TOKEN_PROGRAM"
  ]}},
  "meta": {
    "err": null,
    "fee": 5000,
    "preBalances": [1000000000, 2039280, 50000000, 2039280, 50000000, 1461600, 1],
    "postBalances": [999995000, 2039280, 50000000, 2039280, 50000000, 1461600, 1],
    "preTokenBalances": [
      {"accountIndex": 1, "mint": "EXAMPLE_MINT", "owner": "SOURCE_AUTHORITY", "programId": "TOKEN_PROGRAM", "amount": "10000000", "decimals": 6},
      {"accountIndex": 3, "mint": "EXAMPLE_MINT", "owner": "DESTINATION_AUTHORITY", "programId": "TOKEN_PROGRAM", "amount": "1250000", "decimals": 6}
    ],
    "postTokenBalances": [
      {"accountIndex": 1, "mint": "EXAMPLE_MINT", "owner": "SOURCE_AUTHORITY", "programId": "TOKEN_PROGRAM", "amount": "7500000", "decimals": 6},
      {"accountIndex": 3, "mint": "EXAMPLE_MINT", "owner": "DESTINATION_AUTHORITY", "programId": "TOKEN_PROGRAM", "amount": "3750000", "decimals": 6}
    ]
  }
}
Pair entries by mint and account index, then interpret the raw amount.

Convert the raw-unit change using six decimals.

Reveal the worked example and limits

Index 1 maps to the source token account and index 3 to the destination token account. Both entries use the same example mint. The source falls by 2,500,000 raw units and the destination rises by the same amount. Six decimals give 2.5 tokens. The fee is 5,000 lamports paid in SOL. The programId names the Token Program; the token-balance owner names each token authority. For versioned transactions, account-key resolution and loaded addresses add care; check the current RPC structures and supported transaction version.

Primary references · reviewed 2026-10-01

Verify the field definitions

The examples deliberately omit unrelated response fields. A real report should record the exact cluster, source, query time, signature, commitment, version support, and any missing fields. Do not treat an RPC response as proof of a person's identity, intent, or off-chain claim.