@talken/talkenkit 2.4.23 → 2.4.24
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.
- package/dist/AbcCredentialManager-E723A55X.js +7 -0
- package/dist/AbcCredentialManager-GUV5JQ2V.js +7 -0
- package/dist/AbcCredentialManager-Z7GDJHYR.js +7 -0
- package/dist/abcWallet-3PWHJXWR.js +181 -0
- package/dist/abcWallet-3XPV7ATY.js +185 -0
- package/dist/abcWallet-3XSSUDLJ.js +155 -0
- package/dist/abcWallet-53HAU4MH.js +155 -0
- package/dist/abcWallet-5B2YHZGY.js +155 -0
- package/dist/abcWallet-664AHBNM.js +183 -0
- package/dist/abcWallet-BV7HK3OX.js +181 -0
- package/dist/abcWallet-CRKQ3O6J.js +155 -0
- package/dist/abcWallet-H4JOSC4N.js +155 -0
- package/dist/abcWallet-HM7KZIMP.js +155 -0
- package/dist/abcWallet-I5DVALAS.js +155 -0
- package/dist/abcWallet-IF3EOKHC.js +183 -0
- package/dist/abcWallet-IUG22ZE3.js +155 -0
- package/dist/abcWallet-IYC3CKEO.js +155 -0
- package/dist/abcWallet-JE6UR4QF.js +181 -0
- package/dist/abcWallet-KPKVEGNP.js +185 -0
- package/dist/abcWallet-MZAL5NXP.js +181 -0
- package/dist/abcWallet-N2UADRNR.js +155 -0
- package/dist/abcWallet-OGHORNUW.js +181 -0
- package/dist/abcWallet-QSK6VJFU.js +181 -0
- package/dist/abcWallet-RKT3W3FX.js +155 -0
- package/dist/abcWallet-VHXTAARP.js +155 -0
- package/dist/abcWallet-YFYTW2JH.js +155 -0
- package/dist/abcWallet-ZPVQY4XE.js +155 -0
- package/dist/chunk-3VPMUBCL.js +5196 -0
- package/dist/chunk-5SDWPKKX.js +5322 -0
- package/dist/chunk-6RBGFYAF.js +5076 -0
- package/dist/chunk-7L2ANWBB.js +5139 -0
- package/dist/chunk-7VIEAJAM.js +5172 -0
- package/dist/chunk-BY6GTSWI.js +5059 -0
- package/dist/chunk-DWE3CZEL.js +5171 -0
- package/dist/chunk-J6P2IT7Z.js +5465 -0
- package/dist/chunk-JIRBQUIB.js +5348 -0
- package/dist/chunk-K6CLOFGV.js +5129 -0
- package/dist/chunk-KYTIQ23P.js +5390 -0
- package/dist/chunk-MARFD3QV.js +5164 -0
- package/dist/chunk-MRRWKS2W.js +348 -0
- package/dist/chunk-PILL2YTG.js +5075 -0
- package/dist/chunk-QW7D53VM.js +5129 -0
- package/dist/chunk-RAWLCGOW.js +5058 -0
- package/dist/chunk-SHUPSYR2.js +5004 -0
- package/dist/chunk-UIGQOSRS.js +5174 -0
- package/dist/chunk-UINIIZCG.js +5098 -0
- package/dist/chunk-VOQSYTG3.js +5419 -0
- package/dist/chunk-VT5Q2XKZ.js +5193 -0
- package/dist/chunk-VXQYKPGQ.js +5476 -0
- package/dist/chunk-VYLJNEKY.js +5129 -0
- package/dist/chunk-X24B5DJR.js +323 -0
- package/dist/chunk-X3C73JWU.js +5370 -0
- package/dist/chunk-XIDK5P36.js +288 -0
- package/dist/chunk-ZHRI7SGC.js +5359 -0
- package/dist/components/ConnectOptions/AbcWaasAuth/AbcWaasAuthFlow.d.ts +1 -2
- package/dist/components/RainbowKitProvider/InternalPinProvider.d.ts +1 -1
- package/dist/contexts/MultiChainContext.d.ts +2 -2
- package/dist/hooks/internal/abcEmbeddedWallet.d.ts +26 -0
- package/dist/hooks/useSolanaWallet.d.ts +4 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +10379 -10417
- package/dist/providers/AbcAuthProvider.d.ts +3 -1
- package/dist/utils/encryption.d.ts +0 -4
- package/dist/wallets/walletConnectors/abcWallet/AbcCredentialManager.d.ts +49 -0
- package/dist/wallets/walletConnectors/abcWallet/AbcCredentialManager.js +8 -0
- package/dist/wallets/walletConnectors/abcWallet/AbcEvmAutoConnector.d.ts +4 -0
- package/dist/wallets/walletConnectors/abcWallet/AbcEvmAutoConnector.js +12 -15
- package/dist/wallets/walletConnectors/abcWallet/abcBitcoinConnector.js +3 -3
- package/dist/wallets/walletConnectors/abcWallet/abcBitcoinProvider.d.ts +2 -0
- package/dist/wallets/walletConnectors/abcWallet/abcBitcoinProvider.js +3 -1
- package/dist/wallets/walletConnectors/abcWallet/abcConnector.js +6 -5
- package/dist/wallets/walletConnectors/abcWallet/abcProvider.d.ts +25 -1
- package/dist/wallets/walletConnectors/abcWallet/abcProvider.js +4 -3
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaProvider.js +3 -1
- package/dist/wallets/walletConnectors/abcWallet/abcSolanaWalletAdapter.js +12 -7
- package/dist/wallets/walletConnectors/abcWallet/abcTronProvider.d.ts +3 -2
- package/dist/wallets/walletConnectors/abcWallet/abcTronProvider.js +3 -1
- package/dist/wallets/walletConnectors/abcWallet/abcWallet.js +7 -6
- package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.d.ts +1 -0
- package/dist/wallets/walletConnectors/abcWallet/api/TalkenApiClient.js +3 -2
- package/dist/wallets/walletConnectors/abcWallet/api/index.js +6 -5
- package/dist/wallets/walletConnectors/abcWallet/backfillMissingWallets.d.ts +3 -0
- package/dist/wallets/walletConnectors/abcWallet/backfillMissingWallets.js +16 -0
- package/dist/wallets/walletConnectors/abcWallet/index.d.ts +2 -1
- package/dist/wallets/walletConnectors/abcWallet/index.js +22 -48
- package/dist/wallets/walletConnectors/abcWallet/sessionUtils.js +2 -1
- package/dist/wallets/walletConnectors/abcWallet/types.d.ts +6 -9
- package/dist/wallets/walletConnectors/abcWallet/types.js +1 -1
- package/dist/wallets/walletConnectors/abcWallet/utils.d.ts +0 -83
- package/dist/wallets/walletConnectors/abcWallet/utils.js +2 -40
- package/dist/wallets/walletConnectors/abcWallet/walletGeneration.d.ts +9 -3
- package/dist/wallets/walletConnectors/abcWallet/walletGeneration.js +5 -2
- package/dist/wallets/walletConnectors/berasigWallet/berasigWallet.js +2 -2
- package/dist/wallets/walletConnectors/bifrostWallet/bifrostWallet.js +2 -2
- package/dist/wallets/walletConnectors/binanceWallet/binanceWallet.js +2 -2
- package/dist/wallets/walletConnectors/bitgetWallet/bitgetWallet.js +2 -2
- package/dist/wallets/walletConnectors/bybitWallet/bybitWallet.js +2 -2
- package/dist/wallets/walletConnectors/chunk-2XX4LJSQ.js +1387 -0
- package/dist/wallets/walletConnectors/chunk-3BUGPUMD.js +151 -0
- package/dist/wallets/walletConnectors/chunk-3H7YKUJZ.js +1407 -0
- package/dist/wallets/walletConnectors/chunk-3OWQ6MEU.js +54 -0
- package/dist/wallets/walletConnectors/chunk-3VDYWOS4.js +300 -0
- package/dist/wallets/walletConnectors/chunk-3XOXT4AM.js +314 -0
- package/dist/wallets/walletConnectors/chunk-42D2UPKR.js +439 -0
- package/dist/wallets/walletConnectors/chunk-42MF6LUP.js +563 -0
- package/dist/wallets/walletConnectors/chunk-4LIJB776.js +273 -0
- package/dist/wallets/walletConnectors/chunk-4P3SPC44.js +51 -0
- package/dist/wallets/walletConnectors/chunk-4RZVAQQ4.js +574 -0
- package/dist/wallets/walletConnectors/chunk-53UTBIKF.js +209 -0
- package/dist/wallets/walletConnectors/chunk-54KVT46V.js +1477 -0
- package/dist/wallets/walletConnectors/chunk-5UBUX5BT.js +440 -0
- package/dist/wallets/walletConnectors/chunk-5ZBV5WE2.js +94 -0
- package/dist/wallets/walletConnectors/chunk-6EUOVOQK.js +151 -0
- package/dist/wallets/walletConnectors/chunk-6YUJPIJ5.js +351 -0
- package/dist/wallets/walletConnectors/chunk-77YYMCMD.js +273 -0
- package/dist/wallets/walletConnectors/chunk-7EQNUYV2.js +482 -0
- package/dist/wallets/walletConnectors/chunk-7K77YGQN.js +54 -0
- package/dist/wallets/walletConnectors/chunk-7MMVOEZF.js +393 -0
- package/dist/wallets/walletConnectors/chunk-7RDMH4SD.js +54 -0
- package/dist/wallets/walletConnectors/chunk-7S4N4DRT.js +306 -0
- package/dist/wallets/walletConnectors/chunk-7SWRH3EI.js +96 -0
- package/dist/wallets/walletConnectors/chunk-A3OJZTDV.js +54 -0
- package/dist/wallets/walletConnectors/chunk-AJBRO3VA.js +300 -0
- package/dist/wallets/walletConnectors/chunk-BKVGLYLI.js +194 -0
- package/dist/wallets/walletConnectors/chunk-C3FPON5L.js +213 -0
- package/dist/wallets/walletConnectors/chunk-CBIDNYV4.js +1407 -0
- package/dist/wallets/walletConnectors/chunk-DD6KK4BR.js +54 -0
- package/dist/wallets/walletConnectors/chunk-DSNVWCPD.js +131 -0
- package/dist/wallets/walletConnectors/chunk-DULGAYBU.js +785 -0
- package/dist/wallets/walletConnectors/chunk-DZUXOGSA.js +54 -0
- package/dist/wallets/walletConnectors/chunk-EVJIFLSY.js +93 -0
- package/dist/wallets/walletConnectors/chunk-EVW3ZB3Q.js +386 -0
- package/dist/wallets/walletConnectors/chunk-F2UWSAMX.js +54 -0
- package/dist/wallets/walletConnectors/chunk-FBVPR472.js +314 -0
- package/dist/wallets/walletConnectors/chunk-FKS2YLVW.js +273 -0
- package/dist/wallets/walletConnectors/chunk-FOGNJZPY.js +54 -0
- package/dist/wallets/walletConnectors/chunk-FSSV6JY3.js +54 -0
- package/dist/wallets/walletConnectors/chunk-GFLJ2MAG.js +54 -0
- package/dist/wallets/walletConnectors/chunk-GGPJJ6KS.js +1407 -0
- package/dist/wallets/walletConnectors/chunk-GMAYKJEI.js +508 -0
- package/dist/wallets/walletConnectors/chunk-H3OWNM73.js +300 -0
- package/dist/wallets/walletConnectors/chunk-INT6LGH7.js +180 -0
- package/dist/wallets/walletConnectors/chunk-ITZ42A33.js +273 -0
- package/dist/wallets/walletConnectors/chunk-J4IF6BFF.js +300 -0
- package/dist/wallets/walletConnectors/chunk-JAMJLNYQ.js +54 -0
- package/dist/wallets/walletConnectors/chunk-JDJUIRGF.js +439 -0
- package/dist/wallets/walletConnectors/chunk-JEWCPQJZ.js +300 -0
- package/dist/wallets/walletConnectors/chunk-JK7LJ4B6.js +1407 -0
- package/dist/wallets/walletConnectors/chunk-JPOSJU2D.js +594 -0
- package/dist/wallets/walletConnectors/chunk-JUFEPIO4.js +1479 -0
- package/dist/wallets/walletConnectors/chunk-JV4IC5Z7.js +54 -0
- package/dist/wallets/walletConnectors/chunk-MP3WVXPS.js +273 -0
- package/dist/wallets/walletConnectors/chunk-MTC2HJPF.js +96 -0
- package/dist/wallets/walletConnectors/chunk-MTJF3SVB.js +1487 -0
- package/dist/wallets/walletConnectors/chunk-NBVPVTJZ.js +192 -0
- package/dist/wallets/walletConnectors/chunk-NISMGNEE.js +223 -0
- package/dist/wallets/walletConnectors/chunk-NY5O2OBG.js +1477 -0
- package/dist/wallets/walletConnectors/chunk-OYF6AQOW.js +194 -0
- package/dist/wallets/walletConnectors/chunk-PBOCVGUC.js +782 -0
- package/dist/wallets/walletConnectors/chunk-PJSN4YRI.js +1387 -0
- package/dist/wallets/walletConnectors/chunk-PVIO7FM7.js +314 -0
- package/dist/wallets/walletConnectors/chunk-PWJOXYDF.js +54 -0
- package/dist/wallets/walletConnectors/chunk-PYBSONED.js +771 -0
- package/dist/wallets/walletConnectors/chunk-PYKECUZ3.js +54 -0
- package/dist/wallets/walletConnectors/chunk-Q42NO7WB.js +46 -0
- package/dist/wallets/walletConnectors/chunk-Q7XBI5F6.js +300 -0
- package/dist/wallets/walletConnectors/chunk-QHUBLT7N.js +156 -0
- package/dist/wallets/walletConnectors/chunk-RMV23JXO.js +300 -0
- package/dist/wallets/walletConnectors/chunk-S3L2SA4J.js +300 -0
- package/dist/wallets/walletConnectors/chunk-S466OQOC.js +393 -0
- package/dist/wallets/walletConnectors/chunk-SA7IXAFG.js +54 -0
- package/dist/wallets/walletConnectors/chunk-SDB6BBHX.js +585 -0
- package/dist/wallets/walletConnectors/chunk-SFGVPX2G.js +351 -0
- package/dist/wallets/walletConnectors/chunk-SFQKJ6X6.js +314 -0
- package/dist/wallets/walletConnectors/chunk-SKLRJRER.js +1464 -0
- package/dist/wallets/walletConnectors/chunk-SQVWIBWR.js +351 -0
- package/dist/wallets/walletConnectors/chunk-SSLHXCOX.js +439 -0
- package/dist/wallets/walletConnectors/chunk-SU6LV3EO.js +314 -0
- package/dist/wallets/walletConnectors/chunk-SU7IEZE2.js +300 -0
- package/dist/wallets/walletConnectors/chunk-TMRB5SCL.js +167 -0
- package/dist/wallets/walletConnectors/chunk-TMUPUOQR.js +54 -0
- package/dist/wallets/walletConnectors/chunk-TNZ7QKXH.js +771 -0
- package/dist/wallets/walletConnectors/chunk-TT2NLKIU.js +1465 -0
- package/dist/wallets/walletConnectors/chunk-U3WGMWTH.js +585 -0
- package/dist/wallets/walletConnectors/chunk-UAV4SI4Y.js +408 -0
- package/dist/wallets/walletConnectors/chunk-UAWWPNS7.js +54 -0
- package/dist/wallets/walletConnectors/chunk-UXRJASPW.js +785 -0
- package/dist/wallets/walletConnectors/chunk-UY5TAYLM.js +54 -0
- package/dist/wallets/walletConnectors/chunk-VB5IZDY7.js +300 -0
- package/dist/wallets/walletConnectors/chunk-VIKJNKJZ.js +219 -0
- package/dist/wallets/walletConnectors/chunk-VVEXF6KG.js +273 -0
- package/dist/wallets/walletConnectors/chunk-W2YIRNMB.js +300 -0
- package/dist/wallets/walletConnectors/chunk-W7L2SBIG.js +138 -0
- package/dist/wallets/walletConnectors/chunk-WS5FG53X.js +54 -0
- package/dist/wallets/walletConnectors/chunk-WVRGC2YL.js +300 -0
- package/dist/wallets/walletConnectors/chunk-X33WL7R7.js +300 -0
- package/dist/wallets/walletConnectors/chunk-XG2R64B7.js +785 -0
- package/dist/wallets/walletConnectors/chunk-Y2BWF42Z.js +54 -0
- package/dist/wallets/walletConnectors/chunk-Y446VZWI.js +585 -0
- package/dist/wallets/walletConnectors/chunk-YROAFC7Z.js +54 -0
- package/dist/wallets/walletConnectors/chunk-Z4WVT3G2.js +1416 -0
- package/dist/wallets/walletConnectors/chunk-ZK3PZIAH.js +300 -0
- package/dist/wallets/walletConnectors/chunk-ZPJLV3E7.js +151 -0
- package/dist/wallets/walletConnectors/chunk-ZQ3LCYGH.js +408 -0
- package/dist/wallets/walletConnectors/chunk-ZX6HMX7N.js +1468 -0
- package/dist/wallets/walletConnectors/chunk-ZXN465CA.js +209 -0
- package/dist/wallets/walletConnectors/clvWallet/clvWallet.js +2 -2
- package/dist/wallets/walletConnectors/coin98Wallet/coin98Wallet.js +2 -2
- package/dist/wallets/walletConnectors/coreWallet/coreWallet.js +2 -2
- package/dist/wallets/walletConnectors/foxWallet/foxWallet.js +2 -2
- package/dist/wallets/walletConnectors/frontierWallet/frontierWallet.js +2 -2
- package/dist/wallets/walletConnectors/gateWallet/gateWallet.js +2 -2
- package/dist/wallets/walletConnectors/index.js +89 -88
- package/dist/wallets/walletConnectors/iopayWallet/iopayWallet.js +2 -2
- package/dist/wallets/walletConnectors/kaiaWallet/kaiaWallet.js +2 -2
- package/dist/wallets/walletConnectors/kaikasWallet/kaikasWallet.js +2 -2
- package/dist/wallets/walletConnectors/metaMaskWallet/metaMaskWallet.js +2 -2
- package/dist/wallets/walletConnectors/okxWallet/okxWallet.js +2 -2
- package/dist/wallets/walletConnectors/rainbowWallet/rainbowWallet.js +2 -2
- package/dist/wallets/walletConnectors/roninWallet/roninWallet.js +2 -2
- package/dist/wallets/walletConnectors/safepalWallet/safepalWallet.js +2 -2
- package/dist/wallets/walletConnectors/subWallet/subWallet.js +2 -2
- package/dist/wallets/walletConnectors/tokenPocketWallet/tokenPocketWallet.js +2 -2
- package/dist/wallets/walletConnectors/trustWallet/trustWallet.js +2 -2
- package/dist/wallets/walletConnectors/zealWallet/zealWallet.js +2 -2
- package/dist/wallets/walletConnectors/zerionWallet/zerionWallet.js +2 -2
- package/package.json +12 -11
- package/LICENSE +0 -9
|
@@ -0,0 +1,574 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
|
|
3
|
+
// src/wallets/walletConnectors/abcWallet/abcBitcoinProvider.ts
|
|
4
|
+
import { getTalkenApiClient } from "@talken/talkenkit";
|
|
5
|
+
function isTalkenApiClient(client) {
|
|
6
|
+
return typeof client?.bitcoin?.getUtxos === "function";
|
|
7
|
+
}
|
|
8
|
+
var EventEmitter = class {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.events = /* @__PURE__ */ new Map();
|
|
11
|
+
}
|
|
12
|
+
on(event, listener) {
|
|
13
|
+
if (!this.events.has(event)) {
|
|
14
|
+
this.events.set(event, []);
|
|
15
|
+
}
|
|
16
|
+
this.events.get(event).push(listener);
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
off(event, listener) {
|
|
20
|
+
const listeners = this.events.get(event);
|
|
21
|
+
if (listeners) {
|
|
22
|
+
const index = listeners.indexOf(listener);
|
|
23
|
+
if (index !== -1) {
|
|
24
|
+
listeners.splice(index, 1);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return this;
|
|
28
|
+
}
|
|
29
|
+
removeListener(event, listener) {
|
|
30
|
+
return this.off(event, listener);
|
|
31
|
+
}
|
|
32
|
+
emit(event, ...args) {
|
|
33
|
+
const listeners = this.events.get(event);
|
|
34
|
+
if (listeners) {
|
|
35
|
+
for (const listener of listeners) {
|
|
36
|
+
listener(...args);
|
|
37
|
+
}
|
|
38
|
+
return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
removeAllListeners(event) {
|
|
43
|
+
if (event) {
|
|
44
|
+
this.events.delete(event);
|
|
45
|
+
} else {
|
|
46
|
+
this.events.clear();
|
|
47
|
+
}
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
var BitcoinErrorCode = {
|
|
52
|
+
USER_REJECTED: 4001,
|
|
53
|
+
UNAUTHORIZED: 4100,
|
|
54
|
+
UNSUPPORTED_METHOD: 4200,
|
|
55
|
+
DISCONNECTED: 4900,
|
|
56
|
+
INVALID_PARAMS: -32602,
|
|
57
|
+
INTERNAL_ERROR: -32603,
|
|
58
|
+
INSUFFICIENT_FUNDS: 5001,
|
|
59
|
+
UTXO_NOT_FOUND: 5002
|
|
60
|
+
};
|
|
61
|
+
var BitcoinProviderError = class extends Error {
|
|
62
|
+
constructor(code, message, data) {
|
|
63
|
+
super(message);
|
|
64
|
+
this.code = code;
|
|
65
|
+
this.data = data;
|
|
66
|
+
this.name = "BitcoinProviderError";
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var BITCOIN_NETWORKS = {
|
|
70
|
+
mainnet: {
|
|
71
|
+
name: "Bitcoin Mainnet",
|
|
72
|
+
type: "bitcoin",
|
|
73
|
+
explorer: "https://blockstream.info"
|
|
74
|
+
},
|
|
75
|
+
testnet: {
|
|
76
|
+
name: "Bitcoin Testnet",
|
|
77
|
+
type: "bitcoin_testnet",
|
|
78
|
+
explorer: "https://blockstream.info/testnet"
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
var AbcBitcoinProvider = class extends EventEmitter {
|
|
82
|
+
constructor(client) {
|
|
83
|
+
super();
|
|
84
|
+
this.wallet = null;
|
|
85
|
+
this.network = BITCOIN_NETWORKS.testnet;
|
|
86
|
+
this.connected = false;
|
|
87
|
+
this.utxoCache = /* @__PURE__ */ new Map();
|
|
88
|
+
this.cacheExpiry = /* @__PURE__ */ new Map();
|
|
89
|
+
this.CACHE_TTL = 6e4;
|
|
90
|
+
if (isTalkenApiClient(client)) {
|
|
91
|
+
this.talkenApi = client;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
extractHashSignature(result) {
|
|
95
|
+
const data = result;
|
|
96
|
+
return data?.signatureHex || data?.signstr || data?.result?.signstr || data?.data?.signatureHex || data?.data?.signstr || data?.data?.result?.signstr || "";
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Set request interceptor for sign/transfer confirmation modals
|
|
100
|
+
*/
|
|
101
|
+
setRequestInterceptor(interceptor) {
|
|
102
|
+
this.requestInterceptor = interceptor;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Call request interceptor if set (throws on user cancel)
|
|
106
|
+
*/
|
|
107
|
+
async callInterceptor(request) {
|
|
108
|
+
if (this.requestInterceptor) {
|
|
109
|
+
await this.requestInterceptor(request);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Set wallet information
|
|
114
|
+
*/
|
|
115
|
+
setWallet(wallet) {
|
|
116
|
+
const previousAddress = this.wallet?.address;
|
|
117
|
+
this.wallet = wallet;
|
|
118
|
+
this.connected = true;
|
|
119
|
+
if (wallet.network === "bitcoin") {
|
|
120
|
+
this.network = BITCOIN_NETWORKS.mainnet;
|
|
121
|
+
} else {
|
|
122
|
+
this.network = BITCOIN_NETWORKS.testnet;
|
|
123
|
+
}
|
|
124
|
+
if (previousAddress !== wallet.address) {
|
|
125
|
+
this.emit("accountsChanged", [wallet.address]);
|
|
126
|
+
this.clearUtxoCache();
|
|
127
|
+
}
|
|
128
|
+
this.emit("connect", {
|
|
129
|
+
address: wallet.address,
|
|
130
|
+
network: this.network.type
|
|
131
|
+
});
|
|
132
|
+
console.log(
|
|
133
|
+
"[BitcoinProvider] \u2705 Wallet connected:",
|
|
134
|
+
`${wallet.address.substring(0, 6)}...${wallet.address.substring(wallet.address.length - 6)}`
|
|
135
|
+
);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Clear wallet (disconnect)
|
|
139
|
+
*/
|
|
140
|
+
clearWallet() {
|
|
141
|
+
this.wallet = null;
|
|
142
|
+
this.connected = false;
|
|
143
|
+
this.clearUtxoCache();
|
|
144
|
+
this.emit("disconnect");
|
|
145
|
+
this.emit("accountsChanged", []);
|
|
146
|
+
console.log("[BitcoinProvider] \u{1F50C} Wallet disconnected");
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Set TalkenApiClient for backend-proxied transaction flow
|
|
150
|
+
* When set, sendTransaction will use a single API call instead of multi-step WaaS
|
|
151
|
+
*/
|
|
152
|
+
setTalkenApi(talkenApi) {
|
|
153
|
+
this.talkenApi = talkenApi;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Set network
|
|
157
|
+
*/
|
|
158
|
+
setNetwork(networkKey) {
|
|
159
|
+
const newNetwork = BITCOIN_NETWORKS[networkKey];
|
|
160
|
+
if (!newNetwork) {
|
|
161
|
+
throw new BitcoinProviderError(
|
|
162
|
+
BitcoinErrorCode.INVALID_PARAMS,
|
|
163
|
+
`Unknown network: ${networkKey}`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
const previousType = this.network.type;
|
|
167
|
+
this.network = newNetwork;
|
|
168
|
+
if (previousType !== newNetwork.type) {
|
|
169
|
+
this.emit("networkChanged", newNetwork.type);
|
|
170
|
+
this.clearUtxoCache();
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Get current network
|
|
175
|
+
*/
|
|
176
|
+
getNetwork() {
|
|
177
|
+
return this.network;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Check if connected
|
|
181
|
+
*/
|
|
182
|
+
isConnected() {
|
|
183
|
+
return this.connected && this.wallet !== null;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Get Bitcoin address
|
|
187
|
+
*/
|
|
188
|
+
async getAddress() {
|
|
189
|
+
if (!this.wallet) {
|
|
190
|
+
throw new BitcoinProviderError(
|
|
191
|
+
BitcoinErrorCode.DISCONNECTED,
|
|
192
|
+
"Wallet not connected"
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
return this.wallet.address;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Get compressed public key (33 bytes)
|
|
199
|
+
*/
|
|
200
|
+
async getPublicKey() {
|
|
201
|
+
if (!this.wallet) {
|
|
202
|
+
throw new BitcoinProviderError(
|
|
203
|
+
BitcoinErrorCode.DISCONNECTED,
|
|
204
|
+
"Wallet not connected"
|
|
205
|
+
);
|
|
206
|
+
}
|
|
207
|
+
return this.wallet.publicKey;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Get address type (bech32, p2pkh, etc.)
|
|
211
|
+
*/
|
|
212
|
+
getAddressType() {
|
|
213
|
+
if (!this.wallet) {
|
|
214
|
+
throw new BitcoinProviderError(
|
|
215
|
+
BitcoinErrorCode.DISCONNECTED,
|
|
216
|
+
"Wallet not connected"
|
|
217
|
+
);
|
|
218
|
+
}
|
|
219
|
+
return this.wallet.addressType;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Clear UTXO cache
|
|
223
|
+
*/
|
|
224
|
+
clearUtxoCache() {
|
|
225
|
+
this.utxoCache.clear();
|
|
226
|
+
this.cacheExpiry.clear();
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Check if cache is valid
|
|
230
|
+
*/
|
|
231
|
+
isCacheValid(address) {
|
|
232
|
+
const expiry = this.cacheExpiry.get(address);
|
|
233
|
+
if (!expiry)
|
|
234
|
+
return false;
|
|
235
|
+
return Date.now() < expiry;
|
|
236
|
+
}
|
|
237
|
+
normalizeUtxos(rawUtxos) {
|
|
238
|
+
return rawUtxos.map((u) => ({
|
|
239
|
+
txid: String(u?.txid ?? u?.tx_hash ?? ""),
|
|
240
|
+
vout: Number(u?.vout ?? u?.output_index ?? 0),
|
|
241
|
+
value: Number(u?.value ?? u?.satoshis ?? 0),
|
|
242
|
+
scriptPubKey: String(
|
|
243
|
+
u?.scriptPubKey ?? u?.script_pub_key ?? u?.script ?? ""
|
|
244
|
+
),
|
|
245
|
+
confirmations: Number(u?.confirmations ?? 0)
|
|
246
|
+
})).filter(
|
|
247
|
+
(u) => Boolean(u.txid) && Number.isFinite(u.vout) && Number.isFinite(u.value) && Number.isFinite(u.confirmations)
|
|
248
|
+
);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Get UTXOs for address (with caching)
|
|
252
|
+
*/
|
|
253
|
+
async getUtxos(forceRefresh = false) {
|
|
254
|
+
if (!this.wallet) {
|
|
255
|
+
throw new BitcoinProviderError(
|
|
256
|
+
BitcoinErrorCode.DISCONNECTED,
|
|
257
|
+
"Wallet not connected"
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
const address = this.wallet.address;
|
|
261
|
+
if (!forceRefresh && this.isCacheValid(address)) {
|
|
262
|
+
const cached = this.utxoCache.get(address);
|
|
263
|
+
if (cached) {
|
|
264
|
+
console.log(
|
|
265
|
+
`[BitcoinProvider] \u{1F4E6} Using cached UTXOs (${cached.length} items)`
|
|
266
|
+
);
|
|
267
|
+
return cached;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
try {
|
|
271
|
+
console.log("[BitcoinProvider] \u{1F50D} Fetching UTXOs from network...");
|
|
272
|
+
const api = this.talkenApi || getTalkenApiClient();
|
|
273
|
+
const result = await api.bitcoin.getUtxos(this.network.type, address);
|
|
274
|
+
const utxos = this.normalizeUtxos(result.utxos || []);
|
|
275
|
+
this.utxoCache.set(address, utxos);
|
|
276
|
+
this.cacheExpiry.set(address, Date.now() + this.CACHE_TTL);
|
|
277
|
+
console.log(`[BitcoinProvider] \u2705 Fetched ${utxos.length} UTXOs`);
|
|
278
|
+
return utxos;
|
|
279
|
+
} catch (error) {
|
|
280
|
+
console.error(
|
|
281
|
+
"[BitcoinProvider] \u274C Failed to fetch UTXOs:",
|
|
282
|
+
error.message
|
|
283
|
+
);
|
|
284
|
+
throw new BitcoinProviderError(
|
|
285
|
+
BitcoinErrorCode.INTERNAL_ERROR,
|
|
286
|
+
"Failed to fetch UTXOs",
|
|
287
|
+
error
|
|
288
|
+
);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Get total balance (sum of all UTXOs)
|
|
293
|
+
* Returns balance in satoshis
|
|
294
|
+
*/
|
|
295
|
+
async getBalance(forceRefresh = false) {
|
|
296
|
+
const utxos = await this.getUtxos(forceRefresh);
|
|
297
|
+
const balance = utxos.reduce((sum, utxo) => sum + utxo.value, 0);
|
|
298
|
+
console.log(
|
|
299
|
+
`[BitcoinProvider] \u{1F4B0} Balance: ${balance} satoshis (${balance / 1e8} BTC)`
|
|
300
|
+
);
|
|
301
|
+
return balance;
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Estimate transaction fee
|
|
305
|
+
* Returns fee rate in satoshis per byte
|
|
306
|
+
*/
|
|
307
|
+
async estimateFee(targetBlocks = 6) {
|
|
308
|
+
try {
|
|
309
|
+
const api = this.talkenApi || getTalkenApiClient();
|
|
310
|
+
const result = await api.bitcoin.getFeeRate(
|
|
311
|
+
this.network.type,
|
|
312
|
+
targetBlocks
|
|
313
|
+
);
|
|
314
|
+
const feeRate = Number(result.feeRate);
|
|
315
|
+
if (!Number.isFinite(feeRate) || feeRate <= 0) {
|
|
316
|
+
throw new Error("Invalid fee rate");
|
|
317
|
+
}
|
|
318
|
+
console.log(`[BitcoinProvider] \u26FD Fee rate: ${feeRate} sat/byte`);
|
|
319
|
+
return feeRate;
|
|
320
|
+
} catch (_error) {
|
|
321
|
+
console.error("[BitcoinProvider] \u26A0\uFE0F Fee estimation failed, using default");
|
|
322
|
+
return 1;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Sign Bitcoin message (Bitcoin Signed Message format)
|
|
327
|
+
* Uses secp256k1 sign/hash endpoint with double-SHA256 of prefixed message.
|
|
328
|
+
*
|
|
329
|
+
* Format: SHA256(SHA256("\x18Bitcoin Signed Message:\n" + varint(len) + message))
|
|
330
|
+
*
|
|
331
|
+
* @param message - Message to sign (string)
|
|
332
|
+
* @returns Signature in hex format (compact: r + s + v)
|
|
333
|
+
*/
|
|
334
|
+
async signMessage(message) {
|
|
335
|
+
if (!this.wallet) {
|
|
336
|
+
throw new BitcoinProviderError(
|
|
337
|
+
BitcoinErrorCode.DISCONNECTED,
|
|
338
|
+
"Wallet not connected"
|
|
339
|
+
);
|
|
340
|
+
}
|
|
341
|
+
await this.callInterceptor({
|
|
342
|
+
chain: "bitcoin",
|
|
343
|
+
method: "signMessage",
|
|
344
|
+
address: this.wallet.address,
|
|
345
|
+
network: this.network.type,
|
|
346
|
+
message
|
|
347
|
+
});
|
|
348
|
+
console.log("[BitcoinProvider] \u{1F4DD} Signing Bitcoin message...");
|
|
349
|
+
const prefix = "Bitcoin Signed Message:\n";
|
|
350
|
+
const msgBytes = new TextEncoder().encode(message);
|
|
351
|
+
const varint = this.encodeVarint(msgBytes.length);
|
|
352
|
+
const prefixBytes = new TextEncoder().encode(prefix);
|
|
353
|
+
const preimage = new Uint8Array(
|
|
354
|
+
prefixBytes.length + varint.length + msgBytes.length
|
|
355
|
+
);
|
|
356
|
+
preimage.set(prefixBytes, 0);
|
|
357
|
+
preimage.set(varint, prefixBytes.length);
|
|
358
|
+
preimage.set(msgBytes, prefixBytes.length + varint.length);
|
|
359
|
+
const hash1 = await crypto.subtle.digest("SHA-256", preimage);
|
|
360
|
+
const hash2 = await crypto.subtle.digest("SHA-256", hash1);
|
|
361
|
+
const hashHex = Array.from(new Uint8Array(hash2)).map((b) => b.toString(16).padStart(2, "0")).join("");
|
|
362
|
+
const api = getTalkenApiClient();
|
|
363
|
+
if (!api) {
|
|
364
|
+
throw new BitcoinProviderError(
|
|
365
|
+
BitcoinErrorCode.INTERNAL_ERROR,
|
|
366
|
+
"TalkenApiClient not initialized"
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
const pinHash = localStorage.getItem("talkenkit_abc_pin_hash") || "";
|
|
370
|
+
let signstr = "";
|
|
371
|
+
try {
|
|
372
|
+
const result = await api.bitcoin.execute({
|
|
373
|
+
action: "signHash",
|
|
374
|
+
hash: hashHex,
|
|
375
|
+
pin: pinHash,
|
|
376
|
+
network: this.network.type
|
|
377
|
+
});
|
|
378
|
+
signstr = this.extractHashSignature(result);
|
|
379
|
+
} catch (error) {
|
|
380
|
+
console.warn(
|
|
381
|
+
"[BitcoinProvider] BTC signHash endpoint failed, falling back to generic sign/hash:",
|
|
382
|
+
error
|
|
383
|
+
);
|
|
384
|
+
}
|
|
385
|
+
if (!signstr) {
|
|
386
|
+
signstr = this.extractHashSignature(
|
|
387
|
+
await api.bitcoin.signHash({
|
|
388
|
+
hash: hashHex,
|
|
389
|
+
pin: pinHash,
|
|
390
|
+
network: this.network.type
|
|
391
|
+
})
|
|
392
|
+
);
|
|
393
|
+
}
|
|
394
|
+
if (!signstr) {
|
|
395
|
+
throw new BitcoinProviderError(
|
|
396
|
+
BitcoinErrorCode.INTERNAL_ERROR,
|
|
397
|
+
"Empty signature from sign/hash"
|
|
398
|
+
);
|
|
399
|
+
}
|
|
400
|
+
console.log("[BitcoinProvider] \u2705 Message signed successfully");
|
|
401
|
+
return signstr;
|
|
402
|
+
}
|
|
403
|
+
/** Encode integer as Bitcoin varint */
|
|
404
|
+
encodeVarint(n) {
|
|
405
|
+
if (n < 253)
|
|
406
|
+
return new Uint8Array([n]);
|
|
407
|
+
if (n <= 65535) {
|
|
408
|
+
const buf2 = new Uint8Array(3);
|
|
409
|
+
buf2[0] = 253;
|
|
410
|
+
buf2[1] = n & 255;
|
|
411
|
+
buf2[2] = n >> 8 & 255;
|
|
412
|
+
return buf2;
|
|
413
|
+
}
|
|
414
|
+
const buf = new Uint8Array(5);
|
|
415
|
+
buf[0] = 254;
|
|
416
|
+
buf[1] = n & 255;
|
|
417
|
+
buf[2] = n >> 8 & 255;
|
|
418
|
+
buf[3] = n >> 16 & 255;
|
|
419
|
+
buf[4] = n >> 24 & 255;
|
|
420
|
+
return buf;
|
|
421
|
+
}
|
|
422
|
+
/**
|
|
423
|
+
* High-level transaction sending (like Solana pattern)
|
|
424
|
+
* Creates, signs, and broadcasts transaction
|
|
425
|
+
*
|
|
426
|
+
* @param params - Transaction parameters
|
|
427
|
+
* @param params.toAddress - Recipient Bitcoin address
|
|
428
|
+
* @param params.amount - Amount in BTC (will be converted to satoshis)
|
|
429
|
+
* @returns Transaction hash
|
|
430
|
+
*/
|
|
431
|
+
async sendTransaction(params) {
|
|
432
|
+
if (!this.wallet) {
|
|
433
|
+
throw new BitcoinProviderError(
|
|
434
|
+
BitcoinErrorCode.DISCONNECTED,
|
|
435
|
+
"Wallet not connected"
|
|
436
|
+
);
|
|
437
|
+
}
|
|
438
|
+
try {
|
|
439
|
+
await this.callInterceptor({
|
|
440
|
+
chain: "bitcoin",
|
|
441
|
+
method: "sendTransaction",
|
|
442
|
+
fromAddress: this.wallet.address,
|
|
443
|
+
toAddress: params.toAddress,
|
|
444
|
+
amount: String(params.amount),
|
|
445
|
+
symbol: "BTC",
|
|
446
|
+
network: this.network.type,
|
|
447
|
+
isNativeToken: true,
|
|
448
|
+
feeSymbol: "BTC"
|
|
449
|
+
});
|
|
450
|
+
console.log("[BitcoinProvider] \u{1F4B8} Starting high-level transaction...");
|
|
451
|
+
const pinHash = localStorage.getItem("talkenkit_abc_pin_hash");
|
|
452
|
+
if (!pinHash) {
|
|
453
|
+
throw new BitcoinProviderError(
|
|
454
|
+
BitcoinErrorCode.INTERNAL_ERROR,
|
|
455
|
+
"PIN hash not found. Please login again."
|
|
456
|
+
);
|
|
457
|
+
}
|
|
458
|
+
const satoshis = Math.floor(params.amount * 1e8);
|
|
459
|
+
const api = this.talkenApi || getTalkenApiClient();
|
|
460
|
+
const result = await api.bitcoin.sendTransaction({
|
|
461
|
+
toAddress: params.toAddress,
|
|
462
|
+
amountSats: satoshis.toString(),
|
|
463
|
+
pin: pinHash
|
|
464
|
+
});
|
|
465
|
+
console.log(
|
|
466
|
+
"[BitcoinProvider] \u2705 BTC transaction complete via TalkenApiClient:",
|
|
467
|
+
result.txHash
|
|
468
|
+
);
|
|
469
|
+
this.emit("transactionBroadcasted", {
|
|
470
|
+
txHash: result.txHash,
|
|
471
|
+
explorerUrl: `${this.network.explorer}/tx/${result.txHash}`
|
|
472
|
+
});
|
|
473
|
+
this.clearUtxoCache();
|
|
474
|
+
return result.txHash;
|
|
475
|
+
} catch (error) {
|
|
476
|
+
if (error.message?.includes("cancelled") || error.message?.includes("rejected")) {
|
|
477
|
+
console.log("[BitcoinProvider] \u2139\uFE0F User cancelled transaction");
|
|
478
|
+
throw new BitcoinProviderError(
|
|
479
|
+
BitcoinErrorCode.USER_REJECTED,
|
|
480
|
+
"User rejected transaction",
|
|
481
|
+
error
|
|
482
|
+
);
|
|
483
|
+
}
|
|
484
|
+
console.error("[BitcoinProvider] \u274C Transaction failed:", error.message);
|
|
485
|
+
if (error.message?.includes("insufficient")) {
|
|
486
|
+
throw new BitcoinProviderError(
|
|
487
|
+
BitcoinErrorCode.INSUFFICIENT_FUNDS,
|
|
488
|
+
"Insufficient BTC balance",
|
|
489
|
+
error
|
|
490
|
+
);
|
|
491
|
+
}
|
|
492
|
+
this.emit("error", error);
|
|
493
|
+
throw new BitcoinProviderError(
|
|
494
|
+
BitcoinErrorCode.INTERNAL_ERROR,
|
|
495
|
+
"Failed to send transaction",
|
|
496
|
+
error
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
/**
|
|
501
|
+
* Broadcast signed transaction to network
|
|
502
|
+
*
|
|
503
|
+
* @param rawTransaction - Raw transaction in hex format
|
|
504
|
+
* @param psbt - Optional finalized PSBT
|
|
505
|
+
* @returns Transaction hash
|
|
506
|
+
*/
|
|
507
|
+
async broadcastTransaction(rawTransaction, psbt) {
|
|
508
|
+
if (!this.wallet) {
|
|
509
|
+
throw new BitcoinProviderError(
|
|
510
|
+
BitcoinErrorCode.DISCONNECTED,
|
|
511
|
+
"Wallet not connected"
|
|
512
|
+
);
|
|
513
|
+
}
|
|
514
|
+
try {
|
|
515
|
+
console.log("[BitcoinProvider] \u{1F4E1} Broadcasting transaction...");
|
|
516
|
+
if (psbt) {
|
|
517
|
+
console.log(
|
|
518
|
+
"[BitcoinProvider] \u2139\uFE0F PSBT argument provided; raw tx broadcast uses rawTransaction only via talken-api"
|
|
519
|
+
);
|
|
520
|
+
}
|
|
521
|
+
const api = this.talkenApi || getTalkenApiClient();
|
|
522
|
+
const result = await api.bitcoin.broadcastRawTransaction({
|
|
523
|
+
network: this.network.type,
|
|
524
|
+
rawTransaction
|
|
525
|
+
});
|
|
526
|
+
console.log(
|
|
527
|
+
"[BitcoinProvider] \u2705 Transaction broadcasted:",
|
|
528
|
+
result.txHash
|
|
529
|
+
);
|
|
530
|
+
this.emit("transactionBroadcasted", {
|
|
531
|
+
txHash: result.txHash,
|
|
532
|
+
explorerUrl: `${this.network.explorer}/tx/${result.txHash}`
|
|
533
|
+
});
|
|
534
|
+
this.clearUtxoCache();
|
|
535
|
+
return result.txHash;
|
|
536
|
+
} catch (error) {
|
|
537
|
+
console.error(
|
|
538
|
+
"[BitcoinProvider] \u274C Transaction broadcast failed:",
|
|
539
|
+
error.message
|
|
540
|
+
);
|
|
541
|
+
this.emit("error", error);
|
|
542
|
+
throw new BitcoinProviderError(
|
|
543
|
+
BitcoinErrorCode.INTERNAL_ERROR,
|
|
544
|
+
"Failed to broadcast transaction",
|
|
545
|
+
error
|
|
546
|
+
);
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
/**
|
|
550
|
+
* Get wallet info
|
|
551
|
+
*/
|
|
552
|
+
getWalletInfo() {
|
|
553
|
+
if (!this.wallet)
|
|
554
|
+
return null;
|
|
555
|
+
return {
|
|
556
|
+
address: this.wallet.address,
|
|
557
|
+
publicKey: this.wallet.publicKey,
|
|
558
|
+
addressType: this.wallet.addressType,
|
|
559
|
+
network: this.network.type
|
|
560
|
+
};
|
|
561
|
+
}
|
|
562
|
+
/**
|
|
563
|
+
* Refresh UTXO cache
|
|
564
|
+
*/
|
|
565
|
+
async refreshUtxos() {
|
|
566
|
+
return this.getUtxos(true);
|
|
567
|
+
}
|
|
568
|
+
};
|
|
569
|
+
|
|
570
|
+
export {
|
|
571
|
+
BitcoinProviderError,
|
|
572
|
+
BITCOIN_NETWORKS,
|
|
573
|
+
AbcBitcoinProvider
|
|
574
|
+
};
|