bridge_ui: solana tps warning
This commit is contained in:
parent
9fdda91368
commit
c2a879ec7c
|
@ -1,10 +1,11 @@
|
||||||
import { CHAIN_ID_TERRA } from "@certusone/wormhole-sdk";
|
import { CHAIN_ID_SOLANA, CHAIN_ID_TERRA } from "@certusone/wormhole-sdk";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { useHandleNFTRedeem } from "../../hooks/useHandleNFTRedeem";
|
import { useHandleNFTRedeem } from "../../hooks/useHandleNFTRedeem";
|
||||||
import useIsWalletReady from "../../hooks/useIsWalletReady";
|
import useIsWalletReady from "../../hooks/useIsWalletReady";
|
||||||
import { selectNFTTargetChain } from "../../store/selectors";
|
import { selectNFTTargetChain } from "../../store/selectors";
|
||||||
import ButtonWithLoader from "../ButtonWithLoader";
|
import ButtonWithLoader from "../ButtonWithLoader";
|
||||||
import KeyAndBalance from "../KeyAndBalance";
|
import KeyAndBalance from "../KeyAndBalance";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
||||||
import WaitingForWalletMessage from "./WaitingForWalletMessage";
|
import WaitingForWalletMessage from "./WaitingForWalletMessage";
|
||||||
|
@ -20,6 +21,7 @@ function Redeem() {
|
||||||
{targetChain === CHAIN_ID_TERRA && (
|
{targetChain === CHAIN_ID_TERRA && (
|
||||||
<TerraFeeDenomPicker disabled={disabled} />
|
<TerraFeeDenomPicker disabled={disabled} />
|
||||||
)}
|
)}
|
||||||
|
{targetChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
<ButtonWithLoader
|
<ButtonWithLoader
|
||||||
disabled={!isReady || disabled}
|
disabled={!isReady || disabled}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { CHAIN_ID_TERRA } from "@certusone/wormhole-sdk";
|
import { CHAIN_ID_SOLANA, CHAIN_ID_TERRA } from "@certusone/wormhole-sdk";
|
||||||
import { Alert } from "@material-ui/lab";
|
import { Alert } from "@material-ui/lab";
|
||||||
import { useSelector } from "react-redux";
|
import { useSelector } from "react-redux";
|
||||||
import { useHandleNFTTransfer } from "../../hooks/useHandleNFTTransfer";
|
import { useHandleNFTTransfer } from "../../hooks/useHandleNFTTransfer";
|
||||||
|
@ -14,6 +14,7 @@ import { CHAINS_BY_ID } from "../../utils/consts";
|
||||||
import ButtonWithLoader from "../ButtonWithLoader";
|
import ButtonWithLoader from "../ButtonWithLoader";
|
||||||
import KeyAndBalance from "../KeyAndBalance";
|
import KeyAndBalance from "../KeyAndBalance";
|
||||||
import ShowTx from "../ShowTx";
|
import ShowTx from "../ShowTx";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
||||||
import TransactionProgress from "../TransactionProgress";
|
import TransactionProgress from "../TransactionProgress";
|
||||||
|
@ -52,6 +53,7 @@ function Send() {
|
||||||
completing Step 4, you will have to perform the recovery workflow to
|
completing Step 4, you will have to perform the recovery workflow to
|
||||||
complete the transfer.
|
complete the transfer.
|
||||||
</Alert>
|
</Alert>
|
||||||
|
{sourceChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
<ButtonWithLoader
|
<ButtonWithLoader
|
||||||
disabled={isDisabled}
|
disabled={isDisabled}
|
||||||
onClick={handleClick}
|
onClick={handleClick}
|
||||||
|
|
|
@ -19,6 +19,7 @@ import ButtonWithLoader from "../ButtonWithLoader";
|
||||||
import ChainSelect from "../ChainSelect";
|
import ChainSelect from "../ChainSelect";
|
||||||
import KeyAndBalance from "../KeyAndBalance";
|
import KeyAndBalance from "../KeyAndBalance";
|
||||||
import LowBalanceWarning from "../LowBalanceWarning";
|
import LowBalanceWarning from "../LowBalanceWarning";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
import { TokenSelector } from "../TokenSelectors/SourceTokenSelector";
|
import { TokenSelector } from "../TokenSelectors/SourceTokenSelector";
|
||||||
|
|
||||||
|
@ -91,6 +92,7 @@ function Source() {
|
||||||
</div>
|
</div>
|
||||||
) : null}
|
) : null}
|
||||||
<LowBalanceWarning chainId={sourceChain} />
|
<LowBalanceWarning chainId={sourceChain} />
|
||||||
|
{sourceChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
<ButtonWithLoader
|
<ButtonWithLoader
|
||||||
disabled={!isSourceComplete}
|
disabled={!isSourceComplete}
|
||||||
onClick={handleNextClick}
|
onClick={handleNextClick}
|
||||||
|
|
|
@ -31,6 +31,7 @@ import ButtonWithLoader from "../ButtonWithLoader";
|
||||||
import ChainSelect from "../ChainSelect";
|
import ChainSelect from "../ChainSelect";
|
||||||
import KeyAndBalance from "../KeyAndBalance";
|
import KeyAndBalance from "../KeyAndBalance";
|
||||||
import LowBalanceWarning from "../LowBalanceWarning";
|
import LowBalanceWarning from "../LowBalanceWarning";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
|
|
||||||
const useStyles = makeStyles((theme) => ({
|
const useStyles = makeStyles((theme) => ({
|
||||||
|
@ -136,6 +137,7 @@ function Target() {
|
||||||
)}
|
)}
|
||||||
</Alert>
|
</Alert>
|
||||||
<LowBalanceWarning chainId={targetChain} />
|
<LowBalanceWarning chainId={targetChain} />
|
||||||
|
{targetChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
<ButtonWithLoader
|
<ButtonWithLoader
|
||||||
disabled={!isTargetComplete} //|| !associatedAccountExists}
|
disabled={!isTargetComplete} //|| !associatedAccountExists}
|
||||||
onClick={handleNextClick}
|
onClick={handleNextClick}
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
import { makeStyles } from "@material-ui/core";
|
||||||
|
import { Alert } from "@material-ui/lab";
|
||||||
|
import { Connection } from "@solana/web3.js";
|
||||||
|
import numeral from "numeral";
|
||||||
|
import { useEffect, useState } from "react";
|
||||||
|
import { SOLANA_HOST } from "../utils/consts";
|
||||||
|
|
||||||
|
const useStyles = makeStyles((theme) => ({
|
||||||
|
alert: {
|
||||||
|
marginTop: theme.spacing(1),
|
||||||
|
marginBottom: theme.spacing(1),
|
||||||
|
},
|
||||||
|
}));
|
||||||
|
|
||||||
|
export default function SolanaTPSWarning() {
|
||||||
|
const classes = useStyles();
|
||||||
|
const [tps, setTps] = useState<number | null>(null);
|
||||||
|
useEffect(() => {
|
||||||
|
let cancelled = false;
|
||||||
|
let interval = setInterval(() => {
|
||||||
|
(async () => {
|
||||||
|
try {
|
||||||
|
const connection = new Connection(SOLANA_HOST);
|
||||||
|
const samples = await connection.getRecentPerformanceSamples(1);
|
||||||
|
if (samples.length >= 1) {
|
||||||
|
let short = samples
|
||||||
|
.filter((sample) => sample.numTransactions !== 0)
|
||||||
|
.map(
|
||||||
|
(sample) => sample.numTransactions / sample.samplePeriodSecs
|
||||||
|
);
|
||||||
|
const avgTps = short[0];
|
||||||
|
if (!cancelled) {
|
||||||
|
setTps(avgTps);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {}
|
||||||
|
})();
|
||||||
|
}, 5000);
|
||||||
|
return () => {
|
||||||
|
cancelled = true;
|
||||||
|
clearInterval(interval);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
return tps !== null && tps < 1500 ? (
|
||||||
|
<Alert
|
||||||
|
variant="outlined"
|
||||||
|
severity="warning"
|
||||||
|
className={classes.alert}
|
||||||
|
>{`WARNING! The Solana Transactions Per Second (TPS) is below 1500. This is a sign of network congestion. Proceed with caution as you may have difficulty submitting transactions and the guardians may have difficulty witnessing them (this could lead to processing delays). Current TPS: ${numeral(
|
||||||
|
tps
|
||||||
|
).format("0,0")}`}</Alert>
|
||||||
|
) : null;
|
||||||
|
}
|
|
@ -41,6 +41,7 @@ import ButtonWithLoader from "../ButtonWithLoader";
|
||||||
import KeyAndBalance from "../KeyAndBalance";
|
import KeyAndBalance from "../KeyAndBalance";
|
||||||
import SmartAddress from "../SmartAddress";
|
import SmartAddress from "../SmartAddress";
|
||||||
import { SolanaCreateAssociatedAddressAlternate } from "../SolanaCreateAssociatedAddress";
|
import { SolanaCreateAssociatedAddressAlternate } from "../SolanaCreateAssociatedAddress";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
||||||
import AddToMetamask from "./AddToMetamask";
|
import AddToMetamask from "./AddToMetamask";
|
||||||
|
@ -129,6 +130,7 @@ function Redeem() {
|
||||||
label="Automatically unwrap to native currency"
|
label="Automatically unwrap to native currency"
|
||||||
/>
|
/>
|
||||||
)}
|
)}
|
||||||
|
{targetChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
{targetChain === CHAIN_ID_SOLANA ? (
|
{targetChain === CHAIN_ID_SOLANA ? (
|
||||||
<SolanaCreateAssociatedAddressAlternate />
|
<SolanaCreateAssociatedAddressAlternate />
|
||||||
) : null}
|
) : null}
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
import { CHAIN_ID_TERRA, isEVMChain } from "@certusone/wormhole-sdk";
|
import {
|
||||||
|
CHAIN_ID_SOLANA,
|
||||||
|
CHAIN_ID_TERRA,
|
||||||
|
isEVMChain,
|
||||||
|
} from "@certusone/wormhole-sdk";
|
||||||
import { Checkbox, FormControlLabel } from "@material-ui/core";
|
import { Checkbox, FormControlLabel } from "@material-ui/core";
|
||||||
import { Alert } from "@material-ui/lab";
|
import { Alert } from "@material-ui/lab";
|
||||||
import { ethers } from "ethers";
|
import { ethers } from "ethers";
|
||||||
|
@ -22,6 +26,7 @@ import { CHAINS_BY_ID } from "../../utils/consts";
|
||||||
import ButtonWithLoader from "../ButtonWithLoader";
|
import ButtonWithLoader from "../ButtonWithLoader";
|
||||||
import KeyAndBalance from "../KeyAndBalance";
|
import KeyAndBalance from "../KeyAndBalance";
|
||||||
import ShowTx from "../ShowTx";
|
import ShowTx from "../ShowTx";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
import TerraFeeDenomPicker from "../TerraFeeDenomPicker";
|
||||||
import TransactionProgress from "../TransactionProgress";
|
import TransactionProgress from "../TransactionProgress";
|
||||||
|
@ -140,6 +145,7 @@ function Send() {
|
||||||
completing Step 4, you will have to perform the recovery workflow to
|
completing Step 4, you will have to perform the recovery workflow to
|
||||||
complete the transfer.
|
complete the transfer.
|
||||||
</Alert>
|
</Alert>
|
||||||
|
{sourceChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
{approveButtonNeeded ? (
|
{approveButtonNeeded ? (
|
||||||
<>
|
<>
|
||||||
<FormControlLabel
|
<FormControlLabel
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { isEVMChain } from "@certusone/wormhole-sdk";
|
import { CHAIN_ID_SOLANA, isEVMChain } from "@certusone/wormhole-sdk";
|
||||||
import {
|
import {
|
||||||
Button,
|
Button,
|
||||||
Dialog,
|
Dialog,
|
||||||
|
@ -17,6 +17,7 @@ import {
|
||||||
} from "../../store/selectors";
|
} from "../../store/selectors";
|
||||||
import { CHAINS_BY_ID, MULTI_CHAIN_TOKENS } from "../../utils/consts";
|
import { CHAINS_BY_ID, MULTI_CHAIN_TOKENS } from "../../utils/consts";
|
||||||
import SmartAddress from "../SmartAddress";
|
import SmartAddress from "../SmartAddress";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import { useTargetInfo } from "./Target";
|
import { useTargetInfo } from "./Target";
|
||||||
import TokenWarning from "./TokenWarning";
|
import TokenWarning from "./TokenWarning";
|
||||||
|
|
||||||
|
@ -124,6 +125,7 @@ function SendConfirmationContent({
|
||||||
targetAsset={targetAsset ?? undefined}
|
targetAsset={targetAsset ?? undefined}
|
||||||
targetChain={targetChain}
|
targetChain={targetChain}
|
||||||
/>
|
/>
|
||||||
|
{sourceChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
</DialogContent>
|
</DialogContent>
|
||||||
<DialogActions>
|
<DialogActions>
|
||||||
<Button variant="outlined" onClick={onClose}>
|
<Button variant="outlined" onClick={onClose}>
|
||||||
|
|
|
@ -39,6 +39,7 @@ import ChainSelectArrow from "../ChainSelectArrow";
|
||||||
import KeyAndBalance from "../KeyAndBalance";
|
import KeyAndBalance from "../KeyAndBalance";
|
||||||
import LowBalanceWarning from "../LowBalanceWarning";
|
import LowBalanceWarning from "../LowBalanceWarning";
|
||||||
import NumberTextField from "../NumberTextField";
|
import NumberTextField from "../NumberTextField";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
import { TokenSelector } from "../TokenSelectors/SourceTokenSelector";
|
import { TokenSelector } from "../TokenSelectors/SourceTokenSelector";
|
||||||
import SourceAssetWarning from "./SourceAssetWarning";
|
import SourceAssetWarning from "./SourceAssetWarning";
|
||||||
|
@ -210,6 +211,7 @@ function Source() {
|
||||||
) : (
|
) : (
|
||||||
<>
|
<>
|
||||||
<LowBalanceWarning chainId={sourceChain} />
|
<LowBalanceWarning chainId={sourceChain} />
|
||||||
|
{sourceChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
<SourceAssetWarning
|
<SourceAssetWarning
|
||||||
sourceChain={sourceChain}
|
sourceChain={sourceChain}
|
||||||
sourceAsset={parsedTokenAccount?.mintKey}
|
sourceAsset={parsedTokenAccount?.mintKey}
|
||||||
|
|
|
@ -35,6 +35,7 @@ import SmartAddress from "../SmartAddress";
|
||||||
import SolanaCreateAssociatedAddress, {
|
import SolanaCreateAssociatedAddress, {
|
||||||
useAssociatedAccountExistsState,
|
useAssociatedAccountExistsState,
|
||||||
} from "../SolanaCreateAssociatedAddress";
|
} from "../SolanaCreateAssociatedAddress";
|
||||||
|
import SolanaTPSWarning from "../SolanaTPSWarning";
|
||||||
import StepDescription from "../StepDescription";
|
import StepDescription from "../StepDescription";
|
||||||
import RegisterNowButton from "./RegisterNowButton";
|
import RegisterNowButton from "./RegisterNowButton";
|
||||||
|
|
||||||
|
@ -178,6 +179,7 @@ function Target() {
|
||||||
)}
|
)}
|
||||||
</Alert>
|
</Alert>
|
||||||
<LowBalanceWarning chainId={targetChain} />
|
<LowBalanceWarning chainId={targetChain} />
|
||||||
|
{targetChain === CHAIN_ID_SOLANA && <SolanaTPSWarning />}
|
||||||
<ButtonWithLoader
|
<ButtonWithLoader
|
||||||
disabled={!isTargetComplete || !associatedAccountExists}
|
disabled={!isTargetComplete || !associatedAccountExists}
|
||||||
onClick={handleNextClick}
|
onClick={handleNextClick}
|
||||||
|
|
Loading…
Reference in New Issue