@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.
- package/background/KoniTypes.d.ts +11 -3
- package/background/KoniTypes.js +1 -0
- package/background/errors/EvmProviderError.js +4 -0
- package/background/errors/ProviderError.d.ts +1 -1
- package/background/errors/ProviderError.js +2 -2
- package/cjs/background/KoniTypes.js +1 -0
- package/cjs/background/errors/EvmProviderError.js +4 -0
- package/cjs/background/errors/ProviderError.js +2 -2
- package/cjs/constants/environment.js +1 -1
- package/cjs/constants/index.js +21 -4
- package/cjs/core/logic-validation/transfer.js +23 -8
- package/cjs/koni/background/handlers/Extension.js +109 -89
- package/cjs/koni/background/handlers/State.js +2 -2
- package/cjs/koni/background/handlers/Tabs.js +4 -3
- package/cjs/packageInfo.js +1 -1
- package/cjs/page/index.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +3 -3
- package/cjs/services/balance-service/transfer/smart-contract.js +24 -3
- package/cjs/services/buy-service/constants/token.js +3 -0
- package/cjs/services/chain-service/index.js +11 -0
- package/cjs/services/earning-service/constants/chains.js +1 -1
- package/cjs/services/earning-service/handlers/base.js +11 -5
- package/cjs/services/earning-service/handlers/native-staking/base-para.js +7 -6
- package/cjs/services/earning-service/handlers/native-staking/base.js +6 -3
- package/cjs/services/earning-service/handlers/native-staking/dtao.js +444 -0
- package/cjs/services/earning-service/handlers/native-staking/index.js +8 -1
- package/cjs/services/earning-service/handlers/native-staking/tao.js +138 -125
- package/cjs/services/earning-service/service.js +14 -4
- package/cjs/services/fee-service/utils/tokenPayFee.js +151 -0
- package/cjs/services/inapp-notification-service/index.js +3 -0
- package/cjs/services/request-service/handler/MetadataRequestHandler.js +5 -13
- package/cjs/services/request-service/index.js +2 -2
- package/cjs/services/transaction-service/index.js +14 -5
- package/cjs/types/yield/info/base.js +1 -0
- package/cjs/utils/fee/transfer.js +47 -14
- package/cjs/utils/fetchEvmChainInfo.js +10 -5
- package/constants/environment.js +1 -1
- package/constants/index.d.ts +6 -1
- package/constants/index.js +14 -1
- package/core/logic-validation/transfer.d.ts +1 -1
- package/core/logic-validation/transfer.js +25 -10
- package/koni/background/handlers/Extension.js +82 -62
- package/koni/background/handlers/State.d.ts +1 -1
- package/koni/background/handlers/State.js +2 -2
- package/koni/background/handlers/Tabs.js +4 -3
- package/package.json +16 -6
- package/packageInfo.js +1 -1
- package/page/index.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/index.js +2 -2
- package/services/balance-service/transfer/smart-contract.d.ts +4 -2
- package/services/balance-service/transfer/smart-contract.js +24 -3
- package/services/buy-service/constants/token.js +3 -0
- package/services/chain-service/index.d.ts +1 -0
- package/services/chain-service/index.js +12 -1
- package/services/earning-service/constants/chains.js +1 -1
- package/services/earning-service/handlers/base.d.ts +7 -5
- package/services/earning-service/handlers/base.js +11 -7
- package/services/earning-service/handlers/native-staking/base-para.d.ts +1 -1
- package/services/earning-service/handlers/native-staking/base-para.js +7 -6
- package/services/earning-service/handlers/native-staking/base.d.ts +1 -1
- package/services/earning-service/handlers/native-staking/base.js +6 -3
- package/services/earning-service/handlers/native-staking/dtao.d.ts +64 -0
- package/services/earning-service/handlers/native-staking/dtao.js +434 -0
- package/services/earning-service/handlers/native-staking/index.d.ts +1 -0
- package/services/earning-service/handlers/native-staking/index.js +2 -1
- package/services/earning-service/handlers/native-staking/tao.d.ts +16 -4
- package/services/earning-service/handlers/native-staking/tao.js +136 -121
- package/services/earning-service/service.d.ts +1 -0
- package/services/earning-service/service.js +15 -5
- package/services/fee-service/interfaces.d.ts +25 -0
- package/services/fee-service/utils/tokenPayFee.d.ts +8 -0
- package/services/fee-service/utils/tokenPayFee.js +141 -0
- package/services/inapp-notification-service/index.js +3 -0
- package/services/request-service/handler/MetadataRequestHandler.d.ts +1 -1
- package/services/request-service/handler/MetadataRequestHandler.js +5 -13
- package/services/request-service/index.d.ts +1 -1
- package/services/request-service/index.js +2 -2
- package/services/transaction-service/index.js +16 -7
- package/types/bridge/index.d.ts +1 -0
- package/types/buy.d.ts +1 -1
- package/types/fee/option.d.ts +1 -1
- package/types/yield/actions/join/step.d.ts +1 -0
- package/types/yield/actions/join/submit.d.ts +1 -0
- package/types/yield/info/account/info.d.ts +14 -1
- package/types/yield/info/base.d.ts +3 -1
- package/types/yield/info/base.js +1 -0
- package/types/yield/info/chain/info.d.ts +5 -1
- package/utils/fee/transfer.d.ts +1 -1
- package/utils/fee/transfer.js +46 -13
- package/utils/fetchEvmChainInfo.d.ts +1 -1
- 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(
|
|
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(
|
|
63
|
-
|
|
64
|
-
|
|
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(
|
|
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(
|
|
83
|
-
return this.#metadataRequestHandler.injectMetadata(
|
|
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
|
-
|
|
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 =
|
|
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,
|
package/types/bridge/index.d.ts
CHANGED
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;
|
package/types/fee/option.d.ts
CHANGED
|
@@ -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}
|
package/types/yield/info/base.js
CHANGED
|
@@ -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;
|
package/utils/fee/transfer.d.ts
CHANGED
|
@@ -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
|
|
23
|
+
export declare const calculateXcmMaxTransferable: (id: string, request: CalculateMaxTransferable, freeBalance: AmountData, fee: FeeInfo) => Promise<ResponseSubscribeTransfer>;
|
package/utils/fee/transfer.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
235
|
-
|
|
236
|
-
|
|
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
|
|
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
|
-
|
|
378
|
-
|
|
379
|
-
|
|
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 {
|
|
@@ -4,11 +4,16 @@
|
|
|
4
4
|
const onlineMap = {};
|
|
5
5
|
export async function getEVMChainInfo(chainId) {
|
|
6
6
|
if (Object.keys(onlineMap).length === 0) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
}
|