Add confirmations to tx table
This commit is contained in:
parent
f55c53e5ca
commit
69502cc68e
|
@ -138,6 +138,7 @@ const renderTransactionRow = (transaction: Transaction) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
const slotText = `${transaction.slot || "-"}`;
|
const slotText = `${transaction.slot || "-"}`;
|
||||||
|
const confirmationsText = `${transaction.confirmations || "-"}`;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<tr key={transaction.id}>
|
<tr key={transaction.id}>
|
||||||
|
@ -152,7 +153,7 @@ const renderTransactionRow = (transaction: Transaction) => {
|
||||||
<td>
|
<td>
|
||||||
<code>{transaction.signature}</code>
|
<code>{transaction.signature}</code>
|
||||||
</td>
|
</td>
|
||||||
<td>-</td>
|
<td className="text-uppercase">{confirmationsText}</td>
|
||||||
<td>{slotText}</td>
|
<td>{slotText}</td>
|
||||||
</tr>
|
</tr>
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { PublicKey, Connection } from "@solana/web3.js";
|
import { PublicKey, Connection } from "@solana/web3.js";
|
||||||
import { findGetParameter, findPathSegment } from "../utils";
|
import { findGetParameter, findPathSegment } from "../utils";
|
||||||
import { useCluster } from "./cluster";
|
import { useCluster, ClusterStatus } from "./cluster";
|
||||||
|
|
||||||
export enum Status {
|
export enum Status {
|
||||||
Checking,
|
Checking,
|
||||||
|
@ -131,6 +131,8 @@ export function AccountsProvider({ children }: AccountsProviderProps) {
|
||||||
|
|
||||||
// Check account statuses on startup and whenever cluster updates
|
// Check account statuses on startup and whenever cluster updates
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
|
if (status !== ClusterStatus.Connected) return;
|
||||||
|
|
||||||
Object.values(state.accounts).forEach(account => {
|
Object.values(state.accounts).forEach(account => {
|
||||||
fetchAccountInfo(dispatch, account.id, account.pubkey, url);
|
fetchAccountInfo(dispatch, account.id, account.pubkey, url);
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
import React from "react";
|
import React from "react";
|
||||||
import { TransactionSignature, Connection } from "@solana/web3.js";
|
import { TransactionSignature, Connection, PublicKey } from "@solana/web3.js";
|
||||||
import { findGetParameter, findPathSegment } from "../utils";
|
import { findGetParameter, findPathSegment } from "../utils";
|
||||||
import { useCluster } from "../providers/cluster";
|
import { useCluster, ClusterStatus } from "../providers/cluster";
|
||||||
|
|
||||||
export enum Status {
|
export enum Status {
|
||||||
Checking,
|
Checking,
|
||||||
|
@ -16,11 +16,14 @@ enum Source {
|
||||||
Input
|
Input
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export type Confirmations = number | "max";
|
||||||
|
|
||||||
export interface Transaction {
|
export interface Transaction {
|
||||||
id: number;
|
id: number;
|
||||||
status: Status;
|
status: Status;
|
||||||
source: Source;
|
source: Source;
|
||||||
slot?: number;
|
slot?: number;
|
||||||
|
confirmations?: Confirmations;
|
||||||
signature: TransactionSignature;
|
signature: TransactionSignature;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,6 +43,7 @@ interface UpdateStatus {
|
||||||
id: number;
|
id: number;
|
||||||
status: Status;
|
status: Status;
|
||||||
slot?: number;
|
slot?: number;
|
||||||
|
confirmations?: Confirmations;
|
||||||
}
|
}
|
||||||
|
|
||||||
interface InputSignature {
|
interface InputSignature {
|
||||||
|
@ -71,7 +75,8 @@ function reducer(state: State, action: Action): State {
|
||||||
transaction = {
|
transaction = {
|
||||||
...transaction,
|
...transaction,
|
||||||
status: action.status,
|
status: action.status,
|
||||||
slot: action.slot
|
slot: action.slot,
|
||||||
|
confirmations: action.confirmations
|
||||||
};
|
};
|
||||||
const transactions = {
|
const transactions = {
|
||||||
...state.transactions,
|
...state.transactions,
|
||||||
|
@ -128,6 +133,13 @@ export function TransactionsProvider({ children }: TransactionsProviderProps) {
|
||||||
|
|
||||||
// Check transaction statuses on startup and whenever cluster updates
|
// Check transaction statuses on startup and whenever cluster updates
|
||||||
React.useEffect(() => {
|
React.useEffect(() => {
|
||||||
|
if (status !== ClusterStatus.Connected) return;
|
||||||
|
|
||||||
|
// Create a test transaction
|
||||||
|
if (findGetParameter("dev")) {
|
||||||
|
createDevTransaction(dispatch, url);
|
||||||
|
}
|
||||||
|
|
||||||
Object.values(state.transactions).forEach(tx => {
|
Object.values(state.transactions).forEach(tx => {
|
||||||
checkTransactionStatus(dispatch, tx.id, tx.signature, url);
|
checkTransactionStatus(dispatch, tx.id, tx.signature, url);
|
||||||
});
|
});
|
||||||
|
@ -142,6 +154,20 @@ export function TransactionsProvider({ children }: TransactionsProviderProps) {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function createDevTransaction(dispatch: Dispatch, url: string) {
|
||||||
|
try {
|
||||||
|
const connection = new Connection(url);
|
||||||
|
const signature = await connection.requestAirdrop(
|
||||||
|
new PublicKey(0),
|
||||||
|
1,
|
||||||
|
"recent"
|
||||||
|
);
|
||||||
|
dispatch({ type: ActionType.InputSignature, signature });
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Failed to create dev transaction", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function checkTransactionStatus(
|
export async function checkTransactionStatus(
|
||||||
dispatch: Dispatch,
|
dispatch: Dispatch,
|
||||||
id: number,
|
id: number,
|
||||||
|
@ -156,6 +182,7 @@ export async function checkTransactionStatus(
|
||||||
|
|
||||||
let status;
|
let status;
|
||||||
let slot;
|
let slot;
|
||||||
|
let confirmations: Confirmations | undefined;
|
||||||
try {
|
try {
|
||||||
const { value } = await new Connection(url).getSignatureStatus(signature);
|
const { value } = await new Connection(url).getSignatureStatus(signature);
|
||||||
|
|
||||||
|
@ -163,6 +190,12 @@ export async function checkTransactionStatus(
|
||||||
status = Status.Missing;
|
status = Status.Missing;
|
||||||
} else {
|
} else {
|
||||||
slot = value.slot;
|
slot = value.slot;
|
||||||
|
if (typeof value.confirmations === "number") {
|
||||||
|
confirmations = value.confirmations;
|
||||||
|
} else {
|
||||||
|
confirmations = "max";
|
||||||
|
}
|
||||||
|
|
||||||
if ("Ok" in value.status) {
|
if ("Ok" in value.status) {
|
||||||
status = Status.Success;
|
status = Status.Success;
|
||||||
} else {
|
} else {
|
||||||
|
@ -173,7 +206,7 @@ export async function checkTransactionStatus(
|
||||||
console.error("Failed to check transaction status", error);
|
console.error("Failed to check transaction status", error);
|
||||||
status = Status.CheckFailed;
|
status = Status.CheckFailed;
|
||||||
}
|
}
|
||||||
dispatch({ type: ActionType.UpdateStatus, status, slot, id });
|
dispatch({ type: ActionType.UpdateStatus, status, slot, confirmations, id });
|
||||||
}
|
}
|
||||||
|
|
||||||
export function useTransactions() {
|
export function useTransactions() {
|
||||||
|
|
Loading…
Reference in New Issue