wormhole/bridge_ui/src/store/selectors.ts

108 lines
4.6 KiB
TypeScript

import { CHAIN_ID_ETH, CHAIN_ID_SOLANA } from "@certusone/wormhole-sdk";
import { ethers } from "ethers";
import { parseUnits } from "ethers/lib/utils";
import { RootState } from ".";
/*
* Attest
*/
export const selectAttestActiveStep = (state: RootState) =>
state.attest.activeStep;
export const selectAttestSourceChain = (state: RootState) =>
state.attest.sourceChain;
export const selectAttestSourceAsset = (state: RootState) =>
state.attest.sourceAsset;
export const selectAttestTargetChain = (state: RootState) =>
state.attest.targetChain;
export const selectAttestSignedVAAHex = (state: RootState) =>
state.attest.signedVAAHex;
export const selectAttestIsSending = (state: RootState) =>
state.attest.isSending;
export const selectAttestIsCreating = (state: RootState) =>
state.attest.isCreating;
// safety checks
// TODO: could make this return a string with a user informative message
export const selectAttestIsSourceComplete = (state: RootState) =>
!!state.attest.sourceChain && !!state.attest.sourceAsset;
// TODO: check wrapped asset exists or is native attest
export const selectAttestIsTargetComplete = (state: RootState) =>
selectAttestIsSourceComplete(state) && !!state.attest.targetChain;
export const selectAttestIsSendComplete = (state: RootState) =>
!!selectAttestSignedVAAHex(state);
export const selectAttestShouldLockFields = (state: RootState) =>
selectAttestIsSending(state) || selectAttestIsSendComplete(state);
/*
* Transfer
*/
export const selectTransferActiveStep = (state: RootState) =>
state.transfer.activeStep;
export const selectTransferSourceChain = (state: RootState) =>
state.transfer.sourceChain;
export const selectTransferSourceAsset = (state: RootState) =>
state.transfer.sourceAsset;
export const selectTransferIsSourceAssetWormholeWrapped = (state: RootState) =>
state.transfer.isSourceAssetWormholeWrapped;
export const selectTransferOriginChain = (state: RootState) =>
state.transfer.originChain;
export const selectTransferOriginAsset = (state: RootState) =>
state.transfer.originAsset;
export const selectTransferSourceParsedTokenAccount = (state: RootState) =>
state.transfer.sourceParsedTokenAccount;
export const selectTransferSourceBalanceString = (state: RootState) =>
state.transfer.sourceParsedTokenAccount?.uiAmountString || "";
export const selectTransferAmount = (state: RootState) => state.transfer.amount;
export const selectTransferTargetChain = (state: RootState) =>
state.transfer.targetChain;
export const selectTransferTargetAsset = (state: RootState) =>
state.transfer.targetAsset;
export const selectTransferTargetParsedTokenAccount = (state: RootState) =>
state.transfer.targetParsedTokenAccount;
export const selectTransferTargetBalanceString = (state: RootState) =>
state.transfer.targetParsedTokenAccount?.uiAmountString || "";
export const selectTransferSignedVAAHex = (state: RootState) =>
state.transfer.signedVAAHex;
export const selectTransferIsSending = (state: RootState) =>
state.transfer.isSending;
export const selectTransferIsRedeeming = (state: RootState) =>
state.transfer.isRedeeming;
// safety checks
// TODO: could make this return a string with a user informative message
export const selectTransferIsSourceComplete = (state: RootState) =>
!!state.transfer.sourceChain &&
!!state.transfer.sourceAsset &&
!!state.transfer.sourceParsedTokenAccount &&
!!state.transfer.amount &&
(state.transfer.sourceChain !== CHAIN_ID_SOLANA ||
!!state.transfer.sourceParsedTokenAccount.publicKey) &&
!!state.transfer.sourceParsedTokenAccount.uiAmountString &&
// TODO: make safe with too many decimals
parseUnits(
state.transfer.amount,
state.transfer.sourceParsedTokenAccount.decimals
).lte(
parseUnits(
state.transfer.sourceParsedTokenAccount.uiAmountString,
state.transfer.sourceParsedTokenAccount.decimals
)
);
// TODO: check wrapped asset exists or is native transfer
export const selectTransferIsTargetComplete = (state: RootState) =>
selectTransferIsSourceComplete(state) &&
!!state.transfer.targetChain &&
!!state.transfer.targetAsset &&
(state.transfer.targetChain !== CHAIN_ID_ETH ||
state.transfer.targetAsset !== ethers.constants.AddressZero); //&&
// Associated Token Account exists
// (state.transfer.targetChain !== CHAIN_ID_SOLANA ||
// (!!state.transfer.targetParsedTokenAccount &&
// !!state.transfer.targetParsedTokenAccount.publicKey));
export const selectTransferIsSendComplete = (state: RootState) =>
!!selectTransferSignedVAAHex(state);
export const selectTransferShouldLockFields = (state: RootState) =>
selectTransferIsSending(state) || selectTransferIsSendComplete(state);