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 @@
1
+ {"version":3,"sources":["../src/utils/mempool.ts","../src/utils/blockstream.ts","../src/utils/btc-service.ts","../src/utils/psbt-builder.ts"],"names":["address","fetchWithTimeout","estimatedVBytes","estimatedFee"],"mappings":"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","sourcesContent":["import type { BitcoinNetwork } from 'otx-btc-wallet-core';\nimport type {\n IBtcService,\n Utxo,\n UtxoWithTx,\n FeeRates,\n Transaction,\n FullTransaction,\n AddressBalance,\n NetworkEndpoints,\n} from './types';\n\n/**\n * Default API endpoints for mempool.space\n */\nconst DEFAULT_MEMPOOL_ENDPOINTS: Record<BitcoinNetwork, string> = {\n mainnet: 'https://mempool.space/api',\n testnet: 'https://mempool.space/testnet/api',\n testnet4: 'https://mempool.space/testnet4/api',\n signet: 'https://mempool.space/signet/api',\n};\n\n/**\n * Fetch with timeout helper\n */\nasync function fetchWithTimeout(\n url: string,\n options?: RequestInit,\n timeout: number = 10000\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\n/**\n * Mempool.space Bitcoin Service\n *\n * @see https://mempool.space/docs/api\n *\n * @example\n * ```typescript\n * // Default usage\n * const service = new MempoolService('mainnet');\n *\n * // With custom endpoints\n * const service = new MempoolService('mainnet', {\n * mainnet: 'https://my-mempool-proxy.com/api',\n * testnet: 'https://my-mempool-proxy.com/testnet/api',\n * });\n * ```\n */\nexport class MempoolService implements IBtcService {\n readonly name = 'mempool';\n private _network: BitcoinNetwork;\n private _customEndpoints: NetworkEndpoints;\n\n constructor(network: BitcoinNetwork = 'mainnet', customEndpoints?: NetworkEndpoints) {\n this._network = network;\n this._customEndpoints = customEndpoints ?? {};\n }\n\n get network(): BitcoinNetwork {\n return this._network;\n }\n\n private get baseUrl(): string {\n // Use custom endpoint if provided, otherwise use default\n return this._customEndpoints[this._network] ?? DEFAULT_MEMPOOL_ENDPOINTS[this._network];\n }\n\n setNetwork(network: BitcoinNetwork): void {\n this._network = network;\n }\n\n /**\n * Set custom endpoints for this service\n */\n setCustomEndpoints(endpoints: NetworkEndpoints): void {\n this._customEndpoints = { ...this._customEndpoints, ...endpoints };\n }\n\n /**\n * Get current endpoints configuration\n */\n getEndpoints(): Record<BitcoinNetwork, string> {\n return {\n mainnet: this._customEndpoints.mainnet ?? DEFAULT_MEMPOOL_ENDPOINTS.mainnet,\n testnet: this._customEndpoints.testnet ?? DEFAULT_MEMPOOL_ENDPOINTS.testnet,\n testnet4: this._customEndpoints.testnet4 ?? DEFAULT_MEMPOOL_ENDPOINTS.testnet4,\n signet: this._customEndpoints.signet ?? DEFAULT_MEMPOOL_ENDPOINTS.signet,\n };\n }\n\n // ============ UTXO Methods ============\n\n async getUtxos(address: string): Promise<Utxo[]> {\n const response = await fetchWithTimeout(`${this.baseUrl}/address/${address}/utxo`);\n\n if (!response.ok) {\n throw new Error(`Mempool API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<Utxo[]>;\n }\n\n async getUtxosWithTxHex(address: string): Promise<UtxoWithTx[]> {\n const utxos = await this.getUtxos(address);\n\n const utxosWithTx = await Promise.all(\n utxos.map(async (utxo): Promise<UtxoWithTx> => {\n const txHex = await this.getTxHex(utxo.txid);\n return { ...utxo, txHex };\n })\n );\n\n return utxosWithTx;\n }\n\n // ============ Transaction Methods ============\n\n async getTxHex(txid: string): Promise<string> {\n const response = await fetchWithTimeout(`${this.baseUrl}/tx/${txid}/hex`);\n\n if (!response.ok) {\n throw new Error(`Mempool API error: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n }\n\n async getTransaction(txid: string): Promise<Transaction> {\n const response = await fetchWithTimeout(`${this.baseUrl}/tx/${txid}`);\n\n if (!response.ok) {\n throw new Error(`Mempool API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<Transaction>;\n }\n\n async getFullTransaction(txid: string): Promise<FullTransaction> {\n const response = await fetchWithTimeout(`${this.baseUrl}/tx/${txid}`);\n\n if (!response.ok) {\n throw new Error(`Mempool API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<FullTransaction>;\n }\n\n async broadcastTransaction(txHex: string): Promise<string> {\n const response = await fetchWithTimeout(\n `${this.baseUrl}/tx`,\n {\n method: 'POST',\n body: txHex,\n headers: { 'Content-Type': 'text/plain' },\n },\n 30000\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Mempool broadcast error: ${error}`);\n }\n\n return response.text();\n }\n\n // ============ Address Methods ============\n\n async getAddressInfo(address: string): Promise<AddressBalance> {\n const response = await fetchWithTimeout(`${this.baseUrl}/address/${address}`);\n\n if (!response.ok) {\n throw new Error(`Mempool API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<AddressBalance>;\n }\n\n async getBalance(address: string): Promise<number> {\n const info = await this.getAddressInfo(address);\n const confirmedBalance =\n info.chain_stats.funded_txo_sum - info.chain_stats.spent_txo_sum;\n const unconfirmedBalance =\n info.mempool_stats.funded_txo_sum - info.mempool_stats.spent_txo_sum;\n return confirmedBalance + unconfirmedBalance;\n }\n\n async getConfirmedBalance(address: string): Promise<number> {\n const info = await this.getAddressInfo(address);\n return info.chain_stats.funded_txo_sum - info.chain_stats.spent_txo_sum;\n }\n\n // ============ Fee Methods ============\n\n async getFeeRates(): Promise<FeeRates> {\n const response = await fetchWithTimeout(`${this.baseUrl}/v1/fees/recommended`);\n\n if (!response.ok) {\n throw new Error(`Mempool API error: ${response.status} ${response.statusText}`);\n }\n\n const fees = (await response.json()) as {\n fastestFee: number;\n halfHourFee: number;\n hourFee: number;\n economyFee: number;\n minimumFee: number;\n };\n return {\n fastest: fees.fastestFee,\n halfHour: fees.halfHourFee,\n hour: fees.hourFee,\n economy: fees.economyFee,\n minimum: fees.minimumFee,\n };\n }\n}\n","import type { BitcoinNetwork } from 'otx-btc-wallet-core';\nimport type {\n IBtcService,\n Utxo,\n UtxoWithTx,\n FeeRates,\n Transaction,\n FullTransaction,\n AddressBalance,\n NetworkEndpoints,\n} from './types';\n\n/**\n * Default API endpoints for blockstream.info\n * Note: Blockstream doesn't support testnet4 and signet, fallback to mempool for those\n */\nconst DEFAULT_BLOCKSTREAM_ENDPOINTS: Record<BitcoinNetwork, string> = {\n mainnet: 'https://blockstream.info/api',\n testnet: 'https://blockstream.info/testnet/api',\n testnet4: 'https://mempool.space/testnet4/api', // Fallback to mempool\n signet: 'https://mempool.space/signet/api', // Fallback to mempool\n};\n\n/**\n * Fetch with timeout helper\n */\nasync function fetchWithTimeout(\n url: string,\n options?: RequestInit,\n timeout: number = 10000\n): Promise<Response> {\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeout);\n\n try {\n const response = await fetch(url, {\n ...options,\n signal: controller.signal,\n });\n clearTimeout(timeoutId);\n return response;\n } catch (error) {\n clearTimeout(timeoutId);\n throw error;\n }\n}\n\n/**\n * Blockstream.info Bitcoin Service\n *\n * @see https://github.com/Blockstream/esplora/blob/master/API.md\n *\n * @example\n * ```typescript\n * // Default usage\n * const service = new BlockstreamService('mainnet');\n *\n * // With custom endpoints\n * const service = new BlockstreamService('mainnet', {\n * mainnet: 'https://my-esplora-proxy.com/api',\n * testnet: 'https://my-esplora-proxy.com/testnet/api',\n * });\n * ```\n */\nexport class BlockstreamService implements IBtcService {\n readonly name = 'blockstream';\n private _network: BitcoinNetwork;\n private _customEndpoints: NetworkEndpoints;\n\n constructor(network: BitcoinNetwork = 'mainnet', customEndpoints?: NetworkEndpoints) {\n this._network = network;\n this._customEndpoints = customEndpoints ?? {};\n }\n\n get network(): BitcoinNetwork {\n return this._network;\n }\n\n private get baseUrl(): string {\n // Use custom endpoint if provided, otherwise use default\n return this._customEndpoints[this._network] ?? DEFAULT_BLOCKSTREAM_ENDPOINTS[this._network];\n }\n\n setNetwork(network: BitcoinNetwork): void {\n this._network = network;\n }\n\n /**\n * Set custom endpoints for this service\n */\n setCustomEndpoints(endpoints: NetworkEndpoints): void {\n this._customEndpoints = { ...this._customEndpoints, ...endpoints };\n }\n\n /**\n * Get current endpoints configuration\n */\n getEndpoints(): Record<BitcoinNetwork, string> {\n return {\n mainnet: this._customEndpoints.mainnet ?? DEFAULT_BLOCKSTREAM_ENDPOINTS.mainnet,\n testnet: this._customEndpoints.testnet ?? DEFAULT_BLOCKSTREAM_ENDPOINTS.testnet,\n testnet4: this._customEndpoints.testnet4 ?? DEFAULT_BLOCKSTREAM_ENDPOINTS.testnet4,\n signet: this._customEndpoints.signet ?? DEFAULT_BLOCKSTREAM_ENDPOINTS.signet,\n };\n }\n\n // ============ UTXO Methods ============\n\n async getUtxos(address: string): Promise<Utxo[]> {\n const response = await fetchWithTimeout(`${this.baseUrl}/address/${address}/utxo`);\n\n if (!response.ok) {\n throw new Error(`Blockstream API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<Utxo[]>;\n }\n\n async getUtxosWithTxHex(address: string): Promise<UtxoWithTx[]> {\n const utxos = await this.getUtxos(address);\n\n const utxosWithTx = await Promise.all(\n utxos.map(async (utxo): Promise<UtxoWithTx> => {\n const txHex = await this.getTxHex(utxo.txid);\n return { ...utxo, txHex };\n })\n );\n\n return utxosWithTx;\n }\n\n // ============ Transaction Methods ============\n\n async getTxHex(txid: string): Promise<string> {\n const response = await fetchWithTimeout(`${this.baseUrl}/tx/${txid}/hex`);\n\n if (!response.ok) {\n throw new Error(`Blockstream API error: ${response.status} ${response.statusText}`);\n }\n\n return response.text();\n }\n\n async getTransaction(txid: string): Promise<Transaction> {\n const response = await fetchWithTimeout(`${this.baseUrl}/tx/${txid}`);\n\n if (!response.ok) {\n throw new Error(`Blockstream API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<Transaction>;\n }\n\n async getFullTransaction(txid: string): Promise<FullTransaction> {\n const response = await fetchWithTimeout(`${this.baseUrl}/tx/${txid}`);\n\n if (!response.ok) {\n throw new Error(`Blockstream API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<FullTransaction>;\n }\n\n async broadcastTransaction(txHex: string): Promise<string> {\n const response = await fetchWithTimeout(\n `${this.baseUrl}/tx`,\n {\n method: 'POST',\n body: txHex,\n headers: { 'Content-Type': 'text/plain' },\n },\n 30000\n );\n\n if (!response.ok) {\n const error = await response.text();\n throw new Error(`Blockstream broadcast error: ${error}`);\n }\n\n return response.text();\n }\n\n // ============ Address Methods ============\n\n async getAddressInfo(address: string): Promise<AddressBalance> {\n const response = await fetchWithTimeout(`${this.baseUrl}/address/${address}`);\n\n if (!response.ok) {\n throw new Error(`Blockstream API error: ${response.status} ${response.statusText}`);\n }\n\n return response.json() as Promise<AddressBalance>;\n }\n\n async getBalance(address: string): Promise<number> {\n const info = await this.getAddressInfo(address);\n const confirmedBalance =\n info.chain_stats.funded_txo_sum - info.chain_stats.spent_txo_sum;\n const unconfirmedBalance =\n info.mempool_stats.funded_txo_sum - info.mempool_stats.spent_txo_sum;\n return confirmedBalance + unconfirmedBalance;\n }\n\n async getConfirmedBalance(address: string): Promise<number> {\n const info = await this.getAddressInfo(address);\n return info.chain_stats.funded_txo_sum - info.chain_stats.spent_txo_sum;\n }\n\n // ============ Fee Methods ============\n\n async getFeeRates(): Promise<FeeRates> {\n // Blockstream uses mempool.space fee API format\n const response = await fetchWithTimeout(`${this.baseUrl}/fee-estimates`);\n\n if (!response.ok) {\n throw new Error(`Blockstream API error: ${response.status} ${response.statusText}`);\n }\n\n const fees = (await response.json()) as Record<string, number>;\n // Blockstream returns fee estimates keyed by confirmation target\n // e.g., { \"1\": 25.5, \"2\": 20.1, \"3\": 15.2, ... }\n return {\n fastest: Math.ceil(fees['1'] || fees['2'] || 10),\n halfHour: Math.ceil(fees['3'] || fees['4'] || 8),\n hour: Math.ceil(fees['6'] || fees['12'] || 5),\n economy: Math.ceil(fees['144'] || fees['504'] || 2),\n minimum: Math.ceil(fees['1008'] || 1),\n };\n }\n}\n","import type { BitcoinNetwork } from 'otx-btc-wallet-core';\nimport type {\n IBtcService,\n Utxo,\n UtxoWithTx,\n FeeRates,\n Transaction,\n FullTransaction,\n AddressBalance,\n BtcServiceConfig,\n} from './types';\nimport { MempoolService } from './mempool';\nimport { BlockstreamService } from './blockstream';\n\n/**\n * Global configuration for BtcService\n * This is applied to all new BtcService instances and standalone functions\n */\nlet globalConfig: BtcServiceConfig = {};\n\n/**\n * Configure global BtcService settings\n *\n * @example\n * ```typescript\n * import { configureBtcService } from 'otx-btc-wallet-connectors';\n *\n * // Use custom mempool instance\n * configureBtcService({\n * mempool: {\n * mainnet: 'https://my-mempool.com/api',\n * testnet: 'https://my-mempool.com/testnet/api',\n * }\n * });\n *\n * // Use only mempool provider (no race)\n * configureBtcService({\n * preferredProvider: 'mempool',\n * mempool: {\n * mainnet: 'https://custom-api.example.com/api',\n * }\n * });\n *\n * // Reset to defaults\n * configureBtcService({});\n * ```\n */\nexport function configureBtcService(config: BtcServiceConfig): void {\n globalConfig = config;\n // Reset default service so it picks up new config\n defaultService = null;\n}\n\n/**\n * Get current global BtcService configuration\n */\nexport function getBtcServiceConfig(): BtcServiceConfig {\n return { ...globalConfig };\n}\n\n/**\n * Race promises and return first result\n */\nfunction race<T>(promises: Promise<T>[]): Promise<T> {\n return Promise.race(promises);\n}\n\n/**\n * Bitcoin Service that combines Mempool and Blockstream APIs\n * Uses Promise.race for reliability and speed\n *\n * @example\n * ```typescript\n * // Default usage\n * const btcService = new BtcService('mainnet');\n *\n * // With custom configuration\n * const btcService = new BtcService('mainnet', {\n * mempool: {\n * mainnet: 'https://my-mempool-proxy.com/api',\n * },\n * preferredProvider: 'mempool', // Only use mempool\n * });\n *\n * // Get balance (uses fastest responding API if preferredProvider is 'race')\n * const balance = await btcService.getBalance('bc1q...');\n *\n * // Get UTXOs with tx hex (for Ledger signing)\n * const utxos = await btcService.getUtxosWithTxHex('bc1q...');\n *\n * // Broadcast transaction\n * const txid = await btcService.broadcastTransaction(signedTxHex);\n * ```\n */\nexport class BtcService implements IBtcService {\n readonly name = 'btc-service';\n private _network: BitcoinNetwork;\n private _mempool: MempoolService;\n private _blockstream: BlockstreamService;\n private _config: BtcServiceConfig;\n\n constructor(network: BitcoinNetwork = 'mainnet', config?: BtcServiceConfig) {\n this._network = network;\n // Merge with global config, instance config takes precedence\n this._config = { ...globalConfig, ...config };\n this._mempool = new MempoolService(network, this._config.mempool);\n this._blockstream = new BlockstreamService(network, this._config.blockstream);\n }\n\n get network(): BitcoinNetwork {\n return this._network;\n }\n\n /**\n * Get the underlying Mempool service for direct access\n */\n get mempool(): MempoolService {\n return this._mempool;\n }\n\n /**\n * Get the underlying Blockstream service for direct access\n */\n get blockstream(): BlockstreamService {\n return this._blockstream;\n }\n\n /**\n * Get current configuration\n */\n get config(): BtcServiceConfig {\n return { ...this._config };\n }\n\n setNetwork(network: BitcoinNetwork): void {\n this._network = network;\n this._mempool.setNetwork(network);\n this._blockstream.setNetwork(network);\n }\n\n /**\n * Update configuration\n */\n setConfig(config: BtcServiceConfig): void {\n this._config = { ...this._config, ...config };\n if (config.mempool) {\n this._mempool.setCustomEndpoints(config.mempool);\n }\n if (config.blockstream) {\n this._blockstream.setCustomEndpoints(config.blockstream);\n }\n }\n\n /**\n * Execute method based on preferred provider setting\n */\n private async executeWithProvider<T>(\n mempoolFn: () => Promise<T>,\n blockstreamFn: () => Promise<T>\n ): Promise<T> {\n const provider = this._config.preferredProvider ?? 'race';\n\n switch (provider) {\n case 'mempool':\n return mempoolFn();\n case 'blockstream':\n return blockstreamFn();\n case 'race':\n default:\n return race([mempoolFn(), blockstreamFn()]);\n }\n }\n\n // ============ UTXO Methods ============\n\n async getUtxos(address: string): Promise<Utxo[]> {\n return this.executeWithProvider(\n () => this._mempool.getUtxos(address),\n () => this._blockstream.getUtxos(address)\n );\n }\n\n async getUtxosWithTxHex(address: string): Promise<UtxoWithTx[]> {\n return this.executeWithProvider(\n () => this._mempool.getUtxosWithTxHex(address),\n () => this._blockstream.getUtxosWithTxHex(address)\n );\n }\n\n // ============ Transaction Methods ============\n\n async getTxHex(txid: string): Promise<string> {\n return this.executeWithProvider(\n () => this._mempool.getTxHex(txid),\n () => this._blockstream.getTxHex(txid)\n );\n }\n\n async getTransaction(txid: string): Promise<Transaction> {\n return this.executeWithProvider(\n () => this._mempool.getTransaction(txid),\n () => this._blockstream.getTransaction(txid)\n );\n }\n\n async getFullTransaction(txid: string): Promise<FullTransaction> {\n return this.executeWithProvider(\n () => this._mempool.getFullTransaction(txid),\n () => this._blockstream.getFullTransaction(txid)\n );\n }\n\n async broadcastTransaction(txHex: string): Promise<string> {\n return this.executeWithProvider(\n () => this._mempool.broadcastTransaction(txHex),\n () => this._blockstream.broadcastTransaction(txHex)\n );\n }\n\n // ============ Address Methods ============\n\n async getAddressInfo(address: string): Promise<AddressBalance> {\n return this.executeWithProvider(\n () => this._mempool.getAddressInfo(address),\n () => this._blockstream.getAddressInfo(address)\n );\n }\n\n async getBalance(address: string): Promise<number> {\n return this.executeWithProvider(\n () => this._mempool.getBalance(address),\n () => this._blockstream.getBalance(address)\n );\n }\n\n async getConfirmedBalance(address: string): Promise<number> {\n return this.executeWithProvider(\n () => this._mempool.getConfirmedBalance(address),\n () => this._blockstream.getConfirmedBalance(address)\n );\n }\n\n // ============ Fee Methods ============\n\n async getFeeRates(): Promise<FeeRates> {\n return this.executeWithProvider(\n () => this._mempool.getFeeRates(),\n () => this._blockstream.getFeeRates()\n );\n }\n}\n\n// ============ Standalone Functions ============\n\n/**\n * Default service instance (mainnet)\n */\nlet defaultService: BtcService | null = null;\n\nfunction getDefaultService(network: BitcoinNetwork = 'mainnet'): BtcService {\n if (!defaultService || defaultService.network !== network) {\n defaultService = new BtcService(network);\n }\n return defaultService;\n}\n\n/**\n * Get UTXOs for an address\n */\nexport async function getUtxos(\n address: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<Utxo[]> {\n return getDefaultService(network).getUtxos(address);\n}\n\n/**\n * Get UTXOs with raw transaction hex\n */\nexport async function getUtxosWithTxHex(\n address: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<UtxoWithTx[]> {\n return getDefaultService(network).getUtxosWithTxHex(address);\n}\n\n/**\n * Get raw transaction hex\n */\nexport async function getTxHex(\n txid: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<string> {\n return getDefaultService(network).getTxHex(txid);\n}\n\n/**\n * Get transaction details\n */\nexport async function getTransaction(\n txid: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<Transaction> {\n return getDefaultService(network).getTransaction(txid);\n}\n\n/**\n * Get full transaction with inputs and outputs (for Trezor refTxs)\n */\nexport async function getFullTransaction(\n txid: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<FullTransaction> {\n return getDefaultService(network).getFullTransaction(txid);\n}\n\n/**\n * Broadcast a signed transaction\n */\nexport async function broadcastTransaction(\n txHex: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<string> {\n return getDefaultService(network).broadcastTransaction(txHex);\n}\n\n/**\n * Get address info\n */\nexport async function getAddressInfo(\n address: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<AddressBalance> {\n return getDefaultService(network).getAddressInfo(address);\n}\n\n/**\n * Get balance for an address\n */\nexport async function getBalance(\n address: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<number> {\n return getDefaultService(network).getBalance(address);\n}\n\n/**\n * Get confirmed balance for an address\n */\nexport async function getConfirmedBalance(\n address: string,\n network: BitcoinNetwork = 'mainnet'\n): Promise<number> {\n return getDefaultService(network).getConfirmedBalance(address);\n}\n\n/**\n * Get current fee rates\n */\nexport async function getFeeRates(\n network: BitcoinNetwork = 'mainnet'\n): Promise<FeeRates> {\n return getDefaultService(network).getFeeRates();\n}\n","/**\n * PSBT Builder Utility\n * Reusable functions for building PSBTs across different wallet connectors\n */\n\nimport type { BitcoinNetwork, AddressType } from 'otx-btc-wallet-core';\nimport * as bitcoin from 'bitcoinjs-lib';\nimport { BtcService } from './btc-service';\n\n/**\n * UTXO type\n */\nexport interface Utxo {\n txid: string;\n vout: number;\n value: number;\n status?: {\n confirmed: boolean;\n block_height?: number;\n };\n}\n\n/**\n * Options for generating a send PSBT\n */\nexport interface GeneratePsbtOptions {\n /** Fee rate in sat/vB */\n feeRate?: number;\n /** Fee rate multiplier */\n feeRateMultiplier?: number;\n}\n\n/**\n * Result from generating a send PSBT\n */\nexport interface GeneratePsbtResult {\n /** The constructed PSBT */\n psbt: bitcoin.Psbt;\n /** PSBT as hex string */\n psbtHex: string;\n /** PSBT as base64 string */\n psbtBase64: string;\n /** Bitcoin network used */\n btcNetwork: bitcoin.Network;\n /** Selected UTXOs used in the transaction */\n selectedUtxos: Utxo[];\n /** Total input value in satoshis */\n totalInputValue: number;\n /** Estimated fee in satoshis */\n estimatedFee: number;\n /** Change amount in satoshis (0 if no change output) */\n changeAmount: number;\n /** Inputs to sign (for wallet APIs that require this) */\n inputsToSign: Array<{ address: string; index: number }>;\n}\n\n/**\n * Helper to convert hex string to Uint8Array\n */\nexport function hexToBytes(hex: string): Uint8Array {\n const cleanHex = hex.replace(/^0x/, '');\n const bytes = new Uint8Array(cleanHex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(cleanHex.substring(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Helper to convert Uint8Array to hex string\n */\nexport function bytesToHex(bytes: Uint8Array): string {\n return Array.from(bytes)\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Helper to convert public key to x-only (for Taproot)\n */\nexport function toXOnly(pubKey: Uint8Array): Uint8Array {\n return pubKey.subarray(1, 33);\n}\n\n/**\n * Get address type from address string\n */\nexport function getAddressType(address: string): AddressType {\n if (address.startsWith('bc1q') || address.startsWith('tb1q')) {\n return 'segwit';\n }\n if (address.startsWith('bc1p') || address.startsWith('tb1p')) {\n return 'taproot';\n }\n if (address.startsWith('3') || address.startsWith('2')) {\n return 'nested-segwit';\n }\n return 'legacy';\n}\n\n/**\n * Get bitcoinjs-lib network object from BitcoinNetwork\n */\nexport function getBitcoinJsNetwork(network: BitcoinNetwork): bitcoin.Network {\n switch (network) {\n case 'mainnet':\n return bitcoin.networks.bitcoin;\n case 'testnet':\n case 'testnet4':\n case 'signet':\n return bitcoin.networks.testnet;\n default:\n return bitcoin.networks.bitcoin;\n }\n}\n\n/**\n * Estimate vBytes per input based on address type\n */\nexport function getInputVBytes(addressType: AddressType): number {\n switch (addressType) {\n case 'taproot':\n return 58; // P2TR input\n case 'segwit':\n return 68; // P2WPKH input\n case 'nested-segwit':\n return 91; // P2SH-P2WPKH input\n default:\n return 148; // P2PKH input\n }\n}\n\n/**\n * Estimate vBytes per output based on address type\n */\nexport function getOutputVBytes(addressType: AddressType): number {\n switch (addressType) {\n case 'taproot':\n return 43; // P2TR output\n case 'segwit':\n return 31; // P2WPKH output\n case 'nested-segwit':\n return 32; // P2SH output\n default:\n return 34; // P2PKH output\n }\n}\n\n/**\n * Get dust threshold for address type\n */\nexport function getDustThreshold(addressType: AddressType): number {\n return addressType === 'legacy' ? 546 : 294;\n}\n\n/**\n * Select UTXOs for transaction using a simple greedy algorithm\n */\nexport function selectUtxos(\n utxos: Utxo[],\n fromAddressType: AddressType,\n toAddressType: AddressType,\n amount: number,\n feeRate: number\n): { selectedUtxos: Utxo[]; totalValue: number; estimatedFee: number } {\n const inputVBytes = getInputVBytes(fromAddressType);\n const outputVBytes = getOutputVBytes(toAddressType);\n const baseVBytes = 10.5; // Base transaction overhead\n\n // Sort UTXOs by value (descending) for better selection\n const sortedUtxos = [...utxos].sort((a, b) => b.value - a.value);\n\n const selectedUtxos: Utxo[] = [];\n let totalValue = 0;\n\n for (const utxo of sortedUtxos) {\n selectedUtxos.push(utxo);\n totalValue += utxo.value;\n\n // Calculate fee with current selection (2 outputs: recipient + change)\n const estimatedVBytes =\n baseVBytes + selectedUtxos.length * inputVBytes + 2 * outputVBytes;\n const estimatedFee = Math.ceil(estimatedVBytes * feeRate);\n\n if (totalValue >= amount + estimatedFee) {\n return { selectedUtxos, totalValue, estimatedFee };\n }\n }\n\n // If we get here, we don't have enough funds\n // Return what we have and let the caller handle the error\n const estimatedVBytes =\n baseVBytes + selectedUtxos.length * inputVBytes + 2 * outputVBytes;\n const estimatedFee = Math.ceil(estimatedVBytes * feeRate);\n\n return { selectedUtxos, totalValue, estimatedFee };\n}\n\n/**\n * Generate a PSBT for sending Bitcoin\n *\n * @param toAddress - Recipient address\n * @param amount - Amount to send in satoshis\n * @param fromAddress - Sender address\n * @param publicKey - Sender's public key (hex string)\n * @param network - Bitcoin network\n * @param options - Additional options (feeRate, feeRateMultiplier)\n * @returns GeneratePsbtResult containing the PSBT and related info\n */\nexport async function generatePsbtForSend(\n toAddress: string,\n amount: number,\n fromAddress: string,\n publicKey: string,\n network: BitcoinNetwork,\n options?: GeneratePsbtOptions\n): Promise<GeneratePsbtResult> {\n const btcService = new BtcService(network);\n const btcNetwork = getBitcoinJsNetwork(network);\n\n // 1. Get UTXOs (only confirmed)\n const allUtxos = await btcService.getUtxos(fromAddress);\n const confirmedUtxos = allUtxos.filter(\n (utxo) => utxo.status?.confirmed !== false\n );\n\n if (confirmedUtxos.length === 0) {\n throw new Error('No confirmed UTXOs available for spending');\n }\n\n // 2. Get fee rate\n let feeRate = options?.feeRate;\n if (!feeRate) {\n const feeRates = await btcService.getFeeRates();\n feeRate = feeRates.hour;\n }\n if (options?.feeRateMultiplier) {\n feeRate = Math.ceil(feeRate * options.feeRateMultiplier);\n }\n\n // 3. Get address types\n const fromAddressType = getAddressType(fromAddress);\n const toAddressType = getAddressType(toAddress);\n\n // 4. Select UTXOs\n const { selectedUtxos, totalValue, estimatedFee } = selectUtxos(\n confirmedUtxos,\n fromAddressType,\n toAddressType,\n amount,\n feeRate\n );\n\n if (totalValue < amount + estimatedFee) {\n throw new Error(\n `Insufficient funds. Available: ${totalValue} sats, Required: ${amount + estimatedFee} sats (including fee)`\n );\n }\n\n // 5. Calculate change\n const dustThreshold = getDustThreshold(fromAddressType);\n let changeAmount = totalValue - amount - estimatedFee;\n\n // If change is below dust threshold, add it to fee\n if (changeAmount > 0 && changeAmount <= dustThreshold) {\n changeAmount = 0;\n }\n\n // 6. Build PSBT\n const psbt = new bitcoin.Psbt({ network: btcNetwork });\n const publicKeyBytes = hexToBytes(publicKey);\n const inputsToSign: Array<{ address: string; index: number }> = [];\n\n // Add inputs\n for (let i = 0; i < selectedUtxos.length; i++) {\n const utxo = selectedUtxos[i]!;\n const script = bitcoin.address.toOutputScript(fromAddress, btcNetwork);\n\n if (fromAddressType === 'taproot') {\n // P2TR - Taproot\n psbt.addInput({\n hash: utxo.txid,\n index: utxo.vout,\n witnessUtxo: {\n script,\n value: BigInt(utxo.value),\n },\n tapInternalKey: toXOnly(publicKeyBytes),\n });\n } else if (fromAddressType === 'segwit') {\n // P2WPKH - Native SegWit\n psbt.addInput({\n hash: utxo.txid,\n index: utxo.vout,\n witnessUtxo: {\n script,\n value: BigInt(utxo.value),\n },\n });\n } else if (fromAddressType === 'nested-segwit') {\n // P2SH-P2WPKH - Nested SegWit\n const p2wpkh = bitcoin.payments.p2wpkh({\n pubkey: publicKeyBytes,\n network: btcNetwork,\n });\n if (!p2wpkh.output) {\n throw new Error('Failed to generate P2WPKH redeem script');\n }\n psbt.addInput({\n hash: utxo.txid,\n index: utxo.vout,\n witnessUtxo: {\n script,\n value: BigInt(utxo.value),\n },\n redeemScript: p2wpkh.output,\n });\n } else {\n // Legacy P2PKH\n psbt.addInput({\n hash: utxo.txid,\n index: utxo.vout,\n witnessUtxo: {\n script,\n value: BigInt(utxo.value),\n },\n });\n }\n\n inputsToSign.push({ address: fromAddress, index: i });\n }\n\n // Add recipient output\n psbt.addOutput({\n address: toAddress,\n value: BigInt(amount),\n });\n\n // Add change output if needed\n if (changeAmount > 0) {\n psbt.addOutput({\n address: fromAddress,\n value: BigInt(Math.floor(changeAmount)),\n });\n }\n\n return {\n psbt,\n psbtHex: psbt.toHex(),\n psbtBase64: psbt.toBase64(),\n btcNetwork,\n selectedUtxos,\n totalInputValue: totalValue,\n estimatedFee,\n changeAmount,\n inputsToSign,\n };\n}\n\n/**\n * Finalize all inputs in a signed PSBT\n */\nexport function finalizeAllInputs(\n signedPsbt: bitcoin.Psbt,\n inputCount: number\n): void {\n for (let i = 0; i < inputCount; i++) {\n try {\n signedPsbt.finalizeInput(i);\n } catch (finalizeError) {\n console.warn(\n `Failed to finalize input ${i}, attempting alternative finalization:`,\n finalizeError\n );\n // For complex input types, try finalization with empty witness\n try {\n signedPsbt.finalizeInput(i, () => ({\n finalScriptSig: undefined,\n finalScriptWitness: undefined,\n }));\n } catch {\n // If that also fails, just skip - the transaction might still work\n console.warn(`Could not finalize input ${i}`);\n }\n }\n }\n}\n\n/**\n * Extract and broadcast a signed PSBT\n *\n * @param signedPsbtHex - Signed PSBT hex string\n * @param network - Bitcoin network\n * @param inputCount - Number of inputs to finalize\n * @returns Transaction ID\n */\nexport async function finalizeAndBroadcast(\n signedPsbtHex: string,\n network: BitcoinNetwork,\n inputCount: number\n): Promise<string> {\n const btcNetwork = getBitcoinJsNetwork(network);\n const btcService = new BtcService(network);\n\n // Parse signed PSBT\n const signedPsbt = bitcoin.Psbt.fromHex(signedPsbtHex, { network: btcNetwork });\n\n // Finalize all inputs\n finalizeAllInputs(signedPsbt, inputCount);\n\n // Extract transaction\n const tx = signedPsbt.extractTransaction();\n const txHex = tx.toHex();\n\n // Broadcast\n return await btcService.broadcastTransaction(txHex);\n}\n\n/**\n * Derive Bitcoin address from public key based on address type\n *\n * @param publicKeyHex - Public key in hex format (33 bytes compressed)\n * @param addressType - Type of address to derive (legacy, nested-segwit, segwit, taproot)\n * @param network - Bitcoin network\n * @returns Derived Bitcoin address\n */\nexport function deriveAddressFromPublicKey(\n publicKeyHex: string,\n addressType: AddressType,\n network: BitcoinNetwork\n): string {\n const btcNetwork = getBitcoinJsNetwork(network);\n const publicKeyBytes = hexToBytes(publicKeyHex);\n\n switch (addressType) {\n case 'legacy': {\n // P2PKH - Legacy address (starts with 1 or m/n)\n const p2pkh = bitcoin.payments.p2pkh({\n pubkey: publicKeyBytes,\n network: btcNetwork,\n });\n if (!p2pkh.address) {\n throw new Error('Failed to derive legacy address from public key');\n }\n return p2pkh.address;\n }\n\n case 'nested-segwit': {\n // P2SH-P2WPKH - Nested SegWit (starts with 3 or 2)\n const p2wpkh = bitcoin.payments.p2wpkh({\n pubkey: publicKeyBytes,\n network: btcNetwork,\n });\n const p2sh = bitcoin.payments.p2sh({\n redeem: p2wpkh,\n network: btcNetwork,\n });\n if (!p2sh.address) {\n throw new Error('Failed to derive nested-segwit address from public key');\n }\n return p2sh.address;\n }\n\n case 'segwit': {\n // P2WPKH - Native SegWit (starts with bc1q or tb1q)\n const p2wpkh = bitcoin.payments.p2wpkh({\n pubkey: publicKeyBytes,\n network: btcNetwork,\n });\n if (!p2wpkh.address) {\n throw new Error('Failed to derive segwit address from public key');\n }\n return p2wpkh.address;\n }\n\n case 'taproot': {\n // P2TR - Taproot (starts with bc1p or tb1p)\n const xOnlyPubKey = toXOnly(publicKeyBytes);\n const p2tr = bitcoin.payments.p2tr({\n internalPubkey: xOnlyPubKey,\n network: btcNetwork,\n });\n if (!p2tr.address) {\n throw new Error('Failed to derive taproot address from public key');\n }\n return p2tr.address;\n }\n\n default:\n throw new Error(`Unsupported address type: ${addressType}`);\n }\n}\n"]}
@@ -0,0 +1,200 @@
1
+ 'use strict';
2
+
3
+ var chunkMFXLQWOE_js = require('./chunk-MFXLQWOE.js');
4
+
5
+ // src/bitget/BitgetConnector.ts
6
+ 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";
7
+ var BitgetConnector = class extends chunkMFXLQWOE_js.BaseConnector {
8
+ constructor() {
9
+ super(...arguments);
10
+ this.id = "bitget";
11
+ this.name = "Bitget Wallet";
12
+ this.icon = BITGET_ICON;
13
+ this._removeAccountChangeListener = null;
14
+ this._removeNetworkChangeListener = null;
15
+ }
16
+ getProvider() {
17
+ if (typeof window === "undefined")
18
+ return void 0;
19
+ return window.bitkeep?.unisat;
20
+ }
21
+ async connect(network = "mainnet") {
22
+ this.ensureInstalled();
23
+ const provider = this.getProvider();
24
+ try {
25
+ const accounts = await provider.requestAccounts();
26
+ if (!accounts || accounts.length === 0) {
27
+ throw new Error("No accounts found");
28
+ }
29
+ await this.ensureNetwork(provider, network);
30
+ const publicKey = await provider.getPublicKey();
31
+ this.setupEventListeners();
32
+ return {
33
+ address: accounts[0] ?? "",
34
+ publicKey,
35
+ type: this.inferAddressType(accounts[0] ?? "")
36
+ };
37
+ } catch (error) {
38
+ this.handleError(error);
39
+ }
40
+ }
41
+ async ensureNetwork(provider, network) {
42
+ const currentNetwork = await provider.getNetwork();
43
+ const targetNetwork = this.mapToBitgetNetwork(network);
44
+ if (currentNetwork !== targetNetwork) {
45
+ await provider.switchNetwork(targetNetwork);
46
+ }
47
+ }
48
+ setupEventListeners() {
49
+ const provider = this.getProvider();
50
+ if (!provider)
51
+ return;
52
+ this.removeEventListeners();
53
+ const handleAccountsChanged = (accounts) => {
54
+ if (!accounts || accounts.length === 0) {
55
+ this.emitAccountsChanged([]);
56
+ return;
57
+ }
58
+ provider.getPublicKey().then((publicKey) => {
59
+ const walletAccounts = accounts.map((address) => ({
60
+ address,
61
+ publicKey,
62
+ type: this.inferAddressType(address)
63
+ }));
64
+ this.emitAccountsChanged(walletAccounts);
65
+ }).catch(() => {
66
+ this.emitAccountsChanged([]);
67
+ });
68
+ };
69
+ const handleNetworkChanged = (network) => {
70
+ const btcNetwork = this.mapNetwork(network);
71
+ this.emitNetworkChanged(btcNetwork);
72
+ };
73
+ provider.on("accountsChanged", handleAccountsChanged);
74
+ provider.on("networkChanged", handleNetworkChanged);
75
+ this._removeAccountChangeListener = () => {
76
+ provider.removeListener("accountsChanged", handleAccountsChanged);
77
+ };
78
+ this._removeNetworkChangeListener = () => {
79
+ provider.removeListener("networkChanged", handleNetworkChanged);
80
+ };
81
+ }
82
+ removeEventListeners() {
83
+ this._removeAccountChangeListener?.();
84
+ this._removeAccountChangeListener = null;
85
+ this._removeNetworkChangeListener?.();
86
+ this._removeNetworkChangeListener = null;
87
+ }
88
+ async disconnect() {
89
+ this.removeEventListeners();
90
+ this.cleanup();
91
+ }
92
+ async getAccounts() {
93
+ this.ensureInstalled();
94
+ const provider = this.getProvider();
95
+ try {
96
+ const addresses = await provider.getAccounts();
97
+ const publicKey = await provider.getPublicKey();
98
+ return addresses.map((address) => ({
99
+ address,
100
+ publicKey,
101
+ type: this.inferAddressType(address)
102
+ }));
103
+ } catch (error) {
104
+ this.handleError(error);
105
+ }
106
+ }
107
+ async signMessage(message) {
108
+ this.ensureInstalled();
109
+ const provider = this.getProvider();
110
+ try {
111
+ return await provider.signMessage(message);
112
+ } catch (error) {
113
+ this.handleError(error);
114
+ }
115
+ }
116
+ async signPsbt(psbtHex, options) {
117
+ this.ensureInstalled();
118
+ const provider = this.getProvider();
119
+ try {
120
+ return await provider.signPsbt(psbtHex, options);
121
+ } catch (error) {
122
+ this.handleError(error);
123
+ }
124
+ }
125
+ async signPsbts(psbtHexs, options) {
126
+ this.ensureInstalled();
127
+ const provider = this.getProvider();
128
+ try {
129
+ const bitgetOptions = {
130
+ autoFinalized: options?.autoFinalize ?? true
131
+ };
132
+ if (options?.toSignInputs) {
133
+ bitgetOptions.toSignInputs = options.toSignInputs;
134
+ }
135
+ const optionsArray = psbtHexs.map(() => bitgetOptions);
136
+ return await provider.signPsbts(psbtHexs, optionsArray);
137
+ } catch (error) {
138
+ this.handleError(error);
139
+ }
140
+ }
141
+ async sendTransaction(to, satoshis) {
142
+ this.ensureInstalled();
143
+ const provider = this.getProvider();
144
+ try {
145
+ return await provider.sendBitcoin(to, satoshis);
146
+ } catch (error) {
147
+ this.handleError(error);
148
+ }
149
+ }
150
+ async getNetwork() {
151
+ this.ensureInstalled();
152
+ const provider = this.getProvider();
153
+ try {
154
+ const network = await provider.getNetwork();
155
+ return this.mapNetwork(network);
156
+ } catch (error) {
157
+ this.handleError(error);
158
+ }
159
+ }
160
+ async switchNetwork(network) {
161
+ this.ensureInstalled();
162
+ const provider = this.getProvider();
163
+ try {
164
+ const bitgetNetwork = this.mapToBitgetNetwork(network);
165
+ await provider.switchNetwork(bitgetNetwork);
166
+ } catch (error) {
167
+ this.handleError(error);
168
+ }
169
+ }
170
+ mapNetwork(network) {
171
+ switch (network.toLowerCase()) {
172
+ case "livenet":
173
+ case "mainnet":
174
+ return "mainnet";
175
+ case "testnet":
176
+ return "testnet";
177
+ case "signet":
178
+ return "signet";
179
+ default:
180
+ return "mainnet";
181
+ }
182
+ }
183
+ mapToBitgetNetwork(network) {
184
+ switch (network) {
185
+ case "mainnet":
186
+ return "livenet";
187
+ case "testnet":
188
+ case "testnet4":
189
+ return "testnet";
190
+ case "signet":
191
+ return "signet";
192
+ default:
193
+ return "livenet";
194
+ }
195
+ }
196
+ };
197
+
198
+ exports.BitgetConnector = BitgetConnector;
199
+ //# sourceMappingURL=out.js.map
200
+ //# sourceMappingURL=chunk-HL4WDMGS.js.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"]}