@subwallet/extension-base 1.1.32-0 → 1.1.33-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 (39) hide show
  1. package/background/KoniTypes.d.ts +2 -0
  2. package/background/KoniTypes.js +1 -0
  3. package/cjs/background/KoniTypes.js +1 -0
  4. package/cjs/koni/api/staking/bonding/amplitude.js +97 -63
  5. package/cjs/koni/api/staking/paraChain.js +31 -5
  6. package/cjs/koni/api/xcm/xTokens.js +1 -1
  7. package/cjs/koni/background/handlers/Tabs.js +19 -2
  8. package/cjs/packageInfo.js +1 -1
  9. package/cjs/services/campaign-service/index.js +19 -0
  10. package/cjs/services/chain-service/constants.js +5 -3
  11. package/cjs/services/history-service/index.js +12 -8
  12. package/cjs/services/storage-service/DatabaseService.js +3 -0
  13. package/cjs/services/storage-service/db-stores/Campaign.js +9 -3
  14. package/cjs/services/transaction-service/index.js +58 -13
  15. package/cjs/utils/fetchEvmChainInfo.js +20 -0
  16. package/cjs/utils/index.js +24 -0
  17. package/koni/api/staking/bonding/amplitude.d.ts +1 -1
  18. package/koni/api/staking/bonding/amplitude.js +98 -64
  19. package/koni/api/staking/bonding/utils.d.ts +4 -0
  20. package/koni/api/staking/paraChain.js +31 -5
  21. package/koni/api/xcm/xTokens.js +1 -1
  22. package/koni/background/handlers/Tabs.js +20 -3
  23. package/package.json +11 -6
  24. package/packageInfo.js +1 -1
  25. package/services/campaign-service/index.js +19 -0
  26. package/services/chain-service/constants.d.ts +1 -0
  27. package/services/chain-service/constants.js +5 -3
  28. package/services/event-service/types.d.ts +1 -0
  29. package/services/history-service/index.js +12 -8
  30. package/services/storage-service/DatabaseService.d.ts +1 -0
  31. package/services/storage-service/DatabaseService.js +3 -0
  32. package/services/storage-service/db-stores/Campaign.js +9 -3
  33. package/services/transaction-service/index.d.ts +1 -0
  34. package/services/transaction-service/index.js +45 -1
  35. package/services/transaction-service/types.d.ts +1 -0
  36. package/utils/fetchEvmChainInfo.d.ts +17 -0
  37. package/utils/fetchEvmChainInfo.js +14 -0
  38. package/utils/index.d.ts +2 -0
  39. package/utils/index.js +3 -1
@@ -392,6 +392,7 @@ export declare enum ExtrinsicStatus {
392
392
  SUCCESS = "success",
393
393
  FAIL = "fail",
394
394
  CANCELLED = "cancelled",
395
+ TIMEOUT = "timeout",
395
396
  UNKNOWN = "unknown"
396
397
  }
397
398
  export interface TxHistoryItem {
@@ -1553,6 +1554,7 @@ export interface BaseCampaignData {
1553
1554
  slug: string;
1554
1555
  campaignId: number;
1555
1556
  isDone: boolean;
1557
+ isArchive: boolean;
1556
1558
  type: CampaignDataType;
1557
1559
  data: Record<string, any>;
1558
1560
  buttons: CampaignButton[];
@@ -85,6 +85,7 @@ export let ExtrinsicStatus;
85
85
  ExtrinsicStatus["SUCCESS"] = "success";
86
86
  ExtrinsicStatus["FAIL"] = "fail";
87
87
  ExtrinsicStatus["CANCELLED"] = "cancelled";
88
+ ExtrinsicStatus["TIMEOUT"] = "timeout";
88
89
  ExtrinsicStatus["UNKNOWN"] = "unknown";
89
90
  })(ExtrinsicStatus || (ExtrinsicStatus = {}));
90
91
  export let BasicTxErrorType;
@@ -100,6 +100,7 @@ exports.ExtrinsicStatus = ExtrinsicStatus;
100
100
  ExtrinsicStatus["SUCCESS"] = "success";
101
101
  ExtrinsicStatus["FAIL"] = "fail";
102
102
  ExtrinsicStatus["CANCELLED"] = "cancelled";
103
+ ExtrinsicStatus["TIMEOUT"] = "timeout";
103
104
  ExtrinsicStatus["UNKNOWN"] = "unknown";
104
105
  })(ExtrinsicStatus || (exports.ExtrinsicStatus = ExtrinsicStatus = {}));
105
106
  let BasicTxErrorType;
@@ -30,7 +30,7 @@ function subscribeAmplitudeStakingMetadata(chain, substrateApi, callback) {
30
30
  const unstakingDelay = substrateApi.api.consts.parachainStaking.stakeDuration.toString();
31
31
  const _blockPerRound = substrateApi.api.consts.parachainStaking.defaultBlocksPerRound.toString();
32
32
  const blockPerRound = parseFloat(_blockPerRound);
33
- const blockDuration = (_constants._STAKING_ERA_LENGTH_MAP[chain] || _constants._STAKING_ERA_LENGTH_MAP.default) / blockPerRound; // in hours
33
+ const blockDuration = (_constants._STAKING_ERA_LENGTH_MAP[chain] || _constants._STAKING_ERA_LENGTH_MAP.default) / blockPerRound;
34
34
  const unstakingPeriod = blockDuration * parseInt(unstakingDelay);
35
35
  callback(chain, {
36
36
  chain,
@@ -72,46 +72,52 @@ async function subscribeAmplitudeNominatorMetadata(chainInfo, address, substrate
72
72
  const nominationList = [];
73
73
  const unstakingList = [];
74
74
  const minDelegatorStake = substrateApi.api.consts.parachainStaking.minDelegatorStake.toString();
75
+ const hasUnstakingInfo = unstakingInfo && Object.values(unstakingInfo).length > 0;
75
76
  let activeStake = '0';
76
77
  if (delegatorState) {
77
78
  // delegatorState can be null while unstaking all
78
- const [identity] = await (0, _utils.parseIdentity)(substrateApi, delegatorState.owner);
79
- activeStake = delegatorState.amount.toString();
80
- const bnActiveStake = new _util.BN(activeStake);
81
- let delegationStatus = _KoniTypes.StakingStatus.NOT_EARNING;
82
- if (bnActiveStake.gt(_util.BN_ZERO) && bnActiveStake.gte(new _util.BN(minDelegatorStake))) {
83
- delegationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
84
- }
85
- nominationList.push({
86
- status: delegationStatus,
87
- chain: chainInfo.slug,
88
- validatorAddress: delegatorState.owner,
89
- activeStake: delegatorState.amount.toString(),
90
- validatorMinStake: '0',
91
- hasUnstaking: !!unstakingInfo && Object.values(unstakingInfo).length > 0,
92
- validatorIdentity: identity
93
- });
94
- }
95
- if (unstakingInfo && Object.values(unstakingInfo).length > 0) {
96
- const _currentBlockInfo = await substrateApi.api.rpc.chain.getHeader();
97
- const currentBlockInfo = _currentBlockInfo.toPrimitive();
98
- const currentBlockNumber = currentBlockInfo.number;
99
- const _blockPerRound = substrateApi.api.consts.parachainStaking.defaultBlocksPerRound.toString();
100
- const blockPerRound = parseFloat(_blockPerRound);
101
- const nearestUnstakingBlock = Object.keys(unstakingInfo)[0];
102
- const nearestUnstakingAmount = Object.values(unstakingInfo)[0];
103
- const blockDuration = (_constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _constants._STAKING_ERA_LENGTH_MAP.default) / blockPerRound; // in hours
79
+ const identityPromises = delegatorState.map(delegate => (0, _utils.parseIdentity)(substrateApi, delegate.owner));
80
+ const identities = await Promise.all(identityPromises);
81
+ for (let i = 0; i < delegatorState.length; i++) {
82
+ const delegate = delegatorState[i];
83
+ const [identity] = identities[i];
84
+ activeStake = delegate.amount.toString();
85
+ const bnActiveStake = new _util.BN(activeStake);
86
+ let delegationStatus = _KoniTypes.StakingStatus.NOT_EARNING;
87
+ if (bnActiveStake.gt(_util.BN_ZERO) && bnActiveStake.gte(new _util.BN(minDelegatorStake))) {
88
+ delegationStatus = _KoniTypes.StakingStatus.EARNING_REWARD;
89
+ }
90
+ nominationList.push({
91
+ status: delegationStatus,
92
+ chain: chainInfo.slug,
93
+ validatorAddress: delegate.owner,
94
+ activeStake: delegate.amount.toString(),
95
+ validatorMinStake: '0',
96
+ hasUnstaking: hasUnstakingInfo,
97
+ validatorIdentity: identity
98
+ });
99
+ if (hasUnstakingInfo) {
100
+ const _currentBlockInfo = await substrateApi.api.rpc.chain.getHeader();
101
+ const currentBlockInfo = _currentBlockInfo.toPrimitive();
102
+ const currentBlockNumber = currentBlockInfo.number;
103
+ const _blockPerRound = substrateApi.api.consts.parachainStaking.defaultBlocksPerRound.toString();
104
+ const blockPerRound = parseFloat(_blockPerRound);
105
+ const nearestUnstakingBlock = Object.keys(unstakingInfo)[0];
106
+ const nearestUnstakingAmount = Object.values(unstakingInfo)[0];
107
+ const blockDuration = (_constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _constants._STAKING_ERA_LENGTH_MAP.default) / blockPerRound; // in hours
104
108
 
105
- const isClaimable = parseInt(nearestUnstakingBlock) - currentBlockNumber < 0;
106
- const remainingBlock = parseInt(nearestUnstakingBlock) - currentBlockNumber;
107
- const waitingTime = remainingBlock * blockDuration;
108
- unstakingList.push({
109
- chain: chainInfo.slug,
110
- status: isClaimable ? _KoniTypes.UnstakingStatus.CLAIMABLE : _KoniTypes.UnstakingStatus.UNLOCKING,
111
- claimable: nearestUnstakingAmount.toString(),
112
- waitingTime,
113
- validatorAddress: (delegatorState === null || delegatorState === void 0 ? void 0 : delegatorState.owner) || undefined
114
- });
109
+ const isClaimable = parseInt(nearestUnstakingBlock) - currentBlockNumber < 0;
110
+ const remainingBlock = parseInt(nearestUnstakingBlock) - currentBlockNumber;
111
+ const waitingTime = remainingBlock * blockDuration;
112
+ unstakingList.push({
113
+ chain: chainInfo.slug,
114
+ status: isClaimable ? _KoniTypes.UnstakingStatus.CLAIMABLE : _KoniTypes.UnstakingStatus.UNLOCKING,
115
+ claimable: nearestUnstakingAmount.toString(),
116
+ waitingTime,
117
+ validatorAddress: (delegate === null || delegate === void 0 ? void 0 : delegate.owner) || undefined
118
+ });
119
+ }
120
+ }
115
121
  }
116
122
  const stakingStatus = (0, _utils.getStakingStatusByNominations)(new _util.BN(activeStake), nominationList);
117
123
  return {
@@ -208,33 +214,61 @@ async function getAmplitudeNominatorMetadata(chainInfo, address, substrateApi) {
208
214
  }
209
215
  async function getAmplitudeCollatorsInfo(chain, substrateApi) {
210
216
  const chainApi = await substrateApi.isReady;
211
- const [_allCollators, _inflationConfig] = await Promise.all([chainApi.api.query.parachainStaking.candidatePool.entries(), chainApi.api.query.parachainStaking.inflationConfig()]);
212
- const maxDelegatorsPerCollator = chainApi.api.consts.parachainStaking.maxDelegatorsPerCollator.toString();
213
- const inflationConfig = _inflationConfig.toHuman();
214
- const rawDelegatorReturn = inflationConfig.delegator.rewardRate.annual;
215
- const delegatorReturn = parseFloat(rawDelegatorReturn.split('%')[0]);
216
- const allCollators = [];
217
- for (const _collator of _allCollators) {
218
- const collatorInfo = _collator[1].toPrimitive();
219
- const bnTotalStake = new _util.BN(collatorInfo.total);
220
- const bnOwnStake = new _util.BN(collatorInfo.stake);
221
- const bnOtherStake = bnTotalStake.sub(bnOwnStake);
222
- allCollators.push({
223
- address: collatorInfo.id,
224
- totalStake: bnTotalStake.toString(),
225
- ownStake: bnOwnStake.toString(),
226
- otherStake: bnOtherStake.toString(),
227
- nominatorCount: collatorInfo.delegators.length,
228
- commission: 0,
229
- expectedReturn: delegatorReturn,
230
- blocked: false,
231
- isVerified: false,
232
- minBond: '0',
233
- chain,
234
- isCrowded: collatorInfo.delegators.length >= parseInt(maxDelegatorsPerCollator)
235
- });
217
+
218
+ // Noted: Krest do not have reward
219
+ if (_constants._STAKING_CHAIN_GROUP.krest_network.includes(chain)) {
220
+ const _allCollators = await chainApi.api.query.parachainStaking.candidatePool.entries();
221
+ const maxDelegatorsPerCollator = chainApi.api.consts.parachainStaking.maxDelegatorsPerCollator.toString();
222
+ const allCollators = [];
223
+ for (const _collator of _allCollators) {
224
+ const collatorInfo = _collator[1].toPrimitive();
225
+ const bnTotalStake = new _util.BN(collatorInfo.total);
226
+ const bnOwnStake = new _util.BN(collatorInfo.stake);
227
+ const bnOtherStake = bnTotalStake.sub(bnOwnStake);
228
+ allCollators.push({
229
+ address: collatorInfo.id,
230
+ totalStake: bnTotalStake.toString(),
231
+ ownStake: bnOwnStake.toString(),
232
+ otherStake: bnOtherStake.toString(),
233
+ nominatorCount: collatorInfo.delegators.length,
234
+ commission: 0,
235
+ blocked: false,
236
+ isVerified: false,
237
+ minBond: '0',
238
+ chain,
239
+ isCrowded: collatorInfo.delegators.length >= parseInt(maxDelegatorsPerCollator)
240
+ });
241
+ }
242
+ return allCollators;
243
+ } else {
244
+ const [_allCollators, _inflationConfig] = await Promise.all([chainApi.api.query.parachainStaking.candidatePool.entries(), chainApi.api.query.parachainStaking.inflationConfig()]);
245
+ const maxDelegatorsPerCollator = chainApi.api.consts.parachainStaking.maxDelegatorsPerCollator.toString();
246
+ const inflationConfig = _inflationConfig.toHuman();
247
+ const rawDelegatorReturn = inflationConfig.delegator.rewardRate.annual;
248
+ const delegatorReturn = parseFloat(rawDelegatorReturn.split('%')[0]);
249
+ const allCollators = [];
250
+ for (const _collator of _allCollators) {
251
+ const collatorInfo = _collator[1].toPrimitive();
252
+ const bnTotalStake = new _util.BN(collatorInfo.total);
253
+ const bnOwnStake = new _util.BN(collatorInfo.stake);
254
+ const bnOtherStake = bnTotalStake.sub(bnOwnStake);
255
+ allCollators.push({
256
+ address: collatorInfo.id,
257
+ totalStake: bnTotalStake.toString(),
258
+ ownStake: bnOwnStake.toString(),
259
+ otherStake: bnOtherStake.toString(),
260
+ nominatorCount: collatorInfo.delegators.length,
261
+ commission: 0,
262
+ expectedReturn: delegatorReturn,
263
+ blocked: false,
264
+ isVerified: false,
265
+ minBond: '0',
266
+ chain,
267
+ isCrowded: collatorInfo.delegators.length >= parseInt(maxDelegatorsPerCollator)
268
+ });
269
+ }
270
+ return allCollators;
236
271
  }
237
- return allCollators;
238
272
  }
239
273
  async function getAmplitudeBondingExtrinsic(substrateApi, amount, selectedValidatorInfo, nominatorMetadata) {
240
274
  const chainApi = await substrateApi.isReady;
@@ -22,7 +22,15 @@ var _utilCrypto = require("@polkadot/util-crypto");
22
22
  function getSingleStakingAmplitude(substrateApi, address, chainInfoMap, chain, stakingCallback, nominatorStateCallback) {
23
23
  return substrateApi.api.queryMulti([[substrateApi.api.query.parachainStaking.delegatorState, address], [substrateApi.api.query.parachainStaking.unstaking, address]], async _ref => {
24
24
  let [_delegatorState, _unstaking] = _ref;
25
- const delegatorState = _delegatorState.toPrimitive();
25
+ let delegatorState = [];
26
+ if (_constants._STAKING_CHAIN_GROUP.krest_network.includes(chain)) {
27
+ const krestDelegatorState = _delegatorState.toPrimitive();
28
+ const delegates = krestDelegatorState === null || krestDelegatorState === void 0 ? void 0 : krestDelegatorState.delegations;
29
+ delegatorState = delegatorState.concat(delegates);
30
+ } else {
31
+ const delegate = _delegatorState.toPrimitive();
32
+ delegatorState.push(delegate);
33
+ }
26
34
  const unstakingInfo = _unstaking.toPrimitive();
27
35
  const {
28
36
  symbol
@@ -51,8 +59,13 @@ function getSingleStakingAmplitude(substrateApi, address, chainInfoMap, chain, s
51
59
  unstakings: []
52
60
  });
53
61
  } else {
54
- const activeBalance = delegatorState ? new _util.BN(delegatorState.amount.toString()) : _util.BN_ZERO;
62
+ let activeBalance = _util.BN_ZERO;
55
63
  let unstakingBalance = _util.BN_ZERO;
64
+ for (const delegate of delegatorState) {
65
+ var _delegate$amount;
66
+ const amount = new _util.BN((_delegate$amount = delegate.amount) === null || _delegate$amount === void 0 ? void 0 : _delegate$amount.toString());
67
+ activeBalance = activeBalance.add(amount);
68
+ }
56
69
  if (unstakingInfo) {
57
70
  Object.values(unstakingInfo).forEach(unstakingAmount => {
58
71
  const bnUnstakingAmount = new _util.BN(unstakingAmount.toString());
@@ -87,7 +100,15 @@ function getMultiStakingAmplitude(substrateApi, useAddresses, chainInfoMap, chai
87
100
  const _unstakingStates = await substrateApi.api.query.parachainStaking.unstaking.multi(useAddresses);
88
101
  await Promise.all(ledgers.map(async (_delegatorState, i) => {
89
102
  const owner = (0, _utils2.reformatAddress)(useAddresses[i], 42);
90
- const delegatorState = _delegatorState.toPrimitive();
103
+ let delegatorState = [];
104
+ if (_constants._STAKING_CHAIN_GROUP.krest_network.includes(chain)) {
105
+ const krestDelegatorState = _delegatorState.toPrimitive();
106
+ const delegates = krestDelegatorState === null || krestDelegatorState === void 0 ? void 0 : krestDelegatorState.delegations;
107
+ delegatorState = delegatorState.concat(delegates);
108
+ } else {
109
+ const delegate = _delegatorState.toPrimitive();
110
+ delegatorState.push(delegate);
111
+ }
91
112
  const unstakingInfo = _unstakingStates[i].toPrimitive();
92
113
  if (!delegatorState && !unstakingInfo) {
93
114
  stakingCallback(chain, {
@@ -112,8 +133,13 @@ function getMultiStakingAmplitude(substrateApi, useAddresses, chainInfoMap, chai
112
133
  unstakings: []
113
134
  });
114
135
  } else {
115
- const activeBalance = delegatorState ? new _util.BN(delegatorState.amount.toString()) : _util.BN_ZERO;
136
+ let activeBalance = _util.BN_ZERO;
116
137
  let unstakingBalance = _util.BN_ZERO;
138
+ for (const delegate of delegatorState) {
139
+ var _delegate$amount2;
140
+ const amount = new _util.BN((_delegate$amount2 = delegate.amount) === null || _delegate$amount2 === void 0 ? void 0 : _delegate$amount2.toString());
141
+ activeBalance = activeBalance.add(amount);
142
+ }
117
143
  if (unstakingInfo) {
118
144
  Object.values(unstakingInfo).forEach(unstakingAmount => {
119
145
  const bnUnstakingAmount = new _util.BN(unstakingAmount.toString());
@@ -159,7 +185,7 @@ async function getAmplitudeUnclaimedStakingReward(substrateApiMap, addresses, ne
159
185
  });
160
186
  const unclaimedRewardList = [];
161
187
  await Promise.all(chains.map(async chain => {
162
- if (_constants._STAKING_CHAIN_GROUP.amplitude.includes(chain) && !_constants._STAKING_CHAIN_GROUP.kilt.includes(chain)) {
188
+ if (_constants._STAKING_CHAIN_GROUP.amplitude.includes(chain) && !_constants._STAKING_CHAIN_GROUP.kilt.includes(chain) && !_constants._STAKING_CHAIN_GROUP.krest_network.includes(chain)) {
163
189
  const networkInfo = networks[chain];
164
190
  const apiProps = await substrateApiMap[chain].isReady;
165
191
  await Promise.all(useAddresses.map(async address => {
@@ -25,6 +25,6 @@ function getCurrencyId(tokenInfo) {
25
25
  }
26
26
  function getExtrinsicByXtokensPallet(tokenInfo, originChainInfo, destinationChainInfo, recipientAddress, value, api) {
27
27
  const weightParam = ['pioneer'].includes(originChainInfo.slug) ? _utils.FOUR_INSTRUCTIONS_WEIGHT : (0, _utils.getDestWeight)();
28
- const destVersion = ['moonbeam', 'moonriver', 'bifrost_dot', 'interlay', 'hydradx_main', 'acala', 'parallel', 'astar', 'shiden', 'centrifuge'].includes(originChainInfo.slug) ? 'V3' : undefined;
28
+ const destVersion = ['moonbeam', 'moonriver', 'bifrost_dot', 'interlay', 'hydradx_main', 'acala', 'parallel', 'astar', 'shiden', 'centrifuge', 'manta_network'].includes(originChainInfo.slug) ? 'V3' : undefined;
29
29
  return api.tx.xTokens.transfer(getCurrencyId(tokenInfo), value, (0, _utils.getDestMultilocation)(destinationChainInfo, recipientAddress, destVersion), weightParam);
30
30
  }
@@ -424,15 +424,32 @@ class KoniTabs {
424
424
  } = _ref13;
425
425
  // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
426
426
  const chainId = params[0].chainId;
427
+ const chainIdDec = parseInt(chainId, 16);
427
428
  const evmState = await this.getEvmState(url);
428
429
  if (evmState.chainId === chainId) {
429
430
  return null;
430
431
  }
431
- const [networkKey] = this.#koniState.findNetworkKeyByChainId(parseInt(chainId, 16));
432
+ const [networkKey] = this.#koniState.findNetworkKeyByChainId(chainIdDec);
432
433
  if (networkKey) {
433
434
  await this.#koniState.switchEvmNetworkByUrl((0, _utils2.stripUrl)(url), networkKey);
434
435
  } else {
435
- throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, 'This network is currently not supported');
436
+ const onlineData = await (0, _utils2.getEVMChainInfo)(chainIdDec);
437
+ if (onlineData) {
438
+ const chainData = {
439
+ chainId: chainId,
440
+ rpcUrls: onlineData.rpc.filter(url => url.startsWith('https://')),
441
+ chainName: onlineData.name,
442
+ blockExplorerUrls: onlineData.explorers.map(explorer => explorer.url),
443
+ nativeCurrency: onlineData.nativeCurrency,
444
+ requestId: id
445
+ };
446
+ await this.addEvmChain(id, url, {
447
+ method: 'wallet_addEthereumChain',
448
+ params: [chainData]
449
+ });
450
+ } else {
451
+ throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, 'This network is currently not supported');
452
+ }
436
453
  }
437
454
  return null;
438
455
  }
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.1.32-0'
16
+ version: '1.1.33-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -50,6 +50,7 @@ class CampaignService {
50
50
  endTime,
51
51
  startTime,
52
52
  isDone: false,
53
+ isArchive: false,
53
54
  campaignId,
54
55
  type: _KoniTypes.CampaignDataType.BANNER,
55
56
  buttons,
@@ -70,6 +71,7 @@ class CampaignService {
70
71
  endTime,
71
72
  startTime,
72
73
  isDone: false,
74
+ isArchive: false,
73
75
  campaignId,
74
76
  type: _KoniTypes.CampaignDataType.NOTIFICATION,
75
77
  buttons,
@@ -82,6 +84,23 @@ class CampaignService {
82
84
  const exists = await this.#state.dbService.getCampaign(campaign.slug);
83
85
  if (!exists) {
84
86
  await this.#state.dbService.upsertCampaign(campaign);
87
+ } else {
88
+ const data = {
89
+ ...campaign,
90
+ isDone: exists.isDone
91
+ };
92
+ await this.#state.dbService.upsertCampaign(data);
93
+ }
94
+ }
95
+ const allCampaign = await this.#state.dbService.getAllCampaign();
96
+ for (const stored of allCampaign) {
97
+ const exists = campaigns.find(campaign => campaign.slug === stored.slug);
98
+ if (!exists) {
99
+ const data = {
100
+ ...stored,
101
+ isArchive: true
102
+ };
103
+ await this.#state.dbService.upsertCampaign(data);
85
104
  }
86
105
  }
87
106
  this.#state.eventService.emit('campaign.ready', true);
@@ -40,7 +40,7 @@ const _BALANCE_CHAIN_GROUP = {
40
40
  genshiro: ['genshiro_testnet', 'genshiro'],
41
41
  equilibrium_parachain: ['equilibrium_parachain'],
42
42
  bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'pendulum', 'amplitude'],
43
- statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari'],
43
+ statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari', 'manta_network'],
44
44
  kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'],
45
45
  // perhaps there are some runtime updates
46
46
  centrifuge: ['centrifuge']
@@ -69,8 +69,9 @@ const _STAKING_CHAIN_GROUP = {
69
69
  relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'ternoa_alphanet', 'alephTest', 'polkadexTest', 'westend', 'kate', 'edgeware', 'creditcoin', 'vara_network', 'goldberg_testnet'],
70
70
  para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari', 'manta_network'],
71
71
  astar: ['astar', 'shiden', 'shibuya'],
72
- amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum'],
72
+ amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum', 'krest_network'],
73
73
  // amplitude and kilt only share some common logic
74
+ krest_network: ['krest_network'],
74
75
  kilt: ['kilt', 'kilt_peregrine'],
75
76
  nominationPool: ['polkadot', 'kusama', 'westend', 'alephTest', 'aleph', 'kate', 'vara_network', 'goldberg_testnet'],
76
77
  bifrost: ['bifrost', 'bifrost_testnet'],
@@ -111,7 +112,8 @@ const _STAKING_ERA_LENGTH_MAP = {
111
112
  creditcoin: 24,
112
113
  vara_network: 12,
113
114
  goldberg_testnet: 24,
114
- manta_network: 6
115
+ manta_network: 6,
116
+ krest_network: 4
115
117
  };
116
118
  exports._STAKING_ERA_LENGTH_MAP = _STAKING_ERA_LENGTH_MAP;
117
119
  const _EXPECTED_BLOCK_TIME = {
@@ -173,14 +173,18 @@ class HistoryService {
173
173
 
174
174
  // Insert history with check override origin 'app'
175
175
  async addHistoryItems(historyItems) {
176
- // Prevent override record with original is 'app'
177
- const appRecords = this.historySubject.value.filter(item => item.origin === 'app');
178
- const excludeKeys = appRecords.map(item => {
179
- return `${item.chain}-${item.extrinsicHash}`;
180
- });
181
- const updateRecords = historyItems.filter(item => {
182
- const key = `${item.chain}-${item.extrinsicHash}`;
183
- return item.origin === 'app' || !excludeKeys.includes(key);
176
+ const updateRecords = [];
177
+ const appItems = this.historySubject.value.filter(i => i.origin === 'app');
178
+ historyItems.forEach(item => {
179
+ const needUpdateItem = appItems.find(item_ => item_.extrinsicHash === item.extrinsicHash && item.chain === item_.chain && item.address === item_.address);
180
+ if (needUpdateItem) {
181
+ updateRecords.push({
182
+ ...needUpdateItem,
183
+ status: item.status
184
+ });
185
+ return;
186
+ }
187
+ updateRecords.push(item);
184
188
  });
185
189
  await this.dbService.upsertHistory(updateRecords);
186
190
  this.historySubject.next(await this.dbService.getHistories());
@@ -283,6 +283,9 @@ class DatabaseService {
283
283
 
284
284
  /* Campaign */
285
285
 
286
+ getAllCampaign() {
287
+ return this.stores.campaign.getAll();
288
+ }
286
289
  subscribeProcessingCampaign() {
287
290
  return this.stores.campaign.subscribeProcessingCampaign();
288
291
  }
@@ -13,7 +13,13 @@ var _dexie = require("dexie");
13
13
  const filterProcessing = campaign => {
14
14
  const now = new Date().getTime();
15
15
  const isExpired = now <= campaign.startTime || now >= campaign.endTime;
16
- return !(campaign.isDone || isExpired);
16
+ return !(campaign.isArchive || campaign.isDone || isExpired);
17
+ };
18
+ const getId = campaign => {
19
+ return campaign.campaignId;
20
+ };
21
+ const sortById = (a, b) => {
22
+ return getId(a) - getId(b);
17
23
  };
18
24
  class CampaignStore extends _BaseStore.default {
19
25
  async getAll() {
@@ -23,10 +29,10 @@ class CampaignStore extends _BaseStore.default {
23
29
  return this.table.get(slug);
24
30
  }
25
31
  async getProcessingCampaign() {
26
- return (await this.table.toArray()).filter(filterProcessing);
32
+ return (await this.table.toArray()).filter(filterProcessing).sort(sortById);
27
33
  }
28
34
  subscribeProcessingCampaign() {
29
- return (0, _dexie.liveQuery)(() => this.table.filter(filterProcessing).toArray());
35
+ return (0, _dexie.liveQuery)(async () => (await this.table.filter(filterProcessing).toArray()).sort(sortById));
30
36
  }
31
37
  upsertCampaign(campaign) {
32
38
  return this.table.put(campaign);
@@ -290,6 +290,12 @@ class TransactionService {
290
290
  errors: [...data.errors, new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR)]
291
291
  });
292
292
  });
293
+ emitter.on('timeout', data => {
294
+ this.onTimeOut({
295
+ ...data,
296
+ errors: [...data.errors, new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.TIMEOUT)]
297
+ });
298
+ });
293
299
 
294
300
  // Todo: handle any event with transaction.eventsHandler
295
301
 
@@ -657,6 +663,45 @@ class TransactionService {
657
663
  }
658
664
  this.eventService.emit('transaction.failed', transaction);
659
665
  }
666
+ onTimeOut(_ref6) {
667
+ let {
668
+ blockHash,
669
+ blockNumber,
670
+ errors,
671
+ extrinsicHash,
672
+ id
673
+ } = _ref6;
674
+ const transaction = this.getTransaction(id);
675
+ const nextStatus = _KoniTypes.ExtrinsicStatus.TIMEOUT;
676
+ if (transaction) {
677
+ this.updateTransaction(id, {
678
+ status: nextStatus,
679
+ errors,
680
+ extrinsicHash
681
+ });
682
+ this.historyService.updateHistoryByExtrinsicHash(transaction.extrinsicHash, {
683
+ extrinsicHash: extrinsicHash || transaction.extrinsicHash,
684
+ status: nextStatus,
685
+ blockNumber: blockNumber || 0,
686
+ blockHash: blockHash || ''
687
+ }).catch(console.error);
688
+ const info = (0, _util.isHex)(transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash) ? transaction === null || transaction === void 0 ? void 0 : transaction.extrinsicHash : (0, _helpers.getBaseTransactionInfo)(transaction, this.chainService.getChainInfoMap());
689
+ this.notificationService.notify({
690
+ type: _KoniTypes.NotificationType.ERROR,
691
+ title: (0, _i18next.t)('Transaction timed out'),
692
+ message: (0, _i18next.t)('Transaction {{info}} timed out', {
693
+ replace: {
694
+ info
695
+ }
696
+ }),
697
+ action: {
698
+ url: this.getTransactionLink(id)
699
+ },
700
+ notifyViaBrowser: true
701
+ });
702
+ }
703
+ this.eventService.emit('transaction.timeout', transaction);
704
+ }
660
705
  generateHashPayload(chain, transaction) {
661
706
  var _transaction$nonce;
662
707
  const chainInfo = this.chainService.getChainInfoByKey(chain);
@@ -671,7 +716,7 @@ class TransactionService {
671
716
  };
672
717
  return _ethers.ethers.Transaction.from(txObject).unsignedSerialized;
673
718
  }
674
- async signAndSendEvmTransaction(_ref6) {
719
+ async signAndSendEvmTransaction(_ref7) {
675
720
  var _payload$nonce;
676
721
  let {
677
722
  address,
@@ -679,7 +724,7 @@ class TransactionService {
679
724
  id,
680
725
  transaction,
681
726
  url
682
- } = _ref6;
727
+ } = _ref7;
683
728
  const payload = transaction;
684
729
  const evmApi = this.chainService.getEvmApi(chain);
685
730
  const chainInfo = this.chainService.getChainInfoByKey(chain);
@@ -747,11 +792,11 @@ class TransactionService {
747
792
  extrinsicHash: id
748
793
  };
749
794
  if (isInjected) {
750
- this.requestService.addConfirmation(id, url || _constants3.EXTENSION_REQUEST_URL, 'evmWatchTransactionRequest', payload, {}).then(async _ref7 => {
795
+ this.requestService.addConfirmation(id, url || _constants3.EXTENSION_REQUEST_URL, 'evmWatchTransactionRequest', payload, {}).then(async _ref8 => {
751
796
  let {
752
797
  isApproved,
753
798
  payload
754
- } = _ref7;
799
+ } = _ref8;
755
800
  if (isApproved) {
756
801
  if (!payload) {
757
802
  throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.UNAUTHORIZED, 'Bad signature');
@@ -812,11 +857,11 @@ class TransactionService {
812
857
  emitter.emit('error', eventData);
813
858
  });
814
859
  } else {
815
- this.requestService.addConfirmation(id, url || _constants3.EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {}).then(async _ref8 => {
860
+ this.requestService.addConfirmation(id, url || _constants3.EXTENSION_REQUEST_URL, 'evmSendTransactionRequest', payload, {}).then(async _ref9 => {
816
861
  let {
817
862
  isApproved,
818
863
  payload
819
- } = _ref8;
864
+ } = _ref9;
820
865
  if (isApproved) {
821
866
  let signedTransaction;
822
867
  if (!payload) {
@@ -872,14 +917,14 @@ class TransactionService {
872
917
  }
873
918
  return emitter;
874
919
  }
875
- signAndSendSubstrateTransaction(_ref9) {
920
+ signAndSendSubstrateTransaction(_ref10) {
876
921
  let {
877
922
  address,
878
923
  chain,
879
924
  id,
880
925
  transaction,
881
926
  url
882
- } = _ref9;
927
+ } = _ref10;
883
928
  const emitter = new _eventemitter.default();
884
929
  const eventData = {
885
930
  id,
@@ -925,20 +970,20 @@ class TransactionService {
925
970
  eventData.extrinsicHash = txState.txHash.toHex();
926
971
  eventData.eventLogs = txState.events;
927
972
  // TODO: push block hash and block number into eventData
928
- txState.events.filter(_ref10 => {
973
+ txState.events.filter(_ref11 => {
929
974
  let {
930
975
  event: {
931
976
  section
932
977
  }
933
- } = _ref10;
978
+ } = _ref11;
934
979
  return section === 'system';
935
- }).forEach(_ref11 => {
980
+ }).forEach(_ref12 => {
936
981
  let {
937
982
  event: {
938
983
  data: [error],
939
984
  method
940
985
  }
941
- } = _ref11;
986
+ } = _ref12;
942
987
  if (method === 'ExtrinsicFailed') {
943
988
  eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.SEND_TRANSACTION_FAILED, error.toString()));
944
989
  emitter.emit('error', eventData);
@@ -963,7 +1008,7 @@ class TransactionService {
963
1008
  const transaction = this.getTransaction(eventData.id);
964
1009
  if (transaction.status !== _KoniTypes.ExtrinsicStatus.SUCCESS && transaction.status !== _KoniTypes.ExtrinsicStatus.FAIL) {
965
1010
  eventData.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.TIMEOUT, (0, _i18next.t)('Transaction timeout')));
966
- emitter.emit('error', eventData);
1011
+ emitter.emit('timeout', eventData);
967
1012
  clearTimeout(timeout);
968
1013
  }
969
1014
  }, _constants4.TRANSACTION_TIMEOUT);