Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Issue-3658] Allow customizing fee for substrate/evm transactions #3989

Open
wants to merge 55 commits into
base: subwallet-dev
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
3758f46
[Issue-3658] feat: Add Interface to support custom fee transactions
dungnguyen-art Jan 10, 2025
a5c3591
[Issue-3658] feat: Add utility function and logic to subscribe for ge…
dungnguyen-art Jan 10, 2025
582568f
[Issue-3658] feat: Add UI for custom fee transaction
dungnguyen-art Jan 10, 2025
5f31ee5
[Issue-3658] feat: Add logic to get maximum transferable amount
dungnguyen-art Jan 13, 2025
ae514bc
[Issue-3658] feat: Add logic UI to display "fee options"
dungnguyen-art Jan 13, 2025
3621e27
[Issue-3658] docs: Add TODO comments for subscribe max transferable l…
dungnguyen-art Jan 13, 2025
fb04a8b
[Issue-3658] Update UI and handle validate transaction
dungnguyen-art Jan 15, 2025
fccd2b1
[Issue-3658] Update custom fee for XCM, Bridge, dapps
dungnguyen-art Jan 16, 2025
fe58b5a
[Issue-3658] Update ui
dungnguyen-art Jan 17, 2025
7877d98
[Issue-3658] Update validate and handle decimal
dungnguyen-art Jan 21, 2025
f182033
[Issue-3658] refactor code
dungnguyen-art Jan 21, 2025
40b92a5
[Issue-3926] test: test pay fee using usdt
bluezdot Feb 6, 2025
38d890f
[Issue-3590] feat: set fee asset id in transaction
bluezdot Feb 7, 2025
f8f5f7a
[Issue-3590] feat: get list token can pay fee
bluezdot Feb 10, 2025
e9b445b
[Issue-3590] test: test get list token can pay fee
bluezdot Feb 10, 2025
25f39ba
[Issue-3590] feat: get list token can pay fee
bluezdot Feb 10, 2025
c7827cc
[Issue-3590] feat: check liquidity pool if amount is providing
bluezdot Feb 10, 2025
665731f
[Issue-3590] test: set USDT pay fee tx
bluezdot Feb 10, 2025
837be98
[Issue-3590] refactor: rename function
bluezdot Feb 10, 2025
faae891
[Issue-3590] fix eslint
bluezdot Feb 10, 2025
ea30f81
[Issue-3590] Add patch for custom token fee
S2kael Feb 10, 2025
db45faa
[Issue-3590] feat: display fee in history
bluezdot Feb 11, 2025
69b40dc
[Issue-3590] feat: add method to get amount of token pay fee
bluezdot Feb 11, 2025
505f1b2
[Issue-3590] Update UI for token pay fee
dungnguyen-art Feb 11, 2025
01e79ba
Merge remote-tracking branch 'origin/koni/dev/issue-3590-v2' into kon…
dungnguyen-art Feb 11, 2025
0640c56
[Issue-3590] fix eslint
bluezdot Feb 11, 2025
2f31b9d
[Issue-3590] add: Update UI for token pay fee (2)
dungnguyen-art Feb 11, 2025
7e8e5d6
Merge remote-tracking branch 'origin/koni/dev/issue-3590-v2' into kon…
dungnguyen-art Feb 11, 2025
30cdbbf
[Issue-3590] refactor: Fix tokenSlug for selecting a fee
dungnguyen-art Feb 11, 2025
289ad3b
[Issue-3590] refactor: Fix tokenSlug for selecting a fee (2)
dungnguyen-art Feb 11, 2025
3f4262e
[Issue-3590] add: update estimate fee
dungnguyen-art Feb 11, 2025
4c2a740
[Issue-3590] add: update estimate fee (2)
dungnguyen-art Feb 11, 2025
18ac64a
[Issue-3590] refactor: update estimate fee (3)
dungnguyen-art Feb 11, 2025
b88b2f4
[Issue-3590] refactor, fix eslint
bluezdot Feb 12, 2025
01e5f4a
[Issue-3590] Add: Block custom fee for AssetHub in the 'Token Pay Fee…
dungnguyen-art Feb 12, 2025
b0ec6b9
[Issue-3590] feat: fix fee in confirmation
bluezdot Feb 12, 2025
41281c1
[Issue-3590] test: add log for testing
bluezdot Feb 12, 2025
894c524
[Issue-3590] refactor: minor refactor
bluezdot Feb 12, 2025
dd77595
[Issue-3590] Add: Set the native token as the default for pay fee
dungnguyen-art Feb 12, 2025
04bdbcd
[Issue-3590] Add: Set the native token as the default for pay fee
dungnguyen-art Feb 12, 2025
7ac83c3
[Issue-3590] Add: Hide custom fee feature for TON network
dungnguyen-art Feb 12, 2025
68cba72
[Issue-3658] Refactor subscribe transfer
S2kael Feb 12, 2025
45e247b
Merge remote-tracking branch 'origin/subwallet-dev' into koni/dev/iss…
S2kael Feb 12, 2025
45e59aa
Merge remote-tracking branch 'origin/koni/dev/issue-3590-v2' into kon…
S2kael Feb 12, 2025
f49814b
[Issue-3658] Fix eslint
S2kael Feb 12, 2025
06c0649
[Issue-3658] Fix eslint
S2kael Feb 12, 2025
782c471
Merge remote-tracking branch 'origin/koni/dev/issue-3658' into koni/d…
dungnguyen-art Feb 13, 2025
f8bf865
[Issue-3590] feat: handle max transferable in case send and pay fee w…
bluezdot Feb 13, 2025
5d93a63
fix eslint
bluezdot Feb 13, 2025
dfafb6d
[Issue-3590] refactor: move logic calculate fee and max transferable …
bluezdot Feb 13, 2025
2c396db
[Issue-3590] feat: update data list token can pay fee
bluezdot Feb 13, 2025
e380411
Merge remote-tracking branch 'origin/koni/dev/issue-3658' into koni/d…
dungnguyen-art Feb 13, 2025
210f1df
[Issue-3658] Fix not apply custom fee and add blocktime
S2kael Feb 13, 2025
39c822b
Merge remote-tracking branch 'origin/koni/dev/issue-3658' into koni/d…
dungnguyen-art Feb 13, 2025
c83622f
[Issue-3590] Add: fix bug ui related custom fee
dungnguyen-art Feb 13, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 8 additions & 2 deletions packages/extension-base/src/background/KoniTypes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,15 @@
import { TonTransactionConfig } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer';
import { _CHAIN_VALIDATION_ERROR } from '@subwallet/extension-base/services/chain-service/handler/types';
import { _ChainState, _EvmApi, _NetworkUpsertParams, _SubstrateApi, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse, EnableChainParams, EnableMultiChainParams } from '@subwallet/extension-base/services/chain-service/types';
import { TokenHasBalanceInfo } from '@subwallet/extension-base/services/fee-service/interfaces';
import { _NotificationInfo, NotificationSetup } from '@subwallet/extension-base/services/inapp-notification-service/interfaces';
import { AppBannerData, AppConfirmationData, AppPopupData } from '@subwallet/extension-base/services/mkt-campaign-service/types';
import { AuthUrls } from '@subwallet/extension-base/services/request-service/types';
import { CrowdloanContributionsResponse } from '@subwallet/extension-base/services/subscan-service/types';
import { SWTransactionResponse, SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types';
import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types';
import { AccountJson, AccountsWithCurrentAddress, AddressJson, BalanceJson, BaseRequestSign, BuyServiceInfo, BuyTokenInfo, CommonOptimalPath, CurrentAccountInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, InternalRequestSign, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestAccountProxyEdit, RequestAccountProxyForget, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckCrossChainTransfer, RequestCheckPublicAndSecretKey, RequestCheckTransfer, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseEarlyValidateYield, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StorageDataInterface, SubmitYieldStepData, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, SwapTxData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateSwapProcessParams, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo } from '@subwallet/extension-base/types';
import { AccountJson, AccountsWithCurrentAddress, AddressJson, BalanceJson, BaseRequestSign, BuyServiceInfo, BuyTokenInfo, CommonOptimalPath, CurrentAccountInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, InternalRequestSign, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestAccountBatchExportV2, RequestAccountCreateSuriV2, RequestAccountNameValidate, RequestAccountProxyEdit, RequestAccountProxyForget, RequestBatchJsonGetAccountInfo, RequestBatchRestoreV2, RequestBounceableValidate, RequestChangeTonWalletContractVersion, RequestCheckCrossChainTransfer, RequestCheckPublicAndSecretKey, RequestCheckTransfer, RequestCrossChainTransfer, RequestDeriveCreateMultiple, RequestDeriveCreateV3, RequestDeriveValidateV2, RequestEarlyValidateYield, RequestExportAccountProxyMnemonic, RequestGetAllTonWalletContractVersion, RequestGetAmountForPair, RequestGetDeriveAccounts, RequestGetDeriveSuggestion, RequestGetTokensCanPayFee, RequestGetYieldPoolTargets, RequestInputAccountSubscribe, RequestJsonGetAccountInfo, RequestJsonRestoreV2, RequestMetadataHash, RequestMnemonicCreateV2, RequestMnemonicValidateV2, RequestPrivateKeyValidateV2, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestTransfer, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseAccountBatchExportV2, ResponseAccountCreateSuriV2, ResponseAccountNameValidate, ResponseBatchJsonGetAccountInfo, ResponseCheckPublicAndSecretKey, ResponseDeriveValidateV2, ResponseEarlyValidateYield, ResponseExportAccountProxyMnemonic, ResponseGetAllTonWalletContractVersion, ResponseGetDeriveAccounts, ResponseGetDeriveSuggestion, ResponseGetYieldPoolTargets, ResponseInputAccountSubscribe, ResponseJsonGetAccountInfo, ResponseMetadataHash, ResponseMnemonicCreateV2, ResponseMnemonicValidateV2, ResponsePrivateKeyValidateV2, ResponseShortenMetadata, StorageDataInterface, SubmitYieldStepData, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, SwapTxData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateSwapProcessParams, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo } from '@subwallet/extension-base/types';
import { RequestSubmitTransfer, RequestSubscribeTransfer, ResponseSubscribeTransfer } from '@subwallet/extension-base/types/balance/transfer';
import { RequestClaimBridge } from '@subwallet/extension-base/types/bridge';
import { GetNotificationParams, RequestIsClaimedPolygonBridge, RequestSwitchStatusParams } from '@subwallet/extension-base/types/notification';
import { InjectedAccount, InjectedAccountWithMeta, MetadataDefBase } from '@subwallet/extension-inject/types';
Expand Down Expand Up @@ -232,13 +234,13 @@
externalUrl?: string;
rarity?: string;
description?: string;
properties?: Record<any, any> | null;

Check warning on line 237 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type

Check warning on line 237 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type
}

interface NftItemExtraInfo {
type?: _AssetType.ERC721 | _AssetType.PSP34 | RMRK_VER; // for sending
rmrk_ver?: RMRK_VER;
onChainOption?: any; // for sending PSP-34 tokens, should be done better

Check warning on line 243 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type
assetHubType?: AssetHubNftType // for sending assetHub nft. There're 2 types nft
}

Expand Down Expand Up @@ -554,7 +556,7 @@
[ExtrinsicType.STAKING_COMPOUNDING]: RequestTuringStakeCompound,
[ExtrinsicType.STAKING_CANCEL_COMPOUNDING]: RequestTuringCancelStakeCompound,
[ExtrinsicType.STAKING_CANCEL_UNSTAKE]: RequestStakeCancelWithdrawal,
[ExtrinsicType.STAKING_POOL_WITHDRAW]: any,

Check warning on line 559 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type

// Yield
[ExtrinsicType.JOIN_YIELD_POOL]: RequestYieldStepSubmit,
Expand Down Expand Up @@ -585,9 +587,9 @@
[ExtrinsicType.CLAIM_BRIDGE]: RequestClaimBridge

[ExtrinsicType.EVM_EXECUTE]: TransactionConfig,
[ExtrinsicType.CROWDLOAN]: any,

Check warning on line 590 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type
[ExtrinsicType.SWAP]: SwapTxData
[ExtrinsicType.UNKNOWN]: any

Check warning on line 592 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type
}

export enum ExtrinsicStatus {
Expand Down Expand Up @@ -686,7 +688,7 @@
// : T extends ExtrinsicType.MINT_VDOT
// ? Pick<SubmitBifrostLiquidStaking, 'rewardTokenSlug' | 'estimatedAmountReceived'>
// : undefined;
export interface TransactionHistoryItem<ET extends ExtrinsicType = ExtrinsicType.TRANSFER_BALANCE> {

Check warning on line 691 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

'ET' is defined but never used
origin?: 'app' | 'migration' | 'subsquid' | 'subscan', // 'app' or history source
callhash?: string,
signature?: string,
Expand All @@ -711,7 +713,7 @@
tip?: AmountData,
fee?: AmountData,
explorerUrl?: string,
additionalInfo?: any,

Check warning on line 716 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type
startBlock?: number,
nonce?: number,
addressPrefix?: number
Expand Down Expand Up @@ -943,12 +945,12 @@
recipientAddress: string,

nftItemName?: string, // Use for confirmation view only
params: Record<string, any>,

Check warning on line 948 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type
nftItem: NftItem
}

export interface EvmNftTransaction extends ValidateTransactionResponse {
tx: Record<string, any> | null;

Check warning on line 953 in packages/extension-base/src/background/KoniTypes.ts

View workflow job for this annotation

GitHub Actions / Build Development Preview

Unexpected any. Specify a different type
}

export interface ValidateNetworkResponse {
Expand Down Expand Up @@ -2158,19 +2160,23 @@
'pri(transaction.history.getSubscription)': [null, TransactionHistoryItem[], TransactionHistoryItem[]];
'pri(transaction.history.subscribe)': [RequestSubscribeHistory, ResponseSubscribeHistory, TransactionHistoryItem[]];
'pri(transfer.getMaxTransferable)': [RequestMaxTransferable, AmountData];
'pri(transfer.subscribe)': [RequestSubscribeTransfer, ResponseSubscribeTransfer, ResponseSubscribeTransfer];
'pri(subscription.cancel)': [string, boolean];
'pri(freeBalance.get)': [RequestFreeBalance, AmountData];
'pri(freeBalance.subscribe)': [RequestFreeBalance, AmountDataWithId, AmountDataWithId];

// Transfer
'pri(accounts.checkTransfer)': [RequestCheckTransfer, ValidateTransactionResponse];
'pri(accounts.transfer)': [RequestTransfer, SWTransactionResponse];
'pri(accounts.transfer)': [RequestSubmitTransfer, SWTransactionResponse];
'pri(accounts.getOptimalTransferProcess)': [RequestOptimalTransferProcess, CommonOptimalPath];
'pri(accounts.approveSpending)': [TokenSpendingApprovalParams, SWTransactionResponse];

'pri(accounts.checkCrossChainTransfer)': [RequestCheckCrossChainTransfer, ValidateTransactionResponse];
'pri(accounts.crossChainTransfer)': [RequestCrossChainTransfer, SWTransactionResponse];

'pri(customFee.getTokensCanPayFee)': [RequestGetTokensCanPayFee, TokenHasBalanceInfo[]];
'pri(customFee.getAmountForPair)': [RequestGetAmountForPair, string];

// Confirmation Queues
'pri(confirmations.subscribe)': [RequestConfirmationsSubscribe, ConfirmationsQueue, ConfirmationsQueue];
'pri(confirmationsTon.subscribe)': [RequestConfirmationsSubscribeTon, ConfirmationsQueueTon, ConfirmationsQueueTon];
Expand Down
33 changes: 19 additions & 14 deletions packages/extension-base/src/core/logic-validation/request.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@ import { EvmProviderError } from '@subwallet/extension-base/background/errors/Ev
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
import { ConfirmationType, ErrorValidation, EvmProviderErrorType, EvmSendTransactionParams, EvmSignatureRequest, EvmTransactionData } from '@subwallet/extension-base/background/KoniTypes';
import KoniState from '@subwallet/extension-base/koni/background/handlers/State';
import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils';
import { AuthUrlInfo } from '@subwallet/extension-base/services/request-service/types';
import { BasicTxErrorType } from '@subwallet/extension-base/types';
import { BN_ZERO, createPromiseHandler, isSameAddress, stripUrl, wait } from '@subwallet/extension-base/utils';
import { BasicTxErrorType, EvmFeeInfo } from '@subwallet/extension-base/types';
import { BN_ZERO, combineEthFee, createPromiseHandler, isSameAddress, stripUrl, wait } from '@subwallet/extension-base/utils';
import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction';
import { getId } from '@subwallet/extension-base/utils/getId';
import { isSubstrateAddress } from '@subwallet/keyring';
import { KeyringPair } from '@subwallet/keyring/types';
import { keyring } from '@subwallet/ui-keyring';
Expand Down Expand Up @@ -434,18 +434,23 @@ export async function validationEvmDataTransactionMiddleware (koni: KoniState, u
estimateGas = new BigN(transactionParams.gasPrice).multipliedBy(transaction.gas).toFixed(0);
} else {
try {
const priority = await calculateGasFeeParams(evmApi, networkKey || '');

if (priority.baseGasFee) {
transaction.maxPriorityFeePerGas = priority.maxPriorityFeePerGas.toString();
transaction.maxFeePerGas = priority.maxFeePerGas.toString();

const maxFee = priority.maxFeePerGas;

estimateGas = maxFee.multipliedBy(transaction.gas).toFixed(0);
const gasLimit = transaction.gas || await evmApi.api.eth.estimateGas(transaction);
const id = getId();
const feeInfo = await koni.feeService.subscribeChainFee(id, transaction.chain || '', 'evm') as EvmFeeInfo;
const feeCombine = combineEthFee(feeInfo);

if (transaction.maxFeePerGas) {
estimateGas = new BigN(transaction.maxFeePerGas.toString()).multipliedBy(gasLimit).toFixed(0);
} else if (transaction.gasPrice) {
estimateGas = new BigN(transaction.gasPrice.toString()).multipliedBy(gasLimit).toFixed(0);
} else {
transaction.gasPrice = priority.gasPrice;
estimateGas = new BigN(priority.gasPrice).multipliedBy(transaction.gas).toFixed(0);
if (feeCombine.maxFeePerGas) {
const maxFee = new BigN(feeCombine.maxFeePerGas); // TODO: Need review

estimateGas = maxFee.multipliedBy(gasLimit).toFixed(0);
} else if (feeCombine.gasPrice) {
estimateGas = new BigN((feeCombine.gasPrice || 0)).multipliedBy(gasLimit).toFixed(0);
}
}
} catch (e) {
handleError((e as Error).message);
Expand Down
32 changes: 20 additions & 12 deletions packages/extension-base/src/core/logic-validation/transfer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,13 +10,13 @@ import { _canAccountBeReaped, _isAccountActive } from '@subwallet/extension-base
import { FrameSystemAccountInfo } from '@subwallet/extension-base/core/substrate/types';
import { isBounceableAddress } from '@subwallet/extension-base/services/balance-service/helpers/subscribe/ton/utils';
import { _TRANSFER_CHAIN_GROUP } from '@subwallet/extension-base/services/chain-service/constants';
import { _EvmApi, _TonApi } from '@subwallet/extension-base/services/chain-service/types';
import { _EvmApi, _SubstrateApi, _TonApi } from '@subwallet/extension-base/services/chain-service/types';
import { _getAssetDecimals, _getChainExistentialDeposit, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getTokenMinAmount, _isNativeToken, _isTokenEvmSmartContract, _isTokenTonSmartContract } from '@subwallet/extension-base/services/chain-service/utils';
import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils';
import { calculateToAmountByReservePool, FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE } from '@subwallet/extension-base/services/fee-service/utils';
import { isSubstrateTransaction, isTonTransaction } from '@subwallet/extension-base/services/transaction-service/helpers';
import { OptionalSWTransaction, SWTransactionInput, SWTransactionResponse } from '@subwallet/extension-base/services/transaction-service/types';
import { AccountSignMode, BasicTxErrorType, BasicTxWarningCode, TransferTxErrorType } from '@subwallet/extension-base/types';
import { balanceFormatter, formatNumber, pairToAccount } from '@subwallet/extension-base/utils';
import { AccountSignMode, BasicTxErrorType, BasicTxWarningCode, EvmEIP1559FeeOption, EvmFeeInfo, TransferTxErrorType } from '@subwallet/extension-base/types';
import { balanceFormatter, combineEthFee, formatNumber, pairToAccount } from '@subwallet/extension-base/utils';
import { isTonAddress } from '@subwallet/keyring';
import { KeyringPair } from '@subwallet/keyring/types';
import { keyring } from '@subwallet/ui-keyring';
Expand Down Expand Up @@ -370,7 +370,7 @@ export function checkSupportForTransaction (validationResponse: SWTransactionRes
}
}

export async function estimateFeeForTransaction (validationResponse: SWTransactionResponse, transaction: OptionalSWTransaction, chainInfo: _ChainInfo, evmApi: _EvmApi): Promise<FeeData> {
export async function estimateFeeForTransaction (validationResponse: SWTransactionResponse, transaction: OptionalSWTransaction, chainInfo: _ChainInfo, evmApi: _EvmApi, substrateApi: _SubstrateApi, feeInfo: EvmFeeInfo, nativeTokenInfo: _ChainAsset, tokenPayFeeInfo: _ChainAsset | undefined, isTransferLocalTokenAndPayThatTokenAsFee: boolean | undefined): Promise<FeeData> {
const estimateFee: FeeData = {
symbol: '',
decimals: 0,
Expand All @@ -391,23 +391,23 @@ export async function estimateFeeForTransaction (validationResponse: SWTransacti
} else {
const gasLimit = transaction.gas || await evmApi.api.eth.estimateGas(transaction);

const priority = await calculateGasFeeParams(evmApi, chainInfo.slug);
const feeCombine = combineEthFee(feeInfo, validationResponse.feeOption, validationResponse.feeCustom as EvmEIP1559FeeOption);

if (transaction.maxFeePerGas) {
estimateFee.value = new BigN(transaction.maxFeePerGas.toString()).multipliedBy(gasLimit).toFixed(0);
} else if (transaction.gasPrice) {
estimateFee.value = new BigN((transaction.gasPrice || 0).toString()).multipliedBy(gasLimit).toFixed(0);
estimateFee.value = new BigN(transaction.gasPrice.toString()).multipliedBy(gasLimit).toFixed(0);
} else {
if (priority.baseGasFee) {
const maxFee = priority.maxFeePerGas; // TODO: Need review
if (feeCombine.maxFeePerGas) {
const maxFee = new BigN(feeCombine.maxFeePerGas); // TODO: Need review

estimateFee.value = maxFee.multipliedBy(gasLimit).toFixed(0);
} else {
estimateFee.value = new BigN(priority.gasPrice).multipliedBy(gasLimit).toFixed(0);
} else if (feeCombine.gasPrice) {
estimateFee.value = new BigN((feeCombine.gasPrice || 0)).multipliedBy(gasLimit).toFixed(0);
}
}

estimateFee.tooHigh = priority.busyNetwork;
estimateFee.tooHigh = feeInfo.busyNetwork;
}
} catch (e) {
const error = e as Error;
Expand All @@ -418,6 +418,14 @@ export async function estimateFeeForTransaction (validationResponse: SWTransacti
}
}

if (tokenPayFeeInfo) {
const estimatedFeeAmount = isTransferLocalTokenAndPayThatTokenAsFee ? (BigInt(estimateFee.value) * BigInt(FEE_COVERAGE_PERCENTAGE_SPECIAL_CASE) / BigInt(100)).toString() : estimateFee.value;

estimateFee.decimals = tokenPayFeeInfo.decimals || 0;
estimateFee.symbol = tokenPayFeeInfo.symbol;
estimateFee.value = await calculateToAmountByReservePool(substrateApi.api, nativeTokenInfo, tokenPayFeeInfo, estimatedFeeAmount);
}

return estimateFee;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { _Address } from '@subwallet/extension-base/background/KoniTypes';
import { _ERC20_ABI } from '@subwallet/extension-base/koni/api/contract-handler/utils';
import { _EvmApi } from '@subwallet/extension-base/services/chain-service/types';
import { calculateGasFeeParams } from '@subwallet/extension-base/services/fee-service/utils';
import { combineEthFee } from '@subwallet/extension-base/utils';
import { TransactionConfig } from 'web3-core';
import { Contract } from 'web3-eth-contract';

Expand Down Expand Up @@ -38,14 +39,14 @@ export async function getERC20SpendingApprovalTx (spender: _Address, owner: _Add
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
const gasLimit = await approveCall.estimateGas({ from: owner }) as number;
const priority = await calculateGasFeeParams(evmApi, evmApi.chainSlug);
const feeCombine = combineEthFee(priority);

return {
from: owner,
to: contractAddress,
data: approveEncodedCall,
gas: gasLimit,
gasPrice: priority.gasPrice,
maxFeePerGas: priority.maxFeePerGas?.toString(),
maxPriorityFeePerGas: priority.maxPriorityFeePerGas?.toString()
...feeCombine
} as TransactionConfig;
}
Loading
Loading