Parameters

signature
string
required
Transaction signature (base-58 encoded)
config
object
Configuration object containing:
commitment
string
Commitment level (processed, confirmed, finalized)
encoding
string
Encoding for transaction data (base58, base64, jsonParsed)
maxSupportedTransactionVersion
number
Maximum transaction version to support

Response

result
object
Object containing:
slot
number
The slot the transaction was processed in
transaction
object
message
object
header
object
numRequiredSignatures
number
Number of required signatures
numReadonlySignedAccounts
number
Number of read-only signed accounts
numReadonlyUnsignedAccounts
number
Number of read-only unsigned accounts
accountKeys
array
Array of account public keys (base-58 encoded)
recentBlockhash
string
Recent blockhash used for transaction
instructions
array
Array of instruction objects containing:
programId
string
Program ID (base-58 encoded)
accounts
array
Array of account indices
data
string
Instruction data (base-58 encoded)
signatures
array
Array of transaction signatures (base-58 encoded)
meta
object
err
object
Error object if transaction failed
fee
number
Fee paid for the transaction
preBalances
array
Array of account balances before the transaction
postBalances
array
Array of account balances after the transaction
innerInstructions
array
Array of inner instruction objects
logMessages
array
Array of log messages
preTokenBalances
array
Array of token balances before the transaction
postTokenBalances
array
Array of token balances after the transaction
rewards
array
Array of reward objects

Code Examples

Basic Request

curl https://rpc.orbitflare.com -X POST -H "Content-Type: application/json" -d '{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "getTransaction",
  "params": [
    "5VERv8NMvzbJMEkV8xnrLkUaQwJJ9C9zV5uZ6cKf7Kq9",
    {
      "encoding": "jsonParsed"
    }
  ]
}'

Using web3.js

import { Connection, Transaction } from '@solana/web3.js';

const connection = new Connection('https://rpc.orbitflare.com');

// Get transaction
const signature = '5VERv8NMvzbJMEkV8xnrLkUaQwJJ9C9zV5uZ6cKf7Kq9';
const transaction = await connection.getTransaction(signature, {
  encoding: 'jsonParsed'
});
console.log('Transaction:', transaction);

// Get transaction with analysis
async function getTransactionWithAnalysis(
  signature: string,
  config: { commitment?: string; encoding?: string }
) {
  const transaction = await connection.getTransaction(signature, config);
  
  return {
    transaction,
    analysis: {
      success: !transaction.meta.err,
      fee: transaction.meta.fee,
      balanceChanges: transaction.meta.postBalances.map((post, index) => ({
        account: transaction.transaction.message.accountKeys[index],
        change: post - transaction.meta.preBalances[index]
      })),
      tokenBalanceChanges: transaction.meta.postTokenBalances?.map((post, index) => ({
        account: post.account,
        mint: post.mint,
        change: BigInt(post.uiTokenAmount.amount) - BigInt(transaction.meta.preTokenBalances![index].uiTokenAmount.amount)
      })),
      metadata: {
        timestamp: Date.now(),
        commitment: config.commitment
      }
    }
  };
}

Notes

  1. Returns transaction details for a given signature
  2. The transaction must be confirmed to be returned
  3. The response includes detailed information about the transaction
  4. The transaction can be parsed in different encodings
  5. The transaction must be a valid signature

Best Practices

  1. Use appropriate commitment level based on your needs
  2. Cache results when appropriate to reduce RPC load
  3. Monitor for transaction status changes
  4. Consider using websocket subscription for real-time updates
  5. Handle network errors and retry when appropriate

Common Errors

CodeMessageSolution
-32601Method not foundVerify you’re connected to a Solana RPC node
-32602Invalid paramsCheck signature and configuration
-32007Transaction not foundVerify the transaction exists
-32008Invalid encodingEnsure encoding is valid

Use Cases

  1. Transaction Analysis
    interface TransactionAnalysis {
      signature: string;
      transaction: {
        success: boolean;
        fee: number;
        balanceChanges: Array<{
          account: string;
          change: number;
        }>;
        tokenBalanceChanges?: Array<{
          account: string;
          mint: string;
          change: bigint;
        }>;
        instructions: Array<{
          programId: string;
          accounts: string[];
          data: string;
        }>;
      };
      metrics: {
        totalBalanceChange: number;
        totalTokenBalanceChange?: bigint;
        instructionCount: number;
        accountCount: number;
      };
      metadata: {
        timestamp: number;
        commitment?: string;
      };
    }
    
    class TransactionAnalyzer {
      async analyzeTransaction(
        signature: string,
        config: { commitment?: string; encoding?: string }
      ): Promise<TransactionAnalysis> {
        const transaction = await connection.getTransaction(signature, config);
        
        return {
          signature,
          transaction: {
            success: !transaction.meta.err,
            fee: transaction.meta.fee,
            balanceChanges: transaction.meta.postBalances.map((post, index) => ({
              account: transaction.transaction.message.accountKeys[index],
              change: post - transaction.meta.preBalances[index]
            })),
            tokenBalanceChanges: transaction.meta.postTokenBalances?.map((post, index) => ({
              account: post.account,
              mint: post.mint,
              change: BigInt(post.uiTokenAmount.amount) - BigInt(transaction.meta.preTokenBalances![index].uiTokenAmount.amount)
            })),
            instructions: transaction.transaction.message.instructions.map(ix => ({
              programId: transaction.transaction.message.accountKeys[ix.programIdIndex],
              accounts: ix.accounts.map(index => transaction.transaction.message.accountKeys[index]),
              data: ix.data
            }))
          },
          metrics: {
            totalBalanceChange: transaction.meta.postBalances.reduce((sum, post, index) => 
              sum + (post - transaction.meta.preBalances[index]), 0),
            totalTokenBalanceChange: transaction.meta.postTokenBalances?.reduce((sum, post, index) => 
              sum + (BigInt(post.uiTokenAmount.amount) - BigInt(transaction.meta.preTokenBalances![index].uiTokenAmount.amount)), BigInt(0)),
            instructionCount: transaction.transaction.message.instructions.length,
            accountCount: transaction.transaction.message.accountKeys.length
          },
          metadata: {
            timestamp: Date.now(),
            commitment: config.commitment
          }
        };
      }
    }
    
  2. Transaction Monitoring
    interface TransactionChange {
      signature: string;
      changes: {
        status: 'confirmed' | 'failed' | 'dropped';
        previousStatus?: 'confirmed' | 'failed' | 'dropped';
        error?: any;
      };
      metadata: {
        timestamp: number;
      };
    }
    
    class TransactionMonitor {
      private previousTransactions: Map<string, {
        status: 'confirmed' | 'failed' | 'dropped';
        error?: any;
      }> = new Map();
      
      async monitorTransaction(
        signature: string,
        config: { commitment?: string; encoding?: string }
      ): Promise<TransactionChange | null> {
        const transaction = await connection.getTransaction(signature, config);
        const currentStatus = transaction ? (transaction.meta.err ? 'failed' : 'confirmed') : 'dropped';
        const previous = this.previousTransactions.get(signature);
        
        if (previous && (previous.status !== currentStatus || previous.error !== transaction?.meta.err)) {
          this.previousTransactions.set(signature, {
            status: currentStatus,
            error: transaction?.meta.err
          });
          
          return {
            signature,
            changes: {
              status: currentStatus,
              previousStatus: previous.status,
              error: transaction?.meta.err
            },
            metadata: {
              timestamp: Date.now()
            }
          };
        }
        
        this.previousTransactions.set(signature, {
          status: currentStatus,
          error: transaction?.meta.err
        });
        return null;
      }
    }
    
  3. Transaction Planning
    interface TransactionPlan {
      signature: string;
      transaction: {
        success: boolean;
        fee: number;
        balanceChanges: Array<{
          account: string;
          change: number;
        }>;
        tokenBalanceChanges?: Array<{
          account: string;
          mint: string;
          change: bigint;
        }>;
      };
      recommendations: Array<{
        type: 'optimize' | 'retry' | 'cancel';
        reason: string;
      }>;
      metadata: {
        timestamp: number;
      };
    }
    
    class TransactionPlanner {
      private readonly maxFee = 1000000; // 0.001 SOL
      private readonly minBalance = 1000000; // 0.001 SOL
      
      async planTransaction(
        signature: string,
        config: { commitment?: string; encoding?: string }
      ): Promise<TransactionPlan> {
        const transaction = await connection.getTransaction(signature, config);
        
        const recommendations: Array<{
          type: 'optimize' | 'retry' | 'cancel';
          reason: string;
        }> = [];
        
        // Check for high fees
        if (transaction.meta.fee > this.maxFee) {
          recommendations.push({
            type: 'optimize',
            reason: `Transaction fee (${transaction.meta.fee}) exceeds maximum (${this.maxFee})`
          });
        }
        
        // Check for low balances
        const lowBalanceAccounts = transaction.meta.postBalances
          .map((post, index) => ({
            account: transaction.transaction.message.accountKeys[index],
            balance: post
          }))
          .filter(acc => acc.balance < this.minBalance);
        
        if (lowBalanceAccounts.length > 0) {
          recommendations.push({
            type: 'optimize',
            reason: `Accounts with low balances: ${lowBalanceAccounts.map(acc => acc.account).join(', ')}`
          });
        }
        
        // Check for failed transaction
        if (transaction.meta.err) {
          recommendations.push({
            type: 'retry',
            reason: `Transaction failed with error: ${JSON.stringify(transaction.meta.err)}`
          });
        }
        
        return {
          signature,
          transaction: {
            success: !transaction.meta.err,
            fee: transaction.meta.fee,
            balanceChanges: transaction.meta.postBalances.map((post, index) => ({
              account: transaction.transaction.message.accountKeys[index],
              change: post - transaction.meta.preBalances[index]
            })),
            tokenBalanceChanges: transaction.meta.postTokenBalances?.map((post, index) => ({
              account: post.account,
              mint: post.mint,
              change: BigInt(post.uiTokenAmount.amount) - BigInt(transaction.meta.preTokenBalances![index].uiTokenAmount.amount)
            }))
          },
          recommendations,
          metadata: {
            timestamp: Date.now()
          }
        };
      }
    }