@subwallet/extension-base 1.1.38-1 → 1.1.39-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/background/KoniTypes.d.ts +2 -0
- package/background/types.d.ts +1 -0
- package/cjs/koni/api/dotsama/balance.js +464 -0
- package/cjs/koni/api/nft/unique_network_nft/index.js +4 -0
- package/cjs/koni/background/handlers/Extension.js +64 -13
- package/cjs/koni/background/handlers/State.js +6 -5
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/balance.js +1 -1
- package/cjs/services/chain-service/health-check/constants/index.js +36 -0
- package/cjs/services/chain-service/health-check/utils/asset-info.js +282 -0
- package/cjs/services/chain-service/health-check/utils/chain-info.js +36 -0
- package/cjs/services/chain-service/health-check/utils/index.js +38 -0
- package/cjs/services/chain-service/health-check/utils/provider.js +186 -0
- package/cjs/services/chain-service/index.js +61 -51
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +42 -26
- package/cjs/services/earning-service/service.js +9 -2
- package/cjs/services/migration-service/scripts/MigrateEthProvider.js +17 -0
- package/cjs/services/migration-service/scripts/MigratePioneerProvider.js +17 -0
- package/cjs/services/migration-service/scripts/MigrateProvider.js +29 -0
- package/cjs/services/storage-service/index.js +241 -0
- package/cjs/services/transaction-service/index.js +6 -4
- package/cjs/types.js +1 -0
- package/cjs/utils/address.js +34 -0
- package/cjs/utils/eth/mergeTransactionAndSignature.js +8 -3
- package/cjs/utils/index.js +6 -5
- package/cjs/utils/keyring.js +57 -0
- package/cjs/utils/staticData/index.js +5 -5
- package/koni/api/nft/unique_network_nft/index.d.ts +1 -0
- package/koni/api/nft/unique_network_nft/index.js +5 -1
- package/koni/api/staking/bonding/utils.d.ts +0 -1
- package/koni/background/handlers/Extension.d.ts +1 -0
- package/koni/background/handlers/Extension.js +64 -13
- package/koni/background/handlers/State.js +2 -1
- package/package.json +42 -17
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/balance.js +1 -1
- package/services/chain-service/health-check/constants/index.d.ts +4 -0
- package/services/chain-service/health-check/constants/index.js +26 -0
- package/services/chain-service/health-check/utils/asset-info.d.ts +14 -0
- package/services/chain-service/health-check/utils/asset-info.js +269 -0
- package/services/chain-service/health-check/utils/chain-info.d.ts +8 -0
- package/services/chain-service/health-check/utils/chain-info.js +28 -0
- package/services/chain-service/health-check/utils/index.d.ts +3 -0
- package/services/chain-service/health-check/utils/index.js +6 -0
- package/services/chain-service/health-check/utils/provider.d.ts +25 -0
- package/services/chain-service/health-check/utils/provider.js +172 -0
- package/services/chain-service/index.d.ts +7 -3
- package/services/chain-service/index.js +52 -43
- package/services/chain-service/types.d.ts +4 -0
- package/services/earning-service/handlers/native-staking/relay-chain.d.ts +0 -1
- package/services/earning-service/handlers/native-staking/relay-chain.js +42 -26
- package/services/earning-service/handlers/special.d.ts +0 -1
- package/services/earning-service/service.js +10 -3
- package/services/transaction-service/index.js +6 -4
- package/types/balance.d.ts +0 -1
- package/types/yield/info/pallet.d.ts +4 -1
- package/utils/eth/mergeTransactionAndSignature.js +8 -3
- package/utils/index.d.ts +1 -2
- package/utils/index.js +6 -5
- package/utils/staticData/buyServiceInfos.json +0 -1
- package/utils/staticData/buyTokenConfigs.json +0 -15
- package/utils/staticData/chains.json +192 -89
- package/utils/staticData/crowdloanFunds.json +433 -58
- package/utils/staticData/index.d.ts +1 -2
- package/utils/staticData/index.js +4 -3
- package/utils/staticData/marketingCampaigns.json +1 -298
- package/utils/staticData/termAndCondition.json +1 -1
|
@@ -38,6 +38,7 @@ class ChainService {
|
|
|
38
38
|
// TODO: consider BehaviorSubject
|
|
39
39
|
chainInfoMapSubject = new _rxjs.Subject();
|
|
40
40
|
chainStateMapSubject = new _rxjs.Subject();
|
|
41
|
+
chainStatusMapSubject = new _rxjs.BehaviorSubject({});
|
|
41
42
|
assetRegistrySubject = new _rxjs.Subject();
|
|
42
43
|
multiChainAssetMapSubject = new _rxjs.Subject();
|
|
43
44
|
xcmRefMapSubject = new _rxjs.Subject();
|
|
@@ -111,6 +112,9 @@ class ChainService {
|
|
|
111
112
|
subscribeChainStateMap() {
|
|
112
113
|
return this.chainStateMapSubject;
|
|
113
114
|
}
|
|
115
|
+
subscribeChainStatusMap() {
|
|
116
|
+
return this.chainStatusMapSubject;
|
|
117
|
+
}
|
|
114
118
|
getAssetRegistry() {
|
|
115
119
|
return this.dataMap.assetRegistry;
|
|
116
120
|
}
|
|
@@ -188,6 +192,12 @@ class ChainService {
|
|
|
188
192
|
getChainStateByKey(key) {
|
|
189
193
|
return this.dataMap.chainStateMap[key];
|
|
190
194
|
}
|
|
195
|
+
getChainStatusMap() {
|
|
196
|
+
return this.chainStatusMapSubject.getValue();
|
|
197
|
+
}
|
|
198
|
+
getChainStatusByKey(key) {
|
|
199
|
+
return this.getChainStatusMap()[key];
|
|
200
|
+
}
|
|
191
201
|
getActiveChains() {
|
|
192
202
|
return Object.entries(this.dataMap.chainStateMap).filter(_ref => {
|
|
193
203
|
let [, chainState] = _ref;
|
|
@@ -353,9 +363,32 @@ class ChainService {
|
|
|
353
363
|
this.lockChainInfoMap = false;
|
|
354
364
|
return true;
|
|
355
365
|
}
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
366
|
+
connectionStatusQueueMap = {};
|
|
367
|
+
updateChainConnectionStatus(slug, connectionStatus) {
|
|
368
|
+
this.connectionStatusQueueMap[slug] = connectionStatus;
|
|
369
|
+
(0, _utils2.addLazy)('updateChainConnectionStatus', () => {
|
|
370
|
+
const chainStatusMap = this.getChainStatusMap();
|
|
371
|
+
let update = false;
|
|
372
|
+
Object.entries(this.connectionStatusQueueMap).forEach(_ref3 => {
|
|
373
|
+
let [slug, status] = _ref3;
|
|
374
|
+
if (chainStatusMap[slug]) {
|
|
375
|
+
if (chainStatusMap[slug].connectionStatus !== status) {
|
|
376
|
+
chainStatusMap[slug].connectionStatus = status;
|
|
377
|
+
chainStatusMap[slug].lastUpdated = Date.now();
|
|
378
|
+
update = true;
|
|
379
|
+
}
|
|
380
|
+
} else {
|
|
381
|
+
chainStatusMap[slug] = {
|
|
382
|
+
slug,
|
|
383
|
+
connectionStatus: status,
|
|
384
|
+
lastUpdated: Date.now()
|
|
385
|
+
};
|
|
386
|
+
update = true;
|
|
387
|
+
}
|
|
388
|
+
});
|
|
389
|
+
this.connectionStatusQueueMap = {};
|
|
390
|
+
update && this.chainStatusMapSubject.next(chainStatusMap);
|
|
391
|
+
});
|
|
359
392
|
}
|
|
360
393
|
upsertCustomToken(token) {
|
|
361
394
|
if (token.slug.length === 0) {
|
|
@@ -484,8 +517,8 @@ class ChainService {
|
|
|
484
517
|
this.logger.log('Finished updating latest asset ref');
|
|
485
518
|
}
|
|
486
519
|
handleLatestPriceId(latestPriceIds) {
|
|
487
|
-
Object.entries(latestPriceIds).forEach(
|
|
488
|
-
let [slug, priceId] =
|
|
520
|
+
Object.entries(latestPriceIds).forEach(_ref4 => {
|
|
521
|
+
let [slug, priceId] = _ref4;
|
|
489
522
|
if (this.dataMap.assetRegistry[slug]) {
|
|
490
523
|
this.dataMap.assetRegistry[slug].priceId = priceId;
|
|
491
524
|
}
|
|
@@ -510,12 +543,12 @@ class ChainService {
|
|
|
510
543
|
async initApis() {
|
|
511
544
|
const chainInfoMap = this.getChainInfoMap();
|
|
512
545
|
const chainStateMap = this.getChainStateMap();
|
|
513
|
-
await Promise.all(Object.entries(chainInfoMap).filter(
|
|
546
|
+
await Promise.all(Object.entries(chainInfoMap).filter(_ref5 => {
|
|
514
547
|
var _chainStateMap$slug;
|
|
515
|
-
let [slug] =
|
|
548
|
+
let [slug] = _ref5;
|
|
516
549
|
return (_chainStateMap$slug = chainStateMap[slug]) === null || _chainStateMap$slug === void 0 ? void 0 : _chainStateMap$slug.active;
|
|
517
|
-
}).map(
|
|
518
|
-
let [, chainInfo] =
|
|
550
|
+
}).map(_ref6 => {
|
|
551
|
+
let [, chainInfo] = _ref6;
|
|
519
552
|
try {
|
|
520
553
|
return this.initApiForChain(chainInfo);
|
|
521
554
|
} catch (e) {
|
|
@@ -530,13 +563,8 @@ class ChainService {
|
|
|
530
563
|
providerName
|
|
531
564
|
} = this.getChainCurrentProviderByKey(chainInfo.slug);
|
|
532
565
|
const onUpdateStatus = status => {
|
|
533
|
-
const
|
|
534
|
-
|
|
535
|
-
// Avoid unnecessary update in case disable chain
|
|
536
|
-
if (currentStatus !== status) {
|
|
537
|
-
this.setChainConnectionStatus(chainInfo.slug, status);
|
|
538
|
-
this.updateChainStateMapSubscription();
|
|
539
|
-
}
|
|
566
|
+
const slug = chainInfo.slug;
|
|
567
|
+
this.updateChainConnectionStatus(slug, status);
|
|
540
568
|
};
|
|
541
569
|
if (chainInfo.substrateInfo !== null && chainInfo.substrateInfo !== undefined) {
|
|
542
570
|
if (_constants._MANTA_ZK_CHAIN_GROUP.includes(chainInfo.slug) && _utils2.MODULE_SUPPORT.MANTA_ZK && this.mantaChainHandler) {
|
|
@@ -635,7 +663,7 @@ class ChainService {
|
|
|
635
663
|
this.lockChainInfoMap = true;
|
|
636
664
|
chainStateMap[chainSlug].active = false;
|
|
637
665
|
// Set disconnect state for inactive chain
|
|
638
|
-
|
|
666
|
+
this.updateChainConnectionStatus(chainSlug, _types3._ChainConnectionStatus.DISCONNECTED);
|
|
639
667
|
this.destroyApiForChain(chainInfo);
|
|
640
668
|
this.dbService.updateChainStore({
|
|
641
669
|
...chainInfo,
|
|
@@ -728,9 +756,9 @@ class ChainService {
|
|
|
728
756
|
this.dataMap.chainStateMap[chainInfo.slug] = {
|
|
729
757
|
currentProvider: providerKey,
|
|
730
758
|
slug: chainInfo.slug,
|
|
731
|
-
connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
|
|
732
759
|
active: _constants._DEFAULT_ACTIVE_CHAINS.includes(chainInfo.slug)
|
|
733
760
|
};
|
|
761
|
+
this.updateChainConnectionStatus(chainInfo.slug, _types3._ChainConnectionStatus.DISCONNECTED);
|
|
734
762
|
|
|
735
763
|
// create data for storage
|
|
736
764
|
newStorageData.push({
|
|
@@ -781,9 +809,9 @@ class ChainService {
|
|
|
781
809
|
this.dataMap.chainStateMap[storedSlug] = {
|
|
782
810
|
currentProvider: selectedProvider,
|
|
783
811
|
slug: storedSlug,
|
|
784
|
-
connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
|
|
785
812
|
active: canActive && storedChainInfo.active
|
|
786
813
|
};
|
|
814
|
+
this.updateChainConnectionStatus(storedSlug, _types3._ChainConnectionStatus.DISCONNECTED);
|
|
787
815
|
newStorageData.push({
|
|
788
816
|
...mergedChainInfoMap[storedSlug],
|
|
789
817
|
active: canActive && storedChainInfo.active,
|
|
@@ -803,9 +831,9 @@ class ChainService {
|
|
|
803
831
|
this.dataMap.chainStateMap[duplicatedDefaultSlug] = {
|
|
804
832
|
currentProvider: storedChainInfo.currentProvider,
|
|
805
833
|
slug: duplicatedDefaultSlug,
|
|
806
|
-
connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
|
|
807
834
|
active: storedChainInfo.active
|
|
808
835
|
};
|
|
836
|
+
this.updateChainConnectionStatus(duplicatedDefaultSlug, _types3._ChainConnectionStatus.DISCONNECTED);
|
|
809
837
|
newStorageData.push({
|
|
810
838
|
...mergedChainInfoMap[duplicatedDefaultSlug],
|
|
811
839
|
active: storedChainInfo.active,
|
|
@@ -830,9 +858,9 @@ class ChainService {
|
|
|
830
858
|
currentProvider: storedChainInfo.currentProvider,
|
|
831
859
|
// TODO: review
|
|
832
860
|
slug: storedSlug,
|
|
833
|
-
connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
|
|
834
861
|
active: storedChainInfo.active
|
|
835
862
|
};
|
|
863
|
+
this.updateChainConnectionStatus(storedSlug, _types3._ChainConnectionStatus.DISCONNECTED);
|
|
836
864
|
newStorageData.push({
|
|
837
865
|
...mergedChainInfoMap[storedSlug],
|
|
838
866
|
active: storedChainInfo.active,
|
|
@@ -845,15 +873,15 @@ class ChainService {
|
|
|
845
873
|
}
|
|
846
874
|
|
|
847
875
|
// Fill in the missing chainState and storageData (new chains never before seen)
|
|
848
|
-
Object.entries(mergedChainInfoMap).forEach(
|
|
849
|
-
let [slug, chainInfo] =
|
|
876
|
+
Object.entries(mergedChainInfoMap).forEach(_ref7 => {
|
|
877
|
+
let [slug, chainInfo] = _ref7;
|
|
850
878
|
if (!(slug in this.dataMap.chainStateMap)) {
|
|
851
879
|
this.dataMap.chainStateMap[slug] = {
|
|
852
880
|
currentProvider: Object.keys(chainInfo.providers)[0],
|
|
853
881
|
slug,
|
|
854
|
-
connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
|
|
855
882
|
active: _constants._DEFAULT_ACTIVE_CHAINS.includes(slug)
|
|
856
883
|
};
|
|
884
|
+
this.updateChainConnectionStatus(slug, _types3._ChainConnectionStatus.DISCONNECTED);
|
|
857
885
|
newStorageData.push({
|
|
858
886
|
...mergedChainInfoMap[slug],
|
|
859
887
|
active: _constants._DEFAULT_ACTIVE_CHAINS.includes(slug),
|
|
@@ -928,9 +956,7 @@ class ChainService {
|
|
|
928
956
|
}
|
|
929
957
|
}
|
|
930
958
|
updateChainStateMapSubscription() {
|
|
931
|
-
(
|
|
932
|
-
this.chainStateMapSubject.next(this.getChainStateMap());
|
|
933
|
-
}, 300, 900);
|
|
959
|
+
this.chainStateMapSubject.next(this.getChainStateMap());
|
|
934
960
|
}
|
|
935
961
|
updateChainInfoMapSubscription() {
|
|
936
962
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
@@ -1039,10 +1065,17 @@ class ChainService {
|
|
|
1039
1065
|
const chainStateMap = this.getChainStateMap();
|
|
1040
1066
|
chainStateMap[newChainSlug] = {
|
|
1041
1067
|
active: true,
|
|
1042
|
-
connectionStatus: _types3._ChainConnectionStatus.DISCONNECTED,
|
|
1043
1068
|
currentProvider: params.chainEditInfo.currentProvider,
|
|
1044
1069
|
slug: newChainSlug
|
|
1045
1070
|
};
|
|
1071
|
+
|
|
1072
|
+
// const chainStatusMap = this.getChainStatusMap();
|
|
1073
|
+
// const chainStatusMap[newChainSlug] = {
|
|
1074
|
+
// slug: newChainSlug,
|
|
1075
|
+
// connectionStatus: _ChainConnectionStatus.DISCONNECTED,
|
|
1076
|
+
// lastUpdated: Date.now()
|
|
1077
|
+
// };
|
|
1078
|
+
|
|
1046
1079
|
await this.initApiForChain(chainInfo);
|
|
1047
1080
|
|
|
1048
1081
|
// create a record in assetRegistry for native token and update store/subscription
|
|
@@ -1327,29 +1360,6 @@ class ChainService {
|
|
|
1327
1360
|
await Promise.all([this.substrateChainHandler.wakeUp(), this.evmChainHandler.wakeUp()]);
|
|
1328
1361
|
this.checkLatestData();
|
|
1329
1362
|
}
|
|
1330
|
-
checkAndUpdateStatusMapForChain(chainSlug) {
|
|
1331
|
-
const substrateApiMap = this.getSubstrateApiMap();
|
|
1332
|
-
const evmApiMap = this.getEvmApiMap();
|
|
1333
|
-
const chainState = this.getChainStateByKey(chainSlug);
|
|
1334
|
-
let update = false;
|
|
1335
|
-
function updateState(current, status) {
|
|
1336
|
-
if (current.connectionStatus !== status) {
|
|
1337
|
-
current.connectionStatus = status;
|
|
1338
|
-
update = true;
|
|
1339
|
-
}
|
|
1340
|
-
}
|
|
1341
|
-
if (chainState.active) {
|
|
1342
|
-
const api = substrateApiMap[chainSlug] || evmApiMap[chainSlug];
|
|
1343
|
-
if (api) {
|
|
1344
|
-
updateState(chainState, api.isApiConnected ? _types3._ChainConnectionStatus.CONNECTED : _types3._ChainConnectionStatus.DISCONNECTED);
|
|
1345
|
-
}
|
|
1346
|
-
} else {
|
|
1347
|
-
updateState(chainState, _types3._ChainConnectionStatus.DISCONNECTED);
|
|
1348
|
-
}
|
|
1349
|
-
if (update) {
|
|
1350
|
-
this.dataMap.chainStateMap[chainSlug] = chainState;
|
|
1351
|
-
}
|
|
1352
|
-
}
|
|
1353
1363
|
async initAssetSettings() {
|
|
1354
1364
|
const assetSettings = await this.getAssetSettings();
|
|
1355
1365
|
const activeChainSlugs = this.getActiveChainSlugs();
|
|
@@ -287,7 +287,21 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
287
287
|
const currentEra = _era.toString();
|
|
288
288
|
const allValidators = [];
|
|
289
289
|
const validatorInfoList = [];
|
|
290
|
-
const [_totalEraStake, _eraStakers, _minBond, _stakingRewards] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra)), chainApi.api.query.staking.minNominatorBond(), ((_chainApi$api$query$s = chainApi.api.query.stakingRewards) === null || _chainApi$api$query$s === void 0 ? void 0 : _chainApi$api$query$s.data) && chainApi.api.query.stakingRewards.data()]);
|
|
290
|
+
const [_totalEraStake, _eraStakers, _minBond, _stakingRewards, _validators] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra)), chainApi.api.query.staking.minNominatorBond(), ((_chainApi$api$query$s = chainApi.api.query.stakingRewards) === null || _chainApi$api$query$s === void 0 ? void 0 : _chainApi$api$query$s.data) && chainApi.api.query.stakingRewards.data(), chainApi.api.query.staking.validators.entries()]);
|
|
291
|
+
|
|
292
|
+
// filter blocked validators
|
|
293
|
+
const validators = _validators;
|
|
294
|
+
const blockValidatorList = [];
|
|
295
|
+
for (const validator of validators) {
|
|
296
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
297
|
+
const validatorAddress = validator[0].toHuman()[0];
|
|
298
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
299
|
+
const validatorPrefs = validator[1].toHuman();
|
|
300
|
+
const isBlocked = validatorPrefs.blocked;
|
|
301
|
+
if (isBlocked) {
|
|
302
|
+
blockValidatorList.push(validatorAddress);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
291
305
|
const stakingRewards = _stakingRewards === null || _stakingRewards === void 0 ? void 0 : _stakingRewards.toPrimitive();
|
|
292
306
|
const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
|
|
293
307
|
const maxNominatorRewarded = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
|
|
@@ -303,32 +317,34 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
303
317
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
304
318
|
const rawValidatorStat = item[1].toHuman();
|
|
305
319
|
const validatorAddress = rawValidatorInfo[1];
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
320
|
+
if (!blockValidatorList.includes(validatorAddress)) {
|
|
321
|
+
const rawTotalStake = rawValidatorStat.total;
|
|
322
|
+
const rawOwnStake = rawValidatorStat.own;
|
|
323
|
+
const bnTotalStake = new _util.BN(rawTotalStake.replaceAll(',', ''));
|
|
324
|
+
const bnOwnStake = new _util.BN(rawOwnStake.replaceAll(',', ''));
|
|
325
|
+
const otherStake = bnTotalStake.sub(bnOwnStake);
|
|
326
|
+
totalStakeMap[validatorAddress] = bnTotalStake;
|
|
327
|
+
let nominatorCount = 0;
|
|
328
|
+
if ('others' in rawValidatorStat) {
|
|
329
|
+
const others = rawValidatorStat.others;
|
|
330
|
+
nominatorCount = others.length;
|
|
331
|
+
}
|
|
332
|
+
allValidators.push(validatorAddress);
|
|
333
|
+
validatorInfoList.push({
|
|
334
|
+
address: validatorAddress,
|
|
335
|
+
totalStake: bnTotalStake.toString(),
|
|
336
|
+
ownStake: bnOwnStake.toString(),
|
|
337
|
+
otherStake: otherStake.toString(),
|
|
338
|
+
nominatorCount,
|
|
339
|
+
// to be added later
|
|
340
|
+
commission: 0,
|
|
341
|
+
expectedReturn: 0,
|
|
342
|
+
blocked: false,
|
|
343
|
+
isVerified: false,
|
|
344
|
+
minBond,
|
|
345
|
+
isCrowded: unlimitedNominatorRewarded ? false : nominatorCount > parseInt(maxNominatorRewarded)
|
|
346
|
+
});
|
|
316
347
|
}
|
|
317
|
-
allValidators.push(validatorAddress);
|
|
318
|
-
validatorInfoList.push({
|
|
319
|
-
address: validatorAddress,
|
|
320
|
-
totalStake: bnTotalStake.toString(),
|
|
321
|
-
ownStake: bnOwnStake.toString(),
|
|
322
|
-
otherStake: otherStake.toString(),
|
|
323
|
-
nominatorCount,
|
|
324
|
-
// to be added later
|
|
325
|
-
commission: 0,
|
|
326
|
-
expectedReturn: 0,
|
|
327
|
-
blocked: false,
|
|
328
|
-
isVerified: false,
|
|
329
|
-
minBond,
|
|
330
|
-
isCrowded: unlimitedNominatorRewarded ? false : nominatorCount > parseInt(maxNominatorRewarded)
|
|
331
|
-
});
|
|
332
348
|
}
|
|
333
349
|
const extraInfoMap = {};
|
|
334
350
|
await Promise.all(allValidators.map(async address => {
|
|
@@ -134,13 +134,20 @@ class EarningService {
|
|
|
134
134
|
this.eventService.onLazy((events, eventTypes) => {
|
|
135
135
|
(async () => {
|
|
136
136
|
const removedAddresses = [];
|
|
137
|
+
const removeChains = [];
|
|
137
138
|
events.forEach(event => {
|
|
138
139
|
if (event.type === 'account.remove') {
|
|
139
140
|
removedAddresses.push(event.data[0]);
|
|
140
141
|
}
|
|
142
|
+
if (event.type === 'chain.updateState') {
|
|
143
|
+
const chainState = this.state.getChainStateByKey(event.data[0]);
|
|
144
|
+
if (chainState && !(0, _utils._isChainEnabled)(chainState)) {
|
|
145
|
+
removeChains.push(event.data[0]);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
141
148
|
});
|
|
142
|
-
if (
|
|
143
|
-
await this.removeYieldPositions(
|
|
149
|
+
if (removeChains.length || removedAddresses.length) {
|
|
150
|
+
await this.removeYieldPositions(removeChains, removedAddresses);
|
|
144
151
|
}
|
|
145
152
|
|
|
146
153
|
// Account changed or chain changed (active or inactive)
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _MigrateProvider = _interopRequireDefault(require("./MigrateProvider"));
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
class MigrateEthProvider extends _MigrateProvider.default {
|
|
13
|
+
newProvider = 'ethereum';
|
|
14
|
+
oldProvider = 'Cloudflare';
|
|
15
|
+
slug = 'Llamarpc';
|
|
16
|
+
}
|
|
17
|
+
exports.default = MigrateEthProvider;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _MigrateProvider = _interopRequireDefault(require("./MigrateProvider"));
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
class MigratePioneerProvider extends _MigrateProvider.default {
|
|
13
|
+
slug = 'pioneer';
|
|
14
|
+
oldProvider = 'OnFinality';
|
|
15
|
+
newProvider = 'Pioneer';
|
|
16
|
+
}
|
|
17
|
+
exports.default = MigratePioneerProvider;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.default = void 0;
|
|
8
|
+
var _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
class MigrateProvider extends _Base.default {
|
|
13
|
+
async run() {
|
|
14
|
+
const state = this.state;
|
|
15
|
+
const chainState = state.getChainStateByKey(this.slug);
|
|
16
|
+
const chainInfo = state.getChainInfo(this.slug);
|
|
17
|
+
if (chainState && chainState.active && chainState.currentProvider === this.oldProvider) {
|
|
18
|
+
await state.upsertChainInfo({
|
|
19
|
+
mode: 'update',
|
|
20
|
+
chainEditInfo: {
|
|
21
|
+
currentProvider: this.newProvider,
|
|
22
|
+
slug: this.slug,
|
|
23
|
+
providers: chainInfo.providers
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
exports.default = MigrateProvider;
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.DatabaseService = void 0;
|
|
8
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
9
|
+
var _databases = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/databases"));
|
|
10
|
+
var _dbStores = require("@subwallet/extension-base/services/storage-service/db-stores");
|
|
11
|
+
var _ChainStakingMetadata = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/db-stores/ChainStakingMetadata"));
|
|
12
|
+
var _NominatorMetadata = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/db-stores/NominatorMetadata"));
|
|
13
|
+
var _utils = require("@subwallet/extension-base/utils");
|
|
14
|
+
var _util = require("@polkadot/util");
|
|
15
|
+
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
16
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
17
|
+
|
|
18
|
+
class DatabaseService {
|
|
19
|
+
// TODO: might remove this
|
|
20
|
+
|
|
21
|
+
constructor(eventService) {
|
|
22
|
+
this.eventService = eventService;
|
|
23
|
+
this.logger = (0, _util.logger)('DB-Service');
|
|
24
|
+
this._db = new _databases.default();
|
|
25
|
+
this._db.on('ready', () => {
|
|
26
|
+
this.eventService.emit('database.ready', true);
|
|
27
|
+
});
|
|
28
|
+
this.stores = {
|
|
29
|
+
price: new _dbStores.PriceStore(this._db.price),
|
|
30
|
+
balance: new _dbStores.BalanceStore(this._db.balances),
|
|
31
|
+
nft: new _dbStores.NftStore(this._db.nfts),
|
|
32
|
+
nftCollection: new _dbStores.NftCollectionStore(this._db.nftCollections),
|
|
33
|
+
crowdloan: new _dbStores.CrowdloanStore(this._db.crowdloans),
|
|
34
|
+
staking: new _dbStores.StakingStore(this._db.stakings),
|
|
35
|
+
transaction: new _dbStores.TransactionStore(this._db.transactions),
|
|
36
|
+
migration: new _dbStores.MigrationStore(this._db.migrations),
|
|
37
|
+
metadata: new _dbStores.MetadataStore(this._db.metadata),
|
|
38
|
+
chain: new _dbStores.ChainStore(this._db.chain),
|
|
39
|
+
asset: new _dbStores.AssetStore(this._db.asset),
|
|
40
|
+
// staking
|
|
41
|
+
chainStakingMetadata: new _ChainStakingMetadata.default(this._db.chainStakingMetadata),
|
|
42
|
+
nominatorMetadata: new _NominatorMetadata.default(this._db.nominatorMetadata)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
async updatePriceStore(priceData) {
|
|
46
|
+
await this.stores.price.table.put(priceData);
|
|
47
|
+
}
|
|
48
|
+
async getPriceStore() {
|
|
49
|
+
try {
|
|
50
|
+
const rs = await this.stores.price.table.get('usd');
|
|
51
|
+
return rs;
|
|
52
|
+
} catch (e) {
|
|
53
|
+
this.logger.error(e);
|
|
54
|
+
return undefined;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Balance
|
|
59
|
+
async getStoredBalance() {
|
|
60
|
+
return this.stores.balance.table.toArray();
|
|
61
|
+
}
|
|
62
|
+
async updateBalanceStore(address, item) {
|
|
63
|
+
if (item.state === _KoniTypes.APIItemState.READY) {
|
|
64
|
+
return this.stores.balance.upsert({
|
|
65
|
+
address,
|
|
66
|
+
...item
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
async removeFromBalanceStore(assets) {
|
|
71
|
+
return this.stores.balance.removeBySlugs(assets);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Crowdloan
|
|
75
|
+
async updateCrowdloanStore(chain, address, item) {
|
|
76
|
+
if (item.state === _KoniTypes.APIItemState.READY && item.contribute !== '0') {
|
|
77
|
+
return this.stores.crowdloan.upsert({
|
|
78
|
+
chain,
|
|
79
|
+
address,
|
|
80
|
+
...item
|
|
81
|
+
});
|
|
82
|
+
} else {
|
|
83
|
+
return this.stores.crowdloan.deleteByChainAndAddress(chain, address);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// Staking
|
|
88
|
+
async updateStaking(chain, address, item) {
|
|
89
|
+
if (item.state === _KoniTypes.APIItemState.READY) {
|
|
90
|
+
return this.stores.staking.upsert(item);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
async getStakings(addresses, chains) {
|
|
94
|
+
return this.stores.staking.getStakings(addresses, chains);
|
|
95
|
+
}
|
|
96
|
+
async getStakingsByChains(chains) {
|
|
97
|
+
return this.stores.staking.getStakingsByChains(chains);
|
|
98
|
+
}
|
|
99
|
+
async getPooledStakings(addresses, chainHashes) {
|
|
100
|
+
return this.stores.staking.getPooledStakings(addresses, chainHashes);
|
|
101
|
+
}
|
|
102
|
+
subscribeStaking(addresses, chainList, callback) {
|
|
103
|
+
this.stakingSubscription && this.stakingSubscription.unsubscribe();
|
|
104
|
+
this.stakingSubscription = this.stores.staking.subscribeStaking(addresses, chainList).subscribe({
|
|
105
|
+
next: stakings => callback && callback(stakings)
|
|
106
|
+
});
|
|
107
|
+
return this.stakingSubscription;
|
|
108
|
+
}
|
|
109
|
+
subscribeChainStakingMetadata(chains, callback) {
|
|
110
|
+
this.stores.chainStakingMetadata.subscribeByChain(chains).subscribe({
|
|
111
|
+
next: data => callback && callback(data)
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
subscribeNominatorMetadata(addresses, callback) {
|
|
115
|
+
return this.stores.nominatorMetadata.subscribeByAddresses(addresses).subscribe({
|
|
116
|
+
next: data => callback && callback(data)
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Transaction histories
|
|
121
|
+
async getHistories(query) {
|
|
122
|
+
return this.stores.transaction.queryHistory(query);
|
|
123
|
+
}
|
|
124
|
+
async upsertHistory(histories) {
|
|
125
|
+
const cleanedHistory = histories.filter(x => x && x.address && x.chain && x.extrinsicHash);
|
|
126
|
+
return this.stores.transaction.bulkUpsert(cleanedHistory);
|
|
127
|
+
}
|
|
128
|
+
async updateHistoryByExtrinsicHash(extrinsicHash, updateData) {
|
|
129
|
+
const canUpdate = updateData && extrinsicHash;
|
|
130
|
+
if (!canUpdate) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
return this.stores.transaction.updateWithQuery({
|
|
134
|
+
extrinsicHash
|
|
135
|
+
}, updateData);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
// NFT Collection
|
|
139
|
+
async addNftCollection(collection) {
|
|
140
|
+
return this.stores.nftCollection.upsert(collection);
|
|
141
|
+
}
|
|
142
|
+
async deleteNftCollection(chain, collectionId) {
|
|
143
|
+
await this.stores.nftCollection.removeCollection(chain, collectionId);
|
|
144
|
+
await this.stores.nft.deleteNftsByCollection(chain, collectionId);
|
|
145
|
+
}
|
|
146
|
+
getAllNftCollection(chainHashes) {
|
|
147
|
+
return this.stores.nftCollection.getNftCollection(chainHashes);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// NFT
|
|
151
|
+
subscribeNft(addresses, chainHashes, callback) {
|
|
152
|
+
this.nftSubscription && this.nftSubscription.unsubscribe();
|
|
153
|
+
this.nftSubscription = this.stores.nft.subscribeNft(addresses, chainHashes).subscribe({
|
|
154
|
+
next: nfts => callback && callback(nfts)
|
|
155
|
+
});
|
|
156
|
+
return this.nftSubscription;
|
|
157
|
+
}
|
|
158
|
+
async cleanUpNft(chain, owner, collectionIds, nftIds, ownNothing) {
|
|
159
|
+
if (ownNothing) {
|
|
160
|
+
return this.stores.nft.deleteNftsByChainAndOwner(chain, (0, _utils.reformatAddress)(owner, 42), collectionIds);
|
|
161
|
+
}
|
|
162
|
+
return this.stores.nft.cleanUpNfts(chain, (0, _utils.reformatAddress)(owner, 42), collectionIds, nftIds);
|
|
163
|
+
}
|
|
164
|
+
async getNft(addresses, chainHashes) {
|
|
165
|
+
return this.stores.nft.getNft(addresses, chainHashes);
|
|
166
|
+
}
|
|
167
|
+
async addNft(address, nft) {
|
|
168
|
+
return this.stores.nft.upsert({
|
|
169
|
+
...nft,
|
|
170
|
+
address
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
handleNftTransfer(chain, addresses, nftItem) {
|
|
174
|
+
return this.stores.nft.deleteNftItem(chain, addresses, nftItem);
|
|
175
|
+
}
|
|
176
|
+
removeNfts(chain, address, collectionId, nftIds) {
|
|
177
|
+
return this.stores.nft.removeNfts(chain, address, collectionId, nftIds);
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
// Chain
|
|
181
|
+
async updateChainStore(item) {
|
|
182
|
+
return this.stores.chain.upsert(item);
|
|
183
|
+
}
|
|
184
|
+
async bulkUpdateChainStore(data) {
|
|
185
|
+
return this.stores.chain.bulkUpsert(data);
|
|
186
|
+
}
|
|
187
|
+
async removeFromChainStore(chains) {
|
|
188
|
+
return this.stores.chain.removeChains(chains);
|
|
189
|
+
}
|
|
190
|
+
async getAllChainStore() {
|
|
191
|
+
return this.stores.chain.getAll();
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Asset
|
|
195
|
+
async updateAssetStore(item) {
|
|
196
|
+
return this.stores.asset.upsert(item);
|
|
197
|
+
}
|
|
198
|
+
async getAllAssetStore() {
|
|
199
|
+
return this.stores.asset.getAll();
|
|
200
|
+
}
|
|
201
|
+
async removeFromAssetStore(items) {
|
|
202
|
+
return this.stores.asset.removeAssets(items);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Staking
|
|
206
|
+
async updateChainStakingMetadata(item, changes) {
|
|
207
|
+
const existingRecord = await this.stores.chainStakingMetadata.getByChainAndType(item.chain, item.type);
|
|
208
|
+
if (existingRecord && changes) {
|
|
209
|
+
return this.stores.chainStakingMetadata.updateByChainAndType(item.chain, item.type, changes);
|
|
210
|
+
}
|
|
211
|
+
return this.stores.chainStakingMetadata.upsert(item);
|
|
212
|
+
}
|
|
213
|
+
async getChainStakingMetadata() {
|
|
214
|
+
return this.stores.chainStakingMetadata.getAll();
|
|
215
|
+
}
|
|
216
|
+
async getStakingMetadataByChain(chain) {
|
|
217
|
+
let type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : _KoniTypes.StakingType.NOMINATED;
|
|
218
|
+
return this.stores.chainStakingMetadata.getByChainAndType(chain, type);
|
|
219
|
+
}
|
|
220
|
+
async updateNominatorMetadata(item) {
|
|
221
|
+
return this.stores.nominatorMetadata.upsert(item);
|
|
222
|
+
}
|
|
223
|
+
async getNominatorMetadata() {
|
|
224
|
+
return this.stores.nominatorMetadata.getAll();
|
|
225
|
+
}
|
|
226
|
+
async resetWallet(resetAll) {
|
|
227
|
+
return new Promise((resolve, reject) => {
|
|
228
|
+
const stores = [this.stores.balance, this.stores.nft, this.stores.nftCollection, this.stores.crowdloan, this.stores.staking, this.stores.transaction, this.stores.nominatorMetadata];
|
|
229
|
+
if (resetAll) {
|
|
230
|
+
stores.push(this.stores.chain, this.stores.asset);
|
|
231
|
+
}
|
|
232
|
+
const promises = stores.map(store => store.clear());
|
|
233
|
+
Promise.all(promises).then(() => {
|
|
234
|
+
resolve();
|
|
235
|
+
}).catch(e => {
|
|
236
|
+
reject(e);
|
|
237
|
+
});
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
exports.DatabaseService = DatabaseService;
|