@subwallet/extension-base 1.0.2-2 → 1.0.3-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 (151) hide show
  1. package/background/KoniTypes.d.ts +56 -40
  2. package/background/KoniTypes.js +11 -9
  3. package/background/errors/TransactionError.js +25 -1
  4. package/background/types.d.ts +10 -5
  5. package/cjs/background/KoniTypes.js +11 -9
  6. package/cjs/background/errors/TransactionError.js +24 -0
  7. package/cjs/constants/index.js +8 -26
  8. package/cjs/koni/api/dotsama/balance.js +49 -224
  9. package/cjs/koni/api/dotsama/transfer.js +34 -39
  10. package/cjs/koni/api/nft/acala_nft/index.js +7 -7
  11. package/cjs/koni/api/nft/bit.country/index.js +7 -6
  12. package/cjs/koni/api/nft/evm_nft/index.js +8 -3
  13. package/cjs/koni/api/nft/index.js +3 -6
  14. package/cjs/koni/api/nft/karura_nft/index.js +7 -6
  15. package/cjs/koni/api/nft/rmrk_nft/index.js +11 -1
  16. package/cjs/koni/api/nft/statemine_nft/index.js +7 -6
  17. package/cjs/koni/api/nft/unique_nft/index.js +5 -1
  18. package/cjs/koni/api/nft/wasm_nft/index.js +170 -111
  19. package/cjs/koni/api/nft/wasm_nft/utils.js +11 -7
  20. package/cjs/koni/api/staking/bonding/amplitude.js +13 -9
  21. package/cjs/koni/api/staking/bonding/astar.js +15 -13
  22. package/cjs/koni/api/staking/bonding/index.js +22 -10
  23. package/cjs/koni/api/staking/bonding/paraChain.js +85 -2
  24. package/cjs/koni/api/staking/bonding/relayChain.js +122 -16
  25. package/cjs/koni/api/staking/bonding/utils.js +27 -8
  26. package/cjs/koni/api/tokens/wasm/index.js +5 -4
  27. package/cjs/koni/api/tokens/wasm/utils.js +63 -0
  28. package/cjs/koni/api/xcm/polkadotXcm.js +1 -1
  29. package/cjs/koni/api/xcm/utils.js +18 -13
  30. package/cjs/koni/api/xcm/xTokens.js +1 -1
  31. package/cjs/koni/api/xcm/xcmPallet.js +9 -6
  32. package/cjs/koni/background/cron.js +171 -61
  33. package/cjs/koni/background/handlers/Extension.js +391 -207
  34. package/cjs/koni/background/handlers/State.js +49 -34
  35. package/cjs/koni/background/handlers/Tabs.js +50 -17
  36. package/cjs/koni/background/subscription.js +53 -28
  37. package/cjs/packageInfo.js +1 -1
  38. package/cjs/services/base/types.js +20 -0
  39. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +13 -8
  40. package/cjs/services/chain-service/index.js +73 -49
  41. package/cjs/services/event-service/index.js +5 -1
  42. package/cjs/services/event-service/types.js +11 -1
  43. package/cjs/services/history-service/index.js +101 -50
  44. package/cjs/services/history-service/subsquid-multi-chain-history.js +13 -10
  45. package/cjs/services/keyring-service/index.js +11 -13
  46. package/cjs/services/migration-service/scripts/MigrateImportedToken.js +2 -1
  47. package/cjs/services/price-service/coingecko.js +0 -1
  48. package/cjs/services/price-service/index.js +71 -24
  49. package/cjs/services/request-service/handler/AuthRequestHandler.js +13 -7
  50. package/cjs/services/request-service/handler/EvmRequestHandler.js +8 -12
  51. package/cjs/services/request-service/index.js +14 -5
  52. package/cjs/services/storage-service/DatabaseService.js +66 -34
  53. package/cjs/services/storage-service/db-stores/Nft.js +7 -15
  54. package/cjs/services/storage-service/db-stores/Transaction.js +6 -10
  55. package/cjs/services/transaction-service/event-parser/index.js +20 -48
  56. package/cjs/services/transaction-service/index.js +104 -48
  57. package/cjs/services/transaction-service/utils.js +10 -8
  58. package/cjs/utils/address.js +10 -1
  59. package/cjs/utils/index.js +9 -15
  60. package/cjs/utils/promise.js +26 -0
  61. package/constants/index.d.ts +7 -13
  62. package/constants/index.js +7 -13
  63. package/koni/api/dotsama/balance.d.ts +0 -1
  64. package/koni/api/dotsama/balance.js +22 -197
  65. package/koni/api/dotsama/transfer.js +11 -16
  66. package/koni/api/nft/acala_nft/index.js +7 -7
  67. package/koni/api/nft/bit.country/index.js +7 -6
  68. package/koni/api/nft/evm_nft/index.js +7 -3
  69. package/koni/api/nft/index.d.ts +1 -2
  70. package/koni/api/nft/index.js +3 -6
  71. package/koni/api/nft/karura_nft/index.js +7 -6
  72. package/koni/api/nft/nft.d.ts +1 -0
  73. package/koni/api/nft/rmrk_nft/index.js +11 -1
  74. package/koni/api/nft/statemine_nft/index.js +7 -6
  75. package/koni/api/nft/unique_nft/index.js +5 -1
  76. package/koni/api/nft/wasm_nft/index.d.ts +0 -2
  77. package/koni/api/nft/wasm_nft/index.js +168 -109
  78. package/koni/api/nft/wasm_nft/utils.d.ts +7 -5
  79. package/koni/api/nft/wasm_nft/utils.js +7 -5
  80. package/koni/api/staking/bonding/amplitude.d.ts +0 -1
  81. package/koni/api/staking/bonding/amplitude.js +15 -10
  82. package/koni/api/staking/bonding/astar.js +8 -6
  83. package/koni/api/staking/bonding/index.d.ts +4 -1
  84. package/koni/api/staking/bonding/index.js +23 -13
  85. package/koni/api/staking/bonding/paraChain.d.ts +3 -0
  86. package/koni/api/staking/bonding/paraChain.js +86 -5
  87. package/koni/api/staking/bonding/relayChain.d.ts +5 -1
  88. package/koni/api/staking/bonding/relayChain.js +121 -18
  89. package/koni/api/staking/bonding/utils.d.ts +3 -2
  90. package/koni/api/staking/bonding/utils.js +27 -9
  91. package/koni/api/tokens/wasm/index.js +5 -4
  92. package/koni/api/tokens/wasm/utils.d.ts +6 -0
  93. package/koni/api/tokens/wasm/utils.js +54 -0
  94. package/koni/api/xcm/polkadotXcm.js +2 -2
  95. package/koni/api/xcm/utils.d.ts +5 -6
  96. package/koni/api/xcm/utils.js +15 -10
  97. package/koni/api/xcm/xTokens.js +2 -2
  98. package/koni/api/xcm/xcmPallet.js +10 -9
  99. package/koni/background/cron.d.ts +6 -1
  100. package/koni/background/cron.js +172 -62
  101. package/koni/background/handlers/Extension.d.ts +9 -3
  102. package/koni/background/handlers/Extension.js +306 -126
  103. package/koni/background/handlers/State.d.ts +5 -6
  104. package/koni/background/handlers/State.js +51 -34
  105. package/koni/background/handlers/Tabs.js +50 -17
  106. package/koni/background/subscription.d.ts +2 -0
  107. package/koni/background/subscription.js +51 -29
  108. package/package.json +29 -14
  109. package/packageInfo.js +1 -1
  110. package/services/base/types.d.ts +34 -0
  111. package/services/base/types.js +15 -0
  112. package/services/chain-service/handler/SubstrateChainHandler.js +14 -9
  113. package/services/chain-service/helper/psp22_abi.json +1041 -881
  114. package/services/chain-service/helper/psp34_abi.json +2963 -1807
  115. package/services/chain-service/index.d.ts +5 -2
  116. package/services/chain-service/index.js +68 -45
  117. package/services/chain-service/types.d.ts +1 -0
  118. package/services/event-service/index.js +5 -1
  119. package/services/event-service/types.d.ts +5 -9
  120. package/services/event-service/types.js +4 -1
  121. package/services/history-service/index.d.ts +28 -7
  122. package/services/history-service/index.js +101 -50
  123. package/services/history-service/subsquid-multi-chain-history.js +16 -12
  124. package/services/keyring-service/index.d.ts +4 -2
  125. package/services/keyring-service/index.js +11 -13
  126. package/services/migration-service/scripts/MigrateImportedToken.js +2 -1
  127. package/services/price-service/coingecko.js +0 -1
  128. package/services/price-service/index.d.ts +22 -1
  129. package/services/price-service/index.js +71 -24
  130. package/services/request-service/handler/AuthRequestHandler.d.ts +3 -1
  131. package/services/request-service/handler/AuthRequestHandler.js +13 -7
  132. package/services/request-service/handler/EvmRequestHandler.js +8 -12
  133. package/services/request-service/index.d.ts +3 -1
  134. package/services/request-service/index.js +14 -5
  135. package/services/storage-service/DatabaseService.d.ts +2 -0
  136. package/services/storage-service/DatabaseService.js +66 -34
  137. package/services/storage-service/db-stores/Nft.d.ts +2 -2
  138. package/services/storage-service/db-stores/Nft.js +7 -14
  139. package/services/storage-service/db-stores/Transaction.d.ts +2 -0
  140. package/services/storage-service/db-stores/Transaction.js +6 -10
  141. package/services/transaction-service/event-parser/index.js +21 -49
  142. package/services/transaction-service/index.d.ts +2 -0
  143. package/services/transaction-service/index.js +86 -32
  144. package/services/transaction-service/types.d.ts +2 -0
  145. package/services/transaction-service/utils.js +10 -8
  146. package/utils/address.d.ts +3 -0
  147. package/utils/address.js +8 -1
  148. package/utils/index.d.ts +2 -2
  149. package/utils/index.js +7 -13
  150. package/utils/promise.d.ts +6 -0
  151. package/utils/promise.js +20 -0
@@ -1,13 +1,86 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { StakingStatus, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
5
- import { getBondedValidators, getParaCurrentInflation, isUnstakeAll, parseIdentity } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
4
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
+ import { BasicTxErrorType, StakingStatus, StakingTxErrorType, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
6
+ import { getBondedValidators, getParaCurrentInflation, getStakingStatusByNominations, isUnstakeAll, parseIdentity } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
7
  import { _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
7
8
  import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
8
- import { parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
9
+ import { isSameAddress, parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
9
10
  import { BN, BN_ZERO } from '@polkadot/util';
10
11
  import { isEthereumAddress } from '@polkadot/util-crypto';
12
+ export function validateParaChainUnbondingCondition(amount, nominatorMetadata, chainStakingMetadata, selectedCollator) {
13
+ const errors = [];
14
+ let targetNomination;
15
+ for (const nomination of nominatorMetadata.nominations) {
16
+ if (isSameAddress(nomination.validatorAddress, selectedCollator)) {
17
+ targetNomination = nomination;
18
+ break;
19
+ }
20
+ }
21
+ if (!targetNomination) {
22
+ errors.push(new TransactionError(BasicTxErrorType.INTERNAL_ERROR));
23
+ return errors;
24
+ }
25
+ const bnActiveStake = new BN(targetNomination.activeStake);
26
+ const bnRemainingStake = bnActiveStake.sub(new BN(amount));
27
+ const bnChainMinStake = new BN(chainStakingMetadata.minStake || '0');
28
+ const bnCollatorMinStake = new BN(targetNomination.validatorMinStake || '0');
29
+ const bnMinStake = bnCollatorMinStake > bnChainMinStake ? bnCollatorMinStake : bnChainMinStake;
30
+ if (targetNomination.hasUnstaking) {
31
+ errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
32
+ }
33
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(bnMinStake))) {
34
+ errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
35
+ }
36
+ return errors;
37
+ }
38
+ export function validateParaChainBondingCondition(chainInfo, amount, selectedCollators, address, chainStakingMetadata, nominatorMetadata) {
39
+ const errors = [];
40
+ const selectedCollator = selectedCollators[0];
41
+ let bnTotalStake = new BN(amount);
42
+ const bnChainMinStake = new BN(chainStakingMetadata.minStake || '0');
43
+ const bnCollatorMinStake = new BN(selectedCollator.minBond || '0');
44
+ const bnMinStake = bnCollatorMinStake > bnChainMinStake ? bnCollatorMinStake : bnChainMinStake;
45
+ if (!nominatorMetadata) {
46
+ if (!bnTotalStake.gte(bnMinStake)) {
47
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
48
+ }
49
+ return errors;
50
+ }
51
+ const {
52
+ bondedValidators
53
+ } = getBondedValidators(nominatorMetadata.nominations);
54
+ const parsedSelectedCollatorAddress = reformatAddress(selectedCollator.address, 0);
55
+ if (!bondedValidators.includes(parsedSelectedCollatorAddress)) {
56
+ // new delegation
57
+ if (!bnTotalStake.gte(bnMinStake)) {
58
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
59
+ }
60
+ const delegationCount = nominatorMetadata.nominations.length + 1;
61
+ if (delegationCount > chainStakingMetadata.maxValidatorPerNominator) {
62
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
63
+ }
64
+ } else {
65
+ let currentDelegationAmount = '0';
66
+ let hasUnstaking = false;
67
+ for (const delegation of nominatorMetadata.nominations) {
68
+ if (reformatAddress(delegation.validatorAddress, 0) === parsedSelectedCollatorAddress) {
69
+ currentDelegationAmount = delegation.activeStake;
70
+ hasUnstaking = !!delegation.hasUnstaking && delegation.hasUnstaking;
71
+ break;
72
+ }
73
+ }
74
+ bnTotalStake = bnTotalStake.add(new BN(currentDelegationAmount));
75
+ if (!bnTotalStake.gte(bnMinStake)) {
76
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
77
+ }
78
+ if (hasUnstaking) {
79
+ errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
80
+ }
81
+ }
82
+ return errors;
83
+ }
11
84
  export async function getParaChainStakingMetadata(chain, substrateApi) {
12
85
  const chainApi = await substrateApi.isReady;
13
86
  const _round = (await chainApi.api.query.parachainStaking.round()).toHuman();
@@ -61,13 +134,16 @@ export async function getParaChainNominatorMetadata(chainInfo, address, substrat
61
134
  }
62
135
  let bnTotalActiveStake = BN_ZERO;
63
136
  await Promise.all(delegatorState.delegations.map(async delegation => {
64
- const [_delegationScheduledRequests, _identity, _roundInfo] = await Promise.all([chainApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), chainApi.api.query.identity.identityOf(delegation.owner), chainApi.api.query.parachainStaking.round()]);
137
+ const [_delegationScheduledRequests, _identity, _roundInfo, _collatorInfo] = await Promise.all([chainApi.api.query.parachainStaking.delegationScheduledRequests(delegation.owner), chainApi.api.query.identity.identityOf(delegation.owner), chainApi.api.query.parachainStaking.round(), chainApi.api.query.parachainStaking.candidateInfo(delegation.owner)]);
138
+ const rawCollatorInfo = _collatorInfo.toHuman();
139
+ const minDelegation = (rawCollatorInfo === null || rawCollatorInfo === void 0 ? void 0 : rawCollatorInfo.lowestTopDelegationAmount).replaceAll(',', '');
65
140
  const identityInfo = _identity.toHuman();
66
141
  const roundInfo = _roundInfo.toPrimitive();
67
142
  const delegationScheduledRequests = _delegationScheduledRequests.toPrimitive();
68
143
  const currentRound = roundInfo.current;
69
144
  const identity = parseIdentity(identityInfo);
70
145
  let hasUnstaking = false;
146
+ let delegationStatus = StakingStatus.NOT_EARNING;
71
147
 
72
148
  // parse unstaking info
73
149
  if (delegationScheduledRequests) {
@@ -94,10 +170,13 @@ export async function getParaChainNominatorMetadata(chainInfo, address, substrat
94
170
  const bnStake = new BN(delegation.amount);
95
171
  const bnUnstakeBalance = unstakingMap[delegation.owner] ? new BN(unstakingMap[delegation.owner].claimable) : BN_ZERO;
96
172
  const bnActiveStake = bnStake.sub(bnUnstakeBalance);
173
+ if (bnActiveStake.gt(BN_ZERO) && bnActiveStake.gte(new BN(minDelegation))) {
174
+ delegationStatus = StakingStatus.EARNING_REWARD;
175
+ }
97
176
  bnTotalActiveStake = bnTotalActiveStake.add(bnActiveStake);
98
177
  nominationList.push({
99
178
  chain,
100
- status: StakingStatus.NOT_EARNING,
179
+ status: delegationStatus,
101
180
  validatorAddress: delegation.owner,
102
181
  validatorIdentity: identity,
103
182
  activeStake: bnActiveStake.toString(),
@@ -109,9 +188,11 @@ export async function getParaChainNominatorMetadata(chainInfo, address, substrat
109
188
  const collatorInfo = _collatorInfo.toPrimitive();
110
189
  nomination.validatorMinStake = collatorInfo.lowestTopDelegationAmount.toString();
111
190
  }));
191
+ const stakingStatus = getStakingStatusByNominations(bnTotalActiveStake, nominationList);
112
192
  return {
113
193
  chain,
114
194
  type: StakingType.NOMINATED,
195
+ status: stakingStatus,
115
196
  address: address,
116
197
  activeStake: bnTotalActiveStake.toString(),
117
198
  nominations: nominationList,
@@ -1,4 +1,5 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
2
3
  import { ChainStakingMetadata, NominationPoolInfo, NominatorMetadata, UnstakingInfo, ValidatorInfo } from '@subwallet/extension-base/background/KoniTypes';
3
4
  import { _SubstrateApi } from '@subwallet/extension-base/services/chain-service/types';
4
5
  export interface PalletStakingNominations {
@@ -17,7 +18,10 @@ export interface PalletStakingStakingLedger {
17
18
  unlocking: UnlockingChunk[];
18
19
  claimedRewards: number[];
19
20
  }
20
- export declare function getRelayChainStakingMetadata(chain: string, substrateApi: _SubstrateApi): Promise<ChainStakingMetadata>;
21
+ export declare function validateRelayUnbondingCondition(amount: string, chainStakingMetadata: ChainStakingMetadata, nominatorMetadata: NominatorMetadata): TransactionError[];
22
+ export declare function validatePoolBondingCondition(chainInfo: _ChainInfo, amount: string, selectedPool: NominationPoolInfo, address: string, chainStakingMetadata: ChainStakingMetadata, nominatorMetadata?: NominatorMetadata): TransactionError[];
23
+ export declare function validateRelayBondingCondition(chainInfo: _ChainInfo, amount: string, selectedValidators: ValidatorInfo[], address: string, chainStakingMetadata: ChainStakingMetadata, nominatorMetadata?: NominatorMetadata): TransactionError[];
24
+ export declare function getRelayChainStakingMetadata(chainInfo: _ChainInfo, substrateApi: _SubstrateApi): Promise<ChainStakingMetadata>;
21
25
  export declare function getRelayChainNominatorMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi): Promise<NominatorMetadata | undefined>;
22
26
  export declare function getRelayChainPoolMemberMetadata(chainInfo: _ChainInfo, address: string, substrateApi: _SubstrateApi): Promise<NominatorMetadata | undefined>;
23
27
  export declare function getRelayValidatorsInfo(chain: string, substrateApi: _SubstrateApi, decimals: number, chainStakingMetadata: ChainStakingMetadata): Promise<ValidatorInfo[]>;
@@ -1,23 +1,102 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { StakingStatus, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
5
+ import { StakingStatus, StakingTxErrorType, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
5
6
  import { calculateAlephZeroValidatorReturn, calculateChainStakedReturn, calculateInflation, calculateValidatorStakedReturn, getCommission, parseIdentity, parsePoolStashAddress, transformPoolName } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
6
7
  import { _STAKING_CHAIN_GROUP, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
7
- import { _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils';
8
+ import { _getChainNativeTokenBasicInfo, _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils';
8
9
  import { reformatAddress } from '@subwallet/extension-base/utils';
9
10
  import { BN, BN_ZERO } from '@polkadot/util';
10
11
  import { isEthereumAddress } from '@polkadot/util-crypto';
11
- export async function getRelayChainStakingMetadata(chain, substrateApi) {
12
- var _chainApi$api$query$a, _chainApi$api$query, _chainApi$api$query$n;
12
+ export function validateRelayUnbondingCondition(amount, chainStakingMetadata, nominatorMetadata) {
13
+ const errors = [];
14
+ const bnActiveStake = new BN(nominatorMetadata.activeStake);
15
+ const bnRemainingStake = bnActiveStake.sub(new BN(amount));
16
+ const minStake = new BN(chainStakingMetadata.minPoolBonding || '0');
17
+ if (!(bnRemainingStake.isZero() || bnRemainingStake.gte(minStake))) {
18
+ errors.push(new TransactionError(StakingTxErrorType.INVALID_ACTIVE_STAKE));
19
+ }
20
+ if (nominatorMetadata.unstakings.length > chainStakingMetadata.maxWithdrawalRequestPerValidator) {
21
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_UNSTAKING));
22
+ }
23
+ return errors;
24
+ }
25
+ export function validatePoolBondingCondition(chainInfo, amount, selectedPool, address, chainStakingMetadata, nominatorMetadata) {
26
+ // cannot stake when unstake all
27
+ // amount >= min stake
28
+ const errors = [];
29
+ let bnTotalStake = new BN(amount);
30
+ const bnMinStake = new BN(chainStakingMetadata.minPoolBonding || '0');
31
+ if (selectedPool.state !== 'Open') {
32
+ errors.push(new TransactionError(StakingTxErrorType.INACTIVE_NOMINATION_POOL));
33
+ }
34
+ if (nominatorMetadata) {
35
+ const bnCurrentActiveStake = new BN(nominatorMetadata.activeStake);
36
+ bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
37
+ if (!bnCurrentActiveStake.gt(BN_ZERO)) {
38
+ errors.push(new TransactionError(StakingTxErrorType.EXIST_UNSTAKING_REQUEST));
39
+ }
40
+ }
41
+ if (!bnTotalStake.gte(bnMinStake)) {
42
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
43
+ }
44
+ return errors;
45
+ }
46
+ export function validateRelayBondingCondition(chainInfo, amount, selectedValidators, address, chainStakingMetadata, nominatorMetadata) {
47
+ const errors = [];
48
+ let bnTotalStake = new BN(amount);
49
+ const bnMinStake = new BN(chainStakingMetadata.minStake);
50
+ if (!nominatorMetadata) {
51
+ if (!bnTotalStake.gte(bnMinStake)) {
52
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
53
+ }
54
+ if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
55
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
56
+ }
57
+ return errors;
58
+ }
59
+ const bnCurrentActiveStake = new BN(nominatorMetadata.activeStake);
60
+ bnTotalStake = bnTotalStake.add(bnCurrentActiveStake);
61
+ if (!bnTotalStake.gte(bnMinStake)) {
62
+ errors.push(new TransactionError(StakingTxErrorType.NOT_ENOUGH_MIN_STAKE));
63
+ }
64
+ if (selectedValidators.length > chainStakingMetadata.maxValidatorPerNominator) {
65
+ errors.push(new TransactionError(StakingTxErrorType.EXCEED_MAX_NOMINATIONS));
66
+ }
67
+ return errors;
68
+ }
69
+ export async function getRelayChainStakingMetadata(chainInfo, substrateApi) {
70
+ var _chainApi$api$query$a, _chainApi$api$query, _chainApi$api$query$s, _chainApi$api$query2, _chainApi$api$query2$, _chainApi$api$query3, _chainApi$api$query3$;
71
+ const chain = chainInfo.slug;
72
+ const {
73
+ decimals
74
+ } = _getChainNativeTokenBasicInfo(chainInfo);
13
75
  const chainApi = await substrateApi.isReady;
14
76
  const _era = await chainApi.api.query.staking.currentEra();
15
77
  const currentEra = _era.toString();
16
78
  const maxNominations = chainApi.api.consts.staking.maxNominations.toString();
17
79
  const maxUnlockingChunks = chainApi.api.consts.staking.maxUnlockingChunks.toString();
18
80
  const unlockingEras = chainApi.api.consts.staking.bondingDuration.toString();
19
- const [_totalEraStake, _totalIssuance, _auctionCounter, _minimumActiveStake, _minPoolJoin] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.balances.totalIssuance(), (_chainApi$api$query$a = chainApi.api.query.auctions) === null || _chainApi$api$query$a === void 0 ? void 0 : _chainApi$api$query$a.auctionCounter(), chainApi.api.query.staking.minimumActiveStake(), (_chainApi$api$query = chainApi.api.query) === null || _chainApi$api$query === void 0 ? void 0 : (_chainApi$api$query$n = _chainApi$api$query.nominationPools) === null || _chainApi$api$query$n === void 0 ? void 0 : _chainApi$api$query$n.minJoinBond()]);
20
- const minStake = _minimumActiveStake.toString();
81
+ const [_totalEraStake, _totalIssuance, _auctionCounter, _minimumActiveStake, _minNominatorBond, _minPoolJoin, _eraStakers] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.balances.totalIssuance(), (_chainApi$api$query$a = chainApi.api.query.auctions) === null || _chainApi$api$query$a === void 0 ? void 0 : _chainApi$api$query$a.auctionCounter(), ((_chainApi$api$query = chainApi.api.query) === null || _chainApi$api$query === void 0 ? void 0 : (_chainApi$api$query$s = _chainApi$api$query.staking) === null || _chainApi$api$query$s === void 0 ? void 0 : _chainApi$api$query$s.minimumActiveStake) && ((_chainApi$api$query2 = chainApi.api.query) === null || _chainApi$api$query2 === void 0 ? void 0 : (_chainApi$api$query2$ = _chainApi$api$query2.staking) === null || _chainApi$api$query2$ === void 0 ? void 0 : _chainApi$api$query2$.minimumActiveStake()), chainApi.api.query.staking.minNominatorBond(), (_chainApi$api$query3 = chainApi.api.query) === null || _chainApi$api$query3 === void 0 ? void 0 : (_chainApi$api$query3$ = _chainApi$api$query3.nominationPools) === null || _chainApi$api$query3$ === void 0 ? void 0 : _chainApi$api$query3$.minJoinBond(), chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra))]);
82
+ const eraStakers = _eraStakers;
83
+ const nominatorList = [];
84
+ for (const item of eraStakers) {
85
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
86
+ const rawValidatorStat = item[1].toHuman();
87
+ const eraNominators = rawValidatorStat.others;
88
+ for (const nominator of eraNominators) {
89
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
90
+ if (!nominatorList.includes(nominator.who)) {
91
+ nominatorList.push(nominator.who);
92
+ }
93
+ }
94
+ }
95
+ const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
96
+ const minNominatorBond = _minNominatorBond.toString();
97
+ const bnMinActiveStake = new BN(minActiveStake);
98
+ const bnMinNominatorBond = new BN(minNominatorBond);
99
+ const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
21
100
  const minPoolJoin = (_minPoolJoin === null || _minPoolJoin === void 0 ? void 0 : _minPoolJoin.toString()) || undefined;
22
101
  const rawTotalEraStake = _totalEraStake.toString();
23
102
  const rawTotalIssuance = _totalIssuance.toString();
@@ -35,21 +114,30 @@ export async function getRelayChainStakingMetadata(chain, substrateApi) {
35
114
  expectedReturn,
36
115
  // in %, annually
37
116
  inflation,
38
- minStake,
117
+ minStake: minStake.toString(),
118
+ minPoolBonding: (10 ** decimals).toString(),
119
+ // default is 1
39
120
  maxValidatorPerNominator: parseInt(maxNominations),
40
121
  maxWithdrawalRequestPerValidator: parseInt(maxUnlockingChunks),
41
122
  allowCancelUnstaking: true,
42
123
  unstakingPeriod: unlockingPeriod,
43
- minJoinNominationPool: minPoolJoin
124
+ minJoinNominationPool: minPoolJoin,
125
+ nominatorCount: nominatorList.length
44
126
  };
45
127
  }
46
128
  export async function getRelayChainNominatorMetadata(chainInfo, address, substrateApi) {
129
+ var _chainApi$api$query4, _chainApi$api$query4$, _chainApi$api$query5, _chainApi$api$query5$, _chainApi$api$query6, _chainApi$api$query6$, _chainApi$api$query7, _chainApi$api$query7$, _chainApi$api$query8, _chainApi$api$query8$, _chainApi$api$query9, _chainApi$api$query9$, _chainApi$api$query10, _chainApi$api$query11;
47
130
  if (isEthereumAddress(address)) {
48
131
  return;
49
132
  }
50
133
  const chain = chainInfo.slug;
51
134
  const chainApi = await substrateApi.isReady;
52
- const [_ledger, _nominations, _currentEra, _bonded] = await Promise.all([chainApi.api.query.staking.ledger(address), chainApi.api.query.staking.nominators(address), chainApi.api.query.staking.currentEra(), chainApi.api.query.staking.bonded(address)]);
135
+ const [_ledger, _nominations, _currentEra, _bonded, _minimumActiveStake, _minNominatorBond] = await Promise.all([(_chainApi$api$query4 = chainApi.api.query) === null || _chainApi$api$query4 === void 0 ? void 0 : (_chainApi$api$query4$ = _chainApi$api$query4.staking) === null || _chainApi$api$query4$ === void 0 ? void 0 : _chainApi$api$query4$.ledger(address), (_chainApi$api$query5 = chainApi.api.query) === null || _chainApi$api$query5 === void 0 ? void 0 : (_chainApi$api$query5$ = _chainApi$api$query5.staking) === null || _chainApi$api$query5$ === void 0 ? void 0 : _chainApi$api$query5$.nominators(address), (_chainApi$api$query6 = chainApi.api.query) === null || _chainApi$api$query6 === void 0 ? void 0 : (_chainApi$api$query6$ = _chainApi$api$query6.staking) === null || _chainApi$api$query6$ === void 0 ? void 0 : _chainApi$api$query6$.currentEra(), (_chainApi$api$query7 = chainApi.api.query) === null || _chainApi$api$query7 === void 0 ? void 0 : (_chainApi$api$query7$ = _chainApi$api$query7.staking) === null || _chainApi$api$query7$ === void 0 ? void 0 : _chainApi$api$query7$.bonded(address), ((_chainApi$api$query8 = chainApi.api.query) === null || _chainApi$api$query8 === void 0 ? void 0 : (_chainApi$api$query8$ = _chainApi$api$query8.staking) === null || _chainApi$api$query8$ === void 0 ? void 0 : _chainApi$api$query8$.minimumActiveStake) && ((_chainApi$api$query9 = chainApi.api.query) === null || _chainApi$api$query9 === void 0 ? void 0 : (_chainApi$api$query9$ = _chainApi$api$query9.staking) === null || _chainApi$api$query9$ === void 0 ? void 0 : _chainApi$api$query9$.minimumActiveStake()), (_chainApi$api$query10 = chainApi.api.query) === null || _chainApi$api$query10 === void 0 ? void 0 : (_chainApi$api$query11 = _chainApi$api$query10.staking) === null || _chainApi$api$query11 === void 0 ? void 0 : _chainApi$api$query11.minNominatorBond()]);
136
+ const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
137
+ const minNominatorBond = _minNominatorBond.toString();
138
+ const bnMinActiveStake = new BN(minActiveStake);
139
+ const bnMinNominatorBond = new BN(minNominatorBond);
140
+ const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
53
141
  const _maxNominatorRewardedPerValidator = chainApi.api.consts.staking.maxNominatorRewardedPerValidator.toString();
54
142
  const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
55
143
  const ledger = _ledger.toPrimitive();
@@ -59,7 +147,6 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
59
147
  if (!ledger) {
60
148
  return;
61
149
  }
62
- let stakingStatus = StakingStatus.NOT_EARNING;
63
150
  const activeStake = ledger.active.toString();
64
151
  const nominationList = [];
65
152
  const unstakingList = [];
@@ -74,7 +161,10 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
74
161
  const topNominators = eraStaker.others.map(nominator => {
75
162
  return nominator.who;
76
163
  });
77
- if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
164
+ if (!topNominators.includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
165
+ // if nominator has target but not in nominator list
166
+ nominationStatus = StakingStatus.WAITING;
167
+ } else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
78
168
  // if address in top nominators
79
169
  nominationStatus = StakingStatus.EARNING_REWARD;
80
170
  }
@@ -88,11 +178,20 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
88
178
  }));
89
179
  }
90
180
 
91
- for (const nomination of nominationList) {
92
- if (nomination.status === StakingStatus.EARNING_REWARD) {
93
- // only need 1 earning nomination to count
94
- stakingStatus = StakingStatus.EARNING_REWARD;
95
- break;
181
+ let stakingStatus = StakingStatus.NOT_EARNING;
182
+ const bnActiveStake = new BN(activeStake);
183
+ let waitingNominationCount = 0;
184
+ if (bnActiveStake.gte(minStake)) {
185
+ for (const nomination of nominationList) {
186
+ if (nomination.status === StakingStatus.EARNING_REWARD) {
187
+ // only need 1 earning nomination to count
188
+ stakingStatus = StakingStatus.EARNING_REWARD;
189
+ } else if (nomination.status === StakingStatus.WAITING) {
190
+ waitingNominationCount += 1;
191
+ }
192
+ }
193
+ if (waitingNominationCount === nominationList.length) {
194
+ stakingStatus = StakingStatus.WAITING;
96
195
  }
97
196
  }
98
197
  ledger.unlocking.forEach(unlockingChunk => {
@@ -170,6 +269,10 @@ export async function getRelayChainPoolMemberMetadata(chainInfo, address, substr
170
269
  waitingTime: waitingTime > 0 ? waitingTime : 0
171
270
  });
172
271
  });
272
+ const bnActiveStake = new BN(poolMemberInfo.points.toString());
273
+ if (!bnActiveStake.gt(BN_ZERO)) {
274
+ stakingStatus = StakingStatus.NOT_EARNING;
275
+ }
173
276
  return {
174
277
  chain: chainInfo.slug,
175
278
  type: StakingType.POOLED,
@@ -230,9 +333,9 @@ export async function getRelayValidatorsInfo(chain, substrateApi, decimals, chai
230
333
  }
231
334
  const extraInfoMap = {};
232
335
  await Promise.all(allValidators.map(async address => {
233
- var _chainApi$api$query2, _chainApi$api$query2$, _identityInfo$judgeme;
336
+ var _chainApi$api$query12, _chainApi$api$query13, _identityInfo$judgeme;
234
337
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
235
- const [_commissionInfo, _identityInfo] = await Promise.all([chainApi.api.query.staking.validators(address), (_chainApi$api$query2 = chainApi.api.query) === null || _chainApi$api$query2 === void 0 ? void 0 : (_chainApi$api$query2$ = _chainApi$api$query2.identity) === null || _chainApi$api$query2$ === void 0 ? void 0 : _chainApi$api$query2$.identityOf(address)]);
338
+ const [_commissionInfo, _identityInfo] = await Promise.all([chainApi.api.query.staking.validators(address), (_chainApi$api$query12 = chainApi.api.query) === null || _chainApi$api$query12 === void 0 ? void 0 : (_chainApi$api$query13 = _chainApi$api$query12.identity) === null || _chainApi$api$query13 === void 0 ? void 0 : _chainApi$api$query13.identityOf(address)]);
236
339
  const commissionInfo = _commissionInfo.toHuman();
237
340
  const identityInfo = _identityInfo ? _identityInfo.toHuman() : null;
238
341
  let identity;
@@ -1,5 +1,5 @@
1
1
  /// <reference types="bn.js" />
2
- import { NominationInfo, NominatorMetadata, StakingType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
2
+ import { NominationInfo, NominatorMetadata, StakingStatus, StakingType, UnstakingInfo } from '@subwallet/extension-base/background/KoniTypes';
3
3
  import { _SubstrateInflationParams } from '@subwallet/extension-base/services/chain-service/constants';
4
4
  import { ApiPromise } from '@polkadot/api';
5
5
  import { BN } from '@polkadot/util';
@@ -149,6 +149,7 @@ export declare enum StakingAction {
149
149
  CANCEL_UNSTAKE = "CANCEL_UNSTAKE"
150
150
  }
151
151
  export declare function getStakingAvailableActionsByChain(chain: string, type: StakingType): StakingAction[];
152
- export declare function getStakingAvailableActionsByNominator(nominatorMetadata: NominatorMetadata): StakingAction[];
152
+ export declare function getStakingAvailableActionsByNominator(nominatorMetadata: NominatorMetadata, unclaimedReward?: string): StakingAction[];
153
153
  export declare function isActionFromValidator(stakingType: StakingType, chain: string): boolean;
154
154
  export declare function getWithdrawalInfo(nominatorMetadata: NominatorMetadata): UnstakingInfo | undefined;
155
+ export declare function getStakingStatusByNominations(bnTotalActiveStake: BN, nominationList: NominationInfo[]): StakingStatus;
@@ -1,7 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
4
+ import { StakingStatus, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
5
5
  import { _KNOWN_CHAIN_INFLATION_PARAMS, _STAKING_CHAIN_GROUP, _SUBSTRATE_DEFAULT_INFLATION_PARAMS } from '@subwallet/extension-base/services/chain-service/constants';
6
6
  import { parseRawNumber, reformatAddress } from '@subwallet/extension-base/utils';
7
7
  import { BN, BN_BILLION, BN_HUNDRED, BN_MILLION, BN_THOUSAND, BN_ZERO, bnToU8a, stringToU8a, u8aConcat } from '@polkadot/util';
@@ -125,11 +125,8 @@ export function getBondedValidators(nominations) {
125
125
  const bondedValidators = [];
126
126
  let nominationCount = 0;
127
127
  for (const nomination of nominations) {
128
- const bnActiveStake = new BN(nomination.activeStake);
129
- if (bnActiveStake.gt(BN_ZERO)) {
130
- nominationCount += 1;
131
- bondedValidators.push(reformatAddress(nomination.validatorAddress, 0));
132
- }
128
+ nominationCount += 1;
129
+ bondedValidators.push(reformatAddress(nomination.validatorAddress, 0));
133
130
  }
134
131
  return {
135
132
  nominationCount,
@@ -171,13 +168,15 @@ export function getStakingAvailableActionsByChain(chain, type) {
171
168
  }
172
169
  return [StakingAction.STAKE, StakingAction.UNSTAKE, StakingAction.WITHDRAW, StakingAction.CANCEL_UNSTAKE];
173
170
  }
174
- export function getStakingAvailableActionsByNominator(nominatorMetadata) {
171
+ export function getStakingAvailableActionsByNominator(nominatorMetadata, unclaimedReward) {
175
172
  const result = [StakingAction.STAKE];
176
173
  const bnActiveStake = new BN(nominatorMetadata.activeStake);
177
174
  if (nominatorMetadata.activeStake && bnActiveStake.gt(BN_ZERO)) {
178
175
  result.push(StakingAction.UNSTAKE);
179
- const isChainAllowClaimReward = _STAKING_CHAIN_GROUP.amplitude.includes(nominatorMetadata.chain) || _STAKING_CHAIN_GROUP.astar.includes(nominatorMetadata.chain);
180
- if (nominatorMetadata.type === StakingType.POOLED || isChainAllowClaimReward) {
176
+ const isAstarNetwork = _STAKING_CHAIN_GROUP.astar.includes(nominatorMetadata.chain);
177
+ const isAmplitudeNetwork = _STAKING_CHAIN_GROUP.amplitude.includes(nominatorMetadata.chain);
178
+ const bnUnclaimedReward = new BN(unclaimedReward || '0');
179
+ if ((nominatorMetadata.type === StakingType.POOLED || isAmplitudeNetwork) && bnUnclaimedReward.gt(BN_ZERO) || isAstarNetwork) {
181
180
  result.push(StakingAction.CLAIM_REWARD);
182
181
  }
183
182
  }
@@ -219,4 +218,23 @@ export function getWithdrawalInfo(nominatorMetadata) {
219
218
  }
220
219
  }
221
220
  return result;
221
+ }
222
+ export function getStakingStatusByNominations(bnTotalActiveStake, nominationList) {
223
+ let stakingStatus = StakingStatus.EARNING_REWARD;
224
+ if (bnTotalActiveStake.isZero()) {
225
+ stakingStatus = StakingStatus.NOT_EARNING;
226
+ } else {
227
+ let invalidDelegationCount = 0;
228
+ for (const nomination of nominationList) {
229
+ if (nomination.status === StakingStatus.NOT_EARNING) {
230
+ invalidDelegationCount += 1;
231
+ }
232
+ }
233
+ if (invalidDelegationCount > 0 && invalidDelegationCount < nominationList.length) {
234
+ stakingStatus = StakingStatus.PARTIALLY_EARNING;
235
+ } else if (invalidDelegationCount === nominationList.length) {
236
+ stakingStatus = StakingStatus.NOT_EARNING;
237
+ }
238
+ }
239
+ return stakingStatus;
222
240
  }
@@ -1,6 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
+ import { getWasmContractGasLimit } from '@subwallet/extension-base/koni/api/tokens/wasm/utils';
4
5
  import { _PSP22_ABI, _PSP34_ABI } from '@subwallet/extension-base/services/chain-service/helper';
5
6
  import { ContractPromise } from '@polkadot/api-contract';
6
7
  export function getPSP22ContractPromise(apiPromise, contractAddress) {
@@ -14,10 +15,10 @@ export async function getPSP34TransferExtrinsic(networkKey, substrateApi, sender
14
15
  const onChainOption = params.onChainOption;
15
16
  try {
16
17
  const contractPromise = getPSP34ContractPromise(substrateApi.api, contractAddress);
17
- const transferQuery = await contractPromise.query['psp34::transfer'](senderAddress, {
18
- gasLimit: -1
19
- }, recipientAddress, onChainOption, {});
20
- const gasLimit = transferQuery.gasRequired.toString();
18
+ // @ts-ignore
19
+ const gasLimit = await getWasmContractGasLimit(substrateApi.api, senderAddress, 'psp34::transfer', contractPromise, {}, [recipientAddress, onChainOption, {}]);
20
+
21
+ // @ts-ignore
21
22
  return contractPromise.tx['psp34::transfer']({
22
23
  gasLimit
23
24
  }, recipientAddress, onChainOption, {});
@@ -0,0 +1,6 @@
1
+ import { ApiPromise } from '@polkadot/api';
2
+ import { ContractPromise } from '@polkadot/api-contract';
3
+ import { WeightV2 } from '@polkadot/types/interfaces';
4
+ import { Codec } from '@polkadot/types/types';
5
+ export declare function getWasmContractGasLimit(api: ApiPromise, callerAddress: string, message: string, contract: ContractPromise, options?: {}, args?: never[]): Promise<Codec>;
6
+ export declare function getDefaultWeightV2(apiPromise: ApiPromise, isFallback?: boolean): WeightV2;
@@ -0,0 +1,54 @@
1
+ // Copyright 2019-2022 @subwallet/extension-base
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ import { BN } from '@polkadot/util';
5
+ const MAX_CALL_WEIGHT = '5000000000000';
6
+ const DEFAULT_REF_TIME = '1000000000000';
7
+ const toContractAbiMessage = (contractPromise, message) => {
8
+ const value = contractPromise.abi.messages.find(m => m.method === message);
9
+ if (!value) {
10
+ const messages = contractPromise === null || contractPromise === void 0 ? void 0 : contractPromise.abi.messages.map(m => m.method).join(', ');
11
+ const error = `"${message}" not found in metadata.spec.messages: [${messages}]`;
12
+ console.error(error);
13
+ return {
14
+ ok: false,
15
+ error
16
+ };
17
+ }
18
+ return {
19
+ ok: true,
20
+ value
21
+ };
22
+ };
23
+ export async function getWasmContractGasLimit(api, callerAddress, message, contract, options = {}, args = []) {
24
+ try {
25
+ var _abiMessage$value;
26
+ const abiMessage = toContractAbiMessage(contract, message);
27
+ if (!abiMessage.ok) {
28
+ return getDefaultWeightV2(api, true);
29
+ }
30
+
31
+ // @ts-ignore
32
+ const {
33
+ gasLimit,
34
+ storageDepositLimit,
35
+ value
36
+ } = options;
37
+
38
+ // @ts-ignore
39
+ const {
40
+ gasRequired
41
+ } = await api.call.contractsApi.call(callerAddress, contract.address, value !== null && value !== void 0 ? value : new BN(0), gasLimit !== null && gasLimit !== void 0 ? gasLimit : null, storageDepositLimit !== null && storageDepositLimit !== void 0 ? storageDepositLimit : null, abiMessage === null || abiMessage === void 0 ? void 0 : (_abiMessage$value = abiMessage.value) === null || _abiMessage$value === void 0 ? void 0 : _abiMessage$value.toU8a(args));
42
+ return gasRequired;
43
+ } catch {
44
+ return getDefaultWeightV2(api, true);
45
+ }
46
+ }
47
+ export function getDefaultWeightV2(apiPromise, isFallback) {
48
+ const proofSize = isFallback ? 3407872 : MAX_CALL_WEIGHT; // TODO: handle error better
49
+ const refTime = isFallback ? 32490000000 : DEFAULT_REF_TIME;
50
+ return apiPromise.registry.createType('WeightV2', {
51
+ refTime,
52
+ proofSize
53
+ });
54
+ }
@@ -1,7 +1,7 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { FOUR_INSTRUCTIONS_WEIGHT, getBeneficiary, NETWORK_USE_UNLIMITED_WEIGHT, POLKADOT_UNLIMITED_WEIGHT } from '@subwallet/extension-base/koni/api/xcm/utils';
4
+ import { getBeneficiary, getDestWeight } from '@subwallet/extension-base/koni/api/xcm/utils';
5
5
  import { _getSubstrateParaId, _getXcmAssetMultilocation, _isSubstrateParaChain, _isSubstrateRelayChain } from '@subwallet/extension-base/services/chain-service/utils';
6
6
  function getDestinationChainLocation(destinationChainInfo) {
7
7
  if (_isSubstrateParaChain(destinationChainInfo)) {
@@ -36,7 +36,7 @@ function getAssetLocation(tokenInfo, sendingValue) {
36
36
  };
37
37
  }
38
38
  export function getExtrinsicByPolkadotXcmPallet(tokenInfo, originChainInfo, destinationChainInfo, recipientAddress, value, api) {
39
- const weightParam = NETWORK_USE_UNLIMITED_WEIGHT.includes(originChainInfo.slug) ? POLKADOT_UNLIMITED_WEIGHT : FOUR_INSTRUCTIONS_WEIGHT;
39
+ const weightParam = getDestWeight();
40
40
  const beneficiary = getBeneficiary(originChainInfo, destinationChainInfo, recipientAddress);
41
41
  const destination = getDestinationChainLocation(destinationChainInfo);
42
42
  const assetLocation = getAssetLocation(tokenInfo, value);
@@ -1,16 +1,15 @@
1
1
  import { _ChainInfo } from '@subwallet/chain-list/types';
2
- export declare const FOUR_INSTRUCTIONS_WEIGHT: {
2
+ export declare const FOUR_INSTRUCTIONS_WEIGHT = 5000000000;
3
+ export declare const FOUR_INSTRUCTIONS_LIMITED_WEIGHT: {
3
4
  Limited: number;
4
5
  };
5
- export declare const POLKADOT_LIMITED_WEIGHT = 1000000000;
6
- export declare const POLKADOT_UNLIMITED_WEIGHT = "Unlimited";
7
6
  export declare function getReceiverLocation(originChainInfo: _ChainInfo, destinationChainInfo: _ChainInfo, toAddress: string): Record<string, any>;
8
- export declare function getBeneficiary(originChainInfo: _ChainInfo, destinationChainInfo: _ChainInfo, recipientAddress: string): {
9
- V1: {
7
+ export declare function getBeneficiary(originChainInfo: _ChainInfo, destinationChainInfo: _ChainInfo, recipientAddress: string, version?: string): {
8
+ [x: string]: {
10
9
  parents: number;
11
10
  interior: {
12
11
  X1: Record<string, any>;
13
12
  };
14
13
  };
15
14
  };
16
- export declare const NETWORK_USE_UNLIMITED_WEIGHT: string[];
15
+ export declare function getDestWeight(): string;
@@ -2,20 +2,19 @@
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
4
  import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list';
5
- import { _getChainSubstrateAddressPrefix, _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
5
+ import { _isChainEvmCompatible } from '@subwallet/extension-base/services/chain-service/utils';
6
6
  import { decodeAddress, evmToAddress } from '@polkadot/util-crypto';
7
- export const FOUR_INSTRUCTIONS_WEIGHT = {
7
+ export const FOUR_INSTRUCTIONS_WEIGHT = 5000000000;
8
+ export const FOUR_INSTRUCTIONS_LIMITED_WEIGHT = {
8
9
  Limited: 5000000000
9
10
  };
10
- export const POLKADOT_LIMITED_WEIGHT = 1000000000;
11
- export const POLKADOT_UNLIMITED_WEIGHT = 'Unlimited';
12
11
 
13
12
  // get multilocation for destination chain from a parachain
14
13
 
15
14
  export function getReceiverLocation(originChainInfo, destinationChainInfo, toAddress) {
16
- // @ts-ignore
17
- if (destinationChainInfo.slug === COMMON_CHAIN_SLUGS.ASTAR_EVM || destinationChainInfo.slug === 'astarEvm') {
18
- const ss58Address = evmToAddress(toAddress, _getChainSubstrateAddressPrefix(destinationChainInfo));
15
+ if (destinationChainInfo.slug === COMMON_CHAIN_SLUGS.ASTAR_EVM) {
16
+ const ss58Address = evmToAddress(toAddress, 2006); // TODO: shouldn't pass addressPrefix directly
17
+
19
18
  return {
20
19
  AccountId32: {
21
20
  network: 'Any',
@@ -38,10 +37,10 @@ export function getReceiverLocation(originChainInfo, destinationChainInfo, toAdd
38
37
  }
39
38
  };
40
39
  }
41
- export function getBeneficiary(originChainInfo, destinationChainInfo, recipientAddress) {
40
+ export function getBeneficiary(originChainInfo, destinationChainInfo, recipientAddress, version = 'V1') {
42
41
  const receiverLocation = getReceiverLocation(originChainInfo, destinationChainInfo, recipientAddress);
43
42
  return {
44
- V1: {
43
+ [version]: {
45
44
  parents: 0,
46
45
  interior: {
47
46
  X1: receiverLocation
@@ -49,4 +48,10 @@ export function getBeneficiary(originChainInfo, destinationChainInfo, recipientA
49
48
  }
50
49
  };
51
50
  }
52
- export const NETWORK_USE_UNLIMITED_WEIGHT = ['acala', 'karura', 'statemint', 'moonriver'];
51
+ export function getDestWeight() {
52
+ return 'Unlimited';
53
+ // return api.tx.xTokens.transfer.meta.args[3].type.toString() ===
54
+ // 'XcmV2WeightLimit'
55
+ // ? 'Unlimited'
56
+ // : FOUR_INSTRUCTIONS_WEIGHT;
57
+ }