From 561b6accc880fb9d37afe2fd0f2f1d433dce40f1 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Tue, 11 Jul 2023 11:06:00 -0300 Subject: [PATCH 01/17] add terra classic warning message --- src/config.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/config.ts b/src/config.ts index 6c8ce2d2e..faa3b524e 100644 --- a/src/config.ts +++ b/src/config.ts @@ -1,4 +1,4 @@ -import { ChainId } from "@certusone/wormhole-sdk"; +import { CHAIN_ID_TERRA, ChainId } from "@certusone/wormhole-sdk"; import { CHAIN_ID_AURORA } from "@certusone/wormhole-sdk"; export type DisableTransfers = boolean | "to" | "from"; @@ -27,4 +27,10 @@ export const CHAIN_CONFIG_MAP: ChainConfigMap = { text: "As a precautionary measure, Wormhole Network and Portal have paused Aurora support temporarily.", }, } as ChainConfig, + [CHAIN_ID_TERRA]: { + disableTransfers: false, + warningMessage: { + text: "Currently bridging native Terra classic tokens from or to Terra classic is not working, be carefull bridging.", + } + } }; From 36361819104c1b2602d5c192a0908d7aa4b5d71c Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Tue, 11 Jul 2023 22:24:41 -0300 Subject: [PATCH 02/17] setup transfer control engine to centrlize warning messages --- src/TransferRules.ts | 60 ++++++++++++++++++++++++ src/components/ChainWarningMessage.tsx | 29 +++++------- src/components/NFT/Source.tsx | 17 ++++--- src/components/NFT/Target.tsx | 11 +++-- src/components/Transfer/Source.tsx | 65 +++++++------------------- src/config.ts | 36 -------------- src/hooks/useRoundTripTransfer.ts | 32 +++++++++++++ src/hooks/useTransferControl.ts | 60 ++++++++++++++++++++++++ src/utils/consts.ts | 13 ------ 9 files changed, 195 insertions(+), 128 deletions(-) create mode 100644 src/TransferRules.ts delete mode 100644 src/config.ts create mode 100644 src/hooks/useRoundTripTransfer.ts create mode 100644 src/hooks/useTransferControl.ts diff --git a/src/TransferRules.ts b/src/TransferRules.ts new file mode 100644 index 000000000..548fb88d1 --- /dev/null +++ b/src/TransferRules.ts @@ -0,0 +1,60 @@ +import { CHAIN_ID_BSC, CHAIN_ID_ETH, CHAIN_ID_TERRA, CHAIN_ID_AURORA, ChainId, getForeignAssetTerra, hexToUint8Array, tryNativeToHexString } from "@certusone/wormhole-sdk"; +import { PredicateArgs, Rule } from "./hooks/useTransferControl"; +import { terra } from "@certusone/wormhole-sdk" +import { LCDClient } from "@terra-money/terra.js"; +import { getTerraConfig, getTokenBridgeAddressForChain } from "./utils/consts"; + +const EthereumPandleAddress = '0X808507121B80C02388FAD14726482E061B8DA827'; +const BscPandleAddres = '0XB3ED0A426155B79B898849803E3B36552F7ED507'; + +const lcd = new LCDClient(getTerraConfig(CHAIN_ID_TERRA)); +const getTerraClassic = (originChain: ChainId, originAssetHex: string) => getForeignAssetTerra( + getTokenBridgeAddressForChain(CHAIN_ID_TERRA), + lcd, + originChain, + hexToUint8Array(tryNativeToHexString(originAssetHex, originChain)) + ); + +(async () => { + const info = await getTerraClassic(CHAIN_ID_ETH, '0xDeba6Ecc1865B217b1CaAbd16D7261d2a21b6046'); + console.log(info); +})() + +const isPandleFromEthereum = ( + sourceChain: number, + selectedTokenAddress: string | undefined +) => + sourceChain === CHAIN_ID_ETH && + selectedTokenAddress === EthereumPandleAddress; + +const isPandleFromBsc = ( + sourceChain: number, + selectedTokenAddress: string | undefined +) => + sourceChain === CHAIN_ID_BSC && selectedTokenAddress === BscPandleAddres; + +const PandleMessage = 'Pandle transfers are limited to Ethereum to BSC and BSC to Ethereum.'; +const AuroraMessage = 'As a precautionary measure, Wormhole Network and Portal have paused Aurora support temporarily.'; +const TerraClassicMessage = 'Transfers of native tokens to/from Terra Classic have been temporarily paused.'; + +const TransferRules: Rule[] = [ + { + id: 'pandle', + predicate: ({ source, token }: PredicateArgs) => isPandleFromEthereum(source, token?.toUpperCase()) || isPandleFromBsc(source, token?.toUpperCase()), + text: PandleMessage + }, + { + id: 'aurora', + predicate: ({ source, target }: PredicateArgs) => source === CHAIN_ID_AURORA || target === CHAIN_ID_AURORA, + text: AuroraMessage, + disableTransfer: true + }, + { + id: 'terra-classic-native', + predicate: ({ source, token }: PredicateArgs) => source === CHAIN_ID_TERRA && terra.isNativeDenom(token), + text: TerraClassicMessage, + disableTransfer: true + } +] + +export default TransferRules; \ No newline at end of file diff --git a/src/components/ChainWarningMessage.tsx b/src/components/ChainWarningMessage.tsx index 5700347e6..20567a2f9 100644 --- a/src/components/ChainWarningMessage.tsx +++ b/src/components/ChainWarningMessage.tsx @@ -1,8 +1,6 @@ -import { ChainId } from "@certusone/wormhole-sdk"; import { Link, makeStyles, Typography } from "@material-ui/core"; import { Alert } from "@material-ui/lab"; -import { useMemo } from "react"; -import { CHAIN_CONFIG_MAP } from "../config"; +import { WarningMessage } from "../hooks/useTransferControl"; const useStyles = makeStyles((theme) => ({ alert: { @@ -11,27 +9,22 @@ const useStyles = makeStyles((theme) => ({ }, })); -export default function ChainWarningMessage({ chainId }: { chainId: ChainId }) { - const classes = useStyles(); - - const warningMessage = useMemo(() => { - return CHAIN_CONFIG_MAP[chainId]?.warningMessage; - }, [chainId]); - - if (warningMessage === undefined) { - return null; - } +export interface ChainWarningProps { + message: WarningMessage; +} +export default function ChainWarningMessage({ message }: ChainWarningProps) { + const classes = useStyles(); return ( - {warningMessage.text} - {warningMessage.link ? ( + {message.text} + {message.link && ( - - {warningMessage.link.text} + + {message.link.text} - ) : null} + )} ); } diff --git a/src/components/NFT/Source.tsx b/src/components/NFT/Source.tsx index 85eccb260..2b3b109e5 100644 --- a/src/components/NFT/Source.tsx +++ b/src/components/NFT/Source.tsx @@ -2,7 +2,7 @@ import { CHAIN_ID_SOLANA, isEVMChain } from "@certusone/wormhole-sdk"; import { Button, makeStyles } from "@material-ui/core"; import { VerifiedUser } from "@material-ui/icons"; import { Alert } from "@material-ui/lab"; -import { useCallback, useMemo } from "react"; +import { useCallback } from "react"; import { useDispatch, useSelector } from "react-redux"; import { Link } from "react-router-dom"; import useIsWalletReady from "../../hooks/useIsWalletReady"; @@ -13,11 +13,11 @@ import { selectNFTSourceBalanceString, selectNFTSourceChain, selectNFTSourceError, + selectNFTTargetChain, } from "../../store/selectors"; import { CHAINS_WITH_NFT_SUPPORT, - CLUSTER, - getIsTransferDisabled, + CLUSTER } from "../../utils/consts"; import ButtonWithLoader from "../ButtonWithLoader"; import ChainSelect from "../ChainSelect"; @@ -27,6 +27,8 @@ import SolanaTPSWarning from "../SolanaTPSWarning"; import StepDescription from "../StepDescription"; import { TokenSelector } from "../TokenSelectors/SourceTokenSelector"; import ChainWarningMessage from "../ChainWarningMessage"; +import TransferRules from "../../TransferRules"; +import useTransferControl from "../../hooks/useTransferControl"; const useStyles = makeStyles((theme) => ({ transferField: { @@ -38,6 +40,7 @@ function Source() { const classes = useStyles(); const dispatch = useDispatch(); const sourceChain = useSelector(selectNFTSourceChain); + const targetChain = useSelector(selectNFTTargetChain); const uiAmountString = useSelector(selectNFTSourceBalanceString); const error = useSelector(selectNFTSourceError); const isSourceComplete = useSelector(selectNFTIsSourceComplete); @@ -52,9 +55,7 @@ function Source() { const handleNextClick = useCallback(() => { dispatch(incrementStep()); }, [dispatch]); - const isTransferDisabled = useMemo(() => { - return getIsTransferDisabled(sourceChain, true); - }, [sourceChain]); + const { isTransferDisabled, warnings } = useTransferControl(TransferRules, sourceChain, targetChain); return ( <> @@ -103,7 +104,9 @@ function Source() { {sourceChain === CHAIN_ID_SOLANA && CLUSTER === "mainnet" && ( )} - + { + warnings.map((message, key) => ) + } ({ transferField: { @@ -92,9 +93,7 @@ function Target() { const handleNextClick = useCallback(() => { dispatch(incrementStep()); }, [dispatch]); - const isTransferDisabled = useMemo(() => { - return getIsTransferDisabled(targetChain, false); - }, [targetChain]); + const { isTransferDisabled, warnings } = useTransferControl(TransferRules, sourceChain, targetChain); const isValidTargetAssetAddress = targetAsset && targetAsset !== ethers.constants.AddressZero; return ( @@ -152,7 +151,9 @@ function Target() { {targetChain === CHAIN_ID_SOLANA && CLUSTER === "mainnet" && ( )} - + { + warnings.map((message, key) => ) + } ({ chainSelectWrapper: { @@ -86,12 +87,6 @@ function Source() { () => CHAINS.filter((c) => c.id !== sourceChain), [sourceChain] ); - const isSourceTransferDisabled = useMemo(() => { - return getIsTransferDisabled(sourceChain, true); - }, [sourceChain]); - const isTargetTransferDisabled = useMemo(() => { - return getIsTransferDisabled(targetChain, false); - }, [targetChain]); const parsedTokenAccount = useSelector( selectTransferSourceParsedTokenAccount ); @@ -153,37 +148,13 @@ function Source() { dispatch(incrementStep()); }, [dispatch]); - /* Only allow sending from ETH <-> BSC Pandle Token */ - const [isPandle, setIsPandle] = useState(false); const selectedTokenAddress = useSelector( (state: RootState) => state.transfer.sourceParsedTokenAccount?.mintKey ); - useEffect(() => { - const EthereumPandleAddress = - "0x808507121b80c02388fad14726482e061b8da827".toUpperCase(); - const BscPandleAddres = - "0xb3Ed0A426155B79B898849803E3B36552f7ED507".toUpperCase(); - const isFromEthereum = ( - sourceChain: number, - selectedTokenAddress: string | undefined - ) => - sourceChain === CHAIN_ID_ETH && - selectedTokenAddress === EthereumPandleAddress; - const isFromBsc = ( - sourceChain: number, - selectedTokenAddress: string | undefined - ) => - sourceChain === CHAIN_ID_BSC && selectedTokenAddress === BscPandleAddres; - if (isFromEthereum(sourceChain, selectedTokenAddress?.toUpperCase())) { - setIsPandle(true); - handleTargetChange({ target: { value: CHAIN_ID_BSC } }); - } else if (isFromBsc(sourceChain, selectedTokenAddress?.toUpperCase())) { - setIsPandle(true); - handleTargetChange({ target: { value: CHAIN_ID_ETH } }); - } else { - setIsPandle(false); - } - }, [sourceChain, selectedTokenAddress, handleTargetChange]); + const { isTransferDisabled, warnings, ids } = useTransferControl(TransferRules, sourceChain, targetChain, selectedTokenAddress); + /* Only allow sending from ETH <-> BSC Pandle Token */ + const isPandle = (id: string) => id === 'pandle'; + const isRoundTripTransfer = useRoundTripTranfer(CHAIN_ID_ETH, CHAIN_ID_BSC, sourceChain,(chainId: number) => handleTargetChange({ target: { value: chainId } }), ids, isPandle); /* End pandle token check */ return ( @@ -237,7 +208,7 @@ function Source() { fullWidth value={targetChain} onChange={handleTargetChange} - disabled={shouldLockFields || isPandle} + disabled={shouldLockFields || isRoundTripTransfer} chains={targetChainOptions} /> @@ -260,7 +231,6 @@ function Source() { ) : ( <> - {isPandle && } {sourceChain === CHAIN_ID_SOLANA && CLUSTER === "mainnet" && ( )} @@ -276,7 +246,7 @@ function Source() { className={classes.transferField} value={amount} onChange={handleAmountChange} - disabled={shouldLockFields} + disabled={isTransferDisabled || shouldLockFields} onMaxClick={ uiAmountString && !parsedTokenAccount.isNativeAsset ? handleMaxClick @@ -284,18 +254,15 @@ function Source() { } /> ) : null} - - + { + warnings.map((message, key) => ) + } Next diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index faa3b524e..000000000 --- a/src/config.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { CHAIN_ID_TERRA, ChainId } from "@certusone/wormhole-sdk"; -import { CHAIN_ID_AURORA } from "@certusone/wormhole-sdk"; - -export type DisableTransfers = boolean | "to" | "from"; - -export interface WarningMessage { - text: string; - link?: { - url: string; - text: string; - }; -} - -export interface ChainConfig { - disableTransfers?: DisableTransfers; - warningMessage?: WarningMessage; -} - -export type ChainConfigMap = { - [key in ChainId]?: ChainConfig; -}; - -export const CHAIN_CONFIG_MAP: ChainConfigMap = { - [CHAIN_ID_AURORA]: { - disableTransfers: true, - warningMessage: { - text: "As a precautionary measure, Wormhole Network and Portal have paused Aurora support temporarily.", - }, - } as ChainConfig, - [CHAIN_ID_TERRA]: { - disableTransfers: false, - warningMessage: { - text: "Currently bridging native Terra classic tokens from or to Terra classic is not working, be carefull bridging.", - } - } -}; diff --git a/src/hooks/useRoundTripTransfer.ts b/src/hooks/useRoundTripTransfer.ts new file mode 100644 index 000000000..bdce42f79 --- /dev/null +++ b/src/hooks/useRoundTripTransfer.ts @@ -0,0 +1,32 @@ +import { ChainId } from "@certusone/wormhole-sdk"; +import { useEffect, useState } from "react"; + +const isSource= (sourceChain: ChainId, selectedSourceChain: ChainId) => sourceChain === selectedSourceChain; + +function useRoundTripTranfer( + source: ChainId, + target: ChainId, + selectedSourceChain: ChainId, + onRoundTripTransfer: (chainId: ChainId) => void = () => {}, + ids: string[] = [], + predicate: (id: string) => boolean = () => true +) { + const [isRoundTripTransfer, setIsRoundTripTransfer] = useState(false); + useEffect(() => { + const apply = ids.some(predicate) || predicate(''); + if (apply) { + if (isSource(source, selectedSourceChain)) { + onRoundTripTransfer(target); + } else if (isSource(target, selectedSourceChain)) { + onRoundTripTransfer(source); + } + setIsRoundTripTransfer(true); + } else { + setIsRoundTripTransfer(false); + } + }, [source, target, ids, predicate, onRoundTripTransfer, selectedSourceChain]); + + return isRoundTripTransfer; +} + +export default useRoundTripTranfer; \ No newline at end of file diff --git a/src/hooks/useTransferControl.ts b/src/hooks/useTransferControl.ts new file mode 100644 index 000000000..0178050c0 --- /dev/null +++ b/src/hooks/useTransferControl.ts @@ -0,0 +1,60 @@ +import { ChainId } from "@certusone/wormhole-sdk"; +import { useEffect, useState } from "react"; + +export type WarningMessage = { + text: string; + link?: { + url: string; + text: string; + }; +} + +export type PredicateArgs = { + source: ChainId, + target: ChainId, + token?: string +} + +export type Rule = WarningMessage & { + id?: string; + disableTransfer?: boolean; + predicate: (args: PredicateArgs) => boolean; +} + +/** + * Will calculate if a transfer is allowed or not + * by using 3 dimension: + * - sourceChain + * - targetChain + * - asset + * + * @param sourceChain Which chain is the transfer coming from + * @param targetChain + * @param assset + * @returns + */ +export function useTransferControl( + rules: Rule[], + sourceChain: ChainId, + targetChain: ChainId, + asset?: string +) { + const [ids, setIds] = useState([]); + const [isTransferDisabled, setIsTransferDisabled] = useState(false); + const [warnings, setWarnings] = useState([]); + useEffect(() => { + const appliedRules = rules.filter(rule => rule.predicate({ source: sourceChain, target: targetChain, token: asset })); + if (appliedRules.length > 0) { + setWarnings(appliedRules); + setIsTransferDisabled(appliedRules.some(rule => rule.disableTransfer)); + setIds(appliedRules.filter(rule => !!rule.id).map(rule => `${rule.id}`)); + } else { + setWarnings([]); + setIds([]); + setIsTransferDisabled(false); + } + }, [rules, sourceChain, targetChain, asset]); + return { warnings, ids, isTransferDisabled }; +} + +export default useTransferControl; \ No newline at end of file diff --git a/src/utils/consts.ts b/src/utils/consts.ts index a36943a0e..960ea03e3 100644 --- a/src/utils/consts.ts +++ b/src/utils/consts.ts @@ -37,7 +37,6 @@ import { } from "@certusone/wormhole-sdk"; import { clusterApiUrl } from "@solana/web3.js"; import { getAddress } from "ethers/lib/utils"; -import { CHAIN_CONFIG_MAP } from "../config"; import aptosIcon from "../icons/aptos.svg"; import acalaIcon from "../icons/acala.svg"; import algorandIcon from "../icons/algorand.svg"; @@ -1763,18 +1762,6 @@ export const ETH_POLYGON_WRAPPED_TOKENS = [ export const JUPITER_SWAP_BASE_URL = "https://jup.ag/swap"; -export const getIsTransferDisabled = ( - chainId: ChainId, - isSourceChain: boolean -) => { - const disableTransfers = CHAIN_CONFIG_MAP[chainId]?.disableTransfers; - return disableTransfers === "from" - ? isSourceChain - : disableTransfers === "to" - ? !isSourceChain - : !!disableTransfers; -}; - export const LUNA_ADDRESS = "uluna"; export const UST_ADDRESS = "uusd"; From 6b29fc202ebcada123a3333406c55c8eabdc9cb3 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Tue, 11 Jul 2023 22:26:19 -0300 Subject: [PATCH 03/17] run prettier --- src/TransferRules.ts | 107 +++++++++++++++++------------ src/components/NFT/Source.tsx | 17 ++--- src/components/NFT/Target.tsx | 12 ++-- src/components/Transfer/Source.tsx | 28 +++++--- src/hooks/useRoundTripTransfer.ts | 44 +++++++----- src/hooks/useTransferControl.ts | 80 +++++++++++---------- 6 files changed, 168 insertions(+), 120 deletions(-) diff --git a/src/TransferRules.ts b/src/TransferRules.ts index 548fb88d1..86bb086ba 100644 --- a/src/TransferRules.ts +++ b/src/TransferRules.ts @@ -1,60 +1,79 @@ -import { CHAIN_ID_BSC, CHAIN_ID_ETH, CHAIN_ID_TERRA, CHAIN_ID_AURORA, ChainId, getForeignAssetTerra, hexToUint8Array, tryNativeToHexString } from "@certusone/wormhole-sdk"; +import { + CHAIN_ID_BSC, + CHAIN_ID_ETH, + CHAIN_ID_TERRA, + CHAIN_ID_AURORA, + ChainId, + getForeignAssetTerra, + hexToUint8Array, + tryNativeToHexString, +} from "@certusone/wormhole-sdk"; import { PredicateArgs, Rule } from "./hooks/useTransferControl"; -import { terra } from "@certusone/wormhole-sdk" +import { terra } from "@certusone/wormhole-sdk"; import { LCDClient } from "@terra-money/terra.js"; import { getTerraConfig, getTokenBridgeAddressForChain } from "./utils/consts"; -const EthereumPandleAddress = '0X808507121B80C02388FAD14726482E061B8DA827'; -const BscPandleAddres = '0XB3ED0A426155B79B898849803E3B36552F7ED507'; +const EthereumPandleAddress = "0X808507121B80C02388FAD14726482E061B8DA827"; +const BscPandleAddres = "0XB3ED0A426155B79B898849803E3B36552F7ED507"; const lcd = new LCDClient(getTerraConfig(CHAIN_ID_TERRA)); -const getTerraClassic = (originChain: ChainId, originAssetHex: string) => getForeignAssetTerra( - getTokenBridgeAddressForChain(CHAIN_ID_TERRA), - lcd, - originChain, - hexToUint8Array(tryNativeToHexString(originAssetHex, originChain)) - ); +const getTerraClassic = (originChain: ChainId, originAssetHex: string) => + getForeignAssetTerra( + getTokenBridgeAddressForChain(CHAIN_ID_TERRA), + lcd, + originChain, + hexToUint8Array(tryNativeToHexString(originAssetHex, originChain)) + ); (async () => { - const info = await getTerraClassic(CHAIN_ID_ETH, '0xDeba6Ecc1865B217b1CaAbd16D7261d2a21b6046'); - console.log(info); -})() + const info = await getTerraClassic( + CHAIN_ID_ETH, + "0xDeba6Ecc1865B217b1CaAbd16D7261d2a21b6046" + ); + console.log(info); +})(); const isPandleFromEthereum = ( - sourceChain: number, - selectedTokenAddress: string | undefined + sourceChain: number, + selectedTokenAddress: string | undefined ) => - sourceChain === CHAIN_ID_ETH && - selectedTokenAddress === EthereumPandleAddress; + sourceChain === CHAIN_ID_ETH && + selectedTokenAddress === EthereumPandleAddress; const isPandleFromBsc = ( - sourceChain: number, - selectedTokenAddress: string | undefined -) => - sourceChain === CHAIN_ID_BSC && selectedTokenAddress === BscPandleAddres; + sourceChain: number, + selectedTokenAddress: string | undefined +) => sourceChain === CHAIN_ID_BSC && selectedTokenAddress === BscPandleAddres; -const PandleMessage = 'Pandle transfers are limited to Ethereum to BSC and BSC to Ethereum.'; -const AuroraMessage = 'As a precautionary measure, Wormhole Network and Portal have paused Aurora support temporarily.'; -const TerraClassicMessage = 'Transfers of native tokens to/from Terra Classic have been temporarily paused.'; +const PandleMessage = + "Pandle transfers are limited to Ethereum to BSC and BSC to Ethereum."; +const AuroraMessage = + "As a precautionary measure, Wormhole Network and Portal have paused Aurora support temporarily."; +const TerraClassicMessage = + "Transfers of native tokens to/from Terra Classic have been temporarily paused."; const TransferRules: Rule[] = [ - { - id: 'pandle', - predicate: ({ source, token }: PredicateArgs) => isPandleFromEthereum(source, token?.toUpperCase()) || isPandleFromBsc(source, token?.toUpperCase()), - text: PandleMessage - }, - { - id: 'aurora', - predicate: ({ source, target }: PredicateArgs) => source === CHAIN_ID_AURORA || target === CHAIN_ID_AURORA, - text: AuroraMessage, - disableTransfer: true - }, - { - id: 'terra-classic-native', - predicate: ({ source, token }: PredicateArgs) => source === CHAIN_ID_TERRA && terra.isNativeDenom(token), - text: TerraClassicMessage, - disableTransfer: true - } -] - -export default TransferRules; \ No newline at end of file + { + id: "pandle", + predicate: ({ source, token }: PredicateArgs) => + isPandleFromEthereum(source, token?.toUpperCase()) || + isPandleFromBsc(source, token?.toUpperCase()), + text: PandleMessage, + }, + { + id: "aurora", + predicate: ({ source, target }: PredicateArgs) => + source === CHAIN_ID_AURORA || target === CHAIN_ID_AURORA, + text: AuroraMessage, + disableTransfer: true, + }, + { + id: "terra-classic-native", + predicate: ({ source, token }: PredicateArgs) => + source === CHAIN_ID_TERRA && terra.isNativeDenom(token), + text: TerraClassicMessage, + disableTransfer: true, + }, +]; + +export default TransferRules; diff --git a/src/components/NFT/Source.tsx b/src/components/NFT/Source.tsx index 2b3b109e5..66af7bf94 100644 --- a/src/components/NFT/Source.tsx +++ b/src/components/NFT/Source.tsx @@ -15,10 +15,7 @@ import { selectNFTSourceError, selectNFTTargetChain, } from "../../store/selectors"; -import { - CHAINS_WITH_NFT_SUPPORT, - CLUSTER -} from "../../utils/consts"; +import { CHAINS_WITH_NFT_SUPPORT, CLUSTER } from "../../utils/consts"; import ButtonWithLoader from "../ButtonWithLoader"; import ChainSelect from "../ChainSelect"; import KeyAndBalance from "../KeyAndBalance"; @@ -55,7 +52,11 @@ function Source() { const handleNextClick = useCallback(() => { dispatch(incrementStep()); }, [dispatch]); - const { isTransferDisabled, warnings } = useTransferControl(TransferRules, sourceChain, targetChain); + const { isTransferDisabled, warnings } = useTransferControl( + TransferRules, + sourceChain, + targetChain + ); return ( <> @@ -104,9 +105,9 @@ function Source() { {sourceChain === CHAIN_ID_SOLANA && CLUSTER === "mainnet" && ( )} - { - warnings.map((message, key) => ) - } + {warnings.map((message, key) => ( + + ))} { dispatch(incrementStep()); }, [dispatch]); - const { isTransferDisabled, warnings } = useTransferControl(TransferRules, sourceChain, targetChain); + const { isTransferDisabled, warnings } = useTransferControl( + TransferRules, + sourceChain, + targetChain + ); const isValidTargetAssetAddress = targetAsset && targetAsset !== ethers.constants.AddressZero; return ( @@ -151,9 +155,9 @@ function Target() { {targetChain === CHAIN_ID_SOLANA && CLUSTER === "mainnet" && ( )} - { - warnings.map((message, key) => ) - } + {warnings.map((message, key) => ( + + ))} state.transfer.sourceParsedTokenAccount?.mintKey ); - const { isTransferDisabled, warnings, ids } = useTransferControl(TransferRules, sourceChain, targetChain, selectedTokenAddress); + const { isTransferDisabled, warnings, ids } = useTransferControl( + TransferRules, + sourceChain, + targetChain, + selectedTokenAddress + ); /* Only allow sending from ETH <-> BSC Pandle Token */ - const isPandle = (id: string) => id === 'pandle'; - const isRoundTripTransfer = useRoundTripTranfer(CHAIN_ID_ETH, CHAIN_ID_BSC, sourceChain,(chainId: number) => handleTargetChange({ target: { value: chainId } }), ids, isPandle); + const isPandle = (id: string) => id === "pandle"; + const isRoundTripTransfer = useRoundTripTranfer( + CHAIN_ID_ETH, + CHAIN_ID_BSC, + sourceChain, + (chainId: number) => handleTargetChange({ target: { value: chainId } }), + ids, + isPandle + ); /* End pandle token check */ return ( @@ -254,15 +266,15 @@ function Source() { } /> ) : null} - { - warnings.map((message, key) => ) - } + {warnings.map((message, key) => ( + + ))} Next diff --git a/src/hooks/useRoundTripTransfer.ts b/src/hooks/useRoundTripTransfer.ts index bdce42f79..34758e2aa 100644 --- a/src/hooks/useRoundTripTransfer.ts +++ b/src/hooks/useRoundTripTransfer.ts @@ -1,32 +1,40 @@ import { ChainId } from "@certusone/wormhole-sdk"; import { useEffect, useState } from "react"; -const isSource= (sourceChain: ChainId, selectedSourceChain: ChainId) => sourceChain === selectedSourceChain; +const isSource = (sourceChain: ChainId, selectedSourceChain: ChainId) => + sourceChain === selectedSourceChain; function useRoundTripTranfer( - source: ChainId, - target: ChainId, + source: ChainId, + target: ChainId, selectedSourceChain: ChainId, onRoundTripTransfer: (chainId: ChainId) => void = () => {}, ids: string[] = [], predicate: (id: string) => boolean = () => true ) { - const [isRoundTripTransfer, setIsRoundTripTransfer] = useState(false); - useEffect(() => { - const apply = ids.some(predicate) || predicate(''); - if (apply) { - if (isSource(source, selectedSourceChain)) { - onRoundTripTransfer(target); - } else if (isSource(target, selectedSourceChain)) { - onRoundTripTransfer(source); - } - setIsRoundTripTransfer(true); - } else { - setIsRoundTripTransfer(false); + const [isRoundTripTransfer, setIsRoundTripTransfer] = useState(false); + useEffect(() => { + const apply = ids.some(predicate) || predicate(""); + if (apply) { + if (isSource(source, selectedSourceChain)) { + onRoundTripTransfer(target); + } else if (isSource(target, selectedSourceChain)) { + onRoundTripTransfer(source); } - }, [source, target, ids, predicate, onRoundTripTransfer, selectedSourceChain]); + setIsRoundTripTransfer(true); + } else { + setIsRoundTripTransfer(false); + } + }, [ + source, + target, + ids, + predicate, + onRoundTripTransfer, + selectedSourceChain, + ]); - return isRoundTripTransfer; + return isRoundTripTransfer; } -export default useRoundTripTranfer; \ No newline at end of file +export default useRoundTripTranfer; diff --git a/src/hooks/useTransferControl.ts b/src/hooks/useTransferControl.ts index 0178050c0..10648af4d 100644 --- a/src/hooks/useTransferControl.ts +++ b/src/hooks/useTransferControl.ts @@ -2,24 +2,24 @@ import { ChainId } from "@certusone/wormhole-sdk"; import { useEffect, useState } from "react"; export type WarningMessage = { + text: string; + link?: { + url: string; text: string; - link?: { - url: string; - text: string; - }; -} + }; +}; export type PredicateArgs = { - source: ChainId, - target: ChainId, - token?: string -} + source: ChainId; + target: ChainId; + token?: string; +}; export type Rule = WarningMessage & { - id?: string; - disableTransfer?: boolean; - predicate: (args: PredicateArgs) => boolean; -} + id?: string; + disableTransfer?: boolean; + predicate: (args: PredicateArgs) => boolean; +}; /** * Will calculate if a transfer is allowed or not @@ -27,34 +27,38 @@ export type Rule = WarningMessage & { * - sourceChain * - targetChain * - asset - * + * * @param sourceChain Which chain is the transfer coming from - * @param targetChain - * @param assset - * @returns + * @param targetChain + * @param assset + * @returns */ export function useTransferControl( - rules: Rule[], - sourceChain: ChainId, - targetChain: ChainId, - asset?: string + rules: Rule[], + sourceChain: ChainId, + targetChain: ChainId, + asset?: string ) { - const [ids, setIds] = useState([]); - const [isTransferDisabled, setIsTransferDisabled] = useState(false); - const [warnings, setWarnings] = useState([]); - useEffect(() => { - const appliedRules = rules.filter(rule => rule.predicate({ source: sourceChain, target: targetChain, token: asset })); - if (appliedRules.length > 0) { - setWarnings(appliedRules); - setIsTransferDisabled(appliedRules.some(rule => rule.disableTransfer)); - setIds(appliedRules.filter(rule => !!rule.id).map(rule => `${rule.id}`)); - } else { - setWarnings([]); - setIds([]); - setIsTransferDisabled(false); - } - }, [rules, sourceChain, targetChain, asset]); - return { warnings, ids, isTransferDisabled }; + const [ids, setIds] = useState([]); + const [isTransferDisabled, setIsTransferDisabled] = useState(false); + const [warnings, setWarnings] = useState([]); + useEffect(() => { + const appliedRules = rules.filter((rule) => + rule.predicate({ source: sourceChain, target: targetChain, token: asset }) + ); + if (appliedRules.length > 0) { + setWarnings(appliedRules); + setIsTransferDisabled(appliedRules.some((rule) => rule.disableTransfer)); + setIds( + appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) + ); + } else { + setWarnings([]); + setIds([]); + setIsTransferDisabled(false); + } + }, [rules, sourceChain, targetChain, asset]); + return { warnings, ids, isTransferDisabled }; } -export default useTransferControl; \ No newline at end of file +export default useTransferControl; From 95696630f26686f27908832d13a3d9f3a5000bad Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Tue, 11 Jul 2023 22:30:36 -0300 Subject: [PATCH 04/17] fix typo --- src/components/Transfer/Source.tsx | 4 ++-- src/hooks/useRoundTripTransfer.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/components/Transfer/Source.tsx b/src/components/Transfer/Source.tsx index a1190e66f..548643941 100644 --- a/src/components/Transfer/Source.tsx +++ b/src/components/Transfer/Source.tsx @@ -51,7 +51,7 @@ import TransferLimitedWarning from "./TransferLimitedWarning"; import { RootState } from "../../store"; import useTransferControl from "../../hooks/useTransferControl"; import TransferRules from "../../TransferRules"; -import useRoundTripTranfer from "../../hooks/useRoundTripTransfer"; +import useRoundTripTransfer from "../../hooks/useRoundTripTransfer"; const useStyles = makeStyles((theme) => ({ chainSelectWrapper: { @@ -159,7 +159,7 @@ function Source() { ); /* Only allow sending from ETH <-> BSC Pandle Token */ const isPandle = (id: string) => id === "pandle"; - const isRoundTripTransfer = useRoundTripTranfer( + const isRoundTripTransfer = useRoundTripTransfer( CHAIN_ID_ETH, CHAIN_ID_BSC, sourceChain, diff --git a/src/hooks/useRoundTripTransfer.ts b/src/hooks/useRoundTripTransfer.ts index 34758e2aa..33e532bc6 100644 --- a/src/hooks/useRoundTripTransfer.ts +++ b/src/hooks/useRoundTripTransfer.ts @@ -4,7 +4,7 @@ import { useEffect, useState } from "react"; const isSource = (sourceChain: ChainId, selectedSourceChain: ChainId) => sourceChain === selectedSourceChain; -function useRoundTripTranfer( +function useRoundTripTransfer( source: ChainId, target: ChainId, selectedSourceChain: ChainId, @@ -37,4 +37,4 @@ function useRoundTripTranfer( return isRoundTripTransfer; } -export default useRoundTripTranfer; +export default useRoundTripTransfer; From ba011fc5e755ee668c1b4cf50a5cfc130ac7a555 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Tue, 11 Jul 2023 23:43:32 -0300 Subject: [PATCH 05/17] add warning and disable button on redeem step --- src/TransferRules.ts | 4 +-- src/components/Recovery.tsx | 3 +- src/components/Transfer/Redeem.tsx | 13 ++++++-- src/hooks/useRedeemControl.ts | 52 ++++++++++++++++++++++++++++++ 4 files changed, 66 insertions(+), 6 deletions(-) create mode 100644 src/hooks/useRedeemControl.ts diff --git a/src/TransferRules.ts b/src/TransferRules.ts index 86bb086ba..a8a822de3 100644 --- a/src/TransferRules.ts +++ b/src/TransferRules.ts @@ -69,8 +69,8 @@ const TransferRules: Rule[] = [ }, { id: "terra-classic-native", - predicate: ({ source, token }: PredicateArgs) => - source === CHAIN_ID_TERRA && terra.isNativeDenom(token), + predicate: ({ source, target, token }: PredicateArgs) => + (source === CHAIN_ID_TERRA || target === CHAIN_ID_TERRA) && terra.isNativeDenom(token), text: TerraClassicMessage, disableTransfer: true, }, diff --git a/src/components/Recovery.tsx b/src/components/Recovery.tsx index 127d86c23..47c7db691 100644 --- a/src/components/Recovery.tsx +++ b/src/components/Recovery.tsx @@ -36,6 +36,7 @@ import { uint8ArrayToHex, CHAIN_ID_SUI, getForeignAssetSui, + tryHexToNativeString, } from "@certusone/wormhole-sdk"; import { repairVaa } from "@certusone/wormhole-sdk/lib/esm/utils/repairVaa"; import { @@ -1133,7 +1134,7 @@ export default function Recovery() { parsedPayload.targetChain === CHAIN_ID_XPLA || parsedPayload.targetChain === CHAIN_ID_INJECTIVE ? tokenId - : hexToNativeAssetString( + : tryHexToNativeString( parsedPayload.originAddress, parsedPayload.originChain as ChainId ) || "" diff --git a/src/components/Transfer/Redeem.tsx b/src/components/Transfer/Redeem.tsx index d324a3ab6..c859dbf3f 100644 --- a/src/components/Transfer/Redeem.tsx +++ b/src/components/Transfer/Redeem.tsx @@ -66,6 +66,10 @@ import TerraFeeDenomPicker from "../TerraFeeDenomPicker"; import AddToMetamask from "./AddToMetamask"; import RedeemPreview from "./RedeemPreview"; import WaitingForWalletMessage from "./WaitingForWalletMessage"; +import ChainWarningMessage from "../ChainWarningMessage"; +import { useRedeemControl } from "../../hooks/useRedeemControl"; +import TransferRules from "../../TransferRules"; +import { RootState } from "../../store"; const useStyles = makeStyles((theme) => ({ alert: { @@ -179,7 +183,9 @@ function Redeem() { dispatch(reset()); }, [dispatch]); const howToAddTokensUrl = getHowToAddTokensToWalletUrl(targetChain); - + const vaaHex = useSelector((state: RootState) => state.transfer.signedVAAHex); + const sourceChain = useSelector((state: RootState) => state.transfer.sourceChain); + const { warnings, isTransferDisabled } = useRedeemControl(TransferRules, sourceChain, targetChain, vaaHex); const relayerContent = ( <> {isEVMChain(targetChain) && !isTransferCompleted && !targetIsAcala ? ( @@ -270,12 +276,13 @@ function Redeem() { {targetChain === CHAIN_ID_SOLANA ? ( ) : null} - + { warnings.map((message, key) => ())} <> {" "} Redeem diff --git a/src/hooks/useRedeemControl.ts b/src/hooks/useRedeemControl.ts new file mode 100644 index 000000000..10f9f96e5 --- /dev/null +++ b/src/hooks/useRedeemControl.ts @@ -0,0 +1,52 @@ +import { ChainId, ParsedVaa, parseTransferPayload, parseVaa, hexToUint8Array, tryHexToNativeString } from "@certusone/wormhole-sdk"; +import { Rule, WarningMessage } from "./useTransferControl"; +import { useEffect, useMemo, useState } from "react"; + +export function useRedeemControl( + rules: Rule[], + sourceChain: ChainId, + targetChain: ChainId, + rawVaa: string = '' +) { + const [ids, setIds] = useState([]); + const [isTransferDisabled, setIsTransferDisabled] = useState(false); + const [warnings, setWarnings] = useState([]); + const vaa: ParsedVaa | null = useMemo(() => { + try { + return parseVaa(hexToUint8Array(rawVaa)) + } catch (e) { + console.error(e); + } + return null; + }, [rawVaa]); + const payload = useMemo(() => { + try { + if (vaa) { + return parseTransferPayload( + Buffer.from(new Uint8Array(vaa?.payload)) + ) + } + } catch (e) { + console.error(e); + } + return null; + }, [vaa]); + const asset = useMemo(() => tryHexToNativeString(payload?.originAddress || '', payload?.originChain as ChainId), [payload]); + useEffect(() => { + const appliedRules = rules.filter((rule) => + rule.predicate({ source: sourceChain, target: targetChain, token: asset }) + ); + if (appliedRules.length > 0) { + setWarnings(appliedRules); + setIsTransferDisabled(appliedRules.some((rule) => rule.disableTransfer)); + setIds( + appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) + ); + } else { + setWarnings([]); + setIds([]); + setIsTransferDisabled(false); + } + }, [rules, sourceChain, targetChain, asset]); + return { warnings, ids, isTransferDisabled }; +} \ No newline at end of file From 8ea13feec3a7677daa314352d91b0b9d636957cf Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Tue, 11 Jul 2023 23:45:04 -0300 Subject: [PATCH 06/17] apply prettier format --- src/TransferRules.ts | 3 +- src/components/Transfer/Redeem.tsx | 20 ++++-- src/hooks/useRedeemControl.ts | 106 ++++++++++++++++------------- 3 files changed, 77 insertions(+), 52 deletions(-) diff --git a/src/TransferRules.ts b/src/TransferRules.ts index a8a822de3..3dab9cda1 100644 --- a/src/TransferRules.ts +++ b/src/TransferRules.ts @@ -70,7 +70,8 @@ const TransferRules: Rule[] = [ { id: "terra-classic-native", predicate: ({ source, target, token }: PredicateArgs) => - (source === CHAIN_ID_TERRA || target === CHAIN_ID_TERRA) && terra.isNativeDenom(token), + (source === CHAIN_ID_TERRA || target === CHAIN_ID_TERRA) && + terra.isNativeDenom(token), text: TerraClassicMessage, disableTransfer: true, }, diff --git a/src/components/Transfer/Redeem.tsx b/src/components/Transfer/Redeem.tsx index c859dbf3f..725cc3e4e 100644 --- a/src/components/Transfer/Redeem.tsx +++ b/src/components/Transfer/Redeem.tsx @@ -184,8 +184,15 @@ function Redeem() { }, [dispatch]); const howToAddTokensUrl = getHowToAddTokensToWalletUrl(targetChain); const vaaHex = useSelector((state: RootState) => state.transfer.signedVAAHex); - const sourceChain = useSelector((state: RootState) => state.transfer.sourceChain); - const { warnings, isTransferDisabled } = useRedeemControl(TransferRules, sourceChain, targetChain, vaaHex); + const sourceChain = useSelector( + (state: RootState) => state.transfer.sourceChain + ); + const { warnings, isTransferDisabled } = useRedeemControl( + TransferRules, + sourceChain, + targetChain, + vaaHex + ); const relayerContent = ( <> {isEVMChain(targetChain) && !isTransferCompleted && !targetIsAcala ? ( @@ -276,7 +283,9 @@ function Redeem() { {targetChain === CHAIN_ID_SOLANA ? ( ) : null} - { warnings.map((message, key) => ())} + {warnings.map((message, key) => ( + + ))} <> {" "} Redeem diff --git a/src/hooks/useRedeemControl.ts b/src/hooks/useRedeemControl.ts index 10f9f96e5..cc168f528 100644 --- a/src/hooks/useRedeemControl.ts +++ b/src/hooks/useRedeemControl.ts @@ -1,52 +1,64 @@ -import { ChainId, ParsedVaa, parseTransferPayload, parseVaa, hexToUint8Array, tryHexToNativeString } from "@certusone/wormhole-sdk"; +import { + ChainId, + ParsedVaa, + parseTransferPayload, + parseVaa, + hexToUint8Array, + tryHexToNativeString, +} from "@certusone/wormhole-sdk"; import { Rule, WarningMessage } from "./useTransferControl"; import { useEffect, useMemo, useState } from "react"; export function useRedeemControl( - rules: Rule[], - sourceChain: ChainId, - targetChain: ChainId, - rawVaa: string = '' + rules: Rule[], + sourceChain: ChainId, + targetChain: ChainId, + rawVaa: string = "" ) { - const [ids, setIds] = useState([]); - const [isTransferDisabled, setIsTransferDisabled] = useState(false); - const [warnings, setWarnings] = useState([]); - const vaa: ParsedVaa | null = useMemo(() => { - try { - return parseVaa(hexToUint8Array(rawVaa)) - } catch (e) { - console.error(e); - } - return null; - }, [rawVaa]); - const payload = useMemo(() => { - try { - if (vaa) { - return parseTransferPayload( - Buffer.from(new Uint8Array(vaa?.payload)) - ) - } - } catch (e) { - console.error(e); - } - return null; - }, [vaa]); - const asset = useMemo(() => tryHexToNativeString(payload?.originAddress || '', payload?.originChain as ChainId), [payload]); - useEffect(() => { - const appliedRules = rules.filter((rule) => - rule.predicate({ source: sourceChain, target: targetChain, token: asset }) - ); - if (appliedRules.length > 0) { - setWarnings(appliedRules); - setIsTransferDisabled(appliedRules.some((rule) => rule.disableTransfer)); - setIds( - appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) - ); - } else { - setWarnings([]); - setIds([]); - setIsTransferDisabled(false); - } - }, [rules, sourceChain, targetChain, asset]); - return { warnings, ids, isTransferDisabled }; -} \ No newline at end of file + const [ids, setIds] = useState([]); + const [isTransferDisabled, setIsTransferDisabled] = useState(false); + const [warnings, setWarnings] = useState([]); + const vaa: ParsedVaa | null = useMemo(() => { + try { + return parseVaa(hexToUint8Array(rawVaa)); + } catch (e) { + console.error(e); + } + return null; + }, [rawVaa]); + const payload = useMemo(() => { + try { + if (vaa) { + return parseTransferPayload(Buffer.from(new Uint8Array(vaa?.payload))); + } + } catch (e) { + console.error(e); + } + return null; + }, [vaa]); + const asset = useMemo( + () => + tryHexToNativeString( + payload?.originAddress || "", + payload?.originChain as ChainId + ), + [payload] + ); + useEffect(() => { + const appliedRules = rules.filter((rule) => + rule.predicate({ source: sourceChain, target: targetChain, token: asset }) + ); + if (appliedRules.length > 0) { + setWarnings(appliedRules); + setIsTransferDisabled(appliedRules.some((rule) => rule.disableTransfer)); + setIds( + appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) + ); + } else { + setWarnings([]); + setIds([]); + setIsTransferDisabled(false); + } + }, [rules, sourceChain, targetChain, asset]); + return { warnings, ids, isTransferDisabled }; +} From 82ebf038348e2f60f7cff5a5a82fb8d9013e0281 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 09:34:48 -0300 Subject: [PATCH 07/17] remove unecesary debug code --- src/TransferRules.ts | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/TransferRules.ts b/src/TransferRules.ts index 3dab9cda1..f81d796a7 100644 --- a/src/TransferRules.ts +++ b/src/TransferRules.ts @@ -3,36 +3,13 @@ import { CHAIN_ID_ETH, CHAIN_ID_TERRA, CHAIN_ID_AURORA, - ChainId, - getForeignAssetTerra, - hexToUint8Array, - tryNativeToHexString, } from "@certusone/wormhole-sdk"; import { PredicateArgs, Rule } from "./hooks/useTransferControl"; import { terra } from "@certusone/wormhole-sdk"; -import { LCDClient } from "@terra-money/terra.js"; -import { getTerraConfig, getTokenBridgeAddressForChain } from "./utils/consts"; const EthereumPandleAddress = "0X808507121B80C02388FAD14726482E061B8DA827"; const BscPandleAddres = "0XB3ED0A426155B79B898849803E3B36552F7ED507"; -const lcd = new LCDClient(getTerraConfig(CHAIN_ID_TERRA)); -const getTerraClassic = (originChain: ChainId, originAssetHex: string) => - getForeignAssetTerra( - getTokenBridgeAddressForChain(CHAIN_ID_TERRA), - lcd, - originChain, - hexToUint8Array(tryNativeToHexString(originAssetHex, originChain)) - ); - -(async () => { - const info = await getTerraClassic( - CHAIN_ID_ETH, - "0xDeba6Ecc1865B217b1CaAbd16D7261d2a21b6046" - ); - console.log(info); -})(); - const isPandleFromEthereum = ( sourceChain: number, selectedTokenAddress: string | undefined From b1236e81b910af54659a7734e88aceab0a0eff95 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 09:43:56 -0300 Subject: [PATCH 08/17] re name property from isTransferDisabled to isRedeemDisabled --- src/components/Transfer/Redeem.tsx | 6 +++--- src/hooks/useRedeemControl.ts | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/components/Transfer/Redeem.tsx b/src/components/Transfer/Redeem.tsx index 725cc3e4e..5ea353d19 100644 --- a/src/components/Transfer/Redeem.tsx +++ b/src/components/Transfer/Redeem.tsx @@ -187,7 +187,7 @@ function Redeem() { const sourceChain = useSelector( (state: RootState) => state.transfer.sourceChain ); - const { warnings, isTransferDisabled } = useRedeemControl( + const { warnings, isRedeemDisabled } = useRedeemControl( TransferRules, sourceChain, targetChain, @@ -291,7 +291,7 @@ function Redeem() { ([]); - const [isTransferDisabled, setIsTransferDisabled] = useState(false); + const [isRedeemDisabled, setIsRedeemDisabled] = useState(false); const [warnings, setWarnings] = useState([]); const vaa: ParsedVaa | null = useMemo(() => { try { @@ -50,15 +50,15 @@ export function useRedeemControl( ); if (appliedRules.length > 0) { setWarnings(appliedRules); - setIsTransferDisabled(appliedRules.some((rule) => rule.disableTransfer)); + setIsRedeemDisabled(appliedRules.some((rule) => rule.disableTransfer)); setIds( appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) ); } else { setWarnings([]); setIds([]); - setIsTransferDisabled(false); + setIsRedeemDisabled(false); } }, [rules, sourceChain, targetChain, asset]); - return { warnings, ids, isTransferDisabled }; + return { warnings, ids, isRedeemDisabled }; } From 617edb07dc612e4065b89ee69a53eea668c2b7df Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 12:10:08 -0300 Subject: [PATCH 09/17] bug fix and code simplifications --- src/components/Transfer/Redeem.tsx | 10 ++++-- src/hooks/useRedeemControl.ts | 54 ++++++++++-------------------- 2 files changed, 26 insertions(+), 38 deletions(-) diff --git a/src/components/Transfer/Redeem.tsx b/src/components/Transfer/Redeem.tsx index 5ea353d19..7658c8b28 100644 --- a/src/components/Transfer/Redeem.tsx +++ b/src/components/Transfer/Redeem.tsx @@ -183,7 +183,12 @@ function Redeem() { dispatch(reset()); }, [dispatch]); const howToAddTokensUrl = getHowToAddTokensToWalletUrl(targetChain); - const vaaHex = useSelector((state: RootState) => state.transfer.signedVAAHex); + const originAsset = useSelector( + (state: RootState) => state.transfer.originAsset + ); + const originChain = useSelector( + (state: RootState) => state.transfer.originChain + ); const sourceChain = useSelector( (state: RootState) => state.transfer.sourceChain ); @@ -191,7 +196,8 @@ function Redeem() { TransferRules, sourceChain, targetChain, - vaaHex + originAsset, + originChain ); const relayerContent = ( <> diff --git a/src/hooks/useRedeemControl.ts b/src/hooks/useRedeemControl.ts index 35caf5fb2..5503a763b 100644 --- a/src/hooks/useRedeemControl.ts +++ b/src/hooks/useRedeemControl.ts @@ -1,52 +1,34 @@ -import { - ChainId, - ParsedVaa, - parseTransferPayload, - parseVaa, - hexToUint8Array, - tryHexToNativeString, -} from "@certusone/wormhole-sdk"; +import { ChainId, tryHexToNativeString } from "@certusone/wormhole-sdk"; import { Rule, WarningMessage } from "./useTransferControl"; import { useEffect, useMemo, useState } from "react"; +function parseOriginAsset(originAddress?: string, originChain?: ChainId) { + try { + if (originAddress && originChain) { + return tryHexToNativeString(originAddress, originChain); + } + } catch (err) { + console.log(err); + } +} + export function useRedeemControl( rules: Rule[], sourceChain: ChainId, targetChain: ChainId, - rawVaa: string = "" + originAddress?: string, + originChain?: ChainId ) { const [ids, setIds] = useState([]); const [isRedeemDisabled, setIsRedeemDisabled] = useState(false); const [warnings, setWarnings] = useState([]); - const vaa: ParsedVaa | null = useMemo(() => { - try { - return parseVaa(hexToUint8Array(rawVaa)); - } catch (e) { - console.error(e); - } - return null; - }, [rawVaa]); - const payload = useMemo(() => { - try { - if (vaa) { - return parseTransferPayload(Buffer.from(new Uint8Array(vaa?.payload))); - } - } catch (e) { - console.error(e); - } - return null; - }, [vaa]); - const asset = useMemo( - () => - tryHexToNativeString( - payload?.originAddress || "", - payload?.originChain as ChainId - ), - [payload] + const token = useMemo( + () => parseOriginAsset(originAddress, originChain), + [originAddress, originChain] ); useEffect(() => { const appliedRules = rules.filter((rule) => - rule.predicate({ source: sourceChain, target: targetChain, token: asset }) + rule.predicate({ source: sourceChain, target: targetChain, token }) ); if (appliedRules.length > 0) { setWarnings(appliedRules); @@ -59,6 +41,6 @@ export function useRedeemControl( setIds([]); setIsRedeemDisabled(false); } - }, [rules, sourceChain, targetChain, asset]); + }, [rules, sourceChain, targetChain, token]); return { warnings, ids, isRedeemDisabled }; } From f8fdbb2119fb3d13a4343c0594c802519dfec7c5 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 13:52:11 -0300 Subject: [PATCH 10/17] refactor and bug fix foreign to native terra classic transfer --- src/TransferRules.ts | 2 +- src/components/ChainWarningMessage.tsx | 2 +- src/components/Recovery.tsx | 7 +-- src/hooks/useRedeemControl.ts | 46 +++++++++---------- src/hooks/useTransferControl.ts | 56 ++++++----------------- src/hooks/useWarningRulesEngine.ts | 63 ++++++++++++++++++++++++++ 6 files changed, 103 insertions(+), 73 deletions(-) create mode 100644 src/hooks/useWarningRulesEngine.ts diff --git a/src/TransferRules.ts b/src/TransferRules.ts index f81d796a7..9d47bf216 100644 --- a/src/TransferRules.ts +++ b/src/TransferRules.ts @@ -4,8 +4,8 @@ import { CHAIN_ID_TERRA, CHAIN_ID_AURORA, } from "@certusone/wormhole-sdk"; -import { PredicateArgs, Rule } from "./hooks/useTransferControl"; import { terra } from "@certusone/wormhole-sdk"; +import { Rule, PredicateArgs } from "./hooks/useWarningRulesEngine"; const EthereumPandleAddress = "0X808507121B80C02388FAD14726482E061B8DA827"; const BscPandleAddres = "0XB3ED0A426155B79B898849803E3B36552F7ED507"; diff --git a/src/components/ChainWarningMessage.tsx b/src/components/ChainWarningMessage.tsx index 20567a2f9..ff622c963 100644 --- a/src/components/ChainWarningMessage.tsx +++ b/src/components/ChainWarningMessage.tsx @@ -1,6 +1,6 @@ import { Link, makeStyles, Typography } from "@material-ui/core"; import { Alert } from "@material-ui/lab"; -import { WarningMessage } from "../hooks/useTransferControl"; +import { WarningMessage } from "../hooks/useWarningRulesEngine"; const useStyles = makeStyles((theme) => ({ alert: { diff --git a/src/components/Recovery.tsx b/src/components/Recovery.tsx index 47c7db691..df2e5a758 100644 --- a/src/components/Recovery.tsx +++ b/src/components/Recovery.tsx @@ -414,8 +414,6 @@ function RelayerRecovery({ const [isAttemptingToSchedule, setIsAttemptingToSchedule] = useState(false); const { enqueueSnackbar } = useSnackbar(); - console.log(parsedPayload, relayerInfo, "in recovery relayer"); - const fee = (parsedPayload && parsedPayload.fee && parseInt(parsedPayload.fee)) || null; //This check is probably more sophisticated in the future. Possibly a net call. @@ -433,7 +431,6 @@ function RelayerRecovery({ ); const handleGo = useCallback(async () => { - console.log("handle go", selectedRelayer, parsedPayload); if (!(selectedRelayer && selectedRelayer.url)) { return; } @@ -463,7 +460,7 @@ function RelayerRecovery({ }); } ); - }, [selectedRelayer, enqueueSnackbar, onClick, signedVaa, parsedPayload]); + }, [selectedRelayer, enqueueSnackbar, onClick, signedVaa]); if (!isEligible) { return null; @@ -886,7 +883,7 @@ export default function Recovery() { const parsedVAA = parseVaa(hexToUint8Array(recoverySignedVAA)); setRecoveryParsedVAA(parsedVAA); } catch (e) { - console.log(e); + console.error(e); setRecoveryParsedVAA(null); } } diff --git a/src/hooks/useRedeemControl.ts b/src/hooks/useRedeemControl.ts index 5503a763b..c71d48030 100644 --- a/src/hooks/useRedeemControl.ts +++ b/src/hooks/useRedeemControl.ts @@ -1,6 +1,6 @@ import { ChainId, tryHexToNativeString } from "@certusone/wormhole-sdk"; -import { Rule, WarningMessage } from "./useTransferControl"; -import { useEffect, useMemo, useState } from "react"; +import { useMemo } from "react"; +import { Rule, useWarningRulesEngine } from "./useWarningRulesEngine"; function parseOriginAsset(originAddress?: string, originChain?: ChainId) { try { @@ -12,6 +12,22 @@ function parseOriginAsset(originAddress?: string, originChain?: ChainId) { } } +/** + * Will calculate if a redeem is allowed or not + * by using 4 dimension: + * - sourceChain + * - targetChain + * - originAddress + * - originChain + * + * @param sourceChain Which chain is the transfer coming from + * @param targetChain Which chain is the transfer going to + * @param originAddress Origin address of the asset + * @param originChain Origin chain of the asset used to calculate + * the asset address or symbol + * @returns a set of warnings, a set of ids and a boolean indicating + * if the transfer is disabled or not + */ export function useRedeemControl( rules: Rule[], sourceChain: ChainId, @@ -19,28 +35,10 @@ export function useRedeemControl( originAddress?: string, originChain?: ChainId ) { - const [ids, setIds] = useState([]); - const [isRedeemDisabled, setIsRedeemDisabled] = useState(false); - const [warnings, setWarnings] = useState([]); - const token = useMemo( - () => parseOriginAsset(originAddress, originChain), + const asset = useMemo( + () => parseOriginAsset(originAddress, originChain) || "", [originAddress, originChain] ); - useEffect(() => { - const appliedRules = rules.filter((rule) => - rule.predicate({ source: sourceChain, target: targetChain, token }) - ); - if (appliedRules.length > 0) { - setWarnings(appliedRules); - setIsRedeemDisabled(appliedRules.some((rule) => rule.disableTransfer)); - setIds( - appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) - ); - } else { - setWarnings([]); - setIds([]); - setIsRedeemDisabled(false); - } - }, [rules, sourceChain, targetChain, token]); - return { warnings, ids, isRedeemDisabled }; + const { warnings, ids, isDisabled } = useWarningRulesEngine(rules, sourceChain, targetChain, asset); + return { warnings, ids, isRedeemDisabled: isDisabled }; } diff --git a/src/hooks/useTransferControl.ts b/src/hooks/useTransferControl.ts index 10648af4d..934b5e275 100644 --- a/src/hooks/useTransferControl.ts +++ b/src/hooks/useTransferControl.ts @@ -1,25 +1,7 @@ import { ChainId } from "@certusone/wormhole-sdk"; +import { Rule, useWarningRulesEngine } from "./useWarningRulesEngine"; import { useEffect, useState } from "react"; - -export type WarningMessage = { - text: string; - link?: { - url: string; - text: string; - }; -}; - -export type PredicateArgs = { - source: ChainId; - target: ChainId; - token?: string; -}; - -export type Rule = WarningMessage & { - id?: string; - disableTransfer?: boolean; - predicate: (args: PredicateArgs) => boolean; -}; +import useOriginalAsset from "./useOriginalAsset"; /** * Will calculate if a transfer is allowed or not @@ -29,36 +11,26 @@ export type Rule = WarningMessage & { * - asset * * @param sourceChain Which chain is the transfer coming from - * @param targetChain - * @param assset - * @returns + * @param targetChain Which chain is the transfer going to + * @param assset Which asset is being transferred + * @returns a set of warnings, a set of ids and a boolean indicating + * if the transfer is disabled or not */ export function useTransferControl( rules: Rule[], sourceChain: ChainId, targetChain: ChainId, - asset?: string + assetOrToken: string = "" ) { - const [ids, setIds] = useState([]); - const [isTransferDisabled, setIsTransferDisabled] = useState(false); - const [warnings, setWarnings] = useState([]); + const [asset, setAsset] = useState(assetOrToken) + const info = useOriginalAsset(sourceChain, assetOrToken, false); useEffect(() => { - const appliedRules = rules.filter((rule) => - rule.predicate({ source: sourceChain, target: targetChain, token: asset }) - ); - if (appliedRules.length > 0) { - setWarnings(appliedRules); - setIsTransferDisabled(appliedRules.some((rule) => rule.disableTransfer)); - setIds( - appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) - ); - } else { - setWarnings([]); - setIds([]); - setIsTransferDisabled(false); + if (!info.isFetching) { + setAsset(info.data?.originAddress || assetOrToken) } - }, [rules, sourceChain, targetChain, asset]); - return { warnings, ids, isTransferDisabled }; + }, [assetOrToken, info]) + const { warnings, ids, isDisabled } = useWarningRulesEngine(rules, sourceChain, targetChain, asset); + return { warnings, ids, isTransferDisabled: isDisabled }; } export default useTransferControl; diff --git a/src/hooks/useWarningRulesEngine.ts b/src/hooks/useWarningRulesEngine.ts new file mode 100644 index 000000000..b3a8293d7 --- /dev/null +++ b/src/hooks/useWarningRulesEngine.ts @@ -0,0 +1,63 @@ +import { ChainId } from "@certusone/wormhole-sdk"; +import { useEffect, useState } from "react"; + +export type WarningMessage = { + text: string; + link?: { + url: string; + text: string; + }; +}; + +export type PredicateArgs = { + source: ChainId; + target: ChainId; + token?: string; +}; + +export type Rule = WarningMessage & { + id?: string; + disableTransfer?: boolean; + predicate: (args: PredicateArgs) => boolean; +}; + +/** + * Will calculate if a transfer is allowed or not + * by using 3 dimension: + * - sourceChain + * - targetChain + * - asset + * + * @param sourceChain Which chain is the transfer coming from + * @param targetChain Which chain is the transfer going to + * @param assset Which asset is being transferred + * @returns a set of warnings, a set of ids and a boolean indicating + * if the transfer is disabled or not + */ +export function useWarningRulesEngine( + rules: Rule[], + sourceChain: ChainId, + targetChain: ChainId, + token: string +) { + const [ids, setIds] = useState([]); + const [isDisabled, setIsDisabled] = useState(false); + const [warnings, setWarnings] = useState([]); + useEffect(() => { + const appliedRules = rules.filter((rule) => + rule.predicate({ source: sourceChain, target: targetChain, token }) + ); + if (appliedRules.length > 0) { + setWarnings(appliedRules); + setIsDisabled(appliedRules.some((rule) => rule.disableTransfer)); + setIds( + appliedRules.filter((rule) => !!rule.id).map((rule) => `${rule.id}`) + ); + } else { + setWarnings([]); + setIds([]); + setIsDisabled(false); + } + }, [rules, sourceChain, targetChain, token]); + return { warnings, ids, isDisabled }; +} From 76c06a109c18f8493670c0737e24c757248ad26b Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 13:58:14 -0300 Subject: [PATCH 11/17] revert change --- src/components/Recovery.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/components/Recovery.tsx b/src/components/Recovery.tsx index df2e5a758..fb0ebc373 100644 --- a/src/components/Recovery.tsx +++ b/src/components/Recovery.tsx @@ -36,7 +36,6 @@ import { uint8ArrayToHex, CHAIN_ID_SUI, getForeignAssetSui, - tryHexToNativeString, } from "@certusone/wormhole-sdk"; import { repairVaa } from "@certusone/wormhole-sdk/lib/esm/utils/repairVaa"; import { @@ -1131,7 +1130,7 @@ export default function Recovery() { parsedPayload.targetChain === CHAIN_ID_XPLA || parsedPayload.targetChain === CHAIN_ID_INJECTIVE ? tokenId - : tryHexToNativeString( + : hexToNativeString( parsedPayload.originAddress, parsedPayload.originChain as ChainId ) || "" From 762bc9b2ddc2773b587f7734aea6cfdc3d1d6b46 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 16:02:48 -0300 Subject: [PATCH 12/17] fix prettier issues --- src/hooks/useRedeemControl.ts | 9 +++++++-- src/hooks/useTransferControl.ts | 13 +++++++++---- 2 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/hooks/useRedeemControl.ts b/src/hooks/useRedeemControl.ts index c71d48030..425d2ab04 100644 --- a/src/hooks/useRedeemControl.ts +++ b/src/hooks/useRedeemControl.ts @@ -23,7 +23,7 @@ function parseOriginAsset(originAddress?: string, originChain?: ChainId) { * @param sourceChain Which chain is the transfer coming from * @param targetChain Which chain is the transfer going to * @param originAddress Origin address of the asset - * @param originChain Origin chain of the asset used to calculate + * @param originChain Origin chain of the asset used to calculate * the asset address or symbol * @returns a set of warnings, a set of ids and a boolean indicating * if the transfer is disabled or not @@ -39,6 +39,11 @@ export function useRedeemControl( () => parseOriginAsset(originAddress, originChain) || "", [originAddress, originChain] ); - const { warnings, ids, isDisabled } = useWarningRulesEngine(rules, sourceChain, targetChain, asset); + const { warnings, ids, isDisabled } = useWarningRulesEngine( + rules, + sourceChain, + targetChain, + asset + ); return { warnings, ids, isRedeemDisabled: isDisabled }; } diff --git a/src/hooks/useTransferControl.ts b/src/hooks/useTransferControl.ts index 934b5e275..f68518b86 100644 --- a/src/hooks/useTransferControl.ts +++ b/src/hooks/useTransferControl.ts @@ -22,14 +22,19 @@ export function useTransferControl( targetChain: ChainId, assetOrToken: string = "" ) { - const [asset, setAsset] = useState(assetOrToken) + const [asset, setAsset] = useState(assetOrToken); const info = useOriginalAsset(sourceChain, assetOrToken, false); useEffect(() => { if (!info.isFetching) { - setAsset(info.data?.originAddress || assetOrToken) + setAsset(info.data?.originAddress || assetOrToken); } - }, [assetOrToken, info]) - const { warnings, ids, isDisabled } = useWarningRulesEngine(rules, sourceChain, targetChain, asset); + }, [assetOrToken, info]); + const { warnings, ids, isDisabled } = useWarningRulesEngine( + rules, + sourceChain, + targetChain, + asset + ); return { warnings, ids, isTransferDisabled: isDisabled }; } From eedd24f473395098cf261820113fdaa5dbec4524 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 17:53:44 -0300 Subject: [PATCH 13/17] update pandle rule --- src/TransferRules.ts | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/TransferRules.ts b/src/TransferRules.ts index 9d47bf216..2423221df 100644 --- a/src/TransferRules.ts +++ b/src/TransferRules.ts @@ -8,7 +8,6 @@ import { terra } from "@certusone/wormhole-sdk"; import { Rule, PredicateArgs } from "./hooks/useWarningRulesEngine"; const EthereumPandleAddress = "0X808507121B80C02388FAD14726482E061B8DA827"; -const BscPandleAddres = "0XB3ED0A426155B79B898849803E3B36552F7ED507"; const isPandleFromEthereum = ( sourceChain: number, @@ -20,7 +19,7 @@ const isPandleFromEthereum = ( const isPandleFromBsc = ( sourceChain: number, selectedTokenAddress: string | undefined -) => sourceChain === CHAIN_ID_BSC && selectedTokenAddress === BscPandleAddres; +) => sourceChain === CHAIN_ID_BSC && selectedTokenAddress === EthereumPandleAddress; const PandleMessage = "Pandle transfers are limited to Ethereum to BSC and BSC to Ethereum."; @@ -32,9 +31,7 @@ const TerraClassicMessage = const TransferRules: Rule[] = [ { id: "pandle", - predicate: ({ source, token }: PredicateArgs) => - isPandleFromEthereum(source, token?.toUpperCase()) || - isPandleFromBsc(source, token?.toUpperCase()), + predicate: ({ source, token }: PredicateArgs) => isPandleFromEthereum(source, token?.toUpperCase()) || isPandleFromBsc(source, token?.toUpperCase()), text: PandleMessage, }, { From cad1d101a0eef99b8789af14cf3da58bb51eae1f Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 17:56:35 -0300 Subject: [PATCH 14/17] run prettier --- src/TransferRules.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/TransferRules.ts b/src/TransferRules.ts index 2423221df..b3cce0e2b 100644 --- a/src/TransferRules.ts +++ b/src/TransferRules.ts @@ -19,7 +19,9 @@ const isPandleFromEthereum = ( const isPandleFromBsc = ( sourceChain: number, selectedTokenAddress: string | undefined -) => sourceChain === CHAIN_ID_BSC && selectedTokenAddress === EthereumPandleAddress; +) => + sourceChain === CHAIN_ID_BSC && + selectedTokenAddress === EthereumPandleAddress; const PandleMessage = "Pandle transfers are limited to Ethereum to BSC and BSC to Ethereum."; @@ -31,7 +33,9 @@ const TerraClassicMessage = const TransferRules: Rule[] = [ { id: "pandle", - predicate: ({ source, token }: PredicateArgs) => isPandleFromEthereum(source, token?.toUpperCase()) || isPandleFromBsc(source, token?.toUpperCase()), + predicate: ({ source, token }: PredicateArgs) => + isPandleFromEthereum(source, token?.toUpperCase()) || + isPandleFromBsc(source, token?.toUpperCase()), text: PandleMessage, }, { From b5e29030139cda780c1d51350df2943a16dd0004 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Wed, 12 Jul 2023 18:36:55 -0300 Subject: [PATCH 15/17] revert change to avoid issue on throws error --- src/components/Recovery.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Recovery.tsx b/src/components/Recovery.tsx index fb0ebc373..eed589b9d 100644 --- a/src/components/Recovery.tsx +++ b/src/components/Recovery.tsx @@ -1130,7 +1130,7 @@ export default function Recovery() { parsedPayload.targetChain === CHAIN_ID_XPLA || parsedPayload.targetChain === CHAIN_ID_INJECTIVE ? tokenId - : hexToNativeString( + : hexToNativeAssetString( parsedPayload.originAddress, parsedPayload.originChain as ChainId ) || "" From 2995aa0270208e3d35c602e1534ef2eeda2a934b Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Thu, 13 Jul 2023 10:14:20 -0300 Subject: [PATCH 16/17] code review observations --- src/components/NFT/Source.tsx | 2 +- src/components/NFT/Target.tsx | 2 +- src/components/Transfer/Redeem.tsx | 2 +- src/components/Transfer/Source.tsx | 2 +- src/{TransferRules.ts => config/transferRules.ts} | 2 +- src/hooks/useHandleTransfer.tsx | 1 + 6 files changed, 6 insertions(+), 5 deletions(-) rename src/{TransferRules.ts => config/transferRules.ts} (96%) diff --git a/src/components/NFT/Source.tsx b/src/components/NFT/Source.tsx index 66af7bf94..7cbe58908 100644 --- a/src/components/NFT/Source.tsx +++ b/src/components/NFT/Source.tsx @@ -24,7 +24,7 @@ import SolanaTPSWarning from "../SolanaTPSWarning"; import StepDescription from "../StepDescription"; import { TokenSelector } from "../TokenSelectors/SourceTokenSelector"; import ChainWarningMessage from "../ChainWarningMessage"; -import TransferRules from "../../TransferRules"; +import TransferRules from "../../config/transferRules"; import useTransferControl from "../../hooks/useTransferControl"; const useStyles = makeStyles((theme) => ({ diff --git a/src/components/NFT/Target.tsx b/src/components/NFT/Target.tsx index 6f44e7e9a..c2c7250be 100644 --- a/src/components/NFT/Target.tsx +++ b/src/components/NFT/Target.tsx @@ -39,7 +39,7 @@ import SolanaTPSWarning from "../SolanaTPSWarning"; import StepDescription from "../StepDescription"; import ChainWarningMessage from "../ChainWarningMessage"; import useTransferControl from "../../hooks/useTransferControl"; -import TransferRules from "../../TransferRules"; +import TransferRules from "../../config/transferRules"; const useStyles = makeStyles((theme) => ({ transferField: { diff --git a/src/components/Transfer/Redeem.tsx b/src/components/Transfer/Redeem.tsx index 7658c8b28..0fc062dec 100644 --- a/src/components/Transfer/Redeem.tsx +++ b/src/components/Transfer/Redeem.tsx @@ -68,7 +68,7 @@ import RedeemPreview from "./RedeemPreview"; import WaitingForWalletMessage from "./WaitingForWalletMessage"; import ChainWarningMessage from "../ChainWarningMessage"; import { useRedeemControl } from "../../hooks/useRedeemControl"; -import TransferRules from "../../TransferRules"; +import TransferRules from "../../config/transferRules"; import { RootState } from "../../store"; const useStyles = makeStyles((theme) => ({ diff --git a/src/components/Transfer/Source.tsx b/src/components/Transfer/Source.tsx index 548643941..92d7e8463 100644 --- a/src/components/Transfer/Source.tsx +++ b/src/components/Transfer/Source.tsx @@ -50,7 +50,7 @@ import useIsTransferLimited from "../../hooks/useIsTransferLimited"; import TransferLimitedWarning from "./TransferLimitedWarning"; import { RootState } from "../../store"; import useTransferControl from "../../hooks/useTransferControl"; -import TransferRules from "../../TransferRules"; +import TransferRules from "../../config/transferRules"; import useRoundTripTransfer from "../../hooks/useRoundTripTransfer"; const useStyles = makeStyles((theme) => ({ diff --git a/src/TransferRules.ts b/src/config/transferRules.ts similarity index 96% rename from src/TransferRules.ts rename to src/config/transferRules.ts index b3cce0e2b..5da92b131 100644 --- a/src/TransferRules.ts +++ b/src/config/transferRules.ts @@ -5,7 +5,7 @@ import { CHAIN_ID_AURORA, } from "@certusone/wormhole-sdk"; import { terra } from "@certusone/wormhole-sdk"; -import { Rule, PredicateArgs } from "./hooks/useWarningRulesEngine"; +import { Rule, PredicateArgs } from "../hooks/useWarningRulesEngine"; const EthereumPandleAddress = "0X808507121B80C02388FAD14726482E061B8DA827"; diff --git a/src/hooks/useHandleTransfer.tsx b/src/hooks/useHandleTransfer.tsx index 8d4458a9f..5855577d5 100644 --- a/src/hooks/useHandleTransfer.tsx +++ b/src/hooks/useHandleTransfer.tsx @@ -627,6 +627,7 @@ async function solana( additionalPayload?.payload ); const transaction = await promise; + console.log('>> Solana', transaction); const txid = await signSendAndConfirm(wallet, transaction); enqueueSnackbar(null, { content: Transaction confirmed, From 0dbc10a5ec696a9760315a480f02e1893ecae772 Mon Sep 17 00:00:00 2001 From: Sebastian Scatularo Date: Thu, 13 Jul 2023 10:17:34 -0300 Subject: [PATCH 17/17] update to align to current naming convetion --- src/components/NFT/Source.tsx | 4 ++-- src/components/NFT/Target.tsx | 4 ++-- src/components/Transfer/Redeem.tsx | 4 ++-- src/components/Transfer/Source.tsx | 4 ++-- src/config/transferRules.ts | 18 +++++++++--------- src/hooks/useHandleTransfer.tsx | 1 - 6 files changed, 17 insertions(+), 18 deletions(-) diff --git a/src/components/NFT/Source.tsx b/src/components/NFT/Source.tsx index 7cbe58908..2259596f5 100644 --- a/src/components/NFT/Source.tsx +++ b/src/components/NFT/Source.tsx @@ -24,7 +24,7 @@ import SolanaTPSWarning from "../SolanaTPSWarning"; import StepDescription from "../StepDescription"; import { TokenSelector } from "../TokenSelectors/SourceTokenSelector"; import ChainWarningMessage from "../ChainWarningMessage"; -import TransferRules from "../../config/transferRules"; +import transferRules from "../../config/transferRules"; import useTransferControl from "../../hooks/useTransferControl"; const useStyles = makeStyles((theme) => ({ @@ -53,7 +53,7 @@ function Source() { dispatch(incrementStep()); }, [dispatch]); const { isTransferDisabled, warnings } = useTransferControl( - TransferRules, + transferRules, sourceChain, targetChain ); diff --git a/src/components/NFT/Target.tsx b/src/components/NFT/Target.tsx index c2c7250be..329265a30 100644 --- a/src/components/NFT/Target.tsx +++ b/src/components/NFT/Target.tsx @@ -39,7 +39,7 @@ import SolanaTPSWarning from "../SolanaTPSWarning"; import StepDescription from "../StepDescription"; import ChainWarningMessage from "../ChainWarningMessage"; import useTransferControl from "../../hooks/useTransferControl"; -import TransferRules from "../../config/transferRules"; +import transferRules from "../../config/transferRules"; const useStyles = makeStyles((theme) => ({ transferField: { @@ -94,7 +94,7 @@ function Target() { dispatch(incrementStep()); }, [dispatch]); const { isTransferDisabled, warnings } = useTransferControl( - TransferRules, + transferRules, sourceChain, targetChain ); diff --git a/src/components/Transfer/Redeem.tsx b/src/components/Transfer/Redeem.tsx index 0fc062dec..2087f79cb 100644 --- a/src/components/Transfer/Redeem.tsx +++ b/src/components/Transfer/Redeem.tsx @@ -68,7 +68,7 @@ import RedeemPreview from "./RedeemPreview"; import WaitingForWalletMessage from "./WaitingForWalletMessage"; import ChainWarningMessage from "../ChainWarningMessage"; import { useRedeemControl } from "../../hooks/useRedeemControl"; -import TransferRules from "../../config/transferRules"; +import transferRules from "../../config/transferRules"; import { RootState } from "../../store"; const useStyles = makeStyles((theme) => ({ @@ -193,7 +193,7 @@ function Redeem() { (state: RootState) => state.transfer.sourceChain ); const { warnings, isRedeemDisabled } = useRedeemControl( - TransferRules, + transferRules, sourceChain, targetChain, originAsset, diff --git a/src/components/Transfer/Source.tsx b/src/components/Transfer/Source.tsx index 92d7e8463..bc41e795f 100644 --- a/src/components/Transfer/Source.tsx +++ b/src/components/Transfer/Source.tsx @@ -50,7 +50,7 @@ import useIsTransferLimited from "../../hooks/useIsTransferLimited"; import TransferLimitedWarning from "./TransferLimitedWarning"; import { RootState } from "../../store"; import useTransferControl from "../../hooks/useTransferControl"; -import TransferRules from "../../config/transferRules"; +import transferRules from "../../config/transferRules"; import useRoundTripTransfer from "../../hooks/useRoundTripTransfer"; const useStyles = makeStyles((theme) => ({ @@ -152,7 +152,7 @@ function Source() { (state: RootState) => state.transfer.sourceParsedTokenAccount?.mintKey ); const { isTransferDisabled, warnings, ids } = useTransferControl( - TransferRules, + transferRules, sourceChain, targetChain, selectedTokenAddress diff --git a/src/config/transferRules.ts b/src/config/transferRules.ts index 5da92b131..dc96f5121 100644 --- a/src/config/transferRules.ts +++ b/src/config/transferRules.ts @@ -7,36 +7,36 @@ import { import { terra } from "@certusone/wormhole-sdk"; import { Rule, PredicateArgs } from "../hooks/useWarningRulesEngine"; -const EthereumPandleAddress = "0X808507121B80C02388FAD14726482E061B8DA827"; +const ETHEREUM_PANDLE_ADDRESS = "0X808507121B80C02388FAD14726482E061B8DA827"; const isPandleFromEthereum = ( sourceChain: number, selectedTokenAddress: string | undefined ) => sourceChain === CHAIN_ID_ETH && - selectedTokenAddress === EthereumPandleAddress; + selectedTokenAddress === ETHEREUM_PANDLE_ADDRESS; const isPandleFromBsc = ( sourceChain: number, selectedTokenAddress: string | undefined ) => sourceChain === CHAIN_ID_BSC && - selectedTokenAddress === EthereumPandleAddress; + selectedTokenAddress === ETHEREUM_PANDLE_ADDRESS; -const PandleMessage = +const PANDLE_MESSAGE = "Pandle transfers are limited to Ethereum to BSC and BSC to Ethereum."; const AuroraMessage = "As a precautionary measure, Wormhole Network and Portal have paused Aurora support temporarily."; -const TerraClassicMessage = +const TERRA_CLASSIC_MESSAGE = "Transfers of native tokens to/from Terra Classic have been temporarily paused."; -const TransferRules: Rule[] = [ +const transferRules: Rule[] = [ { id: "pandle", predicate: ({ source, token }: PredicateArgs) => isPandleFromEthereum(source, token?.toUpperCase()) || isPandleFromBsc(source, token?.toUpperCase()), - text: PandleMessage, + text: PANDLE_MESSAGE, }, { id: "aurora", @@ -50,9 +50,9 @@ const TransferRules: Rule[] = [ predicate: ({ source, target, token }: PredicateArgs) => (source === CHAIN_ID_TERRA || target === CHAIN_ID_TERRA) && terra.isNativeDenom(token), - text: TerraClassicMessage, + text: TERRA_CLASSIC_MESSAGE, disableTransfer: true, }, ]; -export default TransferRules; +export default transferRules; diff --git a/src/hooks/useHandleTransfer.tsx b/src/hooks/useHandleTransfer.tsx index 5855577d5..8d4458a9f 100644 --- a/src/hooks/useHandleTransfer.tsx +++ b/src/hooks/useHandleTransfer.tsx @@ -627,7 +627,6 @@ async function solana( additionalPayload?.payload ); const transaction = await promise; - console.log('>> Solana', transaction); const txid = await signSendAndConfirm(wallet, transaction); enqueueSnackbar(null, { content: Transaction confirmed,