@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.
- package/background/KoniTypes.d.ts +121 -4
- package/background/KoniTypes.js +18 -0
- package/background/errors/BitcoinProviderError.d.ts +6 -0
- package/background/errors/BitcoinProviderError.js +47 -0
- package/cjs/background/KoniTypes.js +20 -1
- package/cjs/background/errors/BitcoinProviderError.js +54 -0
- package/cjs/constants/bitcoin.js +22 -0
- package/cjs/constants/index.js +16 -1
- package/cjs/core/logic-validation/recipientAddress.js +9 -0
- package/cjs/core/logic-validation/transfer.js +25 -5
- package/cjs/core/types.js +1 -0
- package/cjs/core/utils.js +15 -1
- package/cjs/koni/background/handlers/Extension.js +59 -3
- package/cjs/koni/background/handlers/State.js +52 -11
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/bitcoin.js +94 -0
- package/cjs/services/balance-service/helpers/subscribe/index.js +19 -7
- package/cjs/services/balance-service/index.js +32 -4
- package/cjs/services/balance-service/transfer/bitcoin-transfer.js +119 -0
- package/cjs/services/balance-service/transfer/token.js +2 -0
- package/cjs/services/base/types.js +2 -0
- package/cjs/services/chain-service/constants.js +14 -3
- package/cjs/services/chain-service/handler/bitcoin/BitcoinApi.js +105 -0
- package/cjs/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +78 -0
- package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +371 -0
- package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +19 -0
- package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +368 -0
- package/cjs/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +302 -0
- package/cjs/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
- package/cjs/services/chain-service/index.js +27 -3
- package/cjs/services/chain-service/utils/index.js +57 -4
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/event-service/index.js +4 -0
- package/cjs/services/fee-service/service.js +8 -3
- package/cjs/services/hiro-service/index.js +96 -0
- package/cjs/services/hiro-service/utils/index.js +85 -0
- package/cjs/services/history-service/bitcoin-history.js +58 -0
- package/cjs/services/history-service/helpers/recoverHistoryStatus.js +96 -4
- package/cjs/services/history-service/index.js +41 -3
- package/cjs/services/keyring-service/context/handlers/Derive.js +1 -1
- package/cjs/services/keyring-service/context/handlers/Migration.js +2 -2
- package/cjs/services/keyring-service/context/handlers/Mnemonic.js +4 -3
- package/cjs/services/migration-service/scripts/MigrateNewUnifiedAccount.js +29 -0
- package/cjs/services/migration-service/scripts/index.js +3 -1
- package/cjs/services/request-service/handler/BitcoinRequestHandler.js +440 -0
- package/cjs/services/request-service/index.js +29 -3
- package/cjs/services/rune-service/index.js +105 -0
- package/cjs/services/transaction-service/helpers/index.js +7 -1
- package/cjs/services/transaction-service/index.js +136 -15
- package/cjs/services/transaction-service/utils.js +6 -3
- package/cjs/strategy/api-request-strategy/context/base.js +31 -0
- package/cjs/strategy/api-request-strategy/index.js +90 -0
- package/cjs/strategy/api-request-strategy/types.js +1 -0
- package/cjs/strategy/api-request-strategy/utils/index.js +33 -0
- package/cjs/types/account/info/keyring.js +1 -1
- package/cjs/types/bitcoin.js +24 -0
- package/cjs/types/fee/bitcoin.js +1 -0
- package/cjs/types/fee/index.js +11 -0
- package/cjs/types/index.js +11 -0
- package/cjs/utils/account/analyze.js +3 -3
- package/cjs/utils/account/common.js +16 -6
- package/cjs/utils/account/derive/info/solo.js +68 -19
- package/cjs/utils/account/derive/info/unified.js +2 -0
- package/cjs/utils/account/derive/validate.js +70 -2
- package/cjs/utils/account/transform.js +11 -5
- package/cjs/utils/bitcoin/common.js +98 -0
- package/cjs/utils/bitcoin/fee.js +21 -0
- package/cjs/utils/bitcoin/index.js +38 -0
- package/cjs/utils/bitcoin/utxo-management.js +281 -0
- package/cjs/utils/fee/transfer.js +48 -0
- package/cjs/utils/index.js +15 -1
- package/constants/bitcoin.d.ts +3 -0
- package/constants/bitcoin.js +13 -0
- package/constants/index.d.ts +2 -0
- package/constants/index.js +3 -1
- package/core/logic-validation/recipientAddress.js +10 -1
- package/core/logic-validation/transfer.d.ts +2 -2
- package/core/logic-validation/transfer.js +27 -7
- package/core/types.d.ts +1 -0
- package/core/types.js +1 -0
- package/core/utils.d.ts +1 -0
- package/core/utils.js +15 -2
- package/koni/background/handlers/Extension.d.ts +2 -0
- package/koni/background/handlers/Extension.js +58 -4
- package/koni/background/handlers/State.d.ts +7 -3
- package/koni/background/handlers/State.js +52 -12
- package/package.json +144 -8
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/bitcoin.d.ts +2 -0
- package/services/balance-service/helpers/subscribe/bitcoin.js +87 -0
- package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
- package/services/balance-service/helpers/subscribe/index.js +20 -8
- package/services/balance-service/index.d.ts +2 -0
- package/services/balance-service/index.js +32 -4
- package/services/balance-service/transfer/bitcoin-transfer.d.ts +14 -0
- package/services/balance-service/transfer/bitcoin-transfer.js +112 -0
- package/services/balance-service/transfer/token.js +2 -0
- package/services/base/types.d.ts +2 -0
- package/services/base/types.js +2 -0
- package/services/chain-service/constants.d.ts +6 -0
- package/services/chain-service/constants.js +8 -2
- package/services/chain-service/handler/bitcoin/BitcoinApi.d.ts +31 -0
- package/services/chain-service/handler/bitcoin/BitcoinApi.js +98 -0
- package/services/chain-service/handler/bitcoin/BitcoinChainHandler.d.ts +16 -0
- package/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +70 -0
- package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.d.ts +28 -0
- package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +362 -0
- package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.d.ts +2 -0
- package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +5 -0
- package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.d.ts +28 -0
- package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +359 -0
- package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.d.ts +28 -0
- package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +293 -0
- package/services/chain-service/handler/bitcoin/strategy/types.d.ts +291 -0
- package/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
- package/services/chain-service/index.d.ts +3 -0
- package/services/chain-service/index.js +31 -5
- package/services/chain-service/types.d.ts +20 -0
- package/services/chain-service/utils/index.d.ts +4 -0
- package/services/chain-service/utils/index.js +50 -4
- package/services/chain-service/utils/patch.js +1 -1
- package/services/event-service/index.d.ts +3 -0
- package/services/event-service/index.js +4 -0
- package/services/event-service/types.d.ts +3 -0
- package/services/fee-service/service.js +8 -3
- package/services/hiro-service/index.d.ts +17 -0
- package/services/hiro-service/index.js +88 -0
- package/services/hiro-service/utils/index.d.ts +6 -0
- package/services/hiro-service/utils/index.js +72 -0
- package/services/history-service/bitcoin-history.d.ts +4 -0
- package/services/history-service/bitcoin-history.js +52 -0
- package/services/history-service/helpers/recoverHistoryStatus.d.ts +3 -1
- package/services/history-service/helpers/recoverHistoryStatus.js +96 -4
- package/services/history-service/index.d.ts +1 -0
- package/services/history-service/index.js +42 -4
- package/services/keyring-service/context/handlers/Derive.js +2 -2
- package/services/keyring-service/context/handlers/Migration.js +2 -2
- package/services/keyring-service/context/handlers/Mnemonic.js +4 -3
- package/services/migration-service/scripts/MigrateNewUnifiedAccount.d.ts +4 -0
- package/services/migration-service/scripts/MigrateNewUnifiedAccount.js +21 -0
- package/services/migration-service/scripts/index.js +3 -1
- package/services/request-service/handler/BitcoinRequestHandler.d.ts +23 -0
- package/services/request-service/handler/BitcoinRequestHandler.js +427 -0
- package/services/request-service/index.d.ts +9 -2
- package/services/request-service/index.js +25 -3
- package/services/rune-service/index.d.ts +17 -0
- package/services/rune-service/index.js +97 -0
- package/services/transaction-service/helpers/index.d.ts +3 -1
- package/services/transaction-service/helpers/index.js +5 -0
- package/services/transaction-service/index.d.ts +3 -5
- package/services/transaction-service/index.js +135 -16
- package/services/transaction-service/types.d.ts +12 -2
- package/services/transaction-service/utils.js +7 -4
- package/strategy/api-request-strategy/context/base.d.ts +15 -0
- package/strategy/api-request-strategy/context/base.js +24 -0
- package/strategy/api-request-strategy/index.d.ts +15 -0
- package/strategy/api-request-strategy/index.js +83 -0
- package/strategy/api-request-strategy/types.d.ts +22 -0
- package/strategy/api-request-strategy/types.js +1 -0
- package/strategy/api-request-strategy/utils/index.d.ts +2 -0
- package/strategy/api-request-strategy/utils/index.js +23 -0
- package/types/account/info/keyring.d.ts +1 -1
- package/types/account/info/keyring.js +1 -1
- package/types/balance/index.d.ts +4 -1
- package/types/balance/transfer.d.ts +17 -0
- package/types/bitcoin.d.ts +93 -0
- package/types/bitcoin.js +17 -0
- package/types/fee/base.d.ts +4 -1
- package/types/fee/bitcoin.d.ts +18 -0
- package/types/fee/bitcoin.js +1 -0
- package/types/fee/index.d.ts +1 -0
- package/types/fee/index.js +2 -1
- package/types/fee/subscription.d.ts +4 -3
- package/types/index.d.ts +1 -0
- package/types/index.js +1 -0
- package/utils/account/analyze.js +4 -4
- package/utils/account/common.d.ts +7 -8
- package/utils/account/common.js +16 -6
- package/utils/account/derive/info/solo.js +70 -21
- package/utils/account/derive/info/unified.js +2 -0
- package/utils/account/derive/validate.d.ts +1 -0
- package/utils/account/derive/validate.js +68 -1
- package/utils/account/transform.d.ts +1 -1
- package/utils/account/transform.js +11 -5
- package/utils/bitcoin/common.d.ts +22 -0
- package/utils/bitcoin/common.js +88 -0
- package/utils/bitcoin/fee.d.ts +2 -0
- package/utils/bitcoin/fee.js +14 -0
- package/utils/bitcoin/index.d.ts +3 -0
- package/utils/bitcoin/index.js +6 -0
- package/utils/bitcoin/utxo-management.d.ts +33 -0
- package/utils/bitcoin/utxo-management.js +266 -0
- package/utils/fee/transfer.d.ts +3 -1
- package/utils/fee/transfer.js +47 -1
- package/utils/index.d.ts +1 -0
- package/utils/index.js +6 -3
|
@@ -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, feeService, 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, feeService, 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:
|
|
@@ -46,10 +46,6 @@ class TransactionService {
|
|
|
46
46
|
}
|
|
47
47
|
constructor(state) {
|
|
48
48
|
this.state = state;
|
|
49
|
-
this.eventService = state.eventService;
|
|
50
|
-
this.historyService = state.historyService;
|
|
51
|
-
this.notificationService = state.notificationService;
|
|
52
|
-
this.chainService = state.chainService;
|
|
53
49
|
}
|
|
54
50
|
get allTransactions() {
|
|
55
51
|
return Object.values(this.transactions);
|
|
@@ -81,6 +77,7 @@ class TransactionService {
|
|
|
81
77
|
additionalValidator,
|
|
82
78
|
address,
|
|
83
79
|
chain,
|
|
80
|
+
chainType,
|
|
84
81
|
extrinsicType
|
|
85
82
|
} = validationResponse;
|
|
86
83
|
const chainInfo = this.state.chainService.getChainInfoByKey(chain);
|
|
@@ -110,27 +107,30 @@ class TransactionService {
|
|
|
110
107
|
const evmApi = this.state.chainService.getEvmApi(chainInfo.slug);
|
|
111
108
|
const tonApi = this.state.chainService.getTonApi(chainInfo.slug);
|
|
112
109
|
const cardanoApi = this.state.chainService.getCardanoApi(chainInfo.slug);
|
|
110
|
+
const bitcoinApi = this.state.chainService.getBitcoinApi(chainInfo.slug);
|
|
113
111
|
// todo: should split into isEvmTx && isNoEvmApi. Because other chains type also has no Evm Api. Same to all blockchain.
|
|
114
112
|
// todo: refactor check evmTransaction.
|
|
115
|
-
const isNoEvmApi = transaction && !(0, _helpers.isSubstrateTransaction)(transaction) && !(0, _helpers.isTonTransaction)(transaction) && !(0, _helpers.isCardanoTransaction)(transaction) && !evmApi;
|
|
113
|
+
const isNoEvmApi = transaction && !(0, _helpers.isSubstrateTransaction)(transaction) && !(0, _helpers.isTonTransaction)(transaction) && !(0, _helpers.isCardanoTransaction)(transaction) && !(0, _helpers.isBitcoinTransaction)(transaction) && !evmApi;
|
|
116
114
|
const isNoTonApi = transaction && (0, _helpers.isTonTransaction)(transaction) && !tonApi;
|
|
117
115
|
const isNoCardanoApi = transaction && (0, _helpers.isCardanoTransaction)(transaction) && !cardanoApi;
|
|
118
|
-
|
|
116
|
+
const isNoBitcoinApi = transaction && (0, _helpers.isBitcoinTransaction)(transaction) && !bitcoinApi;
|
|
117
|
+
if (isNoEvmApi || isNoTonApi || isNoCardanoApi || isNoBitcoinApi) {
|
|
119
118
|
validationResponse.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.CHAIN_DISCONNECTED, undefined));
|
|
120
119
|
}
|
|
121
120
|
|
|
122
121
|
// Estimate fee for transaction
|
|
123
122
|
const id = (0, _getId.getId)();
|
|
124
|
-
const feeInfo = await this.state.feeService.subscribeChainFee(id, chain,
|
|
123
|
+
const feeInfo = await this.state.feeService.subscribeChainFee(id, chain, chainType);
|
|
125
124
|
const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(chain);
|
|
126
125
|
const tokenPayFeeSlug = transactionInput.tokenPayFeeSlug;
|
|
127
126
|
const isNonNativeTokenPayFee = tokenPayFeeSlug && !(0, _utils2._isNativeTokenBySlug)(tokenPayFeeSlug);
|
|
128
|
-
const nonNativeTokenPayFeeInfo = isNonNativeTokenPayFee ? this.chainService.getAssetBySlug(tokenPayFeeSlug) : undefined;
|
|
127
|
+
const nonNativeTokenPayFeeInfo = isNonNativeTokenPayFee ? this.state.chainService.getAssetBySlug(tokenPayFeeSlug) : undefined;
|
|
129
128
|
const priceMap = (await this.state.priceService.getPrice()).priceMap;
|
|
130
129
|
validationResponse.estimateFee = await (0, _transfer.estimateFeeForTransaction)(validationResponse, transaction, chainInfo, evmApi, substrateApi, priceMap, feeInfo, nativeTokenInfo, nonNativeTokenPayFeeInfo, transactionInput.isTransferLocalTokenAndPayThatTokenAsFee);
|
|
131
130
|
const chainInfoMap = this.state.chainService.getChainInfoMap();
|
|
132
131
|
|
|
133
132
|
// Check account signing transaction
|
|
133
|
+
|
|
134
134
|
(0, _transfer.checkSigningAccountForTransaction)(validationResponse, chainInfoMap);
|
|
135
135
|
const nativeTokenAvailable = await this.state.balanceService.getTransferableBalance(address, chain, nativeTokenInfo.slug, extrinsicType);
|
|
136
136
|
|
|
@@ -193,7 +193,7 @@ class TransactionService {
|
|
|
193
193
|
}
|
|
194
194
|
fillTransactionDefaultInfo(transaction) {
|
|
195
195
|
const isInternal = !transaction.url;
|
|
196
|
-
const transactionId = (0, _helpers.getTransactionId)(transaction.chainType, transaction.chain, isInternal, (0, _helpers2.isWalletConnectRequest)(transaction.id));
|
|
196
|
+
const transactionId = transaction.id || (0, _helpers.getTransactionId)(transaction.chainType, transaction.chain, isInternal, (0, _helpers2.isWalletConnectRequest)(transaction.id));
|
|
197
197
|
return {
|
|
198
198
|
...transaction,
|
|
199
199
|
createdAt: new Date().getTime(),
|
|
@@ -417,7 +417,7 @@ class TransactionService {
|
|
|
417
417
|
}
|
|
418
418
|
async sendTransaction(transaction) {
|
|
419
419
|
// Send Transaction
|
|
420
|
-
const emitter = await (transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) : transaction.chainType === 'evm' ? this.signAndSendEvmTransaction(transaction) : transaction.chainType === 'cardano' ? this.signAndSendCardanoTransaction(transaction) : this.signAndSendTonTransaction(transaction));
|
|
420
|
+
const emitter = await (transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) : transaction.chainType === 'evm' ? this.signAndSendEvmTransaction(transaction) : transaction.chainType === 'cardano' ? this.signAndSendCardanoTransaction(transaction) : transaction.chainType === 'ton' ? this.signAndSendTonTransaction(transaction) : this.signAndSendBitcoinTransaction(transaction));
|
|
421
421
|
const {
|
|
422
422
|
eventsHandler,
|
|
423
423
|
step
|
|
@@ -676,6 +676,7 @@ class TransactionService {
|
|
|
676
676
|
extrinsicHash: transaction.extrinsicHash,
|
|
677
677
|
time: transaction.createdAt,
|
|
678
678
|
fee: transaction.estimateFee,
|
|
679
|
+
blockTime: undefined,
|
|
679
680
|
blockNumber: 0,
|
|
680
681
|
// Will be added in next step
|
|
681
682
|
blockHash: '',
|
|
@@ -1065,6 +1066,24 @@ class TransactionService {
|
|
|
1065
1066
|
if ([_KoniTypes.ExtrinsicType.STAKING_JOIN_POOL, _KoniTypes.ExtrinsicType.STAKING_BOND, _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL, _KoniTypes.ExtrinsicType.MINT_LDOT, _KoniTypes.ExtrinsicType.MINT_QDOT, _KoniTypes.ExtrinsicType.MINT_SDOT, _KoniTypes.ExtrinsicType.MINT_STDOT, _KoniTypes.ExtrinsicType.MINT_VDOT, _KoniTypes.ExtrinsicType.MINT_VMANTA].includes(transaction.extrinsicType)) {
|
|
1066
1067
|
this.handlePostEarningTransaction(id);
|
|
1067
1068
|
}
|
|
1069
|
+
|
|
1070
|
+
// Trigger balance update for Bitcoin transactions after receiving extrinsicHash
|
|
1071
|
+
if (_KoniTypes.ExtrinsicType.TRANSFER_BALANCE && transaction.chainType === 'bitcoin') {
|
|
1072
|
+
const balanceService = this.state.balanceService;
|
|
1073
|
+
const inputData = (0, _utils3.parseTransactionData)(transaction.data);
|
|
1074
|
+
try {
|
|
1075
|
+
const sender = _uiKeyring.default.getPair(inputData.from);
|
|
1076
|
+
balanceService.refreshBalanceForAddress(sender.address, transaction.chain, inputData.tokenSlug, transaction.extrinsicType).catch(error => console.error('Failed to run balance subscription:', error));
|
|
1077
|
+
} catch (e) {
|
|
1078
|
+
console.error(e);
|
|
1079
|
+
}
|
|
1080
|
+
try {
|
|
1081
|
+
const recipient = _uiKeyring.default.getPair(inputData.to);
|
|
1082
|
+
balanceService.refreshBalanceForAddress(recipient.address, transaction.chain, inputData.tokenSlug, transaction.extrinsicType).catch(error => console.error('Failed to run balance subscription:', error));
|
|
1083
|
+
} catch (e) {
|
|
1084
|
+
console.error(e);
|
|
1085
|
+
}
|
|
1086
|
+
}
|
|
1068
1087
|
}
|
|
1069
1088
|
handlePostProcessing(id) {
|
|
1070
1089
|
// must be done after success/failure to make sure the transaction is finalized
|
|
@@ -1104,6 +1123,7 @@ class TransactionService {
|
|
|
1104
1123
|
let {
|
|
1105
1124
|
blockHash,
|
|
1106
1125
|
blockNumber,
|
|
1126
|
+
blockTime,
|
|
1107
1127
|
extrinsicHash,
|
|
1108
1128
|
id
|
|
1109
1129
|
} = _ref4;
|
|
@@ -1118,7 +1138,8 @@ class TransactionService {
|
|
|
1118
1138
|
extrinsicHash,
|
|
1119
1139
|
status: _KoniTypes.ExtrinsicStatus.SUCCESS,
|
|
1120
1140
|
blockNumber: blockNumber || 0,
|
|
1121
|
-
blockHash: blockHash || ''
|
|
1141
|
+
blockHash: blockHash || '',
|
|
1142
|
+
blockTime
|
|
1122
1143
|
}).catch(console.error);
|
|
1123
1144
|
const info = (0, _util.isHex)(extrinsicHash) ? extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.state.chainService.getChainInfoMap());
|
|
1124
1145
|
this.state.notificationService.notify({
|
|
@@ -1193,14 +1214,14 @@ class TransactionService {
|
|
|
1193
1214
|
errors,
|
|
1194
1215
|
extrinsicHash
|
|
1195
1216
|
});
|
|
1196
|
-
this.historyService.updateHistoryByExtrinsicHash(transaction.extrinsicHash, {
|
|
1217
|
+
this.state.historyService.updateHistoryByExtrinsicHash(transaction.extrinsicHash, {
|
|
1197
1218
|
extrinsicHash: extrinsicHash || transaction.extrinsicHash,
|
|
1198
1219
|
status: nextStatus,
|
|
1199
1220
|
blockNumber: blockNumber || 0,
|
|
1200
1221
|
blockHash: blockHash || ''
|
|
1201
1222
|
}).catch(console.error);
|
|
1202
|
-
const info = (0, _util.isHex)(transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash) ? transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.chainService.getChainInfoMap());
|
|
1203
|
-
this.notificationService.notify({
|
|
1223
|
+
const info = (0, _util.isHex)(transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash) ? transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.state.chainService.getChainInfoMap());
|
|
1224
|
+
this.state.notificationService.notify({
|
|
1204
1225
|
type: _KoniTypes.NotificationType.ERROR,
|
|
1205
1226
|
title: (0, _i18next.t)('Transaction timed out'),
|
|
1206
1227
|
message: (0, _i18next.t)('Transaction {{info}} timed out', {
|
|
@@ -1214,7 +1235,7 @@ class TransactionService {
|
|
|
1214
1235
|
notifyViaBrowser: true
|
|
1215
1236
|
});
|
|
1216
1237
|
}
|
|
1217
|
-
this.eventService.emit('transaction.timeout', transaction);
|
|
1238
|
+
this.state.eventService.emit('transaction.timeout', transaction);
|
|
1218
1239
|
}
|
|
1219
1240
|
generateHashPayload(chain, transaction) {
|
|
1220
1241
|
const chainInfo = this.state.chainService.getChainInfoByKey(chain);
|
|
@@ -1894,6 +1915,106 @@ class TransactionService {
|
|
|
1894
1915
|
});
|
|
1895
1916
|
return emitter;
|
|
1896
1917
|
}
|
|
1918
|
+
emitterEventTransaction = (emitter, eventData, chain, payload) => {
|
|
1919
|
+
// Emit signed event
|
|
1920
|
+
emitter.emit('signed', eventData);
|
|
1921
|
+
// Add start info
|
|
1922
|
+
emitter.emit('send', eventData);
|
|
1923
|
+
const event = this.state.chainService.getBitcoinApi(chain).api.sendRawTransaction(payload);
|
|
1924
|
+
event.on('extrinsicHash', txHash => {
|
|
1925
|
+
eventData.extrinsicHash = txHash;
|
|
1926
|
+
emitter.emit('extrinsicHash', eventData);
|
|
1927
|
+
});
|
|
1928
|
+
event.on('success', transactionStatus => {
|
|
1929
|
+
console.log(transactionStatus);
|
|
1930
|
+
eventData.blockHash = transactionStatus.block_hash || undefined;
|
|
1931
|
+
eventData.blockNumber = transactionStatus.block_height || undefined;
|
|
1932
|
+
eventData.blockTime = transactionStatus.block_time ? transactionStatus.block_time * 1000 : undefined;
|
|
1933
|
+
emitter.emit('success', eventData);
|
|
1934
|
+
});
|
|
1935
|
+
event.on('error', error => {
|
|
1936
|
+
eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, error));
|
|
1937
|
+
emitter.emit('error', eventData);
|
|
1938
|
+
});
|
|
1939
|
+
};
|
|
1940
|
+
signAndSendBitcoinTransaction(_ref22) {
|
|
1941
|
+
let {
|
|
1942
|
+
address,
|
|
1943
|
+
chain,
|
|
1944
|
+
id,
|
|
1945
|
+
transaction,
|
|
1946
|
+
url
|
|
1947
|
+
} = _ref22;
|
|
1948
|
+
const tx = transaction;
|
|
1949
|
+
// const bitcoinApi = this.state.chainService.getBitcoinApi(chain);
|
|
1950
|
+
// const chainInfo = this.state.chainService.getChainInfoByKey(chain);
|
|
1951
|
+
|
|
1952
|
+
const accountPair = _uiKeyring.default.getPair(address);
|
|
1953
|
+
const account = (0, _utils4.pairToAccount)(accountPair);
|
|
1954
|
+
const payload = {
|
|
1955
|
+
payload: undefined,
|
|
1956
|
+
payloadJson: undefined,
|
|
1957
|
+
account,
|
|
1958
|
+
canSign: true,
|
|
1959
|
+
hashPayload: tx.toHex(),
|
|
1960
|
+
id
|
|
1961
|
+
};
|
|
1962
|
+
const emitter = new _eventemitter.default();
|
|
1963
|
+
const eventData = {
|
|
1964
|
+
id,
|
|
1965
|
+
errors: [],
|
|
1966
|
+
warnings: [],
|
|
1967
|
+
extrinsicHash: id
|
|
1968
|
+
};
|
|
1969
|
+
const isInjected = !!account.isInjected;
|
|
1970
|
+
// const isExternal = !!account.isExternal;
|
|
1971
|
+
|
|
1972
|
+
if (isInjected) {
|
|
1973
|
+
throw new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED);
|
|
1974
|
+
} else {
|
|
1975
|
+
this.state.requestService.addConfirmationBitcoin(id, url || _constants2.EXTENSION_REQUEST_URL, 'bitcoinSendTransactionRequest', payload, {}).then(_ref23 => {
|
|
1976
|
+
let {
|
|
1977
|
+
isApproved,
|
|
1978
|
+
payload
|
|
1979
|
+
} = _ref23;
|
|
1980
|
+
if (isApproved) {
|
|
1981
|
+
if (!payload) {
|
|
1982
|
+
throw new Error('Bad signature');
|
|
1983
|
+
}
|
|
1984
|
+
|
|
1985
|
+
// Emit signed event
|
|
1986
|
+
emitter.emit('signed', eventData);
|
|
1987
|
+
// Add start info
|
|
1988
|
+
emitter.emit('send', eventData);
|
|
1989
|
+
const bitcoinApi = this.state.chainService.getBitcoinApi(chain);
|
|
1990
|
+
const event = bitcoinApi.api.sendRawTransaction(payload);
|
|
1991
|
+
event.on('extrinsicHash', txHash => {
|
|
1992
|
+
eventData.extrinsicHash = txHash;
|
|
1993
|
+
emitter.emit('extrinsicHash', eventData);
|
|
1994
|
+
});
|
|
1995
|
+
event.on('success', transactionStatus => {
|
|
1996
|
+
eventData.blockHash = transactionStatus.block_hash || undefined;
|
|
1997
|
+
eventData.blockNumber = transactionStatus.block_height || undefined;
|
|
1998
|
+
eventData.blockTime = transactionStatus.block_time ? transactionStatus.block_time * 1000 : undefined;
|
|
1999
|
+
emitter.emit('success', eventData);
|
|
2000
|
+
});
|
|
2001
|
+
event.on('error', error => {
|
|
2002
|
+
eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, error));
|
|
2003
|
+
emitter.emit('error', eventData);
|
|
2004
|
+
});
|
|
2005
|
+
} else {
|
|
2006
|
+
this.removeTransaction(id);
|
|
2007
|
+
eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.USER_REJECT_REQUEST));
|
|
2008
|
+
emitter.emit('error', eventData);
|
|
2009
|
+
}
|
|
2010
|
+
}).catch(e => {
|
|
2011
|
+
this.removeTransaction(id);
|
|
2012
|
+
eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SIGN, e.message));
|
|
2013
|
+
emitter.emit('error', eventData);
|
|
2014
|
+
});
|
|
2015
|
+
}
|
|
2016
|
+
return emitter;
|
|
2017
|
+
}
|
|
1897
2018
|
handleTransactionTimeout(emitter, eventData) {
|
|
1898
2019
|
const timeout = setTimeout(() => {
|
|
1899
2020
|
const transaction = this.getTransaction(eventData.id);
|
|
@@ -37,8 +37,8 @@ function getBlockExplorerAccountRoute(explorerLink) {
|
|
|
37
37
|
if (explorerLink.includes('statescan.io')) {
|
|
38
38
|
return '#/accounts';
|
|
39
39
|
}
|
|
40
|
-
if (explorerLink.includes('explorer.
|
|
41
|
-
return '
|
|
40
|
+
if (explorerLink.includes('explorer.gen6.app')) {
|
|
41
|
+
return '#/accounts';
|
|
42
42
|
}
|
|
43
43
|
if (explorerLink.includes('astral.autonomys')) {
|
|
44
44
|
return 'accounts';
|
|
@@ -49,7 +49,7 @@ function getBlockExplorerAccountRoute(explorerLink) {
|
|
|
49
49
|
return 'address';
|
|
50
50
|
}
|
|
51
51
|
function getBlockExplorerTxRoute(chainInfo) {
|
|
52
|
-
if ((0, _utils._isPureEvmChain)(chainInfo)) {
|
|
52
|
+
if ((0, _utils._isPureEvmChain)(chainInfo) || (0, _utils._isPureBitcoinChain)(chainInfo)) {
|
|
53
53
|
return 'tx';
|
|
54
54
|
}
|
|
55
55
|
if ((0, _utils._isPureCardanoChain)(chainInfo)) {
|
|
@@ -58,6 +58,9 @@ function getBlockExplorerTxRoute(chainInfo) {
|
|
|
58
58
|
if (['aventus', 'deeper_network'].includes(chainInfo.slug)) {
|
|
59
59
|
return 'transaction';
|
|
60
60
|
}
|
|
61
|
+
if (['gen6_public'].includes(chainInfo.slug)) {
|
|
62
|
+
return '#/extrinsics';
|
|
63
|
+
}
|
|
61
64
|
const explorerLink = (0, _utils._getBlockExplorerFromChain)(chainInfo);
|
|
62
65
|
if (explorerLink && explorerLink.includes('statescan.io')) {
|
|
63
66
|
return '#/extrinsics';
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BaseApiRequestContext = void 0;
|
|
7
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
8
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
9
|
+
|
|
10
|
+
class BaseApiRequestContext {
|
|
11
|
+
callRate = 2; // limit per interval check
|
|
12
|
+
limitRate = 2; // max rate per interval check
|
|
13
|
+
intervalCheck = 1000; // interval check in ms
|
|
14
|
+
maxRetry = 9; // interval check in ms
|
|
15
|
+
rollbackRateTime = 30 * 1000; // rollback rate time in ms
|
|
16
|
+
timeoutRollbackRate = undefined;
|
|
17
|
+
constructor(options) {
|
|
18
|
+
this.callRate = (options === null || options === void 0 ? void 0 : options.limitRate) || this.callRate;
|
|
19
|
+
this.limitRate = (options === null || options === void 0 ? void 0 : options.limitRate) || this.limitRate;
|
|
20
|
+
this.intervalCheck = (options === null || options === void 0 ? void 0 : options.intervalCheck) || this.intervalCheck;
|
|
21
|
+
this.maxRetry = (options === null || options === void 0 ? void 0 : options.maxRetry) || this.maxRetry;
|
|
22
|
+
}
|
|
23
|
+
reduceLimitRate() {
|
|
24
|
+
clearTimeout(this.timeoutRollbackRate);
|
|
25
|
+
this.callRate = Math.ceil(this.limitRate / 2);
|
|
26
|
+
this.timeoutRollbackRate = setTimeout(() => {
|
|
27
|
+
this.callRate = this.limitRate;
|
|
28
|
+
}, this.rollbackRateTime);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.BaseApiRequestContext = BaseApiRequestContext;
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BaseApiRequestStrategy = void 0;
|
|
7
|
+
var _SWError = require("@subwallet/extension-base/background/errors/SWError");
|
|
8
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
9
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
10
|
+
|
|
11
|
+
class BaseApiRequestStrategy {
|
|
12
|
+
nextId = 0;
|
|
13
|
+
isRunning = false;
|
|
14
|
+
requestMap = {};
|
|
15
|
+
processInterval = undefined;
|
|
16
|
+
getId() {
|
|
17
|
+
return this.nextId++;
|
|
18
|
+
}
|
|
19
|
+
constructor(context) {
|
|
20
|
+
this.context = context;
|
|
21
|
+
}
|
|
22
|
+
addRequest(run, ordinal) {
|
|
23
|
+
const newId = this.getId();
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
this.requestMap[newId] = {
|
|
26
|
+
id: newId,
|
|
27
|
+
status: 'pending',
|
|
28
|
+
retry: -1,
|
|
29
|
+
ordinal,
|
|
30
|
+
run,
|
|
31
|
+
resolve,
|
|
32
|
+
reject
|
|
33
|
+
};
|
|
34
|
+
if (!this.isRunning) {
|
|
35
|
+
this.process();
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
process() {
|
|
40
|
+
this.stop();
|
|
41
|
+
this.isRunning = true;
|
|
42
|
+
const maxRetry = this.context.maxRetry;
|
|
43
|
+
const interval = setInterval(() => {
|
|
44
|
+
const remainingRequests = Object.values(this.requestMap);
|
|
45
|
+
if (remainingRequests.length === 0) {
|
|
46
|
+
this.isRunning = false;
|
|
47
|
+
clearInterval(interval);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
// Get first this.limit requests base on id
|
|
52
|
+
const requests = remainingRequests.filter(request => request.status !== 'running').sort((a, b) => a.id - b.id).sort((a, b) => a.ordinal - b.ordinal).slice(0, this.context.callRate);
|
|
53
|
+
|
|
54
|
+
// Start requests
|
|
55
|
+
requests.forEach(request => {
|
|
56
|
+
request.status = 'running';
|
|
57
|
+
request.run().then(rs => {
|
|
58
|
+
request.resolve(rs);
|
|
59
|
+
}).catch(e => {
|
|
60
|
+
const isRateLimited = this.isRateLimited(e);
|
|
61
|
+
|
|
62
|
+
// Limit rate
|
|
63
|
+
if (isRateLimited) {
|
|
64
|
+
if (request.retry < maxRetry) {
|
|
65
|
+
request.status = 'pending';
|
|
66
|
+
request.retry++;
|
|
67
|
+
this.context.reduceLimitRate();
|
|
68
|
+
} else {
|
|
69
|
+
// Reject request
|
|
70
|
+
request.reject(new _SWError.SWError('MAX_RETRY', String(e)));
|
|
71
|
+
}
|
|
72
|
+
} else {
|
|
73
|
+
request.reject(new _SWError.SWError('UNKNOWN', String(e)));
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}, this.context.intervalCheck);
|
|
78
|
+
this.processInterval = interval;
|
|
79
|
+
}
|
|
80
|
+
stop() {
|
|
81
|
+
clearInterval(this.processInterval);
|
|
82
|
+
this.processInterval = undefined;
|
|
83
|
+
}
|
|
84
|
+
setContext(context) {
|
|
85
|
+
this.stop();
|
|
86
|
+
this.context = context;
|
|
87
|
+
this.process();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
exports.BaseApiRequestStrategy = BaseApiRequestStrategy;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.postRequest = exports.getRequest = void 0;
|
|
8
|
+
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
const postRequest = function (url, body, headers) {
|
|
13
|
+
let jsonBody = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
|
|
14
|
+
return (0, _crossFetch.default)(url, {
|
|
15
|
+
method: 'POST',
|
|
16
|
+
headers: headers || {
|
|
17
|
+
'Content-Type': 'application/json'
|
|
18
|
+
},
|
|
19
|
+
body: jsonBody ? JSON.stringify(body) : body
|
|
20
|
+
});
|
|
21
|
+
};
|
|
22
|
+
exports.postRequest = postRequest;
|
|
23
|
+
const getRequest = (url, params, headers) => {
|
|
24
|
+
const queryString = params ? Object.keys(params).map(key => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`).join('&') : '';
|
|
25
|
+
const _url = `${url}?${queryString}`;
|
|
26
|
+
return (0, _crossFetch.default)(_url, {
|
|
27
|
+
method: 'GET',
|
|
28
|
+
headers: headers || {
|
|
29
|
+
'Content-Type': 'application/json'
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
};
|
|
33
|
+
exports.getRequest = getRequest;
|
|
@@ -77,7 +77,7 @@ const ACCOUNT_CHAIN_TYPE_ORDINAL_MAP = {
|
|
|
77
77
|
[AccountChainType.BITCOIN]: 5
|
|
78
78
|
};
|
|
79
79
|
exports.ACCOUNT_CHAIN_TYPE_ORDINAL_MAP = ACCOUNT_CHAIN_TYPE_ORDINAL_MAP;
|
|
80
|
-
const SUPPORTED_ACCOUNT_CHAIN_TYPES = [
|
|
80
|
+
const SUPPORTED_ACCOUNT_CHAIN_TYPES = [AccountChainType.SUBSTRATE, AccountChainType.ETHEREUM, AccountChainType.TON, AccountChainType.CARDANO, AccountChainType.BITCOIN];
|
|
81
81
|
exports.SUPPORTED_ACCOUNT_CHAIN_TYPES = SUPPORTED_ACCOUNT_CHAIN_TYPES;
|
|
82
82
|
let AccountActions;
|
|
83
83
|
/**
|