@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
@@ -8,6 +8,7 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
8
  var _constants = require("@subwallet/extension-base/constants");
9
9
  var _types = require("@subwallet/extension-base/services/base/types");
10
10
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
11
+ var _bitcoinHistory = require("@subwallet/extension-base/services/history-service/bitcoin-history");
11
12
  var _recoverHistoryStatus = require("@subwallet/extension-base/services/history-service/helpers/recoverHistoryStatus");
12
13
  var _subscanExtrinsicParserHelper = require("@subwallet/extension-base/services/history-service/helpers/subscan-extrinsic-parser-helper");
13
14
  var _subscanHistory = require("@subwallet/extension-base/services/history-service/subscan-history");
@@ -149,20 +150,48 @@ class HistoryService {
149
150
  console.log('fetchAllPossibleTransferItems-receive error', e);
150
151
  });
151
152
  }
153
+
154
+ // Only 1 address is passed in
155
+ async fetchBitcoinTransactionHistory(chain, addresses) {
156
+ const chainInfo = this.chainService.getChainInfoByKey(chain);
157
+ const chainState = this.chainService.getChainStateByKey(chain);
158
+ if (!chainState.active) {
159
+ return;
160
+ }
161
+ const bitcoinApi = this.chainService.getBitcoinApi(chain);
162
+ const allParsedItems = [];
163
+ for (const address of addresses) {
164
+ const transferItems = await bitcoinApi.api.getAddressTransaction(address);
165
+ const parsedItems = transferItems.map((item, index) => {
166
+ const parsedItem = (0, _bitcoinHistory.parseBitcoinTransferData)(address, item, chainInfo);
167
+ return {
168
+ ...parsedItem,
169
+ apiTxIndex: index
170
+ };
171
+ });
172
+ allParsedItems.push(...parsedItems);
173
+ }
174
+ await this.addHistoryItems(allParsedItems);
175
+ }
152
176
  subscribeHistories(chain, proxyId, cb) {
153
177
  const addresses = this.keyringService.context.getDecodedAddresses(proxyId, false);
178
+ const chainInfo = this.chainService.getChainInfoByKey(chain);
154
179
  const evmAddresses = (0, _utils2.getAddressesByChainType)(addresses, [_KoniTypes.ChainType.EVM]);
155
180
  const substrateAddresses = (0, _utils2.getAddressesByChainType)(addresses, [_KoniTypes.ChainType.SUBSTRATE]);
181
+ const bitcoinAddresses = (0, _utils2.getAddressesByChainType)(addresses, [_KoniTypes.ChainType.BITCOIN], chainInfo);
156
182
  const subscription = this.historySubject.subscribe(items => {
157
183
  cb(items.filter(filterHistoryItemByAddressAndChain(chain, addresses)));
158
184
  });
159
- const chainInfo = this.chainService.getChainInfoByKey(chain);
160
185
  if ((0, _utils._isChainSubstrateCompatible)(chainInfo)) {
161
186
  if ((0, _utils._isChainEvmCompatible)(chainInfo)) {
162
187
  this.fetchSubscanTransactionHistory(chain, evmAddresses);
163
188
  } else {
164
189
  this.fetchSubscanTransactionHistory(chain, substrateAddresses);
165
190
  }
191
+ } else if ((0, _utils._isChainBitcoinCompatible)(chainInfo)) {
192
+ this.fetchBitcoinTransactionHistory(chain, bitcoinAddresses).catch(e => {
193
+ console.log('fetchBitcoinTransactionHistory Error', e);
194
+ });
166
195
  }
167
196
  return {
168
197
  unsubscribe: subscription.unsubscribe,
@@ -203,7 +232,8 @@ class HistoryService {
203
232
  if (needUpdateItem) {
204
233
  updateRecords.push({
205
234
  ...needUpdateItem,
206
- status: item.status
235
+ status: item.status,
236
+ apiTxIndex: item.apiTxIndex
207
237
  });
208
238
  return;
209
239
  }
@@ -256,6 +286,9 @@ class HistoryService {
256
286
  switch (recoverResult.status) {
257
287
  case _recoverHistoryStatus.HistoryRecoverStatus.API_INACTIVE:
258
288
  break;
289
+ case _recoverHistoryStatus.HistoryRecoverStatus.TX_PENDING:
290
+ delete this.#needRecoveryHistories[currentExtrinsicHash];
291
+ break;
259
292
  case _recoverHistoryStatus.HistoryRecoverStatus.FAILED:
260
293
  case _recoverHistoryStatus.HistoryRecoverStatus.SUCCESS:
261
294
  updateData.status = recoverResult.status === _recoverHistoryStatus.HistoryRecoverStatus.SUCCESS ? _KoniTypes.ExtrinsicStatus.SUCCESS : _KoniTypes.ExtrinsicStatus.FAIL;
@@ -293,7 +326,12 @@ class HistoryService {
293
326
  const histories = await this.dbService.getHistories();
294
327
  this.#needRecoveryHistories = {};
295
328
  histories.filter(history => {
296
- return [_KoniTypes.ExtrinsicStatus.PROCESSING, _KoniTypes.ExtrinsicStatus.SUBMITTING].includes(history.status);
329
+ if ([_KoniTypes.ExtrinsicStatus.PROCESSING, _KoniTypes.ExtrinsicStatus.SUBMITTING].includes(history.status)) {
330
+ return true;
331
+ } else if (history.status === _KoniTypes.ExtrinsicStatus.SUCCESS && history.chainType === 'bitcoin') {
332
+ return !history.blockTime;
333
+ }
334
+ return false;
297
335
  }).filter(history => {
298
336
  if (history.type === _KoniTypes.ExtrinsicType.TRANSFER_XCM) {
299
337
  const data = history.additionalInfo;
@@ -15,7 +15,7 @@ var _Base = require("./Base");
15
15
  // Copyright 2019-2022 @subwallet/extension-base
16
16
  // SPDX-License-Identifier: Apache-2.0
17
17
 
18
- const validDeriveKeypairTypes = [..._types2.SubstrateKeypairTypes, ..._types2.EthereumKeypairTypes, 'ton', 'cardano'];
18
+ const validDeriveKeypairTypes = [..._types2.SubstrateKeypairTypes, ..._types2.EthereumKeypairTypes, 'ton', 'cardano', ..._types2.BitcoinKeypairTypes];
19
19
 
20
20
  /**
21
21
  * @class AccountDeriveHandler
@@ -82,7 +82,7 @@ class AccountMigrationHandler extends _Base.AccountBaseHandler {
82
82
  proxyId
83
83
  }).result;
84
84
  const newChainTypes = Object.values(_types.AccountChainType).filter(type => !unifiedAccount.chainTypes.includes(type) && _types.SUPPORTED_ACCOUNT_CHAIN_TYPES.includes(type));
85
- const keypairTypes = newChainTypes.map(chainType => (0, _utils.getDefaultKeypairTypeFromAccountChainType)(chainType));
85
+ const keypairTypes = newChainTypes.flatMap(chainType => (0, _utils.getDefaultKeypairTypeFromAccountChainType)(chainType));
86
86
  keypairTypes.forEach(type => {
87
87
  const suri = (0, _utils.getSuri)(mnemonic, type);
88
88
  const pair = _uiKeyring.keyring.createFromUri(suri, {}, type);
@@ -187,7 +187,7 @@ class AccountMigrationHandler extends _Base.AccountBaseHandler {
187
187
  password,
188
188
  proxyId: firstAccountOldProxyId
189
189
  }).result;
190
- const keypairTypes = _types.SUPPORTED_ACCOUNT_CHAIN_TYPES.map(chainType => (0, _utils.getDefaultKeypairTypeFromAccountChainType)(chainType));
190
+ const keypairTypes = _types.SUPPORTED_ACCOUNT_CHAIN_TYPES.flatMap(chainType => (0, _utils.getDefaultKeypairTypeFromAccountChainType)(chainType));
191
191
  keypairTypes.forEach(type => {
192
192
  const suri = (0, _utils.getSuri)(mnemonic, type);
193
193
  const pair = _uiKeyring.keyring.createFromUri(suri, {}, type);
@@ -7,6 +7,7 @@ exports.SEED_LENGTHS = exports.SEED_DEFAULT_LENGTH = exports.AccountMnemonicHand
7
7
  var _types = require("@subwallet/extension-base/types");
8
8
  var _utils = require("@subwallet/extension-base/utils");
9
9
  var _keyring = require("@subwallet/keyring");
10
+ var _types2 = require("@subwallet/keyring/types");
10
11
  var _utils2 = require("@subwallet/keyring/utils");
11
12
  var _uiKeyring = require("@subwallet/ui-keyring");
12
13
  var _i18next = require("i18next");
@@ -36,7 +37,7 @@ class AccountMnemonicHandler extends _Base.AccountBaseHandler {
36
37
  mnemonic: _seed,
37
38
  type = 'general'
38
39
  } = _ref;
39
- const types = type === 'general' ? ['sr25519', 'ethereum', 'ton', 'cardano'] : ['ton-native'];
40
+ const types = type === 'general' ? ['sr25519', ..._types2.EthereumKeypairTypes, 'ton', ..._types2.CardanoKeypairTypes, ..._types2.BitcoinKeypairTypes] : ['ton-native'];
40
41
  const seed = _seed || type === 'general' ? (0, _utilCrypto.mnemonicGenerate)(length) : await (0, _keyring.tonMnemonicGenerate)(length);
41
42
  const rs = {
42
43
  mnemonic: seed,
@@ -70,7 +71,7 @@ class AccountMnemonicHandler extends _Base.AccountBaseHandler {
70
71
  try {
71
72
  (0, _util.assert)((0, _utilCrypto.mnemonicValidate)(phrase), (0, _i18next.t)('Invalid seed phrase. Please try again.'));
72
73
  mnemonicTypes = 'general';
73
- pairTypes = ['sr25519', 'ethereum', 'ton'];
74
+ pairTypes = ['sr25519', ..._types2.EthereumKeypairTypes, 'ton', ..._types2.CardanoKeypairTypes, ..._types2.BitcoinKeypairTypes];
74
75
  } catch (e) {
75
76
  (0, _util.assert)((0, _utils2.tonMnemonicValidate)(phrase), (0, _i18next.t)('Invalid seed phrase. Please try again.'));
76
77
  mnemonicTypes = 'ton';
@@ -107,7 +108,7 @@ class AccountMnemonicHandler extends _Base.AccountBaseHandler {
107
108
  const addressDict = {};
108
109
  let changedAccount = false;
109
110
  const hasMasterPassword = _uiKeyring.keyring.keyring.hasMasterPassword;
110
- const types = type ? [type] : ['sr25519', 'ethereum', 'ton', 'cardano'];
111
+ const types = type ? [type] : ['sr25519', ..._types2.EthereumKeypairTypes, 'ton', ..._types2.CardanoKeypairTypes, ..._types2.BitcoinKeypairTypes];
111
112
  if (!hasMasterPassword) {
112
113
  if (!password) {
113
114
  throw Error((0, _i18next.t)('The password of each account is needed to set up master password'));
@@ -0,0 +1,29 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class MigrateNewUnifiedAccount extends _Base.default {
13
+ async run() {
14
+ try {
15
+ return new Promise(resolve => {
16
+ this.state.settingService.getSettings(currentSettings => {
17
+ this.state.settingService.setSettings({
18
+ ...currentSettings,
19
+ isAcknowledgedUnifiedAccountMigration: false
20
+ });
21
+ resolve();
22
+ });
23
+ });
24
+ } catch (e) {
25
+ console.error(e);
26
+ }
27
+ }
28
+ }
29
+ exports.default = MigrateNewUnifiedAccount;
@@ -26,6 +26,7 @@ var _EnableVaraChain = _interopRequireDefault(require("./EnableVaraChain"));
26
26
  var _MigrateAuthUrls = _interopRequireDefault(require("./MigrateAuthUrls"));
27
27
  var _MigrateImportedToken = _interopRequireDefault(require("./MigrateImportedToken"));
28
28
  var _MigrateNetworkSettings = _interopRequireDefault(require("./MigrateNetworkSettings"));
29
+ var _MigrateNewUnifiedAccount = _interopRequireDefault(require("./MigrateNewUnifiedAccount"));
29
30
  var _MigrateTokenDecimals = _interopRequireDefault(require("./MigrateTokenDecimals"));
30
31
  var _MigrateTransactionHistory = _interopRequireDefault(require("./MigrateTransactionHistory"));
31
32
  var _MigrateTransactionHistoryBridge = _interopRequireDefault(require("./MigrateTransactionHistoryBridge"));
@@ -70,8 +71,9 @@ var _default = {
70
71
  '1.3.6-01': _MigrateTransactionHistoryBridge.default,
71
72
  '1.3.10-01': _ClearMetadataDatabase.default,
72
73
  '1.3.26-01': _DisableZeroBalanceTokens.default,
73
- [MYTHOS_MIGRATION_KEY]: _ClearMetadataForMythos.default
74
+ [MYTHOS_MIGRATION_KEY]: _ClearMetadataForMythos.default,
74
75
  // [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol
75
76
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
77
+ '1.3.42-01': _MigrateNewUnifiedAccount.default
76
78
  };
77
79
  exports.default = _default;
@@ -0,0 +1,440 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _BitcoinProviderError = require("@subwallet/extension-base/background/errors/BitcoinProviderError");
9
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
10
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
11
+ var _bitcoinTransfer = require("@subwallet/extension-base/services/balance-service/transfer/bitcoin-transfer");
12
+ var _types = require("@subwallet/extension-base/types");
13
+ var _utils = require("@subwallet/extension-base/utils");
14
+ var _getId = require("@subwallet/extension-base/utils/getId");
15
+ var _request = require("@subwallet/extension-base/utils/request");
16
+ var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
17
+ var bitcoin = _interopRequireWildcard(require("bitcoinjs-lib"));
18
+ var _i18next = require("i18next");
19
+ var _rxjs = require("rxjs");
20
+ var _util = require("@polkadot/util");
21
+ 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); }
22
+ 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; }
23
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
24
+ // SPDX-License-Identifier: Apache-2.0
25
+
26
+ class BitcoinRequestHandler {
27
+ #requestService;
28
+ #chainService;
29
+ #transactionService;
30
+ #feeService;
31
+ #logger;
32
+ confirmationsQueueSubjectBitcoin = new _rxjs.BehaviorSubject({
33
+ bitcoinSignatureRequest: {},
34
+ bitcoinSendTransactionRequest: {},
35
+ bitcoinWatchTransactionRequest: {},
36
+ bitcoinSendTransactionRequestAfterConfirmation: {},
37
+ bitcoinSignPsbtRequest: {}
38
+ });
39
+ confirmationsPromiseMap = {};
40
+ constructor(requestService, chainService, feeService, transactionService) {
41
+ this.#requestService = requestService;
42
+ this.#chainService = chainService;
43
+ this.#feeService = feeService;
44
+ this.#transactionService = transactionService;
45
+ this.#logger = (0, _util.logger)('BitcoinRequestHandler');
46
+ }
47
+ get numBitcoinRequests() {
48
+ let count = 0;
49
+ Object.values(this.confirmationsQueueSubjectBitcoin.getValue()).forEach(x => {
50
+ count += Object.keys(x).length;
51
+ });
52
+ return count;
53
+ }
54
+ getConfirmationsQueueSubjectBitcoin() {
55
+ return this.confirmationsQueueSubjectBitcoin;
56
+ }
57
+ async addConfirmationBitcoin(id, url, type, payload) {
58
+ let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
59
+ let validator = arguments.length > 5 ? arguments[5] : undefined;
60
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
61
+ const confirmationType = confirmations[type];
62
+ const payloadJson = JSON.stringify(payload);
63
+ const isInternal = (0, _request.isInternalRequest)(url);
64
+ if (['bitcoinSignatureRequest', 'bitcoinSendTransactionRequest', 'bitcoinSendTransactionRequestAfterConfirmation'].includes(type)) {
65
+ const isAlwaysRequired = await this.#requestService.settingService.isAlwaysRequired;
66
+ if (isAlwaysRequired) {
67
+ this.#requestService.keyringService.lock();
68
+ }
69
+ }
70
+
71
+ // Check duplicate request
72
+ const duplicated = Object.values(confirmationType).find(c => c.url === url && c.payloadJson === payloadJson);
73
+ if (duplicated) {
74
+ throw new Error('Duplicate request');
75
+ }
76
+ confirmationType[id] = {
77
+ id,
78
+ url,
79
+ isInternal,
80
+ payload,
81
+ payloadJson,
82
+ ...options
83
+ };
84
+ const promise = new Promise((resolve, reject) => {
85
+ this.confirmationsPromiseMap[id] = {
86
+ validator: validator,
87
+ resolver: {
88
+ resolve: resolve,
89
+ reject: reject
90
+ }
91
+ };
92
+ });
93
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
94
+ if (!isInternal) {
95
+ this.#requestService.popupOpen();
96
+ }
97
+ this.#requestService.updateIconV2();
98
+ return promise;
99
+ }
100
+ updateConfirmationBitcoin(id, type, payload) {
101
+ let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
102
+ let validator = arguments.length > 4 ? arguments[4] : undefined;
103
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
104
+ const confirmationType = confirmations[type];
105
+
106
+ // Check duplicate request
107
+ const exists = confirmationType[id];
108
+ if (!exists) {
109
+ throw new Error('Request does not exist');
110
+ }
111
+ const payloadJson = JSON.stringify(payload);
112
+ confirmationType[id] = {
113
+ ...exists,
114
+ payload,
115
+ payloadJson,
116
+ ...options
117
+ };
118
+ if (validator) {
119
+ this.confirmationsPromiseMap[id].validator = validator;
120
+ }
121
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
122
+ }
123
+ signMessageBitcoin(confirmation) {
124
+ const {
125
+ account,
126
+ payload
127
+ } = confirmation.payload;
128
+ const address = account.address;
129
+ const pair = _uiKeyring.default.getPair(address);
130
+ if (pair.isLocked) {
131
+ _uiKeyring.default.unlockPair(pair.address);
132
+ }
133
+
134
+ // Check if payload is a string
135
+ if (typeof payload === 'string') {
136
+ // Assume BitcoinSigner is an instance that implements the BitcoinSigner interface
137
+ return {
138
+ signature: pair.bitcoin.signMessage(payload),
139
+ message: payload,
140
+ address
141
+ }; // Assuming compressed = false
142
+ } else if (payload instanceof Uint8Array) {
143
+ // Check if payload is a byte array (Uint8Array)
144
+ // Convert Uint8Array to string
145
+ const payloadString = Buffer.from(payload).toString('hex');
146
+
147
+ // Assume BitcoinSigner is an instance that implements the BitcoinSigner interface
148
+ return {
149
+ signature: pair.bitcoin.signMessage(payloadString),
150
+ message: payload.toString(),
151
+ address
152
+ }; // Assuming compressed = false
153
+ } else {
154
+ // Handle the case where payload is invalid
155
+ throw new Error('Invalid payload type');
156
+ }
157
+ }
158
+ signTransactionBitcoin(request) {
159
+ // Extract necessary information from the BitcoinSendTransactionRequest
160
+ const {
161
+ account,
162
+ hashPayload
163
+ } = request.payload;
164
+ const address = account.address;
165
+ const pair = _uiKeyring.default.getPair(address);
166
+
167
+ // Unlock the pair if it is locked
168
+ if (pair.isLocked) {
169
+ _uiKeyring.default.unlockPair(pair.address);
170
+ }
171
+ const psbt = bitcoin.Psbt.fromHex(hashPayload);
172
+
173
+ // Finalize all inputs in the Psbt
174
+ // Sign the Psbt using the pair's bitcoin object
175
+ const signedTransaction = pair.bitcoin.signTransaction(psbt, psbt.txInputs.map((v, i) => i));
176
+ signedTransaction.finalizeAllInputs();
177
+ return signedTransaction.extractTransaction().toHex();
178
+ }
179
+ async signTransactionBitcoinWithPayload(request) {
180
+ const transaction = this.#transactionService.getTransaction(request.id);
181
+ const {
182
+ chain,
183
+ emitterTransaction,
184
+ feeCustom,
185
+ feeOption,
186
+ id
187
+ } = transaction;
188
+ const {
189
+ from,
190
+ to,
191
+ value
192
+ } = transaction.data;
193
+ if (!emitterTransaction) {
194
+ throw new _BitcoinProviderError.BitcoinProviderError(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
195
+ }
196
+ const chainInfo = this.#chainService.getChainInfoByKey(chain);
197
+ const bitcoinApi = this.#chainService.getBitcoinApi(chain);
198
+ const eventData = {
199
+ id,
200
+ errors: [],
201
+ warnings: [],
202
+ extrinsicHash: id
203
+ };
204
+ const network = chainInfo.isTestnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin;
205
+ const feeInfo = await this.#feeService.subscribeChainFee((0, _getId.getId)(), chain, 'bitcoin');
206
+ const [psbt] = await (0, _bitcoinTransfer.createBitcoinTransaction)({
207
+ bitcoinApi,
208
+ chain,
209
+ from,
210
+ feeCustom,
211
+ feeOption,
212
+ feeInfo,
213
+ to,
214
+ transferAll: false,
215
+ value: value || '0',
216
+ network
217
+ });
218
+ const pair = _uiKeyring.default.getPair(from);
219
+
220
+ // Unlock the pair if it is locked
221
+ if (pair.isLocked) {
222
+ _uiKeyring.default.unlockPair(pair.address);
223
+ }
224
+
225
+ // Finalize all inputs in the Psbt
226
+
227
+ // Sign the Psbt using the pair's bitcoin object
228
+ const signedTransaction = pair.bitcoin.signTransaction(psbt, psbt.txInputs.map((v, i) => i));
229
+ signedTransaction.finalizeAllInputs();
230
+ const signature = signedTransaction.extractTransaction().toHex();
231
+ this.#transactionService.emitterEventTransaction(emitterTransaction, eventData, chainInfo.slug, signature);
232
+ const {
233
+ promise,
234
+ reject,
235
+ resolve
236
+ } = (0, _utils.createPromiseHandler)();
237
+ emitterTransaction.on('extrinsicHash', data => {
238
+ if (!data.extrinsicHash) {
239
+ reject(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
240
+ } else {
241
+ resolve(data.extrinsicHash);
242
+ }
243
+ });
244
+ emitterTransaction.on('error', error => {
245
+ reject(error);
246
+ });
247
+ return promise;
248
+ }
249
+ async signPsbt(request) {
250
+ // Extract necessary information from the BitcoinSendTransactionRequest
251
+ const {
252
+ account,
253
+ payload
254
+ } = request.payload;
255
+ const {
256
+ allowedSighash,
257
+ broadcast,
258
+ psbt,
259
+ signAtIndex
260
+ } = payload;
261
+ const transaction = this.#transactionService.getTransaction(request.id);
262
+ let eventData = {
263
+ id: request.id,
264
+ errors: [],
265
+ warnings: [],
266
+ extrinsicHash: request.id
267
+ };
268
+
269
+ // todo: validate type of the account
270
+
271
+ if (Object.keys(account).length === 0) {
272
+ throw new _BitcoinProviderError.BitcoinProviderError(_KoniTypes.BitcoinProviderErrorType.INVALID_PARAMS, 'Please connect to Wallet to try this request');
273
+ }
274
+ const pair = _uiKeyring.default.getPair(account.address);
275
+
276
+ // Unlock the pair if it is locked
277
+ if (pair.isLocked) {
278
+ _uiKeyring.default.unlockPair(pair.address);
279
+ }
280
+ const signAtIndexGenerate = signAtIndex ? (0, _util.isArray)(signAtIndex) ? signAtIndex : [signAtIndex] : [...Array(psbt.inputCount)].map((_, i) => i);
281
+ let psptSignedTransaction = null;
282
+
283
+ // Sign the Psbt using the pair's bitcoin object
284
+ try {
285
+ psptSignedTransaction = pair.bitcoin.signTransaction(psbt, signAtIndexGenerate, allowedSighash);
286
+ } catch (e) {
287
+ if (transaction) {
288
+ var _transaction$emitterT;
289
+ (_transaction$emitterT = transaction.emitterTransaction) === null || _transaction$emitterT === void 0 ? void 0 : _transaction$emitterT.emit('error', {
290
+ ...eventData,
291
+ errors: [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, e.message)],
292
+ id: transaction.id,
293
+ extrinsicHash: transaction.id
294
+ });
295
+ }
296
+ throw new Error(e.message);
297
+ }
298
+ if (!psptSignedTransaction) {
299
+ throw new Error('Unable to sign');
300
+ }
301
+ if (!broadcast) {
302
+ for (const index of signAtIndexGenerate) {
303
+ psptSignedTransaction.finalizeInput(index);
304
+ }
305
+ return {
306
+ psbt: psptSignedTransaction.toHex()
307
+ };
308
+ }
309
+ if (!transaction) {
310
+ throw new _BitcoinProviderError.BitcoinProviderError(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
311
+ }
312
+ const {
313
+ chain,
314
+ emitterTransaction,
315
+ id
316
+ } = transaction;
317
+ eventData = {
318
+ id,
319
+ errors: [],
320
+ warnings: [],
321
+ extrinsicHash: id
322
+ };
323
+ if (!emitterTransaction) {
324
+ throw new _BitcoinProviderError.BitcoinProviderError(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
325
+ }
326
+ const chainInfo = this.#chainService.getChainInfoByKey(chain);
327
+ try {
328
+ psptSignedTransaction.finalizeAllInputs();
329
+ } catch (e) {
330
+ emitterTransaction.emit('error', {
331
+ ...eventData,
332
+ errors: [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, e.message)]
333
+ });
334
+ throw new Error(e.message);
335
+ }
336
+ const hexTransaction = psptSignedTransaction.extractTransaction().toHex();
337
+ this.#transactionService.emitterEventTransaction(emitterTransaction, eventData, chainInfo.slug, hexTransaction);
338
+ const {
339
+ promise,
340
+ reject,
341
+ resolve
342
+ } = (0, _utils.createPromiseHandler)();
343
+ emitterTransaction.on('extrinsicHash', data => {
344
+ if (!data.extrinsicHash || !psptSignedTransaction) {
345
+ reject(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
346
+ } else {
347
+ var _psptSignedTransactio;
348
+ resolve({
349
+ psbt: (_psptSignedTransactio = psptSignedTransaction) === null || _psptSignedTransactio === void 0 ? void 0 : _psptSignedTransactio.toHex(),
350
+ txid: data.extrinsicHash
351
+ });
352
+ }
353
+ });
354
+ emitterTransaction.on('error', error => {
355
+ reject(error);
356
+ });
357
+ return promise;
358
+ }
359
+ async decorateResultBitcoin(t, request, result) {
360
+ if (t === 'bitcoinSignatureRequest') {
361
+ result.payload = this.signMessageBitcoin(request);
362
+ } else if (t === 'bitcoinSendTransactionRequest') {
363
+ result.payload = this.signTransactionBitcoin(request);
364
+ } else if (t === 'bitcoinSignPsbtRequest') {
365
+ result.payload = await this.signPsbt(request);
366
+ } else if (t === 'bitcoinSendTransactionRequestAfterConfirmation') {
367
+ result.payload = await this.signTransactionBitcoinWithPayload(request);
368
+ }
369
+ if (t === 'bitcoinSignatureRequest' || t === 'bitcoinSendTransactionRequest' || t === 'bitcoinSignPsbtRequest' || t === 'bitcoinSendTransactionRequestAfterConfirmation') {
370
+ const isAlwaysRequired = await this.#requestService.settingService.isAlwaysRequired;
371
+ if (isAlwaysRequired) {
372
+ this.#requestService.keyringService.lock();
373
+ }
374
+ }
375
+ }
376
+ async completeConfirmationBitcoin(request) {
377
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
378
+ for (const ct in request) {
379
+ const type = ct;
380
+ const result = request[type];
381
+ const {
382
+ id,
383
+ isApproved
384
+ } = result;
385
+ const {
386
+ resolver,
387
+ validator
388
+ } = this.confirmationsPromiseMap[id];
389
+ const confirmation = confirmations[type][id];
390
+ if (!resolver || !confirmation) {
391
+ this.#logger.error((0, _i18next.t)('Unable to proceed. Please try again'), type, id);
392
+ throw new Error('Unable to proceed. Please try again');
393
+ }
394
+ if (isApproved) {
395
+ try {
396
+ // Fill signature for some special type
397
+ await this.decorateResultBitcoin(type, confirmation, result);
398
+ const error = validator && validator(result);
399
+ if (error) {
400
+ resolver.reject(error);
401
+ }
402
+ } catch (e) {
403
+ resolver.reject(e);
404
+ }
405
+ }
406
+
407
+ // Delete confirmations from queue
408
+ delete this.confirmationsPromiseMap[id];
409
+ delete confirmations[type][id];
410
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
411
+
412
+ // Update icon, and close queue
413
+ this.#requestService.updateIconV2(this.#requestService.numAllRequests === 0);
414
+ resolver.resolve(result);
415
+ }
416
+ return true;
417
+ }
418
+ resetWallet() {
419
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
420
+ for (const [type, requests] of Object.entries(confirmations)) {
421
+ for (const confirmation of Object.values(requests)) {
422
+ const {
423
+ id
424
+ } = confirmation;
425
+ const {
426
+ resolver
427
+ } = this.confirmationsPromiseMap[id];
428
+ if (!resolver || !confirmation) {
429
+ console.error('Not found confirmation', type, id);
430
+ } else {
431
+ resolver.reject(new Error('Reset wallet'));
432
+ }
433
+ delete this.confirmationsPromiseMap[id];
434
+ delete confirmations[type][id];
435
+ }
436
+ }
437
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
438
+ }
439
+ }
440
+ exports.default = BitcoinRequestHandler;