@subwallet/extension-base 1.3.23-0 → 1.3.25-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 (91) hide show
  1. package/background/KoniTypes.d.ts +11 -3
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/EvmProviderError.js +4 -0
  4. package/background/errors/ProviderError.d.ts +1 -1
  5. package/background/errors/ProviderError.js +2 -2
  6. package/cjs/background/KoniTypes.js +1 -0
  7. package/cjs/background/errors/EvmProviderError.js +4 -0
  8. package/cjs/background/errors/ProviderError.js +2 -2
  9. package/cjs/constants/environment.js +1 -1
  10. package/cjs/constants/index.js +21 -4
  11. package/cjs/core/logic-validation/transfer.js +23 -8
  12. package/cjs/koni/background/handlers/Extension.js +109 -89
  13. package/cjs/koni/background/handlers/State.js +2 -2
  14. package/cjs/koni/background/handlers/Tabs.js +4 -3
  15. package/cjs/packageInfo.js +1 -1
  16. package/cjs/page/index.js +1 -1
  17. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +3 -3
  18. package/cjs/services/balance-service/transfer/smart-contract.js +24 -3
  19. package/cjs/services/buy-service/constants/token.js +3 -0
  20. package/cjs/services/chain-service/index.js +11 -0
  21. package/cjs/services/earning-service/constants/chains.js +1 -1
  22. package/cjs/services/earning-service/handlers/base.js +11 -5
  23. package/cjs/services/earning-service/handlers/native-staking/base-para.js +7 -6
  24. package/cjs/services/earning-service/handlers/native-staking/base.js +6 -3
  25. package/cjs/services/earning-service/handlers/native-staking/dtao.js +444 -0
  26. package/cjs/services/earning-service/handlers/native-staking/index.js +8 -1
  27. package/cjs/services/earning-service/handlers/native-staking/tao.js +138 -125
  28. package/cjs/services/earning-service/service.js +14 -4
  29. package/cjs/services/fee-service/utils/tokenPayFee.js +151 -0
  30. package/cjs/services/inapp-notification-service/index.js +3 -0
  31. package/cjs/services/request-service/handler/MetadataRequestHandler.js +5 -13
  32. package/cjs/services/request-service/index.js +2 -2
  33. package/cjs/services/transaction-service/index.js +14 -5
  34. package/cjs/types/yield/info/base.js +1 -0
  35. package/cjs/utils/fee/transfer.js +47 -14
  36. package/cjs/utils/fetchEvmChainInfo.js +10 -5
  37. package/constants/environment.js +1 -1
  38. package/constants/index.d.ts +6 -1
  39. package/constants/index.js +14 -1
  40. package/core/logic-validation/transfer.d.ts +1 -1
  41. package/core/logic-validation/transfer.js +25 -10
  42. package/koni/background/handlers/Extension.js +82 -62
  43. package/koni/background/handlers/State.d.ts +1 -1
  44. package/koni/background/handlers/State.js +2 -2
  45. package/koni/background/handlers/Tabs.js +4 -3
  46. package/package.json +16 -6
  47. package/packageInfo.js +1 -1
  48. package/page/index.js +1 -1
  49. package/services/balance-service/helpers/subscribe/substrate/index.js +2 -2
  50. package/services/balance-service/transfer/smart-contract.d.ts +4 -2
  51. package/services/balance-service/transfer/smart-contract.js +24 -3
  52. package/services/buy-service/constants/token.js +3 -0
  53. package/services/chain-service/index.d.ts +1 -0
  54. package/services/chain-service/index.js +12 -1
  55. package/services/earning-service/constants/chains.js +1 -1
  56. package/services/earning-service/handlers/base.d.ts +7 -5
  57. package/services/earning-service/handlers/base.js +11 -7
  58. package/services/earning-service/handlers/native-staking/base-para.d.ts +1 -1
  59. package/services/earning-service/handlers/native-staking/base-para.js +7 -6
  60. package/services/earning-service/handlers/native-staking/base.d.ts +1 -1
  61. package/services/earning-service/handlers/native-staking/base.js +6 -3
  62. package/services/earning-service/handlers/native-staking/dtao.d.ts +64 -0
  63. package/services/earning-service/handlers/native-staking/dtao.js +434 -0
  64. package/services/earning-service/handlers/native-staking/index.d.ts +1 -0
  65. package/services/earning-service/handlers/native-staking/index.js +2 -1
  66. package/services/earning-service/handlers/native-staking/tao.d.ts +16 -4
  67. package/services/earning-service/handlers/native-staking/tao.js +136 -121
  68. package/services/earning-service/service.d.ts +1 -0
  69. package/services/earning-service/service.js +15 -5
  70. package/services/fee-service/interfaces.d.ts +25 -0
  71. package/services/fee-service/utils/tokenPayFee.d.ts +8 -0
  72. package/services/fee-service/utils/tokenPayFee.js +141 -0
  73. package/services/inapp-notification-service/index.js +3 -0
  74. package/services/request-service/handler/MetadataRequestHandler.d.ts +1 -1
  75. package/services/request-service/handler/MetadataRequestHandler.js +5 -13
  76. package/services/request-service/index.d.ts +1 -1
  77. package/services/request-service/index.js +2 -2
  78. package/services/transaction-service/index.js +16 -7
  79. package/types/bridge/index.d.ts +1 -0
  80. package/types/buy.d.ts +1 -1
  81. package/types/fee/option.d.ts +1 -1
  82. package/types/yield/actions/join/step.d.ts +1 -0
  83. package/types/yield/actions/join/submit.d.ts +1 -0
  84. package/types/yield/info/account/info.d.ts +14 -1
  85. package/types/yield/info/base.d.ts +3 -1
  86. package/types/yield/info/base.js +1 -0
  87. package/types/yield/info/chain/info.d.ts +5 -1
  88. package/utils/fee/transfer.d.ts +1 -1
  89. package/utils/fee/transfer.js +46 -13
  90. package/utils/fetchEvmChainInfo.d.ts +1 -1
  91. package/utils/fetchEvmChainInfo.js +10 -5
@@ -383,6 +383,9 @@ export class InappNotificationService {
383
383
  case YieldPoolType.NATIVE_STAKING:
384
384
  method = _STAKING_CHAIN_GROUP.astar.includes(chain.slug) ? 'dApp staking' : 'Direct nomination';
385
385
  break;
386
+ case YieldPoolType.SUBNET_STAKING:
387
+ method = 'Subnet staking'; // todo: confirm with tester
388
+ break;
386
389
  }
387
390
  title = '[{{accountName}}] STAKED {{asset}}'.replace('{{asset}}', asset.symbol);
388
391
  description = '{{amount}} {{asset}} on {{chain}} staked via {{method}}. Click to view details'.replace('{{amount}}', formatNumber(amount, asset.decimals || 0)).replace('{{asset}}', asset.symbol).replace('{{chain}}', chain.name).replace('{{method}}', method);
@@ -14,6 +14,6 @@ export default class MetadataRequestHandler {
14
14
  saveMetadata(meta: MetadataDef): void;
15
15
  private updateIconMeta;
16
16
  private metaComplete;
17
- injectMetadata(url: string, request: MetadataDef): Promise<boolean>;
17
+ injectMetadata(request: MetadataDef): boolean;
18
18
  resetWallet(): void;
19
19
  }
@@ -3,7 +3,6 @@
3
3
 
4
4
  import { extractMetadata } from '@subwallet/extension-base/services/request-service/helper';
5
5
  import { MetadataStore } from '@subwallet/extension-base/stores';
6
- import { getId } from '@subwallet/extension-base/utils/getId';
7
6
  import { addMetadata, knownMetadata } from '@subwallet/extension-chains';
8
7
  import { BehaviorSubject } from 'rxjs';
9
8
  export default class MetadataRequestHandler {
@@ -43,6 +42,8 @@ export default class MetadataRequestHandler {
43
42
  this.metaSubject.next(this.allMetaRequests);
44
43
  this.#requestService.updateIconV2(shouldClose);
45
44
  }
45
+
46
+ // @ts-ignore
46
47
  metaComplete = (id, resolve, reject) => {
47
48
  const complete = () => {
48
49
  delete this.#metaRequests[id];
@@ -59,18 +60,9 @@ export default class MetadataRequestHandler {
59
60
  }
60
61
  };
61
62
  };
62
- injectMetadata(url, request) {
63
- return new Promise((resolve, reject) => {
64
- const id = getId();
65
- this.#metaRequests[id] = {
66
- ...this.metaComplete(id, resolve, reject),
67
- id,
68
- request,
69
- url
70
- };
71
- this.updateIconMeta();
72
- this.#requestService.popupOpen();
73
- });
63
+ injectMetadata(request) {
64
+ this.saveMetadata(request);
65
+ return true;
74
66
  }
75
67
  resetWallet() {
76
68
  for (const request of Object.values(this.#metaRequests)) {
@@ -22,7 +22,7 @@ export default class RequestService {
22
22
  get metaSubject(): BehaviorSubject<MetadataRequest[]>;
23
23
  get knownMetadata(): MetadataDef[];
24
24
  get numMetaRequests(): number;
25
- injectMetadata(url: string, request: MetadataDef): Promise<boolean>;
25
+ injectMetadata(request: MetadataDef): boolean;
26
26
  getMetaRequest(id: string): MetaRequest;
27
27
  saveMetadata(meta: MetadataDef): void;
28
28
  get authSubjectV2(): BehaviorSubject<AuthorizeRequest[]>;
@@ -79,8 +79,8 @@ export default class RequestService {
79
79
  get numMetaRequests() {
80
80
  return this.#metadataRequestHandler.numMetaRequests;
81
81
  }
82
- injectMetadata(url, request) {
83
- return this.#metadataRequestHandler.injectMetadata(url, request);
82
+ injectMetadata(request) {
83
+ return this.#metadataRequestHandler.injectMetadata(request);
84
84
  }
85
85
  getMetaRequest(id) {
86
86
  return this.#metadataRequestHandler.getMetaRequest(id);
@@ -4,10 +4,10 @@
4
4
  import { EvmProviderError } from '@subwallet/extension-base/background/errors/EvmProviderError';
5
5
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
6
6
  import { ChainType, EvmProviderErrorType, ExtrinsicStatus, ExtrinsicType, NotificationType, TransactionDirection } from '@subwallet/extension-base/background/KoniTypes';
7
- import { ALL_ACCOUNT_KEY, fetchBlockedConfigObjects, fetchLastestBlockedActionsAndFeatures, getPassConfigId } from '@subwallet/extension-base/constants';
7
+ import { _SUPPORT_TOKEN_PAY_FEE_GROUP, ALL_ACCOUNT_KEY, fetchBlockedConfigObjects, fetchLastestBlockedActionsAndFeatures, getPassConfigId } from '@subwallet/extension-base/constants';
8
8
  import { checkBalanceWithTransactionFee, checkSigningAccountForTransaction, checkSupportForAction, checkSupportForFeature, checkSupportForTransaction, estimateFeeForTransaction } from '@subwallet/extension-base/core/logic-validation/transfer';
9
9
  import { cellToBase64Str, externalMessage, getTransferCellPromise } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils';
10
- import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getEvmChainId, _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
10
+ import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getEvmChainId, _isChainEvmCompatible, _isNativeTokenBySlug } from '@subwallet/extension-base/services/chain-service/utils';
11
11
  import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants';
12
12
  import { TRANSACTION_TIMEOUT } from '@subwallet/extension-base/services/transaction-service/constants';
13
13
  import { parseLiquidStakingEvents, parseLiquidStakingFastUnstakeEvents, parseTransferEventLogs, parseXcmEventLogs } from '@subwallet/extension-base/services/transaction-service/event-parser';
@@ -90,8 +90,6 @@ export default class TransactionService {
90
90
  checkSupportForAction(validationResponse, blockedActionsMap);
91
91
  }
92
92
  const transaction = transactionInput.transaction;
93
- const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(chain);
94
- const tokenPayFeeInfo = transactionInput.nonNativeTokenPayFeeSlug ? this.chainService.getAssetBySlug(transactionInput.nonNativeTokenPayFeeSlug) : undefined;
95
93
 
96
94
  // Check duplicated transaction
97
95
  validationResponse.errors.push(...this.checkDuplicate(transactionInput));
@@ -117,7 +115,12 @@ export default class TransactionService {
117
115
  // Estimate fee for transaction
118
116
  const id = getId();
119
117
  const feeInfo = await this.state.feeService.subscribeChainFee(id, chain, 'evm');
120
- validationResponse.estimateFee = await estimateFeeForTransaction(validationResponse, transaction, chainInfo, evmApi, substrateApi, feeInfo, nativeTokenInfo, tokenPayFeeInfo, transactionInput.isTransferLocalTokenAndPayThatTokenAsFee);
118
+ const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(chain);
119
+ const tokenPayFeeSlug = transactionInput.tokenPayFeeSlug;
120
+ const isNonNativeTokenPayFee = tokenPayFeeSlug && !_isNativeTokenBySlug(tokenPayFeeSlug);
121
+ const nonNativeTokenPayFeeInfo = isNonNativeTokenPayFee ? this.chainService.getAssetBySlug(tokenPayFeeSlug) : undefined;
122
+ const priceMap = (await this.state.priceService.getPrice()).priceMap;
123
+ validationResponse.estimateFee = await estimateFeeForTransaction(validationResponse, transaction, chainInfo, evmApi, substrateApi, priceMap, feeInfo, nativeTokenInfo, nonNativeTokenPayFeeInfo, transactionInput.isTransferLocalTokenAndPayThatTokenAsFee);
121
124
  const chainInfoMap = this.state.chainService.getChainInfoMap();
122
125
 
123
126
  // Check account signing transaction
@@ -610,7 +613,13 @@ export default class TransactionService {
610
613
  break;
611
614
  case ExtrinsicType.STAKING_UNBOND:
612
615
  {
616
+ var _data$poolInfo;
613
617
  const data = parseTransactionData(transaction.data);
618
+ if ((_data$poolInfo = data.poolInfo) !== null && _data$poolInfo !== void 0 && _data$poolInfo.metadata.subnetData) {
619
+ historyItem.additionalInfo = {
620
+ symbol: data.poolInfo.metadata.subnetData.subnetSymbol
621
+ };
622
+ }
614
623
  if (data.isLiquidStaking && data.derivativeTokenInfo && data.exchangeRate && data.inputTokenInfo) {
615
624
  historyItem.amount = {
616
625
  decimals: _getAssetDecimals(data.derivativeTokenInfo),
@@ -1347,15 +1356,15 @@ export default class TransactionService {
1347
1356
  chain,
1348
1357
  feeCustom,
1349
1358
  id,
1350
- nonNativeTokenPayFeeSlug,
1351
1359
  signAfterCreate,
1352
1360
  step,
1361
+ tokenPayFeeSlug,
1353
1362
  transaction,
1354
1363
  url
1355
1364
  }) {
1356
1365
  var _this$state$chainServ;
1357
1366
  const tip = (feeCustom === null || feeCustom === void 0 ? void 0 : feeCustom.tip) || '0';
1358
- const feeAssetId = nonNativeTokenPayFeeSlug ? (_this$state$chainServ = this.state.chainService.getAssetBySlug(nonNativeTokenPayFeeSlug).metadata) === null || _this$state$chainServ === void 0 ? void 0 : _this$state$chainServ.multilocation : undefined;
1367
+ const feeAssetId = tokenPayFeeSlug && !_isNativeTokenBySlug(tokenPayFeeSlug) && _SUPPORT_TOKEN_PAY_FEE_GROUP.assetHub.includes(chain) ? (_this$state$chainServ = this.state.chainService.getAssetBySlug(tokenPayFeeSlug).metadata) === null || _this$state$chainServ === void 0 ? void 0 : _this$state$chainServ.multilocation : undefined;
1359
1368
  const emitter = new EventEmitter();
1360
1369
  const eventData = {
1361
1370
  id,
@@ -3,4 +3,5 @@ export interface RequestClaimBridge {
3
3
  address: string;
4
4
  chain: string;
5
5
  notification: _NotificationInfo;
6
+ symbol?: string;
6
7
  }
package/types/buy.d.ts CHANGED
@@ -3,7 +3,7 @@ export interface BuyService {
3
3
  network: string;
4
4
  symbol: string;
5
5
  }
6
- export declare type SupportService = 'transak' | 'banxa' | 'coinbase' | 'moonpay' | 'onramper';
6
+ export declare type SupportService = 'transak' | 'banxa' | 'coinbase' | 'moonpay' | 'onramper' | 'meld';
7
7
  export declare type OnrampAccountSupportType = 'ETHEREUM' | 'SUBSTRATE';
8
8
  export interface BuyTokenInfo {
9
9
  network: string;
@@ -4,5 +4,5 @@ export declare type FeeOption = FeeDefaultOption | 'custom';
4
4
  export declare type TransactionFee = {
5
5
  feeOption?: FeeOption;
6
6
  feeCustom?: FeeCustom;
7
- nonNativeTokenPayFeeSlug?: string;
7
+ tokenPayFeeSlug?: string;
8
8
  };
@@ -28,6 +28,7 @@ export interface OptimalYieldPathParams {
28
28
  address: string;
29
29
  amount: string;
30
30
  targets?: YieldPoolTarget[];
31
+ netuid?: number;
31
32
  }
32
33
  /**
33
34
  * @enum {string}
@@ -17,6 +17,7 @@ export interface AbstractSubmitYieldJoinData {
17
17
  }
18
18
  export interface SubmitJoinNativeStaking extends AbstractSubmitYieldJoinData {
19
19
  selectedValidators: ValidatorInfo[];
20
+ netuid?: number;
20
21
  }
21
22
  export interface SubmitJoinNominationPool extends AbstractSubmitYieldJoinData {
22
23
  selectedPool: NominationPoolInfo;
@@ -43,6 +43,11 @@ export interface AbstractYieldPositionInfo extends BaseYieldPositionInfo {
43
43
  status: EarningStatus;
44
44
  /** List unstake request of the account - use for nomination pool and native staking */
45
45
  unstakings: UnstakingInfo[];
46
+ subnetData?: {
47
+ subnetSymbol: string;
48
+ subnetShortName: string;
49
+ originalTotalStake: string;
50
+ };
46
51
  }
47
52
  /**
48
53
  * @interface SpecialYieldPositionInfo
@@ -86,7 +91,15 @@ export interface NominationYieldPositionInfo extends AbstractYieldPositionInfo {
86
91
  export interface NativeYieldPositionInfo extends AbstractYieldPositionInfo {
87
92
  type: YieldPoolType.NATIVE_STAKING;
88
93
  }
94
+ export interface SubnetYieldPositionInfo extends AbstractYieldPositionInfo {
95
+ type: YieldPoolType.SUBNET_STAKING;
96
+ subnetData?: {
97
+ subnetSymbol: string;
98
+ subnetShortName: string;
99
+ originalTotalStake: string;
100
+ };
101
+ }
89
102
  /**
90
103
  * Info of yield pool
91
104
  * */
92
- export declare type YieldPositionInfo = NativeYieldPositionInfo | NominationYieldPositionInfo | LiquidYieldPositionInfo | LendingYieldPositionInfo;
105
+ export declare type YieldPositionInfo = NativeYieldPositionInfo | NominationYieldPositionInfo | LiquidYieldPositionInfo | LendingYieldPositionInfo | SubnetYieldPositionInfo;
@@ -14,7 +14,9 @@ export declare enum YieldPoolType {
14
14
  /** Native staking */
15
15
  NATIVE_STAKING = "NATIVE_STAKING",
16
16
  /** Parachain staking */
17
- PARACHAIN_STAKING = "PARACHAIN_STAKING"
17
+ PARACHAIN_STAKING = "PARACHAIN_STAKING",
18
+ /** Subnet stakingg */
19
+ SUBNET_STAKING = "SUBNET_STAKING"
18
20
  }
19
21
  /**
20
22
  * @enum {number}
@@ -18,6 +18,7 @@ export let YieldPoolType;
18
18
  YieldPoolType["NOMINATION_POOL"] = "NOMINATION_POOL";
19
19
  YieldPoolType["NATIVE_STAKING"] = "NATIVE_STAKING";
20
20
  YieldPoolType["PARACHAIN_STAKING"] = "PARACHAIN_STAKING";
21
+ YieldPoolType["SUBNET_STAKING"] = "SUBNET_STAKING";
21
22
  })(YieldPoolType || (YieldPoolType = {}));
22
23
  export let YieldCompoundingPeriod;
23
24
 
@@ -84,6 +84,10 @@ export interface BaseYieldPoolMetadata {
84
84
  maintainBalance: string;
85
85
  /** Pool's available method */
86
86
  availableMethod: YieldPoolMethodInfo;
87
+ subnetData?: {
88
+ netuid: number;
89
+ subnetSymbol: string;
90
+ };
87
91
  }
88
92
  /**
89
93
  * @interface NormalYieldPoolMetadata
@@ -235,7 +239,7 @@ export interface NominationYieldPoolInfo extends AbstractYieldPoolInfo {
235
239
  * @prop {NormalYieldPoolStatistic} [statistic] - Pool's metadata
236
240
  * */
237
241
  export interface NativeYieldPoolInfo extends AbstractYieldPoolInfo {
238
- type: YieldPoolType.NATIVE_STAKING;
242
+ type: YieldPoolType.NATIVE_STAKING | YieldPoolType.SUBNET_STAKING;
239
243
  metadata: NormalYieldPoolMetadata;
240
244
  statistic?: NormalYieldPoolStatistic;
241
245
  maxPoolMembers?: number;
@@ -20,4 +20,4 @@ export interface CalculateMaxTransferable extends TransactionFee {
20
20
  export declare const detectTransferTxType: (srcToken: _ChainAsset, srcChain: _ChainInfo, destChain: _ChainInfo) => FeeChainType;
21
21
  export declare const calculateMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
22
22
  export declare const calculateTransferMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
23
- export declare const calculateXCMMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
23
+ export declare const calculateXcmMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
@@ -1,7 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { XCM_FEE_RATIO } from '@subwallet/extension-base/constants';
4
+ import { _SUPPORT_TOKEN_PAY_FEE_GROUP, XCM_FEE_RATIO } from '@subwallet/extension-base/constants';
5
5
  import { _isSnowBridgeXcm } from '@subwallet/extension-base/core/substrate/xcm-parser';
6
6
  import { DEFAULT_CARDANO_TTL_OFFSET } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/cardano/consts';
7
7
  import { createCardanoTransaction } from '@subwallet/extension-base/services/balance-service/transfer/cardano-transfer';
@@ -14,6 +14,7 @@ import { _isPolygonChainBridge } from '@subwallet/extension-base/services/balanc
14
14
  import { _isPosChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge';
15
15
  import { _getContractAddressOfToken, _isChainCardanoCompatible, _isChainEvmCompatible, _isChainTonCompatible, _isLocalToken, _isNativeToken, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByCardano, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils';
16
16
  import { calculateToAmountByReservePool, FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE } from '@subwallet/extension-base/services/fee-service/utils';
17
+ import { getHydrationRate } from '@subwallet/extension-base/services/fee-service/utils/tokenPayFee';
17
18
  import { isCardanoTransaction, isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
18
19
  import { BN_ZERO } from '@subwallet/extension-base/utils';
19
20
  import { isCardanoAddress, isTonAddress } from '@subwallet/keyring';
@@ -49,7 +50,13 @@ export const calculateMaxTransferable = async (id, request, freeBalance, fee) =>
49
50
  const isXcmTransfer = srcChain.slug !== destChain.slug;
50
51
  let maxTransferableAmount;
51
52
  if (isXcmTransfer) {
52
- maxTransferableAmount = await calculateXCMMaxTransferable(id, request, freeBalance, fee);
53
+ const _request = {
54
+ // todo: temp not support pay local fee with xcm
55
+ ...request,
56
+ isTransferLocalTokenAndPayThatTokenAsFee: false,
57
+ isTransferNativeTokenAndPayLocalTokenAsFee: false
58
+ };
59
+ maxTransferableAmount = await calculateXcmMaxTransferable(id, _request, freeBalance, fee);
53
60
  } else {
54
61
  maxTransferableAmount = await calculateTransferMaxTransferable(id, request, freeBalance, fee);
55
62
  }
@@ -88,7 +95,7 @@ export const calculateTransferMaxTransferable = async (id, request, freeBalance,
88
95
  // todo: refactor: merge getERC20TransactionObject & getEVMTransactionObject
89
96
  // Estimate with EVM API
90
97
  if (_isTokenEvmSmartContract(srcToken) || _isLocalToken(srcToken)) {
91
- [transaction] = await getERC20TransactionObject({
98
+ [transaction,, error] = await getERC20TransactionObject({
92
99
  assetAddress: _getContractAddressOfToken(srcToken),
93
100
  chain: srcChain.slug,
94
101
  evmApi,
@@ -98,10 +105,11 @@ export const calculateTransferMaxTransferable = async (id, request, freeBalance,
98
105
  from: address,
99
106
  to: recipient,
100
107
  transferAll: false,
101
- value: '0'
108
+ value: '0',
109
+ fallbackFee: true
102
110
  });
103
111
  } else {
104
- [transaction] = await getEVMTransactionObject({
112
+ [transaction,, error] = await getEVMTransactionObject({
105
113
  chain: srcChain.slug,
106
114
  evmApi,
107
115
  feeCustom,
@@ -110,7 +118,8 @@ export const calculateTransferMaxTransferable = async (id, request, freeBalance,
110
118
  from: address,
111
119
  to: recipient,
112
120
  transferAll: false,
113
- value: '0'
121
+ value: '0',
122
+ fallbackFee: true
114
123
  });
115
124
  }
116
125
  } else if (isTonAddress(address) && _isTokenTransferredByTon(srcToken)) {
@@ -231,9 +240,21 @@ export const calculateTransferMaxTransferable = async (id, request, freeBalance,
231
240
  console.warn('Unable to estimate fee', e);
232
241
  }
233
242
  if (isTransferLocalTokenAndPayThatTokenAsFee && feeChainType === 'substrate') {
234
- const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
235
- const estimatedFeeLocal = await calculateToAmountByReservePool(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
236
- maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
243
+ if (_SUPPORT_TOKEN_PAY_FEE_GROUP.assetHub.includes(srcChain.slug)) {
244
+ const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
245
+ const estimatedFeeLocal = await calculateToAmountByReservePool(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
246
+ maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
247
+ } else if (_SUPPORT_TOKEN_PAY_FEE_GROUP.hydration.includes(srcChain.slug)) {
248
+ const rate = await getHydrationRate(address, nativeToken, srcToken);
249
+ if (rate) {
250
+ const estimatedFeeLocal = new BigN(estimatedFee).multipliedBy(rate).integerValue(BigN.ROUND_UP).toString();
251
+ maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
252
+ } else {
253
+ throw new Error(`Unable to estimate fee for ${srcChain.slug}.`);
254
+ }
255
+ } else {
256
+ throw new Error(`Unable to estimate fee for ${srcChain.slug}.`);
257
+ }
237
258
  } else if (isTransferNativeTokenAndPayLocalTokenAsFee) {
238
259
  maxTransferable = BigN(freeBalance.value);
239
260
  } else {
@@ -251,7 +272,7 @@ export const calculateTransferMaxTransferable = async (id, request, freeBalance,
251
272
  error
252
273
  };
253
274
  };
254
- export const calculateXCMMaxTransferable = async (id, request, freeBalance, fee) => {
275
+ export const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
255
276
  const {
256
277
  address,
257
278
  destChain,
@@ -374,9 +395,21 @@ export const calculateXCMMaxTransferable = async (id, request, freeBalance, fee)
374
395
  if (!destToken) {
375
396
  maxTransferable = BN_ZERO;
376
397
  } else if (isTransferLocalTokenAndPayThatTokenAsFee && feeChainType === 'substrate') {
377
- const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
378
- const estimatedFeeLocal = await calculateToAmountByReservePool(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
379
- maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
398
+ if (_SUPPORT_TOKEN_PAY_FEE_GROUP.assetHub.includes(srcChain.slug)) {
399
+ const estimatedFeeNative = (BigInt(estimatedFee) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString();
400
+ const estimatedFeeLocal = await calculateToAmountByReservePool(substrateApi.api, nativeToken, srcToken, estimatedFeeNative);
401
+ maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
402
+ } else if (_SUPPORT_TOKEN_PAY_FEE_GROUP.hydration.includes(srcChain.slug)) {
403
+ const rate = await getHydrationRate(address, nativeToken, srcToken);
404
+ if (rate) {
405
+ const estimatedFeeLocal = new BigN(estimatedFee).multipliedBy(rate).integerValue(BigN.ROUND_UP).toString();
406
+ maxTransferable = BigN(freeBalance.value).minus(estimatedFeeLocal);
407
+ } else {
408
+ throw new Error(`Unable to estimate fee for ${srcChain.slug}.`);
409
+ }
410
+ } else {
411
+ throw new Error(`Unable to estimate fee for ${srcChain.slug}.`);
412
+ }
380
413
  } else if (isTransferNativeTokenAndPayLocalTokenAsFee) {
381
414
  maxTransferable = BigN(freeBalance.value);
382
415
  } else {
@@ -14,4 +14,4 @@ export interface OnlineEvmChainInfo {
14
14
  standard: string;
15
15
  }[];
16
16
  }
17
- export declare function getEVMChainInfo(chainId: number): Promise<OnlineEvmChainInfo>;
17
+ export declare function getEVMChainInfo(chainId: number): Promise<OnlineEvmChainInfo | null>;
@@ -4,11 +4,16 @@
4
4
  const onlineMap = {};
5
5
  export async function getEVMChainInfo(chainId) {
6
6
  if (Object.keys(onlineMap).length === 0) {
7
- const rs = await fetch('https://chainid.network/chains.json');
8
- const data = await rs.json();
9
- data.forEach(item => {
10
- onlineMap[item.chainId] = item;
11
- });
7
+ try {
8
+ const rs = await fetch('https://chainid.network/chains.json');
9
+ const data = await rs.json();
10
+ data.forEach(item => {
11
+ onlineMap[item.chainId] = item;
12
+ });
13
+ } catch (e) {
14
+ console.error(e);
15
+ return null;
16
+ }
12
17
  }
13
18
  return onlineMap[chainId];
14
19
  }