otx-btc-wallet-connectors 0.1.0

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 (142) hide show
  1. package/README.md +554 -0
  2. package/dist/base-IAFq7sd8.d.mts +53 -0
  3. package/dist/base-IAFq7sd8.d.ts +53 -0
  4. package/dist/binance/index.d.mts +81 -0
  5. package/dist/binance/index.d.ts +81 -0
  6. package/dist/binance/index.js +13 -0
  7. package/dist/binance/index.js.map +1 -0
  8. package/dist/binance/index.mjs +4 -0
  9. package/dist/binance/index.mjs.map +1 -0
  10. package/dist/bitget/index.d.mts +84 -0
  11. package/dist/bitget/index.d.ts +84 -0
  12. package/dist/bitget/index.js +13 -0
  13. package/dist/bitget/index.js.map +1 -0
  14. package/dist/bitget/index.mjs +4 -0
  15. package/dist/bitget/index.mjs.map +1 -0
  16. package/dist/chunk-5Z5Q2Y75.mjs +91 -0
  17. package/dist/chunk-5Z5Q2Y75.mjs.map +1 -0
  18. package/dist/chunk-7KK2LZLZ.mjs +208 -0
  19. package/dist/chunk-7KK2LZLZ.mjs.map +1 -0
  20. package/dist/chunk-AW2JZIHR.mjs +753 -0
  21. package/dist/chunk-AW2JZIHR.mjs.map +1 -0
  22. package/dist/chunk-EIJOSZXZ.js +331 -0
  23. package/dist/chunk-EIJOSZXZ.js.map +1 -0
  24. package/dist/chunk-EQHR7P7G.js +541 -0
  25. package/dist/chunk-EQHR7P7G.js.map +1 -0
  26. package/dist/chunk-EWRXLZO4.mjs +539 -0
  27. package/dist/chunk-EWRXLZO4.mjs.map +1 -0
  28. package/dist/chunk-FISNQZZ7.js +802 -0
  29. package/dist/chunk-FISNQZZ7.js.map +1 -0
  30. package/dist/chunk-HL4WDMGS.js +200 -0
  31. package/dist/chunk-HL4WDMGS.js.map +1 -0
  32. package/dist/chunk-IPYWR76I.js +314 -0
  33. package/dist/chunk-IPYWR76I.js.map +1 -0
  34. package/dist/chunk-JYYNWR5G.js +142 -0
  35. package/dist/chunk-JYYNWR5G.js.map +1 -0
  36. package/dist/chunk-LNKTYZJM.js +701 -0
  37. package/dist/chunk-LNKTYZJM.js.map +1 -0
  38. package/dist/chunk-LVZMONQL.mjs +699 -0
  39. package/dist/chunk-LVZMONQL.mjs.map +1 -0
  40. package/dist/chunk-MFXLQWOE.js +93 -0
  41. package/dist/chunk-MFXLQWOE.js.map +1 -0
  42. package/dist/chunk-NBIA4TTE.mjs +204 -0
  43. package/dist/chunk-NBIA4TTE.mjs.map +1 -0
  44. package/dist/chunk-O4DD2XJ2.js +206 -0
  45. package/dist/chunk-O4DD2XJ2.js.map +1 -0
  46. package/dist/chunk-P7HVBU2B.mjs +140 -0
  47. package/dist/chunk-P7HVBU2B.mjs.map +1 -0
  48. package/dist/chunk-Q7QVQYEB.js +210 -0
  49. package/dist/chunk-Q7QVQYEB.js.map +1 -0
  50. package/dist/chunk-RLZEG6KL.mjs +329 -0
  51. package/dist/chunk-RLZEG6KL.mjs.map +1 -0
  52. package/dist/chunk-SYLDBJ75.mjs +246 -0
  53. package/dist/chunk-SYLDBJ75.mjs.map +1 -0
  54. package/dist/chunk-TTEUU3CI.mjs +198 -0
  55. package/dist/chunk-TTEUU3CI.mjs.map +1 -0
  56. package/dist/chunk-V66BXDTR.mjs +292 -0
  57. package/dist/chunk-V66BXDTR.mjs.map +1 -0
  58. package/dist/chunk-X77ZT4OI.js +268 -0
  59. package/dist/chunk-X77ZT4OI.js.map +1 -0
  60. package/dist/imtoken/index.d.mts +116 -0
  61. package/dist/imtoken/index.d.ts +116 -0
  62. package/dist/imtoken/index.js +14 -0
  63. package/dist/imtoken/index.js.map +1 -0
  64. package/dist/imtoken/index.mjs +5 -0
  65. package/dist/imtoken/index.mjs.map +1 -0
  66. package/dist/index.d.mts +14 -0
  67. package/dist/index.d.ts +14 -0
  68. package/dist/index.js +170 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/index.mjs +13 -0
  71. package/dist/index.mjs.map +1 -0
  72. package/dist/ledger/index.d.mts +290 -0
  73. package/dist/ledger/index.d.ts +290 -0
  74. package/dist/ledger/index.js +14 -0
  75. package/dist/ledger/index.js.map +1 -0
  76. package/dist/ledger/index.mjs +5 -0
  77. package/dist/ledger/index.mjs.map +1 -0
  78. package/dist/okx/index.d.mts +88 -0
  79. package/dist/okx/index.d.ts +88 -0
  80. package/dist/okx/index.js +13 -0
  81. package/dist/okx/index.js.map +1 -0
  82. package/dist/okx/index.mjs +4 -0
  83. package/dist/okx/index.mjs.map +1 -0
  84. package/dist/phantom/index.d.mts +96 -0
  85. package/dist/phantom/index.d.ts +96 -0
  86. package/dist/phantom/index.js +14 -0
  87. package/dist/phantom/index.js.map +1 -0
  88. package/dist/phantom/index.mjs +5 -0
  89. package/dist/phantom/index.mjs.map +1 -0
  90. package/dist/psbt-builder-CFOs69Z5.d.mts +131 -0
  91. package/dist/psbt-builder-CFOs69Z5.d.ts +131 -0
  92. package/dist/trezor/index.d.mts +155 -0
  93. package/dist/trezor/index.d.ts +155 -0
  94. package/dist/trezor/index.js +14 -0
  95. package/dist/trezor/index.js.map +1 -0
  96. package/dist/trezor/index.mjs +5 -0
  97. package/dist/trezor/index.mjs.map +1 -0
  98. package/dist/unisat/index.d.mts +75 -0
  99. package/dist/unisat/index.d.ts +75 -0
  100. package/dist/unisat/index.js +13 -0
  101. package/dist/unisat/index.js.map +1 -0
  102. package/dist/unisat/index.mjs +4 -0
  103. package/dist/unisat/index.mjs.map +1 -0
  104. package/dist/utils/index.d.mts +398 -0
  105. package/dist/utils/index.d.ts +398 -0
  106. package/dist/utils/index.js +120 -0
  107. package/dist/utils/index.js.map +1 -0
  108. package/dist/utils/index.mjs +3 -0
  109. package/dist/utils/index.mjs.map +1 -0
  110. package/dist/xverse/index.d.mts +79 -0
  111. package/dist/xverse/index.d.ts +79 -0
  112. package/dist/xverse/index.js +13 -0
  113. package/dist/xverse/index.js.map +1 -0
  114. package/dist/xverse/index.mjs +4 -0
  115. package/dist/xverse/index.mjs.map +1 -0
  116. package/package.json +108 -0
  117. package/src/base.ts +132 -0
  118. package/src/binance/BinanceConnector.ts +307 -0
  119. package/src/binance/index.ts +1 -0
  120. package/src/bitget/BitgetConnector.ts +301 -0
  121. package/src/bitget/index.ts +1 -0
  122. package/src/imtoken/ImTokenConnector.ts +420 -0
  123. package/src/imtoken/index.ts +2 -0
  124. package/src/index.ts +78 -0
  125. package/src/ledger/LedgerConnector.ts +1019 -0
  126. package/src/ledger/index.ts +8 -0
  127. package/src/okx/OKXConnector.ts +230 -0
  128. package/src/okx/index.ts +1 -0
  129. package/src/phantom/PhantomConnector.ts +381 -0
  130. package/src/phantom/index.ts +2 -0
  131. package/src/trezor/TrezorConnector.ts +824 -0
  132. package/src/trezor/index.ts +6 -0
  133. package/src/unisat/UnisatConnector.ts +312 -0
  134. package/src/unisat/index.ts +1 -0
  135. package/src/utils/blockstream.ts +230 -0
  136. package/src/utils/btc-service.ts +364 -0
  137. package/src/utils/index.ts +56 -0
  138. package/src/utils/mempool.ts +232 -0
  139. package/src/utils/psbt-builder.ts +492 -0
  140. package/src/utils/types.ts +183 -0
  141. package/src/xverse/XverseConnector.ts +479 -0
  142. package/src/xverse/index.ts +1 -0
@@ -0,0 +1,246 @@
1
+ import { getBitcoinJsNetwork, generatePsbtForSend, finalizeAllInputs, BtcService } from './chunk-AW2JZIHR.mjs';
2
+ import { BaseConnector } from './chunk-5Z5Q2Y75.mjs';
3
+ import * as bitcoin from 'bitcoinjs-lib';
4
+
5
+ var PHANTOM_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF83MDM1XzUxMjYpIj4KPG1hc2sgaWQ9Im1hc2swXzcwMzVfNTEyNiIgc3R5bGU9Im1hc2stdHlwZTpsdW1pbmFuY2UiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj4KPHBhdGggZD0iTTIwMCAwSDBWMjAwSDIwMFYwWiIgZmlsbD0id2hpdGUiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzcwMzVfNTEyNikiPgo8cGF0aCBkPSJNMTU3LjA2OCAwSDQyLjkzMkMxOS4yMjEzIDAgMCAxOS4yMjEzIDAgNDIuOTMyVjE1Ny4wNjhDMCAxODAuNzc5IDE5LjIyMTMgMjAwIDQyLjkzMiAyMDBIMTU3LjA2OEMxODAuNzc5IDIwMCAyMDAgMTgwLjc3OSAyMDAgMTU3LjA2OFY0Mi45MzJDMjAwIDE5LjIyMTMgMTgwLjc3OSAwIDE1Ny4wNjggMFoiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04Ni4yMDMxIDEyOS45NjlDNzguMzUwMyAxNDIuMDAyIDY1LjE5MTMgMTU3LjIzIDQ3LjY4MTYgMTU3LjIzQzM5LjQwNDMgMTU3LjIzIDMxLjQ0NTMgMTUzLjgyMiAzMS40NDUzIDEzOS4wMkMzMS40NDUzIDEwMS4zMjQgODIuOTEzMyA0Mi45Njg4IDEzMC42NjcgNDIuOTY4OEMxNTcuODM0IDQyLjk2ODggMTY4LjY1OCA2MS44MTcgMTY4LjY1OCA4My4yMjFDMTY4LjY1OCAxMTAuNjk1IDE1MC44MyAxNDIuMTA4IDEzMy4xMDggMTQyLjEwOEMxMjcuNDg0IDE0Mi4xMDggMTI0LjcyNCAxMzkuMDIgMTI0LjcyNCAxMzQuMTIyQzEyNC43MjQgMTMyLjg0NCAxMjQuOTM3IDEzMS40NiAxMjUuMzYxIDEyOS45NjlDMTE5LjMxMiAxNDAuMjk4IDEwNy42MzkgMTQ5Ljg4MiA5Ni43MDkgMTQ5Ljg4MkM4OC43NSAxNDkuODgyIDg0LjcxNzUgMTQ0Ljg3NyA4NC43MTc1IDEzNy44NDlDODQuNzE3NSAxMzUuMjkzIDg1LjI0OCAxMzIuNjMxIDg2LjIwMzEgMTI5Ljk2OVpNMTUwLjcyNyA4Mi40NzgyQzE1MC43MjcgODguNzE1MiAxNDcuMDQ3IDkxLjgzMzcgMTQyLjkzMSA5MS44MzM3QzEzOC43NTIgOTEuODMzNyAxMzUuMTM1IDg4LjcxNTIgMTM1LjEzNSA4Mi40NzgyQzEzNS4xMzUgNzYuMjQxMyAxMzguNzUyIDczLjEyMjggMTQyLjkzMSA3My4xMjI4QzE0Ny4wNDcgNzMuMTIyOCAxNTAuNzI3IDc2LjI0MTMgMTUwLjcyNyA4Mi40NzgyWk0xMjcuMzM4IDgyLjQ3ODVDMTI3LjMzOCA4OC43MTU1IDEyMy42NTkgOTEuODM0IDExOS41NDIgOTEuODM0QzExNS4zNjQgOTEuODM0IDExMS43NDYgODguNzE1NSAxMTEuNzQ2IDgyLjQ3ODVDMTExLjc0NiA3Ni4yNDE1IDExNS4zNjQgNzMuMTIzMiAxMTkuNTQyIDczLjEyMzJDMTIzLjY1OSA3My4xMjMyIDEyNy4zMzggNzYuMjQxNSAxMjcuMzM4IDgyLjQ3ODVaIiBmaWxsPSIjRkZGREY4Ii8+CjwvZz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF83MDM1XzUxMjYiPgo8cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K";
6
+ var PhantomConnector = class extends BaseConnector {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.id = "phantom";
10
+ this.name = "Phantom Wallet";
11
+ this.icon = PHANTOM_ICON;
12
+ this._accounts = [];
13
+ this._paymentAccount = null;
14
+ this._ordinalsAccount = null;
15
+ this._removeAccountChangeListener = null;
16
+ }
17
+ getProvider() {
18
+ if (typeof window === "undefined")
19
+ return void 0;
20
+ const provider = window.phantom?.bitcoin;
21
+ if (provider?.isPhantom) {
22
+ return provider;
23
+ }
24
+ return void 0;
25
+ }
26
+ async connect() {
27
+ this.ensureInstalled();
28
+ const provider = this.getProvider();
29
+ try {
30
+ const accounts = await provider.requestAccounts();
31
+ if (!accounts || accounts.length === 0) {
32
+ throw new Error("No accounts returned");
33
+ }
34
+ this._accounts = accounts;
35
+ this.updateAccountsFromBtcAccounts(accounts);
36
+ this.setupEventListeners();
37
+ if (!this._paymentAccount) {
38
+ throw new Error("No payment account found");
39
+ }
40
+ return this._paymentAccount;
41
+ } catch (error) {
42
+ this.handleError(error);
43
+ }
44
+ }
45
+ updateAccountsFromBtcAccounts(accounts) {
46
+ const paymentAcc = accounts.find((a) => a.purpose === "payment");
47
+ const ordinalsAcc = accounts.find((a) => a.purpose === "ordinals");
48
+ if (paymentAcc) {
49
+ this._paymentAccount = {
50
+ address: paymentAcc.address,
51
+ publicKey: paymentAcc.publicKey,
52
+ type: this.mapAddressType(paymentAcc.addressType)
53
+ };
54
+ }
55
+ if (ordinalsAcc) {
56
+ this._ordinalsAccount = {
57
+ address: ordinalsAcc.address,
58
+ publicKey: ordinalsAcc.publicKey,
59
+ type: this.mapAddressType(ordinalsAcc.addressType)
60
+ };
61
+ }
62
+ }
63
+ mapAddressType(addressType) {
64
+ switch (addressType) {
65
+ case "p2tr":
66
+ return "taproot";
67
+ case "p2wpkh":
68
+ return "segwit";
69
+ case "p2sh":
70
+ return "nested-segwit";
71
+ case "p2pkh":
72
+ return "legacy";
73
+ default:
74
+ return "legacy";
75
+ }
76
+ }
77
+ setupEventListeners() {
78
+ const provider = this.getProvider();
79
+ if (!provider)
80
+ return;
81
+ this.removeEventListeners();
82
+ const handleAccountsChanged = (accounts) => {
83
+ this._accounts = accounts;
84
+ this.updateAccountsFromBtcAccounts(accounts);
85
+ const walletAccounts = accounts.map((acc) => ({
86
+ address: acc.address,
87
+ publicKey: acc.publicKey,
88
+ type: this.mapAddressType(acc.addressType)
89
+ }));
90
+ this.emitAccountsChanged(walletAccounts);
91
+ };
92
+ provider.on("accountsChanged", handleAccountsChanged);
93
+ this._removeAccountChangeListener = () => {
94
+ provider.off("accountsChanged", handleAccountsChanged);
95
+ };
96
+ }
97
+ removeEventListeners() {
98
+ this._removeAccountChangeListener?.();
99
+ this._removeAccountChangeListener = null;
100
+ }
101
+ async disconnect() {
102
+ this.removeEventListeners();
103
+ this._accounts = [];
104
+ this._paymentAccount = null;
105
+ this._ordinalsAccount = null;
106
+ this.cleanup();
107
+ }
108
+ async getAccounts() {
109
+ const accounts = [];
110
+ if (this._paymentAccount)
111
+ accounts.push(this._paymentAccount);
112
+ if (this._ordinalsAccount)
113
+ accounts.push(this._ordinalsAccount);
114
+ return accounts;
115
+ }
116
+ async signMessage(message) {
117
+ this.ensureInstalled();
118
+ const provider = this.getProvider();
119
+ if (!this._paymentAccount) {
120
+ throw new Error("Not connected");
121
+ }
122
+ try {
123
+ const messageBytes = new TextEncoder().encode(message);
124
+ const result = await provider.signMessage(this._paymentAccount.address, messageBytes);
125
+ return bytesToHex(result.signature);
126
+ } catch (error) {
127
+ this.handleError(error);
128
+ }
129
+ }
130
+ async signPsbt(psbtHex, options) {
131
+ this.ensureInstalled();
132
+ const provider = this.getProvider();
133
+ if (!this._paymentAccount) {
134
+ throw new Error("Not connected");
135
+ }
136
+ try {
137
+ const psbtBytes = hexToBytes(psbtHex);
138
+ const allAddresses = this._accounts.map((a) => a.address);
139
+ let inputsToSign;
140
+ if (options?.toSignInputs && options.toSignInputs.length > 0) {
141
+ inputsToSign = options.toSignInputs.map((input) => {
142
+ const addr = input.address && allAddresses.includes(input.address) ? input.address : this._paymentAccount.address;
143
+ const item = {
144
+ address: addr,
145
+ signingIndexes: [input.index]
146
+ };
147
+ if (input.sighashTypes && input.sighashTypes[0] !== void 0) {
148
+ item.sigHash = input.sighashTypes[0];
149
+ }
150
+ return item;
151
+ });
152
+ } else {
153
+ inputsToSign = [{
154
+ address: this._paymentAccount.address,
155
+ signingIndexes: [0]
156
+ }];
157
+ }
158
+ const signedPsbt = await provider.signPSBT(psbtBytes, { inputsToSign });
159
+ return bytesToHex(signedPsbt);
160
+ } catch (error) {
161
+ this.handleError(error);
162
+ }
163
+ }
164
+ /**
165
+ * Send Bitcoin transaction
166
+ * Builds a PSBT, signs it with Phantom, and broadcasts
167
+ *
168
+ * @param to - Recipient address
169
+ * @param satoshis - Amount to send in satoshis
170
+ * @param options - Send options (feeRate, etc.)
171
+ * @returns Transaction ID after broadcast
172
+ */
173
+ async sendTransaction(to, satoshis, options) {
174
+ this.ensureInstalled();
175
+ const provider = this.getProvider();
176
+ if (!this._paymentAccount) {
177
+ throw new Error("Not connected. Please call connect() first.");
178
+ }
179
+ const network = "mainnet";
180
+ const btcNetwork = getBitcoinJsNetwork(network);
181
+ const {
182
+ psbt,
183
+ selectedUtxos,
184
+ inputsToSign
185
+ } = await generatePsbtForSend(
186
+ to,
187
+ satoshis,
188
+ this._paymentAccount.address,
189
+ this._paymentAccount.publicKey,
190
+ network,
191
+ options
192
+ );
193
+ const psbtBytes = psbt.toBuffer();
194
+ const phantomInputsToSign = [{
195
+ address: this._paymentAccount.address,
196
+ signingIndexes: inputsToSign.map((input) => input.index)
197
+ }];
198
+ const signedPsbtBytes = await provider.signPSBT(psbtBytes, {
199
+ inputsToSign: phantomInputsToSign
200
+ });
201
+ const signedPsbt = bitcoin.Psbt.fromBuffer(
202
+ new Uint8Array(signedPsbtBytes),
203
+ { network: btcNetwork }
204
+ );
205
+ finalizeAllInputs(signedPsbt, selectedUtxos.length);
206
+ const tx = signedPsbt.extractTransaction();
207
+ const txHex = tx.toHex();
208
+ const btcService = new BtcService(network);
209
+ return await btcService.broadcastTransaction(txHex);
210
+ }
211
+ async getNetwork() {
212
+ return "mainnet";
213
+ }
214
+ /**
215
+ * Get the ordinals address (if available)
216
+ */
217
+ getOrdinalsAddress() {
218
+ return this._ordinalsAccount;
219
+ }
220
+ /**
221
+ * Get the payment address
222
+ */
223
+ getPaymentAddress() {
224
+ return this._paymentAccount;
225
+ }
226
+ /**
227
+ * Get all connected addresses
228
+ */
229
+ getAllAddresses() {
230
+ return this._accounts.map((acc) => acc.address);
231
+ }
232
+ };
233
+ function hexToBytes(hex) {
234
+ const bytes = new Uint8Array(hex.length / 2);
235
+ for (let i = 0; i < hex.length; i += 2) {
236
+ bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);
237
+ }
238
+ return bytes;
239
+ }
240
+ function bytesToHex(bytes) {
241
+ return Array.from(bytes).map((b) => b.toString(16).padStart(2, "0")).join("");
242
+ }
243
+
244
+ export { PhantomConnector };
245
+ //# sourceMappingURL=out.js.map
246
+ //# sourceMappingURL=chunk-SYLDBJ75.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/phantom/PhantomConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n WalletAccount,\n BitcoinNetwork,\n SignPsbtOptions,\n} from 'otx-btc-wallet-core';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport { BaseConnector } from '../base';\nimport { BtcService } from '../utils';\nimport {\n generatePsbtForSend,\n finalizeAllInputs,\n getBitcoinJsNetwork,\n type GeneratePsbtOptions,\n} from '../utils';\n\n/**\n * Options for sendTransaction method\n */\nexport interface PhantomSendOptions extends GeneratePsbtOptions {\n // Additional Phantom-specific options can be added here\n}\n\n/**\n * Phantom Bitcoin account type\n * @see https://docs.phantom.com/bitcoin/establishing-a-connection\n */\ninterface BtcAccount {\n address: string;\n addressType: 'p2tr' | 'p2wpkh' | 'p2sh' | 'p2pkh';\n publicKey: string;\n purpose: 'payment' | 'ordinals';\n}\n\n/**\n * Phantom Bitcoin provider interface\n * @see https://docs.phantom.com/bitcoin/provider-api-reference\n */\ninterface PhantomBitcoinProvider {\n isPhantom: boolean;\n requestAccounts(): Promise<BtcAccount[]>;\n signMessage(address: string, message: Uint8Array): Promise<{ signature: Uint8Array }>;\n signPSBT(\n psbt: Uint8Array,\n options: {\n inputsToSign: Array<{\n address: string;\n signingIndexes: number[];\n sigHash?: number;\n }>;\n }\n ): Promise<Uint8Array>;\n on(event: 'accountsChanged', callback: (accounts: BtcAccount[]) => void): void;\n off(event: 'accountsChanged', callback: (accounts: BtcAccount[]) => void): void;\n}\n\n// Extend window type\ndeclare global {\n interface Window {\n phantom?: {\n bitcoin?: PhantomBitcoinProvider;\n };\n }\n}\n\n// Phantom wallet icon\nconst PHANTOM_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF83MDM1XzUxMjYpIj4KPG1hc2sgaWQ9Im1hc2swXzcwMzVfNTEyNiIgc3R5bGU9Im1hc2stdHlwZTpsdW1pbmFuY2UiIG1hc2tVbml0cz0idXNlclNwYWNlT25Vc2UiIHg9IjAiIHk9IjAiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj4KPHBhdGggZD0iTTIwMCAwSDBWMjAwSDIwMFYwWiIgZmlsbD0id2hpdGUiLz4KPC9tYXNrPgo8ZyBtYXNrPSJ1cmwoI21hc2swXzcwMzVfNTEyNikiPgo8cGF0aCBkPSJNMTU3LjA2OCAwSDQyLjkzMkMxOS4yMjEzIDAgMCAxOS4yMjEzIDAgNDIuOTMyVjE1Ny4wNjhDMCAxODAuNzc5IDE5LjIyMTMgMjAwIDQyLjkzMiAyMDBIMTU3LjA2OEMxODAuNzc5IDIwMCAyMDAgMTgwLjc3OSAyMDAgMTU3LjA2OFY0Mi45MzJDMjAwIDE5LjIyMTMgMTgwLjc3OSAwIDE1Ny4wNjggMFoiIGZpbGw9IiNBQjlGRjIiLz4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik04Ni4yMDMxIDEyOS45NjlDNzguMzUwMyAxNDIuMDAyIDY1LjE5MTMgMTU3LjIzIDQ3LjY4MTYgMTU3LjIzQzM5LjQwNDMgMTU3LjIzIDMxLjQ0NTMgMTUzLjgyMiAzMS40NDUzIDEzOS4wMkMzMS40NDUzIDEwMS4zMjQgODIuOTEzMyA0Mi45Njg4IDEzMC42NjcgNDIuOTY4OEMxNTcuODM0IDQyLjk2ODggMTY4LjY1OCA2MS44MTcgMTY4LjY1OCA4My4yMjFDMTY4LjY1OCAxMTAuNjk1IDE1MC44MyAxNDIuMTA4IDEzMy4xMDggMTQyLjEwOEMxMjcuNDg0IDE0Mi4xMDggMTI0LjcyNCAxMzkuMDIgMTI0LjcyNCAxMzQuMTIyQzEyNC43MjQgMTMyLjg0NCAxMjQuOTM3IDEzMS40NiAxMjUuMzYxIDEyOS45NjlDMTE5LjMxMiAxNDAuMjk4IDEwNy42MzkgMTQ5Ljg4MiA5Ni43MDkgMTQ5Ljg4MkM4OC43NSAxNDkuODgyIDg0LjcxNzUgMTQ0Ljg3NyA4NC43MTc1IDEzNy44NDlDODQuNzE3NSAxMzUuMjkzIDg1LjI0OCAxMzIuNjMxIDg2LjIwMzEgMTI5Ljk2OVpNMTUwLjcyNyA4Mi40NzgyQzE1MC43MjcgODguNzE1MiAxNDcuMDQ3IDkxLjgzMzcgMTQyLjkzMSA5MS44MzM3QzEzOC43NTIgOTEuODMzNyAxMzUuMTM1IDg4LjcxNTIgMTM1LjEzNSA4Mi40NzgyQzEzNS4xMzUgNzYuMjQxMyAxMzguNzUyIDczLjEyMjggMTQyLjkzMSA3My4xMjI4QzE0Ny4wNDcgNzMuMTIyOCAxNTAuNzI3IDc2LjI0MTMgMTUwLjcyNyA4Mi40NzgyWk0xMjcuMzM4IDgyLjQ3ODVDMTI3LjMzOCA4OC43MTU1IDEyMy42NTkgOTEuODM0IDExOS41NDIgOTEuODM0QzExNS4zNjQgOTEuODM0IDExMS43NDYgODguNzE1NSAxMTEuNzQ2IDgyLjQ3ODVDMTExLjc0NiA3Ni4yNDE1IDExNS4zNjQgNzMuMTIzMiAxMTkuNTQyIDczLjEyMzJDMTIzLjY1OSA3My4xMjMyIDEyNy4zMzggNzYuMjQxNSAxMjcuMzM4IDgyLjQ3ODVaIiBmaWxsPSIjRkZGREY4Ii8+CjwvZz4KPC9nPgo8ZGVmcz4KPGNsaXBQYXRoIGlkPSJjbGlwMF83MDM1XzUxMjYiPgo8cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K';\n\n/**\n * Phantom Wallet Connector (Bitcoin support)\n *\n * @see https://docs.phantom.com/bitcoin/detecting-the-provider\n */\nexport class PhantomConnector extends BaseConnector {\n readonly id = 'phantom';\n readonly name = 'Phantom Wallet';\n readonly icon = PHANTOM_ICON;\n\n private _accounts: BtcAccount[] = [];\n private _paymentAccount: WalletAccount | null = null;\n private _ordinalsAccount: WalletAccount | null = null;\n private _removeAccountChangeListener: (() => void) | null = null;\n\n protected getProvider(): PhantomBitcoinProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n const provider = window.phantom?.bitcoin;\n if (provider?.isPhantom) {\n return provider;\n }\n return undefined;\n }\n\n async connect(): Promise<WalletAccount> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n const accounts = await provider.requestAccounts();\n\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts returned');\n }\n\n this._accounts = accounts;\n this.updateAccountsFromBtcAccounts(accounts);\n\n // Setup event listeners\n this.setupEventListeners();\n\n if (!this._paymentAccount) {\n throw new Error('No payment account found');\n }\n\n return this._paymentAccount;\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private updateAccountsFromBtcAccounts(accounts: BtcAccount[]): void {\n const paymentAcc = accounts.find((a) => a.purpose === 'payment');\n const ordinalsAcc = accounts.find((a) => a.purpose === 'ordinals');\n\n if (paymentAcc) {\n this._paymentAccount = {\n address: paymentAcc.address,\n publicKey: paymentAcc.publicKey,\n type: this.mapAddressType(paymentAcc.addressType),\n };\n }\n\n if (ordinalsAcc) {\n this._ordinalsAccount = {\n address: ordinalsAcc.address,\n publicKey: ordinalsAcc.publicKey,\n type: this.mapAddressType(ordinalsAcc.addressType),\n };\n }\n }\n\n private mapAddressType(addressType: BtcAccount['addressType']): WalletAccount['type'] {\n switch (addressType) {\n case 'p2tr':\n return 'taproot';\n case 'p2wpkh':\n return 'segwit';\n case 'p2sh':\n return 'nested-segwit';\n case 'p2pkh':\n return 'legacy';\n default:\n return 'legacy';\n }\n }\n\n private setupEventListeners(): void {\n const provider = this.getProvider();\n if (!provider) return;\n\n // Remove existing listener\n this.removeEventListeners();\n\n // Account change listener\n const handleAccountsChanged = (accounts: BtcAccount[]) => {\n this._accounts = accounts;\n this.updateAccountsFromBtcAccounts(accounts);\n\n const walletAccounts: WalletAccount[] = accounts.map((acc) => ({\n address: acc.address,\n publicKey: acc.publicKey,\n type: this.mapAddressType(acc.addressType),\n }));\n\n this.emitAccountsChanged(walletAccounts);\n };\n\n provider.on('accountsChanged', handleAccountsChanged);\n\n this._removeAccountChangeListener = () => {\n provider.off('accountsChanged', handleAccountsChanged);\n };\n }\n\n private removeEventListeners(): void {\n this._removeAccountChangeListener?.();\n this._removeAccountChangeListener = null;\n }\n\n async disconnect(): Promise<void> {\n this.removeEventListeners();\n this._accounts = [];\n this._paymentAccount = null;\n this._ordinalsAccount = null;\n this.cleanup();\n }\n\n async getAccounts(): Promise<WalletAccount[]> {\n const accounts: WalletAccount[] = [];\n if (this._paymentAccount) accounts.push(this._paymentAccount);\n if (this._ordinalsAccount) accounts.push(this._ordinalsAccount);\n return accounts;\n }\n\n async signMessage(message: string): Promise<string> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n if (!this._paymentAccount) {\n throw new Error('Not connected');\n }\n\n try {\n // Convert message to Uint8Array\n const messageBytes = new TextEncoder().encode(message);\n const result = await provider.signMessage(this._paymentAccount.address, messageBytes);\n // Convert Uint8Array signature to hex string\n return bytesToHex(result.signature);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async signPsbt(psbtHex: string, options?: SignPsbtOptions): Promise<string> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n if (!this._paymentAccount) {\n throw new Error('Not connected');\n }\n\n try {\n // Convert hex to Uint8Array\n const psbtBytes = hexToBytes(psbtHex);\n\n // Build inputsToSign\n const allAddresses = this._accounts.map((a) => a.address);\n let inputsToSign: Array<{ address: string; signingIndexes: number[]; sigHash?: number }>;\n\n if (options?.toSignInputs && options.toSignInputs.length > 0) {\n inputsToSign = options.toSignInputs.map((input) => {\n const addr = input.address && allAddresses.includes(input.address)\n ? input.address\n : this._paymentAccount!.address;\n\n const item: { address: string; signingIndexes: number[]; sigHash?: number } = {\n address: addr,\n signingIndexes: [input.index],\n };\n\n if (input.sighashTypes && input.sighashTypes[0] !== undefined) {\n item.sigHash = input.sighashTypes[0];\n }\n\n return item;\n });\n } else {\n // Default: sign all inputs with payment address\n inputsToSign = [{\n address: this._paymentAccount.address,\n signingIndexes: [0],\n }];\n }\n\n const signedPsbt = await provider.signPSBT(psbtBytes, { inputsToSign });\n\n // Convert back to hex\n return bytesToHex(signedPsbt);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n /**\n * Send Bitcoin transaction\n * Builds a PSBT, signs it with Phantom, and broadcasts\n *\n * @param to - Recipient address\n * @param satoshis - Amount to send in satoshis\n * @param options - Send options (feeRate, etc.)\n * @returns Transaction ID after broadcast\n */\n async sendTransaction(\n to: string,\n satoshis: number,\n options?: PhantomSendOptions\n ): Promise<string> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n if (!this._paymentAccount) {\n throw new Error('Not connected. Please call connect() first.');\n }\n\n const network: BitcoinNetwork = 'mainnet'; // Phantom only supports mainnet\n const btcNetwork = getBitcoinJsNetwork(network);\n\n // 1. Generate PSBT using the utility\n const {\n psbt,\n selectedUtxos,\n inputsToSign,\n } = await generatePsbtForSend(\n to,\n satoshis,\n this._paymentAccount.address,\n this._paymentAccount.publicKey,\n network,\n options\n );\n\n // 2. Convert PSBT to Uint8Array for Phantom\n const psbtBytes = psbt.toBuffer();\n\n // 3. Build inputsToSign for Phantom API\n const phantomInputsToSign = [{\n address: this._paymentAccount.address,\n signingIndexes: inputsToSign.map((input) => input.index),\n }];\n\n // 4. Sign PSBT with Phantom\n const signedPsbtBytes = await provider.signPSBT(psbtBytes, {\n inputsToSign: phantomInputsToSign,\n });\n\n // 5. Parse signed PSBT and finalize\n const signedPsbt = bitcoin.Psbt.fromBuffer(\n new Uint8Array(signedPsbtBytes),\n { network: btcNetwork }\n );\n finalizeAllInputs(signedPsbt, selectedUtxos.length);\n\n // 6. Extract transaction\n const tx = signedPsbt.extractTransaction();\n const txHex = tx.toHex();\n\n // 7. Broadcast using BtcService\n const btcService = new BtcService(network);\n return await btcService.broadcastTransaction(txHex);\n }\n\n async getNetwork(): Promise<BitcoinNetwork> {\n // Phantom Bitcoin only supports mainnet currently\n return 'mainnet';\n }\n\n /**\n * Get the ordinals address (if available)\n */\n getOrdinalsAddress(): WalletAccount | null {\n return this._ordinalsAccount;\n }\n\n /**\n * Get the payment address\n */\n getPaymentAddress(): WalletAccount | null {\n return this._paymentAccount;\n }\n\n /**\n * Get all connected addresses\n */\n getAllAddresses(): string[] {\n return this._accounts.map((acc) => acc.address);\n }\n}\n\n// Helper functions for hex/bytes conversion\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < hex.length; i += 2) {\n bytes[i / 2] = parseInt(hex.substring(i, i + 2), 16);\n }\n return bytes;\n}\n\nfunction bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n"]}
@@ -0,0 +1,198 @@
1
+ import { BaseConnector } from './chunk-5Z5Q2Y75.mjs';
2
+
3
+ // src/bitget/BitgetConnector.ts
4
+ var BITGET_ICON = "data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF83MDM3Xzc2KSI+CjxtYXNrIGlkPSJtYXNrMF83MDM3Xzc2IiBzdHlsZT0ibWFzay10eXBlOmx1bWluYW5jZSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPgo8cGF0aCBkPSJNMjAwIDBIMFYyMDBIMjAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazBfNzAzN183NikiPgo8cGF0aCBkPSJNMjAwIDEuNTI1ODhlLTA1SDAuMDAwMjQ0MTQxVjIwMEgyMDBWMS41MjU4OGUtMDVaIiBmaWxsPSIjNTRGRkY1Ii8+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2ZfNzAzN183NikiPgo8cGF0aCBkPSJNMTAuNTMxOCAxNTUuMTU5Qy0yMi45MTIgMjQ5LjI1MSAxNTUuOTg2IDIyMi42NzYgMjQ5LjYxNSAxOTcuNjI3QzM0NS40NDEgMTY1LjgyNSAyNzkuMjA4IDI1LjY0NDUgMjEwLjQ4IDIyLjU0MkMxNDEuNzUyIDE5LjQzOTYgMjE5LjAwMiA4Ny4zNjEzIDE2MC42MjIgMTA2Ljc2MUMxMDIuMjQxIDEyNi4xNiA1Mi4zMzY4IDM3LjU0NCAxMC41MzE4IDE1NS4xNTlaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2ZfNzAzN183NikiPgo8cGF0aCBkPSJNNjYuODA2MyAtMzUuNzk5NkM0OS4yNjI1IC04My43MzIgLTEzLjIxNzkgLTE4Ljc0NzEgLTQyLjI2NTIgMTkuNzM3Qy02OS45NzI2IDYxLjU5OTIgMi4zNTExMyA5Ny43NzQyIDMwLjcxOTQgNzguMTUzNUM1OS4wODc5IDU4LjUzMjggNi4wNzM4NiA1NC43MTUzIDIyLjk0NiAyOS4yMDEyQzM5LjgxOCAzLjY4NzM0IDg4LjczNTYgMjQuMTE2MSA2Ni44MDYzIC0zNS43OTk2WiIgZmlsbD0iIzAwRkZGMCIgZmlsbC1vcGFjaXR5PSIwLjY3Ii8+CjwvZz4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjJfZl83MDM3Xzc2KSI+CjxwYXRoIGQ9Ik03NS4zNzQ4IDE3Ni4xMTFDNTEuNDQ1OSA5NS41OTU3IC01MS42MjYgMTM3Ljk5NyAtMTAwLjE3MSAxNjkuMjYzQy0xNDYuODY3IDIwNi4yODIgLTM1Ljk5MjcgMzEyLjc3MSAxMC4wNTY5IDMwNy4zMjRDNTYuMTA2NCAzMDEuODc3IC0yNi44ODM5IDI1NS41MTkgMS41NTI2MiAyMzIuOTQ1QzI5Ljk4OTIgMjEwLjM3MSAxMDUuMjg3IDI3Ni43NTYgNzUuMzc0OCAxNzYuMTExWiIgZmlsbD0iIzlEODFGRiIvPgo8L2c+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIzX2ZfNzAzN183NikiPgo8cGF0aCBkPSJNMjIwLjQwNiAtODMuODY5NUMxNjguNzg3IC0xNDUuMzM3IDk0Ljg5MjggLTk0LjUwNzggNjQuMzk4MyAtNjEuNDA5OEMzNy43MTQyIC0yMy45NDExIDE3NS4yMTUgNDQuNzExNyAyMTMuMzc2IDMyLjk0NjRDMjUxLjUzOCAyMS4xODA5IDE2MS4zMzcgLTMuMTY0MzYgMTc3LjU3NiAtMjYuMDA2MkMxOTMuODE0IC00OC44NDggMjg0LjkzMSAtNy4wMzU2NiAyMjAuNDA2IC04My44Njk1WiIgZmlsbD0iIzREOTRGRiIvPgo8L2c+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNzIuODA0IDExOS40MDNIMTA2Ljc3Nkw2OC4xMzE4IDgwLjUwODZMMTA3LjI3MyA0MS42MTQ1TDExNy45MzQgMzEuMjVIODIuNjcxNkwzNy43NjI2IDc2LjM4ODdDMzUuNDk2MiA3OC42NjM3IDM1LjUwNzggODIuMzQ0OSAzNy43ODU5IDg0LjYwODZMNzIuODA0IDExOS40MDNaTTkzLjIyNjcgODAuNkg5Mi45NjUzTDkzLjIyMzkgODAuNTk3M0w5My4yMjY3IDgwLjZaTTkzLjIyNjcgODAuNkwxMzEuODY4IDExOS40OTFMOTIuNzI3MSAxNTguMzg2TDgyLjA2NjEgMTY4Ljc1SDExNy4zMjlMMTYyLjIzOCAxMjMuNjE0QzE2NC41MDQgMTIxLjMzOSAxNjQuNDkyIDExNy42NTggMTYyLjIxNCAxMTUuMzk1TDEyNy4xOTYgODAuNkg5My4yMjY3WiIgZmlsbD0iYmxhY2siLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2ZfNzAzN183NiIgeD0iLTcwLjUwMDciIHk9Ii01NC40ODM5IiB3aWR0aD0iNDQ0Ljk2NyIgaGVpZ2h0PSIzNTIuNjgxIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjM4LjQ2MTUiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl83MDM3Xzc2Ii8+CjwvZmlsdGVyPgo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2ZfNzAzN183NiIgeD0iLTEyNS4zOTkiIHk9Ii0xMjkuNjc5IiB3aWR0aD0iMjc0LjY4NSIgaGVpZ2h0PSIyOTAuMjQxIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjM4LjQ2MTUiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl83MDM3Xzc2Ii8+CjwvZmlsdGVyPgo8ZmlsdGVyIGlkPSJmaWx0ZXIyX2ZfNzAzN183NiIgeD0iLTE4OC4zNDIiIHk9IjUyLjg0NTEiIHdpZHRoPSIzNDcuNTQiIGhlaWdodD0iMzMxLjYwMyIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzOC40NjE1IiByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfNzAzN183NiIvPgo8L2ZpbHRlcj4KPGZpbHRlciBpZD0iZmlsdGVyM19mXzcwMzdfNzYiIHg9Ii0xNS45MzQ4IiB5PSItMTg5LjY1NiIgd2lkdGg9IjMzNi4wODYiIGhlaWdodD0iMzAwLjg2MyIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzOC40NjE1IiByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfNzAzN183NiIvPgo8L2ZpbHRlcj4KPGNsaXBQYXRoIGlkPSJjbGlwMF83MDM3Xzc2Ij4KPHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHJ4PSIzMiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K";
5
+ var BitgetConnector = class extends BaseConnector {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.id = "bitget";
9
+ this.name = "Bitget Wallet";
10
+ this.icon = BITGET_ICON;
11
+ this._removeAccountChangeListener = null;
12
+ this._removeNetworkChangeListener = null;
13
+ }
14
+ getProvider() {
15
+ if (typeof window === "undefined")
16
+ return void 0;
17
+ return window.bitkeep?.unisat;
18
+ }
19
+ async connect(network = "mainnet") {
20
+ this.ensureInstalled();
21
+ const provider = this.getProvider();
22
+ try {
23
+ const accounts = await provider.requestAccounts();
24
+ if (!accounts || accounts.length === 0) {
25
+ throw new Error("No accounts found");
26
+ }
27
+ await this.ensureNetwork(provider, network);
28
+ const publicKey = await provider.getPublicKey();
29
+ this.setupEventListeners();
30
+ return {
31
+ address: accounts[0] ?? "",
32
+ publicKey,
33
+ type: this.inferAddressType(accounts[0] ?? "")
34
+ };
35
+ } catch (error) {
36
+ this.handleError(error);
37
+ }
38
+ }
39
+ async ensureNetwork(provider, network) {
40
+ const currentNetwork = await provider.getNetwork();
41
+ const targetNetwork = this.mapToBitgetNetwork(network);
42
+ if (currentNetwork !== targetNetwork) {
43
+ await provider.switchNetwork(targetNetwork);
44
+ }
45
+ }
46
+ setupEventListeners() {
47
+ const provider = this.getProvider();
48
+ if (!provider)
49
+ return;
50
+ this.removeEventListeners();
51
+ const handleAccountsChanged = (accounts) => {
52
+ if (!accounts || accounts.length === 0) {
53
+ this.emitAccountsChanged([]);
54
+ return;
55
+ }
56
+ provider.getPublicKey().then((publicKey) => {
57
+ const walletAccounts = accounts.map((address) => ({
58
+ address,
59
+ publicKey,
60
+ type: this.inferAddressType(address)
61
+ }));
62
+ this.emitAccountsChanged(walletAccounts);
63
+ }).catch(() => {
64
+ this.emitAccountsChanged([]);
65
+ });
66
+ };
67
+ const handleNetworkChanged = (network) => {
68
+ const btcNetwork = this.mapNetwork(network);
69
+ this.emitNetworkChanged(btcNetwork);
70
+ };
71
+ provider.on("accountsChanged", handleAccountsChanged);
72
+ provider.on("networkChanged", handleNetworkChanged);
73
+ this._removeAccountChangeListener = () => {
74
+ provider.removeListener("accountsChanged", handleAccountsChanged);
75
+ };
76
+ this._removeNetworkChangeListener = () => {
77
+ provider.removeListener("networkChanged", handleNetworkChanged);
78
+ };
79
+ }
80
+ removeEventListeners() {
81
+ this._removeAccountChangeListener?.();
82
+ this._removeAccountChangeListener = null;
83
+ this._removeNetworkChangeListener?.();
84
+ this._removeNetworkChangeListener = null;
85
+ }
86
+ async disconnect() {
87
+ this.removeEventListeners();
88
+ this.cleanup();
89
+ }
90
+ async getAccounts() {
91
+ this.ensureInstalled();
92
+ const provider = this.getProvider();
93
+ try {
94
+ const addresses = await provider.getAccounts();
95
+ const publicKey = await provider.getPublicKey();
96
+ return addresses.map((address) => ({
97
+ address,
98
+ publicKey,
99
+ type: this.inferAddressType(address)
100
+ }));
101
+ } catch (error) {
102
+ this.handleError(error);
103
+ }
104
+ }
105
+ async signMessage(message) {
106
+ this.ensureInstalled();
107
+ const provider = this.getProvider();
108
+ try {
109
+ return await provider.signMessage(message);
110
+ } catch (error) {
111
+ this.handleError(error);
112
+ }
113
+ }
114
+ async signPsbt(psbtHex, options) {
115
+ this.ensureInstalled();
116
+ const provider = this.getProvider();
117
+ try {
118
+ return await provider.signPsbt(psbtHex, options);
119
+ } catch (error) {
120
+ this.handleError(error);
121
+ }
122
+ }
123
+ async signPsbts(psbtHexs, options) {
124
+ this.ensureInstalled();
125
+ const provider = this.getProvider();
126
+ try {
127
+ const bitgetOptions = {
128
+ autoFinalized: options?.autoFinalize ?? true
129
+ };
130
+ if (options?.toSignInputs) {
131
+ bitgetOptions.toSignInputs = options.toSignInputs;
132
+ }
133
+ const optionsArray = psbtHexs.map(() => bitgetOptions);
134
+ return await provider.signPsbts(psbtHexs, optionsArray);
135
+ } catch (error) {
136
+ this.handleError(error);
137
+ }
138
+ }
139
+ async sendTransaction(to, satoshis) {
140
+ this.ensureInstalled();
141
+ const provider = this.getProvider();
142
+ try {
143
+ return await provider.sendBitcoin(to, satoshis);
144
+ } catch (error) {
145
+ this.handleError(error);
146
+ }
147
+ }
148
+ async getNetwork() {
149
+ this.ensureInstalled();
150
+ const provider = this.getProvider();
151
+ try {
152
+ const network = await provider.getNetwork();
153
+ return this.mapNetwork(network);
154
+ } catch (error) {
155
+ this.handleError(error);
156
+ }
157
+ }
158
+ async switchNetwork(network) {
159
+ this.ensureInstalled();
160
+ const provider = this.getProvider();
161
+ try {
162
+ const bitgetNetwork = this.mapToBitgetNetwork(network);
163
+ await provider.switchNetwork(bitgetNetwork);
164
+ } catch (error) {
165
+ this.handleError(error);
166
+ }
167
+ }
168
+ mapNetwork(network) {
169
+ switch (network.toLowerCase()) {
170
+ case "livenet":
171
+ case "mainnet":
172
+ return "mainnet";
173
+ case "testnet":
174
+ return "testnet";
175
+ case "signet":
176
+ return "signet";
177
+ default:
178
+ return "mainnet";
179
+ }
180
+ }
181
+ mapToBitgetNetwork(network) {
182
+ switch (network) {
183
+ case "mainnet":
184
+ return "livenet";
185
+ case "testnet":
186
+ case "testnet4":
187
+ return "testnet";
188
+ case "signet":
189
+ return "signet";
190
+ default:
191
+ return "livenet";
192
+ }
193
+ }
194
+ };
195
+
196
+ export { BitgetConnector };
197
+ //# sourceMappingURL=out.js.map
198
+ //# sourceMappingURL=chunk-TTEUU3CI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/bitget/BitgetConnector.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n WalletAccount,\n BitcoinNetwork,\n SignPsbtOptions,\n} from 'otx-btc-wallet-core';\nimport { BaseConnector } from '../base';\n\n/**\n * Bitget sign PSBT options\n * @see https://web3.bitget.com/en/docs/connect/mainnet/btc/\n */\ninterface BitgetSignPsbtOptions {\n autoFinalized?: boolean;\n toSignInputs?: Array<{\n index: number;\n address?: string;\n publicKey?: string;\n sighashTypes?: number[];\n disableTweakSigner?: boolean;\n }>;\n}\n\n/**\n * Bitget Bitcoin provider interface\n * Provider is accessible via window.bitkeep.unisat\n * @see https://web3.bitget.com/en/docs/connect/mainnet/btc/\n */\ninterface BitgetBitcoinProvider {\n requestAccounts(): Promise<string[]>;\n getAccounts(): Promise<string[]>;\n getPublicKey(): Promise<string>;\n getBalance(): Promise<{ confirmed: number; unconfirmed: number; total: number }>;\n getNetwork(): Promise<string>;\n switchNetwork(network: 'livenet' | 'testnet' | 'signet'): Promise<void>;\n signMessage(msg: string, type?: 'ecdsa' | 'bip322-simple'): Promise<string>;\n signPsbt(psbtHex: string, options?: BitgetSignPsbtOptions): Promise<string>;\n signPsbts(psbtHexs: string[], options?: BitgetSignPsbtOptions[]): Promise<string[]>;\n pushPsbt(psbtHex: string): Promise<string>;\n sendBitcoin(toAddress: string, satoshis: number, options?: { feeRate?: number }): Promise<string>;\n pushTx(options: { rawtx: string }): Promise<string>;\n on(event: 'accountsChanged', callback: (accounts: string[]) => void): void;\n on(event: 'networkChanged', callback: (network: string) => void): void;\n removeListener(event: 'accountsChanged', callback: (accounts: string[]) => void): void;\n removeListener(event: 'networkChanged', callback: (network: string) => void): void;\n}\n\n// Extend window type\ndeclare global {\n interface Window {\n bitkeep?: {\n unisat?: BitgetBitcoinProvider;\n };\n }\n}\n\n// Bitget wallet icon\nconst BITGET_ICON =\n 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgdmlld0JveD0iMCAwIDIwMCAyMDAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGNsaXAtcGF0aD0idXJsKCNjbGlwMF83MDM3Xzc2KSI+CjxtYXNrIGlkPSJtYXNrMF83MDM3Xzc2IiBzdHlsZT0ibWFzay10eXBlOmx1bWluYW5jZSIgbWFza1VuaXRzPSJ1c2VyU3BhY2VPblVzZSIgeD0iMCIgeT0iMCIgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiPgo8cGF0aCBkPSJNMjAwIDBIMFYyMDBIMjAwVjBaIiBmaWxsPSJ3aGl0ZSIvPgo8L21hc2s+CjxnIG1hc2s9InVybCgjbWFzazBfNzAzN183NikiPgo8cGF0aCBkPSJNMjAwIDEuNTI1ODhlLTA1SDAuMDAwMjQ0MTQxVjIwMEgyMDBWMS41MjU4OGUtMDVaIiBmaWxsPSIjNTRGRkY1Ii8+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIwX2ZfNzAzN183NikiPgo8cGF0aCBkPSJNMTAuNTMxOCAxNTUuMTU5Qy0yMi45MTIgMjQ5LjI1MSAxNTUuOTg2IDIyMi42NzYgMjQ5LjYxNSAxOTcuNjI3QzM0NS40NDEgMTY1LjgyNSAyNzkuMjA4IDI1LjY0NDUgMjEwLjQ4IDIyLjU0MkMxNDEuNzUyIDE5LjQzOTYgMjE5LjAwMiA4Ny4zNjEzIDE2MC42MjIgMTA2Ljc2MUMxMDIuMjQxIDEyNi4xNiA1Mi4zMzY4IDM3LjU0NCAxMC41MzE4IDE1NS4xNTlaIiBmaWxsPSJ3aGl0ZSIvPgo8L2c+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIxX2ZfNzAzN183NikiPgo8cGF0aCBkPSJNNjYuODA2MyAtMzUuNzk5NkM0OS4yNjI1IC04My43MzIgLTEzLjIxNzkgLTE4Ljc0NzEgLTQyLjI2NTIgMTkuNzM3Qy02OS45NzI2IDYxLjU5OTIgMi4zNTExMyA5Ny43NzQyIDMwLjcxOTQgNzguMTUzNUM1OS4wODc5IDU4LjUzMjggNi4wNzM4NiA1NC43MTUzIDIyLjk0NiAyOS4yMDEyQzM5LjgxOCAzLjY4NzM0IDg4LjczNTYgMjQuMTE2MSA2Ni44MDYzIC0zNS43OTk2WiIgZmlsbD0iIzAwRkZGMCIgZmlsbC1vcGFjaXR5PSIwLjY3Ii8+CjwvZz4KPGcgZmlsdGVyPSJ1cmwoI2ZpbHRlcjJfZl83MDM3Xzc2KSI+CjxwYXRoIGQ9Ik03NS4zNzQ4IDE3Ni4xMTFDNTEuNDQ1OSA5NS41OTU3IC01MS42MjYgMTM3Ljk5NyAtMTAwLjE3MSAxNjkuMjYzQy0xNDYuODY3IDIwNi4yODIgLTM1Ljk5MjcgMzEyLjc3MSAxMC4wNTY5IDMwNy4zMjRDNTYuMTA2NCAzMDEuODc3IC0yNi44ODM5IDI1NS41MTkgMS41NTI2MiAyMzIuOTQ1QzI5Ljk4OTIgMjEwLjM3MSAxMDUuMjg3IDI3Ni43NTYgNzUuMzc0OCAxNzYuMTExWiIgZmlsbD0iIzlEODFGRiIvPgo8L2c+CjxnIGZpbHRlcj0idXJsKCNmaWx0ZXIzX2ZfNzAzN183NikiPgo8cGF0aCBkPSJNMjIwLjQwNiAtODMuODY5NUMxNjguNzg3IC0xNDUuMzM3IDk0Ljg5MjggLTk0LjUwNzggNjQuMzk4MyAtNjEuNDA5OEMzNy43MTQyIC0yMy45NDExIDE3NS4yMTUgNDQuNzExNyAyMTMuMzc2IDMyLjk0NjRDMjUxLjUzOCAyMS4xODA5IDE2MS4zMzcgLTMuMTY0MzYgMTc3LjU3NiAtMjYuMDA2MkMxOTMuODE0IC00OC44NDggMjg0LjkzMSAtNy4wMzU2NiAyMjAuNDA2IC04My44Njk1WiIgZmlsbD0iIzREOTRGRiIvPgo8L2c+CjxwYXRoIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNNzIuODA0IDExOS40MDNIMTA2Ljc3Nkw2OC4xMzE4IDgwLjUwODZMMTA3LjI3MyA0MS42MTQ1TDExNy45MzQgMzEuMjVIODIuNjcxNkwzNy43NjI2IDc2LjM4ODdDMzUuNDk2MiA3OC42NjM3IDM1LjUwNzggODIuMzQ0OSAzNy43ODU5IDg0LjYwODZMNzIuODA0IDExOS40MDNaTTkzLjIyNjcgODAuNkg5Mi45NjUzTDkzLjIyMzkgODAuNTk3M0w5My4yMjY3IDgwLjZaTTkzLjIyNjcgODAuNkwxMzEuODY4IDExOS40OTFMOTIuNzI3MSAxNTguMzg2TDgyLjA2NjEgMTY4Ljc1SDExNy4zMjlMMTYyLjIzOCAxMjMuNjE0QzE2NC41MDQgMTIxLjMzOSAxNjQuNDkyIDExNy42NTggMTYyLjIxNCAxMTUuMzk1TDEyNy4xOTYgODAuNkg5My4yMjY3WiIgZmlsbD0iYmxhY2siLz4KPC9nPgo8L2c+CjxkZWZzPgo8ZmlsdGVyIGlkPSJmaWx0ZXIwX2ZfNzAzN183NiIgeD0iLTcwLjUwMDciIHk9Ii01NC40ODM5IiB3aWR0aD0iNDQ0Ljk2NyIgaGVpZ2h0PSIzNTIuNjgxIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjM4LjQ2MTUiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl83MDM3Xzc2Ii8+CjwvZmlsdGVyPgo8ZmlsdGVyIGlkPSJmaWx0ZXIxX2ZfNzAzN183NiIgeD0iLTEyNS4zOTkiIHk9Ii0xMjkuNjc5IiB3aWR0aD0iMjc0LjY4NSIgaGVpZ2h0PSIyOTAuMjQxIiBmaWx0ZXJVbml0cz0idXNlclNwYWNlT25Vc2UiIGNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycz0ic1JHQiI+CjxmZUZsb29kIGZsb29kLW9wYWNpdHk9IjAiIHJlc3VsdD0iQmFja2dyb3VuZEltYWdlRml4Ii8+CjxmZUJsZW5kIG1vZGU9Im5vcm1hbCIgaW49IlNvdXJjZUdyYXBoaWMiIGluMj0iQmFja2dyb3VuZEltYWdlRml4IiByZXN1bHQ9InNoYXBlIi8+CjxmZUdhdXNzaWFuQmx1ciBzdGREZXZpYXRpb249IjM4LjQ2MTUiIHJlc3VsdD0iZWZmZWN0MV9mb3JlZ3JvdW5kQmx1cl83MDM3Xzc2Ii8+CjwvZmlsdGVyPgo8ZmlsdGVyIGlkPSJmaWx0ZXIyX2ZfNzAzN183NiIgeD0iLTE4OC4zNDIiIHk9IjUyLjg0NTEiIHdpZHRoPSIzNDcuNTQiIGhlaWdodD0iMzMxLjYwMyIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzOC40NjE1IiByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfNzAzN183NiIvPgo8L2ZpbHRlcj4KPGZpbHRlciBpZD0iZmlsdGVyM19mXzcwMzdfNzYiIHg9Ii0xNS45MzQ4IiB5PSItMTg5LjY1NiIgd2lkdGg9IjMzNi4wODYiIGhlaWdodD0iMzAwLjg2MyIgZmlsdGVyVW5pdHM9InVzZXJTcGFjZU9uVXNlIiBjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnM9InNSR0IiPgo8ZmVGbG9vZCBmbG9vZC1vcGFjaXR5PSIwIiByZXN1bHQ9IkJhY2tncm91bmRJbWFnZUZpeCIvPgo8ZmVCbGVuZCBtb2RlPSJub3JtYWwiIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9IkJhY2tncm91bmRJbWFnZUZpeCIgcmVzdWx0PSJzaGFwZSIvPgo8ZmVHYXVzc2lhbkJsdXIgc3RkRGV2aWF0aW9uPSIzOC40NjE1IiByZXN1bHQ9ImVmZmVjdDFfZm9yZWdyb3VuZEJsdXJfNzAzN183NiIvPgo8L2ZpbHRlcj4KPGNsaXBQYXRoIGlkPSJjbGlwMF83MDM3Xzc2Ij4KPHJlY3Qgd2lkdGg9IjIwMCIgaGVpZ2h0PSIyMDAiIHJ4PSIzMiIgZmlsbD0id2hpdGUiLz4KPC9jbGlwUGF0aD4KPC9kZWZzPgo8L3N2Zz4K';\n\n/**\n * Bitget network type\n */\ntype BitgetNetwork = 'livenet' | 'testnet' | 'signet';\n\n/**\n * Bitget Wallet Connector\n *\n * @see https://web3.bitget.com/en/docs/connect/mainnet/btc/\n */\nexport class BitgetConnector extends BaseConnector {\n readonly id = 'bitget';\n readonly name = 'Bitget Wallet';\n readonly icon = BITGET_ICON;\n\n private _removeAccountChangeListener: (() => void) | null = null;\n private _removeNetworkChangeListener: (() => void) | null = null;\n\n protected getProvider(): BitgetBitcoinProvider | undefined {\n if (typeof window === 'undefined') return undefined;\n return window.bitkeep?.unisat;\n }\n\n async connect(network: BitcoinNetwork = 'mainnet'): Promise<WalletAccount> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n const accounts = await provider.requestAccounts();\n if (!accounts || accounts.length === 0) {\n throw new Error('No accounts found');\n }\n\n // Switch network if needed\n await this.ensureNetwork(provider, network);\n\n const publicKey = await provider.getPublicKey();\n\n // Setup event listeners\n this.setupEventListeners();\n\n return {\n address: accounts[0] ?? '',\n publicKey,\n type: this.inferAddressType(accounts[0] ?? ''),\n };\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private async ensureNetwork(provider: BitgetBitcoinProvider, network: BitcoinNetwork): Promise<void> {\n const currentNetwork = await provider.getNetwork();\n const targetNetwork = this.mapToBitgetNetwork(network);\n\n if (currentNetwork !== targetNetwork) {\n await provider.switchNetwork(targetNetwork);\n }\n }\n\n private setupEventListeners(): void {\n const provider = this.getProvider();\n if (!provider) return;\n\n // Remove existing listeners\n this.removeEventListeners();\n\n // Account change listener\n const handleAccountsChanged = (accounts: string[]) => {\n if (!accounts || accounts.length === 0) {\n this.emitAccountsChanged([]);\n return;\n }\n\n provider.getPublicKey().then((publicKey) => {\n const walletAccounts: WalletAccount[] = accounts.map((address) => ({\n address,\n publicKey,\n type: this.inferAddressType(address),\n }));\n this.emitAccountsChanged(walletAccounts);\n }).catch(() => {\n this.emitAccountsChanged([]);\n });\n };\n\n // Network change listener\n const handleNetworkChanged = (network: string) => {\n const btcNetwork = this.mapNetwork(network);\n this.emitNetworkChanged(btcNetwork);\n };\n\n provider.on('accountsChanged', handleAccountsChanged);\n provider.on('networkChanged', handleNetworkChanged);\n\n this._removeAccountChangeListener = () => {\n provider.removeListener('accountsChanged', handleAccountsChanged);\n };\n this._removeNetworkChangeListener = () => {\n provider.removeListener('networkChanged', handleNetworkChanged);\n };\n }\n\n private removeEventListeners(): void {\n this._removeAccountChangeListener?.();\n this._removeAccountChangeListener = null;\n\n this._removeNetworkChangeListener?.();\n this._removeNetworkChangeListener = null;\n }\n\n async disconnect(): Promise<void> {\n this.removeEventListeners();\n this.cleanup();\n }\n\n async getAccounts(): Promise<WalletAccount[]> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n const addresses = await provider.getAccounts();\n const publicKey = await provider.getPublicKey();\n\n return addresses.map((address) => ({\n address,\n publicKey,\n type: this.inferAddressType(address),\n }));\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async signMessage(message: string): Promise<string> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n return await provider.signMessage(message);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async signPsbt(psbtHex: string, options?: SignPsbtOptions): Promise<string> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n // Bitget uses same API as Unisat - pass options directly if provided\n return await provider.signPsbt(psbtHex, options);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async signPsbts(psbtHexs: string[], options?: SignPsbtOptions): Promise<string[]> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n const bitgetOptions: BitgetSignPsbtOptions = {\n autoFinalized: options?.autoFinalize ?? true,\n };\n\n if (options?.toSignInputs) {\n bitgetOptions.toSignInputs = options.toSignInputs;\n }\n\n // Create options array for each PSBT\n const optionsArray = psbtHexs.map(() => bitgetOptions);\n\n return await provider.signPsbts(psbtHexs, optionsArray);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async sendTransaction(to: string, satoshis: number): Promise<string> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n return await provider.sendBitcoin(to, satoshis);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async getNetwork(): Promise<BitcoinNetwork> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n const network = await provider.getNetwork();\n return this.mapNetwork(network);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n async switchNetwork(network: BitcoinNetwork): Promise<void> {\n this.ensureInstalled();\n const provider = this.getProvider()!;\n\n try {\n const bitgetNetwork = this.mapToBitgetNetwork(network);\n await provider.switchNetwork(bitgetNetwork);\n } catch (error) {\n this.handleError(error);\n }\n }\n\n private mapNetwork(network: string): BitcoinNetwork {\n switch (network.toLowerCase()) {\n case 'livenet':\n case 'mainnet':\n return 'mainnet';\n case 'testnet':\n return 'testnet';\n case 'signet':\n return 'signet';\n default:\n return 'mainnet';\n }\n }\n\n private mapToBitgetNetwork(network: BitcoinNetwork): BitgetNetwork {\n switch (network) {\n case 'mainnet':\n return 'livenet';\n case 'testnet':\n case 'testnet4':\n return 'testnet';\n case 'signet':\n return 'signet';\n default:\n return 'livenet';\n }\n }\n}\n"]}