4ed623c84c
* feat: update connect dialog to handle api v2 * feat: better error handling * feat: update to only use strings for pubkey, add json rpc connector * feat: make json connector follow same patterns as rest connector * feat: add ability to change wallet location * feat: add chain id fetch * feat: improve types * feat: adjust send tx types * chore: remove dialog title and chain check temporarily * feat: additional UI and error handling * feat: rename keypair and keypairs to pubKey and pubKeys * feat: make rest and json rpc connectors return consistent data * feat: rename derived ids more clearly * feat: update send_transaction response type * chore: fix tests after context name change * feat: add utils for wallet, add encode tx func * feat: return null if tx is rejected * feat: fix up styles for connect buttons * feat: handle wallet version check * feat: add chain id check * chore: rename select pub key function to match, fix tests * fix: tests for rest connector form * feat: add tests for json rpc flow * feat: connect dialog changes * chore: change status to enum to avoid magic strings * feat: add custom icons and handle provided key name * chore: update global wallet connection e2d tests * chore: change zod validation to only expected required values * chore: ignore new generated code files * chore: fix typos and add translations * chore: set hosted wallet via env var and only show if not mainnet * feat: add functionality for try again button * test: fix failing tests * chore: fix lint and test * chore: remove double import * chore: make console-lite-e2e strict so json connector compiles correctly * chore: make token e2e tsconfig strict * chore: make stats-e2e tsconfig strict * feat: update json rpc request namespace * feat: simplify connector setup, support try again * chore: remove comment * fix: build errors * chore: make chainId check optional based on presence of appChainId, mock request for tests * chore: mock chain id request for all apps on all pages * fix: footer border on small screens * fix: use beforeEach for chainId query mock * chore: remove optional chain check, prevent rendering until fetch is complete * chore: update NX_VEGA_WALLET_URLs as the application now appends the base path, adjust token tests * fix: token e2e test that checks for pubkey name * chore: remove duplicated test, update wallet title assertion * fix: token tests * fix: token e2e assertions * fix: withdraw test * feat: enable json RPC for token * fix: sendTx command now accpets pubkey as separate arg * fix: test to use gui option temporarily Co-authored-by: Dexter <dexter.edwards93@gmail.com>
160 lines
4.4 KiB
TypeScript
160 lines
4.4 KiB
TypeScript
import * as Sentry from '@sentry/react';
|
|
import { toBigNum } from '@vegaprotocol/react-helpers';
|
|
import { Splash } from '@vegaprotocol/ui-toolkit';
|
|
import { useVegaWallet, useEagerConnect } from '@vegaprotocol/wallet';
|
|
import { useEnvironment } from '@vegaprotocol/environment';
|
|
import { useWeb3React } from '@web3-react/core';
|
|
import React from 'react';
|
|
import { useTranslation } from 'react-i18next';
|
|
|
|
import { SplashError } from './components/splash-error';
|
|
import { SplashLoader } from './components/splash-loader';
|
|
import { Flags } from './config';
|
|
import {
|
|
AppStateActionType,
|
|
useAppState,
|
|
} from './contexts/app-state/app-state-context';
|
|
import { useContracts } from './contexts/contracts/contracts-context';
|
|
import { useRefreshAssociatedBalances } from './hooks/use-refresh-associated-balances';
|
|
import { Connectors } from './lib/vega-connectors';
|
|
|
|
export const AppLoader = ({ children }: { children: React.ReactElement }) => {
|
|
const { t } = useTranslation();
|
|
const { account } = useWeb3React();
|
|
const { VEGA_URL } = useEnvironment();
|
|
const { pubKey } = useVegaWallet();
|
|
const { appDispatch } = useAppState();
|
|
const { token, staking, vesting } = useContracts();
|
|
const setAssociatedBalances = useRefreshAssociatedBalances();
|
|
const [balancesLoaded, setBalancesLoaded] = React.useState(false);
|
|
const vegaConnecting = useEagerConnect(Connectors);
|
|
|
|
const loaded = balancesLoaded && !vegaConnecting;
|
|
|
|
React.useEffect(() => {
|
|
const run = async () => {
|
|
try {
|
|
const [
|
|
supply,
|
|
totalAssociatedWallet,
|
|
totalAssociatedVesting,
|
|
decimals,
|
|
] = await Promise.all([
|
|
token.totalSupply(),
|
|
staking.total_staked(),
|
|
vesting.total_staked(),
|
|
token.decimals(),
|
|
]);
|
|
|
|
const totalSupply = toBigNum(supply, decimals);
|
|
const totalWallet = toBigNum(totalAssociatedWallet, decimals);
|
|
const totalVesting = toBigNum(totalAssociatedVesting, decimals);
|
|
|
|
appDispatch({
|
|
type: AppStateActionType.SET_TOKEN,
|
|
decimals,
|
|
totalSupply,
|
|
totalAssociated: totalWallet.plus(totalVesting),
|
|
});
|
|
setBalancesLoaded(true);
|
|
} catch (err) {
|
|
Sentry.captureException(err);
|
|
}
|
|
};
|
|
|
|
if (!Flags.NETWORK_DOWN) {
|
|
run();
|
|
}
|
|
}, [token, appDispatch, staking, vesting]);
|
|
|
|
React.useEffect(() => {
|
|
if (account && pubKey) {
|
|
setAssociatedBalances(account, pubKey);
|
|
}
|
|
}, [setAssociatedBalances, account, pubKey]);
|
|
|
|
React.useEffect(() => {
|
|
const networkLimitsEndpoint = new URL('/network/limits', VEGA_URL).href;
|
|
const statsEndpoint = new URL('/statistics', VEGA_URL).href;
|
|
|
|
// eslint-disable-next-line
|
|
let interval: any = null;
|
|
|
|
const getNetworkLimits = async () => {
|
|
try {
|
|
const [networkLimits, stats] = await Promise.all([
|
|
fetch(networkLimitsEndpoint).then((res) => res.json()),
|
|
fetch(statsEndpoint).then((res) => res.json()),
|
|
]);
|
|
|
|
const restoreBlock = Number(
|
|
networkLimits.networkLimits.bootstrapBlockCount
|
|
);
|
|
const currentBlock = Number(stats.statistics.blockHeight);
|
|
|
|
if (currentBlock <= restoreBlock) {
|
|
appDispatch({
|
|
type: AppStateActionType.SET_BANNER_MESSAGE,
|
|
message: t('networkRestoring', {
|
|
bootstrapBlockCount: restoreBlock,
|
|
}),
|
|
});
|
|
|
|
if (!interval) {
|
|
startPoll();
|
|
}
|
|
} else {
|
|
appDispatch({
|
|
type: AppStateActionType.SET_BANNER_MESSAGE,
|
|
message: '',
|
|
});
|
|
|
|
if (interval) {
|
|
stopPoll();
|
|
}
|
|
}
|
|
} catch (err) {
|
|
Sentry.captureException(err);
|
|
}
|
|
};
|
|
|
|
const stopPoll = () => {
|
|
clearInterval(interval);
|
|
interval = null;
|
|
};
|
|
|
|
const startPoll = () => {
|
|
interval = setInterval(() => {
|
|
getNetworkLimits();
|
|
}, 10000);
|
|
};
|
|
|
|
// Only begin polling if network limits flag is set, as this is a new API not yet on mainnet 7/3/22
|
|
if (Flags.NETWORK_LIMITS) {
|
|
getNetworkLimits();
|
|
}
|
|
|
|
return () => {
|
|
stopPoll();
|
|
};
|
|
}, [appDispatch, VEGA_URL, t]);
|
|
|
|
if (Flags.NETWORK_DOWN) {
|
|
return (
|
|
<Splash>
|
|
<SplashError />
|
|
</Splash>
|
|
);
|
|
}
|
|
|
|
if (!loaded) {
|
|
return (
|
|
<Splash>
|
|
<SplashLoader />
|
|
</Splash>
|
|
);
|
|
}
|
|
|
|
return children;
|
|
};
|