@subwallet/extension-base 1.3.67-0 → 1.3.68-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 +12 -1
- package/cjs/constants/environment.js +1 -3
- package/cjs/constants/index.js +4 -1
- package/cjs/core/substrate/system-pallet.js +4 -0
- package/cjs/koni/api/nft/rari/index.js +1 -1
- package/cjs/koni/background/cron.js +16 -0
- package/cjs/koni/background/handlers/Extension.js +165 -89
- package/cjs/koni/background/handlers/State.js +25 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/group.js +31 -2
- package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +51 -13
- package/cjs/services/balance-service/helpers/subscribe/substrate/utils.js +69 -0
- package/cjs/services/balance-service/index.js +36 -11
- package/cjs/services/balance-service/transfer/smart-contract.js +2 -0
- package/cjs/services/chain-service/constants.js +8 -46
- package/cjs/services/chain-service/handler/EvmChainHandler.js +6 -3
- package/cjs/services/earning-service/handlers/base.js +7 -1
- package/cjs/services/nft-service/index.js +173 -0
- package/cjs/services/transaction-service/index.js +1 -1
- package/cjs/types/balance/index.js +26 -1
- package/cjs/utils/index.js +25 -2
- package/cjs/utils/setup-api-sdk.js +0 -5
- package/constants/environment.d.ts +0 -1
- package/constants/environment.js +0 -1
- package/constants/index.d.ts +1 -0
- package/constants/index.js +1 -0
- package/core/substrate/system-pallet.d.ts +1 -0
- package/core/substrate/system-pallet.js +3 -0
- package/core/substrate/types.d.ts +14 -0
- package/koni/api/nft/rari/index.js +1 -1
- package/koni/background/cron.d.ts +1 -0
- package/koni/background/cron.js +17 -1
- package/koni/background/handlers/Extension.d.ts +3 -0
- package/koni/background/handlers/Extension.js +87 -13
- package/koni/background/handlers/State.d.ts +4 -0
- package/koni/background/handlers/State.js +25 -0
- package/package.json +16 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/group.js +31 -2
- package/services/balance-service/helpers/subscribe/substrate/index.js +51 -13
- package/services/balance-service/helpers/subscribe/substrate/utils.d.ts +7 -0
- package/services/balance-service/helpers/subscribe/substrate/utils.js +58 -0
- package/services/balance-service/index.d.ts +4 -2
- package/services/balance-service/index.js +26 -6
- package/services/balance-service/transfer/smart-contract.js +2 -0
- package/services/chain-service/constants.d.ts +5 -24
- package/services/chain-service/constants.js +6 -35
- package/services/chain-service/handler/EvmChainHandler.js +6 -3
- package/services/earning-service/handlers/base.js +7 -1
- package/services/nft-service/index.d.ts +9 -0
- package/services/nft-service/index.js +165 -0
- package/services/transaction-service/index.js +1 -1
- package/services/transaction-service/types.d.ts +2 -1
- package/types/balance/index.d.ts +14 -0
- package/types/balance/index.js +21 -1
- package/utils/index.js +25 -2
- package/utils/setup-api-sdk.js +1 -6
|
@@ -32,6 +32,7 @@ var _keyringService = require("@subwallet/extension-base/services/keyring-servic
|
|
|
32
32
|
var _migrationService = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service"));
|
|
33
33
|
var _mintCampaignService = _interopRequireDefault(require("@subwallet/extension-base/services/mint-campaign-service"));
|
|
34
34
|
var _mktCampaignService = _interopRequireDefault(require("@subwallet/extension-base/services/mkt-campaign-service"));
|
|
35
|
+
var _nftService = _interopRequireDefault(require("@subwallet/extension-base/services/nft-service"));
|
|
35
36
|
var _NotificationService = _interopRequireDefault(require("@subwallet/extension-base/services/notification-service/NotificationService"));
|
|
36
37
|
var _priceService = require("@subwallet/extension-base/services/price-service");
|
|
37
38
|
var _requestService = _interopRequireDefault(require("@subwallet/extension-base/services/request-service"));
|
|
@@ -121,6 +122,7 @@ class KoniState {
|
|
|
121
122
|
this.migrationService = new _migrationService.default(this, this.eventService);
|
|
122
123
|
this.campaignService = new _campaignService.default(this);
|
|
123
124
|
this.mktCampaignService = new _mktCampaignService.default(this);
|
|
125
|
+
this.nftDetectionService = new _nftService.default(this);
|
|
124
126
|
this.buyService = new _buyService.default(this);
|
|
125
127
|
this.earningService = new _service.default(this);
|
|
126
128
|
this.swapService = new _swapService.SwapService(this);
|
|
@@ -405,6 +407,29 @@ class KoniState {
|
|
|
405
407
|
deleteNftCollection(chain, collectionId) {
|
|
406
408
|
return this.dbService.deleteNftCollection(chain, collectionId);
|
|
407
409
|
}
|
|
410
|
+
async handleDetectedNfts(address, nftItems) {
|
|
411
|
+
try {
|
|
412
|
+
const chainSlugs = this.activeChainSlugs;
|
|
413
|
+
const currentNfts = await this.dbService.getNft([address], chainSlugs);
|
|
414
|
+
const newNfts = nftItems.filter(n => !currentNfts.some(c => c.id === n.id));
|
|
415
|
+
for (const nft of newNfts) {
|
|
416
|
+
this.updateNftData(nft.chain, nft, address);
|
|
417
|
+
}
|
|
418
|
+
} catch (e) {
|
|
419
|
+
this.logger.warn('handleDetectedNfts error:', e);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
async handleDetectedNftCollections(collections) {
|
|
423
|
+
try {
|
|
424
|
+
const currentCollections = await this.getNftCollection();
|
|
425
|
+
const newCollections = collections.filter(col => !currentCollections.some(c => c.collectionId === col.collectionId && c.chain === col.chain));
|
|
426
|
+
for (const col of newCollections) {
|
|
427
|
+
this.setNftCollection(col.chain, col);
|
|
428
|
+
}
|
|
429
|
+
} catch (e) {
|
|
430
|
+
this.logger.warn('handleDetectedNftCollections error:', e);
|
|
431
|
+
}
|
|
432
|
+
}
|
|
408
433
|
cleanUpNfts(chain, owner, collectionId, nftIds, ownNothing) {
|
|
409
434
|
this.dbService.cleanUpNft(chain, owner, collectionId, nftIds, ownNothing).catch(e => this.logger.warn(e));
|
|
410
435
|
}
|
package/cjs/packageInfo.js
CHANGED
|
@@ -19,11 +19,40 @@ var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
|
19
19
|
*/
|
|
20
20
|
const groupBalance = (items, address, token) => {
|
|
21
21
|
const states = items.map(item => item.state);
|
|
22
|
+
const sum = selector => _bignumber.default.sum.apply(null, items.map(selector)).toFixed();
|
|
23
|
+
const staking = sum(i => {
|
|
24
|
+
var _i$lockedDetails$stak, _i$lockedDetails;
|
|
25
|
+
return (_i$lockedDetails$stak = (_i$lockedDetails = i.lockedDetails) === null || _i$lockedDetails === void 0 ? void 0 : _i$lockedDetails.staking) !== null && _i$lockedDetails$stak !== void 0 ? _i$lockedDetails$stak : '0';
|
|
26
|
+
});
|
|
27
|
+
const governance = sum(i => {
|
|
28
|
+
var _i$lockedDetails$gove, _i$lockedDetails2;
|
|
29
|
+
return (_i$lockedDetails$gove = (_i$lockedDetails2 = i.lockedDetails) === null || _i$lockedDetails2 === void 0 ? void 0 : _i$lockedDetails2.governance) !== null && _i$lockedDetails$gove !== void 0 ? _i$lockedDetails$gove : '0';
|
|
30
|
+
});
|
|
31
|
+
const democracy = sum(i => {
|
|
32
|
+
var _i$lockedDetails$demo, _i$lockedDetails3;
|
|
33
|
+
return (_i$lockedDetails$demo = (_i$lockedDetails3 = i.lockedDetails) === null || _i$lockedDetails3 === void 0 ? void 0 : _i$lockedDetails3.democracy) !== null && _i$lockedDetails$demo !== void 0 ? _i$lockedDetails$demo : '0';
|
|
34
|
+
});
|
|
35
|
+
const reserved = sum(i => {
|
|
36
|
+
var _i$lockedDetails$rese, _i$lockedDetails4;
|
|
37
|
+
return (_i$lockedDetails$rese = (_i$lockedDetails4 = i.lockedDetails) === null || _i$lockedDetails4 === void 0 ? void 0 : _i$lockedDetails4.reserved) !== null && _i$lockedDetails$rese !== void 0 ? _i$lockedDetails$rese : '0';
|
|
38
|
+
});
|
|
39
|
+
const others = sum(i => {
|
|
40
|
+
var _i$lockedDetails$othe, _i$lockedDetails5;
|
|
41
|
+
return (_i$lockedDetails$othe = (_i$lockedDetails5 = i.lockedDetails) === null || _i$lockedDetails5 === void 0 ? void 0 : _i$lockedDetails5.others) !== null && _i$lockedDetails$othe !== void 0 ? _i$lockedDetails$othe : '0';
|
|
42
|
+
});
|
|
43
|
+
const hasLockedDetails = new _bignumber.default(staking).gt(0) || new _bignumber.default(governance).gt(0) || new _bignumber.default(democracy).gt(0) || new _bignumber.default(others).gt(0);
|
|
22
44
|
return {
|
|
23
45
|
address,
|
|
24
46
|
tokenSlug: token,
|
|
25
|
-
free:
|
|
26
|
-
locked:
|
|
47
|
+
free: sum(i => i.free),
|
|
48
|
+
locked: sum(i => i.locked),
|
|
49
|
+
lockedDetails: hasLockedDetails ? {
|
|
50
|
+
staking,
|
|
51
|
+
governance,
|
|
52
|
+
democracy,
|
|
53
|
+
reserved,
|
|
54
|
+
others
|
|
55
|
+
} : undefined,
|
|
27
56
|
state: states.every(item => item === _KoniTypes.APIItemState.NOT_SUPPORT) ? _KoniTypes.APIItemState.NOT_SUPPORT : states.some(item => item === _KoniTypes.APIItemState.READY) ? _KoniTypes.APIItemState.READY : _KoniTypes.APIItemState.PENDING
|
|
28
57
|
};
|
|
29
58
|
};
|
|
@@ -25,6 +25,7 @@ var _rxjs = require("rxjs");
|
|
|
25
25
|
var _evm = require("../evm");
|
|
26
26
|
var _equilibrium = require("./equilibrium");
|
|
27
27
|
var _gear = require("./gear");
|
|
28
|
+
var _utils4 = require("./utils");
|
|
28
29
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
29
30
|
// SPDX-License-Identifier: Apache-2.0
|
|
30
31
|
|
|
@@ -116,7 +117,6 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
|
|
|
116
117
|
};
|
|
117
118
|
};
|
|
118
119
|
|
|
119
|
-
// handler according to different logic
|
|
120
120
|
// eslint-disable-next-line @typescript-eslint/require-await
|
|
121
121
|
exports.subscribeSubstrateBalance = subscribeSubstrateBalance;
|
|
122
122
|
const subscribeWithSystemAccountPallet = async _ref => {
|
|
@@ -149,16 +149,10 @@ const subscribeWithSystemAccountPallet = async _ref => {
|
|
|
149
149
|
const subscription = substrateApi.subscribeDataWithMulti(params, async rs => {
|
|
150
150
|
const balances = rs[systemAccountKey];
|
|
151
151
|
const poolMemberInfos = rs[poolMembersKey];
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
bittensorStakingBalances = values.map(_ref2 => {
|
|
157
|
-
let [, stakes] = _ref2;
|
|
158
|
-
return stakes.filter(i => i.netuid === 0).reduce((previousValue, currentValue) => previousValue.plus(currentValue.stake), (0, _bignumber.default)(0));
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
const items = balances.map((_balance, index) => {
|
|
152
|
+
const bittensorStakingBalances = await (0, _utils4.getSpecialStakingBalances)(chainInfo, addresses, substrateApi);
|
|
153
|
+
|
|
154
|
+
// Precompute totalLockedFromTransfer for each account to decide if need fetch locks/holds
|
|
155
|
+
const preItems = balances.map((_balance, index) => {
|
|
162
156
|
const balanceInfo = _balance;
|
|
163
157
|
const transferableBalance = (0, _systemPallet._getSystemPalletTransferable)(balanceInfo, (0, _utils2._getChainExistentialDeposit)(chainInfo), extrinsicType);
|
|
164
158
|
const totalBalance = (0, _systemPallet._getSystemPalletTotalBalance)(balanceInfo);
|
|
@@ -168,14 +162,58 @@ const subscribeWithSystemAccountPallet = async _ref => {
|
|
|
168
162
|
const nominationPoolBalance = poolMemberInfo ? (0, _nominationpoolsPallet._getTotalStakeInNominationPool)(poolMemberInfo) : BigInt(0);
|
|
169
163
|
totalLockedFromTransfer += nominationPoolBalance;
|
|
170
164
|
}
|
|
171
|
-
|
|
172
|
-
|
|
165
|
+
totalLockedFromTransfer += BigInt(bittensorStakingBalances[index].toString());
|
|
166
|
+
return {
|
|
167
|
+
index,
|
|
168
|
+
totalLockedFromTransfer,
|
|
169
|
+
balanceInfo
|
|
170
|
+
};
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
// Filter account's locked > 0
|
|
174
|
+
const accountsWithLocks = preItems.filter(i => i.totalLockedFromTransfer > 0).map(i => addresses[i.index]);
|
|
175
|
+
let locks = [];
|
|
176
|
+
let holds = [];
|
|
177
|
+
let freezes = [];
|
|
178
|
+
|
|
179
|
+
// Fetch locks/holds only for accounts that have locked balances
|
|
180
|
+
if (accountsWithLocks.length > 0) {
|
|
181
|
+
const [rawLocks, rawHolds, rawFreezes] = await Promise.all([substrateApi.api.query.balances.locks.multi(accountsWithLocks), substrateApi.api.query.balances.holds.multi(accountsWithLocks), substrateApi.api.query.balances.freezes.multi(accountsWithLocks)]);
|
|
182
|
+
locks = rawLocks.map(lockArr => lockArr.map(l => ({
|
|
183
|
+
id: l.id.toPrimitive(),
|
|
184
|
+
amount: l.amount.toString()
|
|
185
|
+
})));
|
|
186
|
+
holds = rawHolds.map(holdArr => holdArr.map(h => ({
|
|
187
|
+
id: h.id.toPrimitive(),
|
|
188
|
+
amount: h.amount.toString()
|
|
189
|
+
})));
|
|
190
|
+
freezes = rawFreezes.map(freezeArr => freezeArr.map(f => ({
|
|
191
|
+
id: f.id.toPrimitive(),
|
|
192
|
+
amount: f.amount.toString()
|
|
193
|
+
})));
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Map locks/holds back to original index
|
|
197
|
+
const items = preItems.map(_ref2 => {
|
|
198
|
+
let {
|
|
199
|
+
balanceInfo,
|
|
200
|
+
index,
|
|
201
|
+
totalLockedFromTransfer
|
|
202
|
+
} = _ref2;
|
|
203
|
+
const lockIndex = accountsWithLocks.indexOf(addresses[index]);
|
|
204
|
+
const lockItems = lockIndex >= 0 ? locks[lockIndex] || [] : [];
|
|
205
|
+
const holdItems = lockIndex >= 0 ? holds[lockIndex] || [] : [];
|
|
206
|
+
const freezeItems = lockIndex >= 0 ? freezes[lockIndex] || [] : [];
|
|
207
|
+
const allLockEntries = [...lockItems, ...holdItems, ...freezeItems];
|
|
208
|
+
const lockedDetails = (0, _utils4.buildLockedDetails)(allLockEntries, totalLockedFromTransfer, (0, _systemPallet._getSystemPalletReservedBalance)(balanceInfo), bittensorStakingBalances[index]);
|
|
209
|
+
const transferableBalance = (0, _systemPallet._getSystemPalletTransferable)(balanceInfo, (0, _utils2._getChainExistentialDeposit)(chainInfo), extrinsicType);
|
|
173
210
|
return {
|
|
174
211
|
address: addresses[index],
|
|
175
212
|
tokenSlug: (0, _utils2._getChainNativeTokenSlug)(chainInfo),
|
|
176
213
|
free: transferableBalance.toString(),
|
|
177
214
|
locked: totalLockedFromTransfer.toString(),
|
|
178
215
|
state: _KoniTypes.APIItemState.READY,
|
|
216
|
+
lockedDetails,
|
|
179
217
|
metadata: balanceInfo
|
|
180
218
|
};
|
|
181
219
|
});
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.buildLockedDetails = buildLockedDetails;
|
|
8
|
+
exports.getSpecialStakingBalances = getSpecialStakingBalances;
|
|
9
|
+
var _constants = require("@subwallet/extension-base/services/chain-service/constants");
|
|
10
|
+
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
11
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
12
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
13
|
+
|
|
14
|
+
async function getSpecialStakingBalances(chainInfo, addresses, substrateApi) {
|
|
15
|
+
// Default: 0 for all addresses
|
|
16
|
+
let balances = new Array(addresses.length).fill(new _bignumber.default(0));
|
|
17
|
+
|
|
18
|
+
// --- Bittensor ----------------------------------------------------------------
|
|
19
|
+
if (_constants._BALANCE_CHAIN_GROUP.bittensor.includes(chainInfo.slug)) {
|
|
20
|
+
const rawData = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkeys(addresses);
|
|
21
|
+
const values = rawData.toPrimitive();
|
|
22
|
+
balances = values.map(_ref => {
|
|
23
|
+
let [, stakes] = _ref;
|
|
24
|
+
return stakes.filter(i => i.netuid === 0).reduce((prev, curr) => prev.plus(curr.stake), (0, _bignumber.default)(0));
|
|
25
|
+
});
|
|
26
|
+
return balances;
|
|
27
|
+
}
|
|
28
|
+
return balances;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// handler according to different logic
|
|
32
|
+
const extractId = id => {
|
|
33
|
+
if (!id) {
|
|
34
|
+
return '';
|
|
35
|
+
}
|
|
36
|
+
if (typeof id === 'string') {
|
|
37
|
+
return id.replace(/\0/g, '').trim();
|
|
38
|
+
}
|
|
39
|
+
const keys = Object.keys(id);
|
|
40
|
+
return keys.length ? keys[0] : '';
|
|
41
|
+
};
|
|
42
|
+
function buildLockedDetails(item, totalLockedFromTransfer, reserved, externalStaking) {
|
|
43
|
+
let stakingBalance = externalStaking || new _bignumber.default(0);
|
|
44
|
+
let govBalance = new _bignumber.default(0);
|
|
45
|
+
let democracyBalance = new _bignumber.default(0);
|
|
46
|
+
const reservedBN = new _bignumber.default(reserved.toString());
|
|
47
|
+
for (const entry of item) {
|
|
48
|
+
const id = extractId(entry.id);
|
|
49
|
+
const amount = new _bignumber.default(String(entry.amount || 0));
|
|
50
|
+
if (_constants._BALANCE_LOCKED_ID_GROUP.staking.includes(id)) {
|
|
51
|
+
stakingBalance = stakingBalance.plus(amount);
|
|
52
|
+
} else if (_constants._BALANCE_LOCKED_ID_GROUP.gov.includes(id)) {
|
|
53
|
+
govBalance = govBalance.plus(amount);
|
|
54
|
+
} else if (_constants._BALANCE_LOCKED_ID_GROUP.democracy.includes(id)) {
|
|
55
|
+
democracyBalance = democracyBalance.plus(amount);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// others = total locked - max(staking, gov, democracy, reserved)
|
|
60
|
+
const maxMain = _bignumber.default.max(stakingBalance, govBalance, democracyBalance, reservedBN);
|
|
61
|
+
const others = new _bignumber.default(totalLockedFromTransfer.toString()).minus(maxMain);
|
|
62
|
+
return {
|
|
63
|
+
staking: stakingBalance.toFixed(),
|
|
64
|
+
governance: govBalance.toFixed(),
|
|
65
|
+
democracy: democracyBalance.toFixed(),
|
|
66
|
+
reserved: reservedBN.toFixed(),
|
|
67
|
+
others: others.gt(0) ? others.toFixed() : '0'
|
|
68
|
+
};
|
|
69
|
+
}
|
|
@@ -13,15 +13,17 @@ var _process = require("@subwallet/extension-base/services/balance-service/helpe
|
|
|
13
13
|
var _types = require("@subwallet/extension-base/services/base/types");
|
|
14
14
|
var _utils = require("@subwallet/extension-base/services/chain-service/utils");
|
|
15
15
|
var _DetectAccountBalance = _interopRequireDefault(require("@subwallet/extension-base/stores/DetectAccountBalance"));
|
|
16
|
+
var _types2 = require("@subwallet/extension-base/types");
|
|
16
17
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
17
18
|
var _keyring = require("@subwallet/keyring");
|
|
18
|
-
var
|
|
19
|
+
var _types3 = require("@subwallet/keyring/types");
|
|
19
20
|
var _uiKeyring = _interopRequireDefault(require("@subwallet/ui-keyring"));
|
|
20
21
|
var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
|
|
21
22
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
22
23
|
var _i18next = require("i18next");
|
|
23
24
|
var _rxjs = require("rxjs");
|
|
24
25
|
var _util = require("@polkadot/util");
|
|
26
|
+
var _constants2 = require("../chain-service/constants");
|
|
25
27
|
var _acrossBridge = require("./transfer/xcm/acrossBridge");
|
|
26
28
|
var _BalanceMapImpl = require("./BalanceMapImpl");
|
|
27
29
|
var _helpers = require("./helpers");
|
|
@@ -182,7 +184,7 @@ class BalanceService {
|
|
|
182
184
|
|
|
183
185
|
/** Subscribe token free balance of an address on chain */
|
|
184
186
|
async subscribeBalance(address, chain, tokenSlug) {
|
|
185
|
-
let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] :
|
|
187
|
+
let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _types2.BalanceType.TRANSFERABLE;
|
|
186
188
|
let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
|
|
187
189
|
let callback = arguments.length > 5 ? arguments[5] : undefined;
|
|
188
190
|
const chainInfo = this.state.chainService.getChainInfoByKey(chain);
|
|
@@ -217,9 +219,20 @@ class BalanceService {
|
|
|
217
219
|
const rs = result[0];
|
|
218
220
|
let value;
|
|
219
221
|
switch (balanceType) {
|
|
220
|
-
case
|
|
222
|
+
case _types2.BalanceType.TOTAL:
|
|
221
223
|
value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).toFixed();
|
|
222
224
|
break;
|
|
225
|
+
case _types2.BalanceType.TOTAL_MINUS_RESERVED:
|
|
226
|
+
if (_constants2._BALANCE_CHAIN_GROUP.notSupportGetBalanceByType.includes(chainInfo.slug)) {
|
|
227
|
+
// TODO: Currently Vara and Avail staking from nomination pools is not fully supported.
|
|
228
|
+
// Return `free` to avoid incorrect TOTAL_MINUS_RESERVED calculation.
|
|
229
|
+
// Improve later when full staking breakdown is available.
|
|
230
|
+
value = rs.free;
|
|
231
|
+
} else {
|
|
232
|
+
var _rs$lockedDetails, _rs$lockedDetails2;
|
|
233
|
+
value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).minus(_bignumber.default.max(new _bignumber.default(((_rs$lockedDetails = rs.lockedDetails) === null || _rs$lockedDetails === void 0 ? void 0 : _rs$lockedDetails.reserved) || 0), new _bignumber.default(((_rs$lockedDetails2 = rs.lockedDetails) === null || _rs$lockedDetails2 === void 0 ? void 0 : _rs$lockedDetails2.staking) || 0))).toFixed();
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
223
236
|
default:
|
|
224
237
|
value = rs.free;
|
|
225
238
|
}
|
|
@@ -251,10 +264,16 @@ class BalanceService {
|
|
|
251
264
|
});
|
|
252
265
|
}
|
|
253
266
|
async subscribeTransferableBalance(address, chain, tokenSlug, extrinsicType, callback) {
|
|
254
|
-
return this.subscribeBalance(address, chain, tokenSlug,
|
|
267
|
+
return this.subscribeBalance(address, chain, tokenSlug, _types2.BalanceType.TRANSFERABLE, extrinsicType, callback);
|
|
255
268
|
}
|
|
256
269
|
async subscribeTotalBalance(address, chain, tokenSlug, extrinsicType, callback) {
|
|
257
|
-
return this.subscribeBalance(address, chain, tokenSlug,
|
|
270
|
+
return this.subscribeBalance(address, chain, tokenSlug, _types2.BalanceType.TOTAL, extrinsicType, callback);
|
|
271
|
+
}
|
|
272
|
+
async subscribeBalanceByType(address, chain, tokenSlug) {
|
|
273
|
+
let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _types2.BalanceType.TRANSFERABLE;
|
|
274
|
+
let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
|
|
275
|
+
let callback = arguments.length > 5 ? arguments[5] : undefined;
|
|
276
|
+
return this.subscribeBalance(address, chain, tokenSlug, balanceType, extrinsicType, callback);
|
|
258
277
|
}
|
|
259
278
|
|
|
260
279
|
/**
|
|
@@ -276,6 +295,12 @@ class BalanceService {
|
|
|
276
295
|
const [, balance] = await this.subscribeTotalBalance(address, chain, tokenSlug, extrinsicType);
|
|
277
296
|
return balance;
|
|
278
297
|
}
|
|
298
|
+
async getBalanceByType(address, chain, tokenSlug) {
|
|
299
|
+
let balanceType = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : _types2.BalanceType.TRANSFERABLE;
|
|
300
|
+
let extrinsicType = arguments.length > 4 ? arguments[4] : undefined;
|
|
301
|
+
const [, balance] = await this.subscribeBalanceByType(address, chain, tokenSlug, balanceType, extrinsicType);
|
|
302
|
+
return balance;
|
|
303
|
+
}
|
|
279
304
|
|
|
280
305
|
/** Remove balance from the subject object by addresses */
|
|
281
306
|
removeBalanceByAddresses(addresses) {
|
|
@@ -447,7 +472,7 @@ class BalanceService {
|
|
|
447
472
|
const assetMap = this.state.chainService.getAssetRegistry();
|
|
448
473
|
const promiseList = addresses.map(address => {
|
|
449
474
|
const type = (0, _keyring.getKeypairTypeByAddress)(address);
|
|
450
|
-
const typeValid = [...
|
|
475
|
+
const typeValid = [..._types3.SubstrateKeypairTypes, ..._types3.EthereumKeypairTypes].includes(type);
|
|
451
476
|
if (typeValid) {
|
|
452
477
|
return this.state.subscanService.getMultiChainBalance(address).catch(e => {
|
|
453
478
|
console.error(e);
|
|
@@ -459,9 +484,9 @@ class BalanceService {
|
|
|
459
484
|
});
|
|
460
485
|
const evmPromiseList = addresses.map(address => {
|
|
461
486
|
const type = (0, _keyring.getKeypairTypeByAddress)(address);
|
|
462
|
-
const typeValid = [...
|
|
487
|
+
const typeValid = [..._types3.EthereumKeypairTypes].includes(type);
|
|
463
488
|
if (typeValid) {
|
|
464
|
-
return _subwalletServicesSdk.default.balanceDetectionApi.
|
|
489
|
+
return _subwalletServicesSdk.default.balanceDetectionApi.getSwEvmTokenBalance(address).catch(e => {
|
|
465
490
|
console.error(e);
|
|
466
491
|
return null;
|
|
467
492
|
});
|
|
@@ -641,7 +666,7 @@ class BalanceService {
|
|
|
641
666
|
async evmDetectBalanceToken(addresses) {
|
|
642
667
|
const assetMap = this.state.chainService.getAssetRegistry();
|
|
643
668
|
const evmPromiseList = addresses.map(address => {
|
|
644
|
-
return _subwalletServicesSdk.default.balanceDetectionApi.
|
|
669
|
+
return _subwalletServicesSdk.default.balanceDetectionApi.getSwEvmTokenBalance(address).catch(e => {
|
|
645
670
|
console.error(e);
|
|
646
671
|
return null;
|
|
647
672
|
});
|
|
@@ -748,8 +773,8 @@ class BalanceService {
|
|
|
748
773
|
const assetSettings = await this.state.chainService.getAssetSettings();
|
|
749
774
|
const assetMap = this.state.chainService.getAssetRegistry();
|
|
750
775
|
const addresses = _uiKeyring.default.getPairs().map(account => account.address);
|
|
751
|
-
const evmAddresses = addresses.filter(address => [...
|
|
752
|
-
const substrateAddresses = addresses.filter(address => [...
|
|
776
|
+
const evmAddresses = addresses.filter(address => [..._types3.EthereumKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
|
|
777
|
+
const substrateAddresses = addresses.filter(address => [..._types3.SubstrateKeypairTypes].includes((0, _keyring.getKeypairTypeByAddress)(address)));
|
|
753
778
|
const [nonZeroBalanceEvmToken, nonZeroBalanceSubstrateToken] = await Promise.all([this.evmDetectBalanceToken(evmAddresses), this.substrateDetectBalanceToken(substrateAddresses)]);
|
|
754
779
|
const substrateDetectChain = this.substrateDetectBalanceChain();
|
|
755
780
|
const evmDetectChain = await this.evmDetectBalanceChain();
|
|
@@ -173,7 +173,9 @@ async function getERC721Transaction(web3Api, chain, contractAddress, senderAddre
|
|
|
173
173
|
const error = e;
|
|
174
174
|
if (error.message.includes('transfer to non ERC721Receiver implementer')) {
|
|
175
175
|
error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.nftNotSupportedOnRecipient');
|
|
176
|
+
throw error;
|
|
176
177
|
}
|
|
178
|
+
error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.temporarilyNontransferableNFT');
|
|
177
179
|
throw error;
|
|
178
180
|
}
|
|
179
181
|
const feeInfo = _feeInfo;
|
|
@@ -3,9 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports._ZK_ASSET_PREFIX = exports.
|
|
6
|
+
exports._ZK_ASSET_PREFIX = exports._TRANSFER_CHAIN_GROUP = exports._SUBSTRATE_DEFAULT_INFLATION_PARAMS = exports._STAKING_ERA_LENGTH_MAP = exports._PURE_EVM_CHAINS = exports._PREDEFINED_SINGLE_MODES = exports._PARACHAIN_INFLATION_DISTRIBUTION = exports._NFT_CHAIN_GROUP = exports._MANTA_ZK_CHAIN_GROUP = exports._KNOWN_CHAIN_INFLATION_PARAMS = exports._EXPECTED_BLOCK_TIME = exports._DEFAULT_MANTA_ZK_CHAIN = exports._DEFAULT_ACTIVE_CHAINS = exports._BTC_SERVICE_TOKEN = exports._BITCOIN_TESTNET_NAME = exports._BITCOIN_TESTNET_CHAIN_SLUG = exports._BITCOIN_NAME = exports._BITCOIN_CHAIN_SLUG = exports._BALANCE_LOCKED_ID_GROUP = exports._BALANCE_CHAIN_GROUP = exports._API_OPTIONS_CHAIN_GROUP = exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = exports.EVM_REFORMAT_DECIMALS = exports.EVM_PASS_CONNECT_STATUS = exports.API_CONNECT_TIMEOUT = exports.API_AUTO_CONNECT_MS = void 0;
|
|
7
7
|
var _chainList = require("@subwallet/chain-list");
|
|
8
|
-
var _types = require("@subwallet/chain-list/types");
|
|
9
8
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
10
9
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
11
10
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -14,8 +13,6 @@ const API_AUTO_CONNECT_MS = 3000;
|
|
|
14
13
|
exports.API_AUTO_CONNECT_MS = API_AUTO_CONNECT_MS;
|
|
15
14
|
const API_CONNECT_TIMEOUT = 30000;
|
|
16
15
|
exports.API_CONNECT_TIMEOUT = API_CONNECT_TIMEOUT;
|
|
17
|
-
const API_MAX_RETRY = 2;
|
|
18
|
-
exports.API_MAX_RETRY = API_MAX_RETRY;
|
|
19
16
|
const _API_OPTIONS_CHAIN_GROUP = {
|
|
20
17
|
acala: ['acala', 'karura', 'origintrail', 'kintsugi'],
|
|
21
18
|
turing: ['turingStaging', 'turing'],
|
|
@@ -47,14 +44,16 @@ const _BALANCE_CHAIN_GROUP = {
|
|
|
47
44
|
centrifuge: ['centrifuge'],
|
|
48
45
|
supportBridged: ['rococo_assethub', 'statemint', 'statemine', 'polimec'],
|
|
49
46
|
bittensor: ['bittensor', 'bittensor_testnet'],
|
|
50
|
-
moonbeam: ['moonbeam', 'moonriver', 'moonbase']
|
|
47
|
+
moonbeam: ['moonbeam', 'moonriver', 'moonbase'],
|
|
48
|
+
notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet']
|
|
51
49
|
};
|
|
52
50
|
exports._BALANCE_CHAIN_GROUP = _BALANCE_CHAIN_GROUP;
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
const _BALANCE_LOCKED_ID_GROUP = {
|
|
52
|
+
staking: ['staking', 'delegatedStaking', 'pooledStaking', 'stkngdel', 'stk_stks', 'dappStaking', 'parachainStaking', 'appstakeappstake', 'collatorStaking'],
|
|
53
|
+
gov: ['pyconvot'],
|
|
54
|
+
democracy: ['democrac']
|
|
56
55
|
};
|
|
57
|
-
exports.
|
|
56
|
+
exports._BALANCE_LOCKED_ID_GROUP = _BALANCE_LOCKED_ID_GROUP;
|
|
58
57
|
const _NFT_CHAIN_GROUP = {
|
|
59
58
|
acala: ['acala'],
|
|
60
59
|
karura: ['karura'],
|
|
@@ -291,13 +290,10 @@ const _KNOWN_CHAIN_INFLATION_PARAMS = {
|
|
|
291
290
|
|
|
292
291
|
// Send fund------------------------------------------------------------------------------------------------------------
|
|
293
292
|
exports._KNOWN_CHAIN_INFLATION_PARAMS = _KNOWN_CHAIN_INFLATION_PARAMS;
|
|
294
|
-
const _TRANSFER_NOT_SUPPORTED_CHAINS = ['subspace_gemini_3a', 'kulupu', 'joystream', 'equilibrium_parachain', 'genshiro_testnet', 'genshiro'];
|
|
295
|
-
exports._TRANSFER_NOT_SUPPORTED_CHAINS = _TRANSFER_NOT_SUPPORTED_CHAINS;
|
|
296
293
|
const _TRANSFER_CHAIN_GROUP = {
|
|
297
294
|
acala: ['karura', 'acala', 'acala_testnet'],
|
|
298
295
|
kintsugi: ['kintsugi', 'kintsugi_test', 'interlay', 'mangatax_para'],
|
|
299
296
|
genshiro: ['genshiro_testnet', 'genshiro', 'equilibrium_parachain'],
|
|
300
|
-
// crab: ['crab', 'pangolin'],
|
|
301
297
|
bitcountry: ['pioneer', 'bitcountry'],
|
|
302
298
|
statemine: ['statemint', 'statemine', 'darwinia2', 'astar', 'shiden', 'shibuya', 'parallel', 'liberland', 'liberlandTest', 'dentnet', 'dbcchain', 'westend_assethub', 'chainflip_assethub', 'origintrail', 'xode', 'paseo_assethub'],
|
|
303
299
|
riochain: ['riochain'],
|
|
@@ -309,10 +305,6 @@ const _TRANSFER_CHAIN_GROUP = {
|
|
|
309
305
|
truth: ['truth_network']
|
|
310
306
|
};
|
|
311
307
|
exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
|
|
312
|
-
const _BALANCE_PARSING_CHAIN_GROUP = {
|
|
313
|
-
bobabeam: ['bobabeam', 'bobabase']
|
|
314
|
-
};
|
|
315
|
-
exports._BALANCE_PARSING_CHAIN_GROUP = _BALANCE_PARSING_CHAIN_GROUP;
|
|
316
308
|
const _MANTA_ZK_CHAIN_GROUP = ['calamari'];
|
|
317
309
|
exports._MANTA_ZK_CHAIN_GROUP = _MANTA_ZK_CHAIN_GROUP;
|
|
318
310
|
const _ZK_ASSET_PREFIX = 'zk';
|
|
@@ -321,21 +313,6 @@ const _DEFAULT_MANTA_ZK_CHAIN = 'calamari';
|
|
|
321
313
|
|
|
322
314
|
// XCM------------------------------------------------------------------------------------------------------------------
|
|
323
315
|
exports._DEFAULT_MANTA_ZK_CHAIN = _DEFAULT_MANTA_ZK_CHAIN;
|
|
324
|
-
const _XCM_CHAIN_GROUP = {
|
|
325
|
-
polkadotXcm: ['statemine', 'statemint', 'equilibrium_parachain', 'rococo_assethub', 'mythos', 'westend_assethub'],
|
|
326
|
-
polkadotXcmSpecialCases: ['astar', 'shiden'],
|
|
327
|
-
xcmPallet: ['polkadot', 'kusama', 'rococo', 'westend']
|
|
328
|
-
// default is xTokens pallet
|
|
329
|
-
};
|
|
330
|
-
exports._XCM_CHAIN_GROUP = _XCM_CHAIN_GROUP;
|
|
331
|
-
const _XCM_TYPE = {
|
|
332
|
-
RP: `${_types._SubstrateChainType.RELAYCHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
|
|
333
|
-
// DMP
|
|
334
|
-
PP: `${_types._SubstrateChainType.PARACHAIN}-${_types._SubstrateChainType.PARACHAIN}`,
|
|
335
|
-
// HRMP
|
|
336
|
-
PR: `${_types._SubstrateChainType.PARACHAIN}-${_types._SubstrateChainType.RELAYCHAIN}` // UMP
|
|
337
|
-
};
|
|
338
|
-
exports._XCM_TYPE = _XCM_TYPE;
|
|
339
316
|
const _DEFAULT_ACTIVE_CHAINS = [..._chainList._DEFAULT_CHAINS, 'vara_network', 'ton'];
|
|
340
317
|
exports._DEFAULT_ACTIVE_CHAINS = _DEFAULT_ACTIVE_CHAINS;
|
|
341
318
|
const EVM_PASS_CONNECT_STATUS = {
|
|
@@ -351,10 +328,7 @@ const EVM_REFORMAT_DECIMALS = {
|
|
|
351
328
|
};
|
|
352
329
|
exports.EVM_REFORMAT_DECIMALS = EVM_REFORMAT_DECIMALS;
|
|
353
330
|
const LATEST_CHAIN_DATA_FETCHING_INTERVAL = 120000;
|
|
354
|
-
|
|
355
|
-
// TODO: review
|
|
356
331
|
exports.LATEST_CHAIN_DATA_FETCHING_INTERVAL = LATEST_CHAIN_DATA_FETCHING_INTERVAL;
|
|
357
|
-
const TARGET_BRANCH = process.env.NODE_ENV !== 'production' ? 'koni-dev' : 'master';
|
|
358
332
|
const _BITCOIN_CHAIN_SLUG = 'bitcoin';
|
|
359
333
|
exports._BITCOIN_CHAIN_SLUG = _BITCOIN_CHAIN_SLUG;
|
|
360
334
|
const _BITCOIN_TESTNET_CHAIN_SLUG = 'bitcoinTestnet';
|
|
@@ -363,17 +337,5 @@ const _BITCOIN_NAME = 'Bitcoin';
|
|
|
363
337
|
exports._BITCOIN_NAME = _BITCOIN_NAME;
|
|
364
338
|
const _BITCOIN_TESTNET_NAME = 'Bitcoin Testnet';
|
|
365
339
|
exports._BITCOIN_TESTNET_NAME = _BITCOIN_TESTNET_NAME;
|
|
366
|
-
const _CHAIN_INFO_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainInfo.json`;
|
|
367
|
-
exports._CHAIN_INFO_SRC = _CHAIN_INFO_SRC;
|
|
368
|
-
const _CHAIN_ASSET_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainAsset.json`;
|
|
369
|
-
exports._CHAIN_ASSET_SRC = _CHAIN_ASSET_SRC;
|
|
370
|
-
const _ASSET_REF_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/AssetRef.json`;
|
|
371
|
-
exports._ASSET_REF_SRC = _ASSET_REF_SRC;
|
|
372
|
-
const _MULTI_CHAIN_ASSET_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/MultiChainAsset.json`;
|
|
373
|
-
exports._MULTI_CHAIN_ASSET_SRC = _MULTI_CHAIN_ASSET_SRC;
|
|
374
|
-
const _CHAIN_LOGO_MAP_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainLogoMap.json`;
|
|
375
|
-
exports._CHAIN_LOGO_MAP_SRC = _CHAIN_LOGO_MAP_SRC;
|
|
376
|
-
const _ASSET_LOGO_MAP_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/AssetLogoMap.json`;
|
|
377
|
-
exports._ASSET_LOGO_MAP_SRC = _ASSET_LOGO_MAP_SRC;
|
|
378
340
|
const _BTC_SERVICE_TOKEN = process.env.BTC_SERVICE_TOKEN || '';
|
|
379
341
|
exports._BTC_SERVICE_TOKEN = _BTC_SERVICE_TOKEN;
|
|
@@ -126,6 +126,9 @@ class EvmChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
126
126
|
tokenContract.methods.symbol().call()]);
|
|
127
127
|
name = _name;
|
|
128
128
|
symbol = _symbol;
|
|
129
|
+
if (name === '') {
|
|
130
|
+
contractError = true;
|
|
131
|
+
}
|
|
129
132
|
} else {
|
|
130
133
|
tokenContract = new evmApi.api.eth.Contract(_utils._ERC20_ABI, contractAddress);
|
|
131
134
|
const [_decimals, _symbol, _name] = await Promise.all([
|
|
@@ -138,9 +141,9 @@ class EvmChainHandler extends _AbstractChainHandler.AbstractChainHandler {
|
|
|
138
141
|
name = _name;
|
|
139
142
|
decimals = new _bignumber.default(_decimals).toNumber();
|
|
140
143
|
symbol = _symbol;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
+
if (name === '' || symbol === '') {
|
|
145
|
+
contractError = true;
|
|
146
|
+
}
|
|
144
147
|
}
|
|
145
148
|
return {
|
|
146
149
|
name,
|
|
@@ -8,6 +8,7 @@ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
|
8
8
|
var _constants = require("@subwallet/extension-base/constants");
|
|
9
9
|
var _constants2 = require("@subwallet/extension-base/services/earning-service/constants");
|
|
10
10
|
var _utils = require("@subwallet/extension-base/services/inapp-notification-service/utils");
|
|
11
|
+
var _types = require("@subwallet/extension-base/types");
|
|
11
12
|
var _utils2 = require("@subwallet/extension-base/utils");
|
|
12
13
|
var _util = require("@polkadot/util");
|
|
13
14
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
@@ -162,7 +163,12 @@ class BasePoolHandler {
|
|
|
162
163
|
}
|
|
163
164
|
const nativeTokenInfo = this.state.chainService.getNativeTokenInfo(this.chain);
|
|
164
165
|
// Use TRANSFER_BALANCE extrinsic in order to get transferable balanace without minus ED
|
|
165
|
-
|
|
166
|
+
let nativeTokenBalance;
|
|
167
|
+
if ([_types.YieldPoolType.NATIVE_STAKING, _types.YieldPoolType.NOMINATION_POOL].includes(poolInfo.type)) {
|
|
168
|
+
nativeTokenBalance = await this.state.balanceService.getBalanceByType(request.address, this.chain, undefined, _types.BalanceType.TOTAL_MINUS_RESERVED, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
|
|
169
|
+
} else {
|
|
170
|
+
nativeTokenBalance = await this.state.balanceService.getTransferableBalance(request.address, this.chain, undefined, _KoniTypes.ExtrinsicType.TRANSFER_BALANCE);
|
|
171
|
+
}
|
|
166
172
|
const bnNativeTokenBalance = new _util.BN(nativeTokenBalance.value);
|
|
167
173
|
const bnMinBalanceToJoin = new _util.BN(((_poolInfo$statistic2 = poolInfo.statistic) === null || _poolInfo$statistic2 === void 0 ? void 0 : (_poolInfo$statistic2$ = _poolInfo$statistic2.earningThreshold) === null || _poolInfo$statistic2$ === void 0 ? void 0 : _poolInfo$statistic2$.join) || '0').add(new _util.BN(poolInfo.metadata.maintainBalance));
|
|
168
174
|
if (bnNativeTokenBalance.lte(bnMinBalanceToJoin)) {
|