@subwallet/extension-base 1.3.41-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 (196) 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/index.js +16 -1
  9. package/cjs/core/logic-validation/recipientAddress.js +9 -0
  10. package/cjs/core/logic-validation/transfer.js +25 -5
  11. package/cjs/core/types.js +1 -0
  12. package/cjs/core/utils.js +15 -1
  13. package/cjs/koni/background/handlers/Extension.js +59 -3
  14. package/cjs/koni/background/handlers/State.js +52 -11
  15. package/cjs/packageInfo.js +1 -1
  16. package/cjs/services/balance-service/helpers/subscribe/bitcoin.js +94 -0
  17. package/cjs/services/balance-service/helpers/subscribe/index.js +19 -7
  18. package/cjs/services/balance-service/index.js +32 -4
  19. package/cjs/services/balance-service/transfer/bitcoin-transfer.js +119 -0
  20. package/cjs/services/balance-service/transfer/token.js +2 -0
  21. package/cjs/services/base/types.js +2 -0
  22. package/cjs/services/chain-service/constants.js +14 -3
  23. package/cjs/services/chain-service/handler/bitcoin/BitcoinApi.js +105 -0
  24. package/cjs/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +78 -0
  25. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +371 -0
  26. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +19 -0
  27. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +368 -0
  28. package/cjs/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +302 -0
  29. package/cjs/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  30. package/cjs/services/chain-service/index.js +27 -3
  31. package/cjs/services/chain-service/utils/index.js +57 -4
  32. package/cjs/services/chain-service/utils/patch.js +1 -1
  33. package/cjs/services/event-service/index.js +4 -0
  34. package/cjs/services/fee-service/service.js +8 -3
  35. package/cjs/services/hiro-service/index.js +96 -0
  36. package/cjs/services/hiro-service/utils/index.js +85 -0
  37. package/cjs/services/history-service/bitcoin-history.js +58 -0
  38. package/cjs/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  39. package/cjs/services/history-service/index.js +41 -3
  40. package/cjs/services/keyring-service/context/handlers/Derive.js +1 -1
  41. package/cjs/services/keyring-service/context/handlers/Migration.js +2 -2
  42. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  43. package/cjs/services/migration-service/scripts/MigrateNewUnifiedAccount.js +29 -0
  44. package/cjs/services/migration-service/scripts/index.js +3 -1
  45. package/cjs/services/request-service/handler/BitcoinRequestHandler.js +440 -0
  46. package/cjs/services/request-service/index.js +29 -3
  47. package/cjs/services/rune-service/index.js +105 -0
  48. package/cjs/services/transaction-service/helpers/index.js +7 -1
  49. package/cjs/services/transaction-service/index.js +136 -15
  50. package/cjs/services/transaction-service/utils.js +6 -3
  51. package/cjs/strategy/api-request-strategy/context/base.js +31 -0
  52. package/cjs/strategy/api-request-strategy/index.js +90 -0
  53. package/cjs/strategy/api-request-strategy/types.js +1 -0
  54. package/cjs/strategy/api-request-strategy/utils/index.js +33 -0
  55. package/cjs/types/account/info/keyring.js +1 -1
  56. package/cjs/types/bitcoin.js +24 -0
  57. package/cjs/types/fee/bitcoin.js +1 -0
  58. package/cjs/types/fee/index.js +11 -0
  59. package/cjs/types/index.js +11 -0
  60. package/cjs/utils/account/analyze.js +3 -3
  61. package/cjs/utils/account/common.js +16 -6
  62. package/cjs/utils/account/derive/info/solo.js +68 -19
  63. package/cjs/utils/account/derive/info/unified.js +2 -0
  64. package/cjs/utils/account/derive/validate.js +70 -2
  65. package/cjs/utils/account/transform.js +11 -5
  66. package/cjs/utils/bitcoin/common.js +98 -0
  67. package/cjs/utils/bitcoin/fee.js +21 -0
  68. package/cjs/utils/bitcoin/index.js +38 -0
  69. package/cjs/utils/bitcoin/utxo-management.js +281 -0
  70. package/cjs/utils/fee/transfer.js +48 -0
  71. package/cjs/utils/index.js +15 -1
  72. package/constants/bitcoin.d.ts +3 -0
  73. package/constants/bitcoin.js +13 -0
  74. package/constants/index.d.ts +2 -0
  75. package/constants/index.js +3 -1
  76. package/core/logic-validation/recipientAddress.js +10 -1
  77. package/core/logic-validation/transfer.d.ts +2 -2
  78. package/core/logic-validation/transfer.js +27 -7
  79. package/core/types.d.ts +1 -0
  80. package/core/types.js +1 -0
  81. package/core/utils.d.ts +1 -0
  82. package/core/utils.js +15 -2
  83. package/koni/background/handlers/Extension.d.ts +2 -0
  84. package/koni/background/handlers/Extension.js +58 -4
  85. package/koni/background/handlers/State.d.ts +7 -3
  86. package/koni/background/handlers/State.js +52 -12
  87. package/package.json +144 -8
  88. package/packageInfo.js +1 -1
  89. package/services/balance-service/helpers/subscribe/bitcoin.d.ts +2 -0
  90. package/services/balance-service/helpers/subscribe/bitcoin.js +87 -0
  91. package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
  92. package/services/balance-service/helpers/subscribe/index.js +20 -8
  93. package/services/balance-service/index.d.ts +2 -0
  94. package/services/balance-service/index.js +32 -4
  95. package/services/balance-service/transfer/bitcoin-transfer.d.ts +14 -0
  96. package/services/balance-service/transfer/bitcoin-transfer.js +112 -0
  97. package/services/balance-service/transfer/token.js +2 -0
  98. package/services/base/types.d.ts +2 -0
  99. package/services/base/types.js +2 -0
  100. package/services/chain-service/constants.d.ts +6 -0
  101. package/services/chain-service/constants.js +8 -2
  102. package/services/chain-service/handler/bitcoin/BitcoinApi.d.ts +31 -0
  103. package/services/chain-service/handler/bitcoin/BitcoinApi.js +98 -0
  104. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.d.ts +16 -0
  105. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +70 -0
  106. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.d.ts +28 -0
  107. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +362 -0
  108. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.d.ts +2 -0
  109. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +5 -0
  110. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.d.ts +28 -0
  111. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +359 -0
  112. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.d.ts +28 -0
  113. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +293 -0
  114. package/services/chain-service/handler/bitcoin/strategy/types.d.ts +291 -0
  115. package/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  116. package/services/chain-service/index.d.ts +3 -0
  117. package/services/chain-service/index.js +31 -5
  118. package/services/chain-service/types.d.ts +20 -0
  119. package/services/chain-service/utils/index.d.ts +4 -0
  120. package/services/chain-service/utils/index.js +50 -4
  121. package/services/chain-service/utils/patch.js +1 -1
  122. package/services/event-service/index.d.ts +3 -0
  123. package/services/event-service/index.js +4 -0
  124. package/services/event-service/types.d.ts +3 -0
  125. package/services/fee-service/service.js +8 -3
  126. package/services/hiro-service/index.d.ts +17 -0
  127. package/services/hiro-service/index.js +88 -0
  128. package/services/hiro-service/utils/index.d.ts +6 -0
  129. package/services/hiro-service/utils/index.js +72 -0
  130. package/services/history-service/bitcoin-history.d.ts +4 -0
  131. package/services/history-service/bitcoin-history.js +52 -0
  132. package/services/history-service/helpers/recoverHistoryStatus.d.ts +3 -1
  133. package/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  134. package/services/history-service/index.d.ts +1 -0
  135. package/services/history-service/index.js +42 -4
  136. package/services/keyring-service/context/handlers/Derive.js +2 -2
  137. package/services/keyring-service/context/handlers/Migration.js +2 -2
  138. package/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  139. package/services/migration-service/scripts/MigrateNewUnifiedAccount.d.ts +4 -0
  140. package/services/migration-service/scripts/MigrateNewUnifiedAccount.js +21 -0
  141. package/services/migration-service/scripts/index.js +3 -1
  142. package/services/request-service/handler/BitcoinRequestHandler.d.ts +23 -0
  143. package/services/request-service/handler/BitcoinRequestHandler.js +427 -0
  144. package/services/request-service/index.d.ts +9 -2
  145. package/services/request-service/index.js +25 -3
  146. package/services/rune-service/index.d.ts +17 -0
  147. package/services/rune-service/index.js +97 -0
  148. package/services/transaction-service/helpers/index.d.ts +3 -1
  149. package/services/transaction-service/helpers/index.js +5 -0
  150. package/services/transaction-service/index.d.ts +3 -5
  151. package/services/transaction-service/index.js +135 -16
  152. package/services/transaction-service/types.d.ts +12 -2
  153. package/services/transaction-service/utils.js +7 -4
  154. package/strategy/api-request-strategy/context/base.d.ts +15 -0
  155. package/strategy/api-request-strategy/context/base.js +24 -0
  156. package/strategy/api-request-strategy/index.d.ts +15 -0
  157. package/strategy/api-request-strategy/index.js +83 -0
  158. package/strategy/api-request-strategy/types.d.ts +22 -0
  159. package/strategy/api-request-strategy/types.js +1 -0
  160. package/strategy/api-request-strategy/utils/index.d.ts +2 -0
  161. package/strategy/api-request-strategy/utils/index.js +23 -0
  162. package/types/account/info/keyring.d.ts +1 -1
  163. package/types/account/info/keyring.js +1 -1
  164. package/types/balance/index.d.ts +4 -1
  165. package/types/balance/transfer.d.ts +17 -0
  166. package/types/bitcoin.d.ts +93 -0
  167. package/types/bitcoin.js +17 -0
  168. package/types/fee/base.d.ts +4 -1
  169. package/types/fee/bitcoin.d.ts +18 -0
  170. package/types/fee/bitcoin.js +1 -0
  171. package/types/fee/index.d.ts +1 -0
  172. package/types/fee/index.js +2 -1
  173. package/types/fee/subscription.d.ts +4 -3
  174. package/types/index.d.ts +1 -0
  175. package/types/index.js +1 -0
  176. package/utils/account/analyze.js +4 -4
  177. package/utils/account/common.d.ts +7 -8
  178. package/utils/account/common.js +16 -6
  179. package/utils/account/derive/info/solo.js +70 -21
  180. package/utils/account/derive/info/unified.js +2 -0
  181. package/utils/account/derive/validate.d.ts +1 -0
  182. package/utils/account/derive/validate.js +68 -1
  183. package/utils/account/transform.d.ts +1 -1
  184. package/utils/account/transform.js +11 -5
  185. package/utils/bitcoin/common.d.ts +22 -0
  186. package/utils/bitcoin/common.js +88 -0
  187. package/utils/bitcoin/fee.d.ts +2 -0
  188. package/utils/bitcoin/fee.js +14 -0
  189. package/utils/bitcoin/index.d.ts +3 -0
  190. package/utils/bitcoin/index.js +6 -0
  191. package/utils/bitcoin/utxo-management.d.ts +33 -0
  192. package/utils/bitcoin/utxo-management.js +266 -0
  193. package/utils/fee/transfer.d.ts +3 -1
  194. package/utils/fee/transfer.js +47 -1
  195. package/utils/index.d.ts +1 -0
  196. 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,
@@ -1917,6 +1955,7 @@ class KoniExtension {
1917
1955
  destChain: _destChain,
1918
1956
  feeCustom,
1919
1957
  feeOption,
1958
+ to,
1920
1959
  token,
1921
1960
  tokenPayFeeSlug,
1922
1961
  value
@@ -1939,6 +1978,7 @@ class KoniExtension {
1939
1978
  }
1940
1979
  const _request = {
1941
1980
  address: address,
1981
+ to: to,
1942
1982
  value,
1943
1983
  // todo: lazy subscribe to improve performance
1944
1984
  cardanoApi: this.#koniState.chainService.getCardanoApi(chain),
@@ -1951,6 +1991,7 @@ class KoniExtension {
1951
1991
  srcToken,
1952
1992
  substrateApi: this.#koniState.chainService.getSubstrateApi(chain),
1953
1993
  tonApi: this.#koniState.chainService.getTonApi(chain),
1994
+ bitcoinApi: this.#koniState.chainService.getBitcoinApi(chain),
1954
1995
  isTransferLocalTokenAndPayThatTokenAsFee,
1955
1996
  isTransferNativeTokenAndPayLocalTokenAsFee,
1956
1997
  nativeToken
@@ -2151,6 +2192,15 @@ class KoniExtension {
2151
2192
  });
2152
2193
  return this.#koniState.getConfirmationsQueueSubjectCardano().getValue();
2153
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
+ }
2154
2204
  async completeConfirmation(request) {
2155
2205
  return await this.#koniState.completeConfirmation(request);
2156
2206
  }
@@ -2160,7 +2210,9 @@ class KoniExtension {
2160
2210
  async completeConfirmationCardano(request) {
2161
2211
  return await this.#koniState.completeConfirmationCardano(request);
2162
2212
  }
2163
-
2213
+ async completeConfirmationBitcoin(request) {
2214
+ return await this.#koniState.completeConfirmationBitcoin(request);
2215
+ }
2164
2216
  /// Sign Qr
2165
2217
 
2166
2218
  getNetworkJsonByChainId(chainId) {
@@ -4730,12 +4782,16 @@ class KoniExtension {
4730
4782
  return this.subscribeConfirmationsTon(id, port);
4731
4783
  case 'pri(confirmationsCardano.subscribe)':
4732
4784
  return this.subscribeConfirmationsCardano(id, port);
4785
+ case 'pri(confirmationsBitcoin.subscribe)':
4786
+ return this.subscribeConfirmationsBitcoin(id, port);
4733
4787
  case 'pri(confirmations.complete)':
4734
4788
  return await this.completeConfirmation(request);
4735
4789
  case 'pri(confirmationsTon.complete)':
4736
4790
  return await this.completeConfirmationTon(request);
4737
4791
  case 'pri(confirmationsCardano.complete)':
4738
4792
  return await this.completeConfirmationCardano(request);
4793
+ case 'pri(confirmationsBitcoin.complete)':
4794
+ return await this.completeConfirmationBitcoin(request);
4739
4795
 
4740
4796
  /// Stake
4741
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.41-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
+ }
@@ -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) {
@@ -38,6 +38,9 @@ class BalanceService {
38
38
  stopPromiseHandler = (0, _utils2.createPromiseHandler)();
39
39
  status = _types.ServiceStatus.NOT_INITIALIZED;
40
40
  isReload = false;
41
+ get isStarted() {
42
+ return this.status === _types.ServiceStatus.STARTED;
43
+ }
41
44
  detectAccountBalanceStore = new _DetectAccountBalance.default();
42
45
  balanceDetectSubject = new _rxjs.BehaviorSubject({});
43
46
  intervalTime = 3 * 60 * 1000;
@@ -63,7 +66,7 @@ class BalanceService {
63
66
  this.status = _types.ServiceStatus.INITIALIZED;
64
67
 
65
68
  // Start service
66
- await this.start();
69
+ // await this.start(); // Commented out to avoid auto start when app not fully initialized
67
70
 
68
71
  // Handle events
69
72
  this.state.eventService.onLazy(this.handleEvents.bind(this));
@@ -149,7 +152,7 @@ class BalanceService {
149
152
  }
150
153
  if (needReload) {
151
154
  (0, _utils2.addLazy)('reloadBalanceByEvents', () => {
152
- if (!this.isReload) {
155
+ if (!this.isReload && this.isStarted) {
153
156
  this.runSubscribeBalances().catch(console.error);
154
157
  }
155
158
  }, lazyTime, undefined, true);
@@ -203,8 +206,9 @@ class BalanceService {
203
206
  const substrateApiMap = this.state.chainService.getSubstrateApiMap();
204
207
  const tonApiMap = this.state.chainService.getTonApiMap();
205
208
  const cardanoApiMap = this.state.chainService.getCardanoApiMap();
209
+ const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
206
210
  let unsub = _util.noop;
207
- unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
211
+ unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
208
212
  const rs = result[0];
209
213
  let value;
210
214
  switch (balanceType) {
@@ -375,13 +379,14 @@ class BalanceService {
375
379
  const substrateApiMap = this.state.chainService.getSubstrateApiMap();
376
380
  const tonApiMap = this.state.chainService.getTonApiMap();
377
381
  const cardanoApiMap = this.state.chainService.getCardanoApiMap();
382
+ const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
378
383
  const activeChainSlugs = Object.keys(this.state.getActiveChainInfoMap());
379
384
  const assetState = this.state.chainService.subscribeAssetSettings().value;
380
385
  const assets = Object.values(assetMap).filter(asset => {
381
386
  var _assetState$asset$slu;
382
387
  return activeChainSlugs.includes(asset.originChain) && ((_assetState$asset$slu = assetState[asset.slug]) === null || _assetState$asset$slu === void 0 ? void 0 : _assetState$asset$slu.visible);
383
388
  }).map(asset => asset.slug);
384
- const unsub = (0, _helpers.subscribeBalance)(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
389
+ const unsub = (0, _helpers.subscribeBalance)(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
385
390
  !cancel && this.setBalanceItem(result);
386
391
  }, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
387
392
  const unsub2 = this.state.subscribeMantaPayBalance();
@@ -391,6 +396,29 @@ class BalanceService {
391
396
  unsub2 && unsub2();
392
397
  };
393
398
  }
399
+ async refreshBalanceForAddress(address, chain, asset, extrinsicType) {
400
+ // Check if address and chain are valid
401
+ const chainInfoMap = this.state.chainService.getChainInfoMap();
402
+ if (!chainInfoMap[chain]) {
403
+ console.warn(`Chain ${chain} is not supported`);
404
+ return;
405
+ }
406
+
407
+ // Get necessary data
408
+ const assetMap = this.state.chainService.getAssetRegistry();
409
+ const evmApiMap = this.state.chainService.getEvmApiMap();
410
+ const substrateApiMap = this.state.chainService.getSubstrateApiMap();
411
+ const tonApiMap = this.state.chainService.getTonApiMap();
412
+ const cardanoApiMap = this.state.chainService.getCardanoApiMap();
413
+ const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
414
+ return new Promise(resolve => {
415
+ const unsub = (0, _helpers.subscribeBalance)([address], [chain], [asset], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
416
+ this.setBalanceItem(result);
417
+ unsub();
418
+ resolve();
419
+ }, extrinsicType || _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
420
+ });
421
+ }
394
422
 
395
423
  /** Unsubscribe balance subscription */
396
424
  runUnsubscribeBalances() {