@swapkit/wallets 4.7.0 → 4.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/dist/src/index.cjs +2 -2
  2. package/dist/src/index.cjs.map +1 -1
  3. package/dist/src/index.js +2 -2
  4. package/dist/src/index.js.map +1 -1
  5. package/dist/src/passkeys/index.cjs +2 -2
  6. package/dist/src/passkeys/index.cjs.map +3 -3
  7. package/dist/src/passkeys/index.js +2 -2
  8. package/dist/src/passkeys/index.js.map +3 -3
  9. package/dist/src/walletconnect/index.cjs.map +2 -2
  10. package/dist/src/walletconnect/index.js.map +2 -2
  11. package/dist/src/xaman/index.cjs +2 -2
  12. package/dist/src/xaman/index.cjs.map +4 -4
  13. package/dist/src/xaman/index.js +2 -2
  14. package/dist/src/xaman/index.js.map +4 -4
  15. package/dist/types/types.d.ts +36 -0
  16. package/dist/types/types.d.ts.map +1 -1
  17. package/dist/types/walletconnect/index.d.ts.map +1 -1
  18. package/package.json +8 -16
  19. package/src/bitget.ts +1 -0
  20. package/src/coinbase/index.ts +54 -0
  21. package/src/coinbase/signer.ts +99 -0
  22. package/src/cosmostation.ts +1 -0
  23. package/src/ctrl.ts +1 -0
  24. package/src/evm-extensions.ts +1 -0
  25. package/src/index.ts +3 -0
  26. package/src/keepkey-bex.ts +1 -0
  27. package/src/keepkey.ts +1 -0
  28. package/src/keplr.ts +1 -0
  29. package/src/keystore-helpers.ts +93 -0
  30. package/src/keystore.ts +193 -0
  31. package/src/ledger.ts +1 -0
  32. package/src/near-wallet-selector/index.ts +116 -0
  33. package/src/okx.ts +1 -0
  34. package/src/onekey.ts +1 -0
  35. package/src/passkeys/index.ts +183 -0
  36. package/src/phantom.ts +1 -0
  37. package/src/polkadotjs.ts +1 -0
  38. package/src/radix/index.ts +95 -0
  39. package/src/talisman.ts +1 -0
  40. package/src/trezor.ts +1 -0
  41. package/src/tronlink.ts +1 -0
  42. package/src/types.ts +137 -0
  43. package/src/utils.ts +58 -0
  44. package/src/vultisig.ts +1 -0
  45. package/src/walletconnect/constants.ts +105 -0
  46. package/src/walletconnect/evmSigner.ts +116 -0
  47. package/src/walletconnect/helpers.ts +76 -0
  48. package/src/walletconnect/index.ts +409 -0
  49. package/src/walletconnect/namespaces.ts +80 -0
  50. package/src/walletconnect/types.ts +6 -0
  51. package/src/xaman/helpers.ts +89 -0
  52. package/src/xaman/index.ts +63 -0
  53. package/src/xaman/types.ts +35 -0
  54. package/src/xaman/walletMethods.ts +117 -0
@@ -0,0 +1,193 @@
1
+ import {
2
+ type AssetValue,
3
+ Chain,
4
+ CosmosChains,
5
+ type DerivationPathArray,
6
+ EVMChains,
7
+ filterSupportedChains,
8
+ NetworkDerivationPath,
9
+ type UTXOChain,
10
+ UTXOChains,
11
+ updateDerivationPath,
12
+ WalletOption,
13
+ } from "@swapkit/helpers";
14
+ import type { DerivedAddress, FullWallet } from "@swapkit/toolboxes";
15
+ import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core";
16
+
17
+ export {
18
+ decryptFromKeystore,
19
+ encryptToKeyStore,
20
+ generatePhrase,
21
+ type Keystore,
22
+ validatePhrase,
23
+ } from "./keystore-helpers";
24
+
25
+ type UTXOToolboxWithHD = {
26
+ deriveAddressAtIndex: (params: { index: number; change?: boolean }) => DerivedAddress | undefined;
27
+ getExtendedPublicKey: () => string | undefined;
28
+ getBalance: (address: string) => Promise<AssetValue[]>;
29
+ resolveDerivationIndex?: (params: {
30
+ address: string;
31
+ gapLimit?: number;
32
+ }) => { index: number; change: boolean } | undefined;
33
+ transferFromMultipleAddresses?: (params: {
34
+ utxos: Array<{
35
+ hash: string;
36
+ index: number;
37
+ value: number;
38
+ txHex?: string;
39
+ derivationIndex: number;
40
+ isChange: boolean;
41
+ address: string;
42
+ }>;
43
+ recipient: string;
44
+ assetValue: AssetValue;
45
+ memo?: string;
46
+ feeRate?: number;
47
+ }) => Promise<string>;
48
+ };
49
+
50
+ function isUTXOToolboxWithHD(toolbox: unknown): toolbox is UTXOToolboxWithHD {
51
+ return (
52
+ typeof toolbox === "object" &&
53
+ toolbox !== null &&
54
+ "deriveAddressAtIndex" in toolbox &&
55
+ typeof (toolbox as UTXOToolboxWithHD).deriveAddressAtIndex === "function" &&
56
+ "getExtendedPublicKey" in toolbox &&
57
+ typeof (toolbox as UTXOToolboxWithHD).getExtendedPublicKey === "function" &&
58
+ "getBalance" in toolbox &&
59
+ typeof (toolbox as UTXOToolboxWithHD).getBalance === "function"
60
+ );
61
+ }
62
+
63
+ async function createHDWalletMethods(chain: UTXOChain, toolbox: UTXOToolboxWithHD) {
64
+ const { createHDWalletHelpers, getUtxoApi } = await import("@swapkit/toolboxes/utxo");
65
+
66
+ function deriveAddresses(params: { count: number; startIndex?: number; change?: boolean }) {
67
+ const { count, startIndex = 0, change = false } = params;
68
+ if (count < 1 || count > 1000) throw new RangeError(`count must be between 1 and 1000, got ${count}`);
69
+ if (startIndex < 0) throw new RangeError(`startIndex must be non-negative, got ${startIndex}`);
70
+
71
+ const addresses: DerivedAddress[] = [];
72
+ for (let i = 0; i < count; i++) {
73
+ const derived = toolbox.deriveAddressAtIndex({ change, index: startIndex + i });
74
+ if (derived) addresses.push(derived);
75
+ }
76
+ return addresses;
77
+ }
78
+
79
+ const { scanForAddresses, getAggregatedBalance, getAggregatedUtxos } = createHDWalletHelpers({
80
+ chain,
81
+ deriveAddress: (params) => toolbox.deriveAddressAtIndex(params),
82
+ getBalance: toolbox.getBalance,
83
+ getUtxos: (address: string) => getUtxoApi(chain).getUtxos({ address, fetchTxHex: true }),
84
+ });
85
+
86
+ return { deriveAddresses, getAggregatedBalance, getAggregatedUtxos, scanForAddresses };
87
+ }
88
+
89
+ export const keystoreWallet = createWallet({
90
+ connect: ({ addChain }) =>
91
+ async function connectKeystore(
92
+ chains: Chain[],
93
+ phrase: string,
94
+ derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number,
95
+ ) {
96
+ const wallets = await createKeystoreWallet({ chains, derivationPathMapOrIndex, phrase });
97
+
98
+ for (const wallet of Object.values(wallets)) {
99
+ addChain({ ...wallet, chain: wallet.chain, walletType: WalletOption.KEYSTORE });
100
+ }
101
+
102
+ return true;
103
+ },
104
+ // Keystore holds the private key — direct signing works for every supported chain.
105
+ directSigningSupport: {
106
+ ...Object.fromEntries(EVMChains.map((chain) => [chain, true])),
107
+ ...Object.fromEntries(UTXOChains.map((chain) => [chain, true])),
108
+ ...Object.fromEntries(CosmosChains.filter((chain) => chain !== Chain.Harbor).map((chain) => [chain, true])),
109
+ [Chain.Aptos]: true,
110
+ [Chain.Cardano]: true,
111
+ [Chain.Near]: true,
112
+ [Chain.Ripple]: true,
113
+ [Chain.Solana]: true,
114
+ [Chain.Stellar]: true,
115
+ [Chain.Sui]: true,
116
+ [Chain.Ton]: true,
117
+ [Chain.Tron]: true,
118
+ },
119
+ name: "connectKeystore",
120
+ supportedChains: [
121
+ ...EVMChains,
122
+ ...UTXOChains,
123
+ ...CosmosChains.filter((chain) => chain !== Chain.Harbor),
124
+ Chain.Aptos,
125
+ Chain.Cardano,
126
+ Chain.Ripple,
127
+ Chain.Solana,
128
+ Chain.Stellar,
129
+ Chain.Sui,
130
+ Chain.Ton,
131
+ Chain.Tron,
132
+ Chain.Near,
133
+ ],
134
+ walletType: WalletOption.KEYSTORE,
135
+ });
136
+
137
+ export const KEYSTORE_SUPPORTED_CHAINS = getWalletSupportedChains(keystoreWallet);
138
+
139
+ export async function createKeystoreWallet<T extends Chain[]>({
140
+ chains,
141
+ phrase,
142
+ derivationPathMapOrIndex,
143
+ }: {
144
+ chains: T;
145
+ phrase: string;
146
+ derivationPathMapOrIndex?: { [chain in Chain]?: DerivationPathArray } | number;
147
+ }) {
148
+ const filteredChains = filterSupportedChains({
149
+ chains,
150
+ supportedChains: KEYSTORE_SUPPORTED_CHAINS,
151
+ walletType: WalletOption.KEYSTORE,
152
+ });
153
+
154
+ const wallets = await Promise.all(
155
+ filteredChains.map(async (chain) => {
156
+ const { getToolbox } = await import("@swapkit/toolboxes");
157
+
158
+ const derivationPathIndex = typeof derivationPathMapOrIndex === "number" ? derivationPathMapOrIndex : 0;
159
+ const derivationPathFromMap =
160
+ derivationPathMapOrIndex && typeof derivationPathMapOrIndex === "object"
161
+ ? derivationPathMapOrIndex[chain]
162
+ : undefined;
163
+
164
+ const derivationArrayToUpdate = NetworkDerivationPath[chain].slice(
165
+ 0,
166
+ chain === Chain.Solana ? 4 : 5,
167
+ ) as DerivationPathArray;
168
+
169
+ const derivationPath: DerivationPathArray =
170
+ derivationPathFromMap || updateDerivationPath(derivationArrayToUpdate, { index: derivationPathIndex });
171
+
172
+ const toolbox = await getToolbox(chain, { derivationPath, phrase });
173
+ const address = (await toolbox.getAddress()) || "";
174
+
175
+ const hdWalletMethods =
176
+ UTXOChains.includes(chain as UTXOChain) && isUTXOToolboxWithHD(toolbox)
177
+ ? await createHDWalletMethods(chain as UTXOChain, toolbox)
178
+ : {};
179
+
180
+ const wallet = { ...toolbox, ...hdWalletMethods, address, chain };
181
+
182
+ return wallet;
183
+ }),
184
+ );
185
+
186
+ return wallets.reduce(
187
+ (acc, wallet) => {
188
+ acc[wallet.chain as T[number]] = wallet as FullWallet[T[number]];
189
+ return acc;
190
+ },
191
+ {} as { [key in T[number]]: FullWallet[key] },
192
+ );
193
+ }
package/src/ledger.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-hardware/ledger";
@@ -0,0 +1,116 @@
1
+ import type { Wallet, WalletModuleFactory } from "@near-wallet-selector/core";
2
+ import "@near-wallet-selector/modal-ui-js/styles.css";
3
+ import type { Transaction } from "@near-js/transactions";
4
+ import { Chain, filterSupportedChains, SKConfig, SwapKitError, WalletOption } from "@swapkit/helpers";
5
+ import { getNearToolbox } from "@swapkit/toolboxes/near";
6
+ import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core";
7
+
8
+ function createNearSigner(wallet: Wallet) {
9
+ return {
10
+ getAddress: async () => {
11
+ const accounts = await wallet.getAccounts();
12
+ const accountId = accounts[0]?.accountId;
13
+
14
+ if (!accountId) {
15
+ throw new SwapKitError("wallet_connection_rejected_by_user");
16
+ }
17
+
18
+ return accountId;
19
+ },
20
+
21
+ getPublicKey: () => {
22
+ throw new SwapKitError("wallet_near_method_not_supported");
23
+ },
24
+ signAndSendTransactions: async (transactions: { transactions: Transaction[] }) => {
25
+ const result = await wallet.signAndSendTransactions(transactions);
26
+ return result?.[0]?.transaction_outcome.id || "";
27
+ },
28
+
29
+ signDelegateAction: () => {
30
+ throw new SwapKitError("wallet_near_method_not_supported");
31
+ },
32
+
33
+ signNep413Message: () => {
34
+ throw new SwapKitError("wallet_near_method_not_supported");
35
+ },
36
+
37
+ signTransaction: (params: Transaction) => {
38
+ if (!wallet.signTransaction) {
39
+ throw new SwapKitError("wallet_near_method_not_supported");
40
+ }
41
+ return wallet.signTransaction(params);
42
+ },
43
+ };
44
+ }
45
+
46
+ function waitForWalletSelection(selector: any, modal: any) {
47
+ return new Promise<void>((resolve) => {
48
+ const subscription = selector.store.observable.subscribe((state: any) => {
49
+ if (state.selectedWalletId) {
50
+ subscription.unsubscribe();
51
+ modal.hide();
52
+ resolve();
53
+ }
54
+ });
55
+
56
+ modal.show();
57
+ });
58
+ }
59
+
60
+ async function getWalletMethods(walletFactories?: WalletModuleFactory[]) {
61
+ const { setupWalletSelector } = await import("@near-wallet-selector/core");
62
+ const { setupModal } = await import("@near-wallet-selector/modal-ui-js");
63
+
64
+ const contractId = SKConfig.get("integrations")?.nearWalletSelector?.contractId || "";
65
+ const selector = await setupWalletSelector({ modules: [...(walletFactories || [])], network: "mainnet" });
66
+
67
+ const isSignedIn = selector.isSignedIn();
68
+
69
+ if (!isSignedIn) {
70
+ // Only show modal if not already connected
71
+ const modal = setupModal(selector, { contractId, description: "Connect your NEAR wallet to SwapKit" });
72
+
73
+ await waitForWalletSelection(selector, modal);
74
+ }
75
+
76
+ const wallet = await selector.wallet();
77
+ const signer = createNearSigner(wallet);
78
+ const toolbox = await getNearToolbox({ signer });
79
+ const address = await signer.getAddress();
80
+
81
+ const disconnect = async () => {
82
+ try {
83
+ await wallet.signOut();
84
+ } catch (error) {
85
+ throw new SwapKitError("wallet_connection_rejected_by_user", error);
86
+ }
87
+ };
88
+
89
+ return { ...toolbox, address, disconnect };
90
+ }
91
+
92
+ export const walletSelectorWallet = createWallet({
93
+ connect: ({ addChain, supportedChains, walletType }) =>
94
+ async function connectWalletSelector(chains: Chain[], walletFactories?: WalletModuleFactory[]) {
95
+ const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });
96
+
97
+ if (filteredChains.length === 0) {
98
+ throw new SwapKitError("wallet_chain_not_supported", {
99
+ chain: chains[0],
100
+ wallet: WalletOption.WALLET_SELECTOR,
101
+ });
102
+ }
103
+
104
+ const walletMethods = await getWalletMethods(walletFactories);
105
+
106
+ addChain({ ...walletMethods, balance: [], chain: Chain.Near, walletType });
107
+
108
+ return true;
109
+ },
110
+ directSigningSupport: { [Chain.Near]: true },
111
+ name: "connectWalletSelector",
112
+ supportedChains: [Chain.Near],
113
+ walletType: WalletOption.WALLET_SELECTOR,
114
+ });
115
+
116
+ export const WALLET_SELECTOR_SUPPORTED_CHAINS = getWalletSupportedChains(walletSelectorWallet);
package/src/okx.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-extensions/okx";
package/src/onekey.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-extensions/onekey";
@@ -0,0 +1,183 @@
1
+ import type { Wallet } from "@passkeys/core";
2
+ import { base64 } from "@scure/base";
3
+ import {
4
+ Chain,
5
+ EVMChains,
6
+ filterSupportedChains,
7
+ prepareNetworkSwitch,
8
+ SKConfig,
9
+ SwapKitError,
10
+ WalletOption,
11
+ } from "@swapkit/helpers";
12
+ import type { SolanaProvider } from "@swapkit/toolboxes/solana";
13
+ import { Transaction } from "@swapkit/utxo-signer";
14
+ import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core";
15
+ import {
16
+ AddressPurpose,
17
+ BitcoinNetworkType,
18
+ type GetAddressOptions,
19
+ type GetAddressResponse,
20
+ getAddress,
21
+ type SignTransactionOptions,
22
+ signTransaction as satsSignTransaction,
23
+ } from "sats-connect";
24
+ import { match } from "ts-pattern";
25
+
26
+ async function getPasskeyWallet() {
27
+ const appId = SKConfig.get("apiKeys").passkeys;
28
+ const { createWallet } = await import("@passkeys/core");
29
+
30
+ return createWallet({
31
+ appId: appId.length > 0 ? appId : undefined,
32
+ providers: { bitcoin: true, ethereum: true, solana: true },
33
+ });
34
+ }
35
+
36
+ function getWalletMethods({ wallet, chain: paramChain }: { wallet: Wallet; chain: Chain }) {
37
+ return match(paramChain)
38
+ .with(Chain.Bitcoin, async (chain) => {
39
+ const { getUtxoToolbox } = await import("@swapkit/toolboxes/utxo");
40
+ const provider = await wallet.getProvider("bitcoin");
41
+
42
+ if (!provider) {
43
+ throw new SwapKitError("wallet_passkeys_not_found");
44
+ }
45
+
46
+ let address = "";
47
+
48
+ const getProvider = () => Promise.resolve(provider);
49
+
50
+ const getAddressOptions: GetAddressOptions = {
51
+ getProvider,
52
+ onCancel: () => {
53
+ throw new SwapKitError("wallet_passkeys_request_canceled");
54
+ },
55
+ onFinish: (response: GetAddressResponse) => {
56
+ if (!response.addresses[0]) throw new SwapKitError("wallet_passkeys_no_address");
57
+ address = response.addresses[0].address;
58
+ },
59
+ payload: {
60
+ message: "Address for receiving and sending payments",
61
+ network: { type: BitcoinNetworkType.Mainnet },
62
+ purposes: [AddressPurpose.Payment],
63
+ },
64
+ };
65
+
66
+ // TODO: Towan - probably not needed ?
67
+ await getAddress(getAddressOptions);
68
+
69
+ async function signTransaction(tx: InstanceType<typeof Transaction>) {
70
+ let signedTx: InstanceType<typeof Transaction> | undefined;
71
+ const psbtBytes = tx.toPSBT(0);
72
+ const psbtBase64Str = base64.encode(psbtBytes);
73
+ const inputCount = tx.inputsLength;
74
+
75
+ const signPsbtOptions: SignTransactionOptions = {
76
+ getProvider,
77
+ onCancel: () => {
78
+ throw new SwapKitError("wallet_passkeys_signature_canceled");
79
+ },
80
+ onFinish: (response) => {
81
+ signedTx = Transaction.fromPSBT(base64.decode(response.psbtBase64));
82
+ },
83
+ payload: {
84
+ broadcast: false,
85
+ inputsToSign: [{ address: address, signingIndexes: Array.from({ length: inputCount }, (_, i) => i) }],
86
+ message: "Sign transaction",
87
+ network: { type: BitcoinNetworkType.Mainnet },
88
+ psbtBase64: psbtBase64Str,
89
+ },
90
+ };
91
+
92
+ await satsSignTransaction(signPsbtOptions);
93
+ if (!signedTx) throw new SwapKitError("wallet_passkeys_sign_transaction_error");
94
+ return signedTx;
95
+ }
96
+
97
+ const signer = { getAddress: () => Promise.resolve(address), signTransaction };
98
+ const toolbox = await getUtxoToolbox(chain, { signer });
99
+
100
+ return { ...toolbox, address };
101
+ })
102
+ .with(...EVMChains, async (chain) => {
103
+ const { getProvider, getEvmToolboxAsync } = await import("@swapkit/toolboxes/evm");
104
+ const { BrowserProvider } = await import("ethers");
105
+
106
+ const walletProvider = await wallet.getProvider("ethereum");
107
+ if (!walletProvider) {
108
+ throw new SwapKitError("wallet_passkeys_not_found");
109
+ }
110
+
111
+ const jsonRpcProvider = await getProvider(chain);
112
+ const browserProvider = new BrowserProvider(walletProvider, "any");
113
+
114
+ await browserProvider.send("eth_requestAccounts", []);
115
+
116
+ const signer = await browserProvider.getSigner();
117
+ const address = await signer.getAddress();
118
+ const toolbox = await getEvmToolboxAsync(chain, { provider: jsonRpcProvider, signer });
119
+
120
+ return { ...prepareNetworkSwitch({ chain, provider: browserProvider, toolbox }), address };
121
+ })
122
+ .with(Chain.Solana, async () => {
123
+ const { getSolanaToolbox } = await import("@swapkit/toolboxes/solana");
124
+ const provider = (await wallet.getProvider("solana")) as any as SolanaProvider;
125
+ const providerConnection = await provider.connect();
126
+ const address = providerConnection.publicKey.toString();
127
+ const toolbox = await getSolanaToolbox({ signer: provider });
128
+
129
+ const disconnect = async () => {
130
+ await provider.disconnect();
131
+ };
132
+
133
+ return { ...toolbox, address, disconnect };
134
+ })
135
+ .otherwise((chain) => {
136
+ throw new SwapKitError("wallet_passkeys_chain_not_supported", { chain });
137
+ });
138
+ }
139
+
140
+ export const passkeysWallet = createWallet({
141
+ connect: ({ addChain, walletType, supportedChains }) =>
142
+ async function connectPasskeys(chains: Chain[], paramWallet?: Wallet) {
143
+ const wallet = paramWallet || (await getPasskeyWallet());
144
+
145
+ if (!wallet) throw new SwapKitError("wallet_passkeys_instance_missing");
146
+ const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });
147
+
148
+ await Promise.all(
149
+ filteredChains.map(async (chain) => {
150
+ try {
151
+ const walletData = await getWalletMethods({ chain, wallet });
152
+
153
+ const { address, ...walletMethods } = walletData;
154
+
155
+ addChain({
156
+ ...walletMethods,
157
+ address,
158
+ chain,
159
+ disconnect: wallet.disconnect,
160
+ walletType: WalletOption.PASSKEYS,
161
+ });
162
+ } catch (error) {
163
+ console.error(`Failed to connect ${chain} wallet:`, error);
164
+ throw error;
165
+ }
166
+ }),
167
+ );
168
+
169
+ return true;
170
+ },
171
+ directSigningSupport: {
172
+ ...Object.fromEntries(EVMChains.map((chain) => [chain, true])),
173
+ [Chain.Bitcoin]: true,
174
+ [Chain.Solana]: true,
175
+ },
176
+ name: "connectPasskeys",
177
+ supportedChains: [...EVMChains, Chain.Bitcoin, Chain.Solana],
178
+ walletType: WalletOption.PASSKEYS,
179
+ });
180
+
181
+ export const PASSKEYS_SUPPORTED_CHAINS = getWalletSupportedChains(passkeysWallet);
182
+ export * from "@passkeys/core";
183
+ export * from "@passkeys/react";
package/src/phantom.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-extensions/phantom";
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-extensions/polkadotjs";
@@ -0,0 +1,95 @@
1
+ import { type AssetValue, Chain, filterSupportedChains, SKConfig, SwapKitError, WalletOption } from "@swapkit/helpers";
2
+ import { createWallet, getWalletSupportedChains } from "@swapkit/wallet-core";
3
+
4
+ export const radixWallet = createWallet({
5
+ connect: ({ addChain, supportedChains, walletType }) =>
6
+ async function connectRadixWallet(chains: Chain[]) {
7
+ const filteredChains = filterSupportedChains({ chains, supportedChains, walletType });
8
+ const radixConfig = SKConfig.get("integrations").radix;
9
+
10
+ if (!radixConfig) {
11
+ throw new SwapKitError("wallet_radix_not_found");
12
+ }
13
+
14
+ await Promise.all(
15
+ filteredChains.map(async (chain) => {
16
+ const walletMethods = await getWalletMethods();
17
+
18
+ addChain({ ...walletMethods, chain, walletType });
19
+ }),
20
+ );
21
+
22
+ return true;
23
+ },
24
+ // Radix is not in V3 swap chain list
25
+ directSigningSupport: {},
26
+ name: "connectRadixWallet",
27
+ supportedChains: [Chain.Radix],
28
+ walletType: WalletOption.RADIX_WALLET,
29
+ });
30
+
31
+ export const RADIX_SUPPORTED_CHAINS = getWalletSupportedChains(radixWallet);
32
+
33
+ async function getWalletMethods() {
34
+ const { RadixDappToolkit } = await import("@radixdlt/radix-dapp-toolkit");
35
+ const { getRadixToolbox } = await import("@swapkit/toolboxes/radix");
36
+
37
+ const dappConfig = SKConfig.get("integrations").radix;
38
+ const rdt = RadixDappToolkit({ ...dappConfig, networkId: dappConfig.network.networkId });
39
+ const toolbox = getRadixToolbox({ dappConfig });
40
+
41
+ function delay(ms: number) {
42
+ return new Promise((resolve) => setTimeout(resolve, ms));
43
+ }
44
+
45
+ // TODO: @Towan - Wat is dat?
46
+ await delay(400);
47
+
48
+ function getAddress() {
49
+ const existingWalletData = rdt.walletApi.getWalletData();
50
+ const account = existingWalletData?.accounts?.[0];
51
+
52
+ return account?.address;
53
+ }
54
+
55
+ async function getNewAddress() {
56
+ const { DataRequestBuilder } = await import("@radixdlt/radix-dapp-toolkit");
57
+ rdt.walletApi.setRequestData(DataRequestBuilder.accounts().exactly(1));
58
+ const res = await rdt.walletApi.sendRequest();
59
+
60
+ if (!res) {
61
+ throw new SwapKitError("wallet_radix_no_account");
62
+ }
63
+
64
+ const newAddress = res.unwrapOr(null)?.accounts[0]?.address;
65
+
66
+ if (!newAddress) {
67
+ throw new SwapKitError("wallet_radix_no_account");
68
+ }
69
+
70
+ return newAddress;
71
+ }
72
+
73
+ const address = getAddress() || (await getNewAddress());
74
+
75
+ return {
76
+ address,
77
+ getAddress,
78
+ getBalance: () => toolbox.getBalance(address),
79
+ radixDappToolkit: rdt,
80
+ signAndBroadcast: async ({ manifest, message }: { manifest: string; message: string }) => {
81
+ const tx = await rdt.walletApi.sendTransaction({ message, transactionManifest: manifest });
82
+
83
+ const txResult = tx.unwrapOr(null)?.transactionIntentHash;
84
+
85
+ if (!txResult) {
86
+ throw new SwapKitError("wallet_radix_transaction_failed");
87
+ }
88
+
89
+ return txResult;
90
+ },
91
+ transfer: (_params: { assetValue: AssetValue; recipient: string; from: string }) => {
92
+ throw new SwapKitError("wallet_radix_method_not_supported", { method: "transfer" });
93
+ },
94
+ };
95
+ }
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-extensions/talisman";
package/src/trezor.ts ADDED
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-hardware/trezor";
@@ -0,0 +1 @@
1
+ export * from "@swapkit/wallet-extensions/tronlink";