@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.
- package/background/KoniTypes.d.ts +134 -5
- package/background/KoniTypes.js +18 -0
- package/background/errors/BitcoinProviderError.d.ts +6 -0
- package/background/errors/BitcoinProviderError.js +47 -0
- package/background/types.d.ts +1 -1
- 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/request.js +316 -3
- 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 +477 -93
- package/cjs/koni/background/handlers/State.js +249 -16
- package/cjs/koni/background/handlers/Tabs.js +119 -6
- package/cjs/packageInfo.js +1 -1
- package/cjs/page/bitcoin/index.js +67 -0
- package/cjs/page/index.js +5 -0
- 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/buy-service/index.js +17 -2
- 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/earning-service/handlers/native-staking/para-chain.js +27 -5
- 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/AuthRequestHandler.js +18 -0
- package/cjs/services/request-service/handler/BitcoinRequestHandler.js +427 -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 +206 -16
- 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/auth.js +2 -1
- 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/request.d.ts +6 -2
- package/core/logic-validation/request.js +309 -3
- 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 +5 -0
- package/koni/background/handlers/Extension.js +387 -9
- package/koni/background/handlers/State.d.ts +10 -3
- package/koni/background/handlers/State.js +240 -15
- package/koni/background/handlers/Tabs.d.ts +7 -2
- package/koni/background/handlers/Tabs.js +119 -9
- package/package.json +149 -8
- package/packageInfo.js +1 -1
- package/page/bitcoin/index.d.ts +17 -0
- package/page/bitcoin/index.js +60 -0
- package/page/index.d.ts +2 -1
- package/page/index.js +4 -0
- 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/cardano-transfer.d.ts +2 -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/buy-service/index.js +17 -2
- 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/earning-service/handlers/native-staking/para-chain.js +27 -5
- 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/AuthRequestHandler.js +19 -1
- package/services/request-service/handler/BitcoinRequestHandler.d.ts +22 -0
- package/services/request-service/handler/BitcoinRequestHandler.js +414 -0
- package/services/request-service/index.d.ts +8 -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 +4 -5
- package/services/transaction-service/index.js +205 -17
- package/services/transaction-service/types.d.ts +13 -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 +19 -0
- package/types/bitcoin.d.ts +93 -0
- package/types/bitcoin.js +17 -0
- package/types/buy.d.ts +1 -1
- 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/auth.js +3 -2
- 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
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.subscribeBitcoinBalance = subscribeBitcoinBalance;
|
|
7
|
+
var _types = require("@subwallet/chain-list/types");
|
|
8
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
9
|
+
var _constants = require("@subwallet/extension-base/constants");
|
|
10
|
+
var _utils = require("@subwallet/extension-base/utils");
|
|
11
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
12
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
13
|
+
|
|
14
|
+
function getDefaultBalanceResult() {
|
|
15
|
+
return {
|
|
16
|
+
balance: '0',
|
|
17
|
+
bitcoinBalanceMetadata: {
|
|
18
|
+
inscriptionCount: 0,
|
|
19
|
+
runeBalance: '0',
|
|
20
|
+
inscriptionBalance: '0'
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
async function getBitcoinBalance(bitcoinApi, addresses) {
|
|
25
|
+
return await Promise.all(addresses.map(async address => {
|
|
26
|
+
try {
|
|
27
|
+
const [addressSummaryInfo] = await Promise.all([bitcoinApi.api.getAddressSummaryInfo(address)]);
|
|
28
|
+
if (Number(addressSummaryInfo.balance) < 0) {
|
|
29
|
+
return getDefaultBalanceResult();
|
|
30
|
+
}
|
|
31
|
+
const bitcoinBalanceMetadata = {
|
|
32
|
+
inscriptionCount: addressSummaryInfo.total_inscription,
|
|
33
|
+
runeBalance: addressSummaryInfo.balance_rune,
|
|
34
|
+
inscriptionBalance: addressSummaryInfo.balance_inscription
|
|
35
|
+
};
|
|
36
|
+
return {
|
|
37
|
+
balance: addressSummaryInfo.balance.toString(),
|
|
38
|
+
bitcoinBalanceMetadata: bitcoinBalanceMetadata
|
|
39
|
+
};
|
|
40
|
+
} catch (error) {
|
|
41
|
+
console.log('Error while fetching Bitcoin balances', error);
|
|
42
|
+
return getDefaultBalanceResult();
|
|
43
|
+
}
|
|
44
|
+
}));
|
|
45
|
+
}
|
|
46
|
+
function subscribeBitcoinBalance(params) {
|
|
47
|
+
var _Object$values$;
|
|
48
|
+
const {
|
|
49
|
+
addresses,
|
|
50
|
+
assetMap,
|
|
51
|
+
bitcoinApi,
|
|
52
|
+
callback,
|
|
53
|
+
chainInfo
|
|
54
|
+
} = params;
|
|
55
|
+
const chain = chainInfo.slug;
|
|
56
|
+
const nativeTokenInfo = (0, _utils.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.NATIVE]);
|
|
57
|
+
const nativeTokenSlug = ((_Object$values$ = Object.values(nativeTokenInfo)[0]) === null || _Object$values$ === void 0 ? void 0 : _Object$values$.slug) || '';
|
|
58
|
+
const getBalance = () => {
|
|
59
|
+
getBitcoinBalance(bitcoinApi, addresses).then(balances => {
|
|
60
|
+
return balances.map((_ref, index) => {
|
|
61
|
+
let {
|
|
62
|
+
balance,
|
|
63
|
+
bitcoinBalanceMetadata
|
|
64
|
+
} = _ref;
|
|
65
|
+
return {
|
|
66
|
+
address: addresses[index],
|
|
67
|
+
tokenSlug: nativeTokenSlug,
|
|
68
|
+
state: _KoniTypes.APIItemState.READY,
|
|
69
|
+
free: balance,
|
|
70
|
+
locked: (parseInt(bitcoinBalanceMetadata.runeBalance.toString()) + parseInt(bitcoinBalanceMetadata.inscriptionBalance.toString())).toString(),
|
|
71
|
+
metadata: bitcoinBalanceMetadata
|
|
72
|
+
};
|
|
73
|
+
});
|
|
74
|
+
}).catch(e => {
|
|
75
|
+
console.error('Error on get Bitcoin balance with token bitcoin', e);
|
|
76
|
+
return addresses.map(address => {
|
|
77
|
+
return {
|
|
78
|
+
address: address,
|
|
79
|
+
tokenSlug: nativeTokenSlug,
|
|
80
|
+
state: _KoniTypes.APIItemState.READY,
|
|
81
|
+
free: '0',
|
|
82
|
+
locked: '0'
|
|
83
|
+
};
|
|
84
|
+
});
|
|
85
|
+
}).then(items => {
|
|
86
|
+
callback(items);
|
|
87
|
+
}).catch(console.error);
|
|
88
|
+
};
|
|
89
|
+
const interval = setInterval(getBalance, _constants.BITCOIN_REFRESH_BALANCE_INTERVAL);
|
|
90
|
+
getBalance();
|
|
91
|
+
return () => {
|
|
92
|
+
clearInterval(interval);
|
|
93
|
+
};
|
|
94
|
+
}
|
|
@@ -8,6 +8,7 @@ exports.getAccountJsonByAddress = void 0;
|
|
|
8
8
|
exports.subscribeBalance = subscribeBalance;
|
|
9
9
|
var _types = require("@subwallet/chain-list/types");
|
|
10
10
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
11
|
+
var _bitcoin2 = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/bitcoin");
|
|
11
12
|
var _cardano = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano");
|
|
12
13
|
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
13
14
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
@@ -45,20 +46,21 @@ const getAccountJsonByAddress = address => {
|
|
|
45
46
|
exports.getAccountJsonByAddress = getAccountJsonByAddress;
|
|
46
47
|
const filterAddress = (addresses, chainInfo) => {
|
|
47
48
|
const {
|
|
49
|
+
_bitcoin,
|
|
48
50
|
bitcoin,
|
|
49
51
|
cardano,
|
|
50
52
|
evm,
|
|
51
53
|
substrate,
|
|
52
54
|
ton
|
|
53
|
-
} = (0, _utils2.getAddressesByChainTypeMap)(addresses);
|
|
55
|
+
} = (0, _utils2.getAddressesByChainTypeMap)(addresses, chainInfo);
|
|
54
56
|
if ((0, _utils._isChainEvmCompatible)(chainInfo)) {
|
|
55
|
-
return [evm, [
|
|
57
|
+
return [evm, [bitcoin, substrate, ton, cardano, _bitcoin].flat()];
|
|
56
58
|
} else if ((0, _utils._isChainBitcoinCompatible)(chainInfo)) {
|
|
57
|
-
return [bitcoin, [
|
|
59
|
+
return [bitcoin, [evm, substrate, ton, cardano, _bitcoin].flat()];
|
|
58
60
|
} else if ((0, _utils._isChainTonCompatible)(chainInfo)) {
|
|
59
|
-
return [ton, [
|
|
61
|
+
return [ton, [bitcoin, evm, substrate, cardano, _bitcoin].flat()];
|
|
60
62
|
} else if ((0, _utils._isChainCardanoCompatible)(chainInfo)) {
|
|
61
|
-
return [cardano, [
|
|
63
|
+
return [cardano, [bitcoin, evm, substrate, ton, _bitcoin].flat()];
|
|
62
64
|
} else {
|
|
63
65
|
const fetchList = [];
|
|
64
66
|
const unfetchList = [];
|
|
@@ -84,7 +86,7 @@ const filterAddress = (addresses, chainInfo) => {
|
|
|
84
86
|
fetchList.push(address);
|
|
85
87
|
}
|
|
86
88
|
});
|
|
87
|
-
return [fetchList, [
|
|
89
|
+
return [fetchList, [unfetchList, bitcoin, evm, ton, cardano, _bitcoin].flat()];
|
|
88
90
|
}
|
|
89
91
|
};
|
|
90
92
|
const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap, state, callback) => {
|
|
@@ -104,7 +106,7 @@ const handleUnsupportedOrPendingAddresses = (addresses, chainSlug, chainAssetMap
|
|
|
104
106
|
};
|
|
105
107
|
|
|
106
108
|
// main subscription, use for multiple chains, multiple addresses and multiple tokens
|
|
107
|
-
function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, callback, extrinsicType) {
|
|
109
|
+
function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, callback, extrinsicType) {
|
|
108
110
|
// Filter chain and token
|
|
109
111
|
const chainAssetMap = Object.fromEntries(Object.entries(_chainAssetMap).filter(_ref => {
|
|
110
112
|
let [token] = _ref;
|
|
@@ -152,6 +154,16 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
|
|
|
152
154
|
cardanoApi
|
|
153
155
|
});
|
|
154
156
|
}
|
|
157
|
+
const bitcoinApi = bitcoinApiMap[chainSlug];
|
|
158
|
+
if ((0, _utils._isPureBitcoinChain)(chainInfo)) {
|
|
159
|
+
return (0, _bitcoin2.subscribeBitcoinBalance)({
|
|
160
|
+
addresses: useAddresses,
|
|
161
|
+
assetMap: chainAssetMap,
|
|
162
|
+
bitcoinApi,
|
|
163
|
+
callback,
|
|
164
|
+
chainInfo
|
|
165
|
+
});
|
|
166
|
+
}
|
|
155
167
|
|
|
156
168
|
// If the chain is not ready, return pending state
|
|
157
169
|
if (!substrateApiMap[chainSlug].isApiReady) {
|
|
@@ -38,6 +38,9 @@ class BalanceService {
|
|
|
38
38
|
stopPromiseHandler = (0, _utils2.createPromiseHandler)();
|
|
39
39
|
status = _types.ServiceStatus.NOT_INITIALIZED;
|
|
40
40
|
isReload = false;
|
|
41
|
+
get isStarted() {
|
|
42
|
+
return this.status === _types.ServiceStatus.STARTED;
|
|
43
|
+
}
|
|
41
44
|
detectAccountBalanceStore = new _DetectAccountBalance.default();
|
|
42
45
|
balanceDetectSubject = new _rxjs.BehaviorSubject({});
|
|
43
46
|
intervalTime = 3 * 60 * 1000;
|
|
@@ -63,7 +66,7 @@ class BalanceService {
|
|
|
63
66
|
this.status = _types.ServiceStatus.INITIALIZED;
|
|
64
67
|
|
|
65
68
|
// Start service
|
|
66
|
-
await this.start();
|
|
69
|
+
// await this.start(); // Commented out to avoid auto start when app not fully initialized
|
|
67
70
|
|
|
68
71
|
// Handle events
|
|
69
72
|
this.state.eventService.onLazy(this.handleEvents.bind(this));
|
|
@@ -149,7 +152,7 @@ class BalanceService {
|
|
|
149
152
|
}
|
|
150
153
|
if (needReload) {
|
|
151
154
|
(0, _utils2.addLazy)('reloadBalanceByEvents', () => {
|
|
152
|
-
if (!this.isReload) {
|
|
155
|
+
if (!this.isReload && this.isStarted) {
|
|
153
156
|
this.runSubscribeBalances().catch(console.error);
|
|
154
157
|
}
|
|
155
158
|
}, lazyTime, undefined, true);
|
|
@@ -203,8 +206,9 @@ class BalanceService {
|
|
|
203
206
|
const substrateApiMap = this.state.chainService.getSubstrateApiMap();
|
|
204
207
|
const tonApiMap = this.state.chainService.getTonApiMap();
|
|
205
208
|
const cardanoApiMap = this.state.chainService.getCardanoApiMap();
|
|
209
|
+
const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
|
|
206
210
|
let unsub = _util.noop;
|
|
207
|
-
unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
|
|
211
|
+
unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
|
|
208
212
|
const rs = result[0];
|
|
209
213
|
let value;
|
|
210
214
|
switch (balanceType) {
|
|
@@ -375,13 +379,14 @@ class BalanceService {
|
|
|
375
379
|
const substrateApiMap = this.state.chainService.getSubstrateApiMap();
|
|
376
380
|
const tonApiMap = this.state.chainService.getTonApiMap();
|
|
377
381
|
const cardanoApiMap = this.state.chainService.getCardanoApiMap();
|
|
382
|
+
const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
|
|
378
383
|
const activeChainSlugs = Object.keys(this.state.getActiveChainInfoMap());
|
|
379
384
|
const assetState = this.state.chainService.subscribeAssetSettings().value;
|
|
380
385
|
const assets = Object.values(assetMap).filter(asset => {
|
|
381
386
|
var _assetState$asset$slu;
|
|
382
387
|
return activeChainSlugs.includes(asset.originChain) && ((_assetState$asset$slu = assetState[asset.slug]) === null || _assetState$asset$slu === void 0 ? void 0 : _assetState$asset$slu.visible);
|
|
383
388
|
}).map(asset => asset.slug);
|
|
384
|
-
const unsub = (0, _helpers.subscribeBalance)(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, result => {
|
|
389
|
+
const unsub = (0, _helpers.subscribeBalance)(addresses, activeChainSlugs, assets, assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
|
|
385
390
|
!cancel && this.setBalanceItem(result);
|
|
386
391
|
}, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
|
|
387
392
|
const unsub2 = this.state.subscribeMantaPayBalance();
|
|
@@ -391,6 +396,29 @@ class BalanceService {
|
|
|
391
396
|
unsub2 && unsub2();
|
|
392
397
|
};
|
|
393
398
|
}
|
|
399
|
+
async refreshBalanceForAddress(address, chain, asset, extrinsicType) {
|
|
400
|
+
// Check if address and chain are valid
|
|
401
|
+
const chainInfoMap = this.state.chainService.getChainInfoMap();
|
|
402
|
+
if (!chainInfoMap[chain]) {
|
|
403
|
+
console.warn(`Chain ${chain} is not supported`);
|
|
404
|
+
return;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Get necessary data
|
|
408
|
+
const assetMap = this.state.chainService.getAssetRegistry();
|
|
409
|
+
const evmApiMap = this.state.chainService.getEvmApiMap();
|
|
410
|
+
const substrateApiMap = this.state.chainService.getSubstrateApiMap();
|
|
411
|
+
const tonApiMap = this.state.chainService.getTonApiMap();
|
|
412
|
+
const cardanoApiMap = this.state.chainService.getCardanoApiMap();
|
|
413
|
+
const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
|
|
414
|
+
return new Promise(resolve => {
|
|
415
|
+
const unsub = (0, _helpers.subscribeBalance)([address], [chain], [asset], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
|
|
416
|
+
this.setBalanceItem(result);
|
|
417
|
+
unsub();
|
|
418
|
+
resolve();
|
|
419
|
+
}, extrinsicType || _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
|
|
420
|
+
});
|
|
421
|
+
}
|
|
394
422
|
|
|
395
423
|
/** Unsubscribe balance subscription */
|
|
396
424
|
runUnsubscribeBalances() {
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.createBitcoinTransaction = createBitcoinTransaction;
|
|
8
|
+
var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
|
|
9
|
+
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
10
|
+
var _utils = require("@subwallet/extension-base/utils");
|
|
11
|
+
var _types = require("@subwallet/keyring/types");
|
|
12
|
+
var _utils2 = require("@subwallet/keyring/utils");
|
|
13
|
+
var _uiKeyring = require("@subwallet/ui-keyring");
|
|
14
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
15
|
+
var _bitcoinjsLib = require("bitcoinjs-lib");
|
|
16
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
17
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
18
|
+
|
|
19
|
+
async function createBitcoinTransaction(params) {
|
|
20
|
+
const {
|
|
21
|
+
bitcoinApi,
|
|
22
|
+
chain,
|
|
23
|
+
feeCustom: _feeCustom,
|
|
24
|
+
feeInfo: _feeInfo,
|
|
25
|
+
feeOption,
|
|
26
|
+
from,
|
|
27
|
+
network,
|
|
28
|
+
to,
|
|
29
|
+
transferAll,
|
|
30
|
+
value
|
|
31
|
+
} = params;
|
|
32
|
+
const feeCustom = _feeCustom;
|
|
33
|
+
const feeInfo = _feeInfo;
|
|
34
|
+
const bitcoinFee = (0, _utils.combineBitcoinFee)(feeInfo, feeOption, feeCustom);
|
|
35
|
+
const utxos = await (0, _utils.getTransferableBitcoinUtxos)(bitcoinApi, from);
|
|
36
|
+
try {
|
|
37
|
+
const amountValue = parseFloat(value);
|
|
38
|
+
const determineUtxosArgs = {
|
|
39
|
+
amount: amountValue,
|
|
40
|
+
feeRate: bitcoinFee.feeRate,
|
|
41
|
+
recipient: to,
|
|
42
|
+
sender: from,
|
|
43
|
+
utxos
|
|
44
|
+
};
|
|
45
|
+
const {
|
|
46
|
+
fee,
|
|
47
|
+
inputs,
|
|
48
|
+
isCustomFeeRate,
|
|
49
|
+
outputs,
|
|
50
|
+
size
|
|
51
|
+
} = transferAll ? (0, _utils.determineUtxosForSpendAll)(determineUtxosArgs) : (0, _utils.determineUtxosForSpend)(determineUtxosArgs);
|
|
52
|
+
const pair = _uiKeyring.keyring.getPair(from);
|
|
53
|
+
const tx = new _bitcoinjsLib.Psbt({
|
|
54
|
+
network
|
|
55
|
+
});
|
|
56
|
+
let transferAmount = new _bignumber.default(0);
|
|
57
|
+
for (const input of inputs) {
|
|
58
|
+
const addressInfo = (0, _utils2.getBitcoinAddressInfo)(pair.address);
|
|
59
|
+
if (addressInfo.type === _types.BitcoinAddressType.p2pkh || addressInfo.type === _types.BitcoinAddressType.p2sh) {
|
|
60
|
+
// BIP-44 (Legacy)
|
|
61
|
+
const hex = await bitcoinApi.api.getTxHex(input.txid);
|
|
62
|
+
tx.addInput({
|
|
63
|
+
hash: input.txid,
|
|
64
|
+
index: input.vout,
|
|
65
|
+
nonWitnessUtxo: Buffer.from(hex, 'hex')
|
|
66
|
+
});
|
|
67
|
+
} else if (addressInfo.type === _types.BitcoinAddressType.p2wpkh) {
|
|
68
|
+
// BIP-84 (Native SegWit)
|
|
69
|
+
tx.addInput({
|
|
70
|
+
hash: input.txid,
|
|
71
|
+
index: input.vout,
|
|
72
|
+
witnessUtxo: {
|
|
73
|
+
script: pair.bitcoin.output,
|
|
74
|
+
value: input.value
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
} else if (addressInfo.type === _types.BitcoinAddressType.p2tr) {
|
|
78
|
+
// BIP-86 (Taproot)
|
|
79
|
+
tx.addInput({
|
|
80
|
+
hash: input.txid,
|
|
81
|
+
index: input.vout,
|
|
82
|
+
witnessUtxo: {
|
|
83
|
+
script: pair.bitcoin.output,
|
|
84
|
+
value: input.value // UTXO value in satoshis
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
tapInternalKey: pair.bitcoin.internalPubkey // X-only public key (32 bytes)
|
|
88
|
+
});
|
|
89
|
+
} else {
|
|
90
|
+
throw new Error(`Unsupported address type: ${addressInfo.type}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
for (const output of outputs) {
|
|
94
|
+
tx.addOutput({
|
|
95
|
+
address: output.address || from,
|
|
96
|
+
value: output.value
|
|
97
|
+
});
|
|
98
|
+
if (output.address === to) {
|
|
99
|
+
transferAmount = transferAmount.plus(output.value);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
const customFeeRate = fee / size;
|
|
103
|
+
const customFeeRateResult = isCustomFeeRate ? customFeeRate.toString() : undefined;
|
|
104
|
+
return [tx, transferAmount.toString(), customFeeRateResult];
|
|
105
|
+
} catch (e) {
|
|
106
|
+
if (e instanceof _TransactionError.TransactionError) {
|
|
107
|
+
throw e;
|
|
108
|
+
}
|
|
109
|
+
console.warn('Failed to create Bitcoin transaction:', e);
|
|
110
|
+
throw new Error(`You don’t have enough BTC (${convertChainToSymbol(chain)}) for the transaction. Lower your BTC amount and try again`);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
function convertChainToSymbol(chain) {
|
|
114
|
+
if (chain === _constants._BITCOIN_CHAIN_SLUG) {
|
|
115
|
+
return _constants._BITCOIN_NAME;
|
|
116
|
+
} else {
|
|
117
|
+
return _constants._BITCOIN_TESTNET_NAME;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -116,6 +116,8 @@ const createSubstrateExtrinsic = async _ref => {
|
|
|
116
116
|
transfer = api.tx.balances.transfer(to, new _util.BN(value));
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
|
+
} else if (_constants._TRANSFER_CHAIN_GROUP.truth.includes(networkKey)) {
|
|
120
|
+
transfer = api.tx.assetManager.transfer(to, (0, _utils3._getTokenOnChainInfo)(tokenInfo), value);
|
|
119
121
|
}
|
|
120
122
|
return [transfer, transferAmount || value];
|
|
121
123
|
};
|
|
@@ -15,6 +15,8 @@ exports.ServiceStatus = ServiceStatus;
|
|
|
15
15
|
ServiceStatus["INITIALIZED"] = "initialized";
|
|
16
16
|
ServiceStatus["STARTED"] = "started";
|
|
17
17
|
ServiceStatus["STARTING"] = "starting";
|
|
18
|
+
ServiceStatus["STARTED_FULL"] = "started_full";
|
|
19
|
+
ServiceStatus["STARTING_FULL"] = "starting_full";
|
|
18
20
|
ServiceStatus["STOPPED"] = "stopped";
|
|
19
21
|
ServiceStatus["STOPPING"] = "stopping";
|
|
20
22
|
})(ServiceStatus || (exports.ServiceStatus = ServiceStatus = {}));
|
|
@@ -12,7 +12,18 @@ var _constants = require("./constants");
|
|
|
12
12
|
// SPDX-License-Identifier: Apache-2.0
|
|
13
13
|
|
|
14
14
|
const convertSupportType = support => {
|
|
15
|
-
|
|
15
|
+
switch (support) {
|
|
16
|
+
case 'ETHEREUM':
|
|
17
|
+
return _types.AccountChainType.ETHEREUM;
|
|
18
|
+
case 'SUBSTRATE':
|
|
19
|
+
return _types.AccountChainType.SUBSTRATE;
|
|
20
|
+
case 'CARDANO':
|
|
21
|
+
return _types.AccountChainType.CARDANO;
|
|
22
|
+
case 'TON':
|
|
23
|
+
return _types.AccountChainType.TON;
|
|
24
|
+
default:
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
16
27
|
};
|
|
17
28
|
class BuyService {
|
|
18
29
|
#state;
|
|
@@ -35,11 +46,15 @@ class BuyService {
|
|
|
35
46
|
const data = await (0, _fetchStaticData.fetchStaticData)('buy-token-configs');
|
|
36
47
|
const result = {};
|
|
37
48
|
for (const datum of data) {
|
|
49
|
+
const support = convertSupportType(datum.support);
|
|
50
|
+
if (!support) {
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
38
53
|
const temp = {
|
|
39
54
|
serviceInfo: {
|
|
40
55
|
..._constants.DEFAULT_SERVICE_INFO
|
|
41
56
|
},
|
|
42
|
-
support
|
|
57
|
+
support,
|
|
43
58
|
services: [],
|
|
44
59
|
slug: datum.slug,
|
|
45
60
|
symbol: datum.symbol,
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
|
|
6
|
+
exports._ZK_ASSET_PREFIX = exports._XCM_TYPE = exports._XCM_CHAIN_GROUP = exports._TRANSFER_NOT_SUPPORTED_CHAINS = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MULTI_CHAIN_ASSET_SRC = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._CHAIN_LOGO_MAP_SRC = exports._CHAIN_INFO_SRC = exports._CHAIN_ASSET_SRC = exports._BTC_SERVICE_TOKEN = exports._BITCOIN_TESTNET_NAME = exports._BITCOIN_TESTNET_CHAIN_SLUG = exports._BITCOIN_NAME = exports._BITCOIN_CHAIN_SLUG = exports._BALANCE_TOKEN_GROUP = exports._BALANCE_PARSING_CHAIN_GROUP = exports._BALANCE_CHAIN_GROUP = exports._ASSET_REF_SRC = exports._ASSET_LOGO_MAP_SRC = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_MAX_RETRY = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
|
|
7
7
|
var _chainList = require("@subwallet/chain-list");
|
|
8
8
|
var _types = require("@subwallet/chain-list/types");
|
|
9
9
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
@@ -279,7 +279,8 @@ const _TRANSFER_CHAIN_GROUP = {
|
|
|
279
279
|
avail: ['kate', 'goldberg_testnet'],
|
|
280
280
|
pendulum: ['pendulum', 'amplitude', 'amplitude_test', 'hydradx_main', 'bifrost', 'bifrost_dot', 'jamton'],
|
|
281
281
|
centrifuge: ['centrifuge'],
|
|
282
|
-
disable_transfer: ['crab', 'pangolin']
|
|
282
|
+
disable_transfer: ['crab', 'pangolin'],
|
|
283
|
+
truth: ['truth_network']
|
|
283
284
|
};
|
|
284
285
|
exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
|
|
285
286
|
const _BALANCE_PARSING_CHAIN_GROUP = {
|
|
@@ -328,6 +329,14 @@ const LATEST_CHAIN_DATA_FETCHING_INTERVAL = 120000;
|
|
|
328
329
|
// TODO: review
|
|
329
330
|
exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = LATEST_CHAIN_DATA_FETCHING_INTERVAL;
|
|
330
331
|
const TARGET_BRANCH = process.env.NODE_ENV !== 'production' ? 'koni-dev' : 'master';
|
|
332
|
+
const _BITCOIN_CHAIN_SLUG = 'bitcoin';
|
|
333
|
+
exports._BITCOIN_CHAIN_SLUG = _BITCOIN_CHAIN_SLUG;
|
|
334
|
+
const _BITCOIN_TESTNET_CHAIN_SLUG = 'bitcoinTestnet';
|
|
335
|
+
exports._BITCOIN_TESTNET_CHAIN_SLUG = _BITCOIN_TESTNET_CHAIN_SLUG;
|
|
336
|
+
const _BITCOIN_NAME = 'Bitcoin';
|
|
337
|
+
exports._BITCOIN_NAME = _BITCOIN_NAME;
|
|
338
|
+
const _BITCOIN_TESTNET_NAME = 'Bitcoin Testnet';
|
|
339
|
+
exports._BITCOIN_TESTNET_NAME = _BITCOIN_TESTNET_NAME;
|
|
331
340
|
const _CHAIN_INFO_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainInfo.json`;
|
|
332
341
|
exports._CHAIN_INFO_SRC = _CHAIN_INFO_SRC;
|
|
333
342
|
const _CHAIN_ASSET_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainAsset.json`;
|
|
@@ -339,4 +348,6 @@ exports._MULTI_CHAIN_ASSET_SRC = _MULTI_CHAIN_ASSET_SRC;
|
|
|
339
348
|
const _CHAIN_LOGO_MAP_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainLogoMap.json`;
|
|
340
349
|
exports._CHAIN_LOGO_MAP_SRC = _CHAIN_LOGO_MAP_SRC;
|
|
341
350
|
const _ASSET_LOGO_MAP_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/AssetLogoMap.json`;
|
|
342
|
-
exports._ASSET_LOGO_MAP_SRC = _ASSET_LOGO_MAP_SRC;
|
|
351
|
+
exports._ASSET_LOGO_MAP_SRC = _ASSET_LOGO_MAP_SRC;
|
|
352
|
+
const _BTC_SERVICE_TOKEN = process.env.BTC_SERVICE_TOKEN || '';
|
|
353
|
+
exports._BTC_SERVICE_TOKEN = _BTC_SERVICE_TOKEN;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BitcoinApi = void 0;
|
|
7
|
+
var _BlockStreamTestnet = require("@subwallet/extension-base/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet");
|
|
8
|
+
var _SubWalletMainnet = require("@subwallet/extension-base/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet");
|
|
9
|
+
var _promise = require("@subwallet/extension-base/utils/promise");
|
|
10
|
+
var _rxjs = require("rxjs");
|
|
11
|
+
var _types = require("../../types");
|
|
12
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
13
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
14
|
+
|
|
15
|
+
// const isBlockStreamProvider = (apiUrl: string): boolean => apiUrl === 'https://blockstream-testnet.openbit.app' || apiUrl === 'https://electrs.openbit.app';
|
|
16
|
+
// const BLOCKSTREAM_TESTNET_API_URL = 'https://blockstream.info/testnet/api/';
|
|
17
|
+
// const MEMPOOL_TESTNET_V4_API_URL = 'https://mempool.space/testnet4/api/';
|
|
18
|
+
|
|
19
|
+
class BitcoinApi {
|
|
20
|
+
apiRetry = 0;
|
|
21
|
+
isApiConnectedSubject = new _rxjs.BehaviorSubject(false);
|
|
22
|
+
connectionStatusSubject = new _rxjs.BehaviorSubject(_types._ChainConnectionStatus.DISCONNECTED);
|
|
23
|
+
isApiReady = false;
|
|
24
|
+
isApiReadyOnce = false;
|
|
25
|
+
constructor(chainSlug, apiUrl) {
|
|
26
|
+
let {
|
|
27
|
+
providerName
|
|
28
|
+
} = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
29
|
+
this.chainSlug = chainSlug;
|
|
30
|
+
this.apiUrl = apiUrl;
|
|
31
|
+
this.providerName = providerName || 'unknown';
|
|
32
|
+
this.isReadyHandler = (0, _promise.createPromiseHandler)();
|
|
33
|
+
this.api = this.createApiStrategy(apiUrl);
|
|
34
|
+
this.connect();
|
|
35
|
+
}
|
|
36
|
+
get isApiConnected() {
|
|
37
|
+
return this.isApiConnectedSubject.getValue();
|
|
38
|
+
}
|
|
39
|
+
createApiStrategy(apiUrl) {
|
|
40
|
+
const isTestnet = apiUrl.includes('testnet');
|
|
41
|
+
const isBlockstreamUrl = apiUrl.includes('blockstream');
|
|
42
|
+
if (isTestnet) {
|
|
43
|
+
return isBlockstreamUrl ? new _BlockStreamTestnet.BlockStreamTestnetRequestStrategy(apiUrl) : new _BlockStreamTestnet.MempoolTestnetRequestStrategy(apiUrl);
|
|
44
|
+
}
|
|
45
|
+
return new _SubWalletMainnet.SubWalletMainnetRequestStrategy(apiUrl);
|
|
46
|
+
}
|
|
47
|
+
get connectionStatus() {
|
|
48
|
+
return this.connectionStatusSubject.getValue();
|
|
49
|
+
}
|
|
50
|
+
updateConnectionStatus(status) {
|
|
51
|
+
const isConnected = status === _types._ChainConnectionStatus.CONNECTED;
|
|
52
|
+
if (isConnected !== this.isApiConnectedSubject.value) {
|
|
53
|
+
this.isApiConnectedSubject.next(isConnected);
|
|
54
|
+
}
|
|
55
|
+
if (status !== this.connectionStatusSubject.value) {
|
|
56
|
+
this.connectionStatusSubject.next(status);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
get isReady() {
|
|
60
|
+
return this.isReadyHandler.promise;
|
|
61
|
+
}
|
|
62
|
+
async updateApiUrl(apiUrl) {
|
|
63
|
+
if (this.apiUrl === apiUrl) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
await this.disconnect();
|
|
67
|
+
this.apiUrl = apiUrl;
|
|
68
|
+
this.api = this.createApiStrategy(apiUrl);
|
|
69
|
+
this.connect();
|
|
70
|
+
}
|
|
71
|
+
async recoverConnect() {
|
|
72
|
+
await this.isReadyHandler.promise;
|
|
73
|
+
}
|
|
74
|
+
connect() {
|
|
75
|
+
this.updateConnectionStatus(_types._ChainConnectionStatus.CONNECTING);
|
|
76
|
+
this.onConnect();
|
|
77
|
+
}
|
|
78
|
+
async disconnect() {
|
|
79
|
+
this.onDisconnect();
|
|
80
|
+
this.updateConnectionStatus(_types._ChainConnectionStatus.DISCONNECTED);
|
|
81
|
+
return Promise.resolve();
|
|
82
|
+
}
|
|
83
|
+
destroy() {
|
|
84
|
+
return this.disconnect();
|
|
85
|
+
}
|
|
86
|
+
onConnect() {
|
|
87
|
+
if (!this.isApiConnected) {
|
|
88
|
+
console.log(`Connected to ${this.chainSlug} at ${this.apiUrl}`);
|
|
89
|
+
this.isApiReady = true;
|
|
90
|
+
if (this.isApiReadyOnce) {
|
|
91
|
+
this.isReadyHandler.resolve(this);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
this.updateConnectionStatus(_types._ChainConnectionStatus.CONNECTED);
|
|
95
|
+
}
|
|
96
|
+
onDisconnect() {
|
|
97
|
+
this.updateConnectionStatus(_types._ChainConnectionStatus.DISCONNECTED);
|
|
98
|
+
if (this.isApiConnected) {
|
|
99
|
+
console.warn(`Disconnected from ${this.chainSlug} of ${this.apiUrl}`);
|
|
100
|
+
this.isApiReady = false;
|
|
101
|
+
this.isReadyHandler = (0, _promise.createPromiseHandler)();
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.BitcoinApi = BitcoinApi;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.BitcoinChainHandler = void 0;
|
|
7
|
+
var _AbstractChainHandler = require("../AbstractChainHandler");
|
|
8
|
+
var _BitcoinApi = require("./BitcoinApi");
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
class BitcoinChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
13
|
+
apiMap = {};
|
|
14
|
+
|
|
15
|
+
// eslint-disable-next-line no-useless-constructor
|
|
16
|
+
constructor(parent) {
|
|
17
|
+
super(parent);
|
|
18
|
+
}
|
|
19
|
+
getApiMap() {
|
|
20
|
+
return this.apiMap;
|
|
21
|
+
}
|
|
22
|
+
getApiByChain(chain) {
|
|
23
|
+
return this.apiMap[chain];
|
|
24
|
+
}
|
|
25
|
+
setApi(chainSlug, api) {
|
|
26
|
+
this.apiMap[chainSlug] = api;
|
|
27
|
+
}
|
|
28
|
+
async initApi(chainSlug, apiUrl) {
|
|
29
|
+
let {
|
|
30
|
+
onUpdateStatus,
|
|
31
|
+
providerName
|
|
32
|
+
} = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
|
|
33
|
+
const existed = this.getApiByChain(chainSlug);
|
|
34
|
+
if (existed) {
|
|
35
|
+
existed.connect();
|
|
36
|
+
if (apiUrl !== existed.apiUrl) {
|
|
37
|
+
existed.updateApiUrl(apiUrl).catch(console.error);
|
|
38
|
+
}
|
|
39
|
+
return existed;
|
|
40
|
+
}
|
|
41
|
+
const apiObject = new _BitcoinApi.BitcoinApi(chainSlug, apiUrl, {
|
|
42
|
+
providerName
|
|
43
|
+
});
|
|
44
|
+
apiObject.connectionStatusSubject.subscribe(this.handleConnection.bind(this, chainSlug));
|
|
45
|
+
apiObject.connectionStatusSubject.subscribe(onUpdateStatus);
|
|
46
|
+
return Promise.resolve(apiObject);
|
|
47
|
+
}
|
|
48
|
+
async recoverApi(chainSlug) {
|
|
49
|
+
const existed = this.getApiByChain(chainSlug);
|
|
50
|
+
if (existed && !existed.isApiReadyOnce) {
|
|
51
|
+
console.log(`Reconnect ${existed.providerName || existed.chainSlug} at ${existed.apiUrl}`);
|
|
52
|
+
return existed.recoverConnect();
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
destroyApi(chain) {
|
|
56
|
+
const api = this.getApiByChain(chain);
|
|
57
|
+
api === null || api === void 0 ? void 0 : api.destroy().catch(console.error);
|
|
58
|
+
}
|
|
59
|
+
async sleep() {
|
|
60
|
+
this.isSleeping = true;
|
|
61
|
+
this.cancelAllRecover();
|
|
62
|
+
await Promise.all(Object.values(this.getApiMap()).map(evmApi => {
|
|
63
|
+
return evmApi.disconnect().catch(console.error);
|
|
64
|
+
}));
|
|
65
|
+
return Promise.resolve();
|
|
66
|
+
}
|
|
67
|
+
wakeUp() {
|
|
68
|
+
var _this$parent;
|
|
69
|
+
this.isSleeping = false;
|
|
70
|
+
const activeChains = ((_this$parent = this.parent) === null || _this$parent === void 0 ? void 0 : _this$parent.getActiveChains()) || [];
|
|
71
|
+
for (const chain of activeChains) {
|
|
72
|
+
const api = this.getApiByChain(chain);
|
|
73
|
+
api === null || api === void 0 ? void 0 : api.connect();
|
|
74
|
+
}
|
|
75
|
+
return Promise.resolve();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
exports.BitcoinChainHandler = BitcoinChainHandler;
|