@subwallet/extension-base 1.1.35-beta.2 → 1.1.36-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 (89) hide show
  1. package/background/KoniTypes.d.ts +12 -0
  2. package/background/KoniTypes.js +3 -0
  3. package/cjs/background/KoniTypes.js +3 -0
  4. package/cjs/koni/api/nft/config.js +11 -6
  5. package/cjs/koni/api/nft/index.js +4 -2
  6. package/cjs/koni/api/nft/transfer.js +7 -19
  7. package/cjs/koni/api/nft/unique_network_nft/index.js +154 -0
  8. package/cjs/koni/api/staking/bonding/utils.js +44 -0
  9. package/cjs/koni/api/tokens/evm/transfer.js +35 -19
  10. package/cjs/koni/api/yield/helper/utils.js +6 -3
  11. package/cjs/koni/background/handlers/Extension.js +20 -12
  12. package/cjs/koni/background/handlers/State.js +15 -5
  13. package/cjs/packageInfo.js +1 -1
  14. package/cjs/services/balance-service/index.js +1 -1
  15. package/cjs/services/chain-service/constants.js +1 -1
  16. package/cjs/services/chain-service/index.js +3 -5
  17. package/cjs/services/earning-service/handlers/liquid-staking/base.js +2 -1
  18. package/cjs/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  19. package/cjs/services/earning-service/handlers/liquid-staking/index.js +7 -0
  20. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
  21. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +10 -2
  22. package/cjs/services/earning-service/handlers/nomination-pool/index.js +10 -2
  23. package/cjs/services/earning-service/handlers/special.js +7 -3
  24. package/cjs/services/earning-service/service.js +38 -14
  25. package/cjs/services/notification-service/NotificationService.js +7 -4
  26. package/cjs/services/request-service/handler/EvmRequestHandler.js +46 -29
  27. package/cjs/services/transaction-service/constants.js +1 -1
  28. package/cjs/services/transaction-service/index.js +44 -15
  29. package/cjs/signers/web3/QrSigner.js +2 -0
  30. package/cjs/types/yield/actions/join/step.js +1 -0
  31. package/cjs/utils/eth/mergeTransactionAndSignature.js +25 -10
  32. package/cjs/utils/eth.js +60 -2
  33. package/cjs/utils/number.js +5 -1
  34. package/koni/api/nft/config.d.ts +3 -2
  35. package/koni/api/nft/config.js +8 -3
  36. package/koni/api/nft/index.js +3 -2
  37. package/koni/api/nft/transfer.d.ts +0 -1
  38. package/koni/api/nft/transfer.js +7 -18
  39. package/koni/api/nft/unique_network_nft/index.d.ts +9 -0
  40. package/koni/api/nft/unique_network_nft/index.js +146 -0
  41. package/koni/api/staking/bonding/utils.d.ts +5 -0
  42. package/koni/api/staking/bonding/utils.js +40 -0
  43. package/koni/api/tokens/evm/transfer.js +36 -21
  44. package/koni/api/yield/helper/utils.d.ts +1 -1
  45. package/koni/api/yield/helper/utils.js +5 -3
  46. package/koni/background/handlers/Extension.js +21 -13
  47. package/koni/background/handlers/State.js +16 -6
  48. package/package.json +21 -12
  49. package/packageInfo.js +1 -1
  50. package/services/balance-service/index.js +1 -1
  51. package/services/chain-service/constants.js +1 -1
  52. package/services/chain-service/index.js +4 -6
  53. package/services/earning-service/handlers/liquid-staking/base.d.ts +1 -1
  54. package/services/earning-service/handlers/liquid-staking/base.js +2 -1
  55. package/services/earning-service/handlers/liquid-staking/bifrost-manta.d.ts +37 -0
  56. package/services/earning-service/handlers/liquid-staking/bifrost-manta.js +132 -0
  57. package/services/earning-service/handlers/liquid-staking/bifrost.d.ts +3 -3
  58. package/services/earning-service/handlers/liquid-staking/bifrost.js +2 -1
  59. package/services/earning-service/handlers/liquid-staking/index.d.ts +1 -0
  60. package/services/earning-service/handlers/liquid-staking/index.js +1 -0
  61. package/services/earning-service/handlers/liquid-staking/stella-swap.js +2 -2
  62. package/services/earning-service/handlers/native-staking/relay-chain.js +11 -3
  63. package/services/earning-service/handlers/nomination-pool/index.js +11 -3
  64. package/services/earning-service/handlers/special.js +7 -3
  65. package/services/earning-service/service.d.ts +4 -2
  66. package/services/earning-service/service.js +40 -16
  67. package/services/notification-service/NotificationService.js +7 -4
  68. package/services/request-service/handler/EvmRequestHandler.d.ts +2 -2
  69. package/services/request-service/handler/EvmRequestHandler.js +46 -29
  70. package/services/transaction-service/constants.js +1 -1
  71. package/services/transaction-service/index.js +45 -16
  72. package/services/transaction-service/types.d.ts +2 -2
  73. package/signers/types.d.ts +2 -0
  74. package/signers/web3/QrSigner.js +2 -0
  75. package/types/yield/actions/join/step.d.ts +1 -0
  76. package/types/yield/actions/join/step.js +1 -0
  77. package/utils/eth/mergeTransactionAndSignature.js +25 -10
  78. package/utils/eth.d.ts +14 -0
  79. package/utils/eth.js +57 -0
  80. package/utils/number.d.ts +2 -0
  81. package/utils/number.js +2 -0
  82. package/cjs/koni/api/dotsama/balance.js +0 -464
  83. package/cjs/services/migration-service/scripts/MigrateEthProvider.js +0 -17
  84. package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +0 -17
  85. package/cjs/services/migration-service/scripts/MigrateProvider.js +0 -29
  86. package/cjs/services/storage-service/index.js +0 -241
  87. package/cjs/types.js +0 -1
  88. package/cjs/utils/address.js +0 -34
  89. package/cjs/utils/keyring.js +0 -57
@@ -34,7 +34,7 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
34
34
  super(state, chain);
35
35
  const chainInfo = this.chainInfo;
36
36
  this.slug = `DOT___liquid_staking___${chain}`;
37
- this.name = `${chainInfo.name} Liquid Staking`;
37
+ this.name = `${chainInfo.name} Liquid Staking DOT`;
38
38
  this.shortName = chainInfo.name.replaceAll(' Relay Chain', '');
39
39
  }
40
40
  getDescription() {
@@ -93,6 +93,7 @@ export default class BifrostLiquidStakingPoolHandler extends BaseLiquidStakingPo
93
93
  unstakingPeriod: 24 * 28,
94
94
  maxCandidatePerFarmer: 1,
95
95
  maxWithdrawalRequestPerFarmer: 1,
96
+ farmerCount: vDOTStats.holders,
96
97
  earningThreshold: {
97
98
  join: minimumMint,
98
99
  defaultUnstake: minimumRedeem,
@@ -1,4 +1,5 @@
1
1
  export { default as AcalaLiquidStakingPoolHandler } from './acala';
2
2
  export { default as BifrostLiquidStakingPoolHandler } from './bifrost';
3
+ export { default as BifrostMantaLiquidStakingPoolHandler } from './bifrost-manta';
3
4
  export { default as ParallelLiquidStakingPoolHandler } from './parallel';
4
5
  export { default as StellaSwapLiquidStakingPoolHandler } from './stella-swap';
@@ -3,5 +3,6 @@
3
3
 
4
4
  export { default as AcalaLiquidStakingPoolHandler } from "./acala.js";
5
5
  export { default as BifrostLiquidStakingPoolHandler } from "./bifrost.js";
6
+ export { default as BifrostMantaLiquidStakingPoolHandler } from "./bifrost-manta.js";
6
7
  export { default as ParallelLiquidStakingPoolHandler } from "./parallel.js";
7
8
  export { default as StellaSwapLiquidStakingPoolHandler } from "./stella-swap.js";
@@ -38,9 +38,9 @@ export default class StellaSwapLiquidStakingPoolHandler extends BaseLiquidStakin
38
38
  constructor(state, chain) {
39
39
  super(state, chain);
40
40
  this.slug = 'xcDOT___liquid_staking___stellaswap';
41
- this.name = 'Stellaswap Liquid Staking';
41
+ this.name = 'StellaSwap Liquid Staking';
42
42
  this._logo = 'stellaswap';
43
- this.shortName = 'Stellaswap';
43
+ this.shortName = 'StellaSwap';
44
44
  }
45
45
  getDescription() {
46
46
  return 'Earn rewards by staking xcDOT for stDOT';
@@ -3,7 +3,7 @@
3
3
 
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
5
  import { BasicTxErrorType, ExtrinsicType, StakingTxErrorType } from '@subwallet/extension-base/background/KoniTypes';
6
- import { calculateAlephZeroValidatorReturn, calculateChainStakedReturn, calculateInflation, calculateTernoaValidatorReturn, calculateValidatorStakedReturn, getCommission, getMaxValidatorErrorMessage, getMinStakeErrorMessage } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
+ import { calculateAlephZeroValidatorReturn, calculateChainStakedReturnV2, calculateInflation, calculateTernoaValidatorReturn, calculateValidatorStakedReturn, getAvgValidatorEraReward, getCommission, getMaxValidatorErrorMessage, getMinStakeErrorMessage, getSupportedDaysByHistoryDepth } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
7
7
  import { _EXPECTED_BLOCK_TIME, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
8
  import { _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils';
9
9
  import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/earning-service/constants';
@@ -53,7 +53,15 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
53
53
  const maxNominations = ((_substrateApi$api$con = substrateApi.api.consts.staking) === null || _substrateApi$api$con === void 0 ? void 0 : (_substrateApi$api$con2 = _substrateApi$api$con.maxNominations) === null || _substrateApi$api$con2 === void 0 ? void 0 : _substrateApi$api$con2.toString()) || '16'; // TODO
54
54
  const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
55
55
  const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
56
- const [_totalEraStake, _totalIssuance, _auctionCounter, _minNominatorBond, _counterForNominators, _minimumActiveStake] = await Promise.all([substrateApi.api.query.staking.erasTotalStake(parseInt(currentEra)), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que2 = substrateApi.api.query.auctions) === null || _substrateApi$api$que2 === void 0 ? void 0 : _substrateApi$api$que2.auctionCounter(), substrateApi.api.query.staking.minNominatorBond(), substrateApi.api.query.staking.counterForNominators(), ((_substrateApi$api$que3 = substrateApi.api.query) === null || _substrateApi$api$que3 === void 0 ? void 0 : (_substrateApi$api$que4 = _substrateApi$api$que3.staking) === null || _substrateApi$api$que4 === void 0 ? void 0 : _substrateApi$api$que4.minimumActiveStake) && ((_substrateApi$api$que5 = substrateApi.api.query) === null || _substrateApi$api$que5 === void 0 ? void 0 : (_substrateApi$api$que6 = _substrateApi$api$que5.staking) === null || _substrateApi$api$que6 === void 0 ? void 0 : _substrateApi$api$que6.minimumActiveStake())]);
56
+ const maxSupportedEras = substrateApi.api.consts.staking.historyDepth.toString();
57
+ const erasPerDay = 24 / _STAKING_ERA_LENGTH_MAP[chainInfo.slug]; // Can be exactly calculate from epochDuration, blockTime, sessionsPerEra
58
+
59
+ const supportedDays = getSupportedDaysByHistoryDepth(erasPerDay, parseInt(maxSupportedEras));
60
+ const startEra = parseInt(currentEra) - supportedDays * erasPerDay;
61
+ const [_EraStakeInfo, _totalIssuance, _auctionCounter, _minNominatorBond, _counterForNominators, _minimumActiveStake, ..._eraReward] = await Promise.all([substrateApi.api.query.staking.erasTotalStake.multi([parseInt(currentEra), parseInt(currentEra) - 1]), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que2 = substrateApi.api.query.auctions) === null || _substrateApi$api$que2 === void 0 ? void 0 : _substrateApi$api$que2.auctionCounter(), substrateApi.api.query.staking.minNominatorBond(), substrateApi.api.query.staking.counterForNominators(), ((_substrateApi$api$que3 = substrateApi.api.query) === null || _substrateApi$api$que3 === void 0 ? void 0 : (_substrateApi$api$que4 = _substrateApi$api$que3.staking) === null || _substrateApi$api$que4 === void 0 ? void 0 : _substrateApi$api$que4.minimumActiveStake) && ((_substrateApi$api$que5 = substrateApi.api.query) === null || _substrateApi$api$que5 === void 0 ? void 0 : (_substrateApi$api$que6 = _substrateApi$api$que5.staking) === null || _substrateApi$api$que6 === void 0 ? void 0 : _substrateApi$api$que6.minimumActiveStake()), substrateApi.api.query.staking.erasValidatorReward.multi([...Array(supportedDays).keys()].map(i => i + startEra))]);
62
+ const [_totalEraStake, _lastTotalStaked] = _EraStakeInfo;
63
+ const validatorEraReward = getAvgValidatorEraReward(supportedDays, _eraReward[0]);
64
+ const lastTotalStaked = _lastTotalStaked.toString();
57
65
  const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
58
66
  const minNominatorBond = _minNominatorBond.toString();
59
67
  const bnMinActiveStake = new BN(minActiveStake);
@@ -65,7 +73,7 @@ export default class RelayNativeStakingPoolHandler extends BaseNativeStakingPool
65
73
  const bnTotalEraStake = new BN(rawTotalEraStake);
66
74
  const bnTotalIssuance = new BN(rawTotalIssuance);
67
75
  const inflation = calculateInflation(bnTotalEraStake, bnTotalIssuance, numAuctions, chainInfo.slug);
68
- const expectedReturn = calculateChainStakedReturn(inflation, bnTotalEraStake, bnTotalIssuance, chainInfo.slug);
76
+ const expectedReturn = calculateChainStakedReturnV2(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, true);
69
77
  const eraTime = _STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _STAKING_ERA_LENGTH_MAP.default; // in hours
70
78
  const unlockingPeriod = parseInt(unlockingEras) * eraTime; // in hours
71
79
  const farmerCount = _counterForNominators.toPrimitive();
@@ -3,7 +3,7 @@
3
3
 
4
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
5
  import { APIItemState, BasicTxErrorType, ChainType, ExtrinsicType, StakingTxErrorType, StakingType } from '@subwallet/extension-base/background/KoniTypes';
6
- import { calculateChainStakedReturn, calculateInflation, getExistUnstakeErrorMessage, getMinStakeErrorMessage, parsePoolStashAddress } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
+ import { calculateChainStakedReturnV2, calculateInflation, getAvgValidatorEraReward, getExistUnstakeErrorMessage, getMinStakeErrorMessage, getSupportedDaysByHistoryDepth, parsePoolStashAddress } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
7
7
  import { _EXPECTED_BLOCK_TIME, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
8
8
  import { _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils';
9
9
  import { EarningStatus, UnstakingStatus, YieldPoolType, YieldStepType } from '@subwallet/extension-base/types';
@@ -78,7 +78,15 @@ export default class NominationPoolHandler extends BasePoolHandler {
78
78
  const currentEra = _currentEra.toString();
79
79
  const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
80
80
  const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
81
- const [_totalEraStake, _totalIssuance, _auctionCounter, _minPoolJoin] = await Promise.all([substrateApi.api.query.staking.erasTotalStake(parseInt(currentEra)), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que2 = substrateApi.api.query.auctions) === null || _substrateApi$api$que2 === void 0 ? void 0 : _substrateApi$api$que2.auctionCounter(), (_substrateApi$api$que3 = substrateApi.api.query) === null || _substrateApi$api$que3 === void 0 ? void 0 : (_substrateApi$api$que4 = _substrateApi$api$que3.nominationPools) === null || _substrateApi$api$que4 === void 0 ? void 0 : _substrateApi$api$que4.minJoinBond()]);
81
+ const maxSupportedEras = substrateApi.api.consts.staking.historyDepth.toString();
82
+ const erasPerDay = 24 / _STAKING_ERA_LENGTH_MAP[chainInfo.slug]; // Can be exactly calculate from epochDuration, blockTime, sessionsPerEra
83
+
84
+ const supportedDays = getSupportedDaysByHistoryDepth(erasPerDay, parseInt(maxSupportedEras));
85
+ const startEra = parseInt(currentEra) - supportedDays * erasPerDay;
86
+ const [_EraStakeInfo, _totalIssuance, _auctionCounter, _minPoolJoin, ..._eraReward] = await Promise.all([substrateApi.api.query.staking.erasTotalStake.multi([parseInt(currentEra), parseInt(currentEra) - 1]), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que2 = substrateApi.api.query.auctions) === null || _substrateApi$api$que2 === void 0 ? void 0 : _substrateApi$api$que2.auctionCounter(), (_substrateApi$api$que3 = substrateApi.api.query) === null || _substrateApi$api$que3 === void 0 ? void 0 : (_substrateApi$api$que4 = _substrateApi$api$que3.nominationPools) === null || _substrateApi$api$que4 === void 0 ? void 0 : _substrateApi$api$que4.minJoinBond(), substrateApi.api.query.staking.erasValidatorReward.multi([...Array(supportedDays).keys()].map(i => i + startEra))]);
87
+ const [_totalEraStake, _lastTotalStaked] = _EraStakeInfo;
88
+ const validatorEraReward = getAvgValidatorEraReward(supportedDays, _eraReward[0]);
89
+ const lastTotalStaked = _lastTotalStaked.toString();
82
90
  const rawTotalEraStake = _totalEraStake.toString();
83
91
  const rawTotalIssuance = _totalIssuance.toString();
84
92
  const numAuctions = _auctionCounter ? _auctionCounter.toHuman() : 0;
@@ -86,7 +94,7 @@ export default class NominationPoolHandler extends BasePoolHandler {
86
94
  const bnTotalIssuance = new BN(rawTotalIssuance);
87
95
  const inflation = calculateInflation(bnTotalEraStake, bnTotalIssuance, numAuctions, chainInfo.slug);
88
96
  const minPoolJoin = (_minPoolJoin === null || _minPoolJoin === void 0 ? void 0 : _minPoolJoin.toString()) || undefined;
89
- const expectedReturn = calculateChainStakedReturn(inflation, bnTotalEraStake, bnTotalIssuance, chainInfo.slug);
97
+ const expectedReturn = calculateChainStakedReturnV2(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, true);
90
98
  const eraTime = _STAKING_ERA_LENGTH_MAP[this.chain] || _STAKING_ERA_LENGTH_MAP.default; // in hours
91
99
  const unlockingPeriod = parseInt(unlockingEras) * eraTime; // in hours
92
100
 
@@ -1,7 +1,6 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list';
5
4
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
6
5
  import { BasicTxErrorType, ChainType, ExtrinsicType } from '@subwallet/extension-base/background/KoniTypes';
7
6
  import { ALL_ACCOUNT_KEY } from '@subwallet/extension-base/constants';
@@ -201,13 +200,16 @@ export default class BaseSpecialStakingPoolHandler extends BasePoolHandler {
201
200
  const altInputTokenBalance = await this.state.balanceService.getTokenFreeBalance(address, altInputTokenInfo.originChain, altInputTokenSlug);
202
201
  const bnAltInputTokenBalance = new BN(altInputTokenBalance.value || '0');
203
202
  if (bnAltInputTokenBalance.gt(BN_ZERO)) {
203
+ const altChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
204
+ const symbol = altInputTokenInfo.symbol;
205
+ const networkName = altChainInfo.name;
204
206
  const step = {
205
207
  metadata: {
206
208
  sendingValue: bnAmount.toString(),
207
209
  originTokenInfo: altInputTokenInfo,
208
210
  destinationTokenInfo: inputTokenInfo
209
211
  },
210
- name: 'Transfer DOT from Polkadot',
212
+ name: `Transfer ${symbol} from ${networkName}`,
211
213
  type: YieldStepType.XCM
212
214
  };
213
215
  const xcmOriginSubstrateApi = await this.state.getSubstrateApi(altInputTokenInfo.originChain).isReady;
@@ -404,7 +406,9 @@ export default class BaseSpecialStakingPoolHandler extends BasePoolHandler {
404
406
  amount
405
407
  } = data;
406
408
  const destinationTokenSlug = this.inputAsset;
407
- const originChainInfo = this.state.getChainInfo(COMMON_CHAIN_SLUGS.POLKADOT);
409
+ const altInputTokenSlug = this.altInputAsset || '';
410
+ const altInputTokenInfo = this.state.getAssetBySlug(altInputTokenSlug);
411
+ const originChainInfo = this.state.getChainInfo(altInputTokenInfo.originChain);
408
412
  const originTokenSlug = _getChainNativeTokenSlug(originChainInfo);
409
413
  const originTokenInfo = this.state.getAssetBySlug(originTokenSlug);
410
414
  const destinationTokenInfo = this.state.getAssetBySlug(destinationTokenSlug);
@@ -53,14 +53,14 @@ export default class EarningService implements StoppableServiceInterface, Persis
53
53
  subscribeYieldPosition(): BehaviorSubject<YieldPositionInfo[]>;
54
54
  getYieldPositionInfo(): Promise<YieldPositionInfo[]>;
55
55
  yieldPositionPersistQueue: YieldPositionInfo[];
56
- resetYieldPositionQueue(): void;
57
- resetYieldPosition(): void;
56
+ resetYieldPosition(): Promise<void>;
58
57
  private _getYieldPositionKey;
59
58
  updateYieldPosition(data: YieldPositionInfo): void;
60
59
  reloadEarning(reset?: boolean): Promise<void>;
61
60
  private yieldPositionUnsub;
62
61
  runSubscribePoolsPosition(): Promise<void>;
63
62
  runUnsubscribePoolsPosition(): void;
63
+ earningsRewardQueue: EarningRewardItem[];
64
64
  updateEarningReward(stakingRewardData: EarningRewardItem): void;
65
65
  getPoolReward(addresses: string[], callback: (result: EarningRewardItem) => void): Promise<VoidFunction>;
66
66
  subscribeEarningReward(): BehaviorSubject<EarningRewardJson>;
@@ -69,6 +69,7 @@ export default class EarningService implements StoppableServiceInterface, Persis
69
69
  runSubscribeStakingRewardInterval(): void;
70
70
  runUnsubscribeStakingRewardInterval(): void;
71
71
  fetchPoolRewardHistory(addresses: string[], callback: (result: EarningRewardHistoryItem) => void): Promise<VoidFunction>;
72
+ private earningRewardHistoryQueue;
72
73
  updateEarningRewardHistory(earningRewardHistory: EarningRewardHistoryItem): void;
73
74
  subscribeEarningRewardHistory(): BehaviorSubject<Record<string, EarningRewardHistoryItem>>;
74
75
  getEarningRewardHistory(): Record<string, EarningRewardHistoryItem>;
@@ -91,4 +92,5 @@ export default class EarningService implements StoppableServiceInterface, Persis
91
92
  handleYieldWithdraw(params: RequestYieldWithdrawal): Promise<TransactionData>;
92
93
  handleYieldCancelUnstake(params: RequestStakeCancelWithdrawal): Promise<TransactionData>;
93
94
  handleYieldClaimReward(params: RequestStakeClaimReward): Promise<TransactionData>;
95
+ resetWallet(): Promise<void>;
94
96
  }
@@ -9,10 +9,10 @@ import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-
9
9
  import { _STAKING_CHAIN_GROUP } from '@subwallet/extension-base/services/earning-service/constants';
10
10
  import BaseLiquidStakingPoolHandler from '@subwallet/extension-base/services/earning-service/handlers/liquid-staking/base';
11
11
  import { YieldPoolType } from '@subwallet/extension-base/types';
12
- import { addLazy, categoryAddresses, createPromiseHandler } from '@subwallet/extension-base/utils';
12
+ import { addLazy, categoryAddresses, createPromiseHandler, removeLazy } from '@subwallet/extension-base/utils';
13
13
  import { fetchStaticCache } from '@subwallet/extension-base/utils/fetchStaticCache';
14
14
  import { BehaviorSubject } from 'rxjs';
15
- import { AcalaLiquidStakingPoolHandler, AmplitudeNativeStakingPoolHandler, AstarNativeStakingPoolHandler, BifrostLiquidStakingPoolHandler, InterlayLendingPoolHandler, NominationPoolHandler, ParallelLiquidStakingPoolHandler, ParaNativeStakingPoolHandler, RelayNativeStakingPoolHandler, StellaSwapLiquidStakingPoolHandler } from "./handlers/index.js";
15
+ import { AcalaLiquidStakingPoolHandler, AmplitudeNativeStakingPoolHandler, AstarNativeStakingPoolHandler, BifrostLiquidStakingPoolHandler, BifrostMantaLiquidStakingPoolHandler, InterlayLendingPoolHandler, NominationPoolHandler, ParallelLiquidStakingPoolHandler, ParaNativeStakingPoolHandler, RelayNativeStakingPoolHandler, StellaSwapLiquidStakingPoolHandler } from "./handlers/index.js";
16
16
  const fetchPoolsData = async () => {
17
17
  const fetchData = await fetchStaticCache('earning/yield-pools.json', {
18
18
  data: {}
@@ -67,6 +67,7 @@ export default class EarningService {
67
67
  if (_STAKING_CHAIN_GROUP.liquidStaking.includes(chain)) {
68
68
  if (chain === 'bifrost_dot') {
69
69
  handlers.push(new BifrostLiquidStakingPoolHandler(this.state, chain));
70
+ handlers.push(new BifrostMantaLiquidStakingPoolHandler(this.state, chain));
70
71
  }
71
72
  if (chain === 'acala') {
72
73
  handlers.push(new AcalaLiquidStakingPoolHandler(this.state, chain));
@@ -401,12 +402,11 @@ export default class EarningService {
401
402
  return Promise.resolve(this.yieldPositionListSubject.getValue());
402
403
  }
403
404
  yieldPositionPersistQueue = [];
404
- resetYieldPositionQueue() {
405
- this.yieldPositionPersistQueue = [];
406
- }
407
- resetYieldPosition() {
405
+ async resetYieldPosition() {
408
406
  this.yieldPositionSubject.next({});
409
407
  this.yieldPositionPersistQueue = [];
408
+ removeLazy('persistYieldPositionInfo');
409
+ await this.dbService.stores.yieldPosition.clear();
410
410
  }
411
411
  _getYieldPositionKey(slug, address) {
412
412
  return `${slug}---${address}`;
@@ -433,7 +433,7 @@ export default class EarningService {
433
433
  this.runUnsubscribePoolsPosition();
434
434
  this.runUnsubscribeStakingRewardInterval();
435
435
  this.runUnsubscribeEarningRewardHistoryInterval();
436
- reset && this.resetYieldPosition();
436
+ reset && (await this.resetYieldPosition());
437
437
  await this.runSubscribePoolsPosition();
438
438
  this.runSubscribeStakingRewardInterval();
439
439
  this.runSubscribeEarningRewardHistoryInterval();
@@ -451,6 +451,7 @@ export default class EarningService {
451
451
  runUnsubscribePoolsPosition() {
452
452
  var _this$yieldPositionUn;
453
453
  (_this$yieldPositionUn = this.yieldPositionUnsub) === null || _this$yieldPositionUn === void 0 ? void 0 : _this$yieldPositionUn.call(this);
454
+ removeLazy('persistYieldPositionInfo');
454
455
  this.yieldPositionPersistQueue = [];
455
456
  }
456
457
 
@@ -458,12 +459,19 @@ export default class EarningService {
458
459
 
459
460
  /* Get pools' reward */
460
461
 
462
+ earningsRewardQueue = [];
461
463
  updateEarningReward(stakingRewardData) {
462
- const stakingRewardState = this.earningRewardSubject.getValue();
463
- stakingRewardState.ready = true;
464
- const key = `${stakingRewardData.slug}---${stakingRewardData.address}`;
465
- stakingRewardState.data[key] = stakingRewardData;
466
- this.earningRewardSubject.next(stakingRewardState);
464
+ this.earningsRewardQueue.push(stakingRewardData);
465
+ addLazy('updateEarningReward', () => {
466
+ const stakingRewardState = this.earningRewardSubject.getValue();
467
+ this.earningsRewardQueue.forEach(item => {
468
+ const key = `${item.slug}---${item.address}`;
469
+ stakingRewardState.data[key] = item;
470
+ });
471
+ stakingRewardState.ready = true;
472
+ this.earningRewardSubject.next(stakingRewardState);
473
+ this.earningsRewardQueue = [];
474
+ });
467
475
  }
468
476
  async getPoolReward(addresses, callback) {
469
477
  let cancel = false;
@@ -512,6 +520,8 @@ export default class EarningService {
512
520
  }, CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL);
513
521
  }
514
522
  runUnsubscribeStakingRewardInterval() {
523
+ removeLazy('updateEarningReward');
524
+ this.earningsRewardQueue = [];
515
525
  this.earningsRewardInterval && clearInterval(this.earningsRewardInterval);
516
526
  }
517
527
  async fetchPoolRewardHistory(addresses, callback) {
@@ -540,11 +550,18 @@ export default class EarningService {
540
550
  });
541
551
  };
542
552
  }
553
+ earningRewardHistoryQueue = [];
543
554
  updateEarningRewardHistory(earningRewardHistory) {
544
- const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
545
- const key = `${earningRewardHistory.slug}---${earningRewardHistory.address}---${earningRewardHistory.eventIndex}`;
546
- earningRewardHistoryState[key] = earningRewardHistory;
547
- this.earningRewardHistorySubject.next(earningRewardHistoryState);
555
+ this.earningRewardHistoryQueue.push(earningRewardHistory);
556
+ addLazy('updateEarningRewardHistory', () => {
557
+ const earningRewardHistoryState = this.earningRewardHistorySubject.getValue();
558
+ this.earningRewardHistoryQueue.forEach(item => {
559
+ const key = `${item.slug}---${item.address}---${item.eventIndex}`;
560
+ earningRewardHistoryState[key] = item;
561
+ });
562
+ this.earningRewardHistorySubject.next(earningRewardHistoryState);
563
+ this.earningRewardHistoryQueue = [];
564
+ }, 300, 1800);
548
565
  }
549
566
  subscribeEarningRewardHistory() {
550
567
  return this.earningRewardHistorySubject;
@@ -568,6 +585,8 @@ export default class EarningService {
568
585
  }, CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL);
569
586
  }
570
587
  runUnsubscribeEarningRewardHistoryInterval() {
588
+ removeLazy('updateEarningRewardHistory');
589
+ this.earningRewardHistoryQueue = [];
571
590
  this.earningsRewardHistoryInterval && clearInterval(this.earningsRewardHistoryInterval);
572
591
  }
573
592
 
@@ -719,4 +738,9 @@ export default class EarningService {
719
738
  /* Other */
720
739
 
721
740
  /* Handle actions */
741
+
742
+ // Clear wallet data
743
+ async resetWallet() {
744
+ await this.resetYieldPosition();
745
+ }
722
746
  }
@@ -30,15 +30,18 @@ export default class NotificationService {
30
30
  const link = action === null || action === void 0 ? void 0 : action.url;
31
31
  const onClick = action === null || action === void 0 ? void 0 : action.click;
32
32
  const onButtonClick = action === null || action === void 0 ? void 0 : action.buttonClick;
33
- (_chrome = chrome) === null || _chrome === void 0 ? void 0 : (_chrome$notifications = _chrome.notifications) === null || _chrome$notifications === void 0 ? void 0 : _chrome$notifications.create({
33
+ const options = {
34
34
  type: 'basic',
35
35
  title,
36
36
  message,
37
37
  iconUrl: '/images/icon-128.png',
38
38
  priority: 2,
39
- isClickable: !!link || !!onClick,
40
- buttons: isFirefox ? undefined : buttons
41
- }, notificationId => {
39
+ isClickable: !!link || !!onClick
40
+ };
41
+ if (!isFirefox) {
42
+ options.buttons = buttons;
43
+ }
44
+ (_chrome = chrome) === null || _chrome === void 0 ? void 0 : (_chrome$notifications = _chrome.notifications) === null || _chrome$notifications === void 0 ? void 0 : _chrome$notifications.create(options, notificationId => {
42
45
  if (link || onClick) {
43
46
  chrome.notifications.onClicked.addListener(nId => {
44
47
  if (nId === notificationId) {
@@ -1,6 +1,6 @@
1
+ import { TypedTransaction } from '@ethereumjs/tx';
1
2
  import { ConfirmationDefinitions, ConfirmationsQueue, ConfirmationsQueueItemOptions, ConfirmationType, RequestConfirmationComplete } from '@subwallet/extension-base/background/KoniTypes';
2
3
  import RequestService from '@subwallet/extension-base/services/request-service';
3
- import { Transaction } from 'ethereumjs-tx';
4
4
  import { BehaviorSubject } from 'rxjs';
5
5
  import { TransactionConfig } from 'web3-core';
6
6
  export default class EvmRequestHandler {
@@ -13,7 +13,7 @@ export default class EvmRequestHandler {
13
13
  addConfirmation<CT extends ConfirmationType>(id: string, url: string, type: CT, payload: ConfirmationDefinitions[CT][0]['payload'], options?: ConfirmationsQueueItemOptions, validator?: (input: ConfirmationDefinitions[CT][1]) => Error | undefined): Promise<ConfirmationDefinitions[CT][1]>;
14
14
  updateConfirmation<CT extends ConfirmationType>(id: string, type: CT, payload: ConfirmationDefinitions[CT][0]['payload'], options?: ConfirmationsQueueItemOptions, validator?: (input: ConfirmationDefinitions[CT][1]) => Error | undefined): void;
15
15
  private signMessage;
16
- configToTransaction(config: TransactionConfig): Transaction;
16
+ configToTransaction(config: TransactionConfig): TypedTransaction;
17
17
  private signTransaction;
18
18
  private decorateResult;
19
19
  completeConfirmation(request: RequestConfirmationComplete): Promise<boolean>;
@@ -1,18 +1,18 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import Common from '@ethereumjs/common';
4
+ import { Common } from '@ethereumjs/common';
5
+ import { FeeMarketEIP1559Transaction, LegacyTransaction } from '@ethereumjs/tx';
5
6
  import { EvmProviderError } from '@subwallet/extension-base/background/errors/EvmProviderError';
6
7
  import { EvmProviderErrorType } from '@subwallet/extension-base/background/KoniTypes';
7
8
  import { anyNumberToBN } from '@subwallet/extension-base/utils/eth';
8
9
  import { isInternalRequest } from '@subwallet/extension-base/utils/request';
9
10
  import keyring from '@subwallet/ui-keyring';
10
- import BN from 'bn.js';
11
- import { Transaction } from 'ethereumjs-tx';
11
+ import BigN from 'bignumber.js';
12
12
  import { toBuffer } from 'ethereumjs-util';
13
13
  import { t } from 'i18next';
14
14
  import { BehaviorSubject } from 'rxjs';
15
- import { logger as createLogger } from '@polkadot/util';
15
+ import { bnToHex, hexAddPrefix, logger as createLogger } from '@polkadot/util';
16
16
  export default class EvmRequestHandler {
17
17
  #requestService;
18
18
  #logger;
@@ -126,35 +126,48 @@ export default class EvmRequestHandler {
126
126
  }
127
127
  configToTransaction(config) {
128
128
  function formatField(input) {
129
- if (typeof input === 'string') {
130
- if (input.startsWith('0x')) {
131
- return input;
132
- } else {
133
- return new BN(input);
134
- }
129
+ if (typeof input === 'string' || typeof input === 'number') {
130
+ return hexAddPrefix(new BigN(input).toString(16));
131
+ } else if (typeof input === 'undefined') {
132
+ return undefined;
135
133
  }
136
- return input;
134
+ return bnToHex(input);
137
135
  }
138
-
139
- // Convert any string, number to number with BigN exclude hex string
140
- const txData = {
141
- from: config.from,
142
- nonce: formatField(config.nonce),
143
- gasPrice: formatField(config.gasPrice),
144
- gasLimit: formatField(config.gas),
145
- to: config.to,
146
- value: formatField(config.value),
147
- data: toBuffer(config.data)
148
- };
149
136
  const common = Common.custom({
150
137
  chainId: config.chainId,
151
- defaultHardfork: 'petersburg'
152
- });
153
-
154
- // @ts-ignore
155
- return new Transaction(txData, {
156
- common
138
+ defaultHardfork: 'london',
139
+ networkId: config.chainId
140
+ }, {
141
+ eips: [1559]
157
142
  });
143
+ if (config.maxFeePerGas) {
144
+ const txData = {
145
+ nonce: formatField(config.nonce),
146
+ gasLimit: formatField(config.gas),
147
+ to: config.to,
148
+ value: formatField(config.value),
149
+ data: toBuffer(config.data),
150
+ maxFeePerGas: formatField(config.maxFeePerGas),
151
+ maxPriorityFeePerGas: formatField(config.maxPriorityFeePerGas),
152
+ chainId: config.chainId
153
+ };
154
+ return new FeeMarketEIP1559Transaction(txData, {
155
+ common
156
+ });
157
+ } else {
158
+ // Convert any string, number to number with BigN exclude hex string
159
+ const txData = {
160
+ nonce: formatField(config.nonce),
161
+ gasLimit: formatField(config.gas),
162
+ gasPrice: formatField(config.gasPrice),
163
+ to: config.to,
164
+ value: formatField(config.value),
165
+ data: toBuffer(config.data)
166
+ };
167
+ return new LegacyTransaction(txData, {
168
+ common
169
+ });
170
+ }
158
171
  }
159
172
  async signTransaction(confirmation) {
160
173
  const transaction = confirmation.payload;
@@ -163,6 +176,8 @@ export default class EvmRequestHandler {
163
176
  from,
164
177
  gas,
165
178
  gasPrice,
179
+ maxFeePerGas,
180
+ maxPriorityFeePerGas,
166
181
  value
167
182
  } = transaction;
168
183
  const pair = keyring.getPair(from);
@@ -171,7 +186,9 @@ export default class EvmRequestHandler {
171
186
  gas: anyNumberToBN(gas).toNumber(),
172
187
  value: anyNumberToBN(value).toNumber(),
173
188
  gasPrice: anyNumberToBN(gasPrice).toNumber(),
174
- gasLimit: anyNumberToBN(estimateGas).toNumber()
189
+ gasLimit: anyNumberToBN(estimateGas).toNumber(),
190
+ maxFeePerGas: anyNumberToBN(maxFeePerGas).toNumber(),
191
+ maxPriorityFeePerGas: anyNumberToBN(maxPriorityFeePerGas).toNumber()
175
192
  // nonce: await web3.eth.getTransactionCount(from) // Todo: fill this value from transaction service
176
193
  };
177
194
 
@@ -1,4 +1,4 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- export const TRANSACTION_TIMEOUT = 2 * 60 * 1000;
4
+ export const TRANSACTION_TIMEOUT = 5 * 60 * 1000;
@@ -15,9 +15,10 @@ import { getExplorerLink, parseTransactionData } from '@subwallet/extension-base
15
15
  import { isWalletConnectRequest } from '@subwallet/extension-base/services/wallet-connect-service/helpers';
16
16
  import { YieldPoolType } from '@subwallet/extension-base/types';
17
17
  import { reformatAddress } from '@subwallet/extension-base/utils';
18
- import { anyNumberToBN, recalculateGasPrice } from '@subwallet/extension-base/utils/eth';
18
+ import { anyNumberToBN, calculateGasFeeParams } from '@subwallet/extension-base/utils/eth';
19
19
  import { mergeTransactionAndSignature } from '@subwallet/extension-base/utils/eth/mergeTransactionAndSignature';
20
20
  import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction';
21
+ import { BN_ZERO } from '@subwallet/extension-base/utils/number';
21
22
  import keyring from '@subwallet/ui-keyring';
22
23
  import BigN from 'bignumber.js';
23
24
  import { addHexPrefix } from 'ethereumjs-util';
@@ -93,7 +94,8 @@ export default class TransactionService {
93
94
  const estimateFee = {
94
95
  symbol: '',
95
96
  decimals: 0,
96
- value: ''
97
+ value: '',
98
+ tooHigh: false
97
99
  };
98
100
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
99
101
  if (!chainInfo) {
@@ -114,10 +116,16 @@ export default class TransactionService {
114
116
  if (!web3) {
115
117
  validationResponse.errors.push(new TransactionError(BasicTxErrorType.CHAIN_DISCONNECTED, undefined));
116
118
  } else {
117
- const _price = await web3.api.eth.getGasPrice();
118
- const gasPrice = recalculateGasPrice(_price, chainInfo.slug);
119
119
  const gasLimit = await web3.api.eth.estimateGas(transaction);
120
- estimateFee.value = (gasLimit * parseInt(gasPrice)).toString();
120
+ const priority = await calculateGasFeeParams(web3, chainInfo.slug);
121
+ if (priority.baseGasFee) {
122
+ const priorityFee = priority.baseGasFee.plus(priority.maxPriorityFeePerGas);
123
+ const maxFee = priority.maxFeePerGas.lte(priorityFee) ? priority.maxFeePerGas : priorityFee;
124
+ estimateFee.value = maxFee.multipliedBy(gasLimit).toFixed(0);
125
+ } else {
126
+ estimateFee.value = new BigN(priority.gasPrice).multipliedBy(gasLimit).toFixed(0);
127
+ }
128
+ estimateFee.tooHigh = priority.busyNetwork;
121
129
  }
122
130
  }
123
131
  } catch (e) {
@@ -522,6 +530,7 @@ export default class TransactionService {
522
530
  case ExtrinsicType.MINT_QDOT:
523
531
  case ExtrinsicType.MINT_LDOT:
524
532
  case ExtrinsicType.MINT_SDOT:
533
+ case ExtrinsicType.MINT_VMANTA:
525
534
 
526
535
  // eslint-disable-next-line no-fallthrough
527
536
  case ExtrinsicType.MINT_VDOT:
@@ -575,12 +584,14 @@ export default class TransactionService {
575
584
  break;
576
585
  }
577
586
  case ExtrinsicType.UNSTAKE_VDOT:
587
+ case ExtrinsicType.UNSTAKE_VMANTA:
578
588
  case ExtrinsicType.UNSTAKE_LDOT:
579
589
  case ExtrinsicType.UNSTAKE_SDOT:
580
590
  case ExtrinsicType.UNSTAKE_STDOT:
581
591
  case ExtrinsicType.REDEEM_STDOT:
582
592
  case ExtrinsicType.REDEEM_LDOT:
583
593
  case ExtrinsicType.REDEEM_SDOT:
594
+ case ExtrinsicType.REDEEM_VMANTA:
584
595
 
585
596
  // eslint-disable-next-line no-fallthrough
586
597
  case ExtrinsicType.REDEEM_VDOT:
@@ -693,7 +704,7 @@ export default class TransactionService {
693
704
  this.state.historyService.updateHistoryByExtrinsicHash(id, updateData).catch(console.error);
694
705
  console.debug(`Transaction "${id}" is submitted with hash ${extrinsicHash || ''}`);
695
706
  const transaction = this.getTransaction(id);
696
- if ([ExtrinsicType.STAKING_JOIN_POOL, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.MINT_LDOT, ExtrinsicType.MINT_QDOT, ExtrinsicType.MINT_SDOT, ExtrinsicType.MINT_VDOT].includes(transaction.extrinsicType)) {
707
+ if ([ExtrinsicType.STAKING_JOIN_POOL, ExtrinsicType.STAKING_BOND, ExtrinsicType.JOIN_YIELD_POOL, ExtrinsicType.MINT_LDOT, ExtrinsicType.MINT_QDOT, ExtrinsicType.MINT_SDOT, ExtrinsicType.MINT_STDOT, ExtrinsicType.MINT_VDOT, ExtrinsicType.MINT_VMANTA].includes(transaction.extrinsicType)) {
697
708
  this.handlePostEarningTransaction(id);
698
709
  }
699
710
  }
@@ -837,17 +848,33 @@ export default class TransactionService {
837
848
  this.eventService.emit('transaction.timeout', transaction);
838
849
  }
839
850
  generateHashPayload(chain, transaction) {
840
- var _transaction$nonce;
841
851
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
842
- const txObject = {
843
- nonce: (_transaction$nonce = transaction.nonce) !== null && _transaction$nonce !== void 0 ? _transaction$nonce : 0,
844
- gasPrice: addHexPrefix(anyNumberToBN(transaction.gasPrice).toString(16)),
845
- gasLimit: addHexPrefix(anyNumberToBN(transaction.gas).toString(16)),
846
- to: transaction.to !== undefined ? transaction.to : '',
847
- value: addHexPrefix(anyNumberToBN(transaction.value).toString(16)),
848
- data: transaction.data,
849
- chainId: _getEvmChainId(chainInfo)
850
- };
852
+ let txObject;
853
+ const max = anyNumberToBN(transaction.maxFeePerGas);
854
+ if (max.gt(BN_ZERO)) {
855
+ var _transaction$nonce;
856
+ txObject = {
857
+ nonce: (_transaction$nonce = transaction.nonce) !== null && _transaction$nonce !== void 0 ? _transaction$nonce : 0,
858
+ maxFeePerGas: addHexPrefix(anyNumberToBN(transaction.maxFeePerGas).toString(16)),
859
+ maxPriorityFeePerGas: addHexPrefix(anyNumberToBN(transaction.maxPriorityFeePerGas).toString(16)),
860
+ gasLimit: addHexPrefix(anyNumberToBN(transaction.gas).toString(16)),
861
+ to: transaction.to !== undefined ? transaction.to : '',
862
+ value: addHexPrefix(anyNumberToBN(transaction.value).toString(16)),
863
+ data: transaction.data,
864
+ chainId: _getEvmChainId(chainInfo)
865
+ };
866
+ } else {
867
+ var _transaction$nonce2;
868
+ txObject = {
869
+ nonce: (_transaction$nonce2 = transaction.nonce) !== null && _transaction$nonce2 !== void 0 ? _transaction$nonce2 : 0,
870
+ gasPrice: addHexPrefix(anyNumberToBN(transaction.gasPrice).toString(16)),
871
+ gasLimit: addHexPrefix(anyNumberToBN(transaction.gas).toString(16)),
872
+ to: transaction.to !== undefined ? transaction.to : '',
873
+ value: addHexPrefix(anyNumberToBN(transaction.value).toString(16)),
874
+ data: transaction.data,
875
+ chainId: _getEvmChainId(chainInfo)
876
+ };
877
+ }
851
878
  return ethers.Transaction.from(txObject).unsignedSerialized;
852
879
  }
853
880
  async signAndSendEvmTransaction({
@@ -912,6 +939,8 @@ export default class TransactionService {
912
939
  nonce: (_payload$nonce = payload.nonce) !== null && _payload$nonce !== void 0 ? _payload$nonce : 0,
913
940
  from: payload.from,
914
941
  gasPrice: anyNumberToBN(payload.gasPrice).toNumber(),
942
+ maxFeePerGas: anyNumberToBN(payload.maxFeePerGas).toNumber(),
943
+ maxPriorityFeePerGas: anyNumberToBN(payload.maxPriorityFeePerGas).toNumber(),
915
944
  gasLimit: anyNumberToBN(payload.gas).toNumber(),
916
945
  to: payload.to !== undefined ? payload.to : '',
917
946
  value: anyNumberToBN(payload.value).toNumber(),
@@ -1,4 +1,4 @@
1
- import { AmountData, BaseRequestSign, ChainType, ExtrinsicDataTypeMap, ExtrinsicStatus, ExtrinsicType, ValidateTransactionResponse } from '@subwallet/extension-base/background/KoniTypes';
1
+ import { BaseRequestSign, ChainType, ExtrinsicDataTypeMap, ExtrinsicStatus, ExtrinsicType, FeeData, ValidateTransactionResponse } from '@subwallet/extension-base/background/KoniTypes';
2
2
  import EventEmitter from 'eventemitter3';
3
3
  import { TransactionConfig } from 'web3-core';
4
4
  import { SubmittableExtrinsic } from '@polkadot/api/promise/types';
@@ -16,7 +16,7 @@ export interface SWTransaction extends ValidateTransactionResponse, Partial<Pick
16
16
  extrinsicType: ExtrinsicType;
17
17
  createdAt: number;
18
18
  updatedAt: number;
19
- estimateFee?: AmountData;
19
+ estimateFee?: FeeData;
20
20
  transaction: SubmittableExtrinsic | TransactionConfig;
21
21
  additionalValidator?: (inputTransaction: SWTransactionResponse) => Promise<void>;
22
22
  eventsHandler?: (eventEmitter: TransactionEmitter) => void;
@@ -8,6 +8,8 @@ export interface QrState {
8
8
  export interface Web3TransactionBase {
9
9
  to: string;
10
10
  gasPrice: number;
11
+ maxFeePerGas: number;
12
+ maxPriorityFeePerGas: number;
11
13
  gasLimit: number;
12
14
  nonce: number;
13
15
  chainId: number;