@subwallet/extension-base 1.3.63-0 → 1.3.65-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 (58) hide show
  1. package/cjs/koni/api/staking/bonding/utils.js +6 -0
  2. package/cjs/koni/background/handlers/State.js +1 -0
  3. package/cjs/packageInfo.js +1 -1
  4. package/cjs/services/balance-service/index.js +158 -16
  5. package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +50 -4
  6. package/cjs/services/balance-service/transfer/xcm/index.js +7 -2
  7. package/cjs/services/chain-online-service/index.js +0 -3
  8. package/cjs/services/chain-service/index.js +6 -1
  9. package/cjs/services/chain-service/utils/patch.js +1 -1
  10. package/cjs/services/earning-service/constants/chains.js +0 -2
  11. package/cjs/services/earning-service/handlers/lending/interlay.js +1 -0
  12. package/cjs/services/earning-service/handlers/liquid-staking/acala.js +1 -1
  13. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  14. package/cjs/services/earning-service/handlers/liquid-staking/parallel.js +1 -0
  15. package/cjs/services/earning-service/handlers/native-staking/energy.js +60 -6
  16. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +1 -4
  17. package/cjs/services/earning-service/handlers/native-staking/tanssi.js +65 -9
  18. package/cjs/services/migration-service/scripts/DeleteEarningData20251105.js +21 -0
  19. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js +51 -0
  20. package/cjs/services/migration-service/scripts/OptimizeEnableToken.js +19 -0
  21. package/cjs/services/migration-service/scripts/databases/MigrateAssetSetting20251027.js +37 -0
  22. package/cjs/services/migration-service/scripts/index.js +9 -1
  23. package/cjs/utils/fee/transfer.js +1 -5
  24. package/koni/api/staking/bonding/utils.d.ts +1 -0
  25. package/koni/api/staking/bonding/utils.js +5 -0
  26. package/koni/background/handlers/State.js +1 -0
  27. package/package.json +27 -7
  28. package/packageInfo.js +1 -1
  29. package/services/balance-service/index.d.ts +8 -0
  30. package/services/balance-service/index.js +158 -17
  31. package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +2 -0
  32. package/services/balance-service/transfer/xcm/acrossBridge/index.js +47 -2
  33. package/services/balance-service/transfer/xcm/index.js +7 -2
  34. package/services/chain-online-service/index.js +0 -3
  35. package/services/chain-service/index.d.ts +1 -0
  36. package/services/chain-service/index.js +6 -1
  37. package/services/chain-service/utils/patch.d.ts +1 -1
  38. package/services/chain-service/utils/patch.js +1 -1
  39. package/services/earning-service/constants/chains.js +0 -2
  40. package/services/earning-service/handlers/lending/interlay.js +2 -0
  41. package/services/earning-service/handlers/liquid-staking/acala.js +1 -1
  42. package/services/earning-service/handlers/liquid-staking/bifrost.js +1 -1
  43. package/services/earning-service/handlers/liquid-staking/parallel.js +2 -0
  44. package/services/earning-service/handlers/native-staking/energy.d.ts +6 -0
  45. package/services/earning-service/handlers/native-staking/energy.js +60 -8
  46. package/services/earning-service/handlers/native-staking/relay-chain.js +1 -4
  47. package/services/earning-service/handlers/native-staking/tanssi.js +62 -6
  48. package/services/migration-service/scripts/DeleteEarningData20251105.d.ts +4 -0
  49. package/services/migration-service/scripts/DeleteEarningData20251105.js +13 -0
  50. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.d.ts +4 -0
  51. package/services/migration-service/scripts/MigrateTransactionHistoryBySymbol20251027.js +42 -0
  52. package/services/migration-service/scripts/OptimizeEnableToken.d.ts +4 -0
  53. package/services/migration-service/scripts/OptimizeEnableToken.js +11 -0
  54. package/services/migration-service/scripts/databases/MigrateAssetSetting20251027.d.ts +4 -0
  55. package/services/migration-service/scripts/databases/MigrateAssetSetting20251027.js +29 -0
  56. package/services/migration-service/scripts/index.js +9 -1
  57. package/utils/fee/transfer.js +2 -6
  58. package/utils/staticData/buyTokenConfigs.json +0 -46
@@ -11,6 +11,7 @@ exports.calculateAlephZeroValidatorReturn = calculateAlephZeroValidatorReturn;
11
11
  exports.calculateAnalogChainStakedReturn = calculateAnalogChainStakedReturn;
12
12
  exports.calculateChainStakedReturn = calculateChainStakedReturn;
13
13
  exports.calculateChainStakedReturnV2 = calculateChainStakedReturnV2;
14
+ exports.calculateEnergyWebCollatorReturn = calculateEnergyWebCollatorReturn;
14
15
  exports.calculateInflation = calculateInflation;
15
16
  exports.calculateTernoaValidatorReturn = calculateTernoaValidatorReturn;
16
17
  exports.calculateValidatorStakedReturn = calculateValidatorStakedReturn;
@@ -139,6 +140,11 @@ async function calculateChainStakedReturnV2(chainInfo, totalIssuance, erasPerDay
139
140
  function calculateAlephZeroValidatorReturn(chainStakedReturn, commission) {
140
141
  return chainStakedReturn * (100 - commission) / 100;
141
142
  }
143
+ function calculateEnergyWebCollatorReturn(annualReward, collatorCommission, numberCollators, totalStake) {
144
+ const rewardForNominators = new _bignumber.default(annualReward).multipliedBy(1 - collatorCommission);
145
+ const rewardPerNominator = rewardForNominators.div(numberCollators);
146
+ return rewardPerNominator.div(totalStake).shiftedBy(2).toNumber();
147
+ }
142
148
  function calculateTernoaValidatorReturn(rewardPerValidator, validatorStake, commission) {
143
149
  const percentRewardForNominators = (100 - commission) / 100;
144
150
  const rewardForNominators = rewardPerValidator * percentRewardForNominators;
@@ -1837,6 +1837,7 @@ class KoniState {
1837
1837
  await this.priceService.setPriceCurrency(DEFAULT_CURRENCY);
1838
1838
  this.settingService.resetWallet();
1839
1839
  await this.priceService.setPriceCurrency(DEFAULT_CURRENCY);
1840
+ this.chainService.resetPopularTokenList();
1840
1841
  }
1841
1842
  this.chainService.resetWallet(resetAll);
1842
1843
  await this.walletConnectService.resetWallet(resetAll);
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.63-0'
16
+ version: '1.3.65-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -38,13 +38,14 @@ class BalanceService {
38
38
  stopPromiseHandler = (0, _utils2.createPromiseHandler)();
39
39
  status = _types.ServiceStatus.NOT_INITIALIZED;
40
40
  isReload = false;
41
+ requireOptimizeTokenList = false;
41
42
  get isStarted() {
42
43
  return this.status === _types.ServiceStatus.STARTED;
43
44
  }
44
45
  detectAccountBalanceStore = new _DetectAccountBalance.default();
45
46
  balanceDetectSubject = new _rxjs.BehaviorSubject({});
46
- intervalTime = 3 * 60 * 1000;
47
- cacheTime = 15 * 60 * 1000;
47
+ intervalTime = 3 * 60 * 1000; // scan balance every 3 mins
48
+ cacheTime = 15 * 60 * 1000; // cache time 15 mins to run again
48
49
 
49
50
  /**
50
51
  * @constructor
@@ -96,6 +97,10 @@ class BalanceService {
96
97
  this.stopPromiseHandler = (0, _utils2.createPromiseHandler)();
97
98
  this.status = _types.ServiceStatus.STARTED;
98
99
  this.startPromiseHandler.resolve();
100
+ if (this.requireOptimizeTokenList) {
101
+ await this.optimizeEnableTokens();
102
+ this.requireOptimizeTokenList = false;
103
+ }
99
104
  }
100
105
 
101
106
  /** Stop service */
@@ -456,18 +461,12 @@ class BalanceService {
456
461
  const type = (0, _keyring.getKeypairTypeByAddress)(address);
457
462
  const typeValid = [..._types2.EthereumKeypairTypes].includes(type);
458
463
  if (typeValid) {
459
- return new Promise(resolve => {
460
- const timeOutPromise = new Promise(_resolve => {
461
- setTimeout(() => _resolve([]), 30000);
462
- });
463
- const balanceDetectionApi = _subwalletServicesSdk.default.balanceDetectionApi || Promise.resolve([]);
464
- Promise.race([timeOutPromise, balanceDetectionApi.getEvmTokenBalanceSlug(address)]).then(result => resolve(result)).catch(error => {
465
- console.error(error);
466
- resolve(null);
467
- });
464
+ return _subwalletServicesSdk.default.balanceDetectionApi.getSubWalletTokenBalance(address).catch(e => {
465
+ console.error(e);
466
+ return null;
468
467
  });
469
468
  } else {
470
- return Promise.resolve(null);
469
+ return null;
471
470
  }
472
471
  });
473
472
  const needEnableChains = [];
@@ -525,13 +524,13 @@ class BalanceService {
525
524
  }
526
525
  for (const balanceData of evmBalanceDataList) {
527
526
  if (balanceData) {
528
- for (const slug of balanceData) {
527
+ for (const tokenSlug of balanceData) {
529
528
  var _currentAssetSettings2;
530
- const chainSlug = slug.split('-')[0];
529
+ const chainSlug = tokenSlug.split('-')[0];
531
530
  const chainState = this.state.chainService.getChainStateByKey(chainSlug);
532
- const existedKey = Object.keys(assetMap).find(v => v.toLowerCase() === slug.toLowerCase());
531
+ const existedKey = Object.keys(assetMap).find(v => v.toLowerCase() === tokenSlug.toLowerCase());
533
532
 
534
- // Cancel is chain is turned off by user
533
+ // Cancel if chain is turned off by user
535
534
  if (chainState && chainState.manualTurnOff) {
536
535
  continue;
537
536
  }
@@ -637,5 +636,148 @@ class BalanceService {
637
636
  }
638
637
  return (0, _process.getDefaultTransferProcess)();
639
638
  }
639
+
640
+ // only evm addresses
641
+ async evmDetectBalanceToken(addresses) {
642
+ const assetMap = this.state.chainService.getAssetRegistry();
643
+ const evmPromiseList = addresses.map(address => {
644
+ return _subwalletServicesSdk.default.balanceDetectionApi.getSubWalletTokenBalance(address).catch(e => {
645
+ console.error(e);
646
+ return null;
647
+ });
648
+ });
649
+ const needActiveTokens = [];
650
+ const evmBalanceDataList = await Promise.all(evmPromiseList);
651
+ for (const balanceData of evmBalanceDataList) {
652
+ if (balanceData) {
653
+ for (const tokenSlug of balanceData) {
654
+ const chainSlug = tokenSlug.split('-')[0];
655
+ const chainState = this.state.chainService.getChainStateByKey(chainSlug);
656
+ const existedKey = Object.keys(assetMap).find(v => v.toLowerCase() === tokenSlug.toLowerCase());
657
+
658
+ // Cancel is chain is turned off by user
659
+ if (chainState && chainState.manualTurnOff) {
660
+ continue;
661
+ }
662
+ if (existedKey) {
663
+ needActiveTokens.push(existedKey);
664
+ }
665
+ }
666
+ }
667
+ }
668
+ return needActiveTokens;
669
+ }
670
+
671
+ // only for substrate addresses
672
+ async substrateDetectBalanceToken(addresses) {
673
+ const assetMap = this.state.chainService.getAssetRegistry();
674
+ const promiseList = addresses.map(address => {
675
+ return this.state.subscanService.getMultiChainBalance(address).catch(e => {
676
+ console.error(e);
677
+ return null;
678
+ });
679
+ });
680
+ const needActiveTokens = [];
681
+ const balanceDataList = await Promise.all(promiseList);
682
+ const chainInfoMap = this.state.chainService.getChainInfoMap();
683
+ const detectBalanceChainSlugMap = this.state.chainService.detectBalanceChainSlugMap;
684
+ for (const balanceData of balanceDataList) {
685
+ if (balanceData) {
686
+ for (const balanceDatum of balanceData) {
687
+ const {
688
+ balance,
689
+ bonded,
690
+ category,
691
+ locked,
692
+ network,
693
+ symbol
694
+ } = balanceDatum;
695
+ const chain = detectBalanceChainSlugMap[network];
696
+ const chainState = this.state.chainService.getChainStateByKey(chain);
697
+ const chainInfo = chain ? chainInfoMap[chain] : null;
698
+ const balanceIsEmpty = (!balance || balance === '0') && (!locked || locked === '0') && (!bonded || bonded === '0');
699
+ const tokenKey = `${chain}-${category === 'native' ? 'NATIVE' : 'LOCAL'}-${symbol.toUpperCase()}`;
700
+ const existedKey = Object.keys(assetMap).find(v => v.toLowerCase() === tokenKey.toLowerCase());
701
+
702
+ // Cancel if chain is not supported or is testnet
703
+ if (!chainInfo || chainInfo.isTestnet) {
704
+ continue;
705
+ }
706
+
707
+ // Cancel is balance is 0
708
+ if (balanceIsEmpty) {
709
+ continue;
710
+ }
711
+
712
+ // Cancel is chain is turned off by user
713
+ if (chainState && chainState.manualTurnOff) {
714
+ continue;
715
+ }
716
+ if (existedKey) {
717
+ needActiveTokens.push(existedKey);
718
+ }
719
+ }
720
+ }
721
+ }
722
+ return needActiveTokens;
723
+ }
724
+ async evmDetectBalanceChain() {
725
+ const blockscoutChain = await _subwalletServicesSdk.default.balanceDetectionApi.getBlockscoutChainData();
726
+ const blockscoutChainId = Object.keys(blockscoutChain);
727
+ const evmDetectChain = Object.values(this.state.chainService.getChainInfoMap()).filter(info => {
728
+ var _info$evmInfo, _info$evmInfo2;
729
+ return !!((_info$evmInfo = info.evmInfo) !== null && _info$evmInfo !== void 0 && _info$evmInfo.evmChainId) && blockscoutChainId.includes((_info$evmInfo2 = info.evmInfo) === null || _info$evmInfo2 === void 0 ? void 0 : _info$evmInfo2.evmChainId.toString());
730
+ }).map(chainInfo => chainInfo.slug);
731
+ return evmDetectChain;
732
+ }
733
+ substrateDetectBalanceChain() {
734
+ const substrateDetectChain = Object.values(this.state.chainService.getChainInfoMap()).filter(info => {
735
+ var _info$extraInfo;
736
+ return !!info.substrateInfo && !!((_info$extraInfo = info.extraInfo) !== null && _info$extraInfo !== void 0 && _info$extraInfo.chainBalanceSlug);
737
+ }).map(chainInfo => chainInfo.slug);
738
+ return substrateDetectChain;
739
+ }
740
+
741
+ /** optimize token area **/
742
+
743
+ enableOptimizeTokenPromise() {
744
+ this.requireOptimizeTokenList = true;
745
+ }
746
+ async optimizeEnableTokens() {
747
+ try {
748
+ const assetSettings = await this.state.chainService.getAssetSettings();
749
+ const assetMap = this.state.chainService.getAssetRegistry();
750
+ const addresses = _uiKeyring.default.getPairs().map(account => account.address);
751
+ const evmAddresses = addresses.filter(address => [..._types2.EthereumKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
752
+ const substrateAddresses = addresses.filter(address => [..._types2.SubstrateKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
753
+ const [nonZeroBalanceEvmToken, nonZeroBalanceSubstrateToken] = await Promise.all([this.evmDetectBalanceToken(evmAddresses), this.substrateDetectBalanceToken(substrateAddresses)]);
754
+ const substrateDetectChain = this.substrateDetectBalanceChain();
755
+ const evmDetectChain = await this.evmDetectBalanceChain();
756
+ const updatedSettings = structuredClone(assetSettings);
757
+ Object.entries(assetSettings).forEach(_ref => {
758
+ let [tokenSlug, setting] = _ref;
759
+ const isNonZeroBalanceToken = nonZeroBalanceEvmToken.includes(tokenSlug) || nonZeroBalanceSubstrateToken.includes(tokenSlug);
760
+ const assetInfo = assetMap[tokenSlug];
761
+ const isEvmDetectChain = evmDetectChain.includes(assetInfo.originChain);
762
+ const isSubstrateDetectChain = substrateDetectChain.includes(assetInfo.originChain);
763
+ if (isNonZeroBalanceToken && !setting.visible) {
764
+ // enable non-zero balance tokens
765
+ updatedSettings[tokenSlug] = {
766
+ visible: true
767
+ };
768
+ } else if (!isNonZeroBalanceToken && setting.visible && !(0, _utils._isNativeToken)(assetInfo) && !(0, _utils._isCustomAsset)(tokenSlug) && (isEvmDetectChain || isSubstrateDetectChain)) {
769
+ // hide tokens with zero balance that aren't native or custom
770
+ updatedSettings[tokenSlug] = {
771
+ visible: false
772
+ };
773
+ }
774
+ });
775
+ this.state.chainService.setAssetSettings(updatedSettings);
776
+ } catch (e) {
777
+ console.error(e);
778
+ }
779
+ }
780
+
781
+ /** optimize token area **/
640
782
  }
641
783
  exports.BalanceService = BalanceService;
@@ -6,17 +6,21 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports._isAcrossChainBridge = _isAcrossChainBridge;
8
8
  exports._isAcrossTestnetBridge = _isAcrossTestnetBridge;
9
- exports.getAcrossQuote = void 0;
9
+ exports.getAcrossSendingValue = exports.getAcrossQuote = void 0;
10
10
  var _chainList = require("@subwallet/chain-list");
11
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
11
12
  var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
13
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
14
+ var _types = require("@subwallet/extension-base/types");
12
15
  var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
16
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
13
17
  // Copyright 2019-2022 @subwallet/extension-base
14
18
  // SPDX-License-Identifier: Apache-2.0
15
19
 
16
20
  // Across Bridge
17
21
  const acrossPairsMap = new Map([[_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, new Set(['optimism', 'base_mainnet', 'arbitrum_one'])], ['optimism', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, 'base_mainnet', 'arbitrum_one'])], ['base_mainnet', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, 'optimism', 'arbitrum_one'])], ['arbitrum_one', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, 'optimism', 'base_mainnet'])], [_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA, new Set(['base_sepolia', 'arbitrum_sepolia'])],
18
22
  // TESTNET START HERE
19
- ['base_sepolia', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA])], ['arbitrum_sepolia', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA])]]);
23
+ ['base_sepolia', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA, 'arbitrum_sepolia'])], ['arbitrum_sepolia', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA, 'base_sepolia'])]]);
20
24
  function _isAcrossChainBridge(srcChain, destChain) {
21
25
  var _acrossPairsMap$get$h, _acrossPairsMap$get;
22
26
  return (_acrossPairsMap$get$h = (_acrossPairsMap$get = acrossPairsMap.get(srcChain)) === null || _acrossPairsMap$get === void 0 ? void 0 : _acrossPairsMap$get.has(destChain)) !== null && _acrossPairsMap$get$h !== void 0 ? _acrossPairsMap$get$h : false;
@@ -43,7 +47,7 @@ const getAcrossQuote = async _ref => {
43
47
  throw new Error('Sender is required');
44
48
  }
45
49
  try {
46
- const data = await _subwalletServicesSdk.default.xcmApi.fetchXcmData({
50
+ const data = await _subwalletServicesSdk.default.bridgeApi.fetchBridgeData({
47
51
  address: sender,
48
52
  from: originTokenInfo.slug,
49
53
  to: destinationTokenInfo.slug,
@@ -61,4 +65,46 @@ const getAcrossQuote = async _ref => {
61
65
  return Promise.reject(new Error((error === null || error === void 0 ? void 0 : error.message) || 'Unable to perform this transaction at the moment. Try again later'));
62
66
  }
63
67
  };
64
- exports.getAcrossQuote = getAcrossQuote;
68
+
69
+ // TODO: update logic after add across metadata for chainlist
70
+ exports.getAcrossQuote = getAcrossQuote;
71
+ const acrossNativeTokenAddresses = {
72
+ mainnet: {
73
+ arbitrum_one: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',
74
+ base_mainnet: '0x4200000000000000000000000000000000000006',
75
+ ethereum: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',
76
+ optimism: '0x4200000000000000000000000000000000000006'
77
+ },
78
+ testnet: {
79
+ arbitrum_sepolia: '0x980B62Da83eFf3D4576C647993b0c1D7faf17c73',
80
+ base_sepolia: '0x4200000000000000000000000000000000000006',
81
+ sepolia_ethereum: '0xfFf9976782d46CC05630D1f6eBAb18b2324d6B14'
82
+ }
83
+ };
84
+ const getAcrossSendingValue = async (originChain, originTokenInfo, destinationChain, isTestnet) => {
85
+ try {
86
+ const originChainId = (0, _utils._getEvmChainId)(originChain);
87
+ const destinationChainId = (0, _utils._getEvmChainId)(destinationChain);
88
+ if (!originChainId || !destinationChainId) {
89
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
90
+ }
91
+ const contracts = isTestnet ? acrossNativeTokenAddresses.testnet : acrossNativeTokenAddresses.mainnet;
92
+ const fromContract = (0, _utils._getContractAddressOfToken)(originTokenInfo) || contracts[originTokenInfo.originChain];
93
+ const acrossBridgeLimit = await _subwalletServicesSdk.default.bridgeApi.getAcrossBridgeLimit(originChainId, destinationChainId, fromContract, isTestnet);
94
+ if (!acrossBridgeLimit.minDeposit || !acrossBridgeLimit.maxDeposit) {
95
+ throw new Error('Invalid Across Bridge response');
96
+ }
97
+ const min = new _bignumber.default(acrossBridgeLimit.minDeposit);
98
+ const max = new _bignumber.default(acrossBridgeLimit.maxDeposit);
99
+ // Use the midpoint between minDeposit and maxDeposit as a balanced value used for estimating gas fee more accurately
100
+ const sendingValue = min.plus(max).div(2).toFixed(0);
101
+ return sendingValue;
102
+ } catch (error) {
103
+ console.error('Across Bridge error:', error);
104
+
105
+ // fallback in case fetch API fail
106
+ const defaultSendingAmount = isTestnet ? 0.0037 : 1;
107
+ return new _bignumber.default(defaultSendingAmount).shiftedBy((0, _utils._getAssetDecimals)(originTokenInfo)).toFixed(0, _bignumber.default.ROUND_FLOOR);
108
+ }
109
+ };
110
+ exports.getAcrossSendingValue = getAcrossSendingValue;
@@ -201,7 +201,7 @@ const createAcrossBridgeExtrinsic = async _ref6 => {
201
201
  throw new Error('Sender is required');
202
202
  }
203
203
  try {
204
- const data = await _subwalletServicesSdk.default.xcmApi.fetchXcmData({
204
+ const data = await _subwalletServicesSdk.default.bridgeApi.fetchBridgeData({
205
205
  address: sender,
206
206
  from: originTokenInfo.slug,
207
207
  to: destinationTokenInfo.slug,
@@ -224,10 +224,15 @@ const createAcrossBridgeExtrinsic = async _ref6 => {
224
224
  transactionConfig.gas = gasLimit.toString();
225
225
  return transactionConfig;
226
226
  } catch (error) {
227
+ var _message, _message$toLowerCase;
227
228
  if (error instanceof SyntaxError) {
228
229
  return Promise.reject(new Error('Unable to perform this transaction at the moment. Try again later'));
229
230
  }
230
- return Promise.reject(new Error((error === null || error === void 0 ? void 0 : error.message) || 'Unable to perform this transaction at the moment. Try again later'));
231
+ const message = (error === null || error === void 0 ? void 0 : (_message = error.message) === null || _message === void 0 ? void 0 : (_message$toLowerCase = _message.toLowerCase) === null || _message$toLowerCase === void 0 ? void 0 : _message$toLowerCase.call(_message)) || '';
232
+ if (!message.includes('amount')) {
233
+ return Promise.reject(new Error('Unable to perform this transaction at the moment. Try again later'));
234
+ }
235
+ return Promise.reject(new Error(error === null || error === void 0 ? void 0 : error.message));
231
236
  }
232
237
  };
233
238
  exports.createAcrossBridgeExtrinsic = createAcrossBridgeExtrinsic;
@@ -274,9 +274,6 @@ class ChainOnlineService {
274
274
  this.chainService.subscribeChainInfoMap().next(chainInfoMap);
275
275
  this.chainService.setAssetRegistry(assetRegistry);
276
276
  this.chainService.subscribeAssetRegistry().next(assetRegistry);
277
- this.chainService.autoEnableTokens().then(() => {
278
- this.eventService.emit('asset.updateState', '');
279
- }).catch(console.error);
280
277
  this.chainService.setChainStateMap(currentChainStateMap);
281
278
  this.chainService.subscribeChainStateMap().next(currentChainStateMap);
282
279
  this.chainService.subscribeChainStatusMap().next(currentChainStatusMap);
@@ -605,7 +605,6 @@ class ChainService {
605
605
  this.xcmRefMapSubject.next(this.xcmRefMap);
606
606
  await this.initApis();
607
607
  this.initAssetSettings();
608
- await this.autoEnableTokens();
609
608
  }
610
609
  initAssetRefMap() {
611
610
  this.dataMap.assetRefMap = _chainList.AssetRefMap;
@@ -683,6 +682,12 @@ class ChainService {
683
682
  }
684
683
  }
685
684
  }
685
+ resetPopularTokenList() {
686
+ this.priorityTokensSubject.next({
687
+ token: {},
688
+ tokenGroup: {}
689
+ });
690
+ }
686
691
  async enablePopularTokens() {
687
692
  const assetSettings = this.assetSettingSubject.value;
688
693
  const chainStateMap = this.getChainStateMap();
@@ -12,7 +12,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
12
12
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
13
13
  const fetchDomain = process.env.PATCH_CHAIN_LIST_URL || (PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev');
14
14
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
15
- const ChainListVersion = '0.2.119'; // update this when build chain-list
15
+ const ChainListVersion = '0.2.120'; // update this when build chain-list
16
16
 
17
17
  // todo: move this interface to chainlist
18
18
  exports.ChainListVersion = ChainListVersion;
@@ -46,8 +46,6 @@ exports.MANTA_MIN_DELEGATION = MANTA_MIN_DELEGATION;
46
46
  const CHANNEL_ID = 7;
47
47
  exports.CHANNEL_ID = CHANNEL_ID;
48
48
  const STAKING_IDENTITY_API_SLUG = {
49
- // @TODO: Remove polkadot then migrate
50
- polkadot: 'polkadot_people',
51
49
  statemine: 'peopleKusama',
52
50
  statemint: 'polkadot_people'
53
51
  };
@@ -15,6 +15,7 @@ var _base = _interopRequireDefault(require("./base"));
15
15
  // Copyright 2019-2022 @subwallet/extension-base
16
16
  // SPDX-License-Identifier: Apache-2.0
17
17
 
18
+ // TODO: disable earning and stake actions but keep showing existing earning positions (currently handle on UI)
18
19
  class InterlayLendingPoolHandler extends _base.default {
19
20
  altInputAsset = 'polkadot-NATIVE-DOT';
20
21
  derivativeAssets = ['interlay-LOCAL-qDOT'];
@@ -21,7 +21,7 @@ function convertDerivativeToken(amount, exchangeRate, decimals) {
21
21
  return amount.mul(new _util.BN(exchangeRate)).div(_util.BN_TEN.pow(new _util.BN(decimals)));
22
22
  }
23
23
  class AcalaLiquidStakingPoolHandler extends _base.default {
24
- altInputAsset = 'polkadot-NATIVE-DOT';
24
+ altInputAsset = 'statemint-NATIVE-DOT';
25
25
  derivativeAssets = ['acala-LOCAL-LDOT'];
26
26
  inputAsset = 'acala-LOCAL-DOT';
27
27
  rewardAssets = ['acala-LOCAL-DOT'];
@@ -21,7 +21,7 @@ const STATS_URL = 'https://dapi.bifrost.io/api/site';
21
21
  const BIFROST_GRAPHQL_ENDPOINT = 'https://bifrost-subsql.liebi.com/v1/graphql';
22
22
  const BIFROST_EXCHANGE_RATE_REQUEST = 'query MyQuery{slp_polkadot_ratio(limit:1 where:{key:{_eq:"0"}} order_by:{timestamp:desc_nulls_first}){ratio key timestamp total_issuance token_pool}}';
23
23
  class BifrostLiquidStakingPoolHandler extends _base.default {
24
- altInputAsset = 'polkadot-NATIVE-DOT';
24
+ altInputAsset = 'statemint-NATIVE-DOT';
25
25
  derivativeAssets = ['bifrost_dot-LOCAL-vDOT'];
26
26
  inputAsset = 'bifrost_dot-LOCAL-DOT';
27
27
  rewardAssets = ['bifrost_dot-LOCAL-DOT'];
@@ -15,6 +15,7 @@ var _base = _interopRequireDefault(require("./base"));
15
15
  // Copyright 2019-2022 @subwallet/extension-base
16
16
  // SPDX-License-Identifier: Apache-2.0
17
17
 
18
+ // TODO: disable earning and stake actions but keep showing existing earning positions (currently handle on UI)
18
19
  class ParallelLiquidStakingPoolHandler extends _base.default {
19
20
  altInputAsset = 'polkadot-NATIVE-DOT';
20
21
  derivativeAssets = ['parallel-LOCAL-sDOT'];
@@ -17,6 +17,9 @@ var _basePara = _interopRequireDefault(require("./base-para"));
17
17
  // Copyright 2019-2022 @subwallet/extension-base
18
18
  // SPDX-License-Identifier: Apache-2.0
19
19
 
20
+ const DEFAULT_ANNUAL_REWARD = {
21
+ energy_web_x: 2000000
22
+ };
20
23
  class EnergyNativeStakingPoolHandler extends _basePara.default {
21
24
  /* Subscribe pool info */
22
25
 
@@ -60,6 +63,13 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
60
63
  const unstakingPeriod = parseInt(unstakingDelay.toString()) * eraTime;
61
64
  const minStake = '0';
62
65
  const minToHuman = (0, _utils3.formatNumber)(minStake.toString(), nativeToken.decimals || 0, _utils3.balanceFormatter);
66
+ const collators = await this.getPoolTargets();
67
+ let maxApy = 0;
68
+ for (const collator of collators) {
69
+ if (collator.expectedReturn && collator.expectedReturn > maxApy) {
70
+ maxApy = collator.expectedReturn;
71
+ }
72
+ }
63
73
  const data = {
64
74
  ...this.baseInfo,
65
75
  type: this.type,
@@ -83,8 +93,7 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
83
93
  // TODO recheck
84
94
  era,
85
95
  eraTime,
86
- totalApy: undefined,
87
- // not have
96
+ totalApy: maxApy,
88
97
  tvl: totalStake.toString(),
89
98
  unstakingPeriod: unstakingPeriod
90
99
  },
@@ -257,12 +266,21 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
257
266
  const apiProps = await this.substrateApi.isReady;
258
267
  const substrateIdentityApi = this.substrateIdentityApi;
259
268
  const allCollators = [];
260
- const [_allCollators, _selectedCandidates] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(),
261
- // use it when energy support collatorCommission
262
- // apiProps.api.query.parachainStaking.collatorCommission(),
263
- apiProps.api.query.parachainStaking.selectedCandidates()]);
269
+ const [_allCollators, _selectedCandidates, _eraInfo, unstakingDelay] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.selectedCandidates(), apiProps.api.query.parachainStaking.era(), apiProps.api.query.parachainStaking.delay()]);
270
+ const delay = parseInt(unstakingDelay.toString()); // in era unit
271
+ const roundInfo = _eraInfo.toPrimitive();
272
+ const currentRound = roundInfo.current;
273
+ let defaultCommission = 0;
274
+ if (apiProps.api.query.parachainStaking.defaultCollatorCommission) {
275
+ const _defaultCommission = await apiProps.api.query.parachainStaking.defaultCollatorCommission();
276
+ const {
277
+ current
278
+ } = _defaultCommission.toPrimitive();
279
+ defaultCommission = current / 1000000000;
280
+ }
264
281
  const maxNominationPerCollator = apiProps.api.consts.parachainStaking.maxTopNominationsPerCandidate.toString();
265
282
  const selectedCollators = _selectedCandidates.toPrimitive();
283
+ const selectedCollatorsCount = selectedCollators.length;
266
284
  for (const collator of _allCollators) {
267
285
  const _collatorAddress = collator[0].toHuman();
268
286
  const collatorAddress = _collatorAddress[0];
@@ -289,6 +307,41 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
289
307
  });
290
308
  }
291
309
  }
310
+ const annualReward = DEFAULT_ANNUAL_REWARD[this.chain] ? new _util.BN(DEFAULT_ANNUAL_REWARD[this.chain]).mul(_util.BN_TEN.pow(new _util.BN(this.nativeToken.decimals || 18))) : _util.BN_ZERO;
311
+
312
+ // calculate expected return
313
+ await Promise.all(allCollators.map(async collator => {
314
+ if (!selectedCollators.includes(collator.address) || annualReward.lte(_util.BN_ZERO)) {
315
+ return;
316
+ }
317
+ const [_topNominations, _nominationScheduledRequests] = await Promise.all([apiProps.api.query.parachainStaking.topNominations(collator.address), apiProps.api.query.parachainStaking.nominationScheduledRequests(collator.address)]);
318
+ const nominationScheduledRequests = _nominationScheduledRequests.toPrimitive();
319
+ const topNominations = _topNominations.toPrimitive();
320
+ const topNominationsRecord = topNominations.nominations.reduce((record, _ref) => {
321
+ let {
322
+ amount,
323
+ owner
324
+ } = _ref;
325
+ record[owner] = amount || '0';
326
+ return record;
327
+ }, {});
328
+ let bnTotalActiveStake = new _util.BN(collator.totalStake);
329
+ if (nominationScheduledRequests !== null && nominationScheduledRequests !== void 0 && nominationScheduledRequests.length) {
330
+ const bnTotalInactiveStake = nominationScheduledRequests.reduce((partialSum, _ref2) => {
331
+ let {
332
+ action,
333
+ nominator,
334
+ whenExecutable
335
+ } = _ref2;
336
+ if (whenExecutable + delay - parseInt(currentRound) < 0 && action) {
337
+ return partialSum.add(new _util.BN(topNominationsRecord[nominator] || Object.values(action)[0] || _util.BN_ZERO));
338
+ }
339
+ return partialSum;
340
+ }, _util.BN_ZERO);
341
+ bnTotalActiveStake = bnTotalActiveStake.sub(bnTotalInactiveStake);
342
+ }
343
+ collator.expectedReturn = (0, _utils.calculateEnergyWebCollatorReturn)(annualReward.toString(), defaultCommission, selectedCollatorsCount, bnTotalActiveStake.toString());
344
+ }));
292
345
  const extraInfoMap = {};
293
346
  await Promise.all(allCollators.map(async collator => {
294
347
  const [_info, [identity, isReasonable]] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo(collator.address), (0, _utils2.parseIdentity)(substrateIdentityApi, collator.address)]);
@@ -304,6 +357,7 @@ class EnergyNativeStakingPoolHandler extends _basePara.default {
304
357
  validator.blocked = !extraInfoMap[validator.address].active;
305
358
  validator.identity = extraInfoMap[validator.address].identity;
306
359
  validator.isVerified = extraInfoMap[validator.address].isVerified;
360
+ validator.commission = defaultCommission * 100;
307
361
  }
308
362
  return allCollators;
309
363
  }
@@ -67,10 +67,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
67
67
  }
68
68
  const unlimitedNominatorRewarded = substrateApi.api.consts.staking.maxExposurePageSize !== undefined;
69
69
  const maxNominatorRewarded = (_substrateApi$api$con = substrateApi.api.consts.staking.maxNominatorRewardedPerValidator) === null || _substrateApi$api$con === void 0 ? void 0 : _substrateApi$api$con.toString();
70
-
71
- // hotfix for kusama asset hub migration
72
- const kahMaxNominations = '24';
73
- const maxNominations = chainInfo.slug === 'statemine' ? kahMaxNominations : await (0, _utils.getRelayMaxNominations)(substrateApi, this.chain);
70
+ const maxNominations = await (0, _utils.getRelayMaxNominations)(substrateApi, this.chain);
74
71
  const currentEra = _currentEra.toString();
75
72
  const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
76
73
  const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();