Skip to main content
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-sdk';
import { createSolanaRpc } from '@solana/kit';
import { Signature, Commitment } from '@solana/web3.js';

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