@subwallet/extension-base 1.3.40-0 → 1.3.42-0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/background/KoniTypes.d.ts +121 -4
  2. package/background/KoniTypes.js +18 -0
  3. package/background/errors/BitcoinProviderError.d.ts +6 -0
  4. package/background/errors/BitcoinProviderError.js +47 -0
  5. package/cjs/background/KoniTypes.js +20 -1
  6. package/cjs/background/errors/BitcoinProviderError.js +54 -0
  7. package/cjs/constants/bitcoin.js +22 -0
  8. package/cjs/constants/environment.js +4 -2
  9. package/cjs/constants/index.js +16 -1
  10. package/cjs/core/logic-validation/recipientAddress.js +9 -0
  11. package/cjs/core/logic-validation/transfer.js +25 -5
  12. package/cjs/core/types.js +1 -0
  13. package/cjs/core/utils.js +15 -1
  14. package/cjs/koni/background/handlers/Extension.js +96 -41
  15. package/cjs/koni/background/handlers/State.js +52 -11
  16. package/cjs/packageInfo.js +1 -1
  17. package/cjs/services/balance-service/helpers/subscribe/bitcoin.js +94 -0
  18. package/cjs/services/balance-service/helpers/subscribe/evm.js +6 -1
  19. package/cjs/services/balance-service/helpers/subscribe/index.js +19 -7
  20. package/cjs/services/balance-service/index.js +32 -4
  21. package/cjs/services/balance-service/transfer/bitcoin-transfer.js +119 -0
  22. package/cjs/services/balance-service/transfer/token.js +2 -0
  23. package/cjs/services/balance-service/transfer/xcm/index.js +15 -9
  24. package/cjs/services/balance-service/transfer/xcm/utils.js +12 -14
  25. package/cjs/services/base/types.js +2 -0
  26. package/cjs/services/chain-service/constants.js +18 -6
  27. package/cjs/services/chain-service/handler/CardanoApi.js +25 -35
  28. package/cjs/services/chain-service/handler/bitcoin/BitcoinApi.js +105 -0
  29. package/cjs/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +78 -0
  30. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +371 -0
  31. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +19 -0
  32. package/cjs/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +368 -0
  33. package/cjs/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +302 -0
  34. package/cjs/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  35. package/cjs/services/chain-service/index.js +27 -3
  36. package/cjs/services/chain-service/utils/index.js +57 -4
  37. package/cjs/services/chain-service/utils/patch.js +1 -1
  38. package/cjs/services/earning-service/handlers/native-staking/tao.js +4 -38
  39. package/cjs/services/event-service/index.js +4 -0
  40. package/cjs/services/fee-service/service.js +8 -3
  41. package/cjs/services/hiro-service/index.js +96 -0
  42. package/cjs/services/hiro-service/utils/index.js +85 -0
  43. package/cjs/services/history-service/bitcoin-history.js +58 -0
  44. package/cjs/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  45. package/cjs/services/history-service/index.js +41 -3
  46. package/cjs/services/keyring-service/context/handlers/Derive.js +1 -1
  47. package/cjs/services/keyring-service/context/handlers/Migration.js +2 -2
  48. package/cjs/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  49. package/cjs/services/migration-service/scripts/MigrateNewUnifiedAccount.js +29 -0
  50. package/cjs/services/migration-service/scripts/index.js +3 -1
  51. package/cjs/services/request-service/handler/BitcoinRequestHandler.js +440 -0
  52. package/cjs/services/request-service/index.js +29 -3
  53. package/cjs/services/rune-service/index.js +105 -0
  54. package/cjs/services/swap-service/handler/chainflip-handler.js +29 -18
  55. package/cjs/services/swap-service/handler/kyber-handler.js +5 -9
  56. package/cjs/services/swap-service/handler/simpleswap-handler.js +4 -7
  57. package/cjs/services/swap-service/handler/uniswap-handler.js +5 -12
  58. package/cjs/services/swap-service/utils.js +46 -37
  59. package/cjs/services/transaction-service/helpers/index.js +7 -1
  60. package/cjs/services/transaction-service/index.js +136 -15
  61. package/cjs/services/transaction-service/utils.js +6 -3
  62. package/cjs/strategy/api-request-strategy/context/base.js +31 -0
  63. package/cjs/strategy/api-request-strategy/index.js +90 -0
  64. package/cjs/strategy/api-request-strategy/types.js +1 -0
  65. package/cjs/strategy/api-request-strategy/utils/index.js +33 -0
  66. package/cjs/types/account/info/keyring.js +1 -1
  67. package/cjs/types/bitcoin.js +24 -0
  68. package/cjs/types/environment.js +19 -0
  69. package/cjs/types/fee/bitcoin.js +1 -0
  70. package/cjs/types/fee/index.js +11 -0
  71. package/cjs/types/index.js +11 -0
  72. package/cjs/utils/account/analyze.js +3 -3
  73. package/cjs/utils/account/common.js +16 -6
  74. package/cjs/utils/account/derive/info/solo.js +68 -19
  75. package/cjs/utils/account/derive/info/unified.js +2 -0
  76. package/cjs/utils/account/derive/validate.js +70 -2
  77. package/cjs/utils/account/transform.js +11 -5
  78. package/cjs/utils/bitcoin/common.js +98 -0
  79. package/cjs/utils/bitcoin/fee.js +21 -0
  80. package/cjs/utils/bitcoin/index.js +38 -0
  81. package/cjs/utils/bitcoin/utxo-management.js +281 -0
  82. package/cjs/utils/environment.js +30 -2
  83. package/cjs/utils/fee/transfer.js +48 -0
  84. package/cjs/utils/index.js +15 -1
  85. package/constants/bitcoin.d.ts +3 -0
  86. package/constants/bitcoin.js +13 -0
  87. package/constants/environment.d.ts +1 -0
  88. package/constants/environment.js +2 -1
  89. package/constants/index.d.ts +2 -0
  90. package/constants/index.js +3 -1
  91. package/core/logic-validation/recipientAddress.js +10 -1
  92. package/core/logic-validation/transfer.d.ts +2 -2
  93. package/core/logic-validation/transfer.js +27 -7
  94. package/core/types.d.ts +1 -0
  95. package/core/types.js +1 -0
  96. package/core/utils.d.ts +1 -0
  97. package/core/utils.js +15 -2
  98. package/koni/background/handlers/Extension.d.ts +2 -0
  99. package/koni/background/handlers/Extension.js +95 -42
  100. package/koni/background/handlers/State.d.ts +7 -3
  101. package/koni/background/handlers/State.js +52 -12
  102. package/package.json +149 -8
  103. package/packageInfo.js +1 -1
  104. package/services/balance-service/helpers/subscribe/bitcoin.d.ts +2 -0
  105. package/services/balance-service/helpers/subscribe/bitcoin.js +87 -0
  106. package/services/balance-service/helpers/subscribe/evm.js +6 -1
  107. package/services/balance-service/helpers/subscribe/index.d.ts +2 -2
  108. package/services/balance-service/helpers/subscribe/index.js +20 -8
  109. package/services/balance-service/index.d.ts +2 -0
  110. package/services/balance-service/index.js +32 -4
  111. package/services/balance-service/transfer/bitcoin-transfer.d.ts +14 -0
  112. package/services/balance-service/transfer/bitcoin-transfer.js +112 -0
  113. package/services/balance-service/transfer/token.js +2 -0
  114. package/services/balance-service/transfer/xcm/index.js +15 -9
  115. package/services/balance-service/transfer/xcm/utils.d.ts +2 -0
  116. package/services/balance-service/transfer/xcm/utils.js +12 -14
  117. package/services/base/types.d.ts +2 -0
  118. package/services/base/types.js +2 -0
  119. package/services/chain-service/constants.d.ts +7 -0
  120. package/services/chain-service/constants.js +12 -5
  121. package/services/chain-service/handler/CardanoApi.d.ts +1 -5
  122. package/services/chain-service/handler/CardanoApi.js +26 -34
  123. package/services/chain-service/handler/bitcoin/BitcoinApi.d.ts +31 -0
  124. package/services/chain-service/handler/bitcoin/BitcoinApi.js +98 -0
  125. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.d.ts +16 -0
  126. package/services/chain-service/handler/bitcoin/BitcoinChainHandler.js +70 -0
  127. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.d.ts +28 -0
  128. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/blockstream-testnet-strategy.js +362 -0
  129. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.d.ts +2 -0
  130. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/index.js +5 -0
  131. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.d.ts +28 -0
  132. package/services/chain-service/handler/bitcoin/strategy/BlockStreamTestnet/mempool-testnet-strategy.js +359 -0
  133. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.d.ts +28 -0
  134. package/services/chain-service/handler/bitcoin/strategy/SubWalletMainnet/index.js +293 -0
  135. package/services/chain-service/handler/bitcoin/strategy/types.d.ts +291 -0
  136. package/services/chain-service/handler/bitcoin/strategy/types.js +1 -0
  137. package/services/chain-service/index.d.ts +3 -0
  138. package/services/chain-service/index.js +31 -5
  139. package/services/chain-service/types.d.ts +20 -0
  140. package/services/chain-service/utils/index.d.ts +4 -0
  141. package/services/chain-service/utils/index.js +50 -4
  142. package/services/chain-service/utils/patch.js +1 -1
  143. package/services/earning-service/handlers/native-staking/tao.d.ts +0 -11
  144. package/services/earning-service/handlers/native-staking/tao.js +4 -24
  145. package/services/event-service/index.d.ts +3 -0
  146. package/services/event-service/index.js +4 -0
  147. package/services/event-service/types.d.ts +3 -0
  148. package/services/fee-service/service.js +8 -3
  149. package/services/hiro-service/index.d.ts +17 -0
  150. package/services/hiro-service/index.js +88 -0
  151. package/services/hiro-service/utils/index.d.ts +6 -0
  152. package/services/hiro-service/utils/index.js +72 -0
  153. package/services/history-service/bitcoin-history.d.ts +4 -0
  154. package/services/history-service/bitcoin-history.js +52 -0
  155. package/services/history-service/helpers/recoverHistoryStatus.d.ts +3 -1
  156. package/services/history-service/helpers/recoverHistoryStatus.js +96 -4
  157. package/services/history-service/index.d.ts +1 -0
  158. package/services/history-service/index.js +42 -4
  159. package/services/keyring-service/context/handlers/Derive.js +2 -2
  160. package/services/keyring-service/context/handlers/Migration.js +2 -2
  161. package/services/keyring-service/context/handlers/Mnemonic.js +4 -3
  162. package/services/migration-service/scripts/MigrateNewUnifiedAccount.d.ts +4 -0
  163. package/services/migration-service/scripts/MigrateNewUnifiedAccount.js +21 -0
  164. package/services/migration-service/scripts/index.js +3 -1
  165. package/services/request-service/handler/BitcoinRequestHandler.d.ts +23 -0
  166. package/services/request-service/handler/BitcoinRequestHandler.js +427 -0
  167. package/services/request-service/index.d.ts +9 -2
  168. package/services/request-service/index.js +25 -3
  169. package/services/rune-service/index.d.ts +17 -0
  170. package/services/rune-service/index.js +97 -0
  171. package/services/swap-service/handler/chainflip-handler.d.ts +0 -2
  172. package/services/swap-service/handler/chainflip-handler.js +25 -13
  173. package/services/swap-service/handler/kyber-handler.d.ts +0 -1
  174. package/services/swap-service/handler/kyber-handler.js +5 -8
  175. package/services/swap-service/handler/simpleswap-handler.d.ts +0 -1
  176. package/services/swap-service/handler/simpleswap-handler.js +4 -6
  177. package/services/swap-service/handler/uniswap-handler.js +6 -13
  178. package/services/swap-service/utils.d.ts +0 -13
  179. package/services/swap-service/utils.js +46 -34
  180. package/services/transaction-service/helpers/index.d.ts +3 -1
  181. package/services/transaction-service/helpers/index.js +5 -0
  182. package/services/transaction-service/index.d.ts +3 -5
  183. package/services/transaction-service/index.js +135 -16
  184. package/services/transaction-service/types.d.ts +12 -2
  185. package/services/transaction-service/utils.js +7 -4
  186. package/strategy/api-request-strategy/context/base.d.ts +15 -0
  187. package/strategy/api-request-strategy/context/base.js +24 -0
  188. package/strategy/api-request-strategy/index.d.ts +15 -0
  189. package/strategy/api-request-strategy/index.js +83 -0
  190. package/strategy/api-request-strategy/types.d.ts +22 -0
  191. package/strategy/api-request-strategy/types.js +1 -0
  192. package/strategy/api-request-strategy/utils/index.d.ts +2 -0
  193. package/strategy/api-request-strategy/utils/index.js +23 -0
  194. package/types/account/info/keyring.d.ts +1 -1
  195. package/types/account/info/keyring.js +1 -1
  196. package/types/balance/index.d.ts +4 -1
  197. package/types/balance/transfer.d.ts +17 -0
  198. package/types/bitcoin.d.ts +93 -0
  199. package/types/bitcoin.js +17 -0
  200. package/types/environment.d.ts +9 -0
  201. package/types/environment.js +13 -0
  202. package/types/fee/base.d.ts +4 -1
  203. package/types/fee/bitcoin.d.ts +18 -0
  204. package/types/fee/bitcoin.js +1 -0
  205. package/types/fee/index.d.ts +1 -0
  206. package/types/fee/index.js +2 -1
  207. package/types/fee/subscription.d.ts +4 -3
  208. package/types/index.d.ts +1 -0
  209. package/types/index.js +1 -0
  210. package/utils/account/analyze.js +4 -4
  211. package/utils/account/common.d.ts +7 -8
  212. package/utils/account/common.js +16 -6
  213. package/utils/account/derive/info/solo.js +70 -21
  214. package/utils/account/derive/info/unified.js +2 -0
  215. package/utils/account/derive/validate.d.ts +1 -0
  216. package/utils/account/derive/validate.js +68 -1
  217. package/utils/account/transform.d.ts +1 -1
  218. package/utils/account/transform.js +11 -5
  219. package/utils/bitcoin/common.d.ts +22 -0
  220. package/utils/bitcoin/common.js +88 -0
  221. package/utils/bitcoin/fee.d.ts +2 -0
  222. package/utils/bitcoin/fee.js +14 -0
  223. package/utils/bitcoin/index.d.ts +3 -0
  224. package/utils/bitcoin/index.js +6 -0
  225. package/utils/bitcoin/utxo-management.d.ts +33 -0
  226. package/utils/bitcoin/utxo-management.js +266 -0
  227. package/utils/environment.d.ts +2 -0
  228. package/utils/environment.js +27 -1
  229. package/utils/fee/transfer.d.ts +3 -1
  230. package/utils/fee/transfer.js +47 -1
  231. package/utils/index.d.ts +1 -0
  232. package/utils/index.js +6 -3
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.getSizeInfo = getSizeInfo;
8
+ exports.getSpendableAmount = getSpendableAmount;
9
+ exports.getTransferableBitcoinUtxos = void 0;
10
+ var _utils = require("@subwallet/extension-base/utils");
11
+ var _types = require("@subwallet/keyring/types");
12
+ var _utils2 = require("@subwallet/keyring/utils");
13
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
14
+ // Copyright 2019-2022 @subwallet/extension-base
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ // Source: https://github.com/leather-wallet/extension/blob/dev/src/app/common/transactions/bitcoin/utils.ts
18
+ function getSizeInfo(payload) {
19
+ const {
20
+ inputLength,
21
+ recipients,
22
+ sender
23
+ } = payload;
24
+ const senderInfo = (0, _utils2.validateBitcoinAddress)(sender) ? (0, _utils2.getBitcoinAddressInfo)(sender) : null;
25
+ const inputAddressTypeWithFallback = senderInfo ? senderInfo.type : _types.BitcoinAddressType.p2wpkh;
26
+ const outputMap = {};
27
+ for (const recipient of recipients) {
28
+ const recipientInfo = (0, _utils2.validateBitcoinAddress)(recipient) ? (0, _utils2.getBitcoinAddressInfo)(recipient) : null;
29
+ const outputAddressTypeWithFallback = recipientInfo ? recipientInfo.type : _types.BitcoinAddressType.p2wpkh;
30
+ const outputKey = outputAddressTypeWithFallback + '_output_count';
31
+ if (outputMap[outputKey]) {
32
+ outputMap[outputKey]++;
33
+ } else {
34
+ outputMap[outputKey] = 1;
35
+ }
36
+ }
37
+ const txSizer = new _utils2.BtcSizeFeeEstimator();
38
+ return txSizer.calcTxSize({
39
+ input_script: inputAddressTypeWithFallback,
40
+ input_count: inputLength,
41
+ ...outputMap
42
+ });
43
+ }
44
+
45
+ // https://github.com/leather-wallet/extension/blob/dev/src/app/common/transactions/bitcoin/utils.ts
46
+ function getSpendableAmount(_ref) {
47
+ let {
48
+ feeRate,
49
+ recipients,
50
+ sender,
51
+ utxos
52
+ } = _ref;
53
+ const balance = utxos.map(utxo => utxo.value).reduce((prevVal, curVal) => prevVal + curVal, 0);
54
+ const size = getSizeInfo({
55
+ inputLength: utxos.length,
56
+ recipients,
57
+ sender
58
+ });
59
+ const fee = Math.ceil(size.txVBytes * feeRate);
60
+ const bigNumberBalance = new _bignumber.default(balance);
61
+ return {
62
+ spendableAmount: _bignumber.default.max(0, bigNumberBalance.minus(fee)),
63
+ fee
64
+ };
65
+ }
66
+ const getTransferableBitcoinUtxos = async (bitcoinApi, address) => {
67
+ try {
68
+ const [utxos, runeTxsUtxos, inscriptionUtxos] = await Promise.all([bitcoinApi.api.getUtxos(address).catch(error => {
69
+ console.log('Error fetching UTXOs:', error);
70
+ return [];
71
+ }), (0, _utils.getRuneUtxos)(bitcoinApi, address).catch(error => {
72
+ console.log('Error fetching Rune UTXOs:', error);
73
+ return [];
74
+ }), (0, _utils.getInscriptionUtxos)(bitcoinApi, address).catch(error => {
75
+ console.log('Error fetching Inscription UTXOs:', error);
76
+ return [];
77
+ })]);
78
+ let filteredUtxos;
79
+ if (!utxos || !utxos.length) {
80
+ return [];
81
+ }
82
+
83
+ // filter out pending utxos
84
+ // filteredUtxos = filterOutPendingTxsUtxos(utxos);
85
+
86
+ // filter out rune utxos
87
+ filteredUtxos = (0, _utils.filteredOutTxsUtxos)(utxos, runeTxsUtxos);
88
+
89
+ // filter out dust utxos
90
+ // filter out inscription utxos
91
+ filteredUtxos = (0, _utils.filteredOutTxsUtxos)(utxos, inscriptionUtxos);
92
+ return filteredUtxos;
93
+ } catch (error) {
94
+ console.log('Error while fetching Bitcoin balances', error);
95
+ return [];
96
+ }
97
+ };
98
+ exports.getTransferableBitcoinUtxos = getTransferableBitcoinUtxos;
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.combineBitcoinFee = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-base
8
+ // SPDX-License-Identifier: Apache-2.0
9
+
10
+ const combineBitcoinFee = (feeInfo, feeOptions, feeCustom) => {
11
+ if (feeOptions && feeOptions !== 'custom') {
12
+ var _feeInfo$options;
13
+ return (_feeInfo$options = feeInfo.options) === null || _feeInfo$options === void 0 ? void 0 : _feeInfo$options[feeOptions];
14
+ } else if (feeOptions === 'custom' && feeCustom) {
15
+ return feeCustom;
16
+ } else {
17
+ var _feeInfo$options2;
18
+ return (_feeInfo$options2 = feeInfo.options) === null || _feeInfo$options2 === void 0 ? void 0 : _feeInfo$options2[feeInfo.options.default];
19
+ }
20
+ };
21
+ exports.combineBitcoinFee = combineBitcoinFee;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _common = require("./common");
7
+ Object.keys(_common).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _common[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _common[key];
14
+ }
15
+ });
16
+ });
17
+ var _fee = require("./fee");
18
+ Object.keys(_fee).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _fee[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _fee[key];
25
+ }
26
+ });
27
+ });
28
+ var _utxoManagement = require("./utxo-management");
29
+ Object.keys(_utxoManagement).forEach(function (key) {
30
+ if (key === "default" || key === "__esModule") return;
31
+ if (key in exports && exports[key] === _utxoManagement[key]) return;
32
+ Object.defineProperty(exports, key, {
33
+ enumerable: true,
34
+ get: function () {
35
+ return _utxoManagement[key];
36
+ }
37
+ });
38
+ });
@@ -0,0 +1,281 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.determineUtxosForSpend = determineUtxosForSpend;
8
+ exports.determineUtxosForSpendAll = determineUtxosForSpendAll;
9
+ exports.filterOutPendingTxsUtxos = filterOutPendingTxsUtxos;
10
+ exports.filterUneconomicalUtxos = filterUneconomicalUtxos;
11
+ exports.filteredOutTxsUtxos = filteredOutTxsUtxos;
12
+ exports.getInscriptionUtxos = getInscriptionUtxos;
13
+ exports.getRuneUtxos = getRuneUtxos;
14
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
15
+ var _constants = require("@subwallet/extension-base/constants");
16
+ var _types = require("@subwallet/extension-base/types");
17
+ var _utils = require("@subwallet/extension-base/utils");
18
+ var _types2 = require("@subwallet/keyring/types");
19
+ var _utils2 = require("@subwallet/keyring/utils");
20
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
21
+ var _common = require("./common");
22
+ // Copyright 2019-2022 @subwallet/extension-base
23
+ // SPDX-License-Identifier: Apache-2.0
24
+
25
+ // https://github.com/leather-wallet/extension/blob/dev/src/app/common/transactions/bitcoin/utils.ts
26
+ // Check if the spendable amount drops when adding a utxo. If it drops, don't use that utxo.
27
+ // Method might be not particularly efficient as it would
28
+ // go through the utxo array multiple times, but it's reliable.
29
+ function filterUneconomicalUtxos(_ref) {
30
+ let {
31
+ feeRate,
32
+ recipients,
33
+ sender,
34
+ utxos
35
+ } = _ref;
36
+ const addressInfo = (0, _utils2.validateBitcoinAddress)(sender) ? (0, _utils2.getBitcoinAddressInfo)(sender) : null;
37
+ const inputAddressTypeWithFallback = addressInfo ? addressInfo.type : _types2.BitcoinAddressType.p2wpkh;
38
+ const filteredAndSortUtxos = utxos.filter(utxo => utxo.value >= _constants.BTC_DUST_AMOUNT[inputAddressTypeWithFallback]).sort((a, b) => a.value - b.value); // ascending order
39
+
40
+ return filteredAndSortUtxos.reduce((utxos, utxo, currentIndex) => {
41
+ const utxosWithout = utxos.filter(u => u.txid !== utxo.txid);
42
+ const {
43
+ spendableAmount: spendableAmountWithout
44
+ } = (0, _common.getSpendableAmount)({
45
+ utxos: utxosWithout,
46
+ feeRate,
47
+ recipients,
48
+ sender
49
+ });
50
+ const {
51
+ spendableAmount
52
+ } = (0, _common.getSpendableAmount)({
53
+ utxos,
54
+ feeRate,
55
+ recipients,
56
+ sender
57
+ });
58
+
59
+ // console.log(utxosWithout, feeWithout, spendableAmountWithout.toString());
60
+ // console.log(utxos, fee, spendableAmount.toString());
61
+
62
+ if (spendableAmount.lte(0)) {
63
+ return utxosWithout;
64
+ } else {
65
+ // if spendable amount becomes bigger, do not use that utxo
66
+ return spendableAmountWithout.gt(spendableAmount) ? utxosWithout : utxos;
67
+ }
68
+ }, [...filteredAndSortUtxos]).reverse();
69
+ }
70
+
71
+ // https://github.com/leather-wallet/extension/blob/dev/src/app/common/transactions/bitcoin/coinselect/local-coin-selection.ts
72
+ function determineUtxosForSpendAll(_ref2) {
73
+ let {
74
+ feeRate,
75
+ recipient,
76
+ sender,
77
+ utxos
78
+ } = _ref2;
79
+ if (!(0, _utils2.validateBitcoinAddress)(recipient)) {
80
+ throw new Error('Cannot calculate spend of invalid address type');
81
+ }
82
+ const recipientAddressInfo = (0, _utils2.getBitcoinAddressInfo)(recipient);
83
+ const recipientDustLimit = _constants.BTC_DUST_AMOUNT[recipientAddressInfo.type] || 546;
84
+ const recipients = [recipient];
85
+ const filteredUtxos = filterUneconomicalUtxos({
86
+ utxos,
87
+ feeRate,
88
+ recipients,
89
+ sender
90
+ });
91
+ const sizeInfo = (0, _common.getSizeInfo)({
92
+ sender,
93
+ inputLength: filteredUtxos.length,
94
+ recipients
95
+ });
96
+ const amount = filteredUtxos.reduce((acc, utxo) => acc + utxo.value, 0) - Math.ceil(sizeInfo.txVBytes * feeRate);
97
+ if (amount <= 0) {
98
+ throw new _types.InsufficientFundsError();
99
+ }
100
+ if (amount < recipientDustLimit) {
101
+ const atLeastStr = (0, _utils.formatNumber)(recipientDustLimit, 8, _utils.balanceFormatter, {
102
+ maxNumberFormat: 8,
103
+ minNumberFormat: 8
104
+ });
105
+ throw new _TransactionError.TransactionError(_types.TransferTxErrorType.NOT_ENOUGH_VALUE, `You must transfer at least ${atLeastStr} BTC`);
106
+ }
107
+
108
+ // Fee has already been deducted from the amount with send all
109
+ const outputs = [{
110
+ value: amount,
111
+ address: recipient
112
+ }];
113
+ const fee = Math.ceil(sizeInfo.txVBytes * feeRate);
114
+ return {
115
+ inputs: filteredUtxos,
116
+ outputs,
117
+ size: sizeInfo.txVBytes,
118
+ fee,
119
+ isCustomFeeRate: false
120
+ };
121
+ }
122
+
123
+ // https://github.com/leather-wallet/extension/blob/dev/src/app/common/transactions/bitcoin/coinselect/local-coin-selection.ts
124
+ function determineUtxosForSpend(_ref3) {
125
+ let {
126
+ amount,
127
+ feeRate,
128
+ recipient,
129
+ sender,
130
+ utxos
131
+ } = _ref3;
132
+ if (!(0, _utils2.validateBitcoinAddress)(recipient)) {
133
+ throw new Error('Cannot calculate spend of invalid address type');
134
+ }
135
+ const recipientAddressInfo = (0, _utils2.getBitcoinAddressInfo)(recipient);
136
+ const recipientDustLimit = _constants.BTC_DUST_AMOUNT[recipientAddressInfo.type] || 546;
137
+ if (amount < recipientDustLimit) {
138
+ const atLeastStr = (0, _utils.formatNumber)(recipientDustLimit, 8, _utils.balanceFormatter, {
139
+ maxNumberFormat: 8,
140
+ minNumberFormat: 8
141
+ });
142
+ throw new _TransactionError.TransactionError(_types.TransferTxErrorType.NOT_ENOUGH_VALUE, `You must transfer at least ${atLeastStr} BTC`);
143
+ }
144
+ const orderedUtxos = utxos.sort((a, b) => b.value - a.value);
145
+ const recipients = [recipient, sender];
146
+ const filteredUtxos = filterUneconomicalUtxos({
147
+ utxos: orderedUtxos,
148
+ feeRate,
149
+ recipients,
150
+ sender
151
+ });
152
+ const neededUtxos = [];
153
+ let sum = new _bignumber.default(0);
154
+ let sizeInfo = null;
155
+ for (const utxo of filteredUtxos) {
156
+ sizeInfo = (0, _common.getSizeInfo)({
157
+ inputLength: neededUtxos.length,
158
+ sender,
159
+ recipients
160
+ });
161
+ const currentValue = new _bignumber.default(amount).plus(Math.ceil(sizeInfo.txVBytes * feeRate));
162
+ if (sum.gte(currentValue)) {
163
+ break;
164
+ }
165
+ sum = sum.plus(utxo.value);
166
+ neededUtxos.push(utxo);
167
+
168
+ // re calculate size info, some case array end
169
+ sizeInfo = (0, _common.getSizeInfo)({
170
+ inputLength: neededUtxos.length,
171
+ sender,
172
+ recipients
173
+ });
174
+ }
175
+ if (!sizeInfo) {
176
+ throw new _types.InsufficientFundsError();
177
+ }
178
+ const fee = Math.ceil(sizeInfo.txVBytes * feeRate);
179
+ const amountLeft = sum.minus(amount).minus(fee);
180
+ if (amountLeft.lte(0)) {
181
+ throw new _types.InsufficientFundsError();
182
+ }
183
+ const senderAddressInfo = (0, _utils2.getBitcoinAddressInfo)(sender);
184
+ const dustLimit = _constants.BTC_DUST_AMOUNT[senderAddressInfo.type] || 546;
185
+ const outputs = [
186
+ // outputs[0] = the desired amount going to recipient
187
+ {
188
+ value: amount,
189
+ address: recipient
190
+ }];
191
+ if (amountLeft.gte(dustLimit)) {
192
+ // outputs[1] = the remainder to be returned to a change address
193
+ outputs.push({
194
+ value: amountLeft.toNumber(),
195
+ address: sender
196
+ });
197
+ } else {
198
+ // Todo: This solution for improve later, current throw error
199
+ // // Increase the fee to use the remaining balance
200
+ console.warn(`Change output of ${amountLeft.toString()} satoshis is below dust limit (${dustLimit} satoshis for ${senderAddressInfo.type}). Omitting change output.`);
201
+ //
202
+ sizeInfo = (0, _common.getSizeInfo)({
203
+ inputLength: neededUtxos.length,
204
+ sender,
205
+ recipients: recipients.slice(0, 1)
206
+ });
207
+ const newFee = sum.minus(amount).toNumber();
208
+ return {
209
+ filteredUtxos,
210
+ inputs: neededUtxos,
211
+ outputs,
212
+ size: sizeInfo.txVBytes,
213
+ fee: newFee,
214
+ isCustomFeeRate: true
215
+ };
216
+ }
217
+ return {
218
+ filteredUtxos,
219
+ inputs: neededUtxos,
220
+ outputs,
221
+ size: sizeInfo.txVBytes,
222
+ fee,
223
+ isCustomFeeRate: false
224
+ };
225
+ }
226
+ function filterOutPendingTxsUtxos(utxos) {
227
+ return utxos.filter(utxo => utxo.status.confirmed);
228
+ }
229
+ function filteredOutTxsUtxos(allTxsUtxos, filteredOutTxsUtxos) {
230
+ if (!filteredOutTxsUtxos.length) {
231
+ return allTxsUtxos;
232
+ }
233
+ const listFilterOut = filteredOutTxsUtxos.map(utxo => {
234
+ return `${utxo.txid}:${utxo.vout}`;
235
+ });
236
+ return allTxsUtxos.filter(element => !listFilterOut.includes(`${element.txid}:${element.vout}`));
237
+ }
238
+ async function getRuneUtxos(bitcoinApi, address) {
239
+ const responseRuneUtxos = await bitcoinApi.api.getRuneUtxos(address);
240
+ const runeUtxos = [];
241
+ responseRuneUtxos.forEach(responseRuneUtxo => {
242
+ const txid = responseRuneUtxo.txid;
243
+ const vout = responseRuneUtxo.vout;
244
+ const utxoValue = responseRuneUtxo.satoshi;
245
+ if (txid && vout && utxoValue) {
246
+ const item = {
247
+ txid,
248
+ vout,
249
+ status: {
250
+ confirmed: true // not use in filter out rune utxos
251
+ },
252
+
253
+ value: utxoValue
254
+ };
255
+ runeUtxos.push(item);
256
+ }
257
+ });
258
+ return runeUtxos;
259
+ }
260
+ async function getInscriptionUtxos(bitcoinApi, address) {
261
+ try {
262
+ const inscriptions = await bitcoinApi.api.getAddressInscriptions(address);
263
+ return inscriptions.map(inscription => {
264
+ const [txid, vout] = inscription.output.split(':');
265
+ return {
266
+ txid,
267
+ vout: parseInt(vout),
268
+ status: {
269
+ confirmed: true,
270
+ // not use in filter out inscription utxos
271
+ block_height: inscription.genesis_block_height,
272
+ block_hash: inscription.genesis_block_hash,
273
+ block_time: inscription.genesis_timestamp
274
+ },
275
+ value: parseInt(inscription.value)
276
+ };
277
+ });
278
+ } catch (e) {
279
+ return [];
280
+ }
281
+ }
@@ -4,10 +4,13 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.targetIsWeb = exports.targetIsMobile = exports.targetIsExtension = exports.platformType = exports.platformModel = exports.osVersion = exports.osName = exports.isMobile = exports.isFirefox = exports.isBrave = exports.browserVersion = exports.browserName = exports.TARGET_ENV = exports.RuntimeInfo = exports.MODULE_SUPPORT = exports.BowserParser = void 0;
7
+ exports.browserVersion = exports.browserName = exports.TARGET_ENV = exports.RuntimeInfo = exports.MODULE_SUPPORT = exports.BowserParser = void 0;
8
+ exports.fetchFromProxyService = fetchFromProxyService;
9
+ exports.targetIsWeb = exports.targetIsMobile = exports.targetIsExtension = exports.platformType = exports.platformModel = exports.osVersion = exports.osName = exports.isMobile = exports.isFirefox = exports.isBrave = void 0;
8
10
  var _mv = require("@subwallet/extension-base/utils/mv3");
9
11
  var _bowser = _interopRequireDefault(require("bowser"));
10
12
  var _KoniTypes = require("../background/KoniTypes");
13
+ var _constants = require("../constants");
11
14
  var _navigator3;
12
15
  function detectRuntimeEnvironment() {
13
16
  if (_mv.isSupportWindow && typeof document !== 'undefined') {
@@ -104,4 +107,29 @@ exports.targetIsMobile = targetIsMobile;
104
107
  const MODULE_SUPPORT = {
105
108
  MANTA_ZK: false
106
109
  };
107
- exports.MODULE_SUPPORT = MODULE_SUPPORT;
110
+ exports.MODULE_SUPPORT = MODULE_SUPPORT;
111
+ var HEADERS;
112
+ (function (HEADERS) {
113
+ HEADERS["PLATFORM"] = "Platform";
114
+ })(HEADERS || (HEADERS = {}));
115
+ function formatExternalServiceApi(url, isTestnet) {
116
+ if (isTestnet === true) {
117
+ return `${url}/testnet`;
118
+ }
119
+ if (isTestnet === false) {
120
+ return `${url}/mainnet`;
121
+ }
122
+ return url;
123
+ }
124
+ async function fetchFromProxyService(service, path, options, isTestnet) {
125
+ const baseUrl = formatExternalServiceApi(`${_constants.SW_EXTERNAL_SERVICES_API}${service}`, isTestnet);
126
+ const url = `${baseUrl}${path}`;
127
+ const headers = {
128
+ [HEADERS.PLATFORM]: TARGET_ENV,
129
+ ...(options.headers || {})
130
+ };
131
+ return fetch(url, {
132
+ ...options,
133
+ headers
134
+ });
135
+ }
@@ -8,6 +8,7 @@ exports.detectTransferTxType = exports.calculateXcmMaxTransferable = exports.cal
8
8
  var _constants = require("@subwallet/extension-base/constants");
9
9
  var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
10
10
  var _consts = require("@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/consts");
11
+ var _bitcoinTransfer = require("@subwallet/extension-base/services/balance-service/transfer/bitcoin-transfer");
11
12
  var _cardanoTransfer = require("@subwallet/extension-base/services/balance-service/transfer/cardano-transfer");
12
13
  var _smartContract = require("@subwallet/extension-base/services/balance-service/transfer/smart-contract");
13
14
  var _token = require("@subwallet/extension-base/services/balance-service/transfer/token");
@@ -24,10 +25,14 @@ var _tokenPayFee = require("@subwallet/extension-base/services/fee-service/utils
24
25
  var _helpers = require("@subwallet/extension-base/services/transaction-service/helpers");
25
26
  var _utils4 = require("@subwallet/extension-base/utils");
26
27
  var _keyring = require("@subwallet/keyring");
28
+ var _validate = require("@subwallet/keyring/utils/address/validate");
27
29
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
30
+ var bitcoin = _interopRequireWildcard(require("bitcoinjs-lib"));
28
31
  var _util = require("@polkadot/util");
29
32
  var _utilCrypto = require("@polkadot/util-crypto");
30
33
  var _combine = require("./combine");
34
+ 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); }
35
+ 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; }
31
36
  // Copyright 2019-2022 @subwallet/extension-base
32
37
  // SPDX-License-Identifier: Apache-2.0
33
38
 
@@ -47,6 +52,8 @@ const detectTransferTxType = (srcToken, srcChain, destChain) => {
47
52
  return 'ton';
48
53
  } else if ((0, _utils2._isChainCardanoCompatible)(srcChain) && (0, _utils2._isTokenTransferredByCardano)(srcToken)) {
49
54
  return 'cardano';
55
+ } else if ((0, _utils2._isChainBitcoinCompatible)(srcChain) && (0, _utils2._isTokenTransferredByBitcoin)(srcToken)) {
56
+ return 'bitcoin';
50
57
  } else {
51
58
  return 'substrate';
52
59
  }
@@ -78,6 +85,7 @@ exports.calculateMaxTransferable = calculateMaxTransferable;
78
85
  const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) => {
79
86
  const {
80
87
  address,
88
+ bitcoinApi,
81
89
  cardanoApi,
82
90
  destChain,
83
91
  evmApi,
@@ -89,6 +97,7 @@ const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) =
89
97
  srcChain,
90
98
  srcToken,
91
99
  substrateApi,
100
+ to,
92
101
  tonApi,
93
102
  value
94
103
  } = request;
@@ -158,6 +167,18 @@ const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) =
158
167
  cardanoApi,
159
168
  nativeTokenInfo: nativeToken
160
169
  });
170
+ } else if ((0, _validate.isBitcoinAddress)(address) && (0, _utils2._isTokenTransferredByBitcoin)(srcToken)) {
171
+ const network = srcChain.isTestnet ? bitcoin.networks.testnet : bitcoin.networks.bitcoin;
172
+ [transaction] = await (0, _bitcoinTransfer.createBitcoinTransaction)({
173
+ chain: srcChain.slug,
174
+ from: address,
175
+ to: to || address,
176
+ value,
177
+ feeInfo: fee,
178
+ transferAll: false,
179
+ bitcoinApi,
180
+ network: network
181
+ });
161
182
  } else {
162
183
  [transaction] = await (0, _token.createSubstrateExtrinsic)({
163
184
  transferAll: false,
@@ -203,6 +224,15 @@ const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) =
203
224
  ...fee,
204
225
  estimatedFee
205
226
  };
227
+ } else if (feeChainType === 'bitcoin') {
228
+ // Calculate fee for bitcoin transaction
229
+ // TODO: Support maxTransferable for bitcoin
230
+ estimatedFee = '0';
231
+ feeOptions = {
232
+ ...fee,
233
+ vSize: 0,
234
+ estimatedFee
235
+ };
206
236
  } else {
207
237
  if (transaction) {
208
238
  if ((0, _helpers.isTonTransaction)(transaction)) {
@@ -242,6 +272,12 @@ const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) =
242
272
  estimatedFee,
243
273
  gasLimit: '0'
244
274
  };
275
+ } else if (fee.type === 'bitcoin') {
276
+ feeOptions = {
277
+ ...fee,
278
+ estimatedFee,
279
+ vSize: 0
280
+ };
245
281
  } else {
246
282
  feeOptions = {
247
283
  ...fee,
@@ -405,6 +441,12 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
405
441
  ...fee,
406
442
  estimatedFee
407
443
  };
444
+ } else if (feeChainType === 'bitcoin') {
445
+ feeOptions = {
446
+ ...fee,
447
+ estimatedFee,
448
+ vSize: 0
449
+ };
408
450
  } else {
409
451
  // Not implemented yet
410
452
  estimatedFee = '0';
@@ -421,6 +463,12 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
421
463
  estimatedFee,
422
464
  gasLimit: '0'
423
465
  };
466
+ } else if (fee.type === 'bitcoin') {
467
+ feeOptions = {
468
+ ...fee,
469
+ estimatedFee,
470
+ vSize: 0
471
+ };
424
472
  } else {
425
473
  feeOptions = {
426
474
  ...fee,
@@ -74,6 +74,7 @@ var _config = require("@subwallet/extension-base/koni/api/nft/config");
74
74
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
75
75
  var _account = require("@subwallet/extension-base/utils/account");
76
76
  var _keyring = require("@subwallet/keyring");
77
+ var _validate = require("@subwallet/keyring/utils/address/validate");
77
78
  var _i18next = require("i18next");
78
79
  var _util = require("@polkadot/util");
79
80
  var _utilCrypto = require("@polkadot/util-crypto");
@@ -330,6 +331,18 @@ Object.keys(_translate).forEach(function (key) {
330
331
  }
331
332
  });
332
333
  });
334
+ var _bitcoin = require("./bitcoin");
335
+ Object.keys(_bitcoin).forEach(function (key) {
336
+ if (key === "default" || key === "__esModule") return;
337
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
338
+ if (key in exports && exports[key] === _bitcoin[key]) return;
339
+ Object.defineProperty(exports, key, {
340
+ enumerable: true,
341
+ get: function () {
342
+ return _bitcoin[key];
343
+ }
344
+ });
345
+ });
333
346
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
334
347
  // SPDX-License-Identifier: Apache-2.0
335
348
 
@@ -590,7 +603,8 @@ function isAddressAndChainCompatible(address, chain) {
590
603
  const isTonCompatible = (0, _keyring.isTonAddress)(address) && (0, _utils._isChainTonCompatible)(chain);
591
604
  const isSubstrateCompatible = !(0, _utilCrypto.isEthereumAddress)(address) && !(0, _keyring.isTonAddress)(address) && (0, _utils._isChainSubstrateCompatible)(chain); // todo: need isSubstrateAddress util function to check exactly
592
605
  const isCardanoCompatible = (0, _keyring.isCardanoAddress)(address) && (0, _utils._isChainCardanoCompatible)(chain);
593
- return isEvmCompatible || isSubstrateCompatible || isTonCompatible || isCardanoCompatible;
606
+ const isBitcoinCompatible = (0, _validate.isBitcoinAddress)(address) && (0, _utils._isChainBitcoinCompatible)(chain);
607
+ return isEvmCompatible || isSubstrateCompatible || isTonCompatible || isCardanoCompatible || isBitcoinCompatible;
594
608
  }
595
609
  function getDomainFromUrl(url) {
596
610
  return url.replace(/^(https?:\/\/)?(www\.)?/, '').split('/')[0];
@@ -0,0 +1,3 @@
1
+ import { BitcoinAddressType } from '@subwallet/keyring/types';
2
+ export declare const BTC_DUST_AMOUNT: Record<BitcoinAddressType, number>;
3
+ export declare const BITCOIN_DECIMAL = 8;
@@ -0,0 +1,13 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ // https://bitcoin.stackexchange.com/a/41082/139277
5
+ import { BitcoinAddressType } from '@subwallet/keyring/types';
6
+ export const BTC_DUST_AMOUNT = {
7
+ [BitcoinAddressType.p2pkh]: 546,
8
+ [BitcoinAddressType.p2sh]: 540,
9
+ [BitcoinAddressType.p2tr]: 330,
10
+ [BitcoinAddressType.p2wpkh]: 294,
11
+ [BitcoinAddressType.p2wsh]: 330
12
+ };
13
+ export const BITCOIN_DECIMAL = 8;
@@ -1,3 +1,4 @@
1
1
  export declare const isProductionMode: boolean;
2
2
  export declare const BACKEND_API_URL: string;
3
3
  export declare const BACKEND_PRICE_HISTORY_URL: string;
4
+ export declare const SW_EXTERNAL_SERVICES_API: string;
@@ -5,4 +5,5 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
5
5
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
6
6
  export const isProductionMode = PRODUCTION_BRANCHES.indexOf(branchName) > -1;
7
7
  export const BACKEND_API_URL = process.env.SUBWALLET_API || (isProductionMode ? 'https://sw-services.subwallet.app/api' : 'https://be-dev.subwallet.app/api');
8
- export const BACKEND_PRICE_HISTORY_URL = process.env.SUBWALLET_PRICE_HISTORY_API || (isProductionMode ? 'https://price-history.subwallet.app/api' : 'https://price-history-dev.subwallet.app/api');
8
+ export const BACKEND_PRICE_HISTORY_URL = process.env.SUBWALLET_PRICE_HISTORY_API || (isProductionMode ? 'https://price-history.subwallet.app/api' : 'https://price-history-dev.subwallet.app/api');
9
+ export const SW_EXTERNAL_SERVICES_API = process.env.SW_EXTERNAL_SERVICES_API || (isProductionMode ? 'https://external-services.subwallet.app' : 'https://external-services-dev.subwallet.app');