@subwallet/extension-base 1.1.25-1 → 1.1.27-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 +3 -3
- package/background/handlers/State.js +3 -2
- package/cjs/background/handlers/State.js +3 -2
- package/cjs/constants/staking.js +4 -2
- package/cjs/koni/api/dotsama/transfer.js +2 -2
- package/cjs/koni/api/nft/config.js +2 -1
- package/cjs/koni/api/staking/bonding/astar.js +15 -24
- package/cjs/koni/api/staking/bonding/relayChain.js +48 -25
- package/cjs/koni/api/xcm/xTokens.js +1 -1
- package/cjs/koni/background/handlers/Extension.js +15 -8
- package/cjs/koni/background/handlers/Mobile.js +81 -5
- package/cjs/koni/background/handlers/State.js +54 -118
- package/cjs/koni/background/handlers/index.js +1 -1
- package/cjs/koni/background/subscription.js +34 -11
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/BalanceMapImpl.js +111 -0
- package/cjs/services/campaign-service/index.js +2 -0
- package/cjs/services/chain-service/constants.js +20 -3
- package/cjs/services/event-service/index.js +7 -7
- package/cjs/services/event-service/types.js +1 -1
- package/cjs/services/history-service/index.js +1 -0
- package/cjs/services/keyring-service/index.js +10 -6
- package/cjs/services/migration-service/scripts/index.js +3 -1
- package/cjs/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.js +16 -0
- package/cjs/services/migration-service/scripts/tokens/MigrateToken.js +33 -0
- package/cjs/services/setting-service/SettingService.js +2 -1
- package/cjs/services/setting-service/i18n/i18n.js +2 -1
- package/cjs/services/storage-service/DatabaseService.js +8 -19
- package/cjs/services/storage-service/db-stores/Balance.js +4 -13
- package/cjs/services/wallet-connect-service/index.js +6 -3
- package/cjs/storage/index.js +59 -0
- package/cjs/utils/array.js +27 -1
- package/constants/staking.d.ts +1 -0
- package/constants/staking.js +2 -1
- package/koni/api/dotsama/transfer.js +2 -2
- package/koni/api/nft/config.js +2 -1
- package/koni/api/staking/bonding/astar.js +15 -24
- package/koni/api/staking/bonding/relayChain.js +40 -17
- package/koni/api/xcm/xTokens.js +1 -1
- package/koni/background/handlers/Extension.js +15 -8
- package/koni/background/handlers/Mobile.d.ts +6 -0
- package/koni/background/handlers/Mobile.js +75 -3
- package/koni/background/handlers/State.d.ts +10 -9
- package/koni/background/handlers/State.js +43 -105
- package/koni/background/handlers/index.js +1 -1
- package/koni/background/subscription.d.ts +4 -1
- package/koni/background/subscription.js +34 -11
- package/package.json +40 -20
- package/packageInfo.js +1 -1
- package/services/balance-service/BalanceMapImpl.d.ts +17 -0
- package/services/balance-service/BalanceMapImpl.js +101 -0
- package/services/campaign-service/index.d.ts +1 -0
- package/services/campaign-service/index.js +2 -0
- package/services/chain-service/constants.d.ts +1 -0
- package/services/chain-service/constants.js +18 -2
- package/services/event-service/index.d.ts +1 -4
- package/services/event-service/index.js +8 -7
- package/services/event-service/types.js +1 -1
- package/services/history-service/index.js +1 -0
- package/services/keyring-service/index.js +10 -6
- package/services/migration-service/scripts/index.js +3 -1
- package/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.d.ts +5 -0
- package/services/migration-service/scripts/tokens/MigratePolygonUSDCProvider.js +8 -0
- package/services/migration-service/scripts/tokens/MigrateToken.d.ts +9 -0
- package/services/migration-service/scripts/tokens/MigrateToken.js +26 -0
- package/services/setting-service/SettingService.js +2 -1
- package/services/setting-service/i18n/i18n.js +2 -1
- package/services/storage-service/DatabaseService.d.ts +3 -1
- package/services/storage-service/DatabaseService.js +7 -19
- package/services/storage-service/db-stores/Balance.d.ts +3 -2
- package/services/storage-service/db-stores/Balance.js +4 -13
- package/services/wallet-connect-service/index.js +5 -3
- package/storage/index.d.ts +14 -0
- package/storage/index.js +52 -0
- package/utils/array.d.ts +1 -0
- package/utils/array.js +26 -1
|
@@ -28,10 +28,12 @@ class KeyringService {
|
|
|
28
28
|
});
|
|
29
29
|
constructor(eventService) {
|
|
30
30
|
this.eventService = eventService;
|
|
31
|
-
this.
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
31
|
+
this.eventService.waitCryptoReady.then(() => {
|
|
32
|
+
this.currentAccountStore.get('CurrentAccountInfo', rs => {
|
|
33
|
+
rs && this.currentAccountSubject.next(rs);
|
|
34
|
+
});
|
|
35
|
+
this.subscribeAccounts().catch(console.error);
|
|
36
|
+
}).catch(console.error);
|
|
35
37
|
}
|
|
36
38
|
async subscribeAccounts() {
|
|
37
39
|
// Wait until account ready
|
|
@@ -72,8 +74,10 @@ class KeyringService {
|
|
|
72
74
|
var _keyring$keyring, _keyring$keyring2;
|
|
73
75
|
let isReady = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
|
|
74
76
|
if (!this.keyringState.isReady && isReady) {
|
|
75
|
-
this.eventService.
|
|
76
|
-
|
|
77
|
+
this.eventService.waitCryptoReady.then(() => {
|
|
78
|
+
this.eventService.emit('keyring.ready', true);
|
|
79
|
+
this.eventService.emit('account.ready', true);
|
|
80
|
+
}).catch(console.error);
|
|
77
81
|
}
|
|
78
82
|
this.keyringStateSubject.next({
|
|
79
83
|
hasMasterPassword: !!((_keyring$keyring = _uiKeyring.keyring.keyring) !== null && _keyring$keyring !== void 0 && _keyring$keyring.hasMasterPassword),
|
|
@@ -8,6 +8,7 @@ exports.default = exports.EVERYTIME = void 0;
|
|
|
8
8
|
var _MigrateEthProvider = _interopRequireDefault(require("./providers/MigrateEthProvider"));
|
|
9
9
|
var _MigratePioneerProvider = _interopRequireDefault(require("./providers/MigratePioneerProvider"));
|
|
10
10
|
var _MigrateProvidersV1M1P = _interopRequireDefault(require("./providers/MigrateProvidersV1M1P24"));
|
|
11
|
+
var _MigratePolygonUSDCProvider = _interopRequireDefault(require("./tokens/MigratePolygonUSDCProvider"));
|
|
11
12
|
var _AutoEnableChainsTokens = _interopRequireDefault(require("./AutoEnableChainsTokens"));
|
|
12
13
|
var _DeleteChain = _interopRequireDefault(require("./DeleteChain"));
|
|
13
14
|
var _EnableVaraChain = _interopRequireDefault(require("./EnableVaraChain"));
|
|
@@ -42,7 +43,8 @@ var _default = {
|
|
|
42
43
|
'1.1.13-01': _MigrateTokenDecimals.default,
|
|
43
44
|
'1.1.17-01': _MigratePioneerProvider.default,
|
|
44
45
|
'1.1.17-03': _EnableVaraChain.default,
|
|
45
|
-
'1.1.24-01': _MigrateProvidersV1M1P.default
|
|
46
|
+
'1.1.24-01': _MigrateProvidersV1M1P.default,
|
|
47
|
+
'1.1.26-01': _MigratePolygonUSDCProvider.default
|
|
46
48
|
// [`${EVERYTIME}-1`]: AutoEnableChainsTokens
|
|
47
49
|
};
|
|
48
50
|
exports.default = _default;
|
|
@@ -0,0 +1,16 @@
|
|
|
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 _MigrateToken = _interopRequireDefault(require("./MigrateToken"));
|
|
9
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
10
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
11
|
+
|
|
12
|
+
class MigratePolygonUSDCProvider extends _MigrateToken.default {
|
|
13
|
+
oldToken = 'polygon-ERC20-USDC-0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174';
|
|
14
|
+
newTokens = ['polygon-ERC20-USDC.e-0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174', 'polygon-ERC20-USDC-0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359'];
|
|
15
|
+
}
|
|
16
|
+
exports.default = MigratePolygonUSDCProvider;
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
/**
|
|
13
|
+
* @description Enable `newTokens` if `oldToken` active
|
|
14
|
+
* */
|
|
15
|
+
class MigrateToken extends _Base.default {
|
|
16
|
+
async run() {
|
|
17
|
+
const state = this.state;
|
|
18
|
+
const assetSettings = await state.chainService.getAssetSettings();
|
|
19
|
+
const oldAssetSetting = assetSettings[this.oldToken];
|
|
20
|
+
if (oldAssetSetting) {
|
|
21
|
+
if (oldAssetSetting.visible) {
|
|
22
|
+
for (const newToken of this.newTokens) {
|
|
23
|
+
assetSettings[newToken] = {
|
|
24
|
+
visible: true
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
delete assetSettings[this.oldToken];
|
|
29
|
+
state.chainService.setAssetSettings(assetSettings);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.default = MigrateToken;
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _constants = require("@subwallet/extension-base/constants");
|
|
9
|
+
var _storage = require("@subwallet/extension-base/storage");
|
|
9
10
|
var _PassPhishingStore = _interopRequireDefault(require("@subwallet/extension-base/stores/PassPhishingStore"));
|
|
10
11
|
var _Settings = _interopRequireDefault(require("@subwallet/extension-base/stores/Settings"));
|
|
11
12
|
var _i18n = _interopRequireDefault(require("./i18n/i18n"));
|
|
@@ -17,7 +18,7 @@ class SettingService {
|
|
|
17
18
|
settingsStore = new _Settings.default();
|
|
18
19
|
passPhishingStore = new _PassPhishingStore.default();
|
|
19
20
|
constructor() {
|
|
20
|
-
let old =
|
|
21
|
+
let old = _storage.SWStorage.instance.getItem(_constants.LANGUAGE) || 'en';
|
|
21
22
|
const updateLanguage = _ref => {
|
|
22
23
|
let {
|
|
23
24
|
language
|
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _constants = require("@subwallet/extension-base/constants");
|
|
9
|
+
var _storage = require("@subwallet/extension-base/storage");
|
|
9
10
|
var _i18next = _interopRequireDefault(require("i18next"));
|
|
10
11
|
var _Backend = _interopRequireDefault(require("./Backend"));
|
|
11
12
|
// Copyright 2019-2022 @polkadot/extension-ui authors & contributors
|
|
@@ -19,7 +20,7 @@ _i18next.default.use(_Backend.default).init({
|
|
|
19
20
|
escapeValue: false
|
|
20
21
|
},
|
|
21
22
|
keySeparator: false,
|
|
22
|
-
lng:
|
|
23
|
+
lng: _storage.SWStorage.instance.getItem(_constants.LANGUAGE) || 'en',
|
|
23
24
|
load: 'languageOnly',
|
|
24
25
|
nsSeparator: false,
|
|
25
26
|
returnEmptyString: false,
|
|
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
-
exports.default = void 0;
|
|
7
|
+
exports.default = exports.DEXIE_BACKUP_TABLES = void 0;
|
|
8
8
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
9
9
|
var _databases = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/databases"));
|
|
10
10
|
var _dbStores = require("@subwallet/extension-base/services/storage-service/db-stores");
|
|
@@ -18,7 +18,8 @@ var _util = require("@polkadot/util");
|
|
|
18
18
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
19
19
|
// SPDX-License-Identifier: Apache-2.0
|
|
20
20
|
|
|
21
|
-
const
|
|
21
|
+
const DEXIE_BACKUP_TABLES = ['chain', 'asset', 'migrations', 'transactions', 'campaign'];
|
|
22
|
+
exports.DEXIE_BACKUP_TABLES = DEXIE_BACKUP_TABLES;
|
|
22
23
|
class DatabaseService {
|
|
23
24
|
// TODO: might remove this
|
|
24
25
|
|
|
@@ -297,10 +298,7 @@ class DatabaseService {
|
|
|
297
298
|
async exportDB() {
|
|
298
299
|
const blob = await (0, _dexieExportImport.exportDB)(this._db, {
|
|
299
300
|
filter: (table, value, key) => {
|
|
300
|
-
|
|
301
|
-
return false;
|
|
302
|
-
}
|
|
303
|
-
return true;
|
|
301
|
+
return DEXIE_BACKUP_TABLES.indexOf(table) >= 0;
|
|
304
302
|
}
|
|
305
303
|
});
|
|
306
304
|
return await blob.text();
|
|
@@ -311,9 +309,8 @@ class DatabaseService {
|
|
|
311
309
|
type: 'application/json'
|
|
312
310
|
});
|
|
313
311
|
await this._db.import(blob, {
|
|
314
|
-
|
|
315
|
-
acceptMissingTables: true
|
|
316
|
-
acceptVersionDiff: true
|
|
312
|
+
clearTablesBeforeImport: true,
|
|
313
|
+
acceptMissingTables: true
|
|
317
314
|
});
|
|
318
315
|
return true;
|
|
319
316
|
} catch (e) {
|
|
@@ -321,16 +318,8 @@ class DatabaseService {
|
|
|
321
318
|
return false;
|
|
322
319
|
}
|
|
323
320
|
}
|
|
324
|
-
async
|
|
325
|
-
|
|
326
|
-
const blob = new Blob([data], {
|
|
327
|
-
type: 'application/json'
|
|
328
|
-
});
|
|
329
|
-
return await (0, _dexieExportImport.peakImportFile)(blob);
|
|
330
|
-
} catch (e) {
|
|
331
|
-
this.logger.error(e);
|
|
332
|
-
return null;
|
|
333
|
-
}
|
|
321
|
+
async getExportJson() {
|
|
322
|
+
return JSON.parse(await this.exportDB());
|
|
334
323
|
}
|
|
335
324
|
}
|
|
336
325
|
exports.default = DatabaseService;
|
|
@@ -11,22 +11,13 @@ var _BaseStoreWithAddress = _interopRequireDefault(require("../db-stores/BaseSto
|
|
|
11
11
|
|
|
12
12
|
class BalanceStore extends _BaseStoreWithAddress.default {
|
|
13
13
|
async getBalanceMapByAddresses(addresses) {
|
|
14
|
-
|
|
15
|
-
const balanceMap = {};
|
|
16
|
-
data.forEach(storedBalance => {
|
|
17
|
-
const address = storedBalance.address;
|
|
18
|
-
const slug = storedBalance.tokenSlug;
|
|
19
|
-
if (!balanceMap[address]) {
|
|
20
|
-
balanceMap[address] = {};
|
|
21
|
-
}
|
|
22
|
-
balanceMap[address][slug] = {
|
|
23
|
-
...storedBalance
|
|
24
|
-
};
|
|
25
|
-
});
|
|
26
|
-
return balanceMap;
|
|
14
|
+
return this.table.where('address').anyOf(addresses).toArray();
|
|
27
15
|
}
|
|
28
16
|
async removeBySlugs(tokenSlugs) {
|
|
29
17
|
return this.table.where('tokenSlug').anyOfIgnoreCase(tokenSlugs).delete();
|
|
30
18
|
}
|
|
19
|
+
async removeByAddresses(addresses) {
|
|
20
|
+
return this.table.where('address').anyOfIgnoreCase(addresses).delete();
|
|
21
|
+
}
|
|
31
22
|
}
|
|
32
23
|
exports.default = BalanceStore;
|
|
@@ -9,6 +9,7 @@ var _classPrivateFieldLooseBase2 = _interopRequireDefault(require("@babel/runtim
|
|
|
9
9
|
var _classPrivateFieldLooseKey2 = _interopRequireDefault(require("@babel/runtime/helpers/classPrivateFieldLooseKey"));
|
|
10
10
|
var _utils = require("@json-rpc-tools/utils");
|
|
11
11
|
var _Eip155RequestHandler = _interopRequireDefault(require("@subwallet/extension-base/services/wallet-connect-service/handler/Eip155RequestHandler"));
|
|
12
|
+
var _storage = require("@subwallet/extension-base/storage");
|
|
12
13
|
var _signClient = _interopRequireDefault(require("@walletconnect/sign-client"));
|
|
13
14
|
var _utils2 = require("@walletconnect/utils");
|
|
14
15
|
var _rxjs = require("rxjs");
|
|
@@ -18,6 +19,8 @@ var _helpers = require("./helpers");
|
|
|
18
19
|
var _types = require("./types");
|
|
19
20
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
20
21
|
// SPDX-License-Identifier: Apache-2.0
|
|
22
|
+
|
|
23
|
+
const storage = _storage.SWStorage.instance;
|
|
21
24
|
var _requestService = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("requestService");
|
|
22
25
|
var _polkadotRequestHandler = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("polkadotRequestHandler");
|
|
23
26
|
var _eip155RequestHandler = /*#__PURE__*/(0, _classPrivateFieldLooseKey2.default)("eip155RequestHandler");
|
|
@@ -193,9 +196,9 @@ class WalletConnectService {
|
|
|
193
196
|
}
|
|
194
197
|
exports.default = WalletConnectService;
|
|
195
198
|
function _get_haveData() {
|
|
196
|
-
const sessionStorage =
|
|
197
|
-
const pairingStorage =
|
|
198
|
-
const subscriptionStorage =
|
|
199
|
+
const sessionStorage = storage.getItem('wc@2:client:0.3//session');
|
|
200
|
+
const pairingStorage = storage.getItem('wc@2:core:0.3//pairing');
|
|
201
|
+
const subscriptionStorage = storage.getItem('wc@2:core:0.3//subscription');
|
|
199
202
|
const sessions = sessionStorage ? JSON.parse(sessionStorage) : [];
|
|
200
203
|
const pairings = pairingStorage ? JSON.parse(pairingStorage) : [];
|
|
201
204
|
const subscriptions = subscriptionStorage ? JSON.parse(subscriptionStorage) : [];
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SWStorage = void 0;
|
|
7
|
+
// Copyright 2019-2022 @polkadot/extension-base authors & contributors
|
|
8
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
9
|
+
|
|
10
|
+
class SWStorage {
|
|
11
|
+
_storage = {};
|
|
12
|
+
constructor() {
|
|
13
|
+
this.sync();
|
|
14
|
+
}
|
|
15
|
+
setItem(key, value) {
|
|
16
|
+
this._storage[key] = value;
|
|
17
|
+
localStorage.setItem(key, value);
|
|
18
|
+
}
|
|
19
|
+
getItem(key) {
|
|
20
|
+
return this._storage[key] || localStorage.getItem(key) || null;
|
|
21
|
+
}
|
|
22
|
+
removeItem(key) {
|
|
23
|
+
this._storage[key] && delete this._storage[key];
|
|
24
|
+
localStorage.removeItem(key);
|
|
25
|
+
}
|
|
26
|
+
clear() {
|
|
27
|
+
this._storage = {};
|
|
28
|
+
localStorage.clear();
|
|
29
|
+
}
|
|
30
|
+
key(index) {
|
|
31
|
+
return Object.keys(this._storage)[index] || null;
|
|
32
|
+
}
|
|
33
|
+
length(index) {
|
|
34
|
+
return Object.keys(this._storage)[index] || null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Additional methods
|
|
38
|
+
keys() {
|
|
39
|
+
return Object.keys(this._storage) || [];
|
|
40
|
+
}
|
|
41
|
+
copy() {
|
|
42
|
+
return JSON.parse(JSON.stringify(this._storage));
|
|
43
|
+
}
|
|
44
|
+
sync() {
|
|
45
|
+
this._storage = JSON.parse(JSON.stringify(localStorage));
|
|
46
|
+
}
|
|
47
|
+
static get instance() {
|
|
48
|
+
// @ts-ignore
|
|
49
|
+
if (!window.SWStorage) {
|
|
50
|
+
console.log('SWStorage init');
|
|
51
|
+
// @ts-ignore
|
|
52
|
+
window.SWStorage = new SWStorage();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// @ts-ignore
|
|
56
|
+
return window.SWStorage;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.SWStorage = SWStorage;
|
package/cjs/utils/array.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.listMerge = listMerge;
|
|
6
7
|
exports.uniqueStringArray = void 0;
|
|
7
8
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
8
9
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -14,4 +15,29 @@ const uniqueStringArray = array => {
|
|
|
14
15
|
});
|
|
15
16
|
return Object.keys(map);
|
|
16
17
|
};
|
|
17
|
-
exports.uniqueStringArray = uniqueStringArray;
|
|
18
|
+
exports.uniqueStringArray = uniqueStringArray;
|
|
19
|
+
function listMerge(keys, existed, newItems) {
|
|
20
|
+
const getKey = (ks, item) => {
|
|
21
|
+
if (typeof ks === 'string') {
|
|
22
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return
|
|
23
|
+
return item[ks].toString();
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-return
|
|
27
|
+
return ks.map(k => item[k].toString()).join('_');
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Build existed map with keys
|
|
31
|
+
const existedMap = Object.fromEntries(existed.map(v => {
|
|
32
|
+
return [getKey(keys, v), v];
|
|
33
|
+
}));
|
|
34
|
+
newItems.forEach(item => {
|
|
35
|
+
const key = getKey(keys, item);
|
|
36
|
+
if (existedMap[key]) {
|
|
37
|
+
Object.assign(existedMap[key], item);
|
|
38
|
+
} else {
|
|
39
|
+
existed.push(item);
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
return existed;
|
|
43
|
+
}
|
package/constants/staking.d.ts
CHANGED
package/constants/staking.js
CHANGED
|
@@ -155,9 +155,9 @@ export const createTransferExtrinsic = async ({
|
|
|
155
155
|
}
|
|
156
156
|
} else if (_TRANSFER_CHAIN_GROUP.pendulum.includes(networkKey) && isTxTokensSupported && !_isNativeToken(tokenInfo)) {
|
|
157
157
|
if (transferAll) {
|
|
158
|
-
transfer = api.tx.tokens.transferAll(to, _getTokenOnChainInfo(tokenInfo), false);
|
|
158
|
+
transfer = api.tx.tokens.transferAll(to, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo), false);
|
|
159
159
|
} else if (value) {
|
|
160
|
-
transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo), new BN(value));
|
|
160
|
+
transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo), new BN(value));
|
|
161
161
|
}
|
|
162
162
|
} else if (_TRANSFER_CHAIN_GROUP.genshiro.includes(networkKey)
|
|
163
163
|
// && isTxEqBalancesSupported
|
package/koni/api/nft/config.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
|
|
4
|
+
import { SWStorage } from '@subwallet/extension-base/storage';
|
|
4
5
|
import { RuntimeInfo } from '@subwallet/extension-base/utils';
|
|
5
6
|
import Bowser from 'bowser';
|
|
6
7
|
export const SINGULAR_V1_ENDPOINT = 'https://singular.rmrk-api.xyz/api/account-rmrk1/';
|
|
@@ -36,7 +37,7 @@ export const IPFS_ETH_ARAGON = 'https://ipfs.eth.aragon.network/ipfs/'; // 400
|
|
|
36
37
|
export const SUBWALLET_IPFS = 'https://ipfs.subwallet.app/ipfs/'; // ???
|
|
37
38
|
|
|
38
39
|
const detectFirefox = () => {
|
|
39
|
-
return (
|
|
40
|
+
return (SWStorage.instance.getItem('browserInfo') || Bowser.getParser(window.navigator.userAgent).getBrowserName()).toLowerCase() === 'firefox';
|
|
40
41
|
};
|
|
41
42
|
const isFirefox = detectFirefox();
|
|
42
43
|
export let SUPPORTED_NFT_NETWORKS;
|
|
@@ -8,6 +8,18 @@ import { isUrl, parseRawNumber } from '@subwallet/extension-base/utils';
|
|
|
8
8
|
import fetch from 'cross-fetch';
|
|
9
9
|
import { BN, BN_ZERO } from '@polkadot/util';
|
|
10
10
|
import { isEthereumAddress } from '@polkadot/util-crypto';
|
|
11
|
+
const convertAddress = address => {
|
|
12
|
+
return isEthereumAddress(address) ? address.toLowerCase() : address;
|
|
13
|
+
};
|
|
14
|
+
const fetchDApps = async network => {
|
|
15
|
+
return new Promise(function (resolve) {
|
|
16
|
+
fetch(`https://api.astar.network/api/v1/${network}/dapps-staking/dappssimple`, {
|
|
17
|
+
method: 'GET'
|
|
18
|
+
}).then(resp => {
|
|
19
|
+
resolve(resp.json());
|
|
20
|
+
}).catch(console.error);
|
|
21
|
+
});
|
|
22
|
+
};
|
|
11
23
|
export function subscribeAstarStakingMetadata(chain, substrateApi, callback) {
|
|
12
24
|
return substrateApi.api.query.dappsStaking.currentEra(_currentEra => {
|
|
13
25
|
const era = _currentEra.toString();
|
|
@@ -63,19 +75,10 @@ export async function getAstarStakingMetadata(chain, substrateApi) {
|
|
|
63
75
|
unstakingPeriod
|
|
64
76
|
};
|
|
65
77
|
}
|
|
66
|
-
const convertAddress = address => {
|
|
67
|
-
return isEthereumAddress(address) ? address.toLowerCase() : address;
|
|
68
|
-
};
|
|
69
78
|
export async function subscribeAstarNominatorMetadata(chainInfo, address, substrateApi, ledger) {
|
|
70
79
|
const nominationList = [];
|
|
71
80
|
const unstakingList = [];
|
|
72
|
-
const allDappsReq =
|
|
73
|
-
fetch(`https://api.astar.network/api/v1/${chainInfo.slug}/dapps-staking/dapps`, {
|
|
74
|
-
method: 'GET'
|
|
75
|
-
}).then(resp => {
|
|
76
|
-
resolve(resp.json());
|
|
77
|
-
}).catch(console.error);
|
|
78
|
-
});
|
|
81
|
+
const allDappsReq = fetchDApps(chainInfo.slug);
|
|
79
82
|
const [_allDapps, _era, _stakerInfo] = await Promise.all([allDappsReq, substrateApi.api.query.dappsStaking.currentEra(), substrateApi.api.query.dappsStaking.generalStakerInfo.entries(address)]);
|
|
80
83
|
const currentEra = _era.toString();
|
|
81
84
|
const minDelegatorStake = substrateApi.api.consts.dappsStaking.minimumStakingAmount.toString();
|
|
@@ -160,13 +163,7 @@ export async function getAstarNominatorMetadata(chainInfo, address, substrateApi
|
|
|
160
163
|
const chainApi = await substrateApi.isReady;
|
|
161
164
|
const nominationList = [];
|
|
162
165
|
const unstakingList = [];
|
|
163
|
-
const allDappsReq =
|
|
164
|
-
fetch(`https://api.astar.network/api/v1/${chain}/dapps-staking/dapps`, {
|
|
165
|
-
method: 'GET'
|
|
166
|
-
}).then(resp => {
|
|
167
|
-
resolve(resp.json());
|
|
168
|
-
}).catch(console.error);
|
|
169
|
-
});
|
|
166
|
+
const allDappsReq = fetchDApps(chain);
|
|
170
167
|
const [_ledger, _era, _stakerInfo] = await Promise.all([chainApi.api.query.dappsStaking.ledger(address), chainApi.api.query.dappsStaking.currentEra(), chainApi.api.query.dappsStaking.generalStakerInfo.entries(address)]);
|
|
171
168
|
const ledger = _ledger.toPrimitive();
|
|
172
169
|
const currentEra = _era.toString();
|
|
@@ -245,13 +242,7 @@ export async function getAstarDappsInfo(networkKey, substrateApi) {
|
|
|
245
242
|
const rawMaxStakerPerContract = chainApi.api.consts.dappsStaking.maxNumberOfStakersPerContract.toHuman();
|
|
246
243
|
const allDappsInfo = [];
|
|
247
244
|
const maxStakerPerContract = parseRawNumber(rawMaxStakerPerContract);
|
|
248
|
-
const allDappsReq =
|
|
249
|
-
fetch(`https://api.astar.network/api/v1/${networkKey}/dapps-staking/dapps`, {
|
|
250
|
-
method: 'GET'
|
|
251
|
-
}).then(resp => {
|
|
252
|
-
resolve(resp.json());
|
|
253
|
-
}).catch(console.error);
|
|
254
|
-
});
|
|
245
|
+
const allDappsReq = fetchDApps(networkKey);
|
|
255
246
|
const [_era, _allDapps] = await Promise.all([chainApi.api.query.dappsStaking.currentEra(), allDappsReq]);
|
|
256
247
|
const era = parseRawNumber(_era.toHuman());
|
|
257
248
|
const allDapps = _allDapps;
|
|
@@ -3,8 +3,9 @@
|
|
|
3
3
|
|
|
4
4
|
import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
|
|
5
5
|
import { StakingStatus, StakingTxErrorType, StakingType, UnstakingStatus } from '@subwallet/extension-base/background/KoniTypes';
|
|
6
|
+
import { MAX_NOMINATIONS } from '@subwallet/extension-base/constants';
|
|
6
7
|
import { calculateAlephZeroValidatorReturn, calculateChainStakedReturn, calculateInflation, calculateTernoaValidatorReturn, calculateValidatorStakedReturn, getCommission, getExistUnstakeErrorMessage, getMaxValidatorErrorMessage, getMinStakeErrorMessage, parseIdentity, parsePoolStashAddress } from '@subwallet/extension-base/koni/api/staking/bonding/utils';
|
|
7
|
-
import { _STAKING_CHAIN_GROUP, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
|
|
8
|
+
import { _EXPECTED_BLOCK_TIME, _STAKING_CHAIN_GROUP, _STAKING_ERA_LENGTH_MAP } from '@subwallet/extension-base/services/chain-service/constants';
|
|
8
9
|
import { _getChainSubstrateAddressPrefix } from '@subwallet/extension-base/services/chain-service/utils';
|
|
9
10
|
import { reformatAddress } from '@subwallet/extension-base/utils';
|
|
10
11
|
import BigN from 'bignumber.js';
|
|
@@ -80,7 +81,7 @@ export function subscribeRelayChainStakingMetadata(chainInfo, substrateApi, call
|
|
|
80
81
|
return substrateApi.api.query.staking.currentEra(async _currentEra => {
|
|
81
82
|
var _substrateApi$api$con, _substrateApi$api$con2, _substrateApi$api$que, _substrateApi$api$que2, _substrateApi$api$que3, _substrateApi$api$que4, _substrateApi$api$que5, _substrateApi$api$que6, _substrateApi$api$que7;
|
|
82
83
|
const currentEra = _currentEra.toString();
|
|
83
|
-
const maxNominations = ((_substrateApi$api$con = substrateApi.api.consts.staking) === null || _substrateApi$api$con === void 0 ? void 0 : (_substrateApi$api$con2 = _substrateApi$api$con.maxNominations) === null || _substrateApi$api$con2 === void 0 ? void 0 : _substrateApi$api$con2.toString()) ||
|
|
84
|
+
const maxNominations = ((_substrateApi$api$con = substrateApi.api.consts.staking) === null || _substrateApi$api$con === void 0 ? void 0 : (_substrateApi$api$con2 = _substrateApi$api$con.maxNominations) === null || _substrateApi$api$con2 === void 0 ? void 0 : _substrateApi$api$con2.toString()) || MAX_NOMINATIONS; // TODO
|
|
84
85
|
const maxUnlockingChunks = substrateApi.api.consts.staking.maxUnlockingChunks.toString();
|
|
85
86
|
const unlockingEras = substrateApi.api.consts.staking.bondingDuration.toString();
|
|
86
87
|
const [_totalEraStake, _totalIssuance, _auctionCounter, _minNominatorBond, _minPoolJoin, _minimumActiveStake] = await Promise.all([substrateApi.api.query.staking.erasTotalStake(parseInt(currentEra)), substrateApi.api.query.balances.totalIssuance(), (_substrateApi$api$que = substrateApi.api.query.auctions) === null || _substrateApi$api$que === void 0 ? void 0 : _substrateApi$api$que.auctionCounter(), substrateApi.api.query.staking.minNominatorBond(), (_substrateApi$api$que2 = substrateApi.api.query) === null || _substrateApi$api$que2 === void 0 ? void 0 : (_substrateApi$api$que3 = _substrateApi$api$que2.nominationPools) === null || _substrateApi$api$que3 === void 0 ? void 0 : _substrateApi$api$que3.minJoinBond(), ((_substrateApi$api$que4 = substrateApi.api.query) === null || _substrateApi$api$que4 === void 0 ? void 0 : (_substrateApi$api$que5 = _substrateApi$api$que4.staking) === null || _substrateApi$api$que5 === void 0 ? void 0 : _substrateApi$api$que5.minimumActiveStake) && ((_substrateApi$api$que6 = substrateApi.api.query) === null || _substrateApi$api$que6 === void 0 ? void 0 : (_substrateApi$api$que7 = _substrateApi$api$que6.staking) === null || _substrateApi$api$que7 === void 0 ? void 0 : _substrateApi$api$que7.minimumActiveStake())]);
|
|
@@ -171,16 +172,17 @@ export async function getRelayChainStakingMetadata(chainInfo, substrateApi) {
|
|
|
171
172
|
};
|
|
172
173
|
}
|
|
173
174
|
export async function subscribeRelayChainNominatorMetadata(chainInfo, address, substrateApi, ledger) {
|
|
174
|
-
var _chainApi$api$query4, _chainApi$api$query4$, _chainApi$api$query5, _chainApi$api$query5$, _chainApi$api$query6, _chainApi$api$query6$, _chainApi$api$query7, _chainApi$api$query7$, _chainApi$api$query8, _chainApi$api$query8$, _chainApi$api$query9, _chainApi$api$query9$;
|
|
175
|
+
var _chainApi$api$query4, _chainApi$api$query4$, _chainApi$api$query5, _chainApi$api$query5$, _chainApi$api$query6, _chainApi$api$query6$, _chainApi$api$query7, _chainApi$api$query7$, _chainApi$api$query8, _chainApi$api$query8$, _chainApi$api$query9, _chainApi$api$query9$, _chainApi$api$derive, _chainApi$api$derive$;
|
|
175
176
|
const chain = chainInfo.slug;
|
|
176
177
|
const chainApi = await substrateApi.isReady;
|
|
177
|
-
const [_nominations, _currentEra, _bonded, _minimumActiveStake, _minNominatorBond] = await Promise.all([(_chainApi$api$query4 = chainApi.api.query) === null || _chainApi$api$query4 === void 0 ? void 0 : (_chainApi$api$query4$ = _chainApi$api$query4.staking) === null || _chainApi$api$query4$ === void 0 ? void 0 : _chainApi$api$query4$.nominators(address), (_chainApi$api$query5 = chainApi.api.query) === null || _chainApi$api$query5 === void 0 ? void 0 : (_chainApi$api$query5$ = _chainApi$api$query5.staking) === null || _chainApi$api$query5$ === void 0 ? void 0 : _chainApi$api$query5$.currentEra(), (_chainApi$api$query6 = chainApi.api.query) === null || _chainApi$api$query6 === void 0 ? void 0 : (_chainApi$api$query6$ = _chainApi$api$query6.staking) === null || _chainApi$api$query6$ === void 0 ? void 0 : _chainApi$api$query6$.bonded(address), ((_chainApi$api$query7 = chainApi.api.query) === null || _chainApi$api$query7 === void 0 ? void 0 : (_chainApi$api$query7$ = _chainApi$api$query7.staking) === null || _chainApi$api$query7$ === void 0 ? void 0 : _chainApi$api$query7$.minimumActiveStake) && ((_chainApi$api$query8 = chainApi.api.query) === null || _chainApi$api$query8 === void 0 ? void 0 : (_chainApi$api$query8$ = _chainApi$api$query8.staking) === null || _chainApi$api$query8$ === void 0 ? void 0 : _chainApi$api$query8$.minimumActiveStake()), (_chainApi$api$query9 = chainApi.api.query) === null || _chainApi$api$query9 === void 0 ? void 0 : (_chainApi$api$query9$ = _chainApi$api$query9.staking) === null || _chainApi$api$query9$ === void 0 ? void 0 : _chainApi$api$query9$.minNominatorBond()]);
|
|
178
|
+
const [_nominations, _currentEra, _bonded, _minimumActiveStake, _minNominatorBond, _deriveSessionProgress] = await Promise.all([(_chainApi$api$query4 = chainApi.api.query) === null || _chainApi$api$query4 === void 0 ? void 0 : (_chainApi$api$query4$ = _chainApi$api$query4.staking) === null || _chainApi$api$query4$ === void 0 ? void 0 : _chainApi$api$query4$.nominators(address), (_chainApi$api$query5 = chainApi.api.query) === null || _chainApi$api$query5 === void 0 ? void 0 : (_chainApi$api$query5$ = _chainApi$api$query5.staking) === null || _chainApi$api$query5$ === void 0 ? void 0 : _chainApi$api$query5$.currentEra(), (_chainApi$api$query6 = chainApi.api.query) === null || _chainApi$api$query6 === void 0 ? void 0 : (_chainApi$api$query6$ = _chainApi$api$query6.staking) === null || _chainApi$api$query6$ === void 0 ? void 0 : _chainApi$api$query6$.bonded(address), ((_chainApi$api$query7 = chainApi.api.query) === null || _chainApi$api$query7 === void 0 ? void 0 : (_chainApi$api$query7$ = _chainApi$api$query7.staking) === null || _chainApi$api$query7$ === void 0 ? void 0 : _chainApi$api$query7$.minimumActiveStake) && ((_chainApi$api$query8 = chainApi.api.query) === null || _chainApi$api$query8 === void 0 ? void 0 : (_chainApi$api$query8$ = _chainApi$api$query8.staking) === null || _chainApi$api$query8$ === void 0 ? void 0 : _chainApi$api$query8$.minimumActiveStake()), (_chainApi$api$query9 = chainApi.api.query) === null || _chainApi$api$query9 === void 0 ? void 0 : (_chainApi$api$query9$ = _chainApi$api$query9.staking) === null || _chainApi$api$query9$ === void 0 ? void 0 : _chainApi$api$query9$.minNominatorBond(), (_chainApi$api$derive = chainApi.api.derive) === null || _chainApi$api$derive === void 0 ? void 0 : (_chainApi$api$derive$ = _chainApi$api$derive.session) === null || _chainApi$api$derive$ === void 0 ? void 0 : _chainApi$api$derive$.progress()]);
|
|
178
179
|
const minActiveStake = (_minimumActiveStake === null || _minimumActiveStake === void 0 ? void 0 : _minimumActiveStake.toString()) || '0';
|
|
179
180
|
const minNominatorBond = _minNominatorBond.toString();
|
|
180
181
|
const bnMinActiveStake = new BN(minActiveStake);
|
|
181
182
|
const bnMinNominatorBond = new BN(minNominatorBond);
|
|
182
183
|
const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
|
|
183
|
-
const
|
|
184
|
+
const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
|
|
185
|
+
const _maxNominatorRewardedPerValidator = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
|
|
184
186
|
const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
|
|
185
187
|
const nominations = _nominations.toPrimitive();
|
|
186
188
|
const currentEra = _currentEra.toString();
|
|
@@ -203,7 +205,7 @@ export async function subscribeRelayChainNominatorMetadata(chainInfo, address, s
|
|
|
203
205
|
if (!topNominators.includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
204
206
|
// if nominator has target but not in nominator list
|
|
205
207
|
nominationStatus = StakingStatus.WAITING;
|
|
206
|
-
} else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
208
|
+
} else if (topNominators.slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
207
209
|
// if address in top nominators
|
|
208
210
|
nominationStatus = StakingStatus.EARNING_REWARD;
|
|
209
211
|
}
|
|
@@ -234,9 +236,17 @@ export async function subscribeRelayChainNominatorMetadata(chainInfo, address, s
|
|
|
234
236
|
}
|
|
235
237
|
}
|
|
236
238
|
ledger.unlocking.forEach(unlockingChunk => {
|
|
239
|
+
// Calculate the remaining era
|
|
237
240
|
const isClaimable = unlockingChunk.era - parseInt(currentEra) < 0;
|
|
238
241
|
const remainingEra = unlockingChunk.era - parseInt(currentEra);
|
|
239
|
-
|
|
242
|
+
|
|
243
|
+
// Calculate the remaining time for current era ending
|
|
244
|
+
const expectedBlockTime = _EXPECTED_BLOCK_TIME[chain];
|
|
245
|
+
const eraLength = _deriveSessionProgress.eraLength.toNumber();
|
|
246
|
+
const eraProgress = _deriveSessionProgress.eraProgress.toNumber();
|
|
247
|
+
const remainingSlots = eraLength - eraProgress;
|
|
248
|
+
const remainingHours = expectedBlockTime * remainingSlots / 60 / 60;
|
|
249
|
+
const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chain] + remainingHours;
|
|
240
250
|
unstakingList.push({
|
|
241
251
|
chain,
|
|
242
252
|
status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
|
|
@@ -272,7 +282,8 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
|
|
|
272
282
|
const bnMinActiveStake = new BN(minActiveStake);
|
|
273
283
|
const bnMinNominatorBond = new BN(minNominatorBond);
|
|
274
284
|
const minStake = bnMinActiveStake.gt(bnMinNominatorBond) ? bnMinActiveStake : bnMinNominatorBond;
|
|
275
|
-
const
|
|
285
|
+
const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
|
|
286
|
+
const _maxNominatorRewardedPerValidator = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
|
|
276
287
|
const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
|
|
277
288
|
const ledger = _ledger.toPrimitive();
|
|
278
289
|
const nominations = _nominations.toPrimitive();
|
|
@@ -307,7 +318,7 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
|
|
|
307
318
|
if (!topNominators.includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
308
319
|
// if nominator has target but not in nominator list
|
|
309
320
|
nominationStatus = StakingStatus.WAITING;
|
|
310
|
-
} else if (topNominators.slice(0, maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
321
|
+
} else if (topNominators.slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator).includes(reformatAddress(address, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
311
322
|
// if address in top nominators
|
|
312
323
|
nominationStatus = StakingStatus.EARNING_REWARD;
|
|
313
324
|
}
|
|
@@ -360,11 +371,13 @@ export async function getRelayChainNominatorMetadata(chainInfo, address, substra
|
|
|
360
371
|
};
|
|
361
372
|
}
|
|
362
373
|
export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address, substrateApi, poolMemberInfo) {
|
|
363
|
-
|
|
374
|
+
var _substrateApi$api$der, _substrateApi$api$der2;
|
|
375
|
+
const unlimitedNominatorRewarded = substrateApi.api.consts.staking.maxExposurePageSize !== undefined;
|
|
376
|
+
const _maxNominatorRewardedPerValidator = (substrateApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
|
|
364
377
|
const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
|
|
365
378
|
const poolsPalletId = substrateApi.api.consts.nominationPools.palletId.toString();
|
|
366
379
|
const poolStashAccount = parsePoolStashAddress(substrateApi.api, 0, poolMemberInfo.poolId, poolsPalletId);
|
|
367
|
-
const [_nominations, _poolMetadata, _currentEra] = await Promise.all([substrateApi.api.query.staking.nominators(poolStashAccount), substrateApi.api.query.nominationPools.metadata(poolMemberInfo.poolId), substrateApi.api.query.staking.currentEra()]);
|
|
380
|
+
const [_nominations, _poolMetadata, _currentEra, _deriveSessionProgress] = await Promise.all([substrateApi.api.query.staking.nominators(poolStashAccount), substrateApi.api.query.nominationPools.metadata(poolMemberInfo.poolId), substrateApi.api.query.staking.currentEra(), (_substrateApi$api$der = substrateApi.api.derive) === null || _substrateApi$api$der === void 0 ? void 0 : (_substrateApi$api$der2 = _substrateApi$api$der.session) === null || _substrateApi$api$der2 === void 0 ? void 0 : _substrateApi$api$der2.progress()]);
|
|
368
381
|
const poolMetadata = _poolMetadata.toPrimitive();
|
|
369
382
|
const currentEra = _currentEra.toString();
|
|
370
383
|
const nominations = _nominations.toJSON();
|
|
@@ -388,7 +401,7 @@ export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address,
|
|
|
388
401
|
});
|
|
389
402
|
const topNominators = sortedNominators.map(nominator => {
|
|
390
403
|
return nominator.who;
|
|
391
|
-
}).slice(0, maxNominatorRewardedPerValidator);
|
|
404
|
+
}).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
|
|
392
405
|
if (topNominators.includes(reformatAddress(poolStashAccount, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
393
406
|
// if address in top nominators
|
|
394
407
|
stakingStatus = StakingStatus.EARNING_REWARD;
|
|
@@ -408,7 +421,15 @@ export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address,
|
|
|
408
421
|
Object.entries(poolMemberInfo.unbondingEras).forEach(([unlockingEra, amount]) => {
|
|
409
422
|
const isClaimable = parseInt(unlockingEra) - parseInt(currentEra) < 0;
|
|
410
423
|
const remainingEra = parseInt(unlockingEra) - parseInt(currentEra);
|
|
411
|
-
const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug];
|
|
424
|
+
// const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug];
|
|
425
|
+
|
|
426
|
+
// Calculate the remaining time for current era ending
|
|
427
|
+
const expectedBlockTime = _EXPECTED_BLOCK_TIME[chainInfo.slug];
|
|
428
|
+
const eraLength = _deriveSessionProgress.eraLength.toNumber();
|
|
429
|
+
const eraProgress = _deriveSessionProgress.eraProgress.toNumber();
|
|
430
|
+
const remainingSlots = eraLength - eraProgress;
|
|
431
|
+
const remainingHours = expectedBlockTime * remainingSlots / 60 / 60;
|
|
432
|
+
const waitingTime = remainingEra * _STAKING_ERA_LENGTH_MAP[chainInfo.slug] + remainingHours;
|
|
412
433
|
unstakings.push({
|
|
413
434
|
chain: chainInfo.slug,
|
|
414
435
|
status: isClaimable ? UnstakingStatus.CLAIMABLE : UnstakingStatus.UNLOCKING,
|
|
@@ -438,7 +459,8 @@ export async function subscribeRelayChainPoolMemberMetadata(chainInfo, address,
|
|
|
438
459
|
export async function getRelayChainPoolMemberMetadata(chainInfo, address, substrateApi) {
|
|
439
460
|
const chainApi = await substrateApi.isReady;
|
|
440
461
|
const [_poolMemberInfo, _currentEra] = await Promise.all([chainApi.api.query.nominationPools.poolMembers(address), chainApi.api.query.staking.currentEra()]);
|
|
441
|
-
const
|
|
462
|
+
const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
|
|
463
|
+
const _maxNominatorRewardedPerValidator = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
|
|
442
464
|
const maxNominatorRewardedPerValidator = parseInt(_maxNominatorRewardedPerValidator);
|
|
443
465
|
const poolsPalletId = chainApi.api.consts.nominationPools.palletId.toString();
|
|
444
466
|
const poolMemberInfo = _poolMemberInfo.toPrimitive();
|
|
@@ -480,7 +502,7 @@ export async function getRelayChainPoolMemberMetadata(chainInfo, address, substr
|
|
|
480
502
|
});
|
|
481
503
|
const topNominators = sortedNominators.map(nominator => {
|
|
482
504
|
return nominator.who;
|
|
483
|
-
}).slice(0, maxNominatorRewardedPerValidator);
|
|
505
|
+
}).slice(0, unlimitedNominatorRewarded ? undefined : maxNominatorRewardedPerValidator);
|
|
484
506
|
if (topNominators.includes(reformatAddress(poolStashAccount, _getChainSubstrateAddressPrefix(chainInfo)))) {
|
|
485
507
|
// if address in top nominators
|
|
486
508
|
stakingStatus = StakingStatus.EARNING_REWARD;
|
|
@@ -532,7 +554,8 @@ export async function getRelayValidatorsInfo(chain, substrateApi, decimals, chai
|
|
|
532
554
|
const validatorInfoList = [];
|
|
533
555
|
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$s2 = chainApi.api.query.stakingRewards) === null || _chainApi$api$query$s2 === void 0 ? void 0 : _chainApi$api$query$s2.data) && chainApi.api.query.stakingRewards.data()]);
|
|
534
556
|
const stakingRewards = _stakingRewards === null || _stakingRewards === void 0 ? void 0 : _stakingRewards.toPrimitive();
|
|
535
|
-
const
|
|
557
|
+
const unlimitedNominatorRewarded = chainApi.api.consts.staking.maxExposurePageSize !== undefined;
|
|
558
|
+
const maxNominatorRewarded = (chainApi.api.consts.staking.maxNominatorRewardedPerValidator || 0).toString();
|
|
536
559
|
const bnTotalEraStake = new BN(_totalEraStake.toString());
|
|
537
560
|
const eraStakers = _eraStakers;
|
|
538
561
|
const rawMinBond = _minBond.toHuman();
|
|
@@ -569,7 +592,7 @@ export async function getRelayValidatorsInfo(chain, substrateApi, decimals, chai
|
|
|
569
592
|
blocked: false,
|
|
570
593
|
isVerified: false,
|
|
571
594
|
minBond,
|
|
572
|
-
isCrowded: nominatorCount > parseInt(maxNominatorRewarded)
|
|
595
|
+
isCrowded: unlimitedNominatorRewarded ? false : nominatorCount > parseInt(maxNominatorRewarded)
|
|
573
596
|
});
|
|
574
597
|
}
|
|
575
598
|
const extraInfoMap = {};
|