From d78ca0bdd9544286a2f9315227bf48e3bdc86e5a Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Thu, 8 Oct 2026 09:20:41 +0000 Subject: [PATCH 01/25] OKX Wallet connects Solana Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- packages/wallet-extensions/src/okx/helpers.ts | 12 ++++++++++++ packages/wallet-extensions/src/okx/index.ts | 2 ++ packages/wallet-extensions/src/types.ts | 1 + 3 files changed, 15 insertions(+) diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 22ddc805..34274ed0 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -131,6 +131,18 @@ export async function getWalletMethods(chain: Chain): Promise { + if (!(window.okxwallet && "solana" in window.okxwallet)) { + throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Solana }); + } + + const { getSolanaToolbox } = await import("@swapkit/toolboxes/solana"); + const provider = window.okxwallet.solana; + const { publicKey } = await provider.connect(); + const toolbox = getSolanaToolbox({ signer: provider }); + + return { ...toolbox, address: publicKey.toString() }; + }) .with(Chain.Cosmos, async () => { if (!(window.okxwallet && "keplr" in window.okxwallet)) { throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cosmos }); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 52db6fc8..35ca273f 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -31,6 +31,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ [Chain.Monad]: true, [Chain.Optimism]: true, [Chain.Polygon]: true, + [Chain.Solana]: true, [Chain.Tron]: true, [Chain.XLayer]: true, // [Chain.Aptos]: blocked on toolbox @@ -52,6 +53,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ // Chain.Near, Chain.Optimism, Chain.Polygon, + Chain.Solana, Chain.XLayer, Chain.Tron, ], diff --git a/packages/wallet-extensions/src/types.ts b/packages/wallet-extensions/src/types.ts index 9e8720da..cffe37f6 100644 --- a/packages/wallet-extensions/src/types.ts +++ b/packages/wallet-extensions/src/types.ts @@ -129,6 +129,7 @@ declare global { ) => Promise; getOfflineSignerOnlyAmino: (chainId: string) => OfflineAminoSigner; }; + solana: SolanaProvider; near: NearBrowserWalletProvider & { requestSignIn: (params?: { contractId?: string; From b9eeb6be2166682f7905aca4d615f1c7e3b8c512 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Thu, 8 Oct 2026 09:21:14 +0000 Subject: [PATCH 02/25] OKX Wallet connects Starknet Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- packages/wallet-extensions/src/okx/helpers.ts | 17 +++++++++++++++++ packages/wallet-extensions/src/okx/index.ts | 2 ++ packages/wallet-extensions/src/types.ts | 12 ++++++++++++ 3 files changed, 31 insertions(+) diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 34274ed0..10bc1b77 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -143,6 +143,23 @@ export async function getWalletMethods(chain: Chain): Promise { + if (!(window.okxwallet && "starknet" in window.okxwallet)) { + throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Starknet }); + } + + const { getStarknetToolbox } = await import("@swapkit/toolboxes/starknet"); + const { account, enable } = window.okxwallet.starknet; + const [address] = await enable(); + + if (!address) { + throw new SwapKitError("wallet_okx_no_accounts", { chain: Chain.Starknet }); + } + + const toolbox = getStarknetToolbox({ signer: account }); + + return { ...toolbox, address: account.address }; + }) .with(Chain.Cosmos, async () => { if (!(window.okxwallet && "keplr" in window.okxwallet)) { throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cosmos }); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 35ca273f..164bf887 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -32,6 +32,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ [Chain.Optimism]: true, [Chain.Polygon]: true, [Chain.Solana]: true, + [Chain.Starknet]: true, [Chain.Tron]: true, [Chain.XLayer]: true, // [Chain.Aptos]: blocked on toolbox @@ -54,6 +55,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ Chain.Optimism, Chain.Polygon, Chain.Solana, + Chain.Starknet, Chain.XLayer, Chain.Tron, ], diff --git a/packages/wallet-extensions/src/types.ts b/packages/wallet-extensions/src/types.ts index cffe37f6..499d1646 100644 --- a/packages/wallet-extensions/src/types.ts +++ b/packages/wallet-extensions/src/types.ts @@ -6,11 +6,22 @@ import type { EthereumWindowProvider } from "@swapkit/helpers"; // replacing the @cosmjs ones — type the handles with those. import type { OfflineAminoSigner, OfflineDirectSigner } from "@swapkit/toolboxes/cosmos"; import type { SolanaProvider } from "@swapkit/toolboxes/solana"; +import type { StarknetToolboxParams } from "@swapkit/toolboxes/starknet"; import type { SubstrateInjectedExtension } from "@swapkit/toolboxes/substrate"; import type { Eip1193Provider } from "ethers"; import type { NearBrowserWalletProvider } from "./helpers/near"; import type { TronLinkWindow } from "./tronlink"; +type StarknetAccount = StarknetToolboxParams extends infer Params + ? Params extends { signer?: infer Signer } + ? unknown extends Signer + ? never + : NonNullable + : never + : never; + +export type OkxStarknetProvider = { account: StarknetAccount; enable: () => Promise }; + type UnisatToSignInputs = { index: number; sighashTypes?: number[]; disableTweakSigner?: boolean } & ( | { address: string } | { publicKey: string } @@ -130,6 +141,7 @@ declare global { getOfflineSignerOnlyAmino: (chainId: string) => OfflineAminoSigner; }; solana: SolanaProvider; + starknet: OkxStarknetProvider; near: NearBrowserWalletProvider & { requestSignIn: (params?: { contractId?: string; From 1ce4df7bdabb261662b52463daefc30d8f3c4aca Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Thu, 8 Oct 2026 09:22:08 +0000 Subject: [PATCH 03/25] OKX Wallet connects Cardano Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- bun.lock | 180 +++++++++++------- packages/wallet-extensions/package.json | 2 + packages/wallet-extensions/src/okx/cardano.ts | 49 +++++ packages/wallet-extensions/src/okx/helpers.ts | 4 + packages/wallet-extensions/src/okx/index.ts | 2 + packages/wallet-extensions/src/types.ts | 7 + 6 files changed, 174 insertions(+), 70 deletions(-) create mode 100644 packages/wallet-extensions/src/okx/cardano.ts diff --git a/bun.lock b/bun.lock index 38627d37..f0209b92 100644 --- a/bun.lock +++ b/bun.lock @@ -30,7 +30,7 @@ }, "packages/sdk": { "name": "@swapkit/sdk", - "version": "5.0.1", + "version": "5.1.1", "dependencies": { "@stricahq/typhonjs": "~3.0.1", "@swapkit/core": "^5.2.1", @@ -46,7 +46,7 @@ }, "packages/wallet-extensions": { "name": "@swapkit/wallet-extensions", - "version": "4.6.4", + "version": "4.6.5", "dependencies": { "@aptos-labs/ts-sdk": "~1.34.0", "@cosmjs/amino": "~0.37.0", @@ -58,6 +58,7 @@ "@near-js/transactions": "~2.5.0", "@scure/base": "~2.2.0", "@solana/web3.js": "~1.98.4", + "@stricahq/cbors": "~1.0.4", "@swapkit/helpers": "^6.1.1", "@swapkit/toolboxes": "^6.2.0", "@swapkit/utxo-signer": "^3.1.1", @@ -79,6 +80,7 @@ "@near-js/transactions": "2.5.0", "@scure/base": "2.2.0", "@solana/web3.js": "1.98.4", + "@stricahq/cbors": "1.0.4", "@wallet-standard/app": "1.1.1", "cosmjs-types": "0.10.1", "ethers": "6.16.0", @@ -88,7 +90,7 @@ }, "packages/wallet-hardware": { "name": "@swapkit/wallet-hardware", - "version": "5.0.1", + "version": "6.0.1", "dependencies": { "@cosmjs/amino": "~0.37.0", "@cosmjs/crypto": "0.37.0", @@ -156,7 +158,7 @@ }, "packages/wallet-mobile": { "name": "@swapkit/wallet-mobile", - "version": "4.3.27", + "version": "4.3.28", "dependencies": { "@swapkit/helpers": "^6.1.1", "@swapkit/toolboxes": "^6.2.0", @@ -165,7 +167,7 @@ }, "packages/wallets": { "name": "@swapkit/wallets", - "version": "5.0.1", + "version": "5.1.1", "dependencies": { "@coinbase/wallet-sdk": "~4.3.7", "@cosmjs/amino": "~0.37.0", @@ -668,7 +670,7 @@ "@near-js/accounts": ["@near-js/accounts@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/keystores": "2.5.1", "@near-js/providers": "2.5.1", "@near-js/signers": "2.5.1", "@near-js/tokens": "2.5.1", "@near-js/transactions": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0", "depd": "2.0.0", "is-my-json-valid": "^2.20.6", "lru_map": "0.4.1", "near-abi": "0.2.0" } }, "sha512-L4/Z9Ujwnz8/uvOExESP6h0t/plu4/0SFrL+UJBnfO5LObVwnJH2KG6MCLONy8rKh1FZHOlT9LPhtG/6nUrvOQ=="], - "@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + "@near-js/crypto": ["@near-js/crypto@2.5.0", "", { "dependencies": { "@near-js/types": "2.5.0", "@near-js/utils": "2.5.0", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-bsMCasnjRne9j0u5DuKeO0/xwS49GgRrVxzmW9WRZ7yWWh0U8IidTxNHTL1QCDFJNwwzt9HDnuj8XeVhlpixww=="], "@near-js/keystores": ["@near-js/keystores@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1" } }, "sha512-UlP3GXeDzRyUlL3qKZUkwSwbABDarhOqRRR0vcMBOOu+063GDULGio9GTWDvKDDi11nmfbhOzbiY5vXEW4jR8g=="], @@ -682,7 +684,7 @@ "@near-js/tokens": ["@near-js/tokens@2.5.1", "", {}, "sha512-doDtOaSA2FOsYzzwocg0L02z6ORNL7HFAuL455y2O38//F4C2jp+C9De9fWrItkrim2jKjoSR3UvO2AuVbwmWA=="], - "@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], + "@near-js/transactions": ["@near-js/transactions@2.5.0", "", { "dependencies": { "@near-js/crypto": "2.5.0", "@near-js/types": "2.5.0", "@near-js/utils": "2.5.0", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-gVhWS4T5VcLjyVaW8nxWxK7kcgbGgyJ0YVS+VmaFzQbSZKuYgNnQXxynTycFc34awTNbp3a4/MqAd8RgX9VIcg=="], "@near-js/types": ["@near-js/types@2.5.1", "", {}, "sha512-lUJJmbV6qcilIwswldeP7FIjkjTWvmtgI+yQHVmiBNRVjYvPMiQ/e9vs3SXE/cYtRluAdq0JHJwYoqhFb69mwA=="], @@ -2702,16 +2704,12 @@ "@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@cosmjs/proto-signing/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], - "@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], "@cosmjs/socket/isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], "@cosmjs/socket/ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], - "@cosmjs/stargate/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], - "@cosmjs/tendermint-rpc/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -2864,12 +2862,22 @@ "@mysten/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@near-js/accounts/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + + "@near-js/accounts/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], + "@near-js/accounts/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@near-js/crypto/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + + "@near-js/crypto/@near-js/utils": ["@near-js/utils@2.5.0", "", { "dependencies": { "@near-js/types": "2.5.0", "@scure/base": "^1.2.4", "depd": "2.0.0", "mustache": "4.0.0" } }, "sha512-hifdeZVzV9TFcgLNekRVVnB6q7zxdCQPmC9cybT1SjfeiIP/5jPabOZXGWNJPSloRcrTMluCTtaWinIw1HXanQ=="], + "@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], "@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@near-js/keystores/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + "@near-js/keystores-browser/@near-js/crypto": ["@near-js/crypto@1.2.1", "", { "dependencies": { "@near-js/types": "0.0.4", "@near-js/utils": "0.1.0", "@noble/curves": "1.2.0", "bn.js": "5.2.1", "borsh": "1.0.0", "randombytes": "2.1.0" } }, "sha512-iJOHaGKvdudYfR8nEtRhGlgcTEHeVmxMoT0JVXmuP3peG96v/sSnA03CE6MZBeCC8txKAQOffagxE7oU6hJp9g=="], "@near-js/keystores-browser/@near-js/keystores": ["@near-js/keystores@0.0.9", "", { "dependencies": { "@near-js/crypto": "1.2.1", "@near-js/types": "0.0.4" } }, "sha512-j8ySgVEcm2Gg6zxkSdadNtPlIqhJZdPGfWWM3tPtEoowNS9snhwZn5NRFPrgmX0+MzpF7E091CRcY90MvRVhsg=="], @@ -2878,10 +2886,22 @@ "@near-js/keystores-node/@near-js/keystores": ["@near-js/keystores@0.0.9", "", { "dependencies": { "@near-js/crypto": "1.2.1", "@near-js/types": "0.0.4" } }, "sha512-j8ySgVEcm2Gg6zxkSdadNtPlIqhJZdPGfWWM3tPtEoowNS9snhwZn5NRFPrgmX0+MzpF7E091CRcY90MvRVhsg=="], + "@near-js/providers/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + + "@near-js/providers/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], + "@near-js/providers/node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], + "@near-js/signers/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + + "@near-js/signers/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], + "@near-js/signers/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@near-js/transactions/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], + + "@near-js/transactions/@near-js/utils": ["@near-js/utils@2.5.0", "", { "dependencies": { "@near-js/types": "2.5.0", "@scure/base": "^1.2.4", "depd": "2.0.0", "mustache": "4.0.0" } }, "sha512-hifdeZVzV9TFcgLNekRVVnB6q7zxdCQPmC9cybT1SjfeiIP/5jPabOZXGWNJPSloRcrTMluCTtaWinIw1HXanQ=="], + "@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], "@near-js/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], @@ -3184,6 +3204,12 @@ "@swapkit/cosmos-signer/cosmjs-types": ["cosmjs-types@0.11.0", "", {}, "sha512-kDSkgHpRTrg1413jCNehT3P21+EBxZWFMBr9JEzVfmPiNdtuwAoLAkCYo7c7i/pTakAwyHsXbxOg8kkD+AN33w=="], + "@swapkit/plugins/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], + + "@swapkit/toolboxes/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + + "@swapkit/toolboxes/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], + "@swapkit/toolboxes/@stricahq/typhonjs": ["@stricahq/typhonjs@3.1.0", "", { "dependencies": { "@stricahq/cbors": "1.0.2", "bech32": "^2.0.0", "bignumber.js": "^9.0.1", "blakejs": "^1.2.1", "bs58": "^5.0.0", "buffer": "^6.0.3", "lodash": "^4.17.21" } }, "sha512-Eaw0qqNIz+6sA9zD/9pFCdQ+gNbCv8PKFMhXu4Vq6KSR1XsH40jNPFkrqgKaq8q+gbO569U1+tu41dHk40JNbw=="], "@swapkit/toolboxes/cosmjs-types": ["cosmjs-types@0.11.0", "", {}, "sha512-kDSkgHpRTrg1413jCNehT3P21+EBxZWFMBr9JEzVfmPiNdtuwAoLAkCYo7c7i/pTakAwyHsXbxOg8kkD+AN33w=="], @@ -3196,6 +3222,10 @@ "@swapkit/ui/@cosmjs/stargate": ["@cosmjs/stargate@0.39.0", "", { "dependencies": { "@cosmjs/amino": "^0.39.0", "@cosmjs/encoding": "^0.39.0", "@cosmjs/math": "^0.39.0", "@cosmjs/proto-signing": "^0.39.0", "@cosmjs/stream": "^0.39.0", "@cosmjs/tendermint-rpc": "^0.39.0", "@cosmjs/utils": "^0.39.0", "cosmjs-types": "^0.11.0" } }, "sha512-dQtucU9czF2NUUbEKs19PMfv+EusDFKWHMVK6Hinytmpq9sdk5JUIln+g/8k+UjKcV4HPv6S0AywbhE+tl84kQ=="], + "@swapkit/ui/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + + "@swapkit/ui/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], + "@swapkit/ui/@stricahq/typhonjs": ["@stricahq/typhonjs@3.1.0", "", { "dependencies": { "@stricahq/cbors": "1.0.2", "bech32": "^2.0.0", "bignumber.js": "^9.0.1", "blakejs": "^1.2.1", "bs58": "^5.0.0", "buffer": "^6.0.3", "lodash": "^4.17.21" } }, "sha512-Eaw0qqNIz+6sA9zD/9pFCdQ+gNbCv8PKFMhXu4Vq6KSR1XsH40jNPFkrqgKaq8q+gbO569U1+tu41dHk40JNbw=="], "@swapkit/ui/@swapkit/core": ["@swapkit/core@4.6.4", "", { "dependencies": { "@swapkit/helpers": "4.20.1", "@swapkit/plugins": "4.7.4", "@swapkit/toolboxes": "4.28.0", "@swapkit/wallet-core": "4.3.21" }, "peerDependencies": { "@stricahq/typhonjs": "3.1.0", "@ton/core": "0.63.1", "cosmjs-types": "0.11.0", "ts-pattern": "5.9.0" } }, "sha512-0nwvzI7dOy9uieMXcJzTGe6DuQRurmj6DKV4+A4nYT2Me0OOFnfgxSJ+O2Z3qa4Z/KyO47mfOuHKmSXLKEwlLg=="], @@ -3214,18 +3244,8 @@ "@swapkit/ui/react-dom": ["react-dom@19.1.1", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.1" } }, "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw=="], - "@swapkit/wallet-extensions/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], - - "@swapkit/wallet-extensions/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-cCUfejHOfjx6L/noF9QnXIy4dKoTKl56NFIqz2cizx+kZKszdL0yOtQlu0dD9nR+uMafRHU7aok6v5HH4RZIDw=="], - "@swapkit/wallet-extensions/@cosmjs/stargate": ["@cosmjs/stargate@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/proto-signing": "^0.37.1", "@cosmjs/stream": "^0.37.1", "@cosmjs/tendermint-rpc": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-nQgaJB7A81cRYtmDrcIySq8hbd+QLXJTGFEs6R1xMdxascaABX0x86nS44ALk+EZojQQRnwupOsw1dKLlQmIFg=="], - "@swapkit/wallet-hardware/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], - - "@swapkit/wallets/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], - - "@swapkit/wallets/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-cCUfejHOfjx6L/noF9QnXIy4dKoTKl56NFIqz2cizx+kZKszdL0yOtQlu0dD9nR+uMafRHU7aok6v5HH4RZIDw=="], - "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@ton/ton/axios": ["axios@1.15.0", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q=="], @@ -3540,8 +3560,6 @@ "@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], - "@cosmjs/tendermint-rpc/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], "@cosmjs/tendermint-rpc/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], @@ -3644,6 +3662,12 @@ "@mysten/sui/@scure/bip32/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@near-js/accounts/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@near-js/accounts/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@near-js/crypto/@near-js/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], "@near-js/keystores-browser/@near-js/crypto/@near-js/types": ["@near-js/types@0.0.4", "", { "dependencies": { "bn.js": "5.2.1" } }, "sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg=="], @@ -3666,6 +3690,22 @@ "@near-js/keystores-node/@near-js/keystores/@near-js/types": ["@near-js/types@0.0.4", "", { "dependencies": { "bn.js": "5.2.1" } }, "sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg=="], + "@near-js/keystores/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@near-js/keystores/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@near-js/providers/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@near-js/providers/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@near-js/providers/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@near-js/signers/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@near-js/signers/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@near-js/transactions/@near-js/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@near-js/wallet-account/@near-js/accounts/@near-js/providers": ["@near-js/providers@0.1.1", "", { "dependencies": { "@near-js/transactions": "1.1.2", "@near-js/types": "0.0.4", "@near-js/utils": "0.1.0", "bn.js": "5.2.1", "borsh": "1.0.0", "http-errors": "1.7.2" }, "optionalDependencies": { "node-fetch": "2.6.7" } }, "sha512-0M/Vz2Ac34ShKVoe2ftVJ5Qg4eSbEqNXDbCDOdVj/2qbLWZa7Wpe+me5ei4TMY2ZhGdawhgJUPrYwdJzOCyf8w=="], "@near-js/wallet-account/@near-js/accounts/near-abi": ["near-abi@0.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.11" } }, "sha512-RVDI8O+KVxRpC3KycJ1bpfVj9Zv+xvq9PlW1yIFl46GhrnLw83/72HqHGjGDjQ8DtltkcpSjY9X3YIGZ+1QyzQ=="], @@ -3900,6 +3940,16 @@ "@swapkit/core/@stricahq/typhonjs/@stricahq/cbors": ["@stricahq/cbors@1.0.2", "", { "dependencies": { "bignumber.js": "^9.0.2", "buffer": "^6.0.3" } }, "sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww=="], + "@swapkit/plugins/@near-js/transactions/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], + + "@swapkit/plugins/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@swapkit/toolboxes/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@swapkit/toolboxes/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@swapkit/toolboxes/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@swapkit/toolboxes/@stricahq/typhonjs/@stricahq/cbors": ["@stricahq/cbors@1.0.2", "", { "dependencies": { "bignumber.js": "^9.0.2", "buffer": "^6.0.3" } }, "sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww=="], "@swapkit/ui/@cosmjs/amino/@cosmjs/encoding": ["@cosmjs/encoding@0.39.0", "", { "dependencies": { "@scure/base": "^2.0.0", "base64-js": "^1.3.0", "readonly-date-esm": "^2.0.0" } }, "sha512-+poEaeM8YjGNVtrHLQNWqkhEeDxapjrdpnPCT+JCRh8YNbeHEdftzZLCH5VCBSOtvo7PF0gK1B7sbQbBl6q5pQ=="], @@ -3932,6 +3982,12 @@ "@swapkit/ui/@cosmjs/stargate/@cosmjs/utils": ["@cosmjs/utils@0.39.0", "", {}, "sha512-h7fy7Tbcl9v8ABntp8+kqw2VmUus2HbnRJFyzTkM7byRktLtECHYNMsztwyl1rdHkzc8Nc2xs6K/56d7a+75aw=="], + "@swapkit/ui/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + + "@swapkit/ui/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@swapkit/ui/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@swapkit/ui/@stricahq/typhonjs/@stricahq/cbors": ["@stricahq/cbors@1.0.2", "", { "dependencies": { "bignumber.js": "^9.0.2", "buffer": "^6.0.3" } }, "sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww=="], "@swapkit/ui/@swapkit/core/@swapkit/wallet-core": ["@swapkit/wallet-core@4.3.21", "", { "dependencies": { "@swapkit/helpers": "4.20.1" } }, "sha512-88zNmn14D9oBWuzDuzWv0Lz5s67UalK9CWR5poVtxEmVep0KxWnxgpITnSi1oHkzRmdF7UPt2OmwFxAXTKPdsw=="], @@ -3950,15 +4006,9 @@ "@swapkit/ui/react-dom/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], - "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], - - "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], - - "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], - "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], - - "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-cCUfejHOfjx6L/noF9QnXIy4dKoTKl56NFIqz2cizx+kZKszdL0yOtQlu0dD9nR+uMafRHU7aok6v5HH4RZIDw=="], "@trezor/blockchain-link-utils/@stellar/stellar-sdk/eventsource": ["eventsource@2.0.2", "", {}, "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA=="], @@ -4086,12 +4136,6 @@ "@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - - "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@cosmjs/tendermint-rpc/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], "@ledgerhq/context-module/ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], @@ -4216,6 +4260,8 @@ "@metamask/mobile-wallet-protocol-dapp-client/@metamask/utils/@ethereumjs/tx/@ethereumjs/util": ["@ethereumjs/util@8.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^4.0.1", "ethereum-cryptography": "^2.0.0", "micro-ftch": "^0.3.1" } }, "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA=="], + "@near-js/accounts/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@near-js/keystores-browser/@near-js/crypto/@near-js/utils/bs58": ["bs58@4.0.0", "", { "dependencies": { "base-x": "^2.0.1" } }, "sha512-/jcGuUuSebyxwLLfKrbKnCJttxRf9PM51EnHTwmFKBxl4z1SGkoAhrfd6uZKE0dcjQTfm6XzTP8DPr1tzE4KIw=="], "@near-js/keystores-browser/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], @@ -4228,6 +4274,12 @@ "@near-js/keystores-node/@near-js/keystores/@near-js/types/bn.js": ["bn.js@5.2.1", "", {}, "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="], + "@near-js/keystores/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@near-js/providers/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + + "@near-js/signers/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@near-js/wallet-account/@near-js/accounts/@near-js/providers/node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], "@near-js/wallet-account/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], @@ -4316,39 +4368,21 @@ "@starknet-io/get-starknet-wallet-standard/ox/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "xstream": "^11.14.0" } }, "sha512-slyo76IYkTuSxrzxvF1s1ScFPIGnW7PbNSx8lr++NzdyPluqe053+cSqsxLUioXb5qI9Nxny2fWxOK8isSn+cg=="], + "@swapkit/plugins/@near-js/transactions/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-mvA+/ycMn7dnjjdooSPq516poFpSARRXhFhKjCXxGUmBZA+74vLDLbtD6VGzHd08A2JSZBSiAhVOZpjYqgV78A=="], - - "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - - "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - - "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - - "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - - "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - - "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@swapkit/plugins/@near-js/transactions/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@swapkit/toolboxes/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - - "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "xstream": "^11.14.0" } }, "sha512-slyo76IYkTuSxrzxvF1s1ScFPIGnW7PbNSx8lr++NzdyPluqe053+cSqsxLUioXb5qI9Nxny2fWxOK8isSn+cg=="], - "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-mvA+/ycMn7dnjjdooSPq516poFpSARRXhFhKjCXxGUmBZA+74vLDLbtD6VGzHd08A2JSZBSiAhVOZpjYqgV78A=="], - "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@swapkit/ui/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], - "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], "@trezor/blockchain-link-utils/@trezor/protobuf/protobufjs/long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], @@ -4390,8 +4424,6 @@ "wif/bs58check/bs58/base-x": ["base-x@5.0.1", "", {}, "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg=="], - "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@ledgerhq/ledger-wallet-provider-core/@ledgerhq/context-module/ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], "@ledgerhq/ledger-wallet-provider-core/@ledgerhq/device-signer-kit-ethereum/ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], @@ -4422,20 +4454,28 @@ "@solana/program-client-core/@solana/signers/@solana/transaction-messages/@solana/rpc-types/@solana/codecs-strings": ["@solana/codecs-strings@6.10.0", "", { "dependencies": { "@solana/codecs-core": "6.10.0", "@solana/codecs-numbers": "6.10.0", "@solana/errors": "6.10.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.4.0" }, "optionalPeers": ["fastestsmallesttextencoderdecoder", "typescript"] }, "sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA=="], + "@swapkit/plugins/@near-js/transactions/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], - "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], + + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + + "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], } } diff --git a/packages/wallet-extensions/package.json b/packages/wallet-extensions/package.json index c6d4ad4e..3a6ff3e6 100644 --- a/packages/wallet-extensions/package.json +++ b/packages/wallet-extensions/package.json @@ -11,6 +11,7 @@ "@near-js/transactions": "~2.5.0", "@scure/base": "~2.2.0", "@solana/web3.js": "~1.98.4", + "@stricahq/cbors": "~1.0.4", "@swapkit/helpers": "^6.1.1", "@swapkit/toolboxes": "^6.2.0", "@swapkit/utxo-signer": "^3.1.1", @@ -33,6 +34,7 @@ "@near-js/transactions": "2.5.0", "@scure/base": "2.2.0", "@solana/web3.js": "1.98.4", + "@stricahq/cbors": "1.0.4", "@wallet-standard/app": "1.1.1", "cosmjs-types": "0.10.1", "ethers": "6.16.0", diff --git a/packages/wallet-extensions/src/okx/cardano.ts b/packages/wallet-extensions/src/okx/cardano.ts new file mode 100644 index 00000000..007013c3 --- /dev/null +++ b/packages/wallet-extensions/src/okx/cardano.ts @@ -0,0 +1,49 @@ +import { bech32, hex } from "@scure/base"; +import { Chain, SwapKitError } from "@swapkit/helpers"; + +export async function getOkxCardanoWallet() { + if (!(window.okxwallet && "cardano" in window.okxwallet)) { + throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cardano }); + } + + const api = await window.okxwallet.cardano.enable(); + + if ((await api.getNetworkId()) !== 1) { + throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Cardano, message: "Mainnet only" }); + } + + const address = toBech32Address(await api.getChangeAddress()); + const { getCardanoToolbox } = await import("@swapkit/toolboxes/cardano"); + + const signer = { + address, + connect: () => Promise.resolve({ address }), + disconnect: () => Promise.resolve(), + getAddress: () => Promise.resolve(address), + signTransaction: async (transaction: string) => addWitnesses(transaction, await api.signTx(transaction)), + }; + + return { ...getCardanoToolbox({ signer }), address }; +} + +function toBech32Address(address: string) { + if (address.startsWith("addr")) return address; + return bech32.encode("addr", bech32.toWords(hex.decode(address)), 1023); +} + +// CIP-30 signTx returns only the witness set, the toolbox broadcasts the full transaction +async function addWitnesses(transaction: string, signed: string) { + const { Decoder, Encoder } = await import("@stricahq/cbors"); + const signedValue = Decoder.decode(Buffer.from(signed, "hex")).value; + if (Array.isArray(signedValue)) return signed; + + const [body, witnesses, isValid, auxiliaryData] = Decoder.decode(Buffer.from(transaction, "hex")).value; + const witnessMap: Map = witnesses instanceof Map ? witnesses : new Map(); + + for (const [key, value] of signedValue as Map) { + const existing = witnessMap.get(key); + witnessMap.set(key, Array.isArray(existing) && Array.isArray(value) ? [...existing, ...value] : value); + } + + return Encoder.encode([body, witnessMap, isValid, auxiliaryData]).toString("hex"); +} diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 10bc1b77..e3adf94b 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -160,6 +160,10 @@ export async function getWalletMethods(chain: Chain): Promise { + const { getOkxCardanoWallet } = await import("./cardano"); + return getOkxCardanoWallet(); + }) .with(Chain.Cosmos, async () => { if (!(window.okxwallet && "keplr" in window.okxwallet)) { throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cosmos }); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 164bf887..16f6b205 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -25,6 +25,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ [Chain.Berachain]: true, [Chain.BinanceSmartChain]: true, [Chain.Bitcoin]: true, + [Chain.Cardano]: true, [Chain.Cosmos]: true, [Chain.Ethereum]: true, [Chain.Gnosis]: true, @@ -46,6 +47,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ Chain.Berachain, Chain.BinanceSmartChain, Chain.Bitcoin, + Chain.Cardano, Chain.Cosmos, Chain.Ethereum, Chain.Gnosis, diff --git a/packages/wallet-extensions/src/types.ts b/packages/wallet-extensions/src/types.ts index 499d1646..b8e4066b 100644 --- a/packages/wallet-extensions/src/types.ts +++ b/packages/wallet-extensions/src/types.ts @@ -22,6 +22,12 @@ type StarknetAccount = StarknetToolboxParams extends infer Params export type OkxStarknetProvider = { account: StarknetAccount; enable: () => Promise }; +export type OkxCardanoApi = { + getChangeAddress: () => Promise; + getNetworkId: () => Promise; + signTx: (transaction: string, partialSign?: boolean) => Promise; +}; + type UnisatToSignInputs = { index: number; sighashTypes?: number[]; disableTweakSigner?: boolean } & ( | { address: string } | { publicKey: string } @@ -142,6 +148,7 @@ declare global { }; solana: SolanaProvider; starknet: OkxStarknetProvider; + cardano: { enable: () => Promise }; near: NearBrowserWalletProvider & { requestSignIn: (params?: { contractId?: string; From 9c59aa2dda63d34efea69f289be1dd684409d140 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Thu, 8 Oct 2026 10:13:55 +0000 Subject: [PATCH 04/25] OKX Wallet keeps the chains it can connect when another one is not available Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-solana-starknet-cardano.md | 6 ++ .../src/okx/__tests__/okx.test.ts | 60 +++++++++++++++++++ packages/wallet-extensions/src/okx/index.ts | 13 +++- 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 .changeset/okx-solana-starknet-cardano.md create mode 100644 packages/wallet-extensions/src/okx/__tests__/okx.test.ts diff --git a/.changeset/okx-solana-starknet-cardano.md b/.changeset/okx-solana-starknet-cardano.md new file mode 100644 index 00000000..e823f076 --- /dev/null +++ b/.changeset/okx-solana-starknet-cardano.md @@ -0,0 +1,6 @@ +--- +"@swapkit/wallet-extensions": minor +"@swapkit/wallets": minor +--- + +OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts new file mode 100644 index 00000000..5008d0d5 --- /dev/null +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -0,0 +1,60 @@ +// @ts-nocheck - Test file with intentional mocking of browser globals +import { afterEach, describe, expect, test } from "bun:test"; +import { Decoder, Encoder } from "@stricahq/cbors"; +import { Chain } from "@swapkit/helpers"; + +import { getWalletMethods } from "../helpers"; +import { okxWallet } from "../index"; + +const CARDANO_ADDRESS_HEX = `01${"11".repeat(56)}`; +const walletWitness = [Buffer.alloc(32, 1), Buffer.alloc(64, 2)]; + +function mockCardano() { + return { + enable: async () => ({ + getChangeAddress: async () => CARDANO_ADDRESS_HEX, + getNetworkId: async () => 1, + signTx: async () => Encoder.encode(new Map([[0, [walletWitness]]])).toString("hex"), + }), + }; +} + +afterEach(() => { + globalThis.window = undefined; +}); + +describe("OKX Cardano", () => { + test("adds the wallet witness to the transaction and exposes a bech32 address", async () => { + globalThis.window = { okxwallet: { cardano: mockCardano() } }; + + const wallet = await getWalletMethods(Chain.Cardano); + const unsignedTx = Encoder.encode([new Map([[2, 170000]]), new Map(), true, null]).toString("hex"); + const [, witnesses] = Decoder.decode(Buffer.from(await wallet.signTransaction(unsignedTx), "hex")).value; + + expect(wallet.address.startsWith("addr1")).toBe(true); + expect(witnesses.get(0)).toEqual([walletWitness]); + }); +}); + +describe("connectOkx", () => { + function connect(chains: Chain[]) { + const added = []; + const connectOkx = okxWallet.connectOkx.connectWallet({ addChain: (wallet) => added.push(wallet.chain) }); + + return { added, result: connectOkx(chains) }; + } + + test("keeps the available chains when another chain is missing in the wallet", async () => { + globalThis.window = { okxwallet: { cardano: mockCardano() } }; + const { added, result } = connect([Chain.Cardano, Chain.Starknet]); + + expect(await result).toBe(true); + expect(added).toEqual([Chain.Cardano]); + }); + + test("fails when no chain can be connected", async () => { + globalThis.window = { okxwallet: {} }; + + await expect(connect([Chain.Starknet]).result).rejects.toThrow(); + }); +}); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 16f6b205..e5355da1 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -8,13 +8,24 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ async function connectOkx(chains: Chain[]) { const filteredChains = filterSupportedChains({ chains, supportedChains, walletType }); - await Promise.all( + const results = await Promise.allSettled( filteredChains.map(async (chain) => { const walletMethods = await getWalletMethods(chain); addChain({ ...walletMethods, chain, walletType }); }), ); + // OKX Mobile does not expose every chain the extension does, so one missing chain should not block the rest + const failed = results.flatMap((result, index) => + result.status === "rejected" ? [{ chain: filteredChains[index], reason: result.reason }] : [], + ); + + if (failed.length > 0 && failed.length === results.length) throw failed[0]?.reason; + + for (const { chain, reason } of failed) { + console.error(`connectOkx: skipping ${chain}, failed to connect`, reason); + } + return true; }, directSigningSupport: { From 58ce4bafcd14d382bd28dade0c66e9e28207ce2b Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Mon, 12 Oct 2026 08:43:05 +0000 Subject: [PATCH 05/25] Fix the OKX Cardano type declarations build Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- packages/wallet-extensions/src/okx/cardano.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/wallet-extensions/src/okx/cardano.ts b/packages/wallet-extensions/src/okx/cardano.ts index 007013c3..c8888888 100644 --- a/packages/wallet-extensions/src/okx/cardano.ts +++ b/packages/wallet-extensions/src/okx/cardano.ts @@ -1,7 +1,9 @@ import { bech32, hex } from "@scure/base"; import { Chain, SwapKitError } from "@swapkit/helpers"; +import type { CardanoWallet } from "@swapkit/toolboxes/cardano"; -export async function getOkxCardanoWallet() { +// Explicit type keeps the generated declarations from pointing into the typhonjs internals +export async function getOkxCardanoWallet(): Promise { if (!(window.okxwallet && "cardano" in window.okxwallet)) { throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cardano }); } From 668b4ccf3db16053c6a490b726d82e5a2f68d58f Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Mon, 12 Oct 2026 09:12:04 +0000 Subject: [PATCH 06/25] OKX Wallet signs Cardano with the shared SDK helpers Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- bun.lock | 2 - packages/wallet-extensions/package.json | 2 - .../src/okx/__tests__/okx.test.ts | 24 +---------- packages/wallet-extensions/src/okx/cardano.ts | 40 +++++++------------ 4 files changed, 15 insertions(+), 53 deletions(-) diff --git a/bun.lock b/bun.lock index f0209b92..044f16aa 100644 --- a/bun.lock +++ b/bun.lock @@ -58,7 +58,6 @@ "@near-js/transactions": "~2.5.0", "@scure/base": "~2.2.0", "@solana/web3.js": "~1.98.4", - "@stricahq/cbors": "~1.0.4", "@swapkit/helpers": "^6.1.1", "@swapkit/toolboxes": "^6.2.0", "@swapkit/utxo-signer": "^3.1.1", @@ -80,7 +79,6 @@ "@near-js/transactions": "2.5.0", "@scure/base": "2.2.0", "@solana/web3.js": "1.98.4", - "@stricahq/cbors": "1.0.4", "@wallet-standard/app": "1.1.1", "cosmjs-types": "0.10.1", "ethers": "6.16.0", diff --git a/packages/wallet-extensions/package.json b/packages/wallet-extensions/package.json index 3a6ff3e6..c6d4ad4e 100644 --- a/packages/wallet-extensions/package.json +++ b/packages/wallet-extensions/package.json @@ -11,7 +11,6 @@ "@near-js/transactions": "~2.5.0", "@scure/base": "~2.2.0", "@solana/web3.js": "~1.98.4", - "@stricahq/cbors": "~1.0.4", "@swapkit/helpers": "^6.1.1", "@swapkit/toolboxes": "^6.2.0", "@swapkit/utxo-signer": "^3.1.1", @@ -34,7 +33,6 @@ "@near-js/transactions": "2.5.0", "@scure/base": "2.2.0", "@solana/web3.js": "1.98.4", - "@stricahq/cbors": "1.0.4", "@wallet-standard/app": "1.1.1", "cosmjs-types": "0.10.1", "ethers": "6.16.0", diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 5008d0d5..6453664c 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -1,41 +1,19 @@ // @ts-nocheck - Test file with intentional mocking of browser globals import { afterEach, describe, expect, test } from "bun:test"; -import { Decoder, Encoder } from "@stricahq/cbors"; import { Chain } from "@swapkit/helpers"; -import { getWalletMethods } from "../helpers"; import { okxWallet } from "../index"; const CARDANO_ADDRESS_HEX = `01${"11".repeat(56)}`; -const walletWitness = [Buffer.alloc(32, 1), Buffer.alloc(64, 2)]; function mockCardano() { - return { - enable: async () => ({ - getChangeAddress: async () => CARDANO_ADDRESS_HEX, - getNetworkId: async () => 1, - signTx: async () => Encoder.encode(new Map([[0, [walletWitness]]])).toString("hex"), - }), - }; + return { enable: async () => ({ getChangeAddress: async () => CARDANO_ADDRESS_HEX, getNetworkId: async () => 1 }) }; } afterEach(() => { globalThis.window = undefined; }); -describe("OKX Cardano", () => { - test("adds the wallet witness to the transaction and exposes a bech32 address", async () => { - globalThis.window = { okxwallet: { cardano: mockCardano() } }; - - const wallet = await getWalletMethods(Chain.Cardano); - const unsignedTx = Encoder.encode([new Map([[2, 170000]]), new Map(), true, null]).toString("hex"); - const [, witnesses] = Decoder.decode(Buffer.from(await wallet.signTransaction(unsignedTx), "hex")).value; - - expect(wallet.address.startsWith("addr1")).toBe(true); - expect(witnesses.get(0)).toEqual([walletWitness]); - }); -}); - describe("connectOkx", () => { function connect(chains: Chain[]) { const added = []; diff --git a/packages/wallet-extensions/src/okx/cardano.ts b/packages/wallet-extensions/src/okx/cardano.ts index c8888888..ea985800 100644 --- a/packages/wallet-extensions/src/okx/cardano.ts +++ b/packages/wallet-extensions/src/okx/cardano.ts @@ -1,4 +1,4 @@ -import { bech32, hex } from "@scure/base"; +import { hex } from "@scure/base"; import { Chain, SwapKitError } from "@swapkit/helpers"; import type { CardanoWallet } from "@swapkit/toolboxes/cardano"; @@ -14,38 +14,26 @@ export async function getOkxCardanoWallet(): Promise Promise.resolve({ address }), disconnect: () => Promise.resolve(), getAddress: () => Promise.resolve(address), - signTransaction: async (transaction: string) => addWitnesses(transaction, await api.signTx(transaction)), + signTransaction, }; return { ...getCardanoToolbox({ signer }), address }; } - -function toBech32Address(address: string) { - if (address.startsWith("addr")) return address; - return bech32.encode("addr", bech32.toWords(hex.decode(address)), 1023); -} - -// CIP-30 signTx returns only the witness set, the toolbox broadcasts the full transaction -async function addWitnesses(transaction: string, signed: string) { - const { Decoder, Encoder } = await import("@stricahq/cbors"); - const signedValue = Decoder.decode(Buffer.from(signed, "hex")).value; - if (Array.isArray(signedValue)) return signed; - - const [body, witnesses, isValid, auxiliaryData] = Decoder.decode(Buffer.from(transaction, "hex")).value; - const witnessMap: Map = witnesses instanceof Map ? witnesses : new Map(); - - for (const [key, value] of signedValue as Map) { - const existing = witnessMap.get(key); - witnessMap.set(key, Array.isArray(existing) && Array.isArray(value) ? [...existing, ...value] : value); - } - - return Encoder.encode([body, witnessMap, isValid, auxiliaryData]).toString("hex"); -} From 16ac2331ce5e99fff7fb3057b19171d393835725 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Tue, 13 Oct 2026 12:22:01 +0000 Subject: [PATCH 07/25] Use a real Cardano address in the OKX tests Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .../src/okx/__tests__/okx.test.ts | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 6453664c..0774ac19 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -1,13 +1,21 @@ // @ts-nocheck - Test file with intentional mocking of browser globals import { afterEach, describe, expect, test } from "bun:test"; +import { bech32, hex } from "@scure/base"; import { Chain } from "@swapkit/helpers"; import { okxWallet } from "../index"; -const CARDANO_ADDRESS_HEX = `01${"11".repeat(56)}`; +// CIP-19 mainnet base address test vector +const CARDANO_ADDRESS = + "addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x"; function mockCardano() { - return { enable: async () => ({ getChangeAddress: async () => CARDANO_ADDRESS_HEX, getNetworkId: async () => 1 }) }; + return { + enable: async () => ({ + getChangeAddress: async () => hex.encode(bech32.fromWords(bech32.decode(CARDANO_ADDRESS, 120).words)), + getNetworkId: async () => 1, + }), + }; } afterEach(() => { @@ -17,7 +25,7 @@ afterEach(() => { describe("connectOkx", () => { function connect(chains: Chain[]) { const added = []; - const connectOkx = okxWallet.connectOkx.connectWallet({ addChain: (wallet) => added.push(wallet.chain) }); + const connectOkx = okxWallet.connectOkx.connectWallet({ addChain: (wallet) => added.push(wallet) }); return { added, result: connectOkx(chains) }; } @@ -27,7 +35,8 @@ describe("connectOkx", () => { const { added, result } = connect([Chain.Cardano, Chain.Starknet]); expect(await result).toBe(true); - expect(added).toEqual([Chain.Cardano]); + expect(added.map(({ chain }) => chain)).toEqual([Chain.Cardano]); + expect(added[0].address).toBe(CARDANO_ADDRESS); }); test("fails when no chain can be connected", async () => { From 593fb2c08833eff2a89ea0de15b3ec724f643ff5 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Tue, 13 Oct 2026 12:38:00 +0000 Subject: [PATCH 08/25] OKX Mobile offers the same chains as the OKX extension Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-solana-starknet-cardano.md | 2 +- packages/wallets/src/types.ts | 4 ++-- packages/wallets/src/utils.ts | 7 +++++-- 3 files changed, 8 insertions(+), 5 deletions(-) diff --git a/.changeset/okx-solana-starknet-cardano.md b/.changeset/okx-solana-starknet-cardano.md index e823f076..2f523785 100644 --- a/.changeset/okx-solana-starknet-cardano.md +++ b/.changeset/okx-solana-starknet-cardano.md @@ -3,4 +3,4 @@ "@swapkit/wallets": minor --- -OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. +OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. `loadWallet(WalletOption.OKX_MOBILE)` now returns the OKX wallet instead of the generic EVM one, so OKX Mobile offers the same chains as the extension. diff --git a/packages/wallets/src/types.ts b/packages/wallets/src/types.ts index ee970146..91ed884b 100644 --- a/packages/wallets/src/types.ts +++ b/packages/wallets/src/types.ts @@ -45,7 +45,7 @@ export type SKWallets = { [WalletOption.METAMASK]: typeof metamaskWallet; [WalletOption.NOIR_WALLET]: typeof noirWallet; [WalletOption.OKX]: typeof okxWallet; - [WalletOption.OKX_MOBILE]: typeof evmWallet; + [WalletOption.OKX_MOBILE]: typeof okxWallet; [WalletOption.ONEKEY]: typeof onekeyWallet; [WalletOption.PASSKEYS]: typeof passkeysWallet; [WalletOption.PASSKEY_WALLET]: typeof passkeysWallet; @@ -122,7 +122,7 @@ export type SKWalletsSupportedChains = { [WalletOption.METAMASK]: typeof metamaskWallet.connectMetamask.supportedChains; [WalletOption.NOIR_WALLET]: typeof noirWallet.connectNoirWallet.supportedChains; [WalletOption.OKX]: typeof okxWallet.connectOkx.supportedChains; - [WalletOption.OKX_MOBILE]: typeof evmWallet.connectEVMWallet.supportedChains; + [WalletOption.OKX_MOBILE]: typeof okxWallet.connectOkx.supportedChains; [WalletOption.ONEKEY]: typeof onekeyWallet.connectOnekeyWallet.supportedChains; [WalletOption.PASSKEYS]: typeof passkeysWallet.connectPasskeys.supportedChains; [WalletOption.PASSKEY_WALLET]: typeof passkeysWallet.connectPasskeys.supportedChains; diff --git a/packages/wallets/src/utils.ts b/packages/wallets/src/utils.ts index 875430b7..49113326 100644 --- a/packages/wallets/src/utils.ts +++ b/packages/wallets/src/utils.ts @@ -11,7 +11,11 @@ export async function loadWallet(walletOption: W): Pr .with(WalletOption.COINBASE_MOBILE, async () => (await import("./coinbase")).coinbaseWallet) .with(WalletOption.BITGET, async () => (await import("@swapkit/wallet-extensions/bitget")).bitgetWallet) .with(WalletOption.VULTISIG, async () => (await import("@swapkit/wallet-extensions/vultisig")).vultisigWallet) - .with(WalletOption.OKX, async () => (await import("@swapkit/wallet-extensions/okx")).okxWallet) + .with( + WalletOption.OKX, + WalletOption.OKX_MOBILE, + async () => (await import("@swapkit/wallet-extensions/okx")).okxWallet, + ) .with(WalletOption.ONEKEY, async () => (await import("@swapkit/wallet-extensions/onekey")).onekeyWallet) .with(WalletOption.EXODUS, async () => (await import("./passkeys")).passkeysWallet) .with(WalletOption.KEEPKEY, async () => (await import("@swapkit/wallet-hardware/keepkey")).keepkeyWallet) @@ -29,7 +33,6 @@ export async function loadWallet(walletOption: W): Pr WalletOption.BRAVE, WalletOption.COINBASE_WEB, WalletOption.EIP6963, - WalletOption.OKX_MOBILE, async () => (await import("@swapkit/wallet-extensions/evm-extensions")).evmWallet, ) .with(WalletOption.METAMASK, async () => (await import("./metamask")).metamaskWallet) From bf1aa5fc7d59fed62391586526ab048f4316d974 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Tue, 13 Oct 2026 13:50:20 +0000 Subject: [PATCH 09/25] Read the OKX Starknet account after the wallet is enabled Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .../src/okx/__tests__/okx.test.ts | 15 +++++++++++++++ packages/wallet-extensions/src/okx/helpers.ts | 7 ++++--- packages/wallet-extensions/src/types.ts | 2 +- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 0774ac19..61da608c 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -44,4 +44,19 @@ describe("connectOkx", () => { await expect(connect([Chain.Starknet]).result).rejects.toThrow(); }); + + test("reads the Starknet account once the wallet has been enabled", async () => { + const address = `0x${"1".repeat(64)}`; + const starknet = { + enable() { + this.account = { address }; + return Promise.resolve([address]); + }, + }; + globalThis.window = { okxwallet: { starknet } }; + const { added, result } = connect([Chain.Starknet]); + + expect(await result).toBe(true); + expect(added[0].address).toBe(address); + }); }); diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index e3adf94b..75a33a46 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -149,10 +149,11 @@ export async function getWalletMethods(chain: Chain): Promise Promise }; +export type OkxStarknetProvider = { account?: StarknetAccount; enable: () => Promise }; export type OkxCardanoApi = { getChangeAddress: () => Promise; From a653ba15c0bba78a56824a3033fbc0d1c7e3074d Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Tue, 13 Oct 2026 13:50:34 +0000 Subject: [PATCH 10/25] Release the OKX Mobile connector change as a major version Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-mobile-uses-okx-connector.md | 5 +++++ .changeset/okx-solana-starknet-cardano.md | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/okx-mobile-uses-okx-connector.md diff --git a/.changeset/okx-mobile-uses-okx-connector.md b/.changeset/okx-mobile-uses-okx-connector.md new file mode 100644 index 00000000..4afe788e --- /dev/null +++ b/.changeset/okx-mobile-uses-okx-connector.md @@ -0,0 +1,5 @@ +--- +"@swapkit/wallets": major +--- + +**`loadWallet(WalletOption.OKX_MOBILE)` now returns the OKX wallet (`connectOkx`) instead of the generic EVM wallet (`connectEVMWallet`).** OKX Mobile is the same OKX integration running inside the OKX app's browser, so it now offers the same chains as the extension instead of only EVM chains. To migrate, replace `connectEVMWallet(chains, WalletOption.OKX_MOBILE)` with `connectOkx(chains)`. Connected chains are reported with the `OKX` wallet type, which is what the SwapKit widget already did for OKX Mobile. Importing `evmWallet` from `@swapkit/wallet-extensions/evm-extensions` and passing `WalletOption.OKX_MOBILE` keeps working unchanged. diff --git a/.changeset/okx-solana-starknet-cardano.md b/.changeset/okx-solana-starknet-cardano.md index 2f523785..e823f076 100644 --- a/.changeset/okx-solana-starknet-cardano.md +++ b/.changeset/okx-solana-starknet-cardano.md @@ -3,4 +3,4 @@ "@swapkit/wallets": minor --- -OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. `loadWallet(WalletOption.OKX_MOBILE)` now returns the OKX wallet instead of the generic EVM one, so OKX Mobile offers the same chains as the extension. +OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. From 38d14b7b2f8f2b7fbe47401d67da060d27abebf1 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Tue, 13 Oct 2026 13:53:06 +0000 Subject: [PATCH 11/25] Simplify the OKX Starknet account type and note undeployed accounts Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-solana-starknet-cardano.md | 2 +- packages/wallet-extensions/src/types.ts | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/.changeset/okx-solana-starknet-cardano.md b/.changeset/okx-solana-starknet-cardano.md index e823f076..19b58b08 100644 --- a/.changeset/okx-solana-starknet-cardano.md +++ b/.changeset/okx-solana-starknet-cardano.md @@ -3,4 +3,4 @@ "@swapkit/wallets": minor --- -OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. +OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. A Starknet account the user has never used is not deployed yet and fails with `toolbox_starknet_account_not_deployed` until it has been deployed from the OKX Wallet. diff --git a/packages/wallet-extensions/src/types.ts b/packages/wallet-extensions/src/types.ts index e92d70da..fc53c639 100644 --- a/packages/wallet-extensions/src/types.ts +++ b/packages/wallet-extensions/src/types.ts @@ -12,13 +12,7 @@ import type { Eip1193Provider } from "ethers"; import type { NearBrowserWalletProvider } from "./helpers/near"; import type { TronLinkWindow } from "./tronlink"; -type StarknetAccount = StarknetToolboxParams extends infer Params - ? Params extends { signer?: infer Signer } - ? unknown extends Signer - ? never - : NonNullable - : never - : never; +type StarknetAccount = NonNullable["signer"]>; export type OkxStarknetProvider = { account?: StarknetAccount; enable: () => Promise }; From 08a7be5339de0435aa72ac129afd29a89a47e437 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Tue, 13 Oct 2026 14:14:45 +0000 Subject: [PATCH 12/25] Restore the lockfile from develop Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- bun.lock | 168 +++++++++++++++++++++---------------------------------- 1 file changed, 65 insertions(+), 103 deletions(-) diff --git a/bun.lock b/bun.lock index f656d892..9eca8844 100644 --- a/bun.lock +++ b/bun.lock @@ -672,7 +672,7 @@ "@near-js/accounts": ["@near-js/accounts@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/keystores": "2.5.1", "@near-js/providers": "2.5.1", "@near-js/signers": "2.5.1", "@near-js/tokens": "2.5.1", "@near-js/transactions": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0", "depd": "2.0.0", "is-my-json-valid": "^2.20.6", "lru_map": "0.4.1", "near-abi": "0.2.0" } }, "sha512-L4/Z9Ujwnz8/uvOExESP6h0t/plu4/0SFrL+UJBnfO5LObVwnJH2KG6MCLONy8rKh1FZHOlT9LPhtG/6nUrvOQ=="], - "@near-js/crypto": ["@near-js/crypto@2.5.0", "", { "dependencies": { "@near-js/types": "2.5.0", "@near-js/utils": "2.5.0", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-bsMCasnjRne9j0u5DuKeO0/xwS49GgRrVxzmW9WRZ7yWWh0U8IidTxNHTL1QCDFJNwwzt9HDnuj8XeVhlpixww=="], + "@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], "@near-js/keystores": ["@near-js/keystores@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1" } }, "sha512-UlP3GXeDzRyUlL3qKZUkwSwbABDarhOqRRR0vcMBOOu+063GDULGio9GTWDvKDDi11nmfbhOzbiY5vXEW4jR8g=="], @@ -686,7 +686,7 @@ "@near-js/tokens": ["@near-js/tokens@2.5.1", "", {}, "sha512-doDtOaSA2FOsYzzwocg0L02z6ORNL7HFAuL455y2O38//F4C2jp+C9De9fWrItkrim2jKjoSR3UvO2AuVbwmWA=="], - "@near-js/transactions": ["@near-js/transactions@2.5.0", "", { "dependencies": { "@near-js/crypto": "2.5.0", "@near-js/types": "2.5.0", "@near-js/utils": "2.5.0", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-gVhWS4T5VcLjyVaW8nxWxK7kcgbGgyJ0YVS+VmaFzQbSZKuYgNnQXxynTycFc34awTNbp3a4/MqAd8RgX9VIcg=="], + "@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], "@near-js/types": ["@near-js/types@2.5.1", "", {}, "sha512-lUJJmbV6qcilIwswldeP7FIjkjTWvmtgI+yQHVmiBNRVjYvPMiQ/e9vs3SXE/cYtRluAdq0JHJwYoqhFb69mwA=="], @@ -2706,12 +2706,16 @@ "@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@cosmjs/proto-signing/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], + "@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], "@cosmjs/socket/isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], "@cosmjs/socket/ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], + "@cosmjs/stargate/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], + "@cosmjs/tendermint-rpc/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], "@jest/types/chalk": ["chalk@4.1.2", "", { "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="], @@ -2864,22 +2868,12 @@ "@mysten/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@near-js/accounts/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], - - "@near-js/accounts/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], - "@near-js/accounts/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@near-js/crypto/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], - - "@near-js/crypto/@near-js/utils": ["@near-js/utils@2.5.0", "", { "dependencies": { "@near-js/types": "2.5.0", "@scure/base": "^1.2.4", "depd": "2.0.0", "mustache": "4.0.0" } }, "sha512-hifdeZVzV9TFcgLNekRVVnB6q7zxdCQPmC9cybT1SjfeiIP/5jPabOZXGWNJPSloRcrTMluCTtaWinIw1HXanQ=="], - "@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], "@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@near-js/keystores/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], - "@near-js/keystores-browser/@near-js/crypto": ["@near-js/crypto@1.2.1", "", { "dependencies": { "@near-js/types": "0.0.4", "@near-js/utils": "0.1.0", "@noble/curves": "1.2.0", "bn.js": "5.2.1", "borsh": "1.0.0", "randombytes": "2.1.0" } }, "sha512-iJOHaGKvdudYfR8nEtRhGlgcTEHeVmxMoT0JVXmuP3peG96v/sSnA03CE6MZBeCC8txKAQOffagxE7oU6hJp9g=="], "@near-js/keystores-browser/@near-js/keystores": ["@near-js/keystores@0.0.9", "", { "dependencies": { "@near-js/crypto": "1.2.1", "@near-js/types": "0.0.4" } }, "sha512-j8ySgVEcm2Gg6zxkSdadNtPlIqhJZdPGfWWM3tPtEoowNS9snhwZn5NRFPrgmX0+MzpF7E091CRcY90MvRVhsg=="], @@ -2888,22 +2882,10 @@ "@near-js/keystores-node/@near-js/keystores": ["@near-js/keystores@0.0.9", "", { "dependencies": { "@near-js/crypto": "1.2.1", "@near-js/types": "0.0.4" } }, "sha512-j8ySgVEcm2Gg6zxkSdadNtPlIqhJZdPGfWWM3tPtEoowNS9snhwZn5NRFPrgmX0+MzpF7E091CRcY90MvRVhsg=="], - "@near-js/providers/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], - - "@near-js/providers/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], - "@near-js/providers/node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], - "@near-js/signers/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], - - "@near-js/signers/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], - "@near-js/signers/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@near-js/transactions/@near-js/types": ["@near-js/types@2.5.0", "", {}, "sha512-U0HgAnRwN/XKJ1O4Htac+G5bvkMalBJ8i/kwAPJpoOI1MUtP9dhbCG4GBErADCpczukhrAWlDBHHdfhPnhgyzQ=="], - - "@near-js/transactions/@near-js/utils": ["@near-js/utils@2.5.0", "", { "dependencies": { "@near-js/types": "2.5.0", "@scure/base": "^1.2.4", "depd": "2.0.0", "mustache": "4.0.0" } }, "sha512-hifdeZVzV9TFcgLNekRVVnB6q7zxdCQPmC9cybT1SjfeiIP/5jPabOZXGWNJPSloRcrTMluCTtaWinIw1HXanQ=="], - "@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], "@near-js/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], @@ -3206,12 +3188,6 @@ "@swapkit/cosmos-signer/cosmjs-types": ["cosmjs-types@0.11.0", "", {}, "sha512-kDSkgHpRTrg1413jCNehT3P21+EBxZWFMBr9JEzVfmPiNdtuwAoLAkCYo7c7i/pTakAwyHsXbxOg8kkD+AN33w=="], - "@swapkit/plugins/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], - - "@swapkit/toolboxes/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], - - "@swapkit/toolboxes/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], - "@swapkit/toolboxes/@stricahq/typhonjs": ["@stricahq/typhonjs@3.1.0", "", { "dependencies": { "@stricahq/cbors": "1.0.2", "bech32": "^2.0.0", "bignumber.js": "^9.0.1", "blakejs": "^1.2.1", "bs58": "^5.0.0", "buffer": "^6.0.3", "lodash": "^4.17.21" } }, "sha512-Eaw0qqNIz+6sA9zD/9pFCdQ+gNbCv8PKFMhXu4Vq6KSR1XsH40jNPFkrqgKaq8q+gbO569U1+tu41dHk40JNbw=="], "@swapkit/toolboxes/cosmjs-types": ["cosmjs-types@0.11.0", "", {}, "sha512-kDSkgHpRTrg1413jCNehT3P21+EBxZWFMBr9JEzVfmPiNdtuwAoLAkCYo7c7i/pTakAwyHsXbxOg8kkD+AN33w=="], @@ -3224,10 +3200,6 @@ "@swapkit/ui/@cosmjs/stargate": ["@cosmjs/stargate@0.39.0", "", { "dependencies": { "@cosmjs/amino": "^0.39.0", "@cosmjs/encoding": "^0.39.0", "@cosmjs/math": "^0.39.0", "@cosmjs/proto-signing": "^0.39.0", "@cosmjs/stream": "^0.39.0", "@cosmjs/tendermint-rpc": "^0.39.0", "@cosmjs/utils": "^0.39.0", "cosmjs-types": "^0.11.0" } }, "sha512-dQtucU9czF2NUUbEKs19PMfv+EusDFKWHMVK6Hinytmpq9sdk5JUIln+g/8k+UjKcV4HPv6S0AywbhE+tl84kQ=="], - "@swapkit/ui/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], - - "@swapkit/ui/@near-js/transactions": ["@near-js/transactions@2.5.1", "", { "dependencies": { "@near-js/crypto": "2.5.1", "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/hashes": "1.7.1", "borsh": "1.0.0" } }, "sha512-0svK5K6VqOciSIn9mxreyS0uQf8T1UZc71JBA6yrstpHJhltz/dvNUMY0FV+xHx3H/KAdvCMjX0VLEpyi08yWQ=="], - "@swapkit/ui/@stricahq/typhonjs": ["@stricahq/typhonjs@3.1.0", "", { "dependencies": { "@stricahq/cbors": "1.0.2", "bech32": "^2.0.0", "bignumber.js": "^9.0.1", "blakejs": "^1.2.1", "bs58": "^5.0.0", "buffer": "^6.0.3", "lodash": "^4.17.21" } }, "sha512-Eaw0qqNIz+6sA9zD/9pFCdQ+gNbCv8PKFMhXu4Vq6KSR1XsH40jNPFkrqgKaq8q+gbO569U1+tu41dHk40JNbw=="], "@swapkit/ui/@swapkit/core": ["@swapkit/core@4.6.4", "", { "dependencies": { "@swapkit/helpers": "4.20.1", "@swapkit/plugins": "4.7.4", "@swapkit/toolboxes": "4.28.0", "@swapkit/wallet-core": "4.3.21" }, "peerDependencies": { "@stricahq/typhonjs": "3.1.0", "@ton/core": "0.63.1", "cosmjs-types": "0.11.0", "ts-pattern": "5.9.0" } }, "sha512-0nwvzI7dOy9uieMXcJzTGe6DuQRurmj6DKV4+A4nYT2Me0OOFnfgxSJ+O2Z3qa4Z/KyO47mfOuHKmSXLKEwlLg=="], @@ -3246,8 +3218,18 @@ "@swapkit/ui/react-dom": ["react-dom@19.1.1", "", { "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.1" } }, "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw=="], + "@swapkit/wallet-extensions/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], + + "@swapkit/wallet-extensions/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-cCUfejHOfjx6L/noF9QnXIy4dKoTKl56NFIqz2cizx+kZKszdL0yOtQlu0dD9nR+uMafRHU7aok6v5HH4RZIDw=="], + "@swapkit/wallet-extensions/@cosmjs/stargate": ["@cosmjs/stargate@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/proto-signing": "^0.37.1", "@cosmjs/stream": "^0.37.1", "@cosmjs/tendermint-rpc": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-nQgaJB7A81cRYtmDrcIySq8hbd+QLXJTGFEs6R1xMdxascaABX0x86nS44ALk+EZojQQRnwupOsw1dKLlQmIFg=="], + "@swapkit/wallet-hardware/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], + + "@swapkit/wallets/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], + + "@swapkit/wallets/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-cCUfejHOfjx6L/noF9QnXIy4dKoTKl56NFIqz2cizx+kZKszdL0yOtQlu0dD9nR+uMafRHU7aok6v5HH4RZIDw=="], + "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@ton/ton/axios": ["axios@1.15.0", "", { "dependencies": { "follow-redirects": "^1.15.11", "form-data": "^4.0.5", "proxy-from-env": "^2.1.0" } }, "sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q=="], @@ -3562,6 +3544,8 @@ "@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + "@cosmjs/tendermint-rpc/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], "@cosmjs/tendermint-rpc/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], @@ -3664,12 +3648,6 @@ "@mysten/sui/@scure/bip32/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - "@near-js/accounts/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@near-js/accounts/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@near-js/crypto/@near-js/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], "@near-js/keystores-browser/@near-js/crypto/@near-js/types": ["@near-js/types@0.0.4", "", { "dependencies": { "bn.js": "5.2.1" } }, "sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg=="], @@ -3692,22 +3670,6 @@ "@near-js/keystores-node/@near-js/keystores/@near-js/types": ["@near-js/types@0.0.4", "", { "dependencies": { "bn.js": "5.2.1" } }, "sha512-8TTMbLMnmyG06R5YKWuS/qFG1tOA3/9lX4NgBqQPsvaWmDsa+D+QwOkrEHDegped0ZHQwcjAXjKML1S1TyGYKg=="], - "@near-js/keystores/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@near-js/keystores/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@near-js/providers/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@near-js/providers/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@near-js/providers/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - - "@near-js/signers/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@near-js/signers/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@near-js/transactions/@near-js/utils/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@near-js/wallet-account/@near-js/accounts/@near-js/providers": ["@near-js/providers@0.1.1", "", { "dependencies": { "@near-js/transactions": "1.1.2", "@near-js/types": "0.0.4", "@near-js/utils": "0.1.0", "bn.js": "5.2.1", "borsh": "1.0.0", "http-errors": "1.7.2" }, "optionalDependencies": { "node-fetch": "2.6.7" } }, "sha512-0M/Vz2Ac34ShKVoe2ftVJ5Qg4eSbEqNXDbCDOdVj/2qbLWZa7Wpe+me5ei4TMY2ZhGdawhgJUPrYwdJzOCyf8w=="], "@near-js/wallet-account/@near-js/accounts/near-abi": ["near-abi@0.1.1", "", { "dependencies": { "@types/json-schema": "^7.0.11" } }, "sha512-RVDI8O+KVxRpC3KycJ1bpfVj9Zv+xvq9PlW1yIFl46GhrnLw83/72HqHGjGDjQ8DtltkcpSjY9X3YIGZ+1QyzQ=="], @@ -3942,16 +3904,6 @@ "@swapkit/core/@stricahq/typhonjs/@stricahq/cbors": ["@stricahq/cbors@1.0.2", "", { "dependencies": { "bignumber.js": "^9.0.2", "buffer": "^6.0.3" } }, "sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww=="], - "@swapkit/plugins/@near-js/transactions/@near-js/crypto": ["@near-js/crypto@2.5.1", "", { "dependencies": { "@near-js/types": "2.5.1", "@near-js/utils": "2.5.1", "@noble/curves": "1.8.1", "@noble/hashes": "^1.7.1", "borsh": "1.0.0", "secp256k1": "5.0.1" } }, "sha512-Kb+bbnUrfvuzzed9hpLRpcIlCMOaQlw/7BxlZPCq8DggVaK1m0nKR1DHQs2cV0Q0WSKSk2UrFJho1dxeKL5alg=="], - - "@swapkit/plugins/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - - "@swapkit/toolboxes/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@swapkit/toolboxes/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@swapkit/toolboxes/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@swapkit/toolboxes/@stricahq/typhonjs/@stricahq/cbors": ["@stricahq/cbors@1.0.2", "", { "dependencies": { "bignumber.js": "^9.0.2", "buffer": "^6.0.3" } }, "sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww=="], "@swapkit/ui/@cosmjs/amino/@cosmjs/encoding": ["@cosmjs/encoding@0.39.0", "", { "dependencies": { "@scure/base": "^2.0.0", "base64-js": "^1.3.0", "readonly-date-esm": "^2.0.0" } }, "sha512-+poEaeM8YjGNVtrHLQNWqkhEeDxapjrdpnPCT+JCRh8YNbeHEdftzZLCH5VCBSOtvo7PF0gK1B7sbQbBl6q5pQ=="], @@ -3984,12 +3936,6 @@ "@swapkit/ui/@cosmjs/stargate/@cosmjs/utils": ["@cosmjs/utils@0.39.0", "", {}, "sha512-h7fy7Tbcl9v8ABntp8+kqw2VmUus2HbnRJFyzTkM7byRktLtECHYNMsztwyl1rdHkzc8Nc2xs6K/56d7a+75aw=="], - "@swapkit/ui/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], - - "@swapkit/ui/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - - "@swapkit/ui/@near-js/transactions/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@swapkit/ui/@stricahq/typhonjs/@stricahq/cbors": ["@stricahq/cbors@1.0.2", "", { "dependencies": { "bignumber.js": "^9.0.2", "buffer": "^6.0.3" } }, "sha512-6ePsEiq7EGHA5IiPn9poA7sF5iXPqt30kKw3pjR/BhP7S+XHZNu/OPumESWnVl4AM+IEYC2x9eL+4qRPsTPVww=="], "@swapkit/ui/@swapkit/core/@swapkit/wallet-core": ["@swapkit/wallet-core@4.3.21", "", { "dependencies": { "@swapkit/helpers": "4.20.1" } }, "sha512-88zNmn14D9oBWuzDuzWv0Lz5s67UalK9CWR5poVtxEmVep0KxWnxgpITnSi1oHkzRmdF7UPt2OmwFxAXTKPdsw=="], @@ -4008,9 +3954,15 @@ "@swapkit/ui/react-dom/scheduler": ["scheduler@0.26.0", "", {}, "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino": ["@cosmjs/amino@0.37.1", "", { "dependencies": { "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1" } }, "sha512-z3QSfw2S2kGbi5XBahOdAIu2Nnb7XiLgTOphZQoOJXJcTQemAG/wYHLJD9TcQ48SX+eDTJ4i7XRyJaIdg0ClcA=="], + "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + + "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + + "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing": ["@cosmjs/proto-signing@0.37.1", "", { "dependencies": { "@cosmjs/amino": "^0.37.1", "@cosmjs/crypto": "^0.37.1", "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "cosmjs-types": "^0.10.1" } }, "sha512-cCUfejHOfjx6L/noF9QnXIy4dKoTKl56NFIqz2cizx+kZKszdL0yOtQlu0dD9nR+uMafRHU7aok6v5HH4RZIDw=="], + "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + + "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], "@trezor/blockchain-link-utils/@stellar/stellar-sdk/eventsource": ["eventsource@2.0.2", "", {}, "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA=="], @@ -4138,6 +4090,12 @@ "@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + + "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@cosmjs/tendermint-rpc/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], "@ledgerhq/context-module/ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], @@ -4262,8 +4220,6 @@ "@metamask/mobile-wallet-protocol-dapp-client/@metamask/utils/@ethereumjs/tx/@ethereumjs/util": ["@ethereumjs/util@8.1.0", "", { "dependencies": { "@ethereumjs/rlp": "^4.0.1", "ethereum-cryptography": "^2.0.0", "micro-ftch": "^0.3.1" } }, "sha512-zQ0IqbdX8FZ9aw11vP+dZkKDkS+kgIvQPHnSAXzP9pLu+Rfu3D3XEeLbicvoXJTYnhZiPmsZUxgdzXwNKxRPbA=="], - "@near-js/accounts/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@near-js/keystores-browser/@near-js/crypto/@near-js/utils/bs58": ["bs58@4.0.0", "", { "dependencies": { "base-x": "^2.0.1" } }, "sha512-/jcGuUuSebyxwLLfKrbKnCJttxRf9PM51EnHTwmFKBxl4z1SGkoAhrfd6uZKE0dcjQTfm6XzTP8DPr1tzE4KIw=="], "@near-js/keystores-browser/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], @@ -4276,12 +4232,6 @@ "@near-js/keystores-node/@near-js/keystores/@near-js/types/bn.js": ["bn.js@5.2.1", "", {}, "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ=="], - "@near-js/keystores/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - - "@near-js/providers/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - - "@near-js/signers/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@near-js/wallet-account/@near-js/accounts/@near-js/providers/node-fetch": ["node-fetch@2.6.7", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ=="], "@near-js/wallet-account/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.3.2", "", {}, "sha512-MVC8EAQp7MvEcm30KWENFjgR+Mkmf+D189XJTkFIlwohU5hcBbn1ZkKq7KVTi2Hme3PMGF390DaL52beVrIihQ=="], @@ -4370,21 +4320,39 @@ "@starknet-io/get-starknet-wallet-standard/ox/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@swapkit/plugins/@near-js/transactions/@near-js/crypto/@noble/curves": ["@noble/curves@1.8.1", "", { "dependencies": { "@noble/hashes": "1.7.1" } }, "sha512-warwspo+UYUPep0Q+vtdVB4Ugn8GGQj8iyB3gnRWsztmUHTI3S1nhdiWNsPUGL0vud7JlRRk1XEu7Lq1KGTnMQ=="], + "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "xstream": "^11.14.0" } }, "sha512-slyo76IYkTuSxrzxvF1s1ScFPIGnW7PbNSx8lr++NzdyPluqe053+cSqsxLUioXb5qI9Nxny2fWxOK8isSn+cg=="], - "@swapkit/plugins/@near-js/transactions/@near-js/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-mvA+/ycMn7dnjjdooSPq516poFpSARRXhFhKjCXxGUmBZA+74vLDLbtD6VGzHd08A2JSZBSiAhVOZpjYqgV78A=="], - "@swapkit/toolboxes/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/json-rpc": ["@cosmjs/json-rpc@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "xstream": "^11.14.0" } }, "sha512-slyo76IYkTuSxrzxvF1s1ScFPIGnW7PbNSx8lr++NzdyPluqe053+cSqsxLUioXb5qI9Nxny2fWxOK8isSn+cg=="], + "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket": ["@cosmjs/socket@0.39.0", "", { "dependencies": { "@cosmjs/stream": "^0.39.0", "isomorphic-ws": "^4.0.1", "ws": "^7", "xstream": "^11.14.0" } }, "sha512-mvA+/ycMn7dnjjdooSPq516poFpSARRXhFhKjCXxGUmBZA+74vLDLbtD6VGzHd08A2JSZBSiAhVOZpjYqgV78A=="], + "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + + "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + + "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + + "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + + "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], - "@swapkit/ui/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], + "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto": ["@cosmjs/crypto@0.37.1", "", { "dependencies": { "@cosmjs/encoding": "^0.37.1", "@cosmjs/math": "^0.37.1", "@cosmjs/utils": "^0.37.1", "@noble/ciphers": "^1.3.0", "@noble/curves": "^1.9.2", "@noble/hashes": "^1.8.0", "@scure/bip39": "^1.6.0", "hash-wasm": "^4.12.0" } }, "sha512-CdLOKQVJM422UegKpi4T/xkdNwvLZwJwSC7NyYi7tAyty0NzP67u+vNqar7Ok22ECkKLj6N9uRcIl4g62oZThA=="], + "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + + "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + + "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + + "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], "@trezor/blockchain-link-utils/@trezor/protobuf/protobufjs/long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="], @@ -4426,6 +4394,8 @@ "wif/bs58check/bs58/base-x": ["base-x@5.0.1", "", {}, "sha512-M7uio8Zt++eg3jPj+rHMfCC+IuygQHHCOU+IYsVtik6FWjuYpVt/+MRKcgsAMHh8mMFAwnB+Bs+mTrFiXjMzKg=="], + "@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], + "@ledgerhq/ledger-wallet-provider-core/@ledgerhq/context-module/ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], "@ledgerhq/ledger-wallet-provider-core/@ledgerhq/device-signer-kit-ethereum/ethers/@types/node/undici-types": ["undici-types@6.19.8", "", {}, "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="], @@ -4456,28 +4426,20 @@ "@solana/program-client-core/@solana/signers/@solana/transaction-messages/@solana/rpc-types/@solana/codecs-strings": ["@solana/codecs-strings@6.10.0", "", { "dependencies": { "@solana/codecs-core": "6.10.0", "@solana/codecs-numbers": "6.10.0", "@solana/errors": "6.10.0" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5.4.0" }, "optionalPeers": ["fastestsmallesttextencoderdecoder", "typescript"] }, "sha512-zlaqkg7K6F6IN4V/Ec8TWkTn054gxv7ZLagvGkuEyAdPQ6BzzsehOm2TqCuyXgJJTCGPLY1bEk6yH9NxANe0kA=="], - "@swapkit/plugins/@near-js/transactions/@near-js/crypto/@noble/curves/@noble/hashes": ["@noble/hashes@1.7.1", "", {}, "sha512-B8XBPsn4vT/KJAGqDzbwztd+6Yte3P4V7iafm24bxgDe/mlRuK6xmWPuCNrKt2vDafZ8MfJLlchDG/vYafQEjQ=="], - "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="], "@swapkit/ui/@cosmjs/stargate/@cosmjs/tendermint-rpc/@cosmjs/socket/ws": ["ws@7.5.13", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], - - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@swapkit/wallet-extensions/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@swapkit/wallet-extensions/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="], + "@swapkit/wallet-hardware/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="], + "@swapkit/wallets/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39": ["@scure/bip39@1.6.0", "", { "dependencies": { "@noble/hashes": "~1.8.0", "@scure/base": "~1.2.5" } }, "sha512-+lF0BbLiJNwVlev4eKelw1WWLaiKXw7sSl8T6FvBlWkdX+94aGJ4o8XjUdlyhTCjd8c+B3KT3JfS8P0bLRNU6A=="], + "@swapkit/wallets/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@3.1.0", "", { "dependencies": { "yocto-queue": "^0.1.0" } }, "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="], - - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/amino/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], - - "@swapkit/wallet-extensions/@cosmjs/stargate/@cosmjs/proto-signing/@cosmjs/crypto/@scure/bip39/@scure/base": ["@scure/base@1.2.6", "", {}, "sha512-g/nm5FgUa//MCj1gV09zTJTaM6KBAHqLN907YVQqf7zC49+DcO4B1so4ZX07Ef10Twr6nuqYEH9GEggFXA4Fmg=="], } } From f3c67b0f3611dd6257992169d0ab17dd48e6e0f7 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 14 Oct 2026 09:52:59 +0000 Subject: [PATCH 13/25] OKX Wallet only skips chains it does not expose and reports other connection errors Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .../src/okx/__tests__/okx.test.ts | 9 +++++ packages/wallet-extensions/src/okx/cardano.ts | 39 ------------------- packages/wallet-extensions/src/okx/index.ts | 20 ++++++---- 3 files changed, 21 insertions(+), 47 deletions(-) delete mode 100644 packages/wallet-extensions/src/okx/cardano.ts diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 61da608c..319663a9 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -59,4 +59,13 @@ describe("connectOkx", () => { expect(await result).toBe(true); expect(added[0].address).toBe(address); }); + + test("fails when the user rejects a chain even if another one connects", async () => { + const rejection = new Error("User rejected the request"); + globalThis.window = { + okxwallet: { cardano: mockCardano(), starknet: { enable: () => Promise.reject(rejection) } }, + }; + + await expect(connect([Chain.Cardano, Chain.Starknet]).result).rejects.toBe(rejection); + }); }); diff --git a/packages/wallet-extensions/src/okx/cardano.ts b/packages/wallet-extensions/src/okx/cardano.ts deleted file mode 100644 index ea985800..00000000 --- a/packages/wallet-extensions/src/okx/cardano.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { hex } from "@scure/base"; -import { Chain, SwapKitError } from "@swapkit/helpers"; -import type { CardanoWallet } from "@swapkit/toolboxes/cardano"; - -// Explicit type keeps the generated declarations from pointing into the typhonjs internals -export async function getOkxCardanoWallet(): Promise { - if (!(window.okxwallet && "cardano" in window.okxwallet)) { - throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cardano }); - } - - const api = await window.okxwallet.cardano.enable(); - - if ((await api.getNetworkId()) !== 1) { - throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Cardano, message: "Mainnet only" }); - } - - const { addCardanoVkeyWitnesses, decodeCardanoWitnessSet, getCardanoAddressFromBytes, getCardanoToolbox } = - await import("@swapkit/toolboxes/cardano"); - - const changeAddress = await api.getChangeAddress(); - const address = changeAddress.startsWith("addr") - ? changeAddress - : await getCardanoAddressFromBytes(hex.decode(changeAddress)); - - async function signTransaction(transaction: string) { - const witnesses = await decodeCardanoWitnessSet(await api.signTx(transaction)); - return addCardanoVkeyWitnesses(transaction, witnesses); - } - - const signer = { - address, - connect: () => Promise.resolve({ address }), - disconnect: () => Promise.resolve(), - getAddress: () => Promise.resolve(address), - signTransaction, - }; - - return { ...getCardanoToolbox({ signer }), address }; -} diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index e5355da1..0324a082 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -1,4 +1,4 @@ -import { Chain, filterSupportedChains, WalletOption } from "@swapkit/helpers"; +import { Chain, filterSupportedChains, SwapKitError, WalletOption } from "@swapkit/helpers"; import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import type { ExtensionWallet } from "../walletTypes"; import { getWalletMethods } from "./helpers"; @@ -15,15 +15,15 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ }), ); - // OKX Mobile does not expose every chain the extension does, so one missing chain should not block the rest - const failed = results.flatMap((result, index) => - result.status === "rejected" ? [{ chain: filteredChains[index], reason: result.reason }] : [], - ); + const errors = results.flatMap((result) => (result.status === "rejected" ? [result.reason] : [])); + // OKX Mobile does not expose every chain the extension does, only those are skipped + const realError = errors.find((error) => !isMissingChain(error)); - if (failed.length > 0 && failed.length === results.length) throw failed[0]?.reason; + if (realError) throw realError; + if (errors.length > 0 && errors.length === results.length) throw errors[0]; - for (const { chain, reason } of failed) { - console.error(`connectOkx: skipping ${chain}, failed to connect`, reason); + for (const error of errors) { + console.warn("connectOkx: skipping a chain OKX Wallet does not expose", error); } return true; @@ -76,3 +76,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ }); export const OKX_SUPPORTED_CHAINS = getWalletSupportedChains(okxWallet); + +function isMissingChain(error: unknown) { + return error instanceof SwapKitError && error.errorKey === "wallet_okx_not_found"; +} From 04f2f49a965dac9a998f22b3d31bf268f26301ef Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 14 Oct 2026 09:52:59 +0000 Subject: [PATCH 14/25] Connect OKX Cardano alongside the other chains Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- packages/wallet-extensions/src/okx/helpers.ts | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 75a33a46..63b8d55f 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -162,8 +162,34 @@ export async function getWalletMethods(chain: Chain): Promise { - const { getOkxCardanoWallet } = await import("./cardano"); - return getOkxCardanoWallet(); + if (!(window.okxwallet && "cardano" in window.okxwallet)) { + throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cardano }); + } + + const api = await window.okxwallet.cardano.enable(); + + if ((await api.getNetworkId()) !== 1) { + throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Cardano, message: "Mainnet only" }); + } + + const { addCardanoVkeyWitnesses, decodeCardanoWitnessSet, getCardanoAddressFromBytes, getCardanoToolbox } = + await import("@swapkit/toolboxes/cardano"); + + const changeAddress = await api.getChangeAddress(); + const address = changeAddress.startsWith("addr") + ? changeAddress + : await getCardanoAddressFromBytes(hex.decode(changeAddress)); + + const signer = { + address, + connect: () => Promise.resolve({ address }), + disconnect: () => Promise.resolve(), + getAddress: () => Promise.resolve(address), + signTransaction: async (transaction: string) => + addCardanoVkeyWitnesses(transaction, await decodeCardanoWitnessSet(await api.signTx(transaction))), + }; + + return { ...getCardanoToolbox({ signer }), address }; }) .with(Chain.Cosmos, async () => { if (!(window.okxwallet && "keplr" in window.okxwallet)) { From 574cca11b7d7c3249c1ff4f796f47faad01d1f27 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 14 Oct 2026 09:52:59 +0000 Subject: [PATCH 15/25] Note that OKX Mobile no longer follows EVM account switches Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-mobile-uses-okx-connector.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/okx-mobile-uses-okx-connector.md b/.changeset/okx-mobile-uses-okx-connector.md index 4afe788e..4c87e0d8 100644 --- a/.changeset/okx-mobile-uses-okx-connector.md +++ b/.changeset/okx-mobile-uses-okx-connector.md @@ -2,4 +2,4 @@ "@swapkit/wallets": major --- -**`loadWallet(WalletOption.OKX_MOBILE)` now returns the OKX wallet (`connectOkx`) instead of the generic EVM wallet (`connectEVMWallet`).** OKX Mobile is the same OKX integration running inside the OKX app's browser, so it now offers the same chains as the extension instead of only EVM chains. To migrate, replace `connectEVMWallet(chains, WalletOption.OKX_MOBILE)` with `connectOkx(chains)`. Connected chains are reported with the `OKX` wallet type, which is what the SwapKit widget already did for OKX Mobile. Importing `evmWallet` from `@swapkit/wallet-extensions/evm-extensions` and passing `WalletOption.OKX_MOBILE` keeps working unchanged. +**`loadWallet(WalletOption.OKX_MOBILE)` now returns the OKX wallet (`connectOkx`) instead of the generic EVM wallet (`connectEVMWallet`).** OKX Mobile is the same OKX integration running inside the OKX app's browser, so it now offers the same chains as the extension instead of only EVM chains. To migrate, replace `connectEVMWallet(chains, WalletOption.OKX_MOBILE)` with `connectOkx(chains)`. Connected chains are reported with the `OKX` wallet type, which is what the SwapKit widget already did for OKX Mobile. Importing `evmWallet` from `@swapkit/wallet-extensions/evm-extensions` and passing `WalletOption.OKX_MOBILE` keeps working unchanged. Like the OKX extension, OKX Mobile no longer follows EVM account switches in the wallet: reconnect after switching accounts. From f347a5e6b485440ba40228470493cc71662c3fe3 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 14 Oct 2026 10:04:56 +0000 Subject: [PATCH 16/25] OKX Wallet connects Sui Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-sui.md | 6 ++ .../src/okx/__tests__/okx.test.ts | 34 +++++++++- packages/wallet-extensions/src/okx/helpers.ts | 63 +++++++++++++++++++ packages/wallet-extensions/src/okx/index.ts | 2 + 4 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 .changeset/okx-sui.md diff --git a/.changeset/okx-sui.md b/.changeset/okx-sui.md new file mode 100644 index 00000000..815150cc --- /dev/null +++ b/.changeset/okx-sui.md @@ -0,0 +1,6 @@ +--- +"@swapkit/wallet-extensions": minor +"@swapkit/wallets": minor +--- + +OKX Wallet now connects Sui. OKX does not inject a Sui provider on `window`, so it is found through the Wallet Standard as "OKX Wallet". diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 319663a9..d8121058 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -1,10 +1,29 @@ // @ts-nocheck - Test file with intentional mocking of browser globals -import { afterEach, describe, expect, test } from "bun:test"; +import { afterEach, describe, expect, mock, test } from "bun:test"; import { bech32, hex } from "@scure/base"; import { Chain } from "@swapkit/helpers"; +import { getWalletMethods } from "../helpers"; import { okxWallet } from "../index"; +const SUI_ADDRESS = `0x${"7".repeat(64)}`; +const suiRequests = []; +const suiWallet = { + chains: ["sui:mainnet"], + features: { + "standard:connect": { connect: async () => ({ accounts: [{ address: SUI_ADDRESS, chains: ["sui:mainnet"] }] }) }, + "sui:signTransaction": { + signTransaction: async (input) => { + suiRequests.push({ ...input, transaction: await input.transaction.toJSON() }); + return { bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }; + }, + }, + }, + name: "OKX Wallet", +}; + +mock.module("@wallet-standard/app", () => ({ getWallets: () => ({ get: () => [suiWallet] }) })); + // CIP-19 mainnet base address test vector const CARDANO_ADDRESS = "addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x"; @@ -69,3 +88,16 @@ describe("connectOkx", () => { await expect(connect([Chain.Cardano, Chain.Starknet]).result).rejects.toBe(rejection); }); }); + +describe("OKX Sui", () => { + test("asks the wallet standard account to sign the exact transaction bytes", async () => { + const wallet = await getWalletMethods(Chain.Sui); + const signed = await wallet.signTransaction(Uint8Array.from([1, 2, 3])); + + expect(wallet.address).toBe(SUI_ADDRESS); + expect(suiRequests).toEqual([ + { account: { address: SUI_ADDRESS, chains: ["sui:mainnet"] }, chain: "sui:mainnet", transaction: "AQID" }, + ]); + expect(signed).toEqual({ bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }); + }); +}); diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 63b8d55f..98afd3c3 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -14,6 +14,18 @@ import type { Eip1193Provider } from "ethers"; import { getUtxoScriptTypeParams } from "../helpers/utxoScriptType"; type WalletMethodsWithAddress = Record & { address: string }; +type SuiAccount = { address: string; chains: readonly string[] }; +type SuiSignInput = { account: SuiAccount; chain: string; transaction?: unknown; transactionBlock?: unknown }; +type OkxSuiFeatures = { + "standard:connect"?: { connect: () => Promise<{ accounts: readonly SuiAccount[] }> }; + "sui:signTransaction"?: { signTransaction: (input: SuiSignInput) => Promise<{ bytes: string; signature: string }> }; + "sui:signTransactionBlock"?: { + signTransactionBlock: (input: SuiSignInput) => Promise<{ transactionBlockBytes: string; signature: string }>; + }; +}; + +const SUI_MAINNET = "sui:mainnet"; + type OkxEvmProvider = Eip1193Provider & { send?: (method: string, params: unknown[]) => Promise<{ result?: string[] } | string[]>; }; @@ -191,6 +203,57 @@ export async function getWalletMethods(chain: Chain): Promise { + const { getWallets } = await import("@wallet-standard/app"); + const wallet = getWallets() + .get() + .find(({ chains, name }) => name === "OKX Wallet" && chains.includes(SUI_MAINNET)); + const features = wallet?.features as OkxSuiFeatures | undefined; + const connect = features?.["standard:connect"]; + + if (!(features && connect)) { + throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Sui }); + } + + const { accounts } = await connect.connect(); + const account = accounts.find(({ chains }) => chains.includes(SUI_MAINNET)) ?? accounts[0]; + + if (!account) { + throw new SwapKitError("wallet_okx_no_accounts", { chain: Chain.Sui }); + } + + const signTransaction = async (txBytes: Uint8Array) => { + const serialized = Buffer.from(txBytes).toString("base64"); + const transaction = { serialize: () => serialized, toJSON: () => Promise.resolve(serialized) }; + const signFeature = features["sui:signTransaction"]; + + if (signFeature) { + const { bytes, signature } = await signFeature.signTransaction({ + account, + chain: SUI_MAINNET, + transaction, + }); + return { bytes, signature }; + } + + const legacyFeature = features["sui:signTransactionBlock"]; + if (!legacyFeature) { + throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui }); + } + + const { transactionBlockBytes, signature } = await legacyFeature.signTransactionBlock({ + account, + chain: SUI_MAINNET, + transactionBlock: transaction, + }); + return { bytes: transactionBlockBytes, signature }; + }; + + const { getSuiToolbox } = await import("@swapkit/toolboxes/sui"); + const signer = { getAddress: () => account.address, signTransaction, toSuiAddress: () => account.address }; + + return { ...getSuiToolbox({ signer }), address: account.address }; + }) .with(Chain.Cosmos, async () => { if (!(window.okxwallet && "keplr" in window.okxwallet)) { throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cosmos }); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 0324a082..07dccfa1 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -45,6 +45,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ [Chain.Polygon]: true, [Chain.Solana]: true, [Chain.Starknet]: true, + [Chain.Sui]: true, [Chain.Tron]: true, [Chain.XLayer]: true, // [Chain.Aptos]: blocked on toolbox @@ -69,6 +70,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ Chain.Polygon, Chain.Solana, Chain.Starknet, + Chain.Sui, Chain.XLayer, Chain.Tron, ], From ec2305c028fbc4cb7ee4b5ae2fe42cfa928b8a52 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 14 Oct 2026 10:18:58 +0000 Subject: [PATCH 17/25] OKX Wallet asks for one chain at a time when connecting Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .../src/okx/__tests__/okx.test.ts | 28 +++++++++++++++++++ packages/wallet-extensions/src/okx/index.ts | 24 ++++++++-------- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 319663a9..35d9a7c6 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -68,4 +68,32 @@ describe("connectOkx", () => { await expect(connect([Chain.Cardano, Chain.Starknet]).result).rejects.toBe(rejection); }); + + test("asks the wallet for one chain at a time", async () => { + let pending = 0; + let maxPending = 0; + const approve = async (value: T) => { + pending += 1; + maxPending = Math.max(maxPending, pending); + await Bun.sleep(1); + pending -= 1; + return value; + }; + const address = `0x${"1".repeat(64)}`; + globalThis.window = { + okxwallet: { + cardano: { enable: () => approve(mockCardano().enable()) }, + starknet: { + enable() { + this.account = { address }; + return approve([address]); + }, + }, + }, + }; + + await connect([Chain.Cardano, Chain.Starknet]).result; + + expect(maxPending).toBe(1); + }); }); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 0324a082..bee1ce76 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -8,21 +8,23 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ async function connectOkx(chains: Chain[]) { const filteredChains = filterSupportedChains({ chains, supportedChains, walletType }); - const results = await Promise.allSettled( - filteredChains.map(async (chain) => { + const missingChains: unknown[] = []; + + // OKX Wallet shows one approval at a time and rejects requests made while one is open + for (const chain of filteredChains) { + try { const walletMethods = await getWalletMethods(chain); addChain({ ...walletMethods, chain, walletType }); - }), - ); - - const errors = results.flatMap((result) => (result.status === "rejected" ? [result.reason] : [])); - // OKX Mobile does not expose every chain the extension does, only those are skipped - const realError = errors.find((error) => !isMissingChain(error)); + } catch (error) { + // OKX Mobile does not expose every chain the extension does, only those are skipped + if (!isMissingChain(error)) throw error; + missingChains.push(error); + } + } - if (realError) throw realError; - if (errors.length > 0 && errors.length === results.length) throw errors[0]; + if (missingChains.length > 0 && missingChains.length === filteredChains.length) throw missingChains[0]; - for (const error of errors) { + for (const error of missingChains) { console.warn("connectOkx: skipping a chain OKX Wallet does not expose", error); } From 95f44067730537442ecd12ce1aecc76ed9db849c Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 14 Oct 2026 12:30:06 +0000 Subject: [PATCH 18/25] OKX Wallet connects Arc, HyperEVM and Robinhood Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-solana-starknet-cardano.md | 2 +- packages/wallet-extensions/src/okx/helpers.ts | 3 +++ packages/wallet-extensions/src/okx/index.ts | 6 ++++++ 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/.changeset/okx-solana-starknet-cardano.md b/.changeset/okx-solana-starknet-cardano.md index 19b58b08..3768d6f1 100644 --- a/.changeset/okx-solana-starknet-cardano.md +++ b/.changeset/okx-solana-starknet-cardano.md @@ -3,4 +3,4 @@ "@swapkit/wallets": minor --- -OKX Wallet now connects Solana, Starknet and Cardano. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. A Starknet account the user has never used is not deployed yet and fails with `toolbox_starknet_account_not_deployed` until it has been deployed from the OKX Wallet. +OKX Wallet now connects Solana, Starknet and Cardano, plus the Arc, HyperEVM and Robinhood EVM chains. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. A Starknet account the user has never used is not deployed yet and fails with `toolbox_starknet_account_not_deployed` until it has been deployed from the OKX Wallet. diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 63b8d55f..118d8e43 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -71,6 +71,7 @@ export async function getWalletMethods(chain: Chain): Promise { diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index bee1ce76..8b1269aa 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -32,6 +32,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ }, directSigningSupport: { [Chain.Arbitrum]: true, + [Chain.Arc]: true, [Chain.Aurora]: true, [Chain.Avalanche]: true, [Chain.Base]: true, @@ -42,9 +43,11 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ [Chain.Cosmos]: true, [Chain.Ethereum]: true, [Chain.Gnosis]: true, + [Chain.Hyperevm]: true, [Chain.Monad]: true, [Chain.Optimism]: true, [Chain.Polygon]: true, + [Chain.Robinhood]: true, [Chain.Solana]: true, [Chain.Starknet]: true, [Chain.Tron]: true, @@ -54,6 +57,7 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ name: "connectOkx", supportedChains: [ Chain.Arbitrum, + Chain.Arc, Chain.Aurora, Chain.Avalanche, Chain.Base, @@ -64,11 +68,13 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ Chain.Cosmos, Chain.Ethereum, Chain.Gnosis, + Chain.Hyperevm, Chain.Monad, // NEAR transfer is not yet supported in OKX Wallet // Chain.Near, Chain.Optimism, Chain.Polygon, + Chain.Robinhood, Chain.Solana, Chain.Starknet, Chain.XLayer, From de0d43b803599cc687644a40abfc548c36113902 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 14 Oct 2026 13:47:42 +0000 Subject: [PATCH 19/25] Move OKX Starknet support to its own pull request Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_011umPtzv2SMVhiAMYReaKXR --- .changeset/okx-solana-starknet-cardano.md | 2 +- .../src/okx/__tests__/okx.test.ts | 41 ++++++------------- packages/wallet-extensions/src/okx/helpers.ts | 18 -------- packages/wallet-extensions/src/okx/index.ts | 2 - packages/wallet-extensions/src/types.ts | 6 --- 5 files changed, 13 insertions(+), 56 deletions(-) diff --git a/.changeset/okx-solana-starknet-cardano.md b/.changeset/okx-solana-starknet-cardano.md index 3768d6f1..a3ae26ec 100644 --- a/.changeset/okx-solana-starknet-cardano.md +++ b/.changeset/okx-solana-starknet-cardano.md @@ -3,4 +3,4 @@ "@swapkit/wallets": minor --- -OKX Wallet now connects Solana, Starknet and Cardano, plus the Arc, HyperEVM and Robinhood EVM chains. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. A Starknet account the user has never used is not deployed yet and fails with `toolbox_starknet_account_not_deployed` until it has been deployed from the OKX Wallet. +OKX Wallet now connects Solana and Cardano, plus the Arc, HyperEVM and Robinhood EVM chains. A chain the wallet does not expose, such as Cardano on OKX Mobile, is skipped instead of failing the whole connection. diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 35d9a7c6..0ad3f080 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -9,6 +9,12 @@ import { okxWallet } from "../index"; const CARDANO_ADDRESS = "addr1qx2fxv2umyhttkxyxp8x0dlpdt3k6cwng5pxj3jhsydzer3n0d3vllmyqwsx5wktcd8cc3sq835lu7drv2xwl2wywfgse35a3x"; +const SOLANA_ADDRESS = "4Nd1mBQtrMJVYVfKf2PJy9NZUZdTAsp7D4xWLs4gDB4T"; + +function mockSolanaConnect() { + return Promise.resolve({ publicKey: { toString: () => SOLANA_ADDRESS } }); +} + function mockCardano() { return { enable: async () => ({ @@ -32,7 +38,7 @@ describe("connectOkx", () => { test("keeps the available chains when another chain is missing in the wallet", async () => { globalThis.window = { okxwallet: { cardano: mockCardano() } }; - const { added, result } = connect([Chain.Cardano, Chain.Starknet]); + const { added, result } = connect([Chain.Cardano, Chain.Solana]); expect(await result).toBe(true); expect(added.map(({ chain }) => chain)).toEqual([Chain.Cardano]); @@ -42,31 +48,14 @@ describe("connectOkx", () => { test("fails when no chain can be connected", async () => { globalThis.window = { okxwallet: {} }; - await expect(connect([Chain.Starknet]).result).rejects.toThrow(); - }); - - test("reads the Starknet account once the wallet has been enabled", async () => { - const address = `0x${"1".repeat(64)}`; - const starknet = { - enable() { - this.account = { address }; - return Promise.resolve([address]); - }, - }; - globalThis.window = { okxwallet: { starknet } }; - const { added, result } = connect([Chain.Starknet]); - - expect(await result).toBe(true); - expect(added[0].address).toBe(address); + await expect(connect([Chain.Solana]).result).rejects.toThrow(); }); test("fails when the user rejects a chain even if another one connects", async () => { const rejection = new Error("User rejected the request"); - globalThis.window = { - okxwallet: { cardano: mockCardano(), starknet: { enable: () => Promise.reject(rejection) } }, - }; + globalThis.window = { okxwallet: { cardano: mockCardano(), solana: { connect: () => Promise.reject(rejection) } } }; - await expect(connect([Chain.Cardano, Chain.Starknet]).result).rejects.toBe(rejection); + await expect(connect([Chain.Cardano, Chain.Solana]).result).rejects.toBe(rejection); }); test("asks the wallet for one chain at a time", async () => { @@ -79,20 +68,14 @@ describe("connectOkx", () => { pending -= 1; return value; }; - const address = `0x${"1".repeat(64)}`; globalThis.window = { okxwallet: { cardano: { enable: () => approve(mockCardano().enable()) }, - starknet: { - enable() { - this.account = { address }; - return approve([address]); - }, - }, + solana: { connect: () => approve(mockSolanaConnect()) }, }, }; - await connect([Chain.Cardano, Chain.Starknet]).result; + await connect([Chain.Cardano, Chain.Solana]).result; expect(maxPending).toBe(1); }); diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 118d8e43..57c24294 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -146,24 +146,6 @@ export async function getWalletMethods(chain: Chain): Promise { - if (!(window.okxwallet && "starknet" in window.okxwallet)) { - throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Starknet }); - } - - const { getStarknetToolbox } = await import("@swapkit/toolboxes/starknet"); - const provider = window.okxwallet.starknet; - const [address] = await provider.enable(); - const { account } = provider; - - if (!(address && account)) { - throw new SwapKitError("wallet_okx_no_accounts", { chain: Chain.Starknet }); - } - - const toolbox = getStarknetToolbox({ signer: account }); - - return { ...toolbox, address: account.address }; - }) .with(Chain.Cardano, async () => { if (!(window.okxwallet && "cardano" in window.okxwallet)) { throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Cardano }); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 8b1269aa..1d7067d0 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -49,7 +49,6 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ [Chain.Polygon]: true, [Chain.Robinhood]: true, [Chain.Solana]: true, - [Chain.Starknet]: true, [Chain.Tron]: true, [Chain.XLayer]: true, // [Chain.Aptos]: blocked on toolbox @@ -76,7 +75,6 @@ export const okxWallet: ExtensionWallet<"connectOkx"> = createWallet({ Chain.Polygon, Chain.Robinhood, Chain.Solana, - Chain.Starknet, Chain.XLayer, Chain.Tron, ], diff --git a/packages/wallet-extensions/src/types.ts b/packages/wallet-extensions/src/types.ts index fc53c639..e1e21230 100644 --- a/packages/wallet-extensions/src/types.ts +++ b/packages/wallet-extensions/src/types.ts @@ -6,16 +6,11 @@ import type { EthereumWindowProvider } from "@swapkit/helpers"; // replacing the @cosmjs ones — type the handles with those. import type { OfflineAminoSigner, OfflineDirectSigner } from "@swapkit/toolboxes/cosmos"; import type { SolanaProvider } from "@swapkit/toolboxes/solana"; -import type { StarknetToolboxParams } from "@swapkit/toolboxes/starknet"; import type { SubstrateInjectedExtension } from "@swapkit/toolboxes/substrate"; import type { Eip1193Provider } from "ethers"; import type { NearBrowserWalletProvider } from "./helpers/near"; import type { TronLinkWindow } from "./tronlink"; -type StarknetAccount = NonNullable["signer"]>; - -export type OkxStarknetProvider = { account?: StarknetAccount; enable: () => Promise }; - export type OkxCardanoApi = { getChangeAddress: () => Promise; getNetworkId: () => Promise; @@ -141,7 +136,6 @@ declare global { getOfflineSignerOnlyAmino: (chainId: string) => OfflineAminoSigner; }; solana: SolanaProvider; - starknet: OkxStarknetProvider; cardano: { enable: () => Promise }; near: NearBrowserWalletProvider & { requestSignIn: (params?: { From 8fa809bfb3c542047170111d96e607350c756b56 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Fri, 16 Oct 2026 08:30:12 +0000 Subject: [PATCH 20/25] OKX Wallet checks Sui mainnet and signing support when connecting Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013h1TFaTPGTdT7HcrPsnJYg --- .../src/okx/__tests__/okx.test.ts | 20 +++++++ packages/wallet-extensions/src/okx/helpers.ts | 53 ++++++++++--------- 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 083dc33d..32336eeb 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -125,6 +125,26 @@ describe("OKX Sui", () => { ]); expect(signed).toEqual({ bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }); }); + + test("rejects a wallet that only returns non-mainnet accounts", async () => { + const { connect } = suiWallet.features["standard:connect"]; + suiWallet.features["standard:connect"].connect = async () => ({ + accounts: [{ address: SUI_ADDRESS, chains: ["sui:testnet"] }], + }); + + await expect(getWalletMethods(Chain.Sui)).rejects.toThrow("wallet_okx_chain_not_supported"); + suiWallet.features["standard:connect"].connect = connect; + }); + + test("rejects a wallet without a Sui signing feature before connecting", async () => { + const { "sui:signTransaction": signFeature, ...features } = suiWallet.features; + let connected = false; + suiWallet.features = { ...features, "standard:connect": { connect: async () => (connected = true) } }; + + await expect(getWalletMethods(Chain.Sui)).rejects.toThrow("wallet_okx_chain_not_supported"); + expect(connected).toBe(false); + suiWallet.features = { ...features, "sui:signTransaction": signFeature }; + }); }); describe("OKX TON", () => { diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 1370015e..9c09e1dd 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -1,4 +1,4 @@ -import { hex } from "@scure/base"; +import { base64, hex } from "@scure/base"; import { Chain, type EVMChain, @@ -201,38 +201,39 @@ export async function getWalletMethods(chain: Chain): Promise + signFeature.signTransaction({ account, chain: SUI_MAINNET, transaction }) + : legacyFeature && + (async (account: SuiAccount, transactionBlock: unknown) => { + const { transactionBlockBytes, signature } = await legacyFeature.signTransactionBlock({ + account, + chain: SUI_MAINNET, + transactionBlock, + }); + return { bytes: transactionBlockBytes, signature }; + }); + + if (!signWithWallet) { + throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui }); + } + const { accounts } = await connect.connect(); - const account = accounts.find(({ chains }) => chains.includes(SUI_MAINNET)) ?? accounts[0]; + const account = accounts.find(({ chains }) => chains.includes(SUI_MAINNET)); if (!account) { - throw new SwapKitError("wallet_okx_no_accounts", { chain: Chain.Sui }); + throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui, message: "Mainnet only" }); } const signTransaction = async (txBytes: Uint8Array) => { - const serialized = Buffer.from(txBytes).toString("base64"); - const transaction = { serialize: () => serialized, toJSON: () => Promise.resolve(serialized) }; - const signFeature = features["sui:signTransaction"]; - - if (signFeature) { - const { bytes, signature } = await signFeature.signTransaction({ - account, - chain: SUI_MAINNET, - transaction, - }); - return { bytes, signature }; - } - - const legacyFeature = features["sui:signTransactionBlock"]; - if (!legacyFeature) { - throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui }); - } - - const { transactionBlockBytes, signature } = await legacyFeature.signTransactionBlock({ - account, - chain: SUI_MAINNET, - transactionBlock: transaction, + const serialized = base64.encode(txBytes); + const { bytes, signature } = await signWithWallet(account, { + serialize: () => serialized, + toJSON: () => Promise.resolve(serialized), }); - return { bytes: transactionBlockBytes, signature }; + return { bytes, signature }; }; const { getSuiToolbox } = await import("@swapkit/toolboxes/sui"); From adac2fd19b5b809b9c63bb2f563ff9070be6cca5 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Mon, 26 Oct 2026 08:25:26 +0000 Subject: [PATCH 21/25] Move OKX Sui connection to its own module and test it with the real wallet registry Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013h1TFaTPGTdT7HcrPsnJYg --- .../src/okx/__tests__/okx.test.ts | 67 ++++++++++-------- packages/wallet-extensions/src/okx/helpers.ts | 68 +------------------ packages/wallet-extensions/src/okx/sui.ts | 63 +++++++++++++++++ 3 files changed, 105 insertions(+), 93 deletions(-) create mode 100644 packages/wallet-extensions/src/okx/sui.ts diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index e09d2e00..a0bd9781 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -1,29 +1,14 @@ // @ts-nocheck - Test file with intentional mocking of browser globals -import { afterEach, describe, expect, mock, test } from "bun:test"; +import { afterEach, describe, expect, test } from "bun:test"; import { bech32, hex } from "@scure/base"; import { AssetValue, Chain } from "@swapkit/helpers"; import { Address, beginCell } from "@ton/core"; +import { getWallets } from "@wallet-standard/app"; import { getWalletMethods } from "../helpers"; import { okxWallet } from "../index"; const SUI_ADDRESS = `0x${"7".repeat(64)}`; -const suiRequests = []; -const suiWallet = { - chains: ["sui:mainnet"], - features: { - "standard:connect": { connect: async () => ({ accounts: [{ address: SUI_ADDRESS, chains: ["sui:mainnet"] }] }) }, - "sui:signTransaction": { - signTransaction: async (input) => { - suiRequests.push({ ...input, transaction: await input.transaction.toJSON() }); - return { bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }; - }, - }, - }, - name: "OKX Wallet", -}; - -mock.module("@wallet-standard/app", () => ({ getWallets: () => ({ get: () => [suiWallet] }) })); const RAW_TON_ADDRESS = `0:${"ab".repeat(32)}`; @@ -130,35 +115,61 @@ describe("connectOkx", () => { }); describe("OKX Sui", () => { + const unregisterWallets = []; + + function registerSuiWallet({ chains = ["sui:mainnet"], signFeature = true } = {}) { + const requests = []; + const features = { + "standard:connect": { + connect: () => { + requests.push("connect"); + return Promise.resolve({ accounts: [{ address: SUI_ADDRESS, chains }] }); + }, + }, + }; + if (signFeature) { + features["sui:signTransaction"] = { + signTransaction: async (input) => { + requests.push({ ...input, transaction: await input.transaction.toJSON() }); + return { bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }; + }, + }; + } + unregisterWallets.push( + getWallets().register({ accounts: [], chains: ["sui:mainnet"], features, name: "OKX Wallet" }), + ); + return requests; + } + + afterEach(() => { + for (const unregister of unregisterWallets.splice(0)) unregister(); + }); + test("asks the wallet standard account to sign the exact transaction bytes", async () => { + const requests = registerSuiWallet(); + const wallet = await getWalletMethods(Chain.Sui); const signed = await wallet.signTransaction(Uint8Array.from([1, 2, 3])); expect(wallet.address).toBe(SUI_ADDRESS); - expect(suiRequests).toEqual([ + expect(requests).toEqual([ + "connect", { account: { address: SUI_ADDRESS, chains: ["sui:mainnet"] }, chain: "sui:mainnet", transaction: "AQID" }, ]); expect(signed).toEqual({ bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }); }); test("rejects a wallet that only returns non-mainnet accounts", async () => { - const { connect } = suiWallet.features["standard:connect"]; - suiWallet.features["standard:connect"].connect = async () => ({ - accounts: [{ address: SUI_ADDRESS, chains: ["sui:testnet"] }], - }); + registerSuiWallet({ chains: ["sui:testnet"] }); await expect(getWalletMethods(Chain.Sui)).rejects.toThrow("wallet_okx_chain_not_supported"); - suiWallet.features["standard:connect"].connect = connect; }); test("rejects a wallet without a Sui signing feature before connecting", async () => { - const { "sui:signTransaction": signFeature, ...features } = suiWallet.features; - let connected = false; - suiWallet.features = { ...features, "standard:connect": { connect: async () => (connected = true) } }; + const requests = registerSuiWallet({ signFeature: false }); await expect(getWalletMethods(Chain.Sui)).rejects.toThrow("wallet_okx_chain_not_supported"); - expect(connected).toBe(false); - suiWallet.features = { ...features, "sui:signTransaction": signFeature }; + expect(requests).toEqual([]); }); }); diff --git a/packages/wallet-extensions/src/okx/helpers.ts b/packages/wallet-extensions/src/okx/helpers.ts index 6c5344da..aa30c9b0 100644 --- a/packages/wallet-extensions/src/okx/helpers.ts +++ b/packages/wallet-extensions/src/okx/helpers.ts @@ -1,4 +1,4 @@ -import { base64, hex } from "@scure/base"; +import { hex } from "@scure/base"; import { Chain, type EVMChain, @@ -12,21 +12,10 @@ import type { TronSignedTransaction, TronSigner, TronTransaction } from "@swapki import { Transaction } from "@swapkit/utxo-signer"; import type { Eip1193Provider } from "ethers"; import { getUtxoScriptTypeParams } from "../helpers/utxoScriptType"; +import { getOkxSuiWallet } from "./sui"; import { getOkxTonWallet } from "./ton"; type WalletMethodsWithAddress = Record & { address: string }; -type SuiAccount = { address: string; chains: readonly string[] }; -type SuiSignInput = { account: SuiAccount; chain: string; transaction?: unknown; transactionBlock?: unknown }; -type OkxSuiFeatures = { - "standard:connect"?: { connect: () => Promise<{ accounts: readonly SuiAccount[] }> }; - "sui:signTransaction"?: { signTransaction: (input: SuiSignInput) => Promise<{ bytes: string; signature: string }> }; - "sui:signTransactionBlock"?: { - signTransactionBlock: (input: SuiSignInput) => Promise<{ transactionBlockBytes: string; signature: string }>; - }; -}; - -const SUI_MAINNET = "sui:mainnet"; - type OkxEvmProvider = Eip1193Provider & { send?: (method: string, params: unknown[]) => Promise<{ result?: string[] } | string[]>; }; @@ -207,58 +196,7 @@ export async function getWalletMethods(chain: Chain): Promise { - const { getWallets } = await import("@wallet-standard/app"); - const wallet = getWallets() - .get() - .find(({ chains, name }) => name === "OKX Wallet" && chains.includes(SUI_MAINNET)); - const features = wallet?.features as OkxSuiFeatures | undefined; - const connect = features?.["standard:connect"]; - - if (!(features && connect)) { - throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Sui }); - } - - const signFeature = features["sui:signTransaction"]; - const legacyFeature = features["sui:signTransactionBlock"]; - const signWithWallet = signFeature - ? (account: SuiAccount, transaction: unknown) => - signFeature.signTransaction({ account, chain: SUI_MAINNET, transaction }) - : legacyFeature && - (async (account: SuiAccount, transactionBlock: unknown) => { - const { transactionBlockBytes, signature } = await legacyFeature.signTransactionBlock({ - account, - chain: SUI_MAINNET, - transactionBlock, - }); - return { bytes: transactionBlockBytes, signature }; - }); - - if (!signWithWallet) { - throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui }); - } - - const { accounts } = await connect.connect(); - const account = accounts.find(({ chains }) => chains.includes(SUI_MAINNET)); - - if (!account) { - throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui, message: "Mainnet only" }); - } - - const signTransaction = async (txBytes: Uint8Array) => { - const serialized = base64.encode(txBytes); - const { bytes, signature } = await signWithWallet(account, { - serialize: () => serialized, - toJSON: () => Promise.resolve(serialized), - }); - return { bytes, signature }; - }; - - const { getSuiToolbox } = await import("@swapkit/toolboxes/sui"); - const signer = { getAddress: () => account.address, signTransaction, toSuiAddress: () => account.address }; - - return { ...getSuiToolbox({ signer }), address: account.address }; - }) + .with(Chain.Sui, () => getOkxSuiWallet()) .with(Chain.Ton, () => getOkxTonWallet()) .with(Chain.Cosmos, async () => { if (!(window.okxwallet && "keplr" in window.okxwallet)) { diff --git a/packages/wallet-extensions/src/okx/sui.ts b/packages/wallet-extensions/src/okx/sui.ts new file mode 100644 index 00000000..08da039e --- /dev/null +++ b/packages/wallet-extensions/src/okx/sui.ts @@ -0,0 +1,63 @@ +import { base64 } from "@scure/base"; +import { Chain, SwapKitError } from "@swapkit/helpers"; + +const SUI_MAINNET = "sui:mainnet"; + +type SuiAccount = { address: string; chains: readonly string[] }; +type SuiSignInput = { account: SuiAccount; chain: string; transaction?: unknown; transactionBlock?: unknown }; +type OkxSuiFeatures = { + "standard:connect"?: { connect: () => Promise<{ accounts: readonly SuiAccount[] }> }; + "sui:signTransaction"?: { signTransaction: (input: SuiSignInput) => Promise<{ bytes: string; signature: string }> }; + "sui:signTransactionBlock"?: { + signTransactionBlock: (input: SuiSignInput) => Promise<{ transactionBlockBytes: string; signature: string }>; + }; +}; + +export async function getOkxSuiWallet() { + const { getWallets } = await import("@wallet-standard/app"); + const wallet = getWallets() + .get() + .find(({ chains, name }) => name === "OKX Wallet" && chains.includes(SUI_MAINNET)); + const features = wallet?.features as OkxSuiFeatures | undefined; + const connect = features?.["standard:connect"]; + + if (!(features && connect)) { + throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Sui }); + } + + const signFeature = features["sui:signTransaction"]; + const legacyFeature = features["sui:signTransactionBlock"]; + const signWithWallet = signFeature + ? (account: SuiAccount, transaction: unknown) => + signFeature.signTransaction({ account, chain: SUI_MAINNET, transaction }) + : legacyFeature && + (async (account: SuiAccount, transactionBlock: unknown) => { + const { transactionBlockBytes, signature } = await legacyFeature.signTransactionBlock({ + account, + chain: SUI_MAINNET, + transactionBlock, + }); + return { bytes: transactionBlockBytes, signature }; + }); + + if (!signWithWallet) { + throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui }); + } + + const { accounts } = await connect.connect(); + const account = accounts.find(({ chains }) => chains.includes(SUI_MAINNET)); + + if (!account) { + throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui, message: "Mainnet only" }); + } + + const signTransaction = (txBytes: Uint8Array) => { + const serialized = base64.encode(txBytes); + return signWithWallet(account, { serialize: () => serialized, toJSON: () => Promise.resolve(serialized) }); + }; + + const { getSuiToolbox } = await import("@swapkit/toolboxes/sui"); + const signer = { getAddress: () => account.address, signTransaction, toSuiAddress: () => account.address }; + + return { ...getSuiToolbox({ signer }), address: account.address }; +} From 30bfed8bcf22b156c58e2498a1f942c059ec72f8 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Mon, 26 Oct 2026 08:30:22 +0000 Subject: [PATCH 22/25] OKX Wallet signs Sui with the current signing method only Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013h1TFaTPGTdT7HcrPsnJYg --- packages/wallet-extensions/src/okx/sui.ts | 25 +++++------------------ 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/packages/wallet-extensions/src/okx/sui.ts b/packages/wallet-extensions/src/okx/sui.ts index 08da039e..9eae74d9 100644 --- a/packages/wallet-extensions/src/okx/sui.ts +++ b/packages/wallet-extensions/src/okx/sui.ts @@ -4,13 +4,10 @@ import { Chain, SwapKitError } from "@swapkit/helpers"; const SUI_MAINNET = "sui:mainnet"; type SuiAccount = { address: string; chains: readonly string[] }; -type SuiSignInput = { account: SuiAccount; chain: string; transaction?: unknown; transactionBlock?: unknown }; +type SuiSignInput = { account: SuiAccount; chain: string; transaction: unknown }; type OkxSuiFeatures = { "standard:connect"?: { connect: () => Promise<{ accounts: readonly SuiAccount[] }> }; "sui:signTransaction"?: { signTransaction: (input: SuiSignInput) => Promise<{ bytes: string; signature: string }> }; - "sui:signTransactionBlock"?: { - signTransactionBlock: (input: SuiSignInput) => Promise<{ transactionBlockBytes: string; signature: string }>; - }; }; export async function getOkxSuiWallet() { @@ -26,21 +23,8 @@ export async function getOkxSuiWallet() { } const signFeature = features["sui:signTransaction"]; - const legacyFeature = features["sui:signTransactionBlock"]; - const signWithWallet = signFeature - ? (account: SuiAccount, transaction: unknown) => - signFeature.signTransaction({ account, chain: SUI_MAINNET, transaction }) - : legacyFeature && - (async (account: SuiAccount, transactionBlock: unknown) => { - const { transactionBlockBytes, signature } = await legacyFeature.signTransactionBlock({ - account, - chain: SUI_MAINNET, - transactionBlock, - }); - return { bytes: transactionBlockBytes, signature }; - }); - - if (!signWithWallet) { + + if (!signFeature) { throw new SwapKitError("wallet_okx_chain_not_supported", { chain: Chain.Sui }); } @@ -53,7 +37,8 @@ export async function getOkxSuiWallet() { const signTransaction = (txBytes: Uint8Array) => { const serialized = base64.encode(txBytes); - return signWithWallet(account, { serialize: () => serialized, toJSON: () => Promise.resolve(serialized) }); + const transaction = { serialize: () => serialized, toJSON: () => Promise.resolve(serialized) }; + return signFeature.signTransaction({ account, chain: SUI_MAINNET, transaction }); }; const { getSuiToolbox } = await import("@swapkit/toolboxes/sui"); From f92ca597e7b18f23c657a49f81b8757ec2d73a13 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Mon, 26 Oct 2026 08:32:45 +0000 Subject: [PATCH 23/25] Give the OKX Sui connector an explicit return type so type declarations build Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_013h1TFaTPGTdT7HcrPsnJYg --- packages/wallet-extensions/src/okx/sui.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/wallet-extensions/src/okx/sui.ts b/packages/wallet-extensions/src/okx/sui.ts index 9eae74d9..8ecd9087 100644 --- a/packages/wallet-extensions/src/okx/sui.ts +++ b/packages/wallet-extensions/src/okx/sui.ts @@ -1,5 +1,6 @@ import { base64 } from "@scure/base"; import { Chain, SwapKitError } from "@swapkit/helpers"; +import type { SuiWallet } from "@swapkit/toolboxes/sui"; const SUI_MAINNET = "sui:mainnet"; @@ -10,7 +11,7 @@ type OkxSuiFeatures = { "sui:signTransaction"?: { signTransaction: (input: SuiSignInput) => Promise<{ bytes: string; signature: string }> }; }; -export async function getOkxSuiWallet() { +export async function getOkxSuiWallet(): Promise { const { getWallets } = await import("@wallet-standard/app"); const wallet = getWallets() .get() From 82d1a0fe038fd3438ad28fdcc5c1c0c63f493c27 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 4 Nov 2026 17:01:35 +0000 Subject: [PATCH 24/25] OKX Wallet skips Sui when it cannot sign and rejects signatures over changed bytes Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01UJDF43tJSgkLDRo41jEWdF --- .../src/okx/__tests__/okx.test.ts | 25 ++++++++++++++----- packages/wallet-extensions/src/okx/sui.ts | 15 ++++++++--- 2 files changed, 31 insertions(+), 9 deletions(-) diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index a0bd9781..61428483 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -117,7 +117,7 @@ describe("connectOkx", () => { describe("OKX Sui", () => { const unregisterWallets = []; - function registerSuiWallet({ chains = ["sui:mainnet"], signFeature = true } = {}) { + function registerSuiWallet({ chains = ["sui:mainnet"], signFeature = true, signedBytes = undefined } = {}) { const requests = []; const features = { "standard:connect": { @@ -130,8 +130,9 @@ describe("OKX Sui", () => { if (signFeature) { features["sui:signTransaction"] = { signTransaction: async (input) => { - requests.push({ ...input, transaction: await input.transaction.toJSON() }); - return { bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }; + const transaction = await input.transaction.toJSON(); + requests.push({ ...input, transaction }); + return { bytes: signedBytes ?? transaction, signature: "c2lnbmF0dXJl" }; }, }; } @@ -156,7 +157,15 @@ describe("OKX Sui", () => { "connect", { account: { address: SUI_ADDRESS, chains: ["sui:mainnet"] }, chain: "sui:mainnet", transaction: "AQID" }, ]); - expect(signed).toEqual({ bytes: "c2lnbmVk", signature: "c2lnbmF0dXJl" }); + expect(signed).toEqual({ bytes: "AQID", signature: "c2lnbmF0dXJl" }); + }); + + test("rejects a signature over bytes the wallet changed", async () => { + registerSuiWallet({ signedBytes: "c2lnbmVk" }); + + const wallet = await getWalletMethods(Chain.Sui); + + await expect(wallet.signTransaction(Uint8Array.from([1, 2, 3]))).rejects.toThrow("wallet_okx_chain_not_supported"); }); test("rejects a wallet that only returns non-mainnet accounts", async () => { @@ -165,10 +174,14 @@ describe("OKX Sui", () => { await expect(getWalletMethods(Chain.Sui)).rejects.toThrow("wallet_okx_chain_not_supported"); }); - test("rejects a wallet without a Sui signing feature before connecting", async () => { + test("skips Sui without a signing feature and keeps the other chains", async () => { const requests = registerSuiWallet({ signFeature: false }); + globalThis.window = { okxwallet: { cardano: mockCardano() } }; + const added = []; + const connectOkx = okxWallet.connectOkx.connectWallet({ addChain: (wallet) => added.push(wallet) }); - await expect(getWalletMethods(Chain.Sui)).rejects.toThrow("wallet_okx_chain_not_supported"); + expect(await connectOkx([Chain.Cardano, Chain.Sui])).toBe(true); + expect(added.map(({ chain }) => chain)).toEqual([Chain.Cardano]); expect(requests).toEqual([]); }); }); diff --git a/packages/wallet-extensions/src/okx/sui.ts b/packages/wallet-extensions/src/okx/sui.ts index 8ecd9087..5e30dc73 100644 --- a/packages/wallet-extensions/src/okx/sui.ts +++ b/packages/wallet-extensions/src/okx/sui.ts @@ -26,7 +26,7 @@ export async function getOkxSuiWallet(): Promise { + const signTransaction = async (txBytes: Uint8Array) => { const serialized = base64.encode(txBytes); const transaction = { serialize: () => serialized, toJSON: () => Promise.resolve(serialized) }; - return signFeature.signTransaction({ account, chain: SUI_MAINNET, transaction }); + const signed = await signFeature.signTransaction({ account, chain: SUI_MAINNET, transaction }); + + if (signed.bytes !== serialized) { + throw new SwapKitError("wallet_okx_chain_not_supported", { + chain: Chain.Sui, + message: "Wallet modified the transaction", + }); + } + + return signed; }; const { getSuiToolbox } = await import("@swapkit/toolboxes/sui"); From 0ca994e489791d5181a45f0f3460837706340746 Mon Sep 17 00:00:00 2001 From: Hippocampus Date: Wed, 4 Nov 2026 17:28:54 +0000 Subject: [PATCH 25/25] OKX Wallet reports a changed Sui transaction as a signing error Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01UJDF43tJSgkLDRo41jEWdF --- .../wallet-extensions/src/okx/__tests__/okx.test.ts | 2 +- packages/wallet-extensions/src/okx/sui.ts | 11 +++-------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts index 61428483..b8c46766 100644 --- a/packages/wallet-extensions/src/okx/__tests__/okx.test.ts +++ b/packages/wallet-extensions/src/okx/__tests__/okx.test.ts @@ -165,7 +165,7 @@ describe("OKX Sui", () => { const wallet = await getWalletMethods(Chain.Sui); - await expect(wallet.signTransaction(Uint8Array.from([1, 2, 3]))).rejects.toThrow("wallet_okx_chain_not_supported"); + await expect(wallet.signTransaction(Uint8Array.from([1, 2, 3]))).rejects.toThrow("toolbox_sui_signing_error"); }); test("rejects a wallet that only returns non-mainnet accounts", async () => { diff --git a/packages/wallet-extensions/src/okx/sui.ts b/packages/wallet-extensions/src/okx/sui.ts index 5e30dc73..6c778a34 100644 --- a/packages/wallet-extensions/src/okx/sui.ts +++ b/packages/wallet-extensions/src/okx/sui.ts @@ -18,17 +18,12 @@ export async function getOkxSuiWallet(): Promise name === "OKX Wallet" && chains.includes(SUI_MAINNET)); const features = wallet?.features as OkxSuiFeatures | undefined; const connect = features?.["standard:connect"]; + const signFeature = features?.["sui:signTransaction"]; - if (!(features && connect)) { + if (!(connect && signFeature)) { throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Sui }); } - const signFeature = features["sui:signTransaction"]; - - if (!signFeature) { - throw new SwapKitError("wallet_okx_not_found", { chain: Chain.Sui, message: "No Sui signing feature" }); - } - const { accounts } = await connect.connect(); const account = accounts.find(({ chains }) => chains.includes(SUI_MAINNET)); @@ -42,7 +37,7 @@ export async function getOkxSuiWallet(): Promise