@talken/talkenkit 2.4.24 → 2.4.25

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 (111) hide show
  1. package/dist/AbcCredentialManager-DDHLW2IH.js +7 -0
  2. package/dist/abcWallet-MWUFO3JQ.js +161 -0
  3. package/dist/abcWallet-OL47MLVO.js +161 -0
  4. package/dist/abcWallet-VYU3TEGJ.js +161 -0
  5. package/dist/abcWallet-WZGXGXUA.js +161 -0
  6. package/dist/chunk-2OHX4KTB.js +5382 -0
  7. package/dist/chunk-ALBABQ53.js +354 -0
  8. package/dist/chunk-NQCUKFAV.js +5381 -0
  9. package/dist/chunk-RIEG3EJO.js +5385 -0
  10. package/dist/chunk-UKIPSWEV.js +5386 -0
  11. package/dist/hooks/useProfile.d.ts +13 -6
  12. package/dist/hooks/useSolanaWallet.d.ts +9 -8
  13. package/dist/index.d.ts +2 -2
  14. package/dist/index.js +267 -176
  15. package/dist/providers/SignConfirmationProvider/useApiClient.d.ts +3 -0
  16. package/dist/solana/ConfiguredWalletProvider.d.ts +10 -0
  17. package/dist/solana/LegacySolflareWalletAdapter.d.ts +32 -0
  18. package/dist/solana/connectExternalWallet.d.ts +9 -0
  19. package/dist/solana/isWalletReady.d.ts +2 -0
  20. package/dist/transactions/transactionStore.d.ts +2 -5
  21. package/dist/utils/apiClientFactory.d.ts +16 -1
  22. package/dist/wallets/walletConnectors/abcWallet/AbcCredentialManager.js +2 -2
  23. package/dist/wallets/walletConnectors/abcWallet/AbcEvmAutoConnector.js +2 -2
  24. package/dist/wallets/walletConnectors/abcWallet/abcBitcoinConnector.js +3 -3
  25. package/dist/wallets/walletConnectors/abcWallet/abcBitcoinProvider.js +3 -3
  26. package/dist/wallets/walletConnectors/abcWallet/abcConnector.js +6 -6
  27. package/dist/wallets/walletConnectors/abcWallet/abcProvider.js +4 -4
  28. package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.d.ts +0 -4
  29. package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.js +11 -3
  30. package/dist/wallets/walletConnectors/abcWallet/abcSolanaWalletAdapter.js +5 -5
  31. package/dist/wallets/walletConnectors/abcWallet/abcTronProvider.js +3 -3
  32. package/dist/wallets/walletConnectors/abcWallet/abcWallet.js +7 -7
  33. package/dist/wallets/walletConnectors/abcWallet/api/ConfigApi.d.ts +21 -0
  34. package/dist/wallets/walletConnectors/abcWallet/api/ConfigApi.js +8 -0
  35. package/dist/wallets/walletConnectors/abcWallet/api/SolanaApi.d.ts +28 -115
  36. package/dist/wallets/walletConnectors/abcWallet/api/SolanaApi.js +1 -6
  37. package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.d.ts +23 -1
  38. package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.js +3 -3
  39. package/dist/wallets/walletConnectors/abcWallet/api/TokenApi.d.ts +14 -0
  40. package/dist/wallets/walletConnectors/abcWallet/api/TokenApi.js +8 -0
  41. package/dist/wallets/walletConnectors/abcWallet/api/WalletscanApi.d.ts +20 -0
  42. package/dist/wallets/walletConnectors/abcWallet/api/WalletscanApi.js +1 -1
  43. package/dist/wallets/walletConnectors/abcWallet/api/index.d.ts +3 -0
  44. package/dist/wallets/walletConnectors/abcWallet/api/index.js +17 -5
  45. package/dist/wallets/walletConnectors/abcWallet/constants.d.ts +4 -0
  46. package/dist/wallets/walletConnectors/abcWallet/constants.js +1 -1
  47. package/dist/wallets/walletConnectors/abcWallet/index.d.ts +1 -1
  48. package/dist/wallets/walletConnectors/abcWallet/index.js +33 -21
  49. package/dist/wallets/walletConnectors/abcWallet/sessionUtils.js +2 -2
  50. package/dist/wallets/walletConnectors/abcWallet/types.d.ts +4 -0
  51. package/dist/wallets/walletConnectors/abcWallet/utils.js +2 -2
  52. package/dist/wallets/walletConnectors/abcWallet/walletGeneration.js +3 -3
  53. package/dist/wallets/walletConnectors/berasigWallet/berasigWallet.js +2 -2
  54. package/dist/wallets/walletConnectors/bifrostWallet/bifrostWallet.js +2 -2
  55. package/dist/wallets/walletConnectors/binanceWallet/binanceWallet.js +2 -2
  56. package/dist/wallets/walletConnectors/bitgetWallet/bitgetWallet.js +2 -2
  57. package/dist/wallets/walletConnectors/bybitWallet/bybitWallet.js +2 -2
  58. package/dist/wallets/walletConnectors/chunk-6WF4SXLB.js +156 -0
  59. package/dist/wallets/walletConnectors/chunk-7DM6H5BJ.js +54 -0
  60. package/dist/wallets/walletConnectors/chunk-7ORDZ6EQ.js +1479 -0
  61. package/dist/wallets/walletConnectors/chunk-A66MTFML.js +223 -0
  62. package/dist/wallets/walletConnectors/chunk-ACLPF2UW.js +96 -0
  63. package/dist/wallets/walletConnectors/chunk-BXH3GDX5.js +273 -0
  64. package/dist/wallets/walletConnectors/chunk-CABLJOMU.js +194 -0
  65. package/dist/wallets/walletConnectors/chunk-CE37VZAR.js +300 -0
  66. package/dist/wallets/walletConnectors/chunk-DPTDOCWL.js +205 -0
  67. package/dist/wallets/walletConnectors/chunk-E7TDM6P6.js +205 -0
  68. package/dist/wallets/walletConnectors/chunk-GBMOX5JN.js +54 -0
  69. package/dist/wallets/walletConnectors/chunk-GWYZ2IPP.js +1479 -0
  70. package/dist/wallets/walletConnectors/chunk-HF6GFAE5.js +54 -0
  71. package/dist/wallets/walletConnectors/chunk-IM7DEERX.js +585 -0
  72. package/dist/wallets/walletConnectors/chunk-INFMRNND.js +300 -0
  73. package/dist/wallets/walletConnectors/chunk-JADQLTFW.js +194 -0
  74. package/dist/wallets/walletConnectors/chunk-JGXJY3SB.js +1 -0
  75. package/dist/wallets/walletConnectors/chunk-K3VHBOXQ.js +32 -0
  76. package/dist/wallets/walletConnectors/chunk-KZS2C73S.js +814 -0
  77. package/dist/wallets/walletConnectors/chunk-LJNUFDGO.js +205 -0
  78. package/dist/wallets/walletConnectors/chunk-MO2AXXLI.js +30 -0
  79. package/dist/wallets/walletConnectors/chunk-NYDDRNUI.js +445 -0
  80. package/dist/wallets/walletConnectors/chunk-O4DNG6JJ.js +54 -0
  81. package/dist/wallets/walletConnectors/chunk-OTLZVWY7.js +39 -0
  82. package/dist/wallets/walletConnectors/chunk-PDXO6AOG.js +300 -0
  83. package/dist/wallets/walletConnectors/chunk-VDWJ3NQ5.js +52 -0
  84. package/dist/wallets/walletConnectors/chunk-VKOPUEQG.js +445 -0
  85. package/dist/wallets/walletConnectors/chunk-VTOD7PXP.js +817 -0
  86. package/dist/wallets/walletConnectors/chunk-WC7BGU5Z.js +814 -0
  87. package/dist/wallets/walletConnectors/chunk-YDSBY7NO.js +54 -0
  88. package/dist/wallets/walletConnectors/chunk-YV6IZWGE.js +393 -0
  89. package/dist/wallets/walletConnectors/chunk-Z5SBGIWT.js +300 -0
  90. package/dist/wallets/walletConnectors/chunk-ZKCUYHBK.js +300 -0
  91. package/dist/wallets/walletConnectors/clvWallet/clvWallet.js +2 -2
  92. package/dist/wallets/walletConnectors/coin98Wallet/coin98Wallet.js +2 -2
  93. package/dist/wallets/walletConnectors/coreWallet/coreWallet.js +2 -2
  94. package/dist/wallets/walletConnectors/foxWallet/foxWallet.js +2 -2
  95. package/dist/wallets/walletConnectors/frontierWallet/frontierWallet.js +2 -2
  96. package/dist/wallets/walletConnectors/gateWallet/gateWallet.js +2 -2
  97. package/dist/wallets/walletConnectors/index.js +99 -99
  98. package/dist/wallets/walletConnectors/iopayWallet/iopayWallet.js +2 -2
  99. package/dist/wallets/walletConnectors/kaiaWallet/kaiaWallet.js +2 -2
  100. package/dist/wallets/walletConnectors/kaikasWallet/kaikasWallet.js +2 -2
  101. package/dist/wallets/walletConnectors/metaMaskWallet/metaMaskWallet.js +2 -2
  102. package/dist/wallets/walletConnectors/okxWallet/okxWallet.js +2 -2
  103. package/dist/wallets/walletConnectors/rainbowWallet/rainbowWallet.js +2 -2
  104. package/dist/wallets/walletConnectors/roninWallet/roninWallet.js +2 -2
  105. package/dist/wallets/walletConnectors/safepalWallet/safepalWallet.js +2 -2
  106. package/dist/wallets/walletConnectors/subWallet/subWallet.js +2 -2
  107. package/dist/wallets/walletConnectors/tokenPocketWallet/tokenPocketWallet.js +2 -2
  108. package/dist/wallets/walletConnectors/trustWallet/trustWallet.js +2 -2
  109. package/dist/wallets/walletConnectors/zealWallet/zealWallet.js +2 -2
  110. package/dist/wallets/walletConnectors/zerionWallet/zerionWallet.js +2 -2
  111. package/package.json +1 -1
@@ -0,0 +1,54 @@
1
+ "use client";
2
+ import {
3
+ abcConnector
4
+ } from "./chunk-Z5SBGIWT.js";
5
+ import {
6
+ resolveTalkenApiUrl
7
+ } from "./chunk-GFWUFYT2.js";
8
+ import {
9
+ createTalkenApiClient
10
+ } from "./chunk-VTOD7PXP.js";
11
+ import {
12
+ ABC_WALLET_METADATA
13
+ } from "./chunk-DPTDOCWL.js";
14
+
15
+ // src/wallets/walletConnectors/abcWallet/abcWallet.ts
16
+ import { setTalkenApiClient } from "@talken/talkenkit";
17
+ var abcWallet = (specificOptions) => ({ projectId }) => {
18
+ const talkenApiUrl = resolveTalkenApiUrl(specificOptions?.talkenApiUrl);
19
+ const talkenApi = createTalkenApiClient({
20
+ baseUrl: talkenApiUrl,
21
+ debug: specificOptions?.environment === "development"
22
+ });
23
+ setTalkenApiClient(talkenApi);
24
+ const config = {
25
+ talkenApiUrl,
26
+ apiKey: specificOptions?.apiKey,
27
+ plain: specificOptions?.plain || "",
28
+ // Deprecated - not used (secure.ts uses random generation)
29
+ environment: specificOptions?.environment || "development",
30
+ defaultChainId: specificOptions?.defaultChainId,
31
+ defaultSolanaNetwork: specificOptions?.defaultSolanaNetwork,
32
+ defaultBitcoinNetwork: specificOptions?.defaultBitcoinNetwork,
33
+ projectId
34
+ };
35
+ return {
36
+ id: ABC_WALLET_METADATA.id,
37
+ name: ABC_WALLET_METADATA.name,
38
+ rdns: ABC_WALLET_METADATA.rdns,
39
+ iconUrl: async () => (await import("./abcWallet-AYWSIGAG.js")).default,
40
+ iconBackground: ABC_WALLET_METADATA.iconBackground,
41
+ // Embedded wallet - no installation required
42
+ installed: void 0,
43
+ // No download URLs for embedded wallet
44
+ downloadUrls: void 0,
45
+ // Create connector - wrapper function required by Wallet type
46
+ createConnector: (_walletDetails) => abcConnector({ config }),
47
+ // Embedded wallet always available
48
+ hidden: () => false
49
+ };
50
+ };
51
+
52
+ export {
53
+ abcWallet
54
+ };
@@ -0,0 +1,585 @@
1
+ "use client";
2
+ import {
3
+ getCredentialManager
4
+ } from "./chunk-6WF4SXLB.js";
5
+
6
+ // src/wallets/walletConnectors/abcWallet/abcBitcoinProvider.ts
7
+ import { getTalkenApiClient } from "@talken/talkenkit";
8
+ function isTalkenApiClient(client) {
9
+ return typeof client?.bitcoin?.getUtxos === "function";
10
+ }
11
+ var EventEmitter = class {
12
+ constructor() {
13
+ this.events = /* @__PURE__ */ new Map();
14
+ }
15
+ on(event, listener) {
16
+ if (!this.events.has(event)) {
17
+ this.events.set(event, []);
18
+ }
19
+ this.events.get(event).push(listener);
20
+ return this;
21
+ }
22
+ off(event, listener) {
23
+ const listeners = this.events.get(event);
24
+ if (listeners) {
25
+ const index = listeners.indexOf(listener);
26
+ if (index !== -1) {
27
+ listeners.splice(index, 1);
28
+ }
29
+ }
30
+ return this;
31
+ }
32
+ removeListener(event, listener) {
33
+ return this.off(event, listener);
34
+ }
35
+ emit(event, ...args) {
36
+ const listeners = this.events.get(event);
37
+ if (listeners) {
38
+ for (const listener of listeners) {
39
+ listener(...args);
40
+ }
41
+ return true;
42
+ }
43
+ return false;
44
+ }
45
+ removeAllListeners(event) {
46
+ if (event) {
47
+ this.events.delete(event);
48
+ } else {
49
+ this.events.clear();
50
+ }
51
+ return this;
52
+ }
53
+ };
54
+ var BitcoinErrorCode = {
55
+ USER_REJECTED: 4001,
56
+ UNAUTHORIZED: 4100,
57
+ UNSUPPORTED_METHOD: 4200,
58
+ DISCONNECTED: 4900,
59
+ INVALID_PARAMS: -32602,
60
+ INTERNAL_ERROR: -32603,
61
+ INSUFFICIENT_FUNDS: 5001,
62
+ UTXO_NOT_FOUND: 5002
63
+ };
64
+ var BitcoinProviderError = class extends Error {
65
+ constructor(code, message, data) {
66
+ super(message);
67
+ this.code = code;
68
+ this.data = data;
69
+ this.name = "BitcoinProviderError";
70
+ }
71
+ };
72
+ var BITCOIN_NETWORKS = {
73
+ mainnet: {
74
+ name: "Bitcoin Mainnet",
75
+ type: "bitcoin",
76
+ explorer: "https://blockstream.info"
77
+ },
78
+ testnet: {
79
+ name: "Bitcoin Testnet",
80
+ type: "bitcoin_testnet",
81
+ explorer: "https://blockstream.info/testnet"
82
+ }
83
+ };
84
+ var AbcBitcoinProvider = class extends EventEmitter {
85
+ constructor(client) {
86
+ super();
87
+ this.wallet = null;
88
+ this.network = BITCOIN_NETWORKS.testnet;
89
+ this.connected = false;
90
+ this.utxoCache = /* @__PURE__ */ new Map();
91
+ this.cacheExpiry = /* @__PURE__ */ new Map();
92
+ this.CACHE_TTL = 6e4;
93
+ if (isTalkenApiClient(client)) {
94
+ this.talkenApi = client;
95
+ }
96
+ }
97
+ extractHashSignature(result) {
98
+ const data = result;
99
+ return data?.signatureHex || data?.signstr || data?.result?.signstr || data?.data?.signatureHex || data?.data?.signstr || data?.data?.result?.signstr || "";
100
+ }
101
+ getRecoveryEmail() {
102
+ return getCredentialManager().getEmail() || void 0;
103
+ }
104
+ /**
105
+ * Set request interceptor for sign/transfer confirmation modals
106
+ */
107
+ setRequestInterceptor(interceptor) {
108
+ this.requestInterceptor = interceptor;
109
+ }
110
+ /**
111
+ * Call request interceptor if set (throws on user cancel)
112
+ */
113
+ async callInterceptor(request) {
114
+ if (this.requestInterceptor) {
115
+ await this.requestInterceptor(request);
116
+ }
117
+ }
118
+ /**
119
+ * Set wallet information
120
+ */
121
+ setWallet(wallet) {
122
+ const previousAddress = this.wallet?.address;
123
+ this.wallet = wallet;
124
+ this.connected = true;
125
+ if (wallet.network === "bitcoin") {
126
+ this.network = BITCOIN_NETWORKS.mainnet;
127
+ } else {
128
+ this.network = BITCOIN_NETWORKS.testnet;
129
+ }
130
+ if (previousAddress !== wallet.address) {
131
+ this.emit("accountsChanged", [wallet.address]);
132
+ this.clearUtxoCache();
133
+ }
134
+ this.emit("connect", {
135
+ address: wallet.address,
136
+ network: this.network.type
137
+ });
138
+ console.log(
139
+ "[BitcoinProvider] \u2705 Wallet connected:",
140
+ `${wallet.address.substring(0, 6)}...${wallet.address.substring(wallet.address.length - 6)}`
141
+ );
142
+ }
143
+ /**
144
+ * Clear wallet (disconnect)
145
+ */
146
+ clearWallet() {
147
+ this.wallet = null;
148
+ this.connected = false;
149
+ this.clearUtxoCache();
150
+ this.emit("disconnect");
151
+ this.emit("accountsChanged", []);
152
+ console.log("[BitcoinProvider] \u{1F50C} Wallet disconnected");
153
+ }
154
+ /**
155
+ * Set TalkenApiClient for backend-proxied transaction flow
156
+ * When set, sendTransaction will use a single API call instead of multi-step WaaS
157
+ */
158
+ setTalkenApi(talkenApi) {
159
+ this.talkenApi = talkenApi;
160
+ }
161
+ /**
162
+ * Set network
163
+ */
164
+ setNetwork(networkKey) {
165
+ const newNetwork = BITCOIN_NETWORKS[networkKey];
166
+ if (!newNetwork) {
167
+ throw new BitcoinProviderError(
168
+ BitcoinErrorCode.INVALID_PARAMS,
169
+ `Unknown network: ${networkKey}`
170
+ );
171
+ }
172
+ const previousType = this.network.type;
173
+ this.network = newNetwork;
174
+ if (previousType !== newNetwork.type) {
175
+ this.emit("networkChanged", newNetwork.type);
176
+ this.clearUtxoCache();
177
+ }
178
+ }
179
+ /**
180
+ * Get current network
181
+ */
182
+ getNetwork() {
183
+ return this.network;
184
+ }
185
+ /**
186
+ * Check if connected
187
+ */
188
+ isConnected() {
189
+ return this.connected && this.wallet !== null;
190
+ }
191
+ /**
192
+ * Get Bitcoin address
193
+ */
194
+ async getAddress() {
195
+ if (!this.wallet) {
196
+ throw new BitcoinProviderError(
197
+ BitcoinErrorCode.DISCONNECTED,
198
+ "Wallet not connected"
199
+ );
200
+ }
201
+ return this.wallet.address;
202
+ }
203
+ /**
204
+ * Get compressed public key (33 bytes)
205
+ */
206
+ async getPublicKey() {
207
+ if (!this.wallet) {
208
+ throw new BitcoinProviderError(
209
+ BitcoinErrorCode.DISCONNECTED,
210
+ "Wallet not connected"
211
+ );
212
+ }
213
+ return this.wallet.publicKey;
214
+ }
215
+ /**
216
+ * Get address type (bech32, p2pkh, etc.)
217
+ */
218
+ getAddressType() {
219
+ if (!this.wallet) {
220
+ throw new BitcoinProviderError(
221
+ BitcoinErrorCode.DISCONNECTED,
222
+ "Wallet not connected"
223
+ );
224
+ }
225
+ return this.wallet.addressType;
226
+ }
227
+ /**
228
+ * Clear UTXO cache
229
+ */
230
+ clearUtxoCache() {
231
+ this.utxoCache.clear();
232
+ this.cacheExpiry.clear();
233
+ }
234
+ /**
235
+ * Check if cache is valid
236
+ */
237
+ isCacheValid(address) {
238
+ const expiry = this.cacheExpiry.get(address);
239
+ if (!expiry)
240
+ return false;
241
+ return Date.now() < expiry;
242
+ }
243
+ normalizeUtxos(rawUtxos) {
244
+ return rawUtxos.map((u) => ({
245
+ txid: String(u?.txid ?? u?.tx_hash ?? ""),
246
+ vout: Number(u?.vout ?? u?.output_index ?? 0),
247
+ value: Number(u?.value ?? u?.satoshis ?? 0),
248
+ scriptPubKey: String(
249
+ u?.scriptPubKey ?? u?.script_pub_key ?? u?.script ?? ""
250
+ ),
251
+ confirmations: Number(u?.confirmations ?? 0)
252
+ })).filter(
253
+ (u) => Boolean(u.txid) && Number.isFinite(u.vout) && Number.isFinite(u.value) && Number.isFinite(u.confirmations)
254
+ );
255
+ }
256
+ /**
257
+ * Get UTXOs for address (with caching)
258
+ */
259
+ async getUtxos(forceRefresh = false) {
260
+ if (!this.wallet) {
261
+ throw new BitcoinProviderError(
262
+ BitcoinErrorCode.DISCONNECTED,
263
+ "Wallet not connected"
264
+ );
265
+ }
266
+ const address = this.wallet.address;
267
+ if (!forceRefresh && this.isCacheValid(address)) {
268
+ const cached = this.utxoCache.get(address);
269
+ if (cached) {
270
+ console.log(
271
+ `[BitcoinProvider] \u{1F4E6} Using cached UTXOs (${cached.length} items)`
272
+ );
273
+ return cached;
274
+ }
275
+ }
276
+ try {
277
+ console.log("[BitcoinProvider] \u{1F50D} Fetching UTXOs from network...");
278
+ const api = this.talkenApi || getTalkenApiClient();
279
+ const result = await api.bitcoin.getUtxos(this.network.type, address);
280
+ const utxos = this.normalizeUtxos(result.utxos || []);
281
+ this.utxoCache.set(address, utxos);
282
+ this.cacheExpiry.set(address, Date.now() + this.CACHE_TTL);
283
+ console.log(`[BitcoinProvider] \u2705 Fetched ${utxos.length} UTXOs`);
284
+ return utxos;
285
+ } catch (error) {
286
+ console.error(
287
+ "[BitcoinProvider] \u274C Failed to fetch UTXOs:",
288
+ error.message
289
+ );
290
+ throw new BitcoinProviderError(
291
+ BitcoinErrorCode.INTERNAL_ERROR,
292
+ "Failed to fetch UTXOs",
293
+ error
294
+ );
295
+ }
296
+ }
297
+ /**
298
+ * Get total balance (sum of all UTXOs)
299
+ * Returns balance in satoshis
300
+ */
301
+ async getBalance(forceRefresh = false) {
302
+ const utxos = await this.getUtxos(forceRefresh);
303
+ const balance = utxos.reduce((sum, utxo) => sum + utxo.value, 0);
304
+ console.log(
305
+ `[BitcoinProvider] \u{1F4B0} Balance: ${balance} satoshis (${balance / 1e8} BTC)`
306
+ );
307
+ return balance;
308
+ }
309
+ /**
310
+ * Estimate transaction fee
311
+ * Returns fee rate in satoshis per byte
312
+ */
313
+ async estimateFee(targetBlocks = 6) {
314
+ try {
315
+ const api = this.talkenApi || getTalkenApiClient();
316
+ const result = await api.bitcoin.getFeeRate(
317
+ this.network.type,
318
+ targetBlocks
319
+ );
320
+ const feeRate = Number(result.feeRate);
321
+ if (!Number.isFinite(feeRate) || feeRate <= 0) {
322
+ throw new Error("Invalid fee rate");
323
+ }
324
+ console.log(`[BitcoinProvider] \u26FD Fee rate: ${feeRate} sat/byte`);
325
+ return feeRate;
326
+ } catch (_error) {
327
+ console.error("[BitcoinProvider] \u26A0\uFE0F Fee estimation failed, using default");
328
+ return 1;
329
+ }
330
+ }
331
+ /**
332
+ * Sign Bitcoin message (Bitcoin Signed Message format)
333
+ * Uses secp256k1 sign/hash endpoint with double-SHA256 of prefixed message.
334
+ *
335
+ * Format: SHA256(SHA256("\x18Bitcoin Signed Message:\n" + varint(len) + message))
336
+ *
337
+ * @param message - Message to sign (string)
338
+ * @returns Signature in hex format (compact: r + s + v)
339
+ */
340
+ async signMessage(message) {
341
+ if (!this.wallet) {
342
+ throw new BitcoinProviderError(
343
+ BitcoinErrorCode.DISCONNECTED,
344
+ "Wallet not connected"
345
+ );
346
+ }
347
+ await this.callInterceptor({
348
+ chain: "bitcoin",
349
+ method: "signMessage",
350
+ address: this.wallet.address,
351
+ network: this.network.type,
352
+ message
353
+ });
354
+ console.log("[BitcoinProvider] \u{1F4DD} Signing Bitcoin message...");
355
+ const prefix = "Bitcoin Signed Message:\n";
356
+ const msgBytes = new TextEncoder().encode(message);
357
+ const varint = this.encodeVarint(msgBytes.length);
358
+ const prefixBytes = new TextEncoder().encode(prefix);
359
+ const preimage = new Uint8Array(
360
+ prefixBytes.length + varint.length + msgBytes.length
361
+ );
362
+ preimage.set(prefixBytes, 0);
363
+ preimage.set(varint, prefixBytes.length);
364
+ preimage.set(msgBytes, prefixBytes.length + varint.length);
365
+ const hash1 = await crypto.subtle.digest("SHA-256", preimage);
366
+ const hash2 = await crypto.subtle.digest("SHA-256", hash1);
367
+ const hashHex = Array.from(new Uint8Array(hash2)).map((b) => b.toString(16).padStart(2, "0")).join("");
368
+ const api = getTalkenApiClient();
369
+ if (!api) {
370
+ throw new BitcoinProviderError(
371
+ BitcoinErrorCode.INTERNAL_ERROR,
372
+ "TalkenApiClient not initialized"
373
+ );
374
+ }
375
+ const pinHash = getCredentialManager().getPinHash() || "";
376
+ const email = this.getRecoveryEmail();
377
+ let signstr = "";
378
+ try {
379
+ const result = await api.bitcoin.execute({
380
+ action: "signHash",
381
+ hash: hashHex,
382
+ pin: pinHash,
383
+ network: this.network.type,
384
+ ...email && { email }
385
+ });
386
+ signstr = this.extractHashSignature(result);
387
+ } catch (error) {
388
+ console.warn(
389
+ "[BitcoinProvider] BTC signHash endpoint failed, falling back to generic sign/hash:",
390
+ error
391
+ );
392
+ }
393
+ if (!signstr) {
394
+ signstr = this.extractHashSignature(
395
+ await api.bitcoin.signHash({
396
+ hash: hashHex,
397
+ pin: pinHash,
398
+ network: this.network.type,
399
+ ...email && { email }
400
+ })
401
+ );
402
+ }
403
+ if (!signstr) {
404
+ throw new BitcoinProviderError(
405
+ BitcoinErrorCode.INTERNAL_ERROR,
406
+ "Empty signature from sign/hash"
407
+ );
408
+ }
409
+ console.log("[BitcoinProvider] \u2705 Message signed successfully");
410
+ return signstr;
411
+ }
412
+ /** Encode integer as Bitcoin varint */
413
+ encodeVarint(n) {
414
+ if (n < 253)
415
+ return new Uint8Array([n]);
416
+ if (n <= 65535) {
417
+ const buf2 = new Uint8Array(3);
418
+ buf2[0] = 253;
419
+ buf2[1] = n & 255;
420
+ buf2[2] = n >> 8 & 255;
421
+ return buf2;
422
+ }
423
+ const buf = new Uint8Array(5);
424
+ buf[0] = 254;
425
+ buf[1] = n & 255;
426
+ buf[2] = n >> 8 & 255;
427
+ buf[3] = n >> 16 & 255;
428
+ buf[4] = n >> 24 & 255;
429
+ return buf;
430
+ }
431
+ /**
432
+ * High-level transaction sending (like Solana pattern)
433
+ * Creates, signs, and broadcasts transaction
434
+ *
435
+ * @param params - Transaction parameters
436
+ * @param params.toAddress - Recipient Bitcoin address
437
+ * @param params.amount - Amount in BTC (will be converted to satoshis)
438
+ * @returns Transaction hash
439
+ */
440
+ async sendTransaction(params) {
441
+ if (!this.wallet) {
442
+ throw new BitcoinProviderError(
443
+ BitcoinErrorCode.DISCONNECTED,
444
+ "Wallet not connected"
445
+ );
446
+ }
447
+ try {
448
+ await this.callInterceptor({
449
+ chain: "bitcoin",
450
+ method: "sendTransaction",
451
+ fromAddress: this.wallet.address,
452
+ toAddress: params.toAddress,
453
+ amount: String(params.amount),
454
+ symbol: "BTC",
455
+ network: this.network.type,
456
+ isNativeToken: true,
457
+ feeSymbol: "BTC"
458
+ });
459
+ console.log("[BitcoinProvider] \u{1F4B8} Starting high-level transaction...");
460
+ const pinHash = getCredentialManager().getPinHash();
461
+ if (!pinHash) {
462
+ throw new BitcoinProviderError(
463
+ BitcoinErrorCode.INTERNAL_ERROR,
464
+ "PIN hash not found. Please login again."
465
+ );
466
+ }
467
+ const email = this.getRecoveryEmail();
468
+ const satoshis = Math.floor(params.amount * 1e8);
469
+ const api = this.talkenApi || getTalkenApiClient();
470
+ const result = await api.bitcoin.sendTransaction({
471
+ toAddress: params.toAddress,
472
+ amountSats: satoshis.toString(),
473
+ pin: pinHash,
474
+ ...email && { email }
475
+ });
476
+ console.log(
477
+ "[BitcoinProvider] \u2705 BTC transaction complete via TalkenApiClient:",
478
+ result.txHash
479
+ );
480
+ this.emit("transactionBroadcasted", {
481
+ txHash: result.txHash,
482
+ explorerUrl: `${this.network.explorer}/tx/${result.txHash}`
483
+ });
484
+ this.clearUtxoCache();
485
+ return result.txHash;
486
+ } catch (error) {
487
+ if (error.message?.includes("cancelled") || error.message?.includes("rejected")) {
488
+ console.log("[BitcoinProvider] \u2139\uFE0F User cancelled transaction");
489
+ throw new BitcoinProviderError(
490
+ BitcoinErrorCode.USER_REJECTED,
491
+ "User rejected transaction",
492
+ error
493
+ );
494
+ }
495
+ console.error("[BitcoinProvider] \u274C Transaction failed:", error.message);
496
+ if (error.message?.includes("insufficient")) {
497
+ throw new BitcoinProviderError(
498
+ BitcoinErrorCode.INSUFFICIENT_FUNDS,
499
+ "Insufficient BTC balance",
500
+ error
501
+ );
502
+ }
503
+ this.emit("error", error);
504
+ throw new BitcoinProviderError(
505
+ BitcoinErrorCode.INTERNAL_ERROR,
506
+ "Failed to send transaction",
507
+ error
508
+ );
509
+ }
510
+ }
511
+ /**
512
+ * Broadcast signed transaction to network
513
+ *
514
+ * @param rawTransaction - Raw transaction in hex format
515
+ * @param psbt - Optional finalized PSBT
516
+ * @returns Transaction hash
517
+ */
518
+ async broadcastTransaction(rawTransaction, psbt) {
519
+ if (!this.wallet) {
520
+ throw new BitcoinProviderError(
521
+ BitcoinErrorCode.DISCONNECTED,
522
+ "Wallet not connected"
523
+ );
524
+ }
525
+ try {
526
+ console.log("[BitcoinProvider] \u{1F4E1} Broadcasting transaction...");
527
+ if (psbt) {
528
+ console.log(
529
+ "[BitcoinProvider] \u2139\uFE0F PSBT argument provided; raw tx broadcast uses rawTransaction only via talken-api"
530
+ );
531
+ }
532
+ const api = this.talkenApi || getTalkenApiClient();
533
+ const result = await api.bitcoin.broadcastRawTransaction({
534
+ network: this.network.type,
535
+ rawTransaction
536
+ });
537
+ console.log(
538
+ "[BitcoinProvider] \u2705 Transaction broadcasted:",
539
+ result.txHash
540
+ );
541
+ this.emit("transactionBroadcasted", {
542
+ txHash: result.txHash,
543
+ explorerUrl: `${this.network.explorer}/tx/${result.txHash}`
544
+ });
545
+ this.clearUtxoCache();
546
+ return result.txHash;
547
+ } catch (error) {
548
+ console.error(
549
+ "[BitcoinProvider] \u274C Transaction broadcast failed:",
550
+ error.message
551
+ );
552
+ this.emit("error", error);
553
+ throw new BitcoinProviderError(
554
+ BitcoinErrorCode.INTERNAL_ERROR,
555
+ "Failed to broadcast transaction",
556
+ error
557
+ );
558
+ }
559
+ }
560
+ /**
561
+ * Get wallet info
562
+ */
563
+ getWalletInfo() {
564
+ if (!this.wallet)
565
+ return null;
566
+ return {
567
+ address: this.wallet.address,
568
+ publicKey: this.wallet.publicKey,
569
+ addressType: this.wallet.addressType,
570
+ network: this.network.type
571
+ };
572
+ }
573
+ /**
574
+ * Refresh UTXO cache
575
+ */
576
+ async refreshUtxos() {
577
+ return this.getUtxos(true);
578
+ }
579
+ };
580
+
581
+ export {
582
+ BitcoinProviderError,
583
+ BITCOIN_NETWORKS,
584
+ AbcBitcoinProvider
585
+ };