Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.getpara.com/llms.txt

Use this file to discover all available pages before exploring further.

Monitor transaction confirmation status and wait for finality on Solana. This guide covers checking transaction results and understanding commitment levels.
import { useParaSolanaSigner } from "@getpara/react-native-wallet/solana";
import { createSolanaRpc, Signature, Commitment } from '@solana/kit';

const rpc = createSolanaRpc("https://api.mainnet-beta.solana.com");

function TransactionStatus() {
  const { solanaSigner, isLoading } = useParaSolanaSigner({ rpc });

  const checkTransactionStatus = async (signature: Signature) => {
    try {
      const { value: statuses } = await rpc
        .getSignatureStatuses([signature], { searchTransactionHistory: true })
        .send();

      const status = statuses[0];

      if (!status) {
        console.log("Transaction not found");
        return null;
      }

      console.log("Confirmations:", status.confirmations || "Max (32+)");
      console.log("Confirmation status:", status.confirmationStatus);
      console.log("Slot:", status.slot);

      if (status.err) {
        console.error("Transaction failed:", status.err);
        return false;
      }

      return status;
    } catch (error) {
      console.error("Error checking status:", error);
      throw error;
    }
  };

  const waitForConfirmation = async (
    signature: Signature,
    commitment: Commitment = 'confirmed'
  ) => {
    try {
      const startTime = Date.now();

      let confirmed = false;
      while (!confirmed) {
        const { value: statuses } = await rpc
          .getSignatureStatuses([signature], { searchTransactionHistory: true })
          .send();

        const status = statuses[0];

        if (status?.confirmationStatus === commitment ||
            status?.confirmationStatus === 'finalized') {
          confirmed = true;

          if (status.err) {
            throw new Error(`Transaction failed: ${JSON.stringify(status.err)}`);
          }
        }

        // Wait before next poll
        if (!confirmed) {
          await new Promise(resolve => setTimeout(resolve, 1000));
        }

        // Timeout after 30 seconds
        if (Date.now() - startTime > 30000) {
          throw new Error('Transaction confirmation timeout');
        }
      }

      const elapsed = Date.now() - startTime;
      console.log(`Transaction confirmed in ${elapsed}ms`);

      // Get transaction details
      const { value: txInfo } = await rpc
        .getTransaction(signature, {
          commitment,
          maxSupportedTransactionVersion: 0,
        })
        .send();

      if (txInfo) {
        console.log("Block time:", new Date(txInfo.blockTime * 1000));
        console.log("Fee:", txInfo.meta.fee, "lamports");
        console.log("Compute units:", txInfo.meta.computeUnitsConsumed);
      }

      return txInfo;
    } catch (error) {
      console.error("Confirmation error:", error);
      throw error;
    }
  };

  return (
    <div>
      <button onClick={() => checkTransactionStatus("YOUR_SIGNATURE" as Signature)}>
        Check Status
      </button>
      <button onClick={() => waitForConfirmation("YOUR_SIGNATURE" as Signature, "finalized")}>
        Wait for Finalization
      </button>
    </div>
  );
}

Next Steps