diff --git a/docs/index.md b/docs/index.md index 9f2363ed..1990ee06 100644 --- a/docs/index.md +++ b/docs/index.md @@ -56,6 +56,18 @@ await zetachainCall( All Toolkit capabilities are also exposed through [`zetachain` CLI](https://github.com/zeta-chain/cli). +## Variables + +### suiBrowserOptionsSchema + +> `const` **suiBrowserOptionsSchema**: `ZodObject`\<\{ `chainId`: `ZodEnum`\<\[`"105"`, `"103"`, `"104"`\]\>; `gasLimit`: `ZodOptional`\<`ZodString`\>; `gatewayObject`: `ZodOptional`\<`ZodString`\>; `gatewayPackage`: `ZodOptional`\<`ZodString`\>; `signerAddress`: `ZodOptional`\<`ZodString`\>; \}, `"strip"`, `ZodTypeAny`, \{ `chainId`: `"105"` \| `"103"` \| `"104"`; `gasLimit?`: `string`; `gatewayObject?`: `string`; `gatewayPackage?`: `string`; `signerAddress?`: `string`; \}, \{ `chainId`: `"105"` \| `"103"` \| `"104"`; `gasLimit?`: `string`; `gatewayObject?`: `string`; `gatewayPackage?`: `string`; `signerAddress?`: `string`; \}\> + +*** + +### suiDepositAndCallParamsSchema + +> `const` **suiDepositAndCallParamsSchema**: `ZodObject`\<\{ `amount`: `ZodString`; `receiver`: `ZodString`; `token`: `ZodOptional`\<`ZodString`\>; `types`: `ZodArray`\<`ZodString`, `"many"`\>; `values`: `ZodArray`\<`ZodUnion`\<\[`ZodString`, `ZodBigInt`, `ZodBoolean`\]\>, `"many"`\>; \}, `"strip"`, `ZodTypeAny`, \{ `amount`: `string`; `receiver`: `string`; `token?`: `string`; `types`: `string`[]; `values`: (`string` \| `bigint` \| `boolean`)[]; \}, \{ `amount`: `string`; `receiver`: `string`; `token?`: `string`; `types`: `string`[]; `values`: (`string` \| `bigint` \| `boolean`)[]; \}\> + ## Functions ### evmCall() @@ -331,6 +343,99 @@ Promise that resolves to the transaction receipt *** +### prepareSuiDepositAndCall() + +> **prepareSuiDepositAndCall**(`params`, `options`): `Promise`\<\{ `client`: `SuiJsonRpcClient`; `transaction`: `Transaction`; \}\> + +Prepares a Sui deposit and call transaction for browser wallet signing. + +This function is designed for browser environments where wallet adapters +(like Slush, Sui Wallet, etc.) handle transaction signing. It builds the +same transaction as suiDepositAndCall but returns the unsigned Transaction +object instead of executing it. + +#### Parameters + +##### params + +The deposit and call parameters including amount, receiver, coin type, function types/values + +###### amount + +`string` = `...` + +###### receiver + +`string` = `...` + +###### token? + +`string` = `...` + +###### types + +`string`[] = `...` + +###### values + +(`string` \| `bigint` \| `boolean`)[] = `...` + +##### options + +Configuration options including chain ID, gas limit, gateway settings, and optional signer address + +###### chainId + +`"105"` \| `"103"` \| `"104"` = `...` + +###### gasLimit? + +`string` = `...` + +###### gatewayObject? + +`string` = `...` + +###### gatewayPackage? + +`string` = `...` + +###### signerAddress? + +`string` = `...` + +#### Returns + +`Promise`\<\{ `client`: `SuiJsonRpcClient`; `transaction`: `Transaction`; \}\> + +Object containing the unsigned Transaction and SuiClient + +#### Example + +```typescript +// In a browser with wallet adapter +const { transaction, client } = await prepareSuiDepositAndCall( + { + amount: "0.1", + receiver: "0x123...", + types: ["string"], + values: ["hello"] + }, + { + chainId: "105", + signerAddress: "0xabc..." // Current wallet address + } +); + +// Sign and execute with wallet adapter +const result = await walletAdapter.signAndExecuteTransaction({ + transaction, + options: { showEffects: true } +}); +``` + +*** + ### solanaCall() > **solanaCall**(`params`, `options`): `Promise`\<`string`\> diff --git a/package.json b/package.json index 38e0605a..56281f37 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,11 @@ "import": "./dist/esm/src/chains/solana/index.js", "default": "./dist/cjs/src/chains/solana/index.js" }, + "./chains/sui": { + "types": "./dist/types/src/chains/sui/index.d.ts", + "import": "./dist/esm/src/chains/sui/index.js", + "default": "./dist/cjs/src/chains/sui/index.js" + }, "./tasks": { "types": "./dist/types/packages/tasks/src/index.d.ts", "import": "./dist/esm/packages/tasks/src/index.js", @@ -156,6 +161,8 @@ "@nomiclabs/hardhat-ethers": "^2.2.3", "@openzeppelin/contracts": "^5.0.2", "@openzeppelin/contracts-upgradeable": "^5.0.2", + "@scure/bip32": "^2.0.1", + "@scure/bip39": "^2.0.1", "@solana/wallet-adapter-react": "^0.15.35", "@solana/web3.js": "1.95.8", "@ton/core": "^0.60.1", diff --git a/src/chains/sui/depositAndCall.ts b/src/chains/sui/depositAndCall.ts index 27a75c57..6eb9cb8d 100644 --- a/src/chains/sui/depositAndCall.ts +++ b/src/chains/sui/depositAndCall.ts @@ -3,6 +3,7 @@ import { AbiCoder, ethers } from "ethers"; import { z } from "zod"; import { + chainIds, GAS_BUDGET, getCoin, getSuiGatewayAndClient, @@ -11,35 +12,37 @@ import { } from "../../../utils/sui"; import { validateAndParseSchema } from "../../../utils/validateAndParseSchema"; import { + suiBrowserOptionsSchema, suiDepositAndCallParamsSchema, suiOptionsSchema, } from "../../schemas/sui"; type suiDepositAndCallParams = z.infer; type suiOptions = z.infer; +type suiBrowserOptions = z.infer; /** - * Deposits tokens and makes a cross-chain call from Sui to a universal contract on ZetaChain. + * Builds a Sui deposit and call transaction (shared logic for CLI and browser). * - * This function combines token deposit with a contract call in a single transaction. - * It allows you to transfer tokens from Sui to ZetaChain and immediately - * execute a function call on the universal contract. Supports both native SUI - * and other coin types. - * - * @param params - The deposit and call parameters including amount, receiver, coin type, function types/values - * @param options - Configuration options including chain ID, gas limit, gateway settings, and signer - * @returns Promise that resolves when the transaction is executed + * @internal + * @param validatedParams - Validated deposit and call parameters + * @param validatedOptions - Validated options (either CLI or browser) + * @param signerAddress - Optional signer address (required for non-native tokens) + * @returns Object containing the SuiClient and unsigned Transaction */ -export const suiDepositAndCall = async ( - params: suiDepositAndCallParams, - options: suiOptions -) => { - const validatedParams = validateAndParseSchema( - params, - suiDepositAndCallParamsSchema - ); - const validatedOptions = validateAndParseSchema(options, suiOptionsSchema); - +const buildSuiDepositAndCallTransaction = async ( + validatedParams: z.infer, + validatedOptions: { + chainId: (typeof chainIds)[number]; + gasLimit?: string; + gatewayObject?: string; + gatewayPackage?: string; + }, + signerAddress?: string +): Promise<{ + client: ReturnType["client"]; + transaction: Transaction; +}> => { const { gatewayPackage, gatewayObject, client } = getSuiGatewayAndClient( validatedOptions.chainId, validatedOptions.gatewayPackage, @@ -61,6 +64,7 @@ export const suiDepositAndCall = async ( const payload = tx.pure.vector("u8", payloadBytes); if (!validatedParams.token || validatedParams.token === "0x2::sui::SUI") { + // Native SUI transfer - no need for signerAddress const [splitCoin] = tx.splitCoins(tx.gas, [ toSmallestUnit(validatedParams.amount), ]); @@ -71,9 +75,16 @@ export const suiDepositAndCall = async ( typeArguments: ["0x2::sui::SUI"], }); } else { + // Non-native token transfer - requires signerAddress + if (!signerAddress) { + throw new Error( + "signerAddress is required when transferring non-native tokens" + ); + } + const coinObjectId = await getCoin( client, - validatedOptions.signer.toSuiAddress(), + signerAddress, validatedParams.token ); @@ -90,10 +101,103 @@ export const suiDepositAndCall = async ( tx.setGasBudget(gasBudget); + return { client, transaction: tx }; +}; + +/** + * Deposits tokens and makes a cross-chain call from Sui to a universal contract on ZetaChain. + * + * This function combines token deposit with a contract call in a single transaction. + * It allows you to transfer tokens from Sui to ZetaChain and immediately + * execute a function call on the universal contract. Supports both native SUI + * and other coin types. + * + * @param params - The deposit and call parameters including amount, receiver, coin type, function types/values + * @param options - Configuration options including chain ID, gas limit, gateway settings, and signer + * @returns Promise that resolves when the transaction is executed + */ +export const suiDepositAndCall = async ( + params: suiDepositAndCallParams, + options: suiOptions +) => { + const validatedParams = validateAndParseSchema( + params, + suiDepositAndCallParamsSchema + ); + const validatedOptions = validateAndParseSchema(options, suiOptionsSchema); + + const { client, transaction } = await buildSuiDepositAndCallTransaction( + validatedParams, + validatedOptions, + validatedOptions.signer.toSuiAddress() + ); + + const gasBudget = BigInt(validatedOptions.gasLimit || GAS_BUDGET); + await signAndExecuteTransaction({ client, gasBudget, keypair: validatedOptions.signer, - tx, + tx: transaction, }); }; + +/** + * Prepares a Sui deposit and call transaction for browser wallet signing. + * + * This function is designed for browser environments where wallet adapters + * (like Slush, Sui Wallet, etc.) handle transaction signing. It builds the + * same transaction as suiDepositAndCall but returns the unsigned Transaction + * object instead of executing it. + * + * @param params - The deposit and call parameters including amount, receiver, coin type, function types/values + * @param options - Configuration options including chain ID, gas limit, gateway settings, and optional signer address + * @returns Object containing the unsigned Transaction and SuiClient + * + * @example + * ```typescript + * // In a browser with wallet adapter + * const { transaction, client } = await prepareSuiDepositAndCall( + * { + * amount: "0.1", + * receiver: "0x123...", + * types: ["string"], + * values: ["hello"] + * }, + * { + * chainId: "105", + * signerAddress: "0xabc..." // Current wallet address + * } + * ); + * + * // Sign and execute with wallet adapter + * const result = await walletAdapter.signAndExecuteTransaction({ + * transaction, + * options: { showEffects: true } + * }); + * ``` + */ +export const prepareSuiDepositAndCall = async ( + params: suiDepositAndCallParams, + options: suiBrowserOptions +): Promise<{ + client: ReturnType["client"]; + transaction: Transaction; +}> => { + const validatedParams = validateAndParseSchema( + params, + suiDepositAndCallParamsSchema + ); + const validatedOptions = validateAndParseSchema( + options, + suiBrowserOptionsSchema + ); + + const { client, transaction } = await buildSuiDepositAndCallTransaction( + validatedParams, + validatedOptions, + validatedOptions.signerAddress + ); + + return { client, transaction }; +}; diff --git a/src/chains/sui/index.ts b/src/chains/sui/index.ts index 105234b2..4be1ea5c 100644 --- a/src/chains/sui/index.ts +++ b/src/chains/sui/index.ts @@ -1,2 +1,6 @@ +export { + suiBrowserOptionsSchema, + suiDepositAndCallParamsSchema, +} from "../../schemas/sui"; export * from "./deposit"; export * from "./depositAndCall"; diff --git a/src/schemas/sui.ts b/src/schemas/sui.ts index 03d5effa..209dce59 100644 --- a/src/schemas/sui.ts +++ b/src/schemas/sui.ts @@ -11,6 +11,15 @@ export const suiOptionsSchema = z.object({ signer: z.instanceof(Ed25519Keypair), }); +// Browser-friendly schema without Ed25519Keypair requirement +export const suiBrowserOptionsSchema = z.object({ + chainId: z.enum(chainIds), + gasLimit: z.string().optional(), + gatewayObject: z.string().optional(), + gatewayPackage: z.string().optional(), + signerAddress: z.string().optional(), // Optional: only needed for non-native token transfers +}); + export const suiDepositParamsSchema = z.object({ amount: z.string(), receiver: z.string(), diff --git a/test/addressResolver.test.ts b/test/addressResolver.test.ts index a6fa6352..c91aaaed 100644 --- a/test/addressResolver.test.ts +++ b/test/addressResolver.test.ts @@ -27,18 +27,18 @@ jest.mock("../utils/keyPaths", () => ({ getAccountKeyPath: jest.fn().mockReturnValue("/mock/path/account.json"), })); -jest.mock("../utils/accounts", () => ({ +jest.mock("../utils/getAccountData", () => ({ accountExists: jest.fn(), getAccountData: jest.fn(), })); -import { accountExists, getAccountData } from "../utils/accounts"; import { resolveBitcoinAddress, resolveEvmAddress, resolveSolanaAddress, } from "../utils/addressResolver"; import { safeExists, safeReadFile } from "../utils/fsUtils"; +import { accountExists, getAccountData } from "../utils/getAccountData"; // Sample addresses for testing const VALID_EVM_ADDRESS = "0x71C7656EC7ab88b098defB751B7401B5f6d8976F"; diff --git a/utils/accounts.ts b/utils/accounts.ts index 87d7cf63..7f62f814 100644 --- a/utils/accounts.ts +++ b/utils/accounts.ts @@ -1,3 +1,4 @@ +import * as ecc from "@bitcoinerlab/secp256k1"; import confirm from "@inquirer/confirm"; import { decodeSuiPrivateKey } from "@mysten/sui/cryptography"; import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519"; @@ -11,18 +12,12 @@ import bs58 from "bs58"; import ECPairFactory from "ecpair"; import { ethers } from "ethers"; import path from "path"; -import * as ecc from "tiny-secp256k1"; import { AccountData, accountDataSchema, AccountInfo, AvailableAccountTypes, - BitcoinAccountData, - EVMAccountData, - SolanaAccountData, - SuiAccountData, - TONAccountData, } from "../types/accounts.types"; import { safeExists, @@ -47,35 +42,6 @@ export const accountExists = ( return safeExists(keyPath); }; -/** - * Get account data by account name and type - * @typeparam T The expected account data type - */ -export const getAccountData = < - T extends - | EVMAccountData - | SolanaAccountData - | BitcoinAccountData - | SuiAccountData - | TONAccountData ->( - accountType: (typeof AvailableAccountTypes)[number], - accountName: string -): T | undefined => { - const keyPath = getAccountKeyPath(accountType, accountName); - - if (!safeExists(keyPath)) { - return undefined; - } - - try { - const keyData = parseJson(safeReadFile(keyPath), accountDataSchema); - return keyData as T; - } catch { - return undefined; - } -}; - const createEVMAccount = (privateKey?: string): AccountData => { const wallet = privateKey ? new ethers.Wallet(privateKey) diff --git a/utils/addressResolver.ts b/utils/addressResolver.ts index 8c2d227d..57ca81dd 100644 --- a/utils/addressResolver.ts +++ b/utils/addressResolver.ts @@ -11,7 +11,7 @@ import { TONAccountData, } from "../types/accounts.types"; import { DEFAULT_ACCOUNT_NAME } from "../types/shared.constants"; -import { accountExists, getAccountData } from "./accounts"; +import { accountExists, getAccountData } from "./getAccountData"; /** * Check if a string is a valid EVM address diff --git a/utils/bitcoin.command.helpers.ts b/utils/bitcoin.command.helpers.ts index 66584a9f..86c01503 100644 --- a/utils/bitcoin.command.helpers.ts +++ b/utils/bitcoin.command.helpers.ts @@ -18,7 +18,7 @@ import { } from "../types/bitcoin.constants"; import { formatEncodingChoices } from "../types/bitcoin.types"; import { DEFAULT_ACCOUNT_NAME } from "../types/shared.constants"; -import { getAccountData } from "./accounts"; +import { getAccountData } from "./getAccountData"; import { handleError } from "./handleError"; export interface BitcoinKeyPair { address: string; diff --git a/utils/evm.command.helpers.ts b/utils/evm.command.helpers.ts index 7ef04aff..24cedc48 100644 --- a/utils/evm.command.helpers.ts +++ b/utils/evm.command.helpers.ts @@ -10,9 +10,9 @@ import { evmPrivateKeySchema, numericStringSchema, } from "../types/shared.schema"; -import { getAccountData } from "./accounts"; import { hasSufficientBalanceEvm } from "./balances"; import { getRpcUrl } from "./chains"; +import { getAccountData } from "./getAccountData"; import { handleError } from "./handleError"; export const baseEvmOptionsSchema = z.object({ diff --git a/utils/getAccountData.ts b/utils/getAccountData.ts new file mode 100644 index 00000000..d41a125c --- /dev/null +++ b/utils/getAccountData.ts @@ -0,0 +1,52 @@ +import { + accountDataSchema, + AvailableAccountTypes, + BitcoinAccountData, + EVMAccountData, + SolanaAccountData, + SuiAccountData, + TONAccountData, +} from "../types/accounts.types"; +import { safeExists, safeReadFile } from "./fsUtils"; +import { getAccountKeyPath } from "./keyPaths"; +import { parseJson } from "./parseJson"; + +/** + * Check if an account exists by name and type + */ +export const accountExists = ( + accountType: (typeof AvailableAccountTypes)[number], + accountName?: string +): boolean => { + if (!accountName) return false; + const keyPath = getAccountKeyPath(accountType, accountName); + return safeExists(keyPath); +}; + +/** + * Get account data by name and type + */ +export const getAccountData = < + T extends + | EVMAccountData + | SolanaAccountData + | BitcoinAccountData + | SuiAccountData + | TONAccountData +>( + accountType: (typeof AvailableAccountTypes)[number], + accountName: string +): T | undefined => { + const keyPath = getAccountKeyPath(accountType, accountName); + + if (!safeExists(keyPath)) { + return undefined; + } + + try { + const keyData = parseJson(safeReadFile(keyPath), accountDataSchema); + return keyData as T; + } catch { + return undefined; + } +}; diff --git a/utils/solana.commands.helpers.ts b/utils/solana.commands.helpers.ts index 08ffe4d4..c4bd8723 100644 --- a/utils/solana.commands.helpers.ts +++ b/utils/solana.commands.helpers.ts @@ -19,7 +19,7 @@ import { typesAndValuesLengthRefineRule, } from "../types/shared.schema"; import { handleError } from "./"; -import { getAccountData } from "./accounts"; +import { getAccountData } from "./getAccountData"; import { trim0x } from "./trim0x"; export const baseSolanaOptionsSchema = z.object({ diff --git a/utils/solana.keypair.helpers.ts b/utils/solana.keypair.helpers.ts index fce4c618..d16bcb2c 100644 --- a/utils/solana.keypair.helpers.ts +++ b/utils/solana.keypair.helpers.ts @@ -4,7 +4,7 @@ import bs58 from "bs58"; import { SolanaAccountData } from "../types/accounts.types"; import { hexStringSchema } from "../types/shared.schema"; -import { getAccountData } from "./accounts"; +import { getAccountData } from "./getAccountData"; import { handleError } from "./handleError"; import { trim0x } from "./trim0x"; diff --git a/utils/sui.ts b/utils/sui.ts index 967e694f..a339f1c4 100644 --- a/utils/sui.ts +++ b/utils/sui.ts @@ -1,14 +1,14 @@ import { getFullnodeUrl, SuiClient } from "@mysten/sui/client"; import { Ed25519Keypair } from "@mysten/sui/keypairs/ed25519"; import { Transaction } from "@mysten/sui/transactions"; +import { HDKey } from "@scure/bip32"; +import { mnemonicToSeedSync } from "@scure/bip39"; import { bech32 } from "bech32"; -import { mnemonicToSeedSync } from "bip39"; -import { HDKey } from "ethereum-cryptography/hdkey"; import { z } from "zod"; import { SuiAccountData } from "../types/accounts.types"; import { suiGatewayAddressSchema } from "../types/shared.schema"; -import { getAccountData } from "./accounts"; +import { getAccountData } from "./getAccountData"; import { getAddress } from "./getAddress"; import { validateAndParseSchema } from "./validateAndParseSchema"; diff --git a/utils/ton.command.helpers.ts b/utils/ton.command.helpers.ts index 546bc3e1..b0fc05a3 100644 --- a/utils/ton.command.helpers.ts +++ b/utils/ton.command.helpers.ts @@ -5,7 +5,7 @@ import { Command, Option } from "commander"; import { TONAccountData } from "../types/accounts.types"; import { DEFAULT_ACCOUNT_NAME } from "../types/shared.constants"; import { DEFAULT_ENDPOINT } from "../types/ton.constants"; -import { getAccountData } from "./accounts"; +import { getAccountData } from "./getAccountData"; import { getAddress } from "./getAddress"; import { handleError } from "./handleError"; diff --git a/utils/zetachain.command.helpers.ts b/utils/zetachain.command.helpers.ts index 3dbca8c8..3abb8a20 100644 --- a/utils/zetachain.command.helpers.ts +++ b/utils/zetachain.command.helpers.ts @@ -14,8 +14,8 @@ import { numericStringSchema, rpcOrChainIdRefineRule, } from "../types/shared.schema"; -import { getAccountData } from "./accounts"; import { getRpcUrl } from "./chains"; +import { getAccountData } from "./getAccountData"; import { handleError } from "./handleError"; import { toHexString } from "./toHexString"; diff --git a/yarn.lock b/yarn.lock index f95ad877..4bae5500 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1382,6 +1382,13 @@ dependencies: "@noble/hashes" "1.8.0" +"@noble/curves@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-2.0.1.tgz#64ba8bd5e8564a02942655602515646df1cdb3ad" + integrity sha512-vs1Az2OOTBiP4q0pwjW5aF0xp9n4MxVrmkFBxc6EKZc6ddYx5gaZiAsZoq0uRRXWbi3AT/sBqn05eRPtn1JCPw== + dependencies: + "@noble/hashes" "2.0.1" + "@noble/curves@=1.9.4": version "1.9.4" resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.9.4.tgz#a748c6837ee7854a558cc3b951aedd87a5e7d6a5" @@ -1428,6 +1435,11 @@ resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz#cee43d801fcef9644b11b8194857695acd5f815a" integrity sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A== +"@noble/hashes@2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-2.0.1.tgz#fc1a928061d1232b0a52bb754393c37a5216c89e" + integrity sha512-XlOlEbQcE9fmuXxrVTXCTlG2nlRXa9Rj3rr5Ue/+tX+nmkgbX720YHh0VR3hBF9xDvwnb8D2shVGOwNx+ulArw== + "@noble/secp256k1@1.7.1": version "1.7.1" resolved "https://registry.npmjs.org/@noble/secp256k1/-/secp256k1-1.7.1.tgz#b251c70f824ce3ca7f8dc3df08d58f005cc0507c" @@ -1777,6 +1789,11 @@ dependencies: abitype "^1.0.2" +"@scure/base@2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@scure/base/-/base-2.0.0.tgz#ba6371fddf92c2727e88ad6ab485db6e624f9a98" + integrity sha512-3E1kpuZginKkek01ovG8krQ0Z44E3DHPjc5S2rjJw9lZn3KSQOs8S7wqikF/AH7iRanHypj85uGyxk0XAyC37w== + "@scure/base@^1.2.6", "@scure/base@~1.2.5": version "1.2.6" resolved "https://registry.npmjs.org/@scure/base/-/base-1.2.6.tgz#ca917184b8231394dd8847509c67a0be522e59f6" @@ -1814,6 +1831,15 @@ "@noble/hashes" "~1.8.0" "@scure/base" "~1.2.5" +"@scure/bip32@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@scure/bip32/-/bip32-2.0.1.tgz#4ceea207cee8626d3fe8f0b6ab68b6af8f81c482" + integrity sha512-4Md1NI5BzoVP+bhyJaY3K6yMesEFzNS1sE/cP+9nuvE7p/b0kx9XbpDHHFl8dHtufcbdHRUUQdRqLIPHN/s7yA== + dependencies: + "@noble/curves" "2.0.1" + "@noble/hashes" "2.0.1" + "@scure/base" "2.0.0" + "@scure/bip39@1.1.1": version "1.1.1" resolved "https://registry.npmjs.org/@scure/bip39/-/bip39-1.1.1.tgz#b54557b2e86214319405db819c4b6a370cf340c5" @@ -1838,6 +1864,14 @@ "@noble/hashes" "~1.8.0" "@scure/base" "~1.2.5" +"@scure/bip39@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@scure/bip39/-/bip39-2.0.1.tgz#47a6dc15e04faf200041239d46ae3bb7c3c96add" + integrity sha512-PsxdFj/d2AcJcZDX1FXN3dDgitDDTmwf78rKZq1a6c1P1Nan1X/Sxc7667zU3U+AN60g7SxxP0YCVw2H/hBycg== + dependencies: + "@noble/hashes" "2.0.1" + "@scure/base" "2.0.0" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.npmjs.org/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3"