From 01a6de62028a2403d51013d749ca6bc1604a6e6c Mon Sep 17 00:00:00 2001 From: Bhavi Dhingra Date: Wed, 18 Sep 2024 14:15:18 +0200 Subject: [PATCH] feat(sui): add sui token support --- electron/types.ts | 2 +- package-lock.json | 72 +++++----- package.json | 4 +- .../BuildUnsignedConsolidationCoin.tsx | 62 +++++++- .../SuiTokenForm.tsx | 136 ++++++++++++++++++ .../BuildUnsignedSweepCoin.tsx | 68 +++++++++ .../BuildUnsignedSweepCoin/SuiTokenForm.tsx | 93 ++++++++++++ .../CreateBroadcastableTransactionIndex.tsx | 3 +- .../NonBitGoRecoveryCoin.tsx | 9 +- src/helpers/config.ts | 22 +++ 10 files changed, 422 insertions(+), 49 deletions(-) create mode 100644 src/containers/BuildUnsignedConsolidation/SuiTokenForm.tsx create mode 100644 src/containers/BuildUnsignedSweepCoin/SuiTokenForm.tsx diff --git a/electron/types.ts b/electron/types.ts index b3e895cf..84fb38f0 100644 --- a/electron/types.ts +++ b/electron/types.ts @@ -7,7 +7,7 @@ import { Dot, Tdot } from '@bitgo/sdk-coin-dot'; import { Sol, Tsol } from '@bitgo/sdk-coin-sol'; import { Hbar, Thbar } from '@bitgo/sdk-coin-hbar'; import { Algo, Talgo } from '@bitgo/sdk-coin-algo'; -import { Sui, Tsui } from '@bitgo-beta/sdk-coin-sui'; +import { Sui, Tsui } from '@bitgo/sdk-coin-sui'; export type createAdaBroadcastableSweepTransactionParameters = | Parameters[0] diff --git a/package-lock.json b/package-lock.json index a3247966..1a05604c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -43,7 +43,7 @@ "@bitgo/sdk-coin-polygon": "21.0.5", "@bitgo/sdk-coin-sei": "3.0.5", "@bitgo/sdk-coin-sol": "4.5.2", - "@bitgo/sdk-coin-sui": "5.6.4", + "@bitgo/sdk-coin-sui": "5.7.0", "@bitgo/sdk-coin-tia": "3.0.5", "@bitgo/sdk-coin-trx": "2.0.36", "@bitgo/sdk-coin-xlm": "3.2.10", @@ -2405,13 +2405,13 @@ } }, "node_modules/@bitgo/abstract-eth": { - "version": "22.1.0", - "resolved": "https://registry.npmjs.org/@bitgo/abstract-eth/-/abstract-eth-22.1.0.tgz", - "integrity": "sha512-w5jDu/8827WiHUyI5knHbC4J2JKoBpHE9p41B1kyjCVEglE+wasSZeQi2hqFzUNaKcZbZuNu0AOtRwwrjtUNgg==", + "version": "22.1.1", + "resolved": "https://registry.npmjs.org/@bitgo/abstract-eth/-/abstract-eth-22.1.1.tgz", + "integrity": "sha512-c5xw8T/KK7tnN/De3ZNXK5RDMGYfwvFItVNo3fcDvjLwxN7Ts1KY9Nq4RxyeMRBIwjJ0Qi6Q31qrwOBLLxQW4g==", "dependencies": { - "@bitgo/sdk-core": "^28.5.0", + "@bitgo/sdk-core": "^28.6.0", "@bitgo/sdk-lib-mpc": "^10.0.0", - "@bitgo/statics": "^49.5.0", + "@bitgo/statics": "^49.6.0", "@bitgo/utxo-lib": "^10.3.0", "@ethereumjs/common": "^2.6.5", "@ethereumjs/tx": "^3.3.0", @@ -3472,13 +3472,13 @@ } }, "node_modules/@bitgo/sdk-coin-avaxp": { - "version": "5.0.35", - "resolved": "https://registry.npmjs.org/@bitgo/sdk-coin-avaxp/-/sdk-coin-avaxp-5.0.35.tgz", - "integrity": "sha512-pcQu0sSq+021o+7wzRy71nt1lAymRpWntyjA/POhy5z9UrelH2VYl8BBmVrJA/bE1u1HytYtDjqVUOx06d3iNQ==", + "version": "5.0.36", + "resolved": "https://registry.npmjs.org/@bitgo/sdk-coin-avaxp/-/sdk-coin-avaxp-5.0.36.tgz", + "integrity": "sha512-LOip2XfrBjwxupUMXmTrn/t9Zw07ngHqN9H1FQ9UmzvXDtHNCIDPC3QV/0EkxrOZI9yJ8/AglXEogqq8ST0xdQ==", "dependencies": { "@bitgo-forks/avalanchejs": "4.1.0-alpha.1", - "@bitgo/sdk-core": "^28.5.0", - "@bitgo/statics": "^49.5.0", + "@bitgo/sdk-core": "^28.6.0", + "@bitgo/statics": "^49.6.0", "@bitgo/utxo-lib": "^10.3.0", "avalanche": "3.15.3", "bignumber.js": "^9.0.0", @@ -4301,14 +4301,14 @@ } }, "node_modules/@bitgo/sdk-coin-sui": { - "version": "5.6.4", - "resolved": "https://registry.npmjs.org/@bitgo/sdk-coin-sui/-/sdk-coin-sui-5.6.4.tgz", - "integrity": "sha512-Y0G0HPRSMBe5cnStY++jPAuDsR5cX2D/F9hCvemZNvm03HTk5gvtHGtICVemyZgw3mNtnYa8EASRXkqXYPHQOw==", + "version": "5.7.0", + "resolved": "https://registry.npmjs.org/@bitgo/sdk-coin-sui/-/sdk-coin-sui-5.7.0.tgz", + "integrity": "sha512-kntUIJjWOJ1Y1QaMAU2FmRoGbSOxwk+oAUjnPQAxgKKm7ClRTMsqGeojNvZH6kQqcS988FUDefLNtnqf6qgYUQ==", "dependencies": { "@bitgo/blake2b": "^3.2.4", - "@bitgo/sdk-core": "^28.5.0", + "@bitgo/sdk-core": "^28.6.0", "@bitgo/sdk-lib-mpc": "^10.0.0", - "@bitgo/statics": "^49.5.0", + "@bitgo/statics": "^49.6.0", "@mysten/bcs": "^0.7.0", "bignumber.js": "^9.0.0", "bs58": "^4.0.1", @@ -4547,15 +4547,15 @@ } }, "node_modules/@bitgo/sdk-core": { - "version": "28.5.0", - "resolved": "https://registry.npmjs.org/@bitgo/sdk-core/-/sdk-core-28.5.0.tgz", - "integrity": "sha512-yW9gM7jbU/3HyIKpglsYRcqNkJva20UbIC+O1g+WW+PgKC2DIqiNBldLAS1oUjdDDK6Z3Niqcpq986wZxGJaUA==", + "version": "28.6.0", + "resolved": "https://registry.npmjs.org/@bitgo/sdk-core/-/sdk-core-28.6.0.tgz", + "integrity": "sha512-W7MND1XVMPYh2fz24UMAEhfxN/saJ/t1qKgUOEfeZsQf1Eonr4S7J7bTPeXkNDTtzcHnNOLH4yy4GVchILiW4w==", "dependencies": { "@bitgo/bls-dkg": "^1.3.1", "@bitgo/public-types": "2.33.4", "@bitgo/sdk-lib-mpc": "^10.0.0", "@bitgo/sjcl": "^1.0.1", - "@bitgo/statics": "^49.5.0", + "@bitgo/statics": "^49.6.0", "@bitgo/utxo-lib": "^10.3.0", "@noble/secp256k1": "1.6.3", "@stablelib/hex": "^1.0.0", @@ -4729,9 +4729,9 @@ "license": "(BSD-2-Clause OR GPL-2.0-only)" }, "node_modules/@bitgo/statics": { - "version": "49.5.0", - "resolved": "https://registry.npmjs.org/@bitgo/statics/-/statics-49.5.0.tgz", - "integrity": "sha512-86XiTyEbn+xPyoI0XKJ5/b5QEi8bnPn7o03pqf3Wwp3UnpCDGQ6vJIwLtHDxIVUaef4/DuJAONZdeIUWjdS6sg==" + "version": "49.6.0", + "resolved": "https://registry.npmjs.org/@bitgo/statics/-/statics-49.6.0.tgz", + "integrity": "sha512-zfjPsAi0GDVhDiGOubpOw7nsf1fRsb+W0Fp//FLzuXnsD3CFMouo5Jualkuh/eaiy+s74RLWIiMmzOx1XmtXsA==" }, "node_modules/@bitgo/unspents": { "version": "0.47.10", @@ -4774,11 +4774,11 @@ } }, "node_modules/@bitgo/utxo-ord": { - "version": "1.20.41", - "resolved": "https://registry.npmjs.org/@bitgo/utxo-ord/-/utxo-ord-1.20.41.tgz", - "integrity": "sha512-e2i9YJEyW/YCc/XDMTdnjQHZ1dQUCn/p4pwDrUB8Xo5roiRbD8oICt5Stc0GHbUqNZBvXur6vqqUKAnnX01caQ==", + "version": "1.20.42", + "resolved": "https://registry.npmjs.org/@bitgo/utxo-ord/-/utxo-ord-1.20.42.tgz", + "integrity": "sha512-3c0ykN51c9zux1my+wAizzjYDz74k1kBiqNWPZvTzDhH47vQfHZpbOoxYfD2vPK7hhEago0dx8PajaYgIooslA==", "dependencies": { - "@bitgo/sdk-core": "^28.5.0", + "@bitgo/sdk-core": "^28.6.0", "@bitgo/unspents": "^0.47.10", "@bitgo/utxo-lib": "^10.3.0" } @@ -10971,9 +10971,9 @@ } }, "node_modules/@metamask/eth-sig-util/node_modules/@scure/base": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.8.tgz", - "integrity": "sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "funding": { "url": "https://paulmillr.com/funding/" } @@ -37588,9 +37588,9 @@ } }, "node_modules/micro-eth-signer/node_modules/@scure/base": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.8.tgz", - "integrity": "sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "funding": { "url": "https://paulmillr.com/funding/" } @@ -37612,9 +37612,9 @@ } }, "node_modules/micro-packed/node_modules/@scure/base": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.8.tgz", - "integrity": "sha512-6CyAclxj3Nb0XT7GHK6K4zK6k2xJm6E4Ft0Ohjt4WgegiFUHEtFb2CGzmPmGBwoIhrLsqNLYfLr04Y1GePrzZg==", + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/@scure/base/-/base-1.1.9.tgz", + "integrity": "sha512-8YKhl8GHiNI/pU2VMaofa2Tor7PJRAjwQLBBuilkJ9L5+13yVbC7JO/wS7piioAvPSwR3JKM1IJ/u4xQzbcXKg==", "funding": { "url": "https://paulmillr.com/funding/" } diff --git a/package.json b/package.json index dc5448dc..4bf7e5b8 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,6 @@ "dependencies": { "@bitgo/abstract-cosmos": "11.0.5", "@bitgo/abstract-utxo": "8.14.2", - "@bitgo/sdk-opensslbytes": "^2.0.0", "@bitgo/sdk-api": "1.54.1", "@bitgo/sdk-coin-ada": "4.2.14", "@bitgo/sdk-coin-algo": "2.1.34", @@ -44,13 +43,14 @@ "@bitgo/sdk-coin-polygon": "21.0.5", "@bitgo/sdk-coin-sei": "3.0.5", "@bitgo/sdk-coin-sol": "4.5.2", - "@bitgo/sdk-coin-sui": "5.6.4", + "@bitgo/sdk-coin-sui": "5.7.0", "@bitgo/sdk-coin-tia": "3.0.5", "@bitgo/sdk-coin-trx": "2.0.36", "@bitgo/sdk-coin-xlm": "3.2.10", "@bitgo/sdk-coin-xrp": "2.1.17", "@bitgo/sdk-coin-zec": "2.0.36", "@bitgo/sdk-coin-zeta": "3.0.5", + "@bitgo/sdk-opensslbytes": "^2.0.0", "@bitgo/utxo-lib": "10.3.0", "@ethereumjs/common": "2.6.5", "@lottiefiles/react-lottie-player": "3.4.9", diff --git a/src/containers/BuildUnsignedConsolidation/BuildUnsignedConsolidationCoin.tsx b/src/containers/BuildUnsignedConsolidation/BuildUnsignedConsolidationCoin.tsx index dce3dda9..4d4d144e 100644 --- a/src/containers/BuildUnsignedConsolidation/BuildUnsignedConsolidationCoin.tsx +++ b/src/containers/BuildUnsignedConsolidation/BuildUnsignedConsolidationCoin.tsx @@ -9,13 +9,14 @@ import { import { TronForm } from '~/containers/BuildUnsignedConsolidation/TronForm'; import { TronTokenForm } from '~/containers/BuildUnsignedConsolidation/TronTokenForm'; import { CoinsSelectAutocomplete } from '~/components'; -import { buildUnsignedConsolidationCoins } from '~/helpers/config'; +import { buildUnsignedConsolidationCoins, tokenParentCoins } from '~/helpers/config'; import { BackToHomeHelperText } from '~/components/BackToHomeHelperText'; import { ConsolidationRecoveryBatch } from '@bitgo/sdk-coin-trx'; import { useAlertBanner } from '~/contexts'; import { GenericEcdsaForm } from '~/containers/BuildUnsignedConsolidation/GenericEcdsaForm'; import { SolForm } from '~/containers/BuildUnsignedConsolidation/SolForm'; import { SolTokenForm } from '~/containers/BuildUnsignedConsolidation/SolTokenForm'; +import { SuiTokenForm } from '~/containers/BuildUnsignedConsolidation/SuiTokenForm'; type ConsolidationFormProps = { coin?: string; @@ -25,10 +26,9 @@ type ConsolidationFormProps = { function isRecoveryConsolidationTransaction( result: any ): result is ConsolidationRecoveryBatch { - const consolidationRecoveryBatch = result as ConsolidationRecoveryBatch; return ( - consolidationRecoveryBatch && - consolidationRecoveryBatch.transactions !== undefined + ('txRequests' in result && !!result['txRequests']) || + ('transactions' in result && !!result['transactions']) ); } @@ -343,6 +343,60 @@ function ConsolidationForm({ coin, environment }: ConsolidationFormProps) { console.log(e); } + setSubmitting(false); + } + }} + /> + ); + case 'suiToken': + case 'tsuiToken': + return ( + { + setSubmitting(true); + try { + await window.commands.setBitGoEnvironment(environment); + const parentCoin = tokenParentCoins[coin]; + const chainData = await window.queries.getChain(parentCoin); + const consolidateData = await window.commands.recoverConsolidations(parentCoin, { + ...(await updateKeysFromIds(parentCoin, values)), + bitgoKey: values.bitgoKey.replace(/\s+/g, ''), + tokenContractAddress: values.packageId, + seed: values.seed, + }); + + if (consolidateData instanceof Error) { + throw consolidateData; + } + + const showSaveDialogData = await window.commands.showSaveDialog({ + filters: [ + { + name: 'Custom File Type', + extensions: ['json'], + }, + ], + defaultPath: `~/${chainData}-unsigned-consolidation-${Date.now()}.json`, + }); + if (!showSaveDialogData.filePath) { + throw new Error('No file path selected'); + } + + await window.commands.writeFile( + showSaveDialogData.filePath, + JSON.stringify(consolidateData, null, 2), + { encoding: 'utf8' } + ); + navigate( + `/${environment}/build-unsigned-consolidation/${coin}/success` + ); + } catch (e) { + if (e instanceof Error) { + setAlert(e.message); + } else { + console.log(e); + } + setSubmitting(false); } }} diff --git a/src/containers/BuildUnsignedConsolidation/SuiTokenForm.tsx b/src/containers/BuildUnsignedConsolidation/SuiTokenForm.tsx new file mode 100644 index 00000000..61793596 --- /dev/null +++ b/src/containers/BuildUnsignedConsolidation/SuiTokenForm.tsx @@ -0,0 +1,136 @@ +import { Form, FormikHelpers, FormikProvider, useFormik } from 'formik'; +import { Link } from 'react-router-dom'; +import * as Yup from 'yup'; +import { + Button, + FormikPasswordfield, + FormikTextarea, + FormikTextfield, +} from '~/components'; + +const validationSchema = Yup.object({ + userKey: Yup.string().required(), + backupKey: Yup.string().required(), + bitgoKey: Yup.string().required(), + packageId: Yup.string().required(), + walletPassphrase: Yup.string(), + startingScanIndex: Yup.number(), + endingScanIndex: Yup.number().moreThan( + Yup.ref('startingScanIndex'), + 'Ending scan index must be greater than starting scan index' + ), + seed: Yup.string(), +}).required(); + +export type SuiFormValues = Yup.Asserts; + +export type SuiTokenFormValues = { + onSubmit: ( + values: SuiFormValues, + formikHelpers: FormikHelpers + ) => void | Promise; +}; + +export function SuiTokenForm({ onSubmit }: SuiTokenFormValues) { + const formik = useFormik({ + onSubmit, + initialValues: { + userKey: '', + backupKey: '', + bitgoKey: '', + packageId: '', + walletPassphrase: '', + startingScanIndex: 1, + endingScanIndex: 21, + seed: undefined, + }, + }); + + return ( + +
+

+ Self-managed cold or Hot wallet details +

+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ ); +} diff --git a/src/containers/BuildUnsignedSweepCoin/BuildUnsignedSweepCoin.tsx b/src/containers/BuildUnsignedSweepCoin/BuildUnsignedSweepCoin.tsx index e01189d1..00da3d67 100644 --- a/src/containers/BuildUnsignedSweepCoin/BuildUnsignedSweepCoin.tsx +++ b/src/containers/BuildUnsignedSweepCoin/BuildUnsignedSweepCoin.tsx @@ -30,6 +30,7 @@ import { TronForm } from './TronForm'; import { TronTokenForm } from './TronTokenForm'; import { SolanaForm } from './SolanaForm'; import { SolanaTokenForm } from './SolanaTokenForm'; +import { SuiTokenForm } from './SuiTokenForm'; import { CardanoForm } from './CardanoForm'; import { BackToHomeHelperText } from '~/components/BackToHomeHelperText'; import { buildUnsignedSweepCoins, tokenParentCoins } from '~/helpers/config'; @@ -1179,6 +1180,73 @@ function Form() { { encoding: 'utf-8' } ); + navigate( + `/${bitGoEnvironment}/build-unsigned-sweep/${coin}/success` + ); + } catch (err) { + if (err instanceof Error) { + setAlert(err.message); + } else { + console.error(err); + } + setSubmitting(false); + } + }} + /> + ); + case 'suiToken': + case 'tsuiToken': + return ( + { + setAlert(undefined); + setSubmitting(true); + try { + await window.commands.setBitGoEnvironment(bitGoEnvironment, coin); + const parentCoin = tokenParentCoins[coin]; + const chainData = coin; + const recoverData = await window.commands.recover(parentCoin, { + bitgoKey: values.bitgoKey.replace(/\s+/g, ''), + tokenContractAddress: values.packageId, + recoveryDestination: values.recoveryDestination, + seed: values.seed, + ignoreAddressTypes: [], + userKey: '', + backupKey: '' + }); + assert( + isRecoveryTransaction(recoverData), + 'Fully-signed recovery transaction not detected.' + ); + + const showSaveDialogData = await window.commands.showSaveDialog({ + filters: [ + { + name: 'Custom File Type', + extensions: ['json'], + }, + ], + defaultPath: `~/${chainData}-unsigned-sweep-${Date.now()}.json`, + }); + + if (!showSaveDialogData.filePath) { + throw new Error('No file path selected'); + } + + await window.commands.writeFile( + showSaveDialogData.filePath, + JSON.stringify( + { + ...recoverData, + ...(await includePubsFor(coin, values)), + }, + null, + 2 + ), + { encoding: 'utf-8' } + ); + navigate( `/${bitGoEnvironment}/build-unsigned-sweep/${coin}/success` ); diff --git a/src/containers/BuildUnsignedSweepCoin/SuiTokenForm.tsx b/src/containers/BuildUnsignedSweepCoin/SuiTokenForm.tsx new file mode 100644 index 00000000..73edee89 --- /dev/null +++ b/src/containers/BuildUnsignedSweepCoin/SuiTokenForm.tsx @@ -0,0 +1,93 @@ +import { Form, FormikHelpers, FormikProvider, useFormik } from 'formik'; +import { Link } from 'react-router-dom'; +import * as Yup from 'yup'; +import { Button, FormikTextfield } from '~/components'; + +const validationSchema = Yup.object({ + userKey: Yup.string().required(), + backupKey: Yup.string().required(), + bitgoKey: Yup.string().required(), + packageId: Yup.string().required(), + recoveryDestination: Yup.string().required(), + seed: Yup.string(), +}).required(); + +type SuiFormValues = Yup.Asserts; + +export type SuiTokenFormProps = { + onSubmit: ( + values: SuiFormValues, + formikHelpers: FormikHelpers + ) => void | Promise; +}; + +export function SuiTokenForm({ onSubmit }: SuiTokenFormProps) { + const formik = useFormik({ + onSubmit, + initialValues: { + userKey: '', + backupKey: '', + bitgoKey: '', + packageId: '', + recoveryDestination: '', + seed: undefined, + }, + validationSchema, + }); + + return ( + +
+

+ Self-managed cold wallet details +

+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+ ); +} diff --git a/src/containers/CreateBroadcastableTransaction/CreateBroadcastableTransactionIndex.tsx b/src/containers/CreateBroadcastableTransaction/CreateBroadcastableTransactionIndex.tsx index 49ef8060..2cbc416d 100644 --- a/src/containers/CreateBroadcastableTransaction/CreateBroadcastableTransactionIndex.tsx +++ b/src/containers/CreateBroadcastableTransaction/CreateBroadcastableTransactionIndex.tsx @@ -72,7 +72,8 @@ export function CreateBroadcastableTransactionIndex() { assert(isSignedTransaction(tx), 'Signed transaction not found'); - const coin = tx.signatureShares[0].txRequest.walletCoin; + let coin = tx.signatureShares[0].txRequest.walletCoin; + coin = (coin as string).split(':')[0]; const chainData = await window.queries.getChain(coin); // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const broadcastTx: Error | BroadcastableSweepTransaction = diff --git a/src/containers/NonBitGoRecoveryCoin/NonBitGoRecoveryCoin.tsx b/src/containers/NonBitGoRecoveryCoin/NonBitGoRecoveryCoin.tsx index 45ba2632..3f12b862 100644 --- a/src/containers/NonBitGoRecoveryCoin/NonBitGoRecoveryCoin.tsx +++ b/src/containers/NonBitGoRecoveryCoin/NonBitGoRecoveryCoin.tsx @@ -954,6 +954,8 @@ function Form() { ); case 'trxToken': case 'ttrxToken': + case 'suiToken': + case 'tsuiToken': return ( = { Icon: 'sui', value: 'sui', }, + suiToken: { + Title: 'SUI Token', + Description: 'Sui Token', + Icon: 'sui', + value: 'suiToken', + }, tsui: { Title: 'TSUI', Description: 'Testnet Sui', Icon: 'sui', value: 'tsui', }, + tsuiToken: { + Title: 'TSUI Token', + Description: 'Testnet Sui Token', + Icon: 'sui', + value: 'tsuiToken', + }, tbtc: { Title: 'TBTC', Description: 'Testnet Bitcoin', @@ -606,6 +618,7 @@ export const buildUnsignedConsolidationCoins: Record< allCoinMetas.sol, allCoinMetas.solToken, allCoinMetas.sui, + allCoinMetas.suiToken, ], test: [ allCoinMetas.ttrx, @@ -615,6 +628,7 @@ export const buildUnsignedConsolidationCoins: Record< allCoinMetas.tsol, allCoinMetas.tsolToken, allCoinMetas.tsui, + allCoinMetas.tsuiToken, ], }; @@ -656,6 +670,7 @@ export const buildUnsignedSweepCoins: Record< allCoinMetas.hbar, allCoinMetas.algo, allCoinMetas.sui, + allCoinMetas.suiToken, ] as const, test: [ allCoinMetas.tbtc, @@ -684,6 +699,7 @@ export const buildUnsignedSweepCoins: Record< allCoinMetas.talgo, allCoinMetas.tbsc, allCoinMetas.tsui, + allCoinMetas.tsuiToken, ] as const, }; @@ -733,6 +749,7 @@ export const nonBitgoRecoveryCoins: Record = allCoinMetas.hbar, allCoinMetas.algo, allCoinMetas.sui, + allCoinMetas.suiToken, ] as const, test: [ allCoinMetas.tbtc, @@ -771,6 +788,7 @@ export const nonBitgoRecoveryCoins: Record = allCoinMetas.thbar, allCoinMetas.talgo, allCoinMetas.tsui, + allCoinMetas.tsuiToken, ] as const, }; @@ -928,6 +946,10 @@ export const tokenParentCoins = { topethToken: 'topeth', polygonToken: 'polygon', tpolygonToken: 'tpolygon', + suiToken: 'sui', + tsuiToken: 'tsui', + trxToken: 'trx', + ttrxToken: 'ttrx' }; export type EvmCcrNonBitgoCoinConfigType = {