@subwallet/extension-base 1.3.41-0 → 1.3.43-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 (219) hide show
  1. package/background/KoniTypes.d.ts +134 -5
  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/background/types.d.ts +1 -1
  6. package/cjs/background/KoniTypes.js +20 -1
  7. package/cjs/background/errors/BitcoinProviderError.js +54 -0
  8. package/cjs/constants/bitcoin.js +22 -0
  9. package/cjs/constants/index.js +16 -1
  10. package/cjs/core/logic-validation/recipientAddress.js +9 -0
  11. package/cjs/core/logic-validation/request.js +316 -3
  12. package/cjs/core/logic-validation/transfer.js +25 -5
  13. package/cjs/core/types.js +1 -0
  14. package/cjs/core/utils.js +15 -1
  15. package/cjs/koni/background/handlers/Extension.js +477 -93
  16. package/cjs/koni/background/handlers/State.js +249 -16
  17. package/cjs/koni/background/handlers/Tabs.js +119 -6
  18. package/cjs/packageInfo.js +1 -1
  19. package/cjs/page/bitcoin/index.js +67 -0
  20. package/cjs/page/index.js +5 -0
  21. package/cjs/services/balance-service/helpers/subscribe/bitcoin.js +94 -0
  22. package/cjs/services/balance-service/helpers/subscribe/index.js +19 -7
  23. package/cjs/services/balance-service/index.js +32 -4
  24. package/cjs/services/balance-service/transfer/bitcoin-transfer.js +119 -0
  25. package/cjs/services/balance-service/transfer/token.js +2 -0
  26. package/cjs/services/base/types.js +2 -0
  27. package/cjs/services/buy-service/index.js +17 -2
  28. package/cjs/services/chain-service/constants.js +14 -3
  29. package/cjs/services/chain-service/handler/bitcoin/BitcoinApi.js +105 -0
  30. package/cjs/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +78 -0
  31. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +371 -0
  32. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +19 -0
  33. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +368 -0
  34. package/cjs/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +302 -0
  35. package/cjs/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  36. package/cjs/services/chain-service/index.js +27 -3
  37. package/cjs/services/chain-service/utils/index.js +57 -4
  38. package/cjs/services/chain-service/utils/patch.js +1 -1
  39. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +27 -5
  40. package/cjs/services/event-service/index.js +4 -0
  41. package/cjs/services/fee-service/service.js +8 -3
  42. package/cjs/services/hiro-service/index.js +96 -0
  43. package/cjs/services/hiro-service/utils/index.js +85 -0
  44. package/cjs/services/history-service/bitcoin-history.js +58 -0
  45. package/cjs/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  46. package/cjs/services/history-service/index.js +41 -3
  47. package/cjs/services/keyring-service/context/handlers/Derive.js +1 -1
  48. package/cjs/services/keyring-service/context/handlers/Migration.js +2 -2
  49. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  50. package/cjs/services/migration-service/scripts/MigrateNewUnifiedAccount.js +29 -0
  51. package/cjs/services/migration-service/scripts/index.js +3 -1
  52. package/cjs/services/request-service/handler/AuthRequestHandler.js +18 -0
  53. package/cjs/services/request-service/handler/BitcoinRequestHandler.js +427 -0
  54. package/cjs/services/request-service/index.js +29 -3
  55. package/cjs/services/rune-service/index.js +105 -0
  56. package/cjs/services/transaction-service/helpers/index.js +7 -1
  57. package/cjs/services/transaction-service/index.js +206 -16
  58. package/cjs/services/transaction-service/utils.js +6 -3
  59. package/cjs/strategy/api-request-strategy/context/base.js +31 -0
  60. package/cjs/strategy/api-request-strategy/index.js +90 -0
  61. package/cjs/strategy/api-request-strategy/types.js +1 -0
  62. package/cjs/strategy/api-request-strategy/utils/index.js +33 -0
  63. package/cjs/types/account/info/keyring.js +1 -1
  64. package/cjs/types/bitcoin.js +24 -0
  65. package/cjs/types/fee/bitcoin.js +1 -0
  66. package/cjs/types/fee/index.js +11 -0
  67. package/cjs/types/index.js +11 -0
  68. package/cjs/utils/account/analyze.js +3 -3
  69. package/cjs/utils/account/common.js +16 -6
  70. package/cjs/utils/account/derive/info/solo.js +68 -19
  71. package/cjs/utils/account/derive/info/unified.js +2 -0
  72. package/cjs/utils/account/derive/validate.js +70 -2
  73. package/cjs/utils/account/transform.js +11 -5
  74. package/cjs/utils/auth.js +2 -1
  75. package/cjs/utils/bitcoin/common.js +98 -0
  76. package/cjs/utils/bitcoin/fee.js +21 -0
  77. package/cjs/utils/bitcoin/index.js +38 -0
  78. package/cjs/utils/bitcoin/utxo-management.js +281 -0
  79. package/cjs/utils/fee/transfer.js +48 -0
  80. package/cjs/utils/index.js +15 -1
  81. package/constants/bitcoin.d.ts +3 -0
  82. package/constants/bitcoin.js +13 -0
  83. package/constants/index.d.ts +2 -0
  84. package/constants/index.js +3 -1
  85. package/core/logic-validation/recipientAddress.js +10 -1
  86. package/core/logic-validation/request.d.ts +6 -2
  87. package/core/logic-validation/request.js +309 -3
  88. package/core/logic-validation/transfer.d.ts +2 -2
  89. package/core/logic-validation/transfer.js +27 -7
  90. package/core/types.d.ts +1 -0
  91. package/core/types.js +1 -0
  92. package/core/utils.d.ts +1 -0
  93. package/core/utils.js +15 -2
  94. package/koni/background/handlers/Extension.d.ts +5 -0
  95. package/koni/background/handlers/Extension.js +387 -9
  96. package/koni/background/handlers/State.d.ts +10 -3
  97. package/koni/background/handlers/State.js +240 -15
  98. package/koni/background/handlers/Tabs.d.ts +7 -2
  99. package/koni/background/handlers/Tabs.js +119 -9
  100. package/package.json +149 -8
  101. package/packageInfo.js +1 -1
  102. package/page/bitcoin/index.d.ts +17 -0
  103. package/page/bitcoin/index.js +60 -0
  104. package/page/index.d.ts +2 -1
  105. package/page/index.js +4 -0
  106. package/services/balance-service/helpers/subscribe/bitcoin.d.ts +2 -0
  107. package/services/balance-service/helpers/subscribe/bitcoin.js +87 -0
  108. package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
  109. package/services/balance-service/helpers/subscribe/index.js +20 -8
  110. package/services/balance-service/index.d.ts +2 -0
  111. package/services/balance-service/index.js +32 -4
  112. package/services/balance-service/transfer/bitcoin-transfer.d.ts +14 -0
  113. package/services/balance-service/transfer/bitcoin-transfer.js +112 -0
  114. package/services/balance-service/transfer/cardano-transfer.d.ts +2 -0
  115. package/services/balance-service/transfer/token.js +2 -0
  116. package/services/base/types.d.ts +2 -0
  117. package/services/base/types.js +2 -0
  118. package/services/buy-service/index.js +17 -2
  119. package/services/chain-service/constants.d.ts +6 -0
  120. package/services/chain-service/constants.js +8 -2
  121. package/services/chain-service/handler/bitcoin/BitcoinApi.d.ts +31 -0
  122. package/services/chain-service/handler/bitcoin/BitcoinApi.js +98 -0
  123. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.d.ts +16 -0
  124. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +70 -0
  125. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.d.ts +28 -0
  126. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +362 -0
  127. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.d.ts +2 -0
  128. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +5 -0
  129. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.d.ts +28 -0
  130. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +359 -0
  131. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.d.ts +28 -0
  132. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +293 -0
  133. package/services/chain-service/handler/bitcoin/strategy/types.d.ts +291 -0
  134. package/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  135. package/services/chain-service/index.d.ts +3 -0
  136. package/services/chain-service/index.js +31 -5
  137. package/services/chain-service/types.d.ts +20 -0
  138. package/services/chain-service/utils/index.d.ts +4 -0
  139. package/services/chain-service/utils/index.js +50 -4
  140. package/services/chain-service/utils/patch.js +1 -1
  141. package/services/earning-service/handlers/native-staking/para-chain.js +27 -5
  142. package/services/event-service/index.d.ts +3 -0
  143. package/services/event-service/index.js +4 -0
  144. package/services/event-service/types.d.ts +3 -0
  145. package/services/fee-service/service.js +8 -3
  146. package/services/hiro-service/index.d.ts +17 -0
  147. package/services/hiro-service/index.js +88 -0
  148. package/services/hiro-service/utils/index.d.ts +6 -0
  149. package/services/hiro-service/utils/index.js +72 -0
  150. package/services/history-service/bitcoin-history.d.ts +4 -0
  151. package/services/history-service/bitcoin-history.js +52 -0
  152. package/services/history-service/helpers/recoverHistoryStatus.d.ts +3 -1
  153. package/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  154. package/services/history-service/index.d.ts +1 -0
  155. package/services/history-service/index.js +42 -4
  156. package/services/keyring-service/context/handlers/Derive.js +2 -2
  157. package/services/keyring-service/context/handlers/Migration.js +2 -2
  158. package/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  159. package/services/migration-service/scripts/MigrateNewUnifiedAccount.d.ts +4 -0
  160. package/services/migration-service/scripts/MigrateNewUnifiedAccount.js +21 -0
  161. package/services/migration-service/scripts/index.js +3 -1
  162. package/services/request-service/handler/AuthRequestHandler.js +19 -1
  163. package/services/request-service/handler/BitcoinRequestHandler.d.ts +22 -0
  164. package/services/request-service/handler/BitcoinRequestHandler.js +414 -0
  165. package/services/request-service/index.d.ts +8 -2
  166. package/services/request-service/index.js +25 -3
  167. package/services/rune-service/index.d.ts +17 -0
  168. package/services/rune-service/index.js +97 -0
  169. package/services/transaction-service/helpers/index.d.ts +3 -1
  170. package/services/transaction-service/helpers/index.js +5 -0
  171. package/services/transaction-service/index.d.ts +4 -5
  172. package/services/transaction-service/index.js +205 -17
  173. package/services/transaction-service/types.d.ts +13 -2
  174. package/services/transaction-service/utils.js +7 -4
  175. package/strategy/api-request-strategy/context/base.d.ts +15 -0
  176. package/strategy/api-request-strategy/context/base.js +24 -0
  177. package/strategy/api-request-strategy/index.d.ts +15 -0
  178. package/strategy/api-request-strategy/index.js +83 -0
  179. package/strategy/api-request-strategy/types.d.ts +22 -0
  180. package/strategy/api-request-strategy/types.js +1 -0
  181. package/strategy/api-request-strategy/utils/index.d.ts +2 -0
  182. package/strategy/api-request-strategy/utils/index.js +23 -0
  183. package/types/account/info/keyring.d.ts +1 -1
  184. package/types/account/info/keyring.js +1 -1
  185. package/types/balance/index.d.ts +4 -1
  186. package/types/balance/transfer.d.ts +19 -0
  187. package/types/bitcoin.d.ts +93 -0
  188. package/types/bitcoin.js +17 -0
  189. package/types/buy.d.ts +1 -1
  190. package/types/fee/base.d.ts +4 -1
  191. package/types/fee/bitcoin.d.ts +18 -0
  192. package/types/fee/bitcoin.js +1 -0
  193. package/types/fee/index.d.ts +1 -0
  194. package/types/fee/index.js +2 -1
  195. package/types/fee/subscription.d.ts +4 -3
  196. package/types/index.d.ts +1 -0
  197. package/types/index.js +1 -0
  198. package/utils/account/analyze.js +4 -4
  199. package/utils/account/common.d.ts +7 -8
  200. package/utils/account/common.js +16 -6
  201. package/utils/account/derive/info/solo.js +70 -21
  202. package/utils/account/derive/info/unified.js +2 -0
  203. package/utils/account/derive/validate.d.ts +1 -0
  204. package/utils/account/derive/validate.js +68 -1
  205. package/utils/account/transform.d.ts +1 -1
  206. package/utils/account/transform.js +11 -5
  207. package/utils/auth.js +3 -2
  208. package/utils/bitcoin/common.d.ts +22 -0
  209. package/utils/bitcoin/common.js +88 -0
  210. package/utils/bitcoin/fee.d.ts +2 -0
  211. package/utils/bitcoin/fee.js +14 -0
  212. package/utils/bitcoin/index.d.ts +3 -0
  213. package/utils/bitcoin/index.js +6 -0
  214. package/utils/bitcoin/utxo-management.d.ts +33 -0
  215. package/utils/bitcoin/utxo-management.js +266 -0
  216. package/utils/fee/transfer.d.ts +3 -1
  217. package/utils/fee/transfer.js +47 -1
  218. package/utils/index.d.ts +1 -0
  219. package/utils/index.js +6 -3
@@ -0,0 +1,427 @@
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 _types = require("@subwallet/extension-base/types");
12
+ var _utils = require("@subwallet/extension-base/utils");
13
+ var _request = require("@subwallet/extension-base/utils/request");
14
+ var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
15
+ var bitcoin = _interopRequireWildcard(require("bitcoinjs-lib"));
16
+ var _i18next = require("i18next");
17
+ var _rxjs = require("rxjs");
18
+ var _util = require("@polkadot/util");
19
+ 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); }
20
+ 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; }
21
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
22
+ // SPDX-License-Identifier: Apache-2.0
23
+
24
+ class BitcoinRequestHandler {
25
+ #requestService;
26
+ #chainService;
27
+ #transactionService;
28
+ #logger;
29
+ confirmationsQueueSubjectBitcoin = new _rxjs.BehaviorSubject({
30
+ bitcoinSignatureRequest: {},
31
+ bitcoinSendTransactionRequest: {},
32
+ bitcoinWatchTransactionRequest: {},
33
+ bitcoinSendTransactionRequestAfterConfirmation: {},
34
+ bitcoinSignPsbtRequest: {}
35
+ });
36
+ confirmationsPromiseMap = {};
37
+ constructor(requestService, chainService, transactionService) {
38
+ this.#requestService = requestService;
39
+ this.#chainService = chainService;
40
+ this.#transactionService = transactionService;
41
+ this.#logger = (0, _util.logger)('BitcoinRequestHandler');
42
+ }
43
+ get numBitcoinRequests() {
44
+ let count = 0;
45
+ Object.values(this.confirmationsQueueSubjectBitcoin.getValue()).forEach(x => {
46
+ count += Object.keys(x).length;
47
+ });
48
+ return count;
49
+ }
50
+ getConfirmationsQueueSubjectBitcoin() {
51
+ return this.confirmationsQueueSubjectBitcoin;
52
+ }
53
+ async addConfirmationBitcoin(id, url, type, payload) {
54
+ let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
55
+ let validator = arguments.length > 5 ? arguments[5] : undefined;
56
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
57
+ const confirmationType = confirmations[type];
58
+ const payloadJson = JSON.stringify(payload);
59
+ const isInternal = (0, _request.isInternalRequest)(url);
60
+ if (['bitcoinSignatureRequest', 'bitcoinSendTransactionRequest', 'bitcoinSendTransactionRequestAfterConfirmation', 'bitcoinSignPsbtRequest'].includes(type)) {
61
+ const isAlwaysRequired = await this.#requestService.settingService.isAlwaysRequired;
62
+ if (isAlwaysRequired) {
63
+ this.#requestService.keyringService.lock();
64
+ }
65
+ }
66
+
67
+ // Check duplicate request
68
+ const duplicated = Object.values(confirmationType).find(c => c.url === url && c.payloadJson === payloadJson);
69
+ if (duplicated) {
70
+ throw new Error('Duplicate request');
71
+ }
72
+ confirmationType[id] = {
73
+ id,
74
+ url,
75
+ isInternal,
76
+ payload,
77
+ payloadJson,
78
+ ...options
79
+ };
80
+ const promise = new Promise((resolve, reject) => {
81
+ this.confirmationsPromiseMap[id] = {
82
+ validator: validator,
83
+ resolver: {
84
+ resolve: resolve,
85
+ reject: reject
86
+ }
87
+ };
88
+ });
89
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
90
+ if (!isInternal) {
91
+ this.#requestService.popupOpen();
92
+ }
93
+ this.#requestService.updateIconV2();
94
+ return promise;
95
+ }
96
+ updateConfirmationBitcoin(id, type, payload) {
97
+ let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
98
+ let validator = arguments.length > 4 ? arguments[4] : undefined;
99
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
100
+ const confirmationType = confirmations[type];
101
+
102
+ // Check duplicate request
103
+ const exists = confirmationType[id];
104
+ if (!exists) {
105
+ throw new Error('Request does not exist');
106
+ }
107
+ const payloadJson = JSON.stringify(payload);
108
+ confirmationType[id] = {
109
+ ...exists,
110
+ payload,
111
+ payloadJson,
112
+ ...options
113
+ };
114
+ if (validator) {
115
+ this.confirmationsPromiseMap[id].validator = validator;
116
+ }
117
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
118
+ }
119
+ signMessageBitcoin(confirmation) {
120
+ const {
121
+ address,
122
+ payload
123
+ } = confirmation.payload;
124
+ const pair = _uiKeyring.default.getPair(address);
125
+ if (pair.isLocked) {
126
+ _uiKeyring.default.unlockPair(pair.address);
127
+ }
128
+
129
+ // Check if payload is a string
130
+ if (typeof payload === 'string') {
131
+ // Assume BitcoinSigner is an instance that implements the BitcoinSigner interface
132
+ return {
133
+ signature: pair.bitcoin.signMessage(payload),
134
+ message: payload,
135
+ address
136
+ }; // Assuming compressed = false
137
+ } else if (payload instanceof Uint8Array) {
138
+ // Check if payload is a byte array (Uint8Array)
139
+ // Convert Uint8Array to string
140
+ const payloadString = Buffer.from(payload).toString('hex');
141
+
142
+ // Assume BitcoinSigner is an instance that implements the BitcoinSigner interface
143
+ return {
144
+ signature: pair.bitcoin.signMessage(payloadString),
145
+ message: payload.toString(),
146
+ address
147
+ }; // Assuming compressed = false
148
+ } else {
149
+ // Handle the case where payload is invalid
150
+ throw new Error('Invalid payload type');
151
+ }
152
+ }
153
+ signTransactionBitcoin(request) {
154
+ // Extract necessary information from the BitcoinSendTransactionRequest
155
+ const {
156
+ address,
157
+ hashPayload
158
+ } = request.payload;
159
+ const pair = _uiKeyring.default.getPair(address);
160
+
161
+ // Unlock the pair if it is locked
162
+ if (pair.isLocked) {
163
+ _uiKeyring.default.unlockPair(pair.address);
164
+ }
165
+ const psbt = bitcoin.Psbt.fromHex(hashPayload);
166
+
167
+ // Finalize all inputs in the Psbt
168
+ // Sign the Psbt using the pair's bitcoin object
169
+ const signedTransaction = pair.bitcoin.signTransaction(psbt, psbt.txInputs.map((v, i) => i));
170
+ signedTransaction.finalizeAllInputs();
171
+ return signedTransaction.extractTransaction().toHex();
172
+ }
173
+ async signTransactionBitcoinWithPayload(request) {
174
+ const transaction = this.#transactionService.getTransaction(request.id);
175
+ const {
176
+ chain,
177
+ emitterTransaction,
178
+ id
179
+ } = transaction;
180
+ const {
181
+ from
182
+ } = transaction.data;
183
+ const {
184
+ promise,
185
+ reject,
186
+ resolve
187
+ } = (0, _utils.createPromiseHandler)();
188
+ if (!emitterTransaction) {
189
+ throw new _BitcoinProviderError.BitcoinProviderError(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
190
+ }
191
+ const eventData = {
192
+ id,
193
+ errors: [],
194
+ warnings: [],
195
+ extrinsicHash: id
196
+ };
197
+ emitterTransaction.on('extrinsicHash', data => {
198
+ if (!data.extrinsicHash) {
199
+ reject(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
200
+ } else {
201
+ resolve(data.extrinsicHash);
202
+ }
203
+ });
204
+ emitterTransaction.on('error', error => {
205
+ reject(error);
206
+ });
207
+ try {
208
+ const chainInfo = this.#chainService.getChainInfoByKey(chain);
209
+ const psbt = transaction.transaction;
210
+ const pair = _uiKeyring.default.getPair(from);
211
+
212
+ // Unlock the pair if it is locked
213
+ if (pair.isLocked) {
214
+ _uiKeyring.default.unlockPair(pair.address);
215
+ }
216
+
217
+ // Finalize all inputs in the Psbt
218
+ // Sign the Psbt using the pair's bitcoin object
219
+ const signedTransaction = pair.bitcoin.signTransaction(psbt, psbt.txInputs.map((v, i) => i));
220
+ signedTransaction.finalizeAllInputs();
221
+ const signature = signedTransaction.extractTransaction().toHex();
222
+ this.#transactionService.emitterEventTransaction(emitterTransaction, eventData, chainInfo.slug, signature);
223
+ } catch (e) {
224
+ emitterTransaction.emit('error', {
225
+ ...eventData,
226
+ errors: [new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR, e.message)]
227
+ });
228
+ }
229
+ return promise;
230
+ }
231
+ async signPsbt(request) {
232
+ // Extract necessary information from the BitcoinSendTransactionRequest
233
+ const {
234
+ address,
235
+ payload
236
+ } = request.payload;
237
+ const {
238
+ allowedSighash,
239
+ autoFinalized = true,
240
+ broadcast,
241
+ network,
242
+ psbt: psbtHex,
243
+ signAtIndex
244
+ } = payload;
245
+ const transaction = this.#transactionService.getTransaction(request.id);
246
+ const bitcoinNetwork = network === 'bitcoinTestnet' ? bitcoin.networks.testnet : bitcoin.networks.bitcoin;
247
+ const psbt = bitcoin.Psbt.fromHex(psbtHex, {
248
+ network: bitcoinNetwork
249
+ });
250
+ let eventData = {
251
+ id: request.id,
252
+ errors: [],
253
+ warnings: [],
254
+ extrinsicHash: request.id
255
+ };
256
+ const pair = _uiKeyring.default.getPair(address);
257
+
258
+ // Unlock the pair if it is locked
259
+ if (pair.isLocked) {
260
+ _uiKeyring.default.unlockPair(pair.address);
261
+ }
262
+ const signAtIndexGenerate = signAtIndex ? (0, _util.isArray)(signAtIndex) ? signAtIndex : [signAtIndex] : [...Array(psbt.inputCount)].map((_, i) => i);
263
+ let psptSignedTransaction = null;
264
+
265
+ // Sign the Psbt using the pair's bitcoin object
266
+ try {
267
+ psptSignedTransaction = pair.bitcoin.signTransaction(psbt, signAtIndexGenerate, allowedSighash);
268
+ } catch (e) {
269
+ if (transaction) {
270
+ var _transaction$emitterT;
271
+ (_transaction$emitterT = transaction.emitterTransaction) === null || _transaction$emitterT === void 0 ? void 0 : _transaction$emitterT.emit('error', {
272
+ ...eventData,
273
+ errors: [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, e.message)],
274
+ id: transaction.id,
275
+ extrinsicHash: transaction.id
276
+ });
277
+ }
278
+ throw new Error(e.message);
279
+ }
280
+ if (!psptSignedTransaction) {
281
+ throw new Error('Unable to sign');
282
+ }
283
+ if (!broadcast) {
284
+ if (autoFinalized) {
285
+ for (const index of signAtIndexGenerate) {
286
+ psptSignedTransaction.finalizeInput(index);
287
+ }
288
+ }
289
+ return {
290
+ psbt: psptSignedTransaction.toHex()
291
+ };
292
+ }
293
+ if (!transaction) {
294
+ throw new _BitcoinProviderError.BitcoinProviderError(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
295
+ }
296
+ const {
297
+ chain,
298
+ emitterTransaction,
299
+ id
300
+ } = transaction;
301
+ eventData = {
302
+ id,
303
+ errors: [],
304
+ warnings: [],
305
+ extrinsicHash: id
306
+ };
307
+ if (!emitterTransaction) {
308
+ throw new _BitcoinProviderError.BitcoinProviderError(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
309
+ }
310
+ const chainInfo = this.#chainService.getChainInfoByKey(chain);
311
+ try {
312
+ if (!autoFinalized) {
313
+ throw new Error('Unable to send transaction without autoFinalized');
314
+ }
315
+ psptSignedTransaction.finalizeAllInputs();
316
+ } catch (e) {
317
+ emitterTransaction.emit('error', {
318
+ ...eventData,
319
+ errors: [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, e.message)]
320
+ });
321
+ throw new Error(e.message);
322
+ }
323
+ const hexTransaction = psptSignedTransaction.extractTransaction().toHex();
324
+ this.#transactionService.emitterEventTransaction(emitterTransaction, eventData, chainInfo.slug, hexTransaction);
325
+ const {
326
+ promise,
327
+ reject,
328
+ resolve
329
+ } = (0, _utils.createPromiseHandler)();
330
+ emitterTransaction.on('extrinsicHash', data => {
331
+ if (!data.extrinsicHash || !psptSignedTransaction) {
332
+ reject(_KoniTypes.BitcoinProviderErrorType.INTERNAL_ERROR);
333
+ } else {
334
+ var _psptSignedTransactio;
335
+ resolve({
336
+ psbt: (_psptSignedTransactio = psptSignedTransaction) === null || _psptSignedTransactio === void 0 ? void 0 : _psptSignedTransactio.toHex(),
337
+ txid: data.extrinsicHash
338
+ });
339
+ }
340
+ });
341
+ emitterTransaction.on('error', error => {
342
+ reject(error);
343
+ });
344
+ return promise;
345
+ }
346
+ async decorateResultBitcoin(t, request, result) {
347
+ if (t === 'bitcoinSignatureRequest') {
348
+ result.payload = this.signMessageBitcoin(request);
349
+ } else if (t === 'bitcoinSendTransactionRequest') {
350
+ result.payload = this.signTransactionBitcoin(request);
351
+ } else if (t === 'bitcoinSignPsbtRequest') {
352
+ result.payload = await this.signPsbt(request);
353
+ } else if (t === 'bitcoinSendTransactionRequestAfterConfirmation') {
354
+ result.payload = await this.signTransactionBitcoinWithPayload(request);
355
+ }
356
+ if (t === 'bitcoinSignatureRequest' || t === 'bitcoinSendTransactionRequest' || t === 'bitcoinSignPsbtRequest' || t === 'bitcoinSendTransactionRequestAfterConfirmation') {
357
+ const isAlwaysRequired = await this.#requestService.settingService.isAlwaysRequired;
358
+ if (isAlwaysRequired) {
359
+ this.#requestService.keyringService.lock();
360
+ }
361
+ }
362
+ }
363
+ async completeConfirmationBitcoin(request) {
364
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
365
+ for (const ct in request) {
366
+ const type = ct;
367
+ const result = request[type];
368
+ const {
369
+ id,
370
+ isApproved
371
+ } = result;
372
+ const {
373
+ resolver,
374
+ validator
375
+ } = this.confirmationsPromiseMap[id];
376
+ const confirmation = confirmations[type][id];
377
+ if (!resolver || !confirmation) {
378
+ this.#logger.error((0, _i18next.t)('Unable to proceed. Please try again'), type, id);
379
+ throw new Error('Unable to proceed. Please try again');
380
+ }
381
+ if (isApproved) {
382
+ try {
383
+ // Fill signature for some special type
384
+ await this.decorateResultBitcoin(type, confirmation, result);
385
+ const error = validator && validator(result);
386
+ if (error) {
387
+ resolver.reject(error);
388
+ }
389
+ } catch (e) {
390
+ resolver.reject(e);
391
+ }
392
+ }
393
+
394
+ // Delete confirmations from queue
395
+ delete this.confirmationsPromiseMap[id];
396
+ delete confirmations[type][id];
397
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
398
+
399
+ // Update icon, and close queue
400
+ this.#requestService.updateIconV2(this.#requestService.numAllRequests === 0);
401
+ resolver.resolve(result);
402
+ }
403
+ return true;
404
+ }
405
+ resetWallet() {
406
+ const confirmations = this.confirmationsQueueSubjectBitcoin.getValue();
407
+ for (const [type, requests] of Object.entries(confirmations)) {
408
+ for (const confirmation of Object.values(requests)) {
409
+ const {
410
+ id
411
+ } = confirmation;
412
+ const {
413
+ resolver
414
+ } = this.confirmationsPromiseMap[id];
415
+ if (!resolver || !confirmation) {
416
+ console.error('Not found confirmation', type, id);
417
+ } else {
418
+ resolver.reject(new Error('Reset wallet'));
419
+ }
420
+ delete this.confirmationsPromiseMap[id];
421
+ delete confirmations[type][id];
422
+ }
423
+ }
424
+ this.confirmationsQueueSubjectBitcoin.next(confirmations);
425
+ }
426
+ }
427
+ exports.default = BitcoinRequestHandler;
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
+ var _BitcoinRequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/BitcoinRequestHandler"));
8
9
  var _CardanoRequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/request-service/handler/CardanoRequestHandler"));
9
10
  var _TonRequestHandler = _interopRequireDefault(require("./handler/TonRequestHandler"));
10
11
  var _handler = require("./handler");
@@ -19,13 +20,14 @@ class RequestService {
19
20
  #authRequestHandler;
20
21
  #substrateRequestHandler;
21
22
  #evmRequestHandler;
23
+ #bitcoinRequestHandler;
22
24
  #tonRequestHandler;
23
25
  #cardanoRequestHandler;
24
26
  #connectWCRequestHandler;
25
27
  #notSupportWCRequestHandler;
26
28
 
27
29
  // Common
28
- constructor(chainService, settingService, keyringService) {
30
+ constructor(chainService, settingService, keyringService, transactionService) {
29
31
  this.#chainService = chainService;
30
32
  this.settingService = settingService;
31
33
  this.keyringService = keyringService;
@@ -36,6 +38,7 @@ class RequestService {
36
38
  this.#evmRequestHandler = new _handler.EvmRequestHandler(this);
37
39
  this.#tonRequestHandler = new _TonRequestHandler.default(this);
38
40
  this.#cardanoRequestHandler = new _CardanoRequestHandler.default(this);
41
+ this.#bitcoinRequestHandler = new _BitcoinRequestHandler.default(this, this.#chainService, transactionService);
39
42
  this.#connectWCRequestHandler = new _handler.ConnectWCRequestHandler(this);
40
43
  this.#notSupportWCRequestHandler = new _handler.NotSupportWCRequestHandler(this);
41
44
 
@@ -43,7 +46,7 @@ class RequestService {
43
46
  this.updateIconV2();
44
47
  }
45
48
  get numAllRequests() {
46
- return this.allSubstrateRequests.length + this.numEvmRequests + this.numTonRequests + this.numCardanoRequests;
49
+ return this.allSubstrateRequests.length + this.numEvmRequests + this.numTonRequests + this.numCardanoRequests + this.numBitcoinRequests;
47
50
  }
48
51
  updateIconV2(shouldClose) {
49
52
  this.#popupHandler.updateIconV2(shouldClose);
@@ -156,6 +159,9 @@ class RequestService {
156
159
  get numCardanoRequests() {
157
160
  return this.#cardanoRequestHandler.numCardanoRequests;
158
161
  }
162
+ get numBitcoinRequests() {
163
+ return this.#bitcoinRequestHandler.numBitcoinRequests;
164
+ }
159
165
  get confirmationsQueueSubject() {
160
166
  return this.#evmRequestHandler.getConfirmationsQueueSubject();
161
167
  }
@@ -201,6 +207,25 @@ class RequestService {
201
207
  return this.#evmRequestHandler.updateConfirmation(id, type, payload, options, validator);
202
208
  }
203
209
 
210
+ // Bitcoin requests
211
+
212
+ get confirmationsQueueSubjectBitcoin() {
213
+ return this.#bitcoinRequestHandler.getConfirmationsQueueSubjectBitcoin();
214
+ }
215
+ addConfirmationBitcoin(id, url, type, payload) {
216
+ let options = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};
217
+ let validator = arguments.length > 5 ? arguments[5] : undefined;
218
+ return this.#bitcoinRequestHandler.addConfirmationBitcoin(id, url, type, payload, options, validator);
219
+ }
220
+ async completeConfirmationBitcoin(request) {
221
+ return await this.#bitcoinRequestHandler.completeConfirmationBitcoin(request);
222
+ }
223
+ updateConfirmationBitcoin(id, type, payload) {
224
+ let options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
225
+ let validator = arguments.length > 4 ? arguments[4] : undefined;
226
+ return this.#bitcoinRequestHandler.updateConfirmationBitcoin(id, type, payload, options, validator);
227
+ }
228
+
204
229
  // WalletConnect Connect requests
205
230
  getConnectWCRequest(id) {
206
231
  return this.#connectWCRequestHandler.getConnectWCRequest(id);
@@ -237,7 +262,7 @@ class RequestService {
237
262
 
238
263
  // General methods
239
264
  get numRequests() {
240
- return this.numMetaRequests + this.numAuthRequests + this.numSubstrateRequests + this.numEvmRequests + this.numConnectWCRequests + this.numNotSupportWCRequests + this.numTonRequests + this.numCardanoRequests;
265
+ return this.numMetaRequests + this.numAuthRequests + this.numSubstrateRequests + this.numEvmRequests + this.numConnectWCRequests + this.numNotSupportWCRequests + this.numTonRequests + this.numCardanoRequests + this.numBitcoinRequests;
241
266
  }
242
267
  resetWallet() {
243
268
  this.#authRequestHandler.resetWallet();
@@ -245,6 +270,7 @@ class RequestService {
245
270
  this.#evmRequestHandler.resetWallet();
246
271
  this.#tonRequestHandler.resetWallet();
247
272
  this.#cardanoRequestHandler.resetWallet();
273
+ this.#bitcoinRequestHandler.resetWallet();
248
274
  this.#metadataRequestHandler.resetWallet();
249
275
  this.#connectWCRequestHandler.resetWallet();
250
276
  this.#notSupportWCRequestHandler.resetWallet();
@@ -0,0 +1,105 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.RunesService = void 0;
7
+ var _SWError = require("@subwallet/extension-base/background/errors/SWError");
8
+ var _constants = require("@subwallet/extension-base/services/chain-service/constants");
9
+ var _apiRequestStrategy = require("@subwallet/extension-base/strategy/api-request-strategy");
10
+ var _base = require("@subwallet/extension-base/strategy/api-request-strategy/context/base");
11
+ var _utils = require("@subwallet/extension-base/strategy/api-request-strategy/utils");
12
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
13
+ // SPDX-License-Identifier: Apache-2.0
14
+
15
+ const BITCOIN_API_URL = 'https://btc-api.koni.studio';
16
+ const BITCOIN_API_URL_TEST = 'https://api-testnet.openbit.app';
17
+ class RunesService extends _apiRequestStrategy.BaseApiRequestStrategy {
18
+ constructor(url) {
19
+ const context = new _base.BaseApiRequestContext();
20
+ super(context);
21
+ this.baseUrl = url;
22
+ }
23
+ headers = {
24
+ 'Content-Type': 'application/json',
25
+ Authorization: `Bearer ${_constants._BTC_SERVICE_TOKEN}`
26
+ };
27
+ isRateLimited() {
28
+ return false;
29
+ }
30
+ getUrl(path) {
31
+ return `${this.baseUrl}/${path}`;
32
+ }
33
+ getAddressRunesInfo(address, params) {
34
+ return this.addRequest(async () => {
35
+ const _rs = await (0, _utils.getRequest)(this.getUrl(`rune/address/${address}`), params, this.headers);
36
+ const rs = await _rs.json();
37
+ if (rs.status_code !== 200) {
38
+ throw new _SWError.SWError('RuneScanService.getAddressRunesInfo', rs.message);
39
+ }
40
+ return rs.result;
41
+ }, 1);
42
+ }
43
+
44
+ // * Deprecated
45
+ getRuneCollectionsByBatch(params) {
46
+ return this.addRequest(async () => {
47
+ const url = this.getUrl('rune');
48
+ const rs = await (0, _utils.getRequest)(url, params);
49
+ if (rs.status !== 200) {
50
+ throw new _SWError.SWError('RuneScanService.getRuneCollectionsByBatch', await rs.text());
51
+ }
52
+ return await rs.json();
53
+ }, 1);
54
+ }
55
+
56
+ // * Deprecated
57
+ getAddressRuneTxs(address, params) {
58
+ return this.addRequest(async () => {
59
+ const url = this.getUrl(`address/${address}/txs`);
60
+ const rs = await (0, _utils.getRequest)(url, params);
61
+ if (rs.status !== 200) {
62
+ throw new _SWError.SWError('RuneScanService.getAddressRuneTxs', await rs.text());
63
+ }
64
+ return await rs.json();
65
+ }, 0);
66
+ }
67
+ getRuneMetadata(runeid) {
68
+ return this.addRequest(async () => {
69
+ const _rs = await (0, _utils.getRequest)(this.getUrl(`rune/metadata/${runeid}`), undefined, this.headers);
70
+ const rs = await _rs.json();
71
+ if (rs.status_code !== 200) {
72
+ throw new _SWError.SWError('RuneScanService.getRuneMetadata', rs.message);
73
+ }
74
+ return rs.result;
75
+ }, 0);
76
+ }
77
+ getAddressRuneUtxos(address) {
78
+ return this.addRequest(async () => {
79
+ const _rs = await (0, _utils.getRequest)(this.getUrl(`rune/address/${address}/rune/utxo`), undefined, this.headers);
80
+ const rs = await _rs.json();
81
+ if (rs.status_code !== 200) {
82
+ throw new _SWError.SWError('RuneScanService.getAddressRuneUtxos', rs.message);
83
+ }
84
+ return rs.result;
85
+ }, 0);
86
+ }
87
+
88
+ // Singleton
89
+
90
+ static getInstance() {
91
+ let isTestnet = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
92
+ if (isTestnet) {
93
+ if (!RunesService.testnet) {
94
+ RunesService.testnet = new RunesService(BITCOIN_API_URL_TEST);
95
+ }
96
+ return RunesService.testnet;
97
+ } else {
98
+ if (!RunesService.mainnet) {
99
+ RunesService.mainnet = new RunesService(BITCOIN_API_URL);
100
+ }
101
+ return RunesService.mainnet;
102
+ }
103
+ }
104
+ }
105
+ exports.RunesService = RunesService;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.isTonTransaction = exports.isSubstrateTransaction = exports.isCardanoTransaction = exports.getValidationId = exports.getTransactionId = exports.getBaseTransactionInfo = void 0;
6
+ exports.isTonTransaction = exports.isSubstrateTransaction = exports.isCardanoTransaction = exports.isBitcoinTransaction = exports.getValidationId = exports.getTransactionId = exports.getBaseTransactionInfo = void 0;
7
7
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
8
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
9
9
  // SPDX-License-Identifier: Apache-2.0
@@ -32,7 +32,13 @@ const isCardanoTransaction = tx => {
32
32
  const cardanoTransactionConfig = tx;
33
33
  return cardanoTransactionConfig.cardanoPayload !== null && cardanoTransactionConfig.cardanoPayload !== undefined;
34
34
  };
35
+
36
+ // TODO: [Review] this function
35
37
  exports.isCardanoTransaction = isCardanoTransaction;
38
+ const isBitcoinTransaction = tx => {
39
+ return 'data' in tx && Array.isArray(tx.data.inputs);
40
+ };
41
+ exports.isBitcoinTransaction = isBitcoinTransaction;
36
42
  const typeName = type => {
37
43
  switch (type) {
38
44
  case _KoniTypes.ExtrinsicType.TRANSFER_BALANCE: