From 5a5a11738b1c8a2fd08fc571cc2156947ee05bd0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 16 Apr 2026 13:15:00 +0400 Subject: [PATCH] feat(wallets): per-wallet directSigningSupport for V3 swap flow MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Drop the duplicated local `core.ts` files and import `createWallet` / `getWalletSupportedChains` from `@swapkit/wallet-core` (^4.2.0) so all wallets share one canonical contract. * Stamp `directSigningSupport: Partial>` on every wallet so the SDK can decide V3 routing per (wallet, chain) without a central map. * Wire two real signers as part of the rollout: - Xaman/Ripple — `submitXamanPayload` exposes the signed `hex` blob and accepts `{ submit: false }`; new ChainSigner wraps xumm.payload.createAndSubscribe and is passed to `getRippleToolbox({ signer })`. - Ledger/Cosmos Hub — pass the existing `CosmosLedger` (already an OfflineAminoSigner) to `getCosmosToolbox(_, { signer })`. * BitGet Cosmos: use `getOfflineSignerAuto` so V3 proto SignDocs sign natively (Ledger via BitGet still falls back to amino). * WalletConnect EVM: add Aurora + Berachain to the EVM `getToolbox` switch and register `XLAYER_MAINNET_ID` so XLayer's namespace negotiation works. Co-Authored-By: Claude Opus 4.6 (1M context) --- .changeset/wallet-direct-signing-support.md | 16 ++++ bun.lock | 80 +++++++++---------- package.json | 28 +++---- packages/sdk/package.json | 14 ++-- packages/wallet-extensions/package.json | 5 +- .../wallet-extensions/src/bitget/index.ts | 10 ++- packages/wallet-extensions/src/core.ts | 37 --------- .../src/cosmostation/index.ts | 16 +++- packages/wallet-extensions/src/ctrl/index.ts | 23 +++++- .../src/evm-extensions/index.ts | 3 +- .../src/keepkey-bex/index.ts | 15 +++- packages/wallet-extensions/src/keplr/index.ts | 8 +- packages/wallet-extensions/src/okx/index.ts | 20 ++++- .../wallet-extensions/src/onekey/index.ts | 16 +++- packages/wallet-extensions/src/petra/index.ts | 4 +- .../wallet-extensions/src/phantom/index.ts | 8 +- .../wallet-extensions/src/polkadotjs/index.ts | 4 +- .../wallet-extensions/src/talisman/index.ts | 17 +++- .../wallet-extensions/src/tronlink/index.ts | 3 +- .../src/trustwallet/index.ts | 6 +- .../wallet-extensions/src/vultisig/index.ts | 13 ++- packages/wallet-hardware/package.json | 5 +- packages/wallet-hardware/src/core.ts | 37 --------- packages/wallet-hardware/src/keepkey/index.ts | 17 +++- packages/wallet-hardware/src/ledger/index.ts | 25 +++++- packages/wallet-hardware/src/trezor/index.ts | 17 +++- packages/wallet-mobile/package.json | 3 +- packages/wallets/package.json | 5 +- packages/wallets/src/coinbase/index.ts | 12 ++- packages/wallets/src/core.ts | 37 --------- packages/wallets/src/index.ts | 2 +- packages/wallets/src/keystore.ts | 17 +++- .../wallets/src/near-wallet-selector/index.ts | 3 +- packages/wallets/src/passkeys/index.ts | 7 +- packages/wallets/src/radix/index.ts | 4 +- .../wallets/src/walletconnect/constants.ts | 1 + packages/wallets/src/walletconnect/helpers.ts | 3 + packages/wallets/src/walletconnect/index.ts | 18 ++++- packages/wallets/src/xaman/helpers.ts | 19 ++++- packages/wallets/src/xaman/index.ts | 3 +- packages/wallets/src/xaman/walletMethods.ts | 14 +++- 41 files changed, 383 insertions(+), 212 deletions(-) create mode 100644 .changeset/wallet-direct-signing-support.md delete mode 100644 packages/wallet-extensions/src/core.ts delete mode 100644 packages/wallet-hardware/src/core.ts delete mode 100644 packages/wallets/src/core.ts diff --git a/.changeset/wallet-direct-signing-support.md b/.changeset/wallet-direct-signing-support.md new file mode 100644 index 0000000..e976ae9 --- /dev/null +++ b/.changeset/wallet-direct-signing-support.md @@ -0,0 +1,16 @@ +--- +"@swapkit/wallet-extensions": minor +"@swapkit/wallet-hardware": minor +"@swapkit/wallet-mobile": minor +"@swapkit/wallets": minor +--- + +Per-wallet `directSigningSupport` mappings for the V3 swap flow + +- Bump `@swapkit/wallet-core` to `^4.2.0` and delete the duplicated local `core.ts` files in `wallets`, `wallet-extensions`, and `wallet-hardware` — every wallet module now imports `createWallet` / `getWalletSupportedChains` from `@swapkit/wallet-core` directly. +- Stamp `directSigningSupport: Partial>` on every `createWallet({...})` call so the SDK can decide V3 routing per (wallet, chain) without consulting a central map. +- Wire two real signers as part of the rollout: + - **Xaman / Ripple** — `submitXamanPayload` now exposes the signed `hex` blob and accepts `{ submit: false }`; a new `ChainSigner` wraps `xumm.payload.createAndSubscribe` and is passed to `getRippleToolbox({ signer })`, unblocking V3 for XRPL. + - **Ledger / Cosmos Hub** — pass the existing `CosmosLedger` (already an `OfflineAminoSigner`) into `getCosmosToolbox(Chain.Cosmos, { signer })`, unblocking V3 for ATOM. Bespoke `transfer` retained for back-compat. +- BitGet Cosmos: switch `getOfflineSignerOnlyAmino` → `getOfflineSignerAuto` so V3 proto SignDocs sign natively (Ledger via BitGet still falls back to amino). +- WalletConnect EVM: fix latent bugs flagged by the V3 audit — add Aurora and Berachain to the EVM `getToolbox` switch, register `XLAYER_MAINNET_ID` so XLayer's namespace negotiation works. diff --git a/bun.lock b/bun.lock index b54ac9e..c6a4171 100644 --- a/bun.lock +++ b/bun.lock @@ -5,13 +5,13 @@ "": { "name": "swapkit-wallets", "dependencies": { - "@swapkit/core": "4.4.11", - "@swapkit/helpers": "4.12.9", - "@swapkit/plugins": "4.6.24", - "@swapkit/server": "4.2.35", - "@swapkit/toolboxes": "4.14.4", - "@swapkit/wallet-core": "4.1.28", - "@swapkit/wallet-keystore": "4.3.16", + "@swapkit/core": "4.4.12", + "@swapkit/helpers": "4.13.0", + "@swapkit/plugins": "4.6.26", + "@swapkit/server": "4.2.37", + "@swapkit/toolboxes": "4.14.5", + "@swapkit/wallet-core": "4.2.0", + "@swapkit/wallet-keystore": "4.3.18", }, "devDependencies": { "@biomejs/biome": "2.3.11", @@ -30,13 +30,13 @@ "version": "4.6.3", "dependencies": { "@stricahq/typhonjs": "~3.0.1", - "@swapkit/core": "^4.4.11", - "@swapkit/helpers": "^4.12.9", - "@swapkit/plugins": "^4.6.18", - "@swapkit/server": "^4.2.29", - "@swapkit/toolboxes": "^4.14.4", - "@swapkit/wallet-core": "^4.1.23", - "@swapkit/wallet-keystore": "^4.3.10", + "@swapkit/core": "^4.4.12", + "@swapkit/helpers": "^4.13.0", + "@swapkit/plugins": "^4.6.26", + "@swapkit/server": "^4.2.37", + "@swapkit/toolboxes": "^4.14.5", + "@swapkit/wallet-core": "^4.2.0", + "@swapkit/wallet-keystore": "^4.3.18", "@swapkit/wallets": "workspace:*", "cosmjs-types": "0.10.1", }, @@ -55,9 +55,10 @@ "@near-js/transactions": "~2.5.0", "@scure/base": "~2.0.0", "@solana/web3.js": "~1.98.4", - "@swapkit/helpers": "^4.12.9", - "@swapkit/toolboxes": "^4.14.4", + "@swapkit/helpers": "^4.13.0", + "@swapkit/toolboxes": "^4.14.5", "@swapkit/utxo-signer": "^2.1.1", + "@swapkit/wallet-core": "^4.2.0", "cosmjs-types": "0.10.1", "ethers": "^6.14.0", "sats-connect": "~1.0.0", @@ -104,9 +105,10 @@ "@near-js/crypto": "~2.5.0", "@near-js/transactions": "~2.5.0", "@scure/base": "2.0.0", - "@swapkit/helpers": "^4.12.9", - "@swapkit/toolboxes": "^4.14.4", + "@swapkit/helpers": "^4.13.0", + "@swapkit/toolboxes": "^4.14.5", "@swapkit/utxo-signer": "^2.1.1", + "@swapkit/wallet-core": "^4.2.0", "@trezor/connect-web": "~9.6.4", "cosmjs-types": "~0.10.1", "ethers": "^6.14.0", @@ -147,8 +149,9 @@ "name": "@swapkit/wallet-mobile", "version": "4.2.3", "dependencies": { - "@swapkit/helpers": "^4.12.9", - "@swapkit/toolboxes": "^4.14.4", + "@swapkit/helpers": "^4.13.0", + "@swapkit/toolboxes": "^4.14.5", + "@swapkit/wallet-core": "^4.2.0", }, }, "packages/wallets": { @@ -169,9 +172,10 @@ "@radixdlt/radix-dapp-toolkit": "~2.2.0", "@scure/base": "~2.0.0", "@scure/bip39": "~2.0.0", - "@swapkit/helpers": "^4.12.9", - "@swapkit/toolboxes": "^4.14.4", + "@swapkit/helpers": "^4.13.0", + "@swapkit/toolboxes": "^4.14.5", "@swapkit/utxo-signer": "^2.1.1", + "@swapkit/wallet-core": "^4.2.0", "@swapkit/wallet-extensions": "^4.4.3", "@swapkit/wallet-hardware": "^4.6.3", "@walletconnect/modal": "~2.7.0", @@ -220,14 +224,14 @@ }, }, "overrides": { - "@swapkit/core": "4.4.11", - "@swapkit/helpers": "4.12.9", - "@swapkit/plugins": "4.6.24", - "@swapkit/server": "4.2.35", - "@swapkit/toolboxes": "4.14.4", + "@swapkit/core": "4.4.12", + "@swapkit/helpers": "4.13.0", + "@swapkit/plugins": "4.6.26", + "@swapkit/server": "4.2.37", + "@swapkit/toolboxes": "4.14.5", "@swapkit/types": "0.7.3", - "@swapkit/wallet-core": "4.1.28", - "@swapkit/wallet-keystore": "4.3.16", + "@swapkit/wallet-core": "4.2.0", + "@swapkit/wallet-keystore": "4.3.18", }, "packages": { "@0no-co/graphql.web": ["@0no-co/graphql.web@1.2.0", "", { "peerDependencies": { "graphql": "^14.0.0 || ^15.0.0 || ^16.0.0" }, "optionalPeers": ["graphql"] }, "sha512-/1iHy9TTr63gE1YcR5idjx8UREz1s0kFhydf3bBLCXyqjhkIc6igAzTOx3zPifCwFR87tsh/4Pa9cNts6d2otw=="], @@ -782,31 +786,31 @@ "@swapkit/contracts": ["@swapkit/contracts@4.1.3", "", {}, "sha512-/qZd71Y8la4VOemG0TmlogxBain4nhs8D2bPhzeb5ZNQ/9v/qC42KlS8o3RQpNtU6YvB0laLsNpNcsh1xE/F1Q=="], - "@swapkit/core": ["@swapkit/core@4.4.11", "", { "dependencies": { "@stricahq/typhonjs": "3.0.1", "@swapkit/helpers": "4.12.9", "@swapkit/plugins": "4.6.25", "@swapkit/toolboxes": "4.14.4", "@swapkit/wallet-core": "4.1.29", "cosmjs-types": "0.10.1", "ts-pattern": "^5.9.0" } }, "sha512-dxUtEyZLHe3iSDybh8HGbLEC/X4UMrW41j47om4jsqPWzNbd+4ShL55m+wxkKRSb4iVYE/XizRewPdmuUkHq3A=="], + "@swapkit/core": ["@swapkit/core@4.4.12", "", { "dependencies": { "@stricahq/typhonjs": "3.0.1", "@swapkit/helpers": "4.13.0", "@swapkit/plugins": "4.6.26", "@swapkit/toolboxes": "4.14.5", "@swapkit/wallet-core": "4.2.0", "cosmjs-types": "0.10.1", "ts-pattern": "^5.9.0" } }, "sha512-B27bog6IPmgkrdc5ptl0yXbE2cveddsJvcsW9Eu2zOFMs6wx8aV77pIqGza4q0wxVWfToqRBhB6Edm6/WF+ZSg=="], - "@swapkit/helpers": ["@swapkit/helpers@4.12.9", "", { "dependencies": { "@near-js/providers": "~2.5.0", "@swapkit/contracts": "4.1.3", "@swapkit/tokens": "4.2.5", "@swapkit/types": "0.7.3", "ethers": "^6.14.0", "ts-pattern": "^5.9.0", "zod": "3.25.74", "zustand": "5.0.8" } }, "sha512-KTXEQd+vRchfMfccg05vI6SaZu7XacWOfC+ohDJTzrCdbOY466KVYZYXK1XBvrAJ3wXw/kKoNeNDumMTryUcoQ=="], + "@swapkit/helpers": ["@swapkit/helpers@4.13.0", "", { "dependencies": { "@near-js/providers": "~2.5.0", "@swapkit/contracts": "4.1.3", "@swapkit/tokens": "4.2.5", "@swapkit/types": "0.7.3", "ethers": "^6.14.0", "ts-pattern": "^5.9.0", "zod": "3.25.74", "zustand": "5.0.8" } }, "sha512-ZbhqcyWSIg6n3se15jVTJ2cBZTUWI00CiAulpUc7YJvL71yUfGYCuCd5wwN0QZE3wApxL6L2Yw8L6ISyKOCguQ=="], - "@swapkit/plugins": ["@swapkit/plugins@4.6.24", "", { "dependencies": { "@mysten/sui": "~1.44.0", "@near-js/transactions": "2.5.0", "@near-js/utils": "~2.5.0", "@noble/hashes": "2.0.1", "@scure/base": "2.0.0", "@solana/web3.js": "~1.98.4", "@swapkit/helpers": "4.12.8", "@swapkit/toolboxes": "4.14.3", "@swapkit/utxo-signer": "2.1.0", "ethers": "^6.14.0", "ts-pattern": "^5.9.0" } }, "sha512-BWBNbSgImti/xGj+OxVD2Oj6yqQhRp1DK2/kT+EjOK4OuUZL4mE8ioLaZht2FebIuKifhf9mDjZMhWivo8uQPw=="], + "@swapkit/plugins": ["@swapkit/plugins@4.6.26", "", { "dependencies": { "@mysten/sui": "~1.44.0", "@near-js/transactions": "2.5.0", "@near-js/utils": "~2.5.0", "@noble/hashes": "2.0.1", "@scure/base": "2.0.0", "@solana/web3.js": "~1.98.4", "@swapkit/helpers": "4.13.0", "@swapkit/toolboxes": "4.14.5", "@swapkit/utxo-signer": "2.1.1", "ethers": "^6.14.0", "ts-pattern": "^5.9.0" } }, "sha512-LUANz93MeACKdYdN8tKWBKDJwwp84pe8kBj0MqoKVWyCPUkewyY9VJ0XuP9sp687Y1P9kGCOEWtjcNGof/N8Vg=="], "@swapkit/sdk": ["@swapkit/sdk@workspace:packages/sdk"], - "@swapkit/server": ["@swapkit/server@4.2.35", "", { "dependencies": { "@swapkit/helpers": "4.12.8", "@swapkit/tokens": "4.2.4", "@swapkit/toolboxes": "4.14.3", "@swapkit/wallet-keystore": "4.3.16", "ts-pattern": "^5.9.0" } }, "sha512-4fwf/NUCQQfAI4HSXObGCiLc38qFTw8WgFRJBkxLQ7PEdJSgJVvClwYiiZf1Fwk4QJVQNQxSjjzRYmWGDqcnlQ=="], + "@swapkit/server": ["@swapkit/server@4.2.37", "", { "dependencies": { "@swapkit/helpers": "4.13.0", "@swapkit/tokens": "4.2.5", "@swapkit/toolboxes": "4.14.5", "@swapkit/wallet-keystore": "4.3.18", "ts-pattern": "^5.9.0" } }, "sha512-eUgx8mh1w1QbsYlp5WV/S3Yst9g/coH3zcPvCBshjEMt+Cvh+vWXo4VDx4ZJHQpS+8Cc6Xa3pDMUe9iUskfg9Q=="], "@swapkit/tokens": ["@swapkit/tokens@4.2.5", "", { "dependencies": { "ts-pattern": "^5.9.0" } }, "sha512-Zq6OPsQATLxyO/LCFOHNEf0x1lx1jTXElWgD+9lo1Fhuo9+tPRd1XIsqX3Y+BwFiyGYKAwlD+jlhLpUjS30XVQ=="], - "@swapkit/toolboxes": ["@swapkit/toolboxes@4.14.4", "", { "dependencies": { "@aptos-labs/ts-sdk": "~1.34.0", "@cosmjs/amino": "~0.37.0", "@cosmjs/crypto": "0.37.0", "@cosmjs/proto-signing": "~0.37.0", "@cosmjs/stargate": "~0.37.0", "@mysten/bcs": "~1.9.2", "@mysten/sui": "~1.44.0", "@near-js/accounts": "~2.5.0", "@near-js/crypto": "~2.5.0", "@near-js/providers": "~2.5.0", "@near-js/signers": "~2.5.0", "@near-js/transactions": "~2.5.0", "@near-js/utils": "~2.5.0", "@noble/curves": "2.0.1", "@noble/hashes": "~2.0.1", "@orbs-network/ton-access": "~2.3.3", "@polkadot/api": "15.10.2", "@polkadot/keyring": "~13.5.7", "@polkadot/rpc-provider": "~15.10.2", "@polkadot/util": "~13.5.7", "@polkadot/util-crypto": "~13.5.7", "@radixdlt/babylon-gateway-api-sdk": "~1.10.0", "@radixdlt/radix-dapp-toolkit": "~2.2.0", "@scure/base": "~2.0.0", "@scure/bip32": "~2.0.1", "@scure/bip39": "~2.0.1", "@solana/spl-memo": "~0.2.5", "@solana/spl-token": "~0.4.14", "@solana/web3.js": "~1.98.4", "@stellar/stellar-sdk": "~14.5.0", "@stricahq/bip32ed25519": "1.1.2", "@stricahq/cbors": "~1.0.2", "@stricahq/typhonjs": "~3.0.1", "@swapkit/helpers": "4.12.9", "@swapkit/utxo-signer": "2.1.1", "@ton/crypto": "~3.3.0", "@ton/ton": "~15.4.0", "bignumber.js": "~9.3.1", "cosmjs-types": "~0.10.1", "ethers": "^6.14.0", "micro-key-producer": "~0.8.2", "near-seed-phrase": "~0.2.1", "protobufjs": "~7.5.4", "starknet": "~9.2.1", "ts-pattern": "^5.9.0", "xrpl": "~4.4.2" } }, "sha512-/irqL6xOPiRayP8Z/PMTIxMea+vKFCLD8FL0beMeDd+MNMReSP2ZeWBozW+2Qh9hmsEaQGdMP6c5TkjzLnpOeg=="], + "@swapkit/toolboxes": ["@swapkit/toolboxes@4.14.5", "", { "dependencies": { "@aptos-labs/ts-sdk": "~1.34.0", "@cosmjs/amino": "~0.37.0", "@cosmjs/crypto": "0.37.0", "@cosmjs/proto-signing": "~0.37.0", "@cosmjs/stargate": "~0.37.0", "@mysten/bcs": "~1.9.2", "@mysten/sui": "~1.44.0", "@near-js/accounts": "~2.5.0", "@near-js/crypto": "~2.5.0", "@near-js/providers": "~2.5.0", "@near-js/signers": "~2.5.0", "@near-js/transactions": "~2.5.0", "@near-js/utils": "~2.5.0", "@noble/curves": "2.0.1", "@noble/hashes": "~2.0.1", "@orbs-network/ton-access": "~2.3.3", "@polkadot/api": "15.10.2", "@polkadot/keyring": "~13.5.7", "@polkadot/rpc-provider": "~15.10.2", "@polkadot/util": "~13.5.7", "@polkadot/util-crypto": "~13.5.7", "@radixdlt/babylon-gateway-api-sdk": "~1.10.0", "@radixdlt/radix-dapp-toolkit": "~2.2.0", "@scure/base": "~2.0.0", "@scure/bip32": "~2.0.1", "@scure/bip39": "~2.0.1", "@solana/spl-memo": "~0.2.5", "@solana/spl-token": "~0.4.14", "@solana/web3.js": "~1.98.4", "@stellar/stellar-sdk": "~14.5.0", "@stricahq/bip32ed25519": "1.1.2", "@stricahq/cbors": "~1.0.2", "@stricahq/typhonjs": "~3.0.1", "@swapkit/helpers": "4.13.0", "@swapkit/utxo-signer": "2.1.1", "@ton/crypto": "~3.3.0", "@ton/ton": "~15.4.0", "bignumber.js": "~9.3.1", "cosmjs-types": "~0.10.1", "ethers": "^6.14.0", "micro-key-producer": "~0.8.2", "near-seed-phrase": "~0.2.1", "protobufjs": "~7.5.4", "starknet": "~9.2.1", "ts-pattern": "^5.9.0", "xrpl": "~4.4.2" } }, "sha512-T43a2bPik2/DHHeraklQJkQeGXJdfmjSr5rYyxJa7CulmrWTmJG87QYh8CwP21CAoKWPiSqA+AnhGr1fuKxoKA=="], "@swapkit/types": ["@swapkit/types@0.7.3", "", {}, "sha512-n5AX74ZnLiE0RaaAKxbliu6IW3bCqisrhHDKk/7YeXUH+G7nSj7e0OHnCzHouRpN/hFwBuPOwhVE1MHqFg0PXw=="], "@swapkit/utxo-signer": ["@swapkit/utxo-signer@2.1.1", "", { "dependencies": { "@noble/curves": "2.0.1", "@noble/hashes": "2.0.1", "@scure/base": "2.0.0", "micro-packed": "0.8.0" } }, "sha512-u5u28BUudfCSQBAtQaSn+l7x09XCzUTm82LbHweBde6mcSH88W/rQgPcdHnS9U6KhM23FdjMdIL01z6/85P77A=="], - "@swapkit/wallet-core": ["@swapkit/wallet-core@4.1.28", "", { "dependencies": { "@swapkit/helpers": "4.12.8" } }, "sha512-isvZSgsMB4Y8HN1wma1rk4voZDTBIQcMxCoSWoBg3fX79HgSjkoi2oyuSZ3nGH3czDTa5d2Tcj2f1tnt27sPBA=="], + "@swapkit/wallet-core": ["@swapkit/wallet-core@4.2.0", "", { "dependencies": { "@swapkit/helpers": "4.13.0" } }, "sha512-/DgVFp+7TV+/LWsP58ABegjZnybt4/wAsjDIL0UqjSbyC8U3inBRqA+xOG+mQadZfGj0gq89kiJlwAWvvFwB3g=="], "@swapkit/wallet-extensions": ["@swapkit/wallet-extensions@workspace:packages/wallet-extensions"], "@swapkit/wallet-hardware": ["@swapkit/wallet-hardware@workspace:packages/wallet-hardware"], - "@swapkit/wallet-keystore": ["@swapkit/wallet-keystore@4.3.16", "", { "dependencies": { "@noble/hashes": "2.0.1", "@scure/bip39": "2.0.1", "@swapkit/helpers": "4.12.8", "@swapkit/toolboxes": "4.14.3", "@swapkit/wallet-core": "4.1.28" } }, "sha512-VEpDcCmJzo6opRM6/6DJllwg7LY36+1zVcBqDW550P/8Ica1FWa79XUEXL/uXl+PsYnSfW01X0ihEMs4J+86UQ=="], + "@swapkit/wallet-keystore": ["@swapkit/wallet-keystore@4.3.18", "", { "dependencies": { "@noble/hashes": "2.0.1", "@scure/bip39": "2.0.1", "@swapkit/helpers": "4.13.0", "@swapkit/toolboxes": "4.14.5", "@swapkit/wallet-core": "4.2.0" } }, "sha512-tMulewvleo5wZ95YBj8RMqJfXtkd2QoqqzOPJ83Cx0QKGOrlQBADoKy7Hl+aY61dXjt5TiL3/cV9I7YgrElOSQ=="], "@swapkit/wallet-mobile": ["@swapkit/wallet-mobile@workspace:packages/wallet-mobile"], @@ -2204,10 +2208,6 @@ "@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/@swapkit/utxo-signer": ["@swapkit/utxo-signer@2.1.0", "", { "dependencies": { "@noble/curves": "2.0.1", "@noble/hashes": "2.0.1", "@scure/base": "2.0.0", "micro-packed": "0.8.0" } }, "sha512-0Py1sq4HFNniLnPLjvUI2b9ZzXUOBqXOaRojHj92xi7ZUbSXBt+Xs6VI1pOO6uNnHLHruwz7o7ouXlmgsfbE8g=="], - - "@swapkit/server/@swapkit/tokens": ["@swapkit/tokens@4.2.4", "", { "dependencies": { "ts-pattern": "^5.9.0" } }, "sha512-3FiP3PzZh4gcADQKX0g5JWsJkyOh6sFbiOFnAh389C0/gLfpkw5hwQSAfC3d/+MlvSR0MJSn6yFFRoSqs5Xsmw=="], - "@swc/helpers/tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="], "@ton/ton/dataloader": ["dataloader@2.2.3", "", {}, "sha512-y2krtASINtPFS1rSDjacrFgn1dcUuoREVabwlOGOe4SdxenREqwjwjElAdwvbGM7kgZz9a3KVicWR7vcz8rnzA=="], diff --git a/package.json b/package.json index 668a384..ec85d6f 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "dependencies": { - "@swapkit/core": "4.4.11", - "@swapkit/helpers": "4.12.9", - "@swapkit/plugins": "4.6.24", - "@swapkit/server": "4.2.35", - "@swapkit/toolboxes": "4.14.4", - "@swapkit/wallet-core": "4.1.28", - "@swapkit/wallet-keystore": "4.3.16" + "@swapkit/core": "4.4.12", + "@swapkit/helpers": "4.13.0", + "@swapkit/plugins": "4.6.26", + "@swapkit/server": "4.2.37", + "@swapkit/toolboxes": "4.14.5", + "@swapkit/wallet-core": "4.2.0", + "@swapkit/wallet-keystore": "4.3.18" }, "devDependencies": { "@biomejs/biome": "2.3.11", @@ -21,14 +21,14 @@ }, "name": "swapkit-wallets", "overrides": { - "@swapkit/core": "4.4.11", - "@swapkit/helpers": "4.12.9", - "@swapkit/plugins": "4.6.24", - "@swapkit/server": "4.2.35", - "@swapkit/toolboxes": "4.14.4", + "@swapkit/core": "4.4.12", + "@swapkit/helpers": "4.13.0", + "@swapkit/plugins": "4.6.26", + "@swapkit/server": "4.2.37", + "@swapkit/toolboxes": "4.14.5", "@swapkit/types": "0.7.3", - "@swapkit/wallet-core": "4.1.28", - "@swapkit/wallet-keystore": "4.3.16" + "@swapkit/wallet-core": "4.2.0", + "@swapkit/wallet-keystore": "4.3.18" }, "packageManager": "bun@1.3.4", "private": true, diff --git a/packages/sdk/package.json b/packages/sdk/package.json index ed482ec..7fc8f2a 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -2,13 +2,13 @@ "author": "swapkit-dev", "dependencies": { "@stricahq/typhonjs": "~3.0.1", - "@swapkit/core": "^4.4.11", - "@swapkit/helpers": "^4.12.9", - "@swapkit/plugins": "^4.6.18", - "@swapkit/server": "^4.2.29", - "@swapkit/toolboxes": "^4.14.4", - "@swapkit/wallet-core": "^4.1.23", - "@swapkit/wallet-keystore": "^4.3.10", + "@swapkit/core": "^4.4.12", + "@swapkit/helpers": "^4.13.0", + "@swapkit/plugins": "^4.6.26", + "@swapkit/server": "^4.2.37", + "@swapkit/toolboxes": "^4.14.5", + "@swapkit/wallet-core": "^4.2.0", + "@swapkit/wallet-keystore": "^4.3.18", "@swapkit/wallets": "workspace:*", "cosmjs-types": "0.10.1" }, diff --git a/packages/wallet-extensions/package.json b/packages/wallet-extensions/package.json index f73c1a3..5483cf0 100644 --- a/packages/wallet-extensions/package.json +++ b/packages/wallet-extensions/package.json @@ -11,8 +11,9 @@ "@near-js/transactions": "~2.5.0", "@scure/base": "~2.0.0", "@solana/web3.js": "~1.98.4", - "@swapkit/helpers": "^4.12.9", - "@swapkit/toolboxes": "^4.14.4", + "@swapkit/helpers": "^4.13.0", + "@swapkit/wallet-core": "^4.2.0", + "@swapkit/toolboxes": "^4.14.5", "@swapkit/utxo-signer": "^2.1.1", "cosmjs-types": "0.10.1", "ethers": "^6.14.0", diff --git a/packages/wallet-extensions/src/bitget/index.ts b/packages/wallet-extensions/src/bitget/index.ts index d83a6b5..8119f53 100644 --- a/packages/wallet-extensions/src/bitget/index.ts +++ b/packages/wallet-extensions/src/bitget/index.ts @@ -1,5 +1,5 @@ import { Chain, EVMChains, filterSupportedChains, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getWalletMethods } from "./helpers"; @@ -18,6 +18,14 @@ export const bitgetWallet = createWallet({ return true; }, + directSigningSupport: { + ...Object.fromEntries(EVMChains.map((chain) => [chain, true])), + [Chain.Bitcoin]: true, + [Chain.Cosmos]: true, + [Chain.Solana]: true, + [Chain.Tron]: true, + // [Chain.Aptos]: blocked on toolbox — getAptosToolbox needs to accept AptosExtensionProvider + }, name: "connectBitget", supportedChains: [...EVMChains, Chain.Cosmos, Chain.Bitcoin, Chain.Solana, Chain.Tron], walletType: WalletOption.BITGET, diff --git a/packages/wallet-extensions/src/core.ts b/packages/wallet-extensions/src/core.ts deleted file mode 100644 index 4e47e0a..0000000 --- a/packages/wallet-extensions/src/core.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { AddChainType, Chain, WalletOption } from "@swapkit/helpers"; - -export function createWallet< - ConnectParams extends any[], - SupportedChains extends Chain[], - const Name extends string, - WalletType extends WalletOption, ->({ - connect, - name, - supportedChains, - walletType, -}: { - connect: (connectParams: { - addChain: AddChainType; - walletType: WalletType; - supportedChains: SupportedChains; - }) => (...params: ConnectParams) => Promise; - name: Name; - supportedChains: SupportedChains; - walletType?: WalletType | string; -}) { - function connectWallet(connectParams: { addChain: AddChainType }) { - return connect({ ...connectParams, supportedChains, walletType: walletType as WalletType }); - } - - return { [name]: { connectWallet, supportedChains } } as unknown as { - [key in Name]: { connectWallet: typeof connectWallet; supportedChains: SupportedChains }; - }; -} - -export function getWalletSupportedChains>>( - wallet: T, -): T[keyof T]["supportedChains"] { - const walletName = Object.keys(wallet)?.[0] || ""; - return wallet?.[walletName]?.supportedChains || []; -} diff --git a/packages/wallet-extensions/src/cosmostation/index.ts b/packages/wallet-extensions/src/cosmostation/index.ts index 23f22b5..3df1e09 100644 --- a/packages/wallet-extensions/src/cosmostation/index.ts +++ b/packages/wallet-extensions/src/cosmostation/index.ts @@ -1,6 +1,6 @@ import type { Keplr } from "@keplr-wallet/types"; import { Chain, ChainId, ChainToChainId, filterSupportedChains, SwapKitError, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; const cosmostationSupportedChainIds = [ChainId.Cosmos, ChainId.Kujira, ChainId.Noble, ChainId.THORChain] as const; const cosmostationSupportedEVMChains = [ @@ -98,6 +98,20 @@ export const cosmostationWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Cosmos]: true, + [Chain.Kujira]: true, + [Chain.Noble]: true, + [Chain.THORChain]: true, + [Chain.Ethereum]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Avalanche]: true, + [Chain.Polygon]: true, + [Chain.Arbitrum]: true, + [Chain.Optimism]: true, + [Chain.Base]: true, + [Chain.XLayer]: true, + }, name: "connectCosmostation", supportedChains: [ Chain.Cosmos, diff --git a/packages/wallet-extensions/src/ctrl/index.ts b/packages/wallet-extensions/src/ctrl/index.ts index a730fbd..e2acbd0 100644 --- a/packages/wallet-extensions/src/ctrl/index.ts +++ b/packages/wallet-extensions/src/ctrl/index.ts @@ -6,7 +6,7 @@ import { SwapKitError, WalletOption, } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getCtrlAddress, getCtrlProvider, walletTransfer } from "./walletHelpers"; export const ctrlWallet = createWallet({ @@ -25,6 +25,27 @@ export const ctrlWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Aurora]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.Berachain]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Bitcoin]: true, + [Chain.Cosmos]: true, + [Chain.Ethereum]: true, + [Chain.Gnosis]: true, + [Chain.Kujira]: true, + [Chain.Monad]: true, + [Chain.Near]: true, + [Chain.Noble]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.Solana]: true, + [Chain.XLayer]: true, + // BCH/DOGE/LTC/THORChain/Maya: blocked on CTRL provider — no raw signing RPC + }, name: "connectCtrl", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallet-extensions/src/evm-extensions/index.ts b/packages/wallet-extensions/src/evm-extensions/index.ts index a55773a..2646eb3 100644 --- a/packages/wallet-extensions/src/evm-extensions/index.ts +++ b/packages/wallet-extensions/src/evm-extensions/index.ts @@ -10,7 +10,7 @@ import { WalletOption, } from "@swapkit/helpers"; import type { BrowserProvider, Eip1193Provider } from "ethers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export type EVMWalletOptions = | WalletOption.BRAVE @@ -107,6 +107,7 @@ export const evmWallet = createWallet({ return true; }, + directSigningSupport: Object.fromEntries(EVMChains.map((chain) => [chain, true])), name: "connectEVMWallet", supportedChains: [...EVMChains] as EVMChain[], }); diff --git a/packages/wallet-extensions/src/keepkey-bex/index.ts b/packages/wallet-extensions/src/keepkey-bex/index.ts index 18f1f11..474737c 100644 --- a/packages/wallet-extensions/src/keepkey-bex/index.ts +++ b/packages/wallet-extensions/src/keepkey-bex/index.ts @@ -1,6 +1,6 @@ import { AssetValue, Chain, ChainId, filterSupportedChains, SwapKitError, WalletOption } from "@swapkit/helpers"; import type { Eip1193Provider } from "ethers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getKEEPKEYAddress, getKEEPKEYMethods, @@ -26,6 +26,19 @@ export const keepkeyBexWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Cosmos]: true, + [Chain.Ethereum]: true, + [Chain.Kujira]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.XLayer]: true, + // BTC/BCH/DASH/DOGE/LTC/Ripple/Solana/THORChain/Maya: provider lacks raw-sign RPC + }, name: "connectKeepkeyBex", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallet-extensions/src/keplr/index.ts b/packages/wallet-extensions/src/keplr/index.ts index c4bf389..30c3ecf 100644 --- a/packages/wallet-extensions/src/keplr/index.ts +++ b/packages/wallet-extensions/src/keplr/index.ts @@ -1,5 +1,5 @@ import { Chain, ChainId, ChainToChainId, filterSupportedChains, SwapKitError, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { chainRegistry } from "./chainRegistry"; const keplrSupportedChainIds = [ChainId.Cosmos, ChainId.Kujira, ChainId.Noble, ChainId.THORChain] as const; @@ -43,6 +43,12 @@ export const keplrWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Cosmos]: true, + [Chain.Kujira]: true, + [Chain.Noble]: true, + [Chain.THORChain]: true, + }, name: "connectKeplr", supportedChains: [Chain.Cosmos, Chain.Kujira, Chain.Noble, Chain.THORChain], }); diff --git a/packages/wallet-extensions/src/okx/index.ts b/packages/wallet-extensions/src/okx/index.ts index 4c4bb00..ca4562e 100644 --- a/packages/wallet-extensions/src/okx/index.ts +++ b/packages/wallet-extensions/src/okx/index.ts @@ -1,6 +1,6 @@ import { Chain, filterSupportedChains, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getWalletMethods } from "./helpers"; export const okxWallet = createWallet({ @@ -17,6 +17,24 @@ export const okxWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Aurora]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.Berachain]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Bitcoin]: true, + [Chain.Cosmos]: true, + [Chain.Ethereum]: true, + [Chain.Gnosis]: true, + [Chain.Monad]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.Tron]: true, + [Chain.XLayer]: true, + // [Chain.Aptos]: blocked on toolbox + }, name: "connectOkx", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallet-extensions/src/onekey/index.ts b/packages/wallet-extensions/src/onekey/index.ts index e9d6198..d144a41 100644 --- a/packages/wallet-extensions/src/onekey/index.ts +++ b/packages/wallet-extensions/src/onekey/index.ts @@ -10,7 +10,7 @@ import { } from "@swapkit/helpers"; import { Transaction } from "@swapkit/utxo-signer"; import type { BitcoinProvider, GetAddressOptions, GetAddressResponse, SignTransactionOptions } from "sats-connect"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; async function getWalletMethodsForExtension(chain: Chain) { switch (chain) { @@ -162,6 +162,20 @@ export const onekeyWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Aurora]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Bitcoin]: true, + [Chain.Ethereum]: true, + [Chain.Gnosis]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.Solana]: true, + [Chain.XLayer]: true, + }, name: "connectOnekeyWallet", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallet-extensions/src/petra/index.ts b/packages/wallet-extensions/src/petra/index.ts index 60ddb36..38b055a 100644 --- a/packages/wallet-extensions/src/petra/index.ts +++ b/packages/wallet-extensions/src/petra/index.ts @@ -1,5 +1,5 @@ import { Chain, filterSupportedChains, SwapKitError, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export const petraWallet = createWallet({ connect: ({ addChain, supportedChains, walletType }) => @@ -22,6 +22,8 @@ export const petraWallet = createWallet({ throw new SwapKitError("wallet_connection_rejected_by_user", error); } }, + // [Chain.Aptos]: blocked on toolbox — getAptosToolbox needs to accept AptosExtensionProvider + directSigningSupport: {}, name: "connectPetra", supportedChains: [Chain.Aptos], walletType: WalletOption.PETRA, diff --git a/packages/wallet-extensions/src/phantom/index.ts b/packages/wallet-extensions/src/phantom/index.ts index 5d4d6ee..c679cbf 100644 --- a/packages/wallet-extensions/src/phantom/index.ts +++ b/packages/wallet-extensions/src/phantom/index.ts @@ -6,7 +6,7 @@ import { SwapKitError, WalletOption, } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export const phantomWallet = createWallet({ connect: ({ addChain, supportedChains, walletType }) => @@ -29,6 +29,12 @@ export const phantomWallet = createWallet({ throw new SwapKitError("wallet_connection_rejected_by_user", error); } }, + directSigningSupport: { + [Chain.Bitcoin]: true, + [Chain.Ethereum]: true, + [Chain.Monad]: true, + [Chain.Solana]: true, + }, name: "connectPhantom", supportedChains: [Chain.Bitcoin, Chain.Ethereum, Chain.Monad, Chain.Solana], walletType: WalletOption.PHANTOM, diff --git a/packages/wallet-extensions/src/polkadotjs/index.ts b/packages/wallet-extensions/src/polkadotjs/index.ts index 31630bf..427cf76 100644 --- a/packages/wallet-extensions/src/polkadotjs/index.ts +++ b/packages/wallet-extensions/src/polkadotjs/index.ts @@ -1,5 +1,5 @@ import { Chain, filterSupportedChains, SwapKitError, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export const polkadotWallet = createWallet({ connect: ({ addChain, supportedChains, walletType }) => @@ -16,6 +16,8 @@ export const polkadotWallet = createWallet({ return true; }, + // Polkadot is not in V3 swap chain list + directSigningSupport: {}, name: "connectPolkadotJs", supportedChains: [Chain.Polkadot], walletType: WalletOption.POLKADOT_JS, diff --git a/packages/wallet-extensions/src/talisman/index.ts b/packages/wallet-extensions/src/talisman/index.ts index be9c34e..5bfd758 100644 --- a/packages/wallet-extensions/src/talisman/index.ts +++ b/packages/wallet-extensions/src/talisman/index.ts @@ -8,7 +8,7 @@ import { WalletOption, } from "@swapkit/helpers"; import type { Eip1193Provider } from "ethers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export const talismanWallet = createWallet({ connect: ({ addChain, supportedChains, walletType }) => @@ -25,6 +25,21 @@ export const talismanWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.Berachain]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Chainflip]: true, + [Chain.Ethereum]: true, + [Chain.Gnosis]: true, + [Chain.Monad]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.XLayer]: true, + // Polkadot: not in V3 chain list + }, name: "connectTalisman", supportedChains: [ Chain.Berachain, diff --git a/packages/wallet-extensions/src/tronlink/index.ts b/packages/wallet-extensions/src/tronlink/index.ts index c385ede..a8e9672 100644 --- a/packages/wallet-extensions/src/tronlink/index.ts +++ b/packages/wallet-extensions/src/tronlink/index.ts @@ -1,5 +1,5 @@ import { Chain, filterSupportedChains, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getExpectedTronNetwork, getWalletForChain, setupEventListeners } from "./helpers.js"; export const tronlinkWallet = createWallet({ @@ -38,6 +38,7 @@ export const tronlinkWallet = createWallet({ return true; }, + directSigningSupport: { [Chain.Tron]: true }, name: "connectTronLink", supportedChains: [Chain.Tron], walletType: WalletOption.TRONLINK, diff --git a/packages/wallet-extensions/src/trustwallet/index.ts b/packages/wallet-extensions/src/trustwallet/index.ts index 88eeede..aafb1bd 100644 --- a/packages/wallet-extensions/src/trustwallet/index.ts +++ b/packages/wallet-extensions/src/trustwallet/index.ts @@ -12,7 +12,7 @@ import { } from "@swapkit/helpers"; import type { TONTransactionMessage } from "@swapkit/toolboxes/ton"; import type { Eip1193Provider } from "ethers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export type TrustWalletTonProvider = { adapter: { handler: (request: { method: string; params?: unknown }) => Promise; strategy: string }; @@ -41,6 +41,10 @@ export const trustwalletWallet = createWallet({ return true; }, + directSigningSupport: { + ...Object.fromEntries(EVMChains.map((chain) => [chain, true])), + // Ton: no signer wired + }, name: "connectTrustWallet", supportedChains: [...EVMChains, Chain.Ton], walletType: WalletOption.TRUSTWALLET_WEB, diff --git a/packages/wallet-extensions/src/vultisig/index.ts b/packages/wallet-extensions/src/vultisig/index.ts index d24ad37..08bacca 100644 --- a/packages/wallet-extensions/src/vultisig/index.ts +++ b/packages/wallet-extensions/src/vultisig/index.ts @@ -11,7 +11,7 @@ import { UTXOChains, WalletOption, } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getVultisigAddress, getVultisigMethods, @@ -54,6 +54,17 @@ export const vultisigWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Ethereum]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.XLayer]: true, + // BTC/BCH/DASH/DOGE/LTC/ZEC/Cosmos/Kujira/THORChain/Maya/Solana/Ripple: blocked on Vultisig provider — no raw-sign RPC + }, name: "connectVultisig", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallet-hardware/package.json b/packages/wallet-hardware/package.json index c5a5232..d526335 100644 --- a/packages/wallet-hardware/package.json +++ b/packages/wallet-hardware/package.json @@ -21,8 +21,9 @@ "@near-js/crypto": "~2.5.0", "@near-js/transactions": "~2.5.0", "@scure/base": "2.0.0", - "@swapkit/helpers": "^4.12.9", - "@swapkit/toolboxes": "^4.14.4", + "@swapkit/helpers": "^4.13.0", + "@swapkit/wallet-core": "^4.2.0", + "@swapkit/toolboxes": "^4.14.5", "@swapkit/utxo-signer": "^2.1.1", "@trezor/connect-web": "~9.6.4", "cosmjs-types": "~0.10.1", diff --git a/packages/wallet-hardware/src/core.ts b/packages/wallet-hardware/src/core.ts deleted file mode 100644 index 4e47e0a..0000000 --- a/packages/wallet-hardware/src/core.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { AddChainType, Chain, WalletOption } from "@swapkit/helpers"; - -export function createWallet< - ConnectParams extends any[], - SupportedChains extends Chain[], - const Name extends string, - WalletType extends WalletOption, ->({ - connect, - name, - supportedChains, - walletType, -}: { - connect: (connectParams: { - addChain: AddChainType; - walletType: WalletType; - supportedChains: SupportedChains; - }) => (...params: ConnectParams) => Promise; - name: Name; - supportedChains: SupportedChains; - walletType?: WalletType | string; -}) { - function connectWallet(connectParams: { addChain: AddChainType }) { - return connect({ ...connectParams, supportedChains, walletType: walletType as WalletType }); - } - - return { [name]: { connectWallet, supportedChains } } as unknown as { - [key in Name]: { connectWallet: typeof connectWallet; supportedChains: SupportedChains }; - }; -} - -export function getWalletSupportedChains>>( - wallet: T, -): T[keyof T]["supportedChains"] { - const walletName = Object.keys(wallet)?.[0] || ""; - return wallet?.[walletName]?.supportedChains || []; -} diff --git a/packages/wallet-hardware/src/keepkey/index.ts b/packages/wallet-hardware/src/keepkey/index.ts index 7278a66..a3ceaa0 100644 --- a/packages/wallet-hardware/src/keepkey/index.ts +++ b/packages/wallet-hardware/src/keepkey/index.ts @@ -11,7 +11,7 @@ import { export type { PairingInfo } from "@keepkey/keepkey-sdk"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { cosmosWalletMethods } from "./chains/cosmos"; import { KeepKeySigner } from "./chains/evm"; import { mayachainWalletMethods } from "./chains/mayachain"; @@ -52,6 +52,21 @@ export const keepkeyWallet = createWallet({ ); return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.Berachain]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Ethereum]: true, + [Chain.Gnosis]: true, + [Chain.Monad]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.Ripple]: true, + [Chain.XLayer]: true, + // BTC/BCH/DASH/DOGE/LTC/Cosmos/THORChain/Maya: pending KeepKey SDK signer wrappers (V3 plan PRs) + }, name: "connectKeepkey", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallet-hardware/src/ledger/index.ts b/packages/wallet-hardware/src/ledger/index.ts index f790c25..3a0828c 100644 --- a/packages/wallet-hardware/src/ledger/index.ts +++ b/packages/wallet-hardware/src/ledger/index.ts @@ -23,7 +23,7 @@ import { type UTXOForMultiAddressTransfer, } from "@swapkit/toolboxes/utxo"; import type { Transaction } from "@swapkit/utxo-signer"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getLedgerAddress, getLedgerClient } from "./helpers"; export const ledgerWallet = createWallet({ @@ -39,6 +39,27 @@ export const ledgerWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Aurora]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.Berachain]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Ethereum]: true, + [Chain.Gnosis]: true, + [Chain.Monad]: true, + [Chain.Cosmos]: true, + [Chain.Near]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.Ripple]: true, + [Chain.Sui]: true, + [Chain.Tron]: true, + [Chain.XLayer]: true, + // BTC/BCH/DASH/DOGE/LTC/ZEC: pending PSBT signer (V3 plan PRs) + // THORChain: needs signAmino added to THORChainLedger (V3 plan PR) + }, name: "connectLedger", supportedChains: [ Chain.Arbitrum, @@ -289,9 +310,9 @@ async function getWalletMethods({ chain, derivationPath }: { chain: Chain; deriv const { createSigningStargateClient, getMsgSendDenom, getCosmosToolbox } = await import( "@swapkit/toolboxes/cosmos" ); - const toolbox = getCosmosToolbox(Chain.Cosmos); const signer = await getLedgerClient({ chain, derivationPath }); const address = await getLedgerAddress({ chain, ledgerClient: signer }); + const toolbox = await getCosmosToolbox(Chain.Cosmos, { signer }); const transfer = async ({ assetValue, recipient, memo }: GenericTransferParams) => { if (!assetValue) throw new SwapKitError("wallet_ledger_invalid_asset"); diff --git a/packages/wallet-hardware/src/trezor/index.ts b/packages/wallet-hardware/src/trezor/index.ts index a7a7fed..ddc1b3c 100644 --- a/packages/wallet-hardware/src/trezor/index.ts +++ b/packages/wallet-hardware/src/trezor/index.ts @@ -19,7 +19,7 @@ import { } from "@swapkit/toolboxes/utxo"; import type { BTCNetwork, PCZT, Transaction, ZcashTransaction } from "@swapkit/utxo-signer"; import { NETWORKS, ZcashConsensusBranchId, ZcashVersionGroupId } from "@swapkit/utxo-signer"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; function decodeOpReturnData(script: Uint8Array): string | null { if (script.length < 2 || script[0] !== 0x6a) return null; @@ -763,6 +763,21 @@ export const trezorWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Aurora]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.Berachain]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Ethereum]: true, + [Chain.Gnosis]: true, + [Chain.Monad]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.XLayer]: true, + // BTC/BCH/DASH/DOGE/LTC/ZEC: pending PSBT→TrezorConnect converter (V3 plan PR) + }, name: "connectTrezor", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallet-mobile/package.json b/packages/wallet-mobile/package.json index bab9035..968d95a 100644 --- a/packages/wallet-mobile/package.json +++ b/packages/wallet-mobile/package.json @@ -1,6 +1,7 @@ { "author": "swapkit", - "dependencies": { "@swapkit/helpers": "^4.12.9", "@swapkit/toolboxes": "^4.14.4" }, + "dependencies": { "@swapkit/helpers": "^4.13.0", + "@swapkit/wallet-core": "^4.2.0", "@swapkit/toolboxes": "^4.14.5" }, "description": "SwapKit - Wallet Mobile", "exports": { ".": { diff --git a/packages/wallets/package.json b/packages/wallets/package.json index 3735a46..88d024f 100644 --- a/packages/wallets/package.json +++ b/packages/wallets/package.json @@ -14,8 +14,9 @@ "@radixdlt/radix-dapp-toolkit": "~2.2.0", "@scure/base": "~2.0.0", "@scure/bip39": "~2.0.0", - "@swapkit/helpers": "^4.12.9", - "@swapkit/toolboxes": "^4.14.4", + "@swapkit/helpers": "^4.13.0", + "@swapkit/wallet-core": "^4.2.0", + "@swapkit/toolboxes": "^4.14.5", "@swapkit/utxo-signer": "^2.1.1", "@swapkit/wallet-extensions": "^4.4.3", "@swapkit/wallet-hardware": "^4.6.3", diff --git a/packages/wallets/src/coinbase/index.ts b/packages/wallets/src/coinbase/index.ts index f3873b3..fd0f0bf 100644 --- a/packages/wallets/src/coinbase/index.ts +++ b/packages/wallets/src/coinbase/index.ts @@ -1,5 +1,5 @@ import { Chain, ChainToChainId, filterSupportedChains, SKConfig, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getWalletMethods } from "./signer"; @@ -27,6 +27,16 @@ export const coinbaseWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Ethereum]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.XLayer]: true, + }, name: "connectCoinbaseWallet", supportedChains: [ Chain.Arbitrum, diff --git a/packages/wallets/src/core.ts b/packages/wallets/src/core.ts deleted file mode 100644 index 4e47e0a..0000000 --- a/packages/wallets/src/core.ts +++ /dev/null @@ -1,37 +0,0 @@ -import type { AddChainType, Chain, WalletOption } from "@swapkit/helpers"; - -export function createWallet< - ConnectParams extends any[], - SupportedChains extends Chain[], - const Name extends string, - WalletType extends WalletOption, ->({ - connect, - name, - supportedChains, - walletType, -}: { - connect: (connectParams: { - addChain: AddChainType; - walletType: WalletType; - supportedChains: SupportedChains; - }) => (...params: ConnectParams) => Promise; - name: Name; - supportedChains: SupportedChains; - walletType?: WalletType | string; -}) { - function connectWallet(connectParams: { addChain: AddChainType }) { - return connect({ ...connectParams, supportedChains, walletType: walletType as WalletType }); - } - - return { [name]: { connectWallet, supportedChains } } as unknown as { - [key in Name]: { connectWallet: typeof connectWallet; supportedChains: SupportedChains }; - }; -} - -export function getWalletSupportedChains>>( - wallet: T, -): T[keyof T]["supportedChains"] { - const walletName = Object.keys(wallet)?.[0] || ""; - return wallet?.[walletName]?.supportedChains || []; -} diff --git a/packages/wallets/src/index.ts b/packages/wallets/src/index.ts index f9232a9..0e01732 100644 --- a/packages/wallets/src/index.ts +++ b/packages/wallets/src/index.ts @@ -1,3 +1,3 @@ -export * from "./core"; +export * from "@swapkit/wallet-core"; export * from "./types"; export * from "./utils"; diff --git a/packages/wallets/src/keystore.ts b/packages/wallets/src/keystore.ts index 494b828..4ac01ae 100644 --- a/packages/wallets/src/keystore.ts +++ b/packages/wallets/src/keystore.ts @@ -12,7 +12,7 @@ import { WalletOption, } from "@swapkit/helpers"; import type { DerivedAddress, FullWallet } from "@swapkit/toolboxes"; -import { createWallet, getWalletSupportedChains } from "./core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export { decryptFromKeystore, @@ -101,6 +101,21 @@ export const keystoreWallet = createWallet({ return true; }, + // Keystore holds the private key — direct signing works for every supported chain. + directSigningSupport: { + ...Object.fromEntries(EVMChains.map((chain) => [chain, true])), + ...Object.fromEntries(UTXOChains.map((chain) => [chain, true])), + ...Object.fromEntries(CosmosChains.filter((chain) => chain !== Chain.Harbor).map((chain) => [chain, true])), + [Chain.Aptos]: true, + [Chain.Cardano]: true, + [Chain.Near]: true, + [Chain.Ripple]: true, + [Chain.Solana]: true, + [Chain.Stellar]: true, + [Chain.Sui]: true, + [Chain.Ton]: true, + [Chain.Tron]: true, + }, name: "connectKeystore", supportedChains: [ ...EVMChains, diff --git a/packages/wallets/src/near-wallet-selector/index.ts b/packages/wallets/src/near-wallet-selector/index.ts index ede6790..9e38da6 100644 --- a/packages/wallets/src/near-wallet-selector/index.ts +++ b/packages/wallets/src/near-wallet-selector/index.ts @@ -3,7 +3,7 @@ import "@near-wallet-selector/modal-ui-js/styles.css"; import type { Transaction } from "@near-js/transactions"; import { Chain, filterSupportedChains, SKConfig, SwapKitError, WalletOption } from "@swapkit/helpers"; import { getNearToolbox } from "@swapkit/toolboxes/near"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; function createNearSigner(wallet: Wallet) { return { @@ -107,6 +107,7 @@ export const walletSelectorWallet = createWallet({ return true; }, + directSigningSupport: { [Chain.Near]: true }, name: "connectWalletSelector", supportedChains: [Chain.Near], walletType: WalletOption.WALLET_SELECTOR, diff --git a/packages/wallets/src/passkeys/index.ts b/packages/wallets/src/passkeys/index.ts index cbe4dd1..aeeab79 100644 --- a/packages/wallets/src/passkeys/index.ts +++ b/packages/wallets/src/passkeys/index.ts @@ -22,7 +22,7 @@ import { signTransaction as satsSignTransaction, } from "sats-connect"; import { match } from "ts-pattern"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; async function getPasskeyWallet() { const appId = SKConfig.get("apiKeys").passkeys; @@ -178,6 +178,11 @@ export const passkeysWallet = createWallet({ return true; }, + directSigningSupport: { + ...Object.fromEntries(EVMChains.map((chain) => [chain, true])), + [Chain.Bitcoin]: true, + [Chain.Solana]: true, + }, name: "connectPasskeys", supportedChains: [...EVMChains, Chain.Bitcoin, Chain.Solana], walletType: WalletOption.PASSKEYS, diff --git a/packages/wallets/src/radix/index.ts b/packages/wallets/src/radix/index.ts index ade880a..222fc28 100644 --- a/packages/wallets/src/radix/index.ts +++ b/packages/wallets/src/radix/index.ts @@ -1,5 +1,5 @@ import { type AssetValue, Chain, filterSupportedChains, SKConfig, SwapKitError, WalletOption } from "@swapkit/helpers"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; export const radixWallet = createWallet({ connect: ({ addChain, supportedChains, walletType }) => @@ -21,6 +21,8 @@ export const radixWallet = createWallet({ return true; }, + // Radix is not in V3 swap chain list + directSigningSupport: {}, name: "connectRadixWallet", supportedChains: [Chain.Radix], walletType: WalletOption.RADIX_WALLET, diff --git a/packages/wallets/src/walletconnect/constants.ts b/packages/wallets/src/walletconnect/constants.ts index cd26dbc..0ac6994 100644 --- a/packages/wallets/src/walletconnect/constants.ts +++ b/packages/wallets/src/walletconnect/constants.ts @@ -19,6 +19,7 @@ export const TRON_MAINNET_ID = "tron:0x2b6653dc"; export const AURORA_MAINNET_ID = "eip155:1313161554"; export const BERACHAIN_MAINNET_ID = "eip155:80094"; export const MONAD_MAINNET_ID = "eip155:143"; +export const XLAYER_MAINNET_ID = "eip155:196"; export const DEFAULT_LOGGER = "debug"; diff --git a/packages/wallets/src/walletconnect/helpers.ts b/packages/wallets/src/walletconnect/helpers.ts index cd5389b..20f6f46 100644 --- a/packages/wallets/src/walletconnect/helpers.ts +++ b/packages/wallets/src/walletconnect/helpers.ts @@ -18,6 +18,7 @@ import { POLYGON_MAINNET_ID, THORCHAIN_MAINNET_ID, TRON_MAINNET_ID, + XLAYER_MAINNET_ID, } from "./constants"; export const getAddressByChain = ( @@ -67,6 +68,8 @@ export const chainToChainId = (chain: Chain) => { } case Chain.Tron: return TRON_MAINNET_ID; + case Chain.XLayer: + return XLAYER_MAINNET_ID; default: return ""; } diff --git a/packages/wallets/src/walletconnect/index.ts b/packages/wallets/src/walletconnect/index.ts index 80bec63..018dbd9 100644 --- a/packages/wallets/src/walletconnect/index.ts +++ b/packages/wallets/src/walletconnect/index.ts @@ -15,7 +15,7 @@ import type { TronSignedTransaction, TronSigner, TronTransaction } from "@swapki import type { WalletConnectModal } from "@walletconnect/modal"; import type { SignClient } from "@walletconnect/sign-client"; import type { SessionTypes, SignClientTypes } from "@walletconnect/types"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { DEFAULT_APP_METADATA, DEFAULT_COSMOS_METHODS, @@ -65,6 +65,20 @@ export const walletconnectWallet = createWallet({ return true; }, + directSigningSupport: { + [Chain.Arbitrum]: true, + [Chain.Aurora]: true, + [Chain.Avalanche]: true, + [Chain.Base]: true, + [Chain.Berachain]: true, + [Chain.BinanceSmartChain]: true, + [Chain.Ethereum]: true, + [Chain.Monad]: true, + [Chain.Optimism]: true, + [Chain.Polygon]: true, + [Chain.XLayer]: true, + // Cosmos/Kujira/Maya/THORChain: cosmos toolbox built without signer; Tron/Near: signer wired but pending hardening (V3 plan PRs) + }, name: "connectWalletconnect", supportedChains: [ Chain.Arbitrum, @@ -107,8 +121,10 @@ async function getToolbox({ switch (chain) { case Chain.Arbitrum: + case Chain.Aurora: case Chain.Avalanche: case Chain.Base: + case Chain.Berachain: case Chain.BinanceSmartChain: case Chain.Ethereum: case Chain.Monad: diff --git a/packages/wallets/src/xaman/helpers.ts b/packages/wallets/src/xaman/helpers.ts index 2cdf91c..4cbebdb 100644 --- a/packages/wallets/src/xaman/helpers.ts +++ b/packages/wallets/src/xaman/helpers.ts @@ -1,7 +1,7 @@ import { type AssetValue, Chain, SwapKitError } from "@swapkit/helpers"; import { match } from "ts-pattern"; import type { Xumm } from "xumm"; -import { sendXamanTransaction, sendXamanTrustSet } from "./walletMethods"; +import { sendXamanTransaction, sendXamanTrustSet, submitXamanPayload } from "./walletMethods"; interface GetWalletForChainParams { chain: Chain; @@ -13,7 +13,22 @@ export function getWalletForChain({ xumm, chain, address }: GetWalletForChainPar return match(chain) .with(Chain.Ripple, async () => { const { getRippleToolbox } = await import("@swapkit/toolboxes/ripple"); - const toolbox = await getRippleToolbox({}); + + const signer = { + getAddress: () => address, + signTransaction: async (jsonTx: Record) => { + const txjson = { ...jsonTx, Account: jsonTx.Account ?? address }; + const submitted = await submitXamanPayload(xumm, txjson, { submit: false }); + + if (!submitted.result.hex) { + throw new SwapKitError("wallet_xaman_transaction_failed"); + } + + return { hash: submitted.result.transactionId, tx_blob: submitted.result.hex }; + }, + }; + + const toolbox = await getRippleToolbox({ signer }); const transfer = async ({ assetValue, diff --git a/packages/wallets/src/xaman/index.ts b/packages/wallets/src/xaman/index.ts index 1f41e3f..6439fc4 100644 --- a/packages/wallets/src/xaman/index.ts +++ b/packages/wallets/src/xaman/index.ts @@ -1,6 +1,6 @@ import { Chain, filterSupportedChains, SKConfig, SwapKitError, WalletOption } from "@swapkit/helpers"; import { Xumm } from "xumm"; -import { createWallet, getWalletSupportedChains } from "../core"; +import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core"; import { getWalletForChain } from "./helpers"; import type { XamanConfig } from "./types"; import { connectXamanWallet as connectXamanWalletMethod } from "./walletMethods"; @@ -51,6 +51,7 @@ export const xamanWallet = createWallet({ xumm.authorize(); }); }, + directSigningSupport: { [Chain.Ripple]: true }, name: "connectXaman", supportedChains: [Chain.Ripple], walletType: WalletOption.XAMAN, diff --git a/packages/wallets/src/xaman/walletMethods.ts b/packages/wallets/src/xaman/walletMethods.ts index 502aedd..cc799e7 100644 --- a/packages/wallets/src/xaman/walletMethods.ts +++ b/packages/wallets/src/xaman/walletMethods.ts @@ -21,11 +21,16 @@ export const connectXamanWallet = async (xumm: Xumm) => { } }; -async function submitXamanPayload( +export async function submitXamanPayload( xumm: Xumm, - transaction: Parameters["createAndSubscribe"]>[0], + txjson: Record, + { submit = true }: { submit?: boolean } = {}, ) { - const subscription = await xumm.payload?.createAndSubscribe(transaction, (event) => { + const payload = ( + submit ? txjson : { options: { submit: false }, txjson } + ) as Parameters["createAndSubscribe"]>[0]; + + const subscription = await xumm.payload?.createAndSubscribe(payload, (event) => { if ("signed" in event.data) return event.data; return undefined; }); @@ -58,6 +63,7 @@ async function submitXamanPayload( const transactionId = payloadDetails.response?.txid || ""; const account = payloadDetails.response?.account || ""; + const hex = payloadDetails.response?.hex || ""; if (!transactionId) { throw new SwapKitError("wallet_xaman_transaction_failed"); @@ -67,7 +73,7 @@ async function submitXamanPayload( deepLink: created.next?.always || "", payloadId: created.uuid || "", qrCode: created.refs?.qr_png || "", - result: { account, reason: undefined, success: true, transactionId }, + result: { account, hex, reason: undefined, success: true, transactionId }, websocketUrl: created.refs?.websocket_status || "", }; }