@subwallet/extension-base 1.2.26-0 → 1.2.28-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 +7 -8
- package/cjs/constants/index.js +6 -3
- package/cjs/core/logic-validation/request.js +160 -23
- package/cjs/core/substrate/assets-pallet.js +34 -18
- package/cjs/core/substrate/foreign-asset-pallet.js +2 -9
- package/cjs/core/substrate/xcm-parser.js +2 -1
- package/cjs/koni/api/staking/bonding/utils.js +1 -0
- package/cjs/koni/background/handlers/State.js +35 -66
- package/cjs/koni/background/handlers/Tabs.js +96 -23
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +21 -1
- package/cjs/services/chain-service/index.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +1 -3
- package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +31 -25
- package/cjs/services/earning-service/handlers/nomination-pool/index.js +1 -2
- package/cjs/services/mkt-campaign-service/index.js +30 -6
- package/cjs/services/request-service/handler/EvmRequestHandler.js +0 -1
- package/cjs/services/wallet-connect-service/index.js +25 -1
- package/constants/index.d.ts +1 -0
- package/constants/index.js +1 -0
- package/core/logic-validation/request.d.ts +22 -1
- package/core/logic-validation/request.js +154 -23
- package/core/substrate/assets-pallet.d.ts +7 -3
- package/core/substrate/assets-pallet.js +29 -17
- package/core/substrate/foreign-asset-pallet.d.ts +3 -3
- package/core/substrate/foreign-asset-pallet.js +2 -9
- package/core/substrate/types.d.ts +5 -1
- package/core/substrate/xcm-parser.js +2 -1
- package/koni/api/staking/bonding/utils.js +1 -0
- package/koni/background/handlers/State.d.ts +0 -1
- package/koni/background/handlers/State.js +19 -49
- package/koni/background/handlers/Tabs.d.ts +1 -0
- package/koni/background/handlers/Tabs.js +77 -6
- package/package.json +13 -11
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/substrate/index.js +22 -2
- package/services/chain-service/index.js +1 -1
- package/services/earning-service/constants/chains.d.ts +0 -1
- package/services/earning-service/constants/chains.js +0 -1
- package/services/earning-service/handlers/native-staking/relay-chain.js +32 -26
- package/services/earning-service/handlers/nomination-pool/index.js +1 -2
- package/services/mkt-campaign-service/index.js +30 -6
- package/services/mkt-campaign-service/types.d.ts +2 -0
- package/services/request-service/handler/EvmRequestHandler.js +0 -1
- package/services/wallet-connect-service/index.js +24 -1
- package/types/yield/info/chain/target.d.ts +4 -0
|
@@ -22,6 +22,7 @@ var _utils2 = require("@subwallet/extension-base/utils");
|
|
|
22
22
|
var _web = _interopRequireDefault(require("web3"));
|
|
23
23
|
var _phishing = require("@polkadot/phishing");
|
|
24
24
|
var _util = require("@polkadot/util");
|
|
25
|
+
var _utilCrypto = require("@polkadot/util-crypto");
|
|
25
26
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
26
27
|
// SPDX-License-Identifier: Apache-2.0
|
|
27
28
|
|
|
@@ -286,8 +287,6 @@ class KoniTabs {
|
|
|
286
287
|
} = _ref11;
|
|
287
288
|
const cb = (0, _subscriptions.createSubscription)(id, port);
|
|
288
289
|
const authInfoSubject = this.#koniState.requestService.subscribeAuthorizeUrlSubject;
|
|
289
|
-
|
|
290
|
-
// Update unsubscribe from @polkadot/extension-base
|
|
291
290
|
this.#accountSubs[id] = {
|
|
292
291
|
subscription: authInfoSubject.subscribe(infos => {
|
|
293
292
|
this.getAuthInfo(url, infos).then(authInfo => {
|
|
@@ -298,6 +297,8 @@ class KoniTabs {
|
|
|
298
297
|
}),
|
|
299
298
|
url
|
|
300
299
|
};
|
|
300
|
+
|
|
301
|
+
// Update unsubscribe from @polkadot/extension-base
|
|
301
302
|
port.onDisconnect.addListener(() => {
|
|
302
303
|
this.accountsUnsubscribe(url, {
|
|
303
304
|
id
|
|
@@ -421,10 +422,80 @@ class KoniTabs {
|
|
|
421
422
|
date: new Date().getTime()
|
|
422
423
|
}];
|
|
423
424
|
}
|
|
424
|
-
async
|
|
425
|
+
async revokePermissions(url, id, _ref13) {
|
|
425
426
|
let {
|
|
426
427
|
params
|
|
427
428
|
} = _ref13;
|
|
429
|
+
if (!params || !(0, _util.isArray)(params) || params.length === 0) {
|
|
430
|
+
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, 'No list of permissions found to revoke in the parameters.');
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
// Example of a request in MetaMask wallet
|
|
434
|
+
// await window.ethereum.request({
|
|
435
|
+
// "method": "wallet_revokePermissions",
|
|
436
|
+
// "params": [
|
|
437
|
+
// {
|
|
438
|
+
// "eth_accounts": {}
|
|
439
|
+
// }
|
|
440
|
+
// ]
|
|
441
|
+
// });
|
|
442
|
+
// Doc: https://docs.metamask.io/wallet/reference/wallet_revokepermissions/
|
|
443
|
+
|
|
444
|
+
const permissions = new Set(Object.keys(params[0]).filter(permission => _constants.PERMISSIONS_TO_REVOKE.includes(permission)));
|
|
445
|
+
const permissionPromise = async permission => {
|
|
446
|
+
if (permission === 'eth_accounts') {
|
|
447
|
+
return new Promise(resolve => {
|
|
448
|
+
this.#koniState.getAuthorize(value => {
|
|
449
|
+
const urlStripped = (0, _utils2.stripUrl)(url);
|
|
450
|
+
if (value && value[urlStripped]) {
|
|
451
|
+
const {
|
|
452
|
+
accountAuthType,
|
|
453
|
+
isAllowedMap
|
|
454
|
+
} = {
|
|
455
|
+
...value[urlStripped]
|
|
456
|
+
};
|
|
457
|
+
if (!accountAuthType) {
|
|
458
|
+
resolve();
|
|
459
|
+
}
|
|
460
|
+
switch (accountAuthType) {
|
|
461
|
+
case 'substrate':
|
|
462
|
+
resolve();
|
|
463
|
+
break;
|
|
464
|
+
case 'evm':
|
|
465
|
+
delete value[urlStripped];
|
|
466
|
+
break;
|
|
467
|
+
case 'both':
|
|
468
|
+
{
|
|
469
|
+
value[urlStripped].isAllowedMap = Object.entries(isAllowedMap).reduce((allowedMap, _ref14) => {
|
|
470
|
+
let [address, value] = _ref14;
|
|
471
|
+
if ((0, _utilCrypto.isEthereumAddress)(address)) {
|
|
472
|
+
allowedMap[address] = false;
|
|
473
|
+
} else {
|
|
474
|
+
allowedMap[address] = value;
|
|
475
|
+
}
|
|
476
|
+
return allowedMap;
|
|
477
|
+
}, {});
|
|
478
|
+
value[urlStripped].accountAuthType = 'substrate';
|
|
479
|
+
break;
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
this.#koniState.setAuthorize(value, () => {
|
|
483
|
+
resolve();
|
|
484
|
+
});
|
|
485
|
+
} else {
|
|
486
|
+
resolve();
|
|
487
|
+
}
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
await Promise.all(Array.from(permissions).map(permissionPromise));
|
|
493
|
+
return null;
|
|
494
|
+
}
|
|
495
|
+
async switchEvmChain(id, url, _ref15) {
|
|
496
|
+
let {
|
|
497
|
+
params
|
|
498
|
+
} = _ref15;
|
|
428
499
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
|
|
429
500
|
const chainId = params[0].chainId;
|
|
430
501
|
const chainIdDec = parseInt(chainId, 16);
|
|
@@ -456,11 +527,11 @@ class KoniTabs {
|
|
|
456
527
|
}
|
|
457
528
|
return null;
|
|
458
529
|
}
|
|
459
|
-
async addEvmToken(id, url,
|
|
530
|
+
async addEvmToken(id, url, _ref16) {
|
|
460
531
|
var _input$type, _input$options, _input$options2, _input$options3, _input$options4, _input$options5;
|
|
461
532
|
let {
|
|
462
533
|
params
|
|
463
|
-
} =
|
|
534
|
+
} = _ref16;
|
|
464
535
|
const input = params;
|
|
465
536
|
const _tokenType = (input === null || input === void 0 ? void 0 : (_input$type = input.type) === null || _input$type === void 0 ? void 0 : _input$type.toLowerCase()) || '';
|
|
466
537
|
if (_tokenType !== 'erc20' && _tokenType !== 'erc721') {
|
|
@@ -513,10 +584,10 @@ class KoniTabs {
|
|
|
513
584
|
|
|
514
585
|
return await this.#koniState.addTokenConfirm(id, url, tokenInfo);
|
|
515
586
|
}
|
|
516
|
-
async addEvmChain(id, url,
|
|
587
|
+
async addEvmChain(id, url, _ref17) {
|
|
517
588
|
let {
|
|
518
589
|
params
|
|
519
|
-
} =
|
|
590
|
+
} = _ref17;
|
|
520
591
|
const input = params;
|
|
521
592
|
if (input && input.length > 0) {
|
|
522
593
|
const {
|
|
@@ -719,11 +790,11 @@ class KoniTabs {
|
|
|
719
790
|
const networkCheckInterval = setInterval(networkCheck, _constants.CRON_GET_API_MAP_STATUS);
|
|
720
791
|
const provider = await this.getEvmProvider(url);
|
|
721
792
|
const eventMap = {};
|
|
722
|
-
eventMap.data =
|
|
793
|
+
eventMap.data = _ref18 => {
|
|
723
794
|
let {
|
|
724
795
|
method,
|
|
725
796
|
params
|
|
726
|
-
} =
|
|
797
|
+
} = _ref18;
|
|
727
798
|
emitEvent('message', {
|
|
728
799
|
type: method,
|
|
729
800
|
data: params
|
|
@@ -732,8 +803,8 @@ class KoniTabs {
|
|
|
732
803
|
eventMap.error = rs => {
|
|
733
804
|
emitEvent('error', rs);
|
|
734
805
|
};
|
|
735
|
-
Object.entries(eventMap).forEach(
|
|
736
|
-
let [event, callback] =
|
|
806
|
+
Object.entries(eventMap).forEach(_ref19 => {
|
|
807
|
+
let [event, callback] = _ref19;
|
|
737
808
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
738
809
|
(provider === null || provider === void 0 ? void 0 : provider.on) && (provider === null || provider === void 0 ? void 0 : provider.on(event, callback));
|
|
739
810
|
});
|
|
@@ -747,8 +818,8 @@ class KoniTabs {
|
|
|
747
818
|
if (this.evmEventEmitterMap[url][id]) {
|
|
748
819
|
delete this.evmEventEmitterMap[url][id];
|
|
749
820
|
}
|
|
750
|
-
Object.entries(eventMap).forEach(
|
|
751
|
-
let [event, callback] =
|
|
821
|
+
Object.entries(eventMap).forEach(_ref20 => {
|
|
822
|
+
let [event, callback] = _ref20;
|
|
752
823
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
753
824
|
(provider === null || provider === void 0 ? void 0 : provider.removeListener) && (provider === null || provider === void 0 ? void 0 : provider.removeListener(event, callback));
|
|
754
825
|
});
|
|
@@ -783,11 +854,11 @@ class KoniTabs {
|
|
|
783
854
|
}
|
|
784
855
|
return provider;
|
|
785
856
|
}
|
|
786
|
-
async performWeb3Method(id, url,
|
|
857
|
+
async performWeb3Method(id, url, _ref21, callback) {
|
|
787
858
|
let {
|
|
788
859
|
method,
|
|
789
860
|
params
|
|
790
|
-
} =
|
|
861
|
+
} = _ref21;
|
|
791
862
|
const provider = await this.getEvmProvider(url);
|
|
792
863
|
this.checkAndHandleProviderStatus(provider);
|
|
793
864
|
return new Promise((resolve, reject) => {
|
|
@@ -823,11 +894,11 @@ class KoniTabs {
|
|
|
823
894
|
const allowedAccounts = await this.getEvmCurrentAccount(url);
|
|
824
895
|
return !!allowedAccounts.find(acc => acc.toLowerCase() === address.toLowerCase());
|
|
825
896
|
}
|
|
826
|
-
async evmSign(id, url,
|
|
897
|
+
async evmSign(id, url, _ref22) {
|
|
827
898
|
let {
|
|
828
899
|
method,
|
|
829
900
|
params
|
|
830
|
-
} =
|
|
901
|
+
} = _ref22;
|
|
831
902
|
const signResult = await this.#koniState.evmSign(id, url, method, params);
|
|
832
903
|
if (signResult) {
|
|
833
904
|
return signResult;
|
|
@@ -835,10 +906,10 @@ class KoniTabs {
|
|
|
835
906
|
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, 'Failed to sign message');
|
|
836
907
|
}
|
|
837
908
|
}
|
|
838
|
-
async evmSendTransaction(id, url,
|
|
909
|
+
async evmSendTransaction(id, url, _ref23) {
|
|
839
910
|
let {
|
|
840
911
|
params
|
|
841
|
-
} =
|
|
912
|
+
} = _ref23;
|
|
842
913
|
const transactionParams = params[0];
|
|
843
914
|
const transactionHash = await this.#koniState.evmSendTransaction(id, url, transactionParams);
|
|
844
915
|
if (!transactionHash) {
|
|
@@ -881,6 +952,8 @@ class KoniTabs {
|
|
|
881
952
|
return await this.getEvmPermission(url, id);
|
|
882
953
|
case 'wallet_getPermissions':
|
|
883
954
|
return await this.getEvmPermission(url, id);
|
|
955
|
+
case 'wallet_revokePermissions':
|
|
956
|
+
return await this.revokePermissions(url, id, request);
|
|
884
957
|
case 'wallet_addEthereumChain':
|
|
885
958
|
return await this.addEvmChain(id, url, request);
|
|
886
959
|
case 'wallet_switchEthereumChain':
|
|
@@ -920,13 +993,13 @@ class KoniTabs {
|
|
|
920
993
|
return true;
|
|
921
994
|
}
|
|
922
995
|
isEvmPublicRequest(type, request) {
|
|
923
|
-
return type === 'evm(request)' && ['eth_chainId', 'net_version'].includes(request === null || request === void 0 ? void 0 : request.method);
|
|
996
|
+
return type === 'evm(request)' && ['eth_chainId', 'net_version', 'wallet_requestPermissions', 'wallet_getPermissions'].includes(request === null || request === void 0 ? void 0 : request.method) || type === 'evm(events.subscribe)';
|
|
924
997
|
}
|
|
925
|
-
async addPspToken(id, url,
|
|
998
|
+
async addPspToken(id, url, _ref24) {
|
|
926
999
|
let {
|
|
927
1000
|
genesisHash,
|
|
928
1001
|
tokenInfo: input
|
|
929
|
-
} =
|
|
1002
|
+
} = _ref24;
|
|
930
1003
|
const _tokenType = input.type;
|
|
931
1004
|
if (_tokenType !== 'psp22' && _tokenType !== 'psp34') {
|
|
932
1005
|
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INVALID_PARAMS, 'Assets type {{tokenType}} is not supported'.replace('{{tokenType}}', _tokenType));
|
|
@@ -987,7 +1060,7 @@ class KoniTabs {
|
|
|
987
1060
|
|
|
988
1061
|
// Wait for account ready and chain ready
|
|
989
1062
|
await Promise.all([this.#koniState.eventService.waitAccountReady, this.#koniState.eventService.waitChainReady]);
|
|
990
|
-
if (
|
|
1063
|
+
if (!['pub(authorize.tabV2)', 'pub(accounts.subscribeV2)'].includes(type) && !this.isEvmPublicRequest(type, request)) {
|
|
991
1064
|
await this.#koniState.ensureUrlAuthorizedV2(url).catch(e => {
|
|
992
1065
|
if (type.startsWith('evm')) {
|
|
993
1066
|
throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.INTERNAL_ERROR, e.message);
|
package/cjs/packageInfo.js
CHANGED
|
@@ -191,6 +191,16 @@ const subscribeForeignAssetBalance = async _ref2 => {
|
|
|
191
191
|
const balances = rs[foreignAssetsAccountKey];
|
|
192
192
|
const items = balances.map((_balance, index) => {
|
|
193
193
|
const balanceInfo = _balance;
|
|
194
|
+
if (!balanceInfo) {
|
|
195
|
+
// no balance info response
|
|
196
|
+
return {
|
|
197
|
+
address: addresses[index],
|
|
198
|
+
tokenSlug: tokenInfo.slug,
|
|
199
|
+
free: '0',
|
|
200
|
+
locked: '0',
|
|
201
|
+
state: _KoniTypes.APIItemState.READY
|
|
202
|
+
};
|
|
203
|
+
}
|
|
194
204
|
const transferableBalance = (0, _foreignAssetPallet._getForeignAssetPalletTransferable)(balanceInfo, (0, _utils2._getAssetExistentialDeposit)(tokenInfo), extrinsicType);
|
|
195
205
|
const totalLockedFromTransfer = (0, _foreignAssetPallet._getForeignAssetPalletLockedBalance)(balanceInfo);
|
|
196
206
|
return {
|
|
@@ -365,8 +375,18 @@ const subscribeAssetsAccountPallet = async _ref6 => {
|
|
|
365
375
|
const balances = rs[assetsAccountKey];
|
|
366
376
|
const items = balances.map((_balance, index) => {
|
|
367
377
|
const balanceInfo = _balance;
|
|
378
|
+
if (!balanceInfo) {
|
|
379
|
+
// no balance info response
|
|
380
|
+
return {
|
|
381
|
+
address: addresses[index],
|
|
382
|
+
tokenSlug: tokenInfo.slug,
|
|
383
|
+
free: '0',
|
|
384
|
+
locked: '0',
|
|
385
|
+
state: _KoniTypes.APIItemState.READY
|
|
386
|
+
};
|
|
387
|
+
}
|
|
368
388
|
const transferableBalance = (0, _assetsPallet._getAssetsPalletTransferable)(balanceInfo, (0, _utils2._getAssetExistentialDeposit)(tokenInfo), extrinsicType);
|
|
369
|
-
const totalLockedFromTransfer = (0, _assetsPallet.
|
|
389
|
+
const totalLockedFromTransfer = (0, _assetsPallet._getAssetsPalletLocked)(balanceInfo);
|
|
370
390
|
return {
|
|
371
391
|
address: addresses[index],
|
|
372
392
|
tokenSlug: tokenInfo.slug,
|
|
@@ -28,7 +28,7 @@ const filterChainInfoMap = (data, ignoredChains) => {
|
|
|
28
28
|
return !info.bitcoinInfo && !ignoredChains.includes(slug);
|
|
29
29
|
}));
|
|
30
30
|
};
|
|
31
|
-
const ignoredList = ['bevm', 'bevmTest', 'bevm_testnet', 'layerEdge_testnet', 'merlinEvm', 'botanixEvmTest', 'syscoin_evm', 'syscoin_evm_testnet', 'rollux_evm', 'rollux_testnet', 'boolAlpha', 'boolBeta_testnet', 'core', 'satoshivm', 'satoshivm_testnet', 'ton', 'ton_testnet'];
|
|
31
|
+
const ignoredList = ['bevm', 'bevmTest', 'bevm_testnet', 'layerEdge_testnet', 'merlinEvm', 'botanixEvmTest', 'syscoin_evm', 'syscoin_evm_testnet', 'rollux_evm', 'rollux_testnet', 'boolAlpha', 'boolBeta_testnet', 'core', 'satoshivm', 'satoshivm_testnet', 'ton', 'ton_testnet', 'storyPartner_testnet'];
|
|
32
32
|
const filterAssetInfoMap = (chainInfo, assets) => {
|
|
33
33
|
return Object.fromEntries(Object.entries(assets).filter(_ref2 => {
|
|
34
34
|
let [, info] = _ref2;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.
|
|
6
|
+
exports._STAKING_CHAIN_GROUP = exports.ST_LIQUID_TOKEN_ABI = exports.MaxEraRewardPointsEras = exports.MANTA_VALIDATOR_POINTS_PER_BLOCK = exports.MANTA_MIN_DELEGATION = void 0;
|
|
7
7
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
8
8
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
9
|
|
|
@@ -25,8 +25,6 @@ const _STAKING_CHAIN_GROUP = {
|
|
|
25
25
|
manta: ['manta_network']
|
|
26
26
|
};
|
|
27
27
|
exports._STAKING_CHAIN_GROUP = _STAKING_CHAIN_GROUP;
|
|
28
|
-
const _UPDATED_RUNTIME_STAKING_GROUP = ['kusama', 'polkadot', 'westend', 'availTuringTest', 'avail_mainnet', 'dentnet'];
|
|
29
|
-
exports._UPDATED_RUNTIME_STAKING_GROUP = _UPDATED_RUNTIME_STAKING_GROUP;
|
|
30
28
|
const MaxEraRewardPointsEras = 14;
|
|
31
29
|
|
|
32
30
|
// eslint-disable-next-line @typescript-eslint/no-var-requires,@typescript-eslint/no-unsafe-assignment
|
|
@@ -199,7 +199,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
199
199
|
let nominationStatus = _types.EarningStatus.NOT_EARNING;
|
|
200
200
|
let eraStakerOtherList = [];
|
|
201
201
|
let identity;
|
|
202
|
-
if (
|
|
202
|
+
if (substrateApi.api.query.staking.erasStakersPaged) {
|
|
203
203
|
// todo: review all relaychains later
|
|
204
204
|
const [[_identity], _eraStaker] = await Promise.all([(0, _utils3.parseIdentity)(substrateApi, validatorAddress), substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress)]);
|
|
205
205
|
identity = _identity;
|
|
@@ -307,20 +307,19 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
307
307
|
const maxEraRewardPointsEras = _constants2.MaxEraRewardPointsEras;
|
|
308
308
|
const endEraForPoints = parseInt(activeEra) - 1;
|
|
309
309
|
const startEraForPoints = Math.max(endEraForPoints - maxEraRewardPointsEras + 1, 0);
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
// todo: review all relaychains later
|
|
313
|
-
_eraStakersPromise = chainApi.api.query.staking.erasStakersOverview.entries(parseInt(currentEra));
|
|
314
|
-
} else {
|
|
315
|
-
_eraStakersPromise = chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra));
|
|
316
|
-
}
|
|
310
|
+
const _eraStakersPromise = chainApi.api.query.staking.erasStakersOverview // todo: review all relaychains later
|
|
311
|
+
? chainApi.api.query.staking.erasStakersOverview.entries(parseInt(currentEra)) : chainApi.api.query.staking.erasStakers.entries(parseInt(currentEra));
|
|
317
312
|
const [_totalEraStake, _eraStakers, _minBond, _stakingRewards, _validators, ..._eraRewardPoints] = await Promise.all([chainApi.api.query.staking.erasTotalStake(parseInt(currentEra)), _eraStakersPromise, 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(), chainApi.api.query.staking.erasRewardPoints.multi([...Array(maxEraRewardPointsEras).keys()].map(i => i + startEraForPoints))]);
|
|
318
313
|
const eraRewardMap = (0, _utils.getRelayEraRewardMap)(_eraRewardPoints[0], startEraForPoints);
|
|
319
314
|
const validatorPointsMap = (0, _utils.getRelayValidatorPointsMap)(eraRewardMap);
|
|
320
315
|
const topValidatorList = (0, _utils.getRelayTopValidatorByPoints)(validatorPointsMap);
|
|
321
|
-
const
|
|
322
|
-
|
|
323
|
-
|
|
316
|
+
const allValidatorList = _validators;
|
|
317
|
+
|
|
318
|
+
// todo: optimize naming for all filtered validatorList: all, block, waiting, selected, waiting but is not selected, waiting but is not blocked, ...
|
|
319
|
+
const blockedValidatorList = (0, _utils.getRelayBlockedValidatorList)(allValidatorList);
|
|
320
|
+
const waitingValidatorList = (0, _utils.getRelayWaitingValidatorList)(allValidatorList); // all validators that are not blocked
|
|
321
|
+
|
|
322
|
+
// todo: improve handle waitingValidatorLedger
|
|
324
323
|
const _waitingValidatorLedger = await chainApi.api.query.staking.ledger.multi(waitingValidatorList);
|
|
325
324
|
const waitingValidatorLedger = {};
|
|
326
325
|
if (_waitingValidatorLedger) {
|
|
@@ -334,7 +333,9 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
334
333
|
const maxNominatorRewarded = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
|
|
335
334
|
const bnTotalEraStake = new _util.BN(_totalEraStake.toString());
|
|
336
335
|
const minBond = _minBond.toPrimitive();
|
|
337
|
-
const [totalStakeMap, allValidatorAddresses,
|
|
336
|
+
const [totalStakeMap, allValidatorAddresses, allValidatorInfo] = this.parseEraStakerData(_eraStakers, blockedValidatorList, waitingValidatorLedger, topValidatorList, validatorPointsMap, minBond, maxNominatorRewarded, unlimitedNominatorRewarded);
|
|
337
|
+
const currentSelectedValidatorList = allValidatorInfo.currentSelectedValidatorList;
|
|
338
|
+
const allValidatorInfoList = [...currentSelectedValidatorList, ...allValidatorInfo.waitingValidatorList];
|
|
338
339
|
const extraInfoMap = {};
|
|
339
340
|
await Promise.all(allValidatorAddresses.map(async address => {
|
|
340
341
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
|
|
@@ -348,17 +349,19 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
348
349
|
};
|
|
349
350
|
}));
|
|
350
351
|
const decimals = this.nativeToken.decimals || 0;
|
|
351
|
-
const bnAvgStake = (0, _utils3.applyDecimal)(bnTotalEraStake.divn(
|
|
352
|
-
for (const validator of
|
|
352
|
+
const bnAvgStake = (0, _utils3.applyDecimal)(bnTotalEraStake.divn(currentSelectedValidatorList.length), decimals);
|
|
353
|
+
for (const validator of allValidatorInfoList) {
|
|
353
354
|
const commissionString = extraInfoMap[validator.address].commission;
|
|
354
355
|
const commission = (0, _utils.getCommission)(commissionString);
|
|
355
|
-
|
|
356
|
+
|
|
357
|
+
// the waiting validator is missing info for calculating APY
|
|
358
|
+
validator.expectedReturn = currentSelectedValidatorList.includes(validator) ? this.getValidatorExpectedReturn(this.chain, validator, poolInfo.statistic.totalApy, commission, _stakingRewards, allValidatorAddresses, decimals, totalStakeMap, bnAvgStake) : 0;
|
|
356
359
|
validator.commission = commission;
|
|
357
360
|
validator.blocked = extraInfoMap[validator.address].blocked;
|
|
358
361
|
validator.identity = extraInfoMap[validator.address].identity;
|
|
359
362
|
validator.isVerified = extraInfoMap[validator.address].isVerified;
|
|
360
363
|
}
|
|
361
|
-
return
|
|
364
|
+
return allValidatorInfoList;
|
|
362
365
|
}
|
|
363
366
|
getValidatorExpectedReturn(chain, validator, totalApy, commission, _stakingRewards, allValidatorAddresses, decimals, totalStakeMap, bnAvgStake) {
|
|
364
367
|
if (_constants2._STAKING_CHAIN_GROUP.aleph.includes(chain)) {
|
|
@@ -377,10 +380,13 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
377
380
|
}
|
|
378
381
|
}
|
|
379
382
|
}
|
|
380
|
-
parseEraStakerData(_eraStakers, blockedValidatorList,
|
|
383
|
+
parseEraStakerData(_eraStakers, blockedValidatorList, waitingValidatorLedger, topValidatorList, validatorPointsMap, minBond, maxNominatorRewarded, unlimitedNominatorRewarded) {
|
|
381
384
|
const totalStakeMap = {};
|
|
382
385
|
const allValidatorAddresses = [];
|
|
383
|
-
const
|
|
386
|
+
const allValidatorInfo = {
|
|
387
|
+
currentSelectedValidatorList: [],
|
|
388
|
+
waitingValidatorList: []
|
|
389
|
+
};
|
|
384
390
|
for (const item of _eraStakers) {
|
|
385
391
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
386
392
|
const rawValidatorInfo = item[0].toHuman();
|
|
@@ -398,7 +404,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
398
404
|
const otherStake = bnTotalStake.sub(bnOwnStake);
|
|
399
405
|
totalStakeMap[validatorAddress] = bnTotalStake;
|
|
400
406
|
let nominatorCount = 0;
|
|
401
|
-
if (
|
|
407
|
+
if (rawValidatorStat.nominatorCount) {
|
|
402
408
|
nominatorCount = rawValidatorStat.nominatorCount;
|
|
403
409
|
} else {
|
|
404
410
|
if ('others' in rawValidatorStat) {
|
|
@@ -409,7 +415,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
409
415
|
}
|
|
410
416
|
}
|
|
411
417
|
allValidatorAddresses.push(validatorAddress);
|
|
412
|
-
|
|
418
|
+
allValidatorInfo.currentSelectedValidatorList.push({
|
|
413
419
|
address: validatorAddress,
|
|
414
420
|
totalStake: bnTotalStake.toString(),
|
|
415
421
|
ownStake: bnOwnStake.toString(),
|
|
@@ -427,13 +433,13 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
427
433
|
});
|
|
428
434
|
}
|
|
429
435
|
}
|
|
430
|
-
for (const waitingValidator of Object.keys(
|
|
436
|
+
for (const waitingValidator of Object.keys(waitingValidatorLedger)) {
|
|
431
437
|
if (!allValidatorAddresses.includes(waitingValidator)) {
|
|
432
438
|
allValidatorAddresses.push(waitingValidator);
|
|
433
|
-
|
|
439
|
+
allValidatorInfo.waitingValidatorList.push({
|
|
434
440
|
address: waitingValidator,
|
|
435
|
-
totalStake:
|
|
436
|
-
ownStake:
|
|
441
|
+
totalStake: waitingValidatorLedger[waitingValidator],
|
|
442
|
+
ownStake: waitingValidatorLedger[waitingValidator],
|
|
437
443
|
otherStake: '0',
|
|
438
444
|
nominatorCount: 0,
|
|
439
445
|
// to be added later
|
|
@@ -448,7 +454,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
|
|
|
448
454
|
});
|
|
449
455
|
}
|
|
450
456
|
}
|
|
451
|
-
return [totalStakeMap, allValidatorAddresses,
|
|
457
|
+
return [totalStakeMap, allValidatorAddresses, allValidatorInfo];
|
|
452
458
|
}
|
|
453
459
|
/* Get pool targets */
|
|
454
460
|
|
|
@@ -10,7 +10,6 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
|
10
10
|
var _utils = require("@subwallet/extension-base/koni/api/staking/bonding/utils");
|
|
11
11
|
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
12
12
|
var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
|
|
13
|
-
var _constants2 = require("@subwallet/extension-base/services/earning-service/constants");
|
|
14
13
|
var _types = require("@subwallet/extension-base/types");
|
|
15
14
|
var _utils3 = require("@subwallet/extension-base/utils");
|
|
16
15
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
@@ -170,7 +169,7 @@ class NominationPoolHandler extends _base.default {
|
|
|
170
169
|
const validatorList = nominations.targets;
|
|
171
170
|
await Promise.all(validatorList.map(async validatorAddress => {
|
|
172
171
|
let eraStakerOtherList = [];
|
|
173
|
-
if (
|
|
172
|
+
if (substrateApi.api.query.staking.erasStakersPaged) {
|
|
174
173
|
// todo: review all relaychains later
|
|
175
174
|
const _eraStaker = await substrateApi.api.query.staking.erasStakersPaged.entries(currentEra, validatorAddress);
|
|
176
175
|
eraStakerOtherList = _eraStaker.flatMap(paged => paged[1].toPrimitive().others);
|
|
@@ -247,35 +247,59 @@ class MktCampaignService {
|
|
|
247
247
|
const isValidArr = conditionBalance.map(condition => {
|
|
248
248
|
return conditionMap[JSON.stringify(condition)];
|
|
249
249
|
});
|
|
250
|
-
|
|
250
|
+
if (item.comparison_operator === 'AND') {
|
|
251
|
+
isPassValidation.push(isValidArr.every(i => i));
|
|
252
|
+
} else {
|
|
253
|
+
isPassValidation.push(isValidArr.some(i => i));
|
|
254
|
+
}
|
|
251
255
|
}
|
|
252
256
|
if (conditionEarning && conditionEarning.length) {
|
|
253
257
|
const isValidArr = conditionEarning.map(condition => {
|
|
254
258
|
return conditionMap[JSON.stringify(condition)];
|
|
255
259
|
});
|
|
256
|
-
|
|
260
|
+
if (item.comparison_operator === 'AND') {
|
|
261
|
+
isPassValidation.push(isValidArr.every(i => i));
|
|
262
|
+
} else {
|
|
263
|
+
isPassValidation.push(isValidArr.some(i => i));
|
|
264
|
+
}
|
|
257
265
|
}
|
|
258
266
|
if (conditionNft && conditionNft.length) {
|
|
259
267
|
const isValidArr = conditionNft.map(condition => {
|
|
260
268
|
return conditionMap[JSON.stringify(condition)];
|
|
261
269
|
});
|
|
262
|
-
|
|
270
|
+
if (item.comparison_operator === 'AND') {
|
|
271
|
+
isPassValidation.push(isValidArr.every(i => i));
|
|
272
|
+
} else {
|
|
273
|
+
isPassValidation.push(isValidArr.some(i => i));
|
|
274
|
+
}
|
|
263
275
|
}
|
|
264
276
|
if (conditionCrowdloan && conditionCrowdloan.length) {
|
|
265
277
|
const isValidArr = conditionCrowdloan.map(condition => {
|
|
266
278
|
return conditionMap[JSON.stringify(condition)];
|
|
267
279
|
});
|
|
268
|
-
|
|
280
|
+
if (item.comparison_operator === 'AND') {
|
|
281
|
+
isPassValidation.push(isValidArr.every(i => i));
|
|
282
|
+
} else {
|
|
283
|
+
isPassValidation.push(isValidArr.some(i => i));
|
|
284
|
+
}
|
|
269
285
|
}
|
|
270
286
|
if (conditionHasMoney && conditionHasMoney.length) {
|
|
271
287
|
const isValidArr = conditionHasMoney.map(condition => {
|
|
272
288
|
return conditionMap[JSON.stringify(condition)];
|
|
273
289
|
});
|
|
274
|
-
|
|
290
|
+
if (item.comparison_operator === 'AND') {
|
|
291
|
+
isPassValidation.push(isValidArr.every(i => i));
|
|
292
|
+
} else {
|
|
293
|
+
isPassValidation.push(isValidArr.some(i => i));
|
|
294
|
+
}
|
|
275
295
|
}
|
|
276
296
|
}
|
|
277
297
|
if (isPassValidation && isPassValidation.length) {
|
|
278
|
-
|
|
298
|
+
if (item.comparison_operator === 'AND') {
|
|
299
|
+
return isPassValidation.every(_i => _i);
|
|
300
|
+
} else {
|
|
301
|
+
return isPassValidation.some(_i => _i);
|
|
302
|
+
}
|
|
279
303
|
} else {
|
|
280
304
|
return true;
|
|
281
305
|
}
|
|
@@ -57,6 +57,7 @@ var _option = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("option");
|
|
|
57
57
|
var _updateSessions = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("updateSessions");
|
|
58
58
|
var _onSessionProposal = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("onSessionProposal");
|
|
59
59
|
var _onSessionRequest = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("onSessionRequest");
|
|
60
|
+
var _onPingReply = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("onPingReply");
|
|
60
61
|
var _createListener = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("createListener");
|
|
61
62
|
var _removeListener = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("removeListener");
|
|
62
63
|
var _checkClient = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("checkClient");
|
|
@@ -72,6 +73,9 @@ class WalletConnectService {
|
|
|
72
73
|
Object.defineProperty(this, _createListener, {
|
|
73
74
|
value: _createListener2
|
|
74
75
|
});
|
|
76
|
+
Object.defineProperty(this, _onPingReply, {
|
|
77
|
+
value: _onPingReply2
|
|
78
|
+
});
|
|
75
79
|
Object.defineProperty(this, _onSessionRequest, {
|
|
76
80
|
value: _onSessionRequest2
|
|
77
81
|
});
|
|
@@ -318,11 +322,31 @@ function _onSessionRequest2(requestEvent) {
|
|
|
318
322
|
}).catch(console.error);
|
|
319
323
|
}
|
|
320
324
|
}
|
|
325
|
+
async function _onPingReply2(_ref4) {
|
|
326
|
+
let {
|
|
327
|
+
topic
|
|
328
|
+
} = _ref4;
|
|
329
|
+
// Doc: https://specs.walletconnect.com/2.0/specs/clients/sign/session-events#session_ping
|
|
330
|
+
|
|
331
|
+
(0, _classPrivateFieldLooseBase2.default)(this, _checkClient)[_checkClient]();
|
|
332
|
+
try {
|
|
333
|
+
var _requestSession$names, _requestSession$names2;
|
|
334
|
+
const requestSession = this.getSession(topic);
|
|
335
|
+
const sessionAccounts = (((_requestSession$names = requestSession.namespaces.eip155) === null || _requestSession$names === void 0 ? void 0 : _requestSession$names.accounts) || []).concat(((_requestSession$names2 = requestSession.namespaces.polkadot) === null || _requestSession$names2 === void 0 ? void 0 : _requestSession$names2.accounts) || []);
|
|
336
|
+
if (sessionAccounts.length > 0 && (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) {
|
|
337
|
+
await (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client].ping({
|
|
338
|
+
topic
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
} catch (e) {
|
|
342
|
+
console.error(e);
|
|
343
|
+
}
|
|
344
|
+
}
|
|
321
345
|
function _createListener2() {
|
|
322
346
|
var _classPrivateFieldLoo14, _classPrivateFieldLoo15, _classPrivateFieldLoo16, _classPrivateFieldLoo17, _classPrivateFieldLoo18, _classPrivateFieldLoo19;
|
|
323
347
|
(_classPrivateFieldLoo14 = (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) === null || _classPrivateFieldLoo14 === void 0 ? void 0 : _classPrivateFieldLoo14.on('session_proposal', (0, _classPrivateFieldLooseBase2.default)(this, _onSessionProposal)[_onSessionProposal].bind(this));
|
|
324
348
|
(_classPrivateFieldLoo15 = (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) === null || _classPrivateFieldLoo15 === void 0 ? void 0 : _classPrivateFieldLoo15.on('session_request', (0, _classPrivateFieldLooseBase2.default)(this, _onSessionRequest)[_onSessionRequest].bind(this));
|
|
325
|
-
(_classPrivateFieldLoo16 = (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) === null || _classPrivateFieldLoo16 === void 0 ? void 0 : _classPrivateFieldLoo16.on('session_ping',
|
|
349
|
+
(_classPrivateFieldLoo16 = (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) === null || _classPrivateFieldLoo16 === void 0 ? void 0 : _classPrivateFieldLoo16.on('session_ping', (0, _classPrivateFieldLooseBase2.default)(this, _onPingReply)[_onPingReply].bind(this));
|
|
326
350
|
(_classPrivateFieldLoo17 = (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) === null || _classPrivateFieldLoo17 === void 0 ? void 0 : _classPrivateFieldLoo17.on('session_event', data => console.log('event', data));
|
|
327
351
|
(_classPrivateFieldLoo18 = (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) === null || _classPrivateFieldLoo18 === void 0 ? void 0 : _classPrivateFieldLoo18.on('session_update', data => console.log('update', data));
|
|
328
352
|
(_classPrivateFieldLoo19 = (0, _classPrivateFieldLooseBase2.default)(this, _client)[_client]) === null || _classPrivateFieldLoo19 === void 0 ? void 0 : _classPrivateFieldLoo19.on('session_delete', (0, _classPrivateFieldLooseBase2.default)(this, _updateSessions)[_updateSessions].bind(this));
|
package/constants/index.d.ts
CHANGED
|
@@ -29,5 +29,6 @@ export declare const GAS_PRICE_RATIO: number;
|
|
|
29
29
|
export declare const NETWORK_MULTI_GAS_FEE: string[];
|
|
30
30
|
export declare const ORDINAL_COLLECTION = "__Ordinal__";
|
|
31
31
|
export declare const ORDINAL_METHODS: string[];
|
|
32
|
+
export declare const PERMISSIONS_TO_REVOKE: string[];
|
|
32
33
|
export * from './staking';
|
|
33
34
|
export * from './storage';
|
package/constants/index.js
CHANGED
|
@@ -32,5 +32,6 @@ export const GAS_PRICE_RATIO = 1 + 2 / 100;
|
|
|
32
32
|
export const NETWORK_MULTI_GAS_FEE = ['*'];
|
|
33
33
|
export const ORDINAL_COLLECTION = '__Ordinal__';
|
|
34
34
|
export const ORDINAL_METHODS = ['drc-20', 'pol-20'];
|
|
35
|
+
export const PERMISSIONS_TO_REVOKE = ['eth_accounts'];
|
|
35
36
|
export * from "./staking.js";
|
|
36
37
|
export * from "./storage.js";
|