diff --git a/explorer/package-lock.json b/explorer/package-lock.json index c5ee1946d9840a..251a8dc950c70d 100644 --- a/explorer/package-lock.json +++ b/explorer/package-lock.json @@ -1269,9 +1269,9 @@ "integrity": "sha512-DetpxZw1fzPD5xUBrIAoplLChO2VB8DlL5Gg+I1IR9b2wPqYIca2WSUxL5g1vLeR4MsQq1NeWriXAVffV+U1Fw==" }, "@solana/web3.js": { - "version": "0.55.0", - "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-0.55.0.tgz", - "integrity": "sha512-1VfcfeI8nNJSlFA8ZZpyoaZHeftyvmBfE9dRyPtqsZszPfbtyA6NeOvydRBaSSU7XDC7hQZnKP4QFIf6uef8Mw==", + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-0.56.0.tgz", + "integrity": "sha512-Vys4PY7wksHXLyMbjpTLJGMSs58zRGdDPaBmlxeTXfwjv27W5xcjanuC+sNQ8CaeKjUy9Rd0ptU2qSjBHp/rNw==", "requires": { "@babel/runtime": "^7.3.1", "bn.js": "^5.0.0", diff --git a/explorer/package.json b/explorer/package.json index c42e4e82fcb040..452ff7974a6ce4 100644 --- a/explorer/package.json +++ b/explorer/package.json @@ -3,7 +3,7 @@ "version": "0.1.0", "private": true, "dependencies": { - "@solana/web3.js": "^0.55.0", + "@solana/web3.js": "^0.56.0", "@testing-library/jest-dom": "^4.2.4", "@testing-library/react": "^9.3.2", "@testing-library/user-event": "^7.1.2", diff --git a/explorer/src/components/TransactionDetails.tsx b/explorer/src/components/TransactionDetails.tsx index 0844bce8d64aa7..3daf01679a7a5a 100644 --- a/explorer/src/components/TransactionDetails.tsx +++ b/explorer/src/components/TransactionDetails.tsx @@ -101,12 +101,22 @@ function StatusCard({ signature }: Props) { const status = useTransactionStatus(signature); const refresh = useFetchTransactionStatus(); const details = useTransactionDetails(signature); + const { firstAvailableBlock } = useCluster(); if (!status || status.fetchStatus === FetchStatus.Fetching) { return ; } else if (status?.fetchStatus === FetchStatus.FetchFailed) { return refresh(signature)} text="Fetch Failed" />; } else if (!status.info) { + if (firstAvailableBlock !== undefined) { + return ( + refresh(signature)} + text="Not Found" + subtext={`Note: Transactions processed before block ${firstAvailableBlock} are not available at this time`} + /> + ); + } return refresh(signature)} text="Not Found" />; } diff --git a/explorer/src/components/common/ErrorCard.tsx b/explorer/src/components/common/ErrorCard.tsx index faa91fb9aa27c1..bb788ff56cb2c9 100644 --- a/explorer/src/components/common/ErrorCard.tsx +++ b/explorer/src/components/common/ErrorCard.tsx @@ -3,11 +3,13 @@ import React from "react"; export default function ErrorCard({ retry, retryText, - text + text, + subtext }: { retry?: () => void; retryText?: string; text: string; + subtext?: string; }) { const buttonText = retryText || "Try Again"; return ( @@ -23,11 +25,16 @@ export default function ErrorCard({ {buttonText}
-
- + {buttonText}
+ {subtext && ( +
+
+ {subtext} +
+ )} )} diff --git a/explorer/src/providers/cluster.tsx b/explorer/src/providers/cluster.tsx index 6225ea292686f1..3ea32f0e2b39c5 100644 --- a/explorer/src/providers/cluster.tsx +++ b/explorer/src/providers/cluster.tsx @@ -58,6 +58,7 @@ export const DEFAULT_CUSTOM_URL = "http://localhost:8899"; interface State { cluster: Cluster; customUrl: string; + firstAvailableBlock?: number; status: ClusterStatus; } @@ -65,6 +66,7 @@ interface Action { status: ClusterStatus; cluster: Cluster; customUrl: string; + firstAvailableBlock?: number; } type Dispatch = (action: Action) => void; @@ -192,8 +194,13 @@ async function updateCluster( try { const connection = new Connection(clusterUrl(cluster, customUrl)); - await connection.getRecentBlockhash(); - dispatch({ status: ClusterStatus.Connected, cluster, customUrl }); + const firstAvailableBlock = await connection.getFirstAvailableBlock(); + dispatch({ + status: ClusterStatus.Connected, + cluster, + customUrl, + firstAvailableBlock + }); } catch (error) { console.error("Failed to update cluster", error); dispatch({ status: ClusterStatus.Failure, cluster, customUrl });