@subwallet/extension-base 1.3.40-0 → 1.3.42-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 (232) hide show
  1. package/background/KoniTypes.d.ts +121 -4
  2. package/background/KoniTypes.js +18 -0
  3. package/background/errors/BitcoinProviderError.d.ts +6 -0
  4. package/background/errors/BitcoinProviderError.js +47 -0
  5. package/cjs/background/KoniTypes.js +20 -1
  6. package/cjs/background/errors/BitcoinProviderError.js +54 -0
  7. package/cjs/constants/bitcoin.js +22 -0
  8. package/cjs/constants/environment.js +4 -2
  9. package/cjs/constants/index.js +16 -1
  10. package/cjs/core/logic-validation/recipientAddress.js +9 -0
  11. package/cjs/core/logic-validation/transfer.js +25 -5
  12. package/cjs/core/types.js +1 -0
  13. package/cjs/core/utils.js +15 -1
  14. package/cjs/koni/background/handlers/Extension.js +96 -41
  15. package/cjs/koni/background/handlers/State.js +52 -11
  16. package/cjs/packageInfo.js +1 -1
  17. package/cjs/services/balance-service/helpers/subscribe/bitcoin.js +94 -0
  18. package/cjs/services/balance-service/helpers/subscribe/evm.js +6 -1
  19. package/cjs/services/balance-service/helpers/subscribe/index.js +19 -7
  20. package/cjs/services/balance-service/index.js +32 -4
  21. package/cjs/services/balance-service/transfer/bitcoin-transfer.js +119 -0
  22. package/cjs/services/balance-service/transfer/token.js +2 -0
  23. package/cjs/services/balance-service/transfer/xcm/index.js +15 -9
  24. package/cjs/services/balance-service/transfer/xcm/utils.js +12 -14
  25. package/cjs/services/base/types.js +2 -0
  26. package/cjs/services/chain-service/constants.js +18 -6
  27. package/cjs/services/chain-service/handler/CardanoApi.js +25 -35
  28. package/cjs/services/chain-service/handler/bitcoin/BitcoinApi.js +105 -0
  29. package/cjs/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +78 -0
  30. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +371 -0
  31. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +19 -0
  32. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +368 -0
  33. package/cjs/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +302 -0
  34. package/cjs/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  35. package/cjs/services/chain-service/index.js +27 -3
  36. package/cjs/services/chain-service/utils/index.js +57 -4
  37. package/cjs/services/chain-service/utils/patch.js +1 -1
  38. package/cjs/services/earning-service/handlers/native-staking/tao.js +4 -38
  39. package/cjs/services/event-service/index.js +4 -0
  40. package/cjs/services/fee-service/service.js +8 -3
  41. package/cjs/services/hiro-service/index.js +96 -0
  42. package/cjs/services/hiro-service/utils/index.js +85 -0
  43. package/cjs/services/history-service/bitcoin-history.js +58 -0
  44. package/cjs/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  45. package/cjs/services/history-service/index.js +41 -3
  46. package/cjs/services/keyring-service/context/handlers/Derive.js +1 -1
  47. package/cjs/services/keyring-service/context/handlers/Migration.js +2 -2
  48. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  49. package/cjs/services/migration-service/scripts/MigrateNewUnifiedAccount.js +29 -0
  50. package/cjs/services/migration-service/scripts/index.js +3 -1
  51. package/cjs/services/request-service/handler/BitcoinRequestHandler.js +440 -0
  52. package/cjs/services/request-service/index.js +29 -3
  53. package/cjs/services/rune-service/index.js +105 -0
  54. package/cjs/services/swap-service/handler/chainflip-handler.js +29 -18
  55. package/cjs/services/swap-service/handler/kyber-handler.js +5 -9
  56. package/cjs/services/swap-service/handler/simpleswap-handler.js +4 -7
  57. package/cjs/services/swap-service/handler/uniswap-handler.js +5 -12
  58. package/cjs/services/swap-service/utils.js +46 -37
  59. package/cjs/services/transaction-service/helpers/index.js +7 -1
  60. package/cjs/services/transaction-service/index.js +136 -15
  61. package/cjs/services/transaction-service/utils.js +6 -3
  62. package/cjs/strategy/api-request-strategy/context/base.js +31 -0
  63. package/cjs/strategy/api-request-strategy/index.js +90 -0
  64. package/cjs/strategy/api-request-strategy/types.js +1 -0
  65. package/cjs/strategy/api-request-strategy/utils/index.js +33 -0
  66. package/cjs/types/account/info/keyring.js +1 -1
  67. package/cjs/types/bitcoin.js +24 -0
  68. package/cjs/types/environment.js +19 -0
  69. package/cjs/types/fee/bitcoin.js +1 -0
  70. package/cjs/types/fee/index.js +11 -0
  71. package/cjs/types/index.js +11 -0
  72. package/cjs/utils/account/analyze.js +3 -3
  73. package/cjs/utils/account/common.js +16 -6
  74. package/cjs/utils/account/derive/info/solo.js +68 -19
  75. package/cjs/utils/account/derive/info/unified.js +2 -0
  76. package/cjs/utils/account/derive/validate.js +70 -2
  77. package/cjs/utils/account/transform.js +11 -5
  78. package/cjs/utils/bitcoin/common.js +98 -0
  79. package/cjs/utils/bitcoin/fee.js +21 -0
  80. package/cjs/utils/bitcoin/index.js +38 -0
  81. package/cjs/utils/bitcoin/utxo-management.js +281 -0
  82. package/cjs/utils/environment.js +30 -2
  83. package/cjs/utils/fee/transfer.js +48 -0
  84. package/cjs/utils/index.js +15 -1
  85. package/constants/bitcoin.d.ts +3 -0
  86. package/constants/bitcoin.js +13 -0
  87. package/constants/environment.d.ts +1 -0
  88. package/constants/environment.js +2 -1
  89. package/constants/index.d.ts +2 -0
  90. package/constants/index.js +3 -1
  91. package/core/logic-validation/recipientAddress.js +10 -1
  92. package/core/logic-validation/transfer.d.ts +2 -2
  93. package/core/logic-validation/transfer.js +27 -7
  94. package/core/types.d.ts +1 -0
  95. package/core/types.js +1 -0
  96. package/core/utils.d.ts +1 -0
  97. package/core/utils.js +15 -2
  98. package/koni/background/handlers/Extension.d.ts +2 -0
  99. package/koni/background/handlers/Extension.js +95 -42
  100. package/koni/background/handlers/State.d.ts +7 -3
  101. package/koni/background/handlers/State.js +52 -12
  102. package/package.json +149 -8
  103. package/packageInfo.js +1 -1
  104. package/services/balance-service/helpers/subscribe/bitcoin.d.ts +2 -0
  105. package/services/balance-service/helpers/subscribe/bitcoin.js +87 -0
  106. package/services/balance-service/helpers/subscribe/evm.js +6 -1
  107. package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
  108. package/services/balance-service/helpers/subscribe/index.js +20 -8
  109. package/services/balance-service/index.d.ts +2 -0
  110. package/services/balance-service/index.js +32 -4
  111. package/services/balance-service/transfer/bitcoin-transfer.d.ts +14 -0
  112. package/services/balance-service/transfer/bitcoin-transfer.js +112 -0
  113. package/services/balance-service/transfer/token.js +2 -0
  114. package/services/balance-service/transfer/xcm/index.js +15 -9
  115. package/services/balance-service/transfer/xcm/utils.d.ts +2 -0
  116. package/services/balance-service/transfer/xcm/utils.js +12 -14
  117. package/services/base/types.d.ts +2 -0
  118. package/services/base/types.js +2 -0
  119. package/services/chain-service/constants.d.ts +7 -0
  120. package/services/chain-service/constants.js +12 -5
  121. package/services/chain-service/handler/CardanoApi.d.ts +1 -5
  122. package/services/chain-service/handler/CardanoApi.js +26 -34
  123. package/services/chain-service/handler/bitcoin/BitcoinApi.d.ts +31 -0
  124. package/services/chain-service/handler/bitcoin/BitcoinApi.js +98 -0
  125. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.d.ts +16 -0
  126. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +70 -0
  127. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.d.ts +28 -0
  128. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +362 -0
  129. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.d.ts +2 -0
  130. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +5 -0
  131. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.d.ts +28 -0
  132. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +359 -0
  133. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.d.ts +28 -0
  134. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +293 -0
  135. package/services/chain-service/handler/bitcoin/strategy/types.d.ts +291 -0
  136. package/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  137. package/services/chain-service/index.d.ts +3 -0
  138. package/services/chain-service/index.js +31 -5
  139. package/services/chain-service/types.d.ts +20 -0
  140. package/services/chain-service/utils/index.d.ts +4 -0
  141. package/services/chain-service/utils/index.js +50 -4
  142. package/services/chain-service/utils/patch.js +1 -1
  143. package/services/earning-service/handlers/native-staking/tao.d.ts +0 -11
  144. package/services/earning-service/handlers/native-staking/tao.js +4 -24
  145. package/services/event-service/index.d.ts +3 -0
  146. package/services/event-service/index.js +4 -0
  147. package/services/event-service/types.d.ts +3 -0
  148. package/services/fee-service/service.js +8 -3
  149. package/services/hiro-service/index.d.ts +17 -0
  150. package/services/hiro-service/index.js +88 -0
  151. package/services/hiro-service/utils/index.d.ts +6 -0
  152. package/services/hiro-service/utils/index.js +72 -0
  153. package/services/history-service/bitcoin-history.d.ts +4 -0
  154. package/services/history-service/bitcoin-history.js +52 -0
  155. package/services/history-service/helpers/recoverHistoryStatus.d.ts +3 -1
  156. package/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  157. package/services/history-service/index.d.ts +1 -0
  158. package/services/history-service/index.js +42 -4
  159. package/services/keyring-service/context/handlers/Derive.js +2 -2
  160. package/services/keyring-service/context/handlers/Migration.js +2 -2
  161. package/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  162. package/services/migration-service/scripts/MigrateNewUnifiedAccount.d.ts +4 -0
  163. package/services/migration-service/scripts/MigrateNewUnifiedAccount.js +21 -0
  164. package/services/migration-service/scripts/index.js +3 -1
  165. package/services/request-service/handler/BitcoinRequestHandler.d.ts +23 -0
  166. package/services/request-service/handler/BitcoinRequestHandler.js +427 -0
  167. package/services/request-service/index.d.ts +9 -2
  168. package/services/request-service/index.js +25 -3
  169. package/services/rune-service/index.d.ts +17 -0
  170. package/services/rune-service/index.js +97 -0
  171. package/services/swap-service/handler/chainflip-handler.d.ts +0 -2
  172. package/services/swap-service/handler/chainflip-handler.js +25 -13
  173. package/services/swap-service/handler/kyber-handler.d.ts +0 -1
  174. package/services/swap-service/handler/kyber-handler.js +5 -8
  175. package/services/swap-service/handler/simpleswap-handler.d.ts +0 -1
  176. package/services/swap-service/handler/simpleswap-handler.js +4 -6
  177. package/services/swap-service/handler/uniswap-handler.js +6 -13
  178. package/services/swap-service/utils.d.ts +0 -13
  179. package/services/swap-service/utils.js +46 -34
  180. package/services/transaction-service/helpers/index.d.ts +3 -1
  181. package/services/transaction-service/helpers/index.js +5 -0
  182. package/services/transaction-service/index.d.ts +3 -5
  183. package/services/transaction-service/index.js +135 -16
  184. package/services/transaction-service/types.d.ts +12 -2
  185. package/services/transaction-service/utils.js +7 -4
  186. package/strategy/api-request-strategy/context/base.d.ts +15 -0
  187. package/strategy/api-request-strategy/context/base.js +24 -0
  188. package/strategy/api-request-strategy/index.d.ts +15 -0
  189. package/strategy/api-request-strategy/index.js +83 -0
  190. package/strategy/api-request-strategy/types.d.ts +22 -0
  191. package/strategy/api-request-strategy/types.js +1 -0
  192. package/strategy/api-request-strategy/utils/index.d.ts +2 -0
  193. package/strategy/api-request-strategy/utils/index.js +23 -0
  194. package/types/account/info/keyring.d.ts +1 -1
  195. package/types/account/info/keyring.js +1 -1
  196. package/types/balance/index.d.ts +4 -1
  197. package/types/balance/transfer.d.ts +17 -0
  198. package/types/bitcoin.d.ts +93 -0
  199. package/types/bitcoin.js +17 -0
  200. package/types/environment.d.ts +9 -0
  201. package/types/environment.js +13 -0
  202. package/types/fee/base.d.ts +4 -1
  203. package/types/fee/bitcoin.d.ts +18 -0
  204. package/types/fee/bitcoin.js +1 -0
  205. package/types/fee/index.d.ts +1 -0
  206. package/types/fee/index.js +2 -1
  207. package/types/fee/subscription.d.ts +4 -3
  208. package/types/index.d.ts +1 -0
  209. package/types/index.js +1 -0
  210. package/utils/account/analyze.js +4 -4
  211. package/utils/account/common.d.ts +7 -8
  212. package/utils/account/common.js +16 -6
  213. package/utils/account/derive/info/solo.js +70 -21
  214. package/utils/account/derive/info/unified.js +2 -0
  215. package/utils/account/derive/validate.d.ts +1 -0
  216. package/utils/account/derive/validate.js +68 -1
  217. package/utils/account/transform.d.ts +1 -1
  218. package/utils/account/transform.js +11 -5
  219. package/utils/bitcoin/common.d.ts +22 -0
  220. package/utils/bitcoin/common.js +88 -0
  221. package/utils/bitcoin/fee.d.ts +2 -0
  222. package/utils/bitcoin/fee.js +14 -0
  223. package/utils/bitcoin/index.d.ts +3 -0
  224. package/utils/bitcoin/index.js +6 -0
  225. package/utils/bitcoin/utxo-management.d.ts +33 -0
  226. package/utils/bitcoin/utxo-management.js +266 -0
  227. package/utils/environment.d.ts +2 -0
  228. package/utils/environment.js +27 -1
  229. package/utils/fee/transfer.d.ts +3 -1
  230. package/utils/fee/transfer.js +47 -1
  231. package/utils/index.d.ts +1 -0
  232. package/utils/index.js +6 -3
@@ -30,6 +30,7 @@ var _relayChain = require("@subwallet/extension-base/koni/api/staking/bonding/re
30
30
  var _utils3 = require("@subwallet/extension-base/koni/api/yield/helper/utils");
31
31
  var _consts = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/consts");
32
32
  var _utils4 = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils");
33
+ var _bitcoinTransfer = require("@subwallet/extension-base/services/balance-service/transfer/bitcoin-transfer");
33
34
  var _cardanoTransfer = require("@subwallet/extension-base/services/balance-service/transfer/cardano-transfer");
34
35
  var _smartContract = require("@subwallet/extension-base/services/balance-service/transfer/smart-contract");
35
36
  var _token = require("@subwallet/extension-base/services/balance-service/transfer/token");
@@ -56,15 +57,19 @@ var _parseTransaction2 = require("@subwallet/extension-base/utils/eth/parseTrans
56
57
  var _getId = require("@subwallet/extension-base/utils/getId");
57
58
  var _keyring = require("@subwallet/keyring");
58
59
  var _types4 = require("@subwallet/keyring/types");
60
+ var _validate = require("@subwallet/keyring/utils/address/validate");
59
61
  var _uiKeyring = require("@subwallet/ui-keyring");
60
62
  var _utils9 = require("@walletconnect/utils");
61
63
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
64
+ var bitcoin = _interopRequireWildcard(require("bitcoinjs-lib"));
62
65
  var _i18next = require("i18next");
63
66
  var _rxjs = require("rxjs");
64
67
  var _types5 = require("@polkadot/types");
65
68
  var _util = require("@polkadot/util");
66
69
  var _utilCrypto = require("@polkadot/util-crypto");
67
70
  var _utils10 = require("../utils");
71
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
72
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
68
73
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
69
74
  // SPDX-License-Identifier: Apache-2.0
70
75
 
@@ -1292,6 +1297,7 @@ class KoniExtension {
1292
1297
  decimals: (0, _utils6._getAssetDecimals)(transferTokenInfo)
1293
1298
  };
1294
1299
  let transaction;
1300
+ let overrideFeeCustom;
1295
1301
  const transferTokenAvailable = await this.getAddressTransferableBalance({
1296
1302
  address: from,
1297
1303
  networkKey: chain,
@@ -1363,6 +1369,38 @@ class KoniExtension {
1363
1369
  cardanoApi,
1364
1370
  nativeTokenInfo
1365
1371
  });
1372
+ } else if ((0, _validate.isBitcoinAddress)(from) && (0, _validate.isBitcoinAddress)(to) && (0, _utils6._isTokenTransferredByBitcoin)(transferTokenInfo)) {
1373
+ // Note: Currently supports transferring only the native token, Bitcoin.
1374
+ chainType = _KoniTypes.ChainType.BITCOIN;
1375
+ const chainInfo = this.#koniState.getChainInfo(chain);
1376
+ const network = chainInfo.isTestnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin;
1377
+ const txVal = transferAll ? transferTokenAvailable.value : value || '0';
1378
+ const bitcoinApi = this.#koniState.getBitcoinApi(chain);
1379
+ const feeInfo = await this.#koniState.feeService.subscribeChainFee((0, _getId.getId)(), chain, 'bitcoin');
1380
+ let calculatedBitcoinFeeRate;
1381
+ [transaction, transferAmount.value, calculatedBitcoinFeeRate] = await (0, _bitcoinTransfer.createBitcoinTransaction)({
1382
+ bitcoinApi,
1383
+ chain,
1384
+ from,
1385
+ feeInfo,
1386
+ to,
1387
+ transferAll: !!transferAll,
1388
+ value: txVal,
1389
+ network: network
1390
+ });
1391
+ if (calculatedBitcoinFeeRate) {
1392
+ const feeRate = parseFloat(calculatedBitcoinFeeRate);
1393
+ if (!isNaN(feeRate)) {
1394
+ overrideFeeCustom = {
1395
+ feeRate
1396
+ };
1397
+ }
1398
+ }
1399
+
1400
+ // TODO: This is a hotfix until transferMax for Bitcoin is supported.
1401
+ if (transferAll) {
1402
+ inputData.value = transferAmount.value;
1403
+ }
1366
1404
  } else {
1367
1405
  const substrateApi = this.#koniState.getSubstrateApi(chain);
1368
1406
  [transaction, transferAmount.value] = await (0, _token.createSubstrateExtrinsic)({
@@ -1453,8 +1491,8 @@ class KoniExtension {
1453
1491
  warnings,
1454
1492
  address: from,
1455
1493
  chain,
1456
- feeCustom,
1457
- feeOption,
1494
+ feeCustom: overrideFeeCustom || feeCustom,
1495
+ feeOption: overrideFeeCustom ? 'custom' : feeOption,
1458
1496
  tokenPayFeeSlug,
1459
1497
  chainType,
1460
1498
  transferNativeAmount,
@@ -1500,7 +1538,7 @@ class KoniExtension {
1500
1538
  const isPosBridgeTransfer = (0, _posBridge._isPosChainBridge)(originNetworkKey, destinationNetworkKey);
1501
1539
  const isAcrossBridgeTransfer = (0, _acrossBridge._isAcrossChainBridge)(originNetworkKey, destinationNetworkKey);
1502
1540
  const extrinsicType = _KoniTypes.ExtrinsicType.TRANSFER_XCM;
1503
- const isSubstrateXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer);
1541
+ const isSubstrateXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer);
1504
1542
  const isTransferNative = this.#koniState.getNativeTokenInfo(originNetworkKey).slug === tokenSlug;
1505
1543
  const isTransferLocalTokenAndPayThatTokenAsFee = !isTransferNative && tokenSlug === tokenPayFeeSlug;
1506
1544
  let xcmFeeDryRun;
@@ -1582,48 +1620,47 @@ class KoniExtension {
1582
1620
  }
1583
1621
  let isSendingTokenSufficient = false;
1584
1622
  let receiverSystemAccountInfo;
1585
- if (!(0, _utils6._isChainSubstrateCompatible)(chainInfoMap[destinationNetworkKey])) {
1586
- return undefined;
1587
- }
1588
- const setting = {
1589
- visible: true
1590
- };
1591
- await this.#koniState.chainService.updateAssetSetting(destinationTokenInfo.slug, setting, true);
1592
- const {
1593
- value: _senderTransferable
1594
- } = await this.getAddressTransferableBalance({
1595
- address: from,
1596
- networkKey: originNetworkKey,
1597
- token: originTokenInfo.slug
1598
- });
1599
- const senderTransferable = BigInt(_senderTransferable);
1600
- const sendingAmount = BigInt(value);
1601
- const {
1602
- value: _receiverDestinationTokenKeepAliveBalance
1603
- } = await this.getAddressTotalBalance({
1604
- address: to,
1605
- networkKey: destinationNetworkKey,
1606
- token: destinationTokenInfo.slug,
1607
- extrinsicType
1608
- });
1609
- const receiverDestinationTokenKeepAliveBalance = BigInt(_receiverDestinationTokenKeepAliveBalance);
1610
- if (!(0, _utils6._isNativeToken)(destinationTokenInfo)) {
1611
- const _receiverNativeTotal = await this.getAddressTotalBalance({
1623
+ if ((0, _utils6._isChainSubstrateCompatible)(chainInfoMap[destinationNetworkKey])) {
1624
+ const setting = {
1625
+ visible: true
1626
+ };
1627
+ await this.#koniState.chainService.updateAssetSetting(destinationTokenInfo.slug, setting, true);
1628
+ const {
1629
+ value: _senderTransferable
1630
+ } = await this.getAddressTransferableBalance({
1631
+ address: from,
1632
+ networkKey: originNetworkKey,
1633
+ token: originTokenInfo.slug
1634
+ });
1635
+ const senderTransferable = BigInt(_senderTransferable);
1636
+ const sendingAmount = BigInt(value);
1637
+ const {
1638
+ value: _receiverDestinationTokenKeepAliveBalance
1639
+ } = await this.getAddressTotalBalance({
1612
1640
  address: to,
1613
1641
  networkKey: destinationNetworkKey,
1614
- token: destinationNativeTokenSlug,
1642
+ token: destinationTokenInfo.slug,
1615
1643
  extrinsicType
1616
1644
  });
1617
- receiverSystemAccountInfo = _receiverNativeTotal.metadata;
1645
+ const receiverDestinationTokenKeepAliveBalance = BigInt(_receiverDestinationTokenKeepAliveBalance);
1646
+ if (!(0, _utils6._isNativeToken)(destinationTokenInfo)) {
1647
+ const _receiverNativeTotal = await this.getAddressTotalBalance({
1648
+ address: to,
1649
+ networkKey: destinationNetworkKey,
1650
+ token: destinationNativeTokenSlug,
1651
+ extrinsicType
1652
+ });
1653
+ receiverSystemAccountInfo = _receiverNativeTotal.metadata;
1654
+ }
1655
+ const substrateApi = this.#koniState.getSubstrateApi(destinationNetworkKey);
1656
+ const sufficientChain = this.#koniState.chainService.value.sufficientChains;
1657
+ isSendingTokenSufficient = await (0, _utils._isSufficientToken)(destinationTokenInfo, substrateApi, sufficientChain);
1658
+ const [warning, error] = (0, _transfer.additionalValidateTransferForRecipient)(destinationTokenInfo, destinationNativeTokenInfo, extrinsicType, receiverDestinationTokenKeepAliveBalance, sendingAmount, senderTransferable,
1659
+ // different from sendingTokenInfo being passed in
1660
+ receiverSystemAccountInfo, isSendingTokenSufficient);
1661
+ warning.length && inputTransaction.warnings.push(...warning);
1662
+ error.length && inputTransaction.errors.push(...error);
1618
1663
  }
1619
- const substrateApi = this.#koniState.getSubstrateApi(destinationNetworkKey);
1620
- const sufficientChain = this.#koniState.chainService.value.sufficientChains;
1621
- isSendingTokenSufficient = await (0, _utils._isSufficientToken)(destinationTokenInfo, substrateApi, sufficientChain);
1622
- const [warning, error] = (0, _transfer.additionalValidateTransferForRecipient)(destinationTokenInfo, destinationNativeTokenInfo, extrinsicType, receiverDestinationTokenKeepAliveBalance, sendingAmount, senderTransferable,
1623
- // different from sendingTokenInfo being passed in
1624
- receiverSystemAccountInfo, isSendingTokenSufficient);
1625
- warning.length && inputTransaction.warnings.push(...warning);
1626
- error.length && inputTransaction.errors.push(...error);
1627
1664
  if (isSubstrateXcm) {
1628
1665
  const isDryRunSuccess = await (0, _xcm.dryRunXcmExtrinsicV2)(params);
1629
1666
  if (!isDryRunSuccess) {
@@ -1918,6 +1955,7 @@ class KoniExtension {
1918
1955
  destChain: _destChain,
1919
1956
  feeCustom,
1920
1957
  feeOption,
1958
+ to,
1921
1959
  token,
1922
1960
  tokenPayFeeSlug,
1923
1961
  value
@@ -1940,6 +1978,7 @@ class KoniExtension {
1940
1978
  }
1941
1979
  const _request = {
1942
1980
  address: address,
1981
+ to: to,
1943
1982
  value,
1944
1983
  // todo: lazy subscribe to improve performance
1945
1984
  cardanoApi: this.#koniState.chainService.getCardanoApi(chain),
@@ -1952,6 +1991,7 @@ class KoniExtension {
1952
1991
  srcToken,
1953
1992
  substrateApi: this.#koniState.chainService.getSubstrateApi(chain),
1954
1993
  tonApi: this.#koniState.chainService.getTonApi(chain),
1994
+ bitcoinApi: this.#koniState.chainService.getBitcoinApi(chain),
1955
1995
  isTransferLocalTokenAndPayThatTokenAsFee,
1956
1996
  isTransferNativeTokenAndPayLocalTokenAsFee,
1957
1997
  nativeToken
@@ -2152,6 +2192,15 @@ class KoniExtension {
2152
2192
  });
2153
2193
  return this.#koniState.getConfirmationsQueueSubjectCardano().getValue();
2154
2194
  }
2195
+ subscribeConfirmationsBitcoin(id, port) {
2196
+ const cb = (0, _subscriptions.createSubscription)(id, port);
2197
+ const subscription = this.#koniState.getConfirmationsQueueSubjectBitcoin().subscribe(cb);
2198
+ this.createUnsubscriptionHandle(id, subscription.unsubscribe);
2199
+ port.onDisconnect.addListener(() => {
2200
+ this.cancelSubscription(id);
2201
+ });
2202
+ return this.#koniState.getConfirmationsQueueSubjectBitcoin().getValue();
2203
+ }
2155
2204
  async completeConfirmation(request) {
2156
2205
  return await this.#koniState.completeConfirmation(request);
2157
2206
  }
@@ -2161,7 +2210,9 @@ class KoniExtension {
2161
2210
  async completeConfirmationCardano(request) {
2162
2211
  return await this.#koniState.completeConfirmationCardano(request);
2163
2212
  }
2164
-
2213
+ async completeConfirmationBitcoin(request) {
2214
+ return await this.#koniState.completeConfirmationBitcoin(request);
2215
+ }
2165
2216
  /// Sign Qr
2166
2217
 
2167
2218
  getNetworkJsonByChainId(chainId) {
@@ -4731,12 +4782,16 @@ class KoniExtension {
4731
4782
  return this.subscribeConfirmationsTon(id, port);
4732
4783
  case 'pri(confirmationsCardano.subscribe)':
4733
4784
  return this.subscribeConfirmationsCardano(id, port);
4785
+ case 'pri(confirmationsBitcoin.subscribe)':
4786
+ return this.subscribeConfirmationsBitcoin(id, port);
4734
4787
  case 'pri(confirmations.complete)':
4735
4788
  return await this.completeConfirmation(request);
4736
4789
  case 'pri(confirmationsTon.complete)':
4737
4790
  return await this.completeConfirmationTon(request);
4738
4791
  case 'pri(confirmationsCardano.complete)':
4739
4792
  return await this.completeConfirmationCardano(request);
4793
+ case 'pri(confirmationsBitcoin.complete)':
4794
+ return await this.completeConfirmationBitcoin(request);
4740
4795
 
4741
4796
  /// Stake
4742
4797
  case 'pri(bonding.getBondingOptions)':
@@ -95,6 +95,7 @@ class KoniState {
95
95
  generalStatus = _types.ServiceStatus.INITIALIZING;
96
96
  waitSleeping = null;
97
97
  waitStarting = null;
98
+ waitStartingFull = null;
98
99
  constructor() {
99
100
  let providers = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
100
101
  // Init subwallet api sdk
@@ -106,11 +107,13 @@ class KoniState {
106
107
  this.eventService = new _eventService.EventService();
107
108
  this.dbService = new _DatabaseService.default(this.eventService);
108
109
  this.keyringService = new _keyringService.KeyringService(this);
110
+ this.feeService = new _service2.default(this);
111
+ this.transactionService = new _transactionService.default(this);
109
112
  this.notificationService = new _NotificationService.default();
110
113
  this.chainService = new _chainService.ChainService(this.dbService, this.eventService);
111
114
  this.subscanService = _subscanService.SubscanService.getInstance();
112
115
  this.settingService = new _SettingService.default();
113
- this.requestService = new _requestService.default(this.chainService, this.settingService, this.keyringService);
116
+ this.requestService = new _requestService.default(this.chainService, this.settingService, this.keyringService, this.feeService, this.transactionService);
114
117
  this.priceService = new _priceService.PriceService(this.dbService, this.eventService, this.chainService);
115
118
  this.balanceService = new _balanceService.BalanceService(this);
116
119
  this.historyService = new _historyService.HistoryService(this.dbService, this.chainService, this.eventService, this.keyringService, this.subscanService);
@@ -120,9 +123,7 @@ class KoniState {
120
123
  this.campaignService = new _campaignService.default(this);
121
124
  this.mktCampaignService = new _mktCampaignService.default(this);
122
125
  this.buyService = new _buyService.default(this);
123
- this.transactionService = new _transactionService.default(this);
124
126
  this.earningService = new _service.default(this);
125
- this.feeService = new _service2.default(this);
126
127
  this.swapService = new _swapService.SwapService(this);
127
128
  this.inappNotificationService = new _inappNotificationService.InappNotificationService(this.dbService, this.keyringService, this.eventService, this.chainService);
128
129
  this.chainOnlineService = new _chainOnlineService.ChainOnlineService(this.chainService, this.settingService, this.eventService, this.dbService);
@@ -132,7 +133,9 @@ class KoniState {
132
133
 
133
134
  // Init state
134
135
  if (_utils3.targetIsWeb) {
135
- this.init().catch(console.error);
136
+ this.init().then(() => {
137
+ this.wakeup(true).catch(console.error);
138
+ }).catch(console.error);
136
139
  }
137
140
  }
138
141
 
@@ -228,7 +231,8 @@ class KoniState {
228
231
  await this.earningService.init();
229
232
  await this.swapService.init();
230
233
  await this.inappNotificationService.init();
231
- this.onReady();
234
+
235
+ // this.onReady();
232
236
  this.onAccountAdd();
233
237
  this.onAccountRemove();
234
238
 
@@ -240,6 +244,9 @@ class KoniState {
240
244
  this.chainService.subscribeChainInfoMap().subscribe(() => {
241
245
  this.afterChainServiceInit();
242
246
  });
247
+
248
+ // Mark app is ready
249
+ this.eventService.emit('general.init', true);
243
250
  }
244
251
  async initMantaPay(password) {
245
252
  var _this$chainService, _this$chainService$ma;
@@ -263,11 +270,6 @@ class KoniState {
263
270
  this.mantaPayConfigSubject.next(data);
264
271
  });
265
272
  }
266
- onReady() {
267
- // Todo: Need optimize in the future to, only run important services onetime to save resources
268
- // Todo: If optimize must check activity of web-runner of mobile
269
- this._start().catch(console.error);
270
- }
271
273
  updateKeyringState() {
272
274
  let isReady = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
273
275
  let callback = arguments.length > 1 ? arguments[1] : undefined;
@@ -756,6 +758,9 @@ class KoniState {
756
758
  getCardanoApi(networkKey) {
757
759
  return this.chainService.getCardanoApi(networkKey);
758
760
  }
761
+ getBitcoinApi(networkKey) {
762
+ return this.chainService.getBitcoinApi(networkKey);
763
+ }
759
764
  getApiMap() {
760
765
  return {
761
766
  substrate: this.chainService.getSubstrateApiMap(),
@@ -1269,6 +1274,9 @@ class KoniState {
1269
1274
  getConfirmationsQueueSubjectCardano() {
1270
1275
  return this.requestService.confirmationsQueueSubjectCardano;
1271
1276
  }
1277
+ getConfirmationsQueueSubjectBitcoin() {
1278
+ return this.requestService.confirmationsQueueSubjectBitcoin;
1279
+ }
1272
1280
  async completeConfirmation(request) {
1273
1281
  return await this.requestService.completeConfirmation(request);
1274
1282
  }
@@ -1278,6 +1286,9 @@ class KoniState {
1278
1286
  async completeConfirmationCardano(request) {
1279
1287
  return await this.requestService.completeConfirmationCardano(request);
1280
1288
  }
1289
+ async completeConfirmationBitcoin(request) {
1290
+ return await this.requestService.completeConfirmationBitcoin(request);
1291
+ }
1281
1292
  async onMV3Update() {
1282
1293
  const migrationStatus = await _storage.SWStorage.instance.getItem('mv3_migration');
1283
1294
  if (!migrationStatus || migrationStatus !== 'done') {
@@ -1429,8 +1440,12 @@ class KoniState {
1429
1440
  });
1430
1441
  }
1431
1442
  async sleep() {
1443
+ // Wait for app initialized before sleep
1444
+ await this.eventService.waitAppInitialized;
1445
+
1432
1446
  // Wait starting finish before sleep to avoid conflict
1433
1447
  this.generalStatus === _types.ServiceStatus.STARTING && this.waitStarting && (await this.waitStarting);
1448
+ this.generalStatus === _types.ServiceStatus.STARTING_FULL && this.waitStartingFull && (await this.waitStartingFull);
1434
1449
  this.eventService.emit('general.sleep', true);
1435
1450
 
1436
1451
  // Avoid sleep multiple times
@@ -1459,6 +1474,9 @@ class KoniState {
1459
1474
  this.waitSleeping = null;
1460
1475
  }
1461
1476
  async _start() {
1477
+ // Wait for app initialized before start
1478
+ await this.eventService.waitAppInitialized;
1479
+
1462
1480
  // Wait sleep finish before start to avoid conflict
1463
1481
  this.generalStatus === _types.ServiceStatus.STOPPING && this.waitSleeping && (await this.waitSleeping);
1464
1482
 
@@ -1484,15 +1502,38 @@ class KoniState {
1484
1502
  }
1485
1503
 
1486
1504
  // Start services
1487
- await Promise.all([this.cron.start(), this.subscription.start(), this.historyService.start(), this.priceService.start(), this.balanceService.start(), this.earningService.start(), this.swapService.start(), this.inappNotificationService.start()]);
1505
+ this.eventService.emit('general.start', true);
1488
1506
 
1489
1507
  // Complete starting
1490
1508
  starting.resolve();
1491
1509
  this.waitStarting = null;
1492
1510
  this.generalStatus = _types.ServiceStatus.STARTED;
1493
1511
  }
1512
+ async _startFull() {
1513
+ // Continue wait existed starting process
1514
+ if (this.generalStatus === _types.ServiceStatus.STARTING) {
1515
+ await this.waitStarting;
1516
+ }
1517
+
1518
+ // Always start full from start state
1519
+ if (this.generalStatus !== _types.ServiceStatus.STARTED) {
1520
+ return;
1521
+ }
1522
+ this.generalStatus = _types.ServiceStatus.STARTING_FULL;
1523
+ const startingFull = (0, _promise.createPromiseHandler)();
1524
+ this.waitStartingFull = startingFull.promise;
1525
+ await Promise.all([this.cron.start(), this.subscription.start(), this.historyService.start(), this.priceService.start(), this.balanceService.start(), this.earningService.start(), this.swapService.start(), this.inappNotificationService.start()]);
1526
+ this.eventService.emit('general.start_full', true);
1527
+ this.waitStartingFull = null;
1528
+ this.generalStatus = _types.ServiceStatus.STARTED_FULL;
1529
+ startingFull.resolve();
1530
+ }
1494
1531
  async wakeup() {
1532
+ let fullWakeup = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
1495
1533
  await this._start();
1534
+ if (fullWakeup) {
1535
+ await this._startFull();
1536
+ }
1496
1537
  }
1497
1538
  cancelSubscription(id) {
1498
1539
  if ((0, _subscriptions.isSubscriptionRunning)(id)) {
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.40-0'
16
+ version: '1.3.42-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.subscribeBitcoinBalance = subscribeBitcoinBalance;
7
+ var _types = require("@subwallet/chain-list/types");
8
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
9
+ var _constants = require("@subwallet/extension-base/constants");
10
+ var _utils = require("@subwallet/extension-base/utils");
11
+ // Copyright 2019-2022 @subwallet/extension-base
12
+ // SPDX-License-Identifier: Apache-2.0
13
+
14
+ function getDefaultBalanceResult() {
15
+ return {
16
+ balance: '0',
17
+ bitcoinBalanceMetadata: {
18
+ inscriptionCount: 0,
19
+ runeBalance: '0',
20
+ inscriptionBalance: '0'
21
+ }
22
+ };
23
+ }
24
+ async function getBitcoinBalance(bitcoinApi, addresses) {
25
+ return await Promise.all(addresses.map(async address => {
26
+ try {
27
+ const [addressSummaryInfo] = await Promise.all([bitcoinApi.api.getAddressSummaryInfo(address)]);
28
+ if (Number(addressSummaryInfo.balance) < 0) {
29
+ return getDefaultBalanceResult();
30
+ }
31
+ const bitcoinBalanceMetadata = {
32
+ inscriptionCount: addressSummaryInfo.total_inscription,
33
+ runeBalance: addressSummaryInfo.balance_rune,
34
+ inscriptionBalance: addressSummaryInfo.balance_inscription
35
+ };
36
+ return {
37
+ balance: addressSummaryInfo.balance.toString(),
38
+ bitcoinBalanceMetadata: bitcoinBalanceMetadata
39
+ };
40
+ } catch (error) {
41
+ console.log('Error while fetching Bitcoin balances', error);
42
+ return getDefaultBalanceResult();
43
+ }
44
+ }));
45
+ }
46
+ function subscribeBitcoinBalance(params) {
47
+ var _Object$values$;
48
+ const {
49
+ addresses,
50
+ assetMap,
51
+ bitcoinApi,
52
+ callback,
53
+ chainInfo
54
+ } = params;
55
+ const chain = chainInfo.slug;
56
+ const nativeTokenInfo = (0, _utils.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.NATIVE]);
57
+ const nativeTokenSlug = ((_Object$values$ = Object.values(nativeTokenInfo)[0]) === null || _Object$values$ === void 0 ? void 0 : _Object$values$.slug) || '';
58
+ const getBalance = () => {
59
+ getBitcoinBalance(bitcoinApi, addresses).then(balances => {
60
+ return balances.map((_ref, index) => {
61
+ let {
62
+ balance,
63
+ bitcoinBalanceMetadata
64
+ } = _ref;
65
+ return {
66
+ address: addresses[index],
67
+ tokenSlug: nativeTokenSlug,
68
+ state: _KoniTypes.APIItemState.READY,
69
+ free: balance,
70
+ locked: (parseInt(bitcoinBalanceMetadata.runeBalance.toString()) + parseInt(bitcoinBalanceMetadata.inscriptionBalance.toString())).toString(),
71
+ metadata: bitcoinBalanceMetadata
72
+ };
73
+ });
74
+ }).catch(e => {
75
+ console.error('Error on get Bitcoin balance with token bitcoin', e);
76
+ return addresses.map(address => {
77
+ return {
78
+ address: address,
79
+ tokenSlug: nativeTokenSlug,
80
+ state: _KoniTypes.APIItemState.READY,
81
+ free: '0',
82
+ locked: '0'
83
+ };
84
+ });
85
+ }).then(items => {
86
+ callback(items);
87
+ }).catch(console.error);
88
+ };
89
+ const interval = setInterval(getBalance, _constants.BITCOIN_REFRESH_BALANCE_INTERVAL);
90
+ getBalance();
91
+ return () => {
92
+ clearInterval(interval);
93
+ };
94
+ }
@@ -9,6 +9,7 @@ var _types = require("@subwallet/chain-list/types");
9
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
10
  var _constants = require("@subwallet/extension-base/constants");
11
11
  var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
12
+ var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
12
13
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
13
14
  var _utils2 = require("@subwallet/extension-base/utils");
14
15
  var _util = require("@polkadot/util");
@@ -24,7 +25,11 @@ function subscribeERC20Interval(_ref) {
24
25
  evmApi
25
26
  } = _ref;
26
27
  const chain = chainInfo.slug;
27
- const tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.ERC20]);
28
+ let tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.ERC20]);
29
+ if (_constants2._BALANCE_CHAIN_GROUP.moonbeam.includes(chain)) {
30
+ const moonbeamLocal = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.LOCAL]);
31
+ tokenList = Object.assign({}, tokenList, moonbeamLocal);
32
+ }
28
33
  const erc20ContractMap = {};
29
34
  Object.entries(tokenList).forEach(_ref2 => {
30
35
  let [slug, tokenInfo] = _ref2;
@@ -8,6 +8,7 @@ exports.getAccountJsonByAddress = void 0;
8
8
  exports.subscribeBalance = subscribeBalance;
9
9
  var _types = require("@subwallet/chain-list/types");
10
10
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
11
+ var _bitcoin2 = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/bitcoin");
11
12
  var _cardano = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano");
12
13
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
13
14
  var _utils2 = require("@subwallet/extension-base/utils");
@@ -45,20 +46,21 @@ const getAccountJsonByAddress = address => {
45
46
  exports.getAccountJsonByAddress = getAccountJsonByAddress;
46
47
  const filterAddress = (addresses, chainInfo) => {
47
48
  const {
49
+ _bitcoin,
48
50
  bitcoin,
49
51
  cardano,
50
52
  evm,
51
53
  substrate,
52
54
  ton
53
- } = (0, _utils2.getAddressesByChainTypeMap)(addresses);
55
+ } = (0, _utils2.getAddressesByChainTypeMap)(addresses, chainInfo);
54
56
  if ((0, _utils._isChainEvmCompatible)(chainInfo)) {
55
- return [evm, [...bitcoin, ...substrate, ...ton, ...cardano]];
57
+ return [evm, [bitcoin, substrate, ton, cardano, _bitcoin].flat()];
56
58
  } else if ((0, _utils._isChainBitcoinCompatible)(chainInfo)) {
57
- return [bitcoin, [...evm, ...substrate, ...ton, ...cardano]];
59
+ return [bitcoin, [evm, substrate, ton, cardano, _bitcoin].flat()];
58
60
  } else if ((0, _utils._isChainTonCompatible)(chainInfo)) {
59
- return [ton, [...bitcoin, ...evm, ...substrate, ...cardano]];
61
+ return [ton, [bitcoin, evm, substrate, cardano, _bitcoin].flat()];
60
62
  } else if ((0, _utils._isChainCardanoCompatible)(chainInfo)) {
61
- return [cardano, [...bitcoin, ...evm, ...substrate, ...ton]];
63
+ return [cardano, [bitcoin, evm, substrate, ton, _bitcoin].flat()];
62
64
  } else {
63
65
  const fetchList = [];
64
66
  const unfetchList = [];
@@ -84,7 +86,7 @@ const filterAddress = (addresses, chainInfo) => {
84
86
  fetchList.push(address);
85
87
  }
86
88
  });
87
- return [fetchList, [...unfetchList, ...bitcoin, ...evm, ...ton, ...cardano]];
89
+ return [fetchList, [unfetchList, bitcoin, evm, ton, cardano, _bitcoin].flat()];
88
90
  }
89
91
  };
90
92
  const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap, state, callback) => {
@@ -104,7 +106,7 @@ const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap
104
106
  };
105
107
 
106
108
  // main subscription, use for multiple chains, multiple addresses and multiple tokens
107
- function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, callback, extrinsicType) {
109
+ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, callback, extrinsicType) {
108
110
  // Filter chain and token
109
111
  const chainAssetMap = Object.fromEntries(Object.entries(_chainAssetMap).filter(_ref => {
110
112
  let [token] = _ref;
@@ -152,6 +154,16 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
152
154
  cardanoApi
153
155
  });
154
156
  }
157
+ const bitcoinApi = bitcoinApiMap[chainSlug];
158
+ if ((0, _utils._isPureBitcoinChain)(chainInfo)) {
159
+ return (0, _bitcoin2.subscribeBitcoinBalance)({
160
+ addresses: useAddresses,
161
+ assetMap: chainAssetMap,
162
+ bitcoinApi,
163
+ callback,
164
+ chainInfo
165
+ });
166
+ }
155
167
 
156
168
  // If the chain is not ready, return pending state
157
169
  if (!substrateApiMap[chainSlug].isApiReady) {