@subwallet/extension-base 1.3.66-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/core/substrate/xcm-parser.js +0 -176
- 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 +166 -90
- 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 +56 -23
- package/cjs/services/balance-service/transfer/xcm/index.js +30 -44
- package/cjs/services/balance-service/transfer/xcm/utils.js +53 -18
- 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/swap-service/handler/base-handler.js +18 -21
- package/cjs/services/transaction-service/index.js +1 -1
- package/cjs/types/balance/index.js +26 -1
- package/cjs/utils/fee/transfer.js +5 -2
- 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/core/substrate/xcm-parser.d.ts +1 -49
- package/core/substrate/xcm-parser.js +1 -173
- 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 +88 -14
- package/koni/background/handlers/State.d.ts +4 -0
- package/koni/background/handlers/State.js +25 -0
- package/package.json +16 -21
- 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.d.ts +4 -0
- package/services/balance-service/transfer/smart-contract.js +54 -23
- package/services/balance-service/transfer/xcm/index.d.ts +2 -2
- package/services/balance-service/transfer/xcm/index.js +18 -32
- package/services/balance-service/transfer/xcm/utils.d.ts +1 -2
- package/services/balance-service/transfer/xcm/utils.js +51 -15
- 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/swap-service/handler/base-handler.d.ts +0 -1
- package/services/swap-service/handler/base-handler.js +19 -22
- 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/fee/transfer.js +6 -3
- package/utils/index.js +25 -2
- package/utils/setup-api-sdk.js +1 -6
- package/cjs/services/balance-service/transfer/xcm/polkadotXcm.js +0 -30
- package/cjs/services/balance-service/transfer/xcm/xTokens.js +0 -32
- package/cjs/services/balance-service/transfer/xcm/xcmPallet.js +0 -23
- package/services/balance-service/transfer/xcm/polkadotXcm.d.ts +0 -3
- package/services/balance-service/transfer/xcm/polkadotXcm.js +0 -24
- package/services/balance-service/transfer/xcm/xTokens.d.ts +0 -3
- package/services/balance-service/transfer/xcm/xTokens.js +0 -26
- package/services/balance-service/transfer/xcm/xcmPallet.d.ts +0 -3
- package/services/balance-service/transfer/xcm/xcmPallet.js +0 -17
|
@@ -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();
|
|
@@ -4,6 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
|
|
|
4
4
|
Object.defineProperty(exports, "__esModule", {
|
|
5
5
|
value: true
|
|
6
6
|
});
|
|
7
|
+
exports.gasSettingsForEWC = void 0;
|
|
7
8
|
exports.getERC20TransactionObject = getERC20TransactionObject;
|
|
8
9
|
exports.getERC721Transaction = getERC721Transaction;
|
|
9
10
|
exports.getEVMTransactionObject = getEVMTransactionObject;
|
|
@@ -19,6 +20,12 @@ var _i18next = require("i18next");
|
|
|
19
20
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
20
21
|
// SPDX-License-Identifier: Apache-2.0
|
|
21
22
|
|
|
23
|
+
// hot fix gas settings for Energy Web Chain
|
|
24
|
+
const gasSettingsForEWC = {
|
|
25
|
+
gasLimit: 4900000,
|
|
26
|
+
maxFeePerGas: '10000000'
|
|
27
|
+
};
|
|
28
|
+
exports.gasSettingsForEWC = gasSettingsForEWC;
|
|
22
29
|
async function getEVMTransactionObject(props) {
|
|
23
30
|
const {
|
|
24
31
|
chain,
|
|
@@ -33,10 +40,18 @@ async function getEVMTransactionObject(props) {
|
|
|
33
40
|
transferAll,
|
|
34
41
|
value
|
|
35
42
|
} = props;
|
|
43
|
+
const isEnergyWebChain = chain === 'energy_web_chain'; // hot fix gas settings for Energy Web Chain
|
|
44
|
+
|
|
36
45
|
const feeCustom = _feeCustom;
|
|
37
46
|
const feeInfo = _feeInfo;
|
|
38
47
|
const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, feeCustom);
|
|
39
48
|
let errorOnEstimateFee = '';
|
|
49
|
+
if (isEnergyWebChain) {
|
|
50
|
+
feeCombine.maxFeePerGas = gasSettingsForEWC.maxFeePerGas;
|
|
51
|
+
if (!feeCombine.maxPriorityFeePerGas || new _bignumber.default(feeCombine.maxPriorityFeePerGas).gt(feeCombine.maxFeePerGas)) {
|
|
52
|
+
feeCombine.maxPriorityFeePerGas = gasSettingsForEWC.maxFeePerGas;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
40
55
|
const transactionObject = {
|
|
41
56
|
to,
|
|
42
57
|
value,
|
|
@@ -44,16 +59,21 @@ async function getEVMTransactionObject(props) {
|
|
|
44
59
|
data,
|
|
45
60
|
...feeCombine
|
|
46
61
|
};
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
62
|
+
let gasLimit;
|
|
63
|
+
if (isEnergyWebChain) {
|
|
64
|
+
gasLimit = gasSettingsForEWC.gasLimit;
|
|
65
|
+
} else {
|
|
66
|
+
const gasEstimate = await evmApi.api.eth.estimateGas(transactionObject).catch(e => {
|
|
67
|
+
console.log('Cannot estimate fee with native transfer on', chain, e);
|
|
68
|
+
if (fallbackFee) {
|
|
69
|
+
errorOnEstimateFee = e.message;
|
|
70
|
+
return 21000;
|
|
71
|
+
} else {
|
|
72
|
+
throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
gasLimit = Math.floor(gasEstimate * 1.1); // 10% buffer for fluctuations
|
|
76
|
+
}
|
|
57
77
|
|
|
58
78
|
transactionObject.gas = gasLimit;
|
|
59
79
|
let estimateFee;
|
|
@@ -84,6 +104,8 @@ async function getERC20TransactionObject(props) {
|
|
|
84
104
|
transferAll,
|
|
85
105
|
value
|
|
86
106
|
} = props;
|
|
107
|
+
const isEnergyWebChain = chain === 'energy_web_chain'; // hot fix gas settings for Energy Web Chain
|
|
108
|
+
|
|
87
109
|
const erc20Contract = (0, _web.getERC20Contract)(assetAddress, evmApi);
|
|
88
110
|
const feeCustom = _feeCustom;
|
|
89
111
|
let freeAmount = new _bignumber.default(0);
|
|
@@ -99,21 +121,30 @@ async function getERC20TransactionObject(props) {
|
|
|
99
121
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
100
122
|
return erc20Contract.methods.transfer(to, transferValue).encodeABI();
|
|
101
123
|
}
|
|
102
|
-
const transferData = generateTransferData(to, transferValue);
|
|
103
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
104
|
-
const gasLimit = await erc20Contract.methods.transfer(to, transferValue).estimateGas({
|
|
105
|
-
from
|
|
106
|
-
}).catch(e => {
|
|
107
|
-
console.log('Cannot estimate fee with token contract', assetAddress, chain, e);
|
|
108
|
-
if (fallbackFee) {
|
|
109
|
-
errorOnEstimateFee = e.message;
|
|
110
|
-
return 70000;
|
|
111
|
-
} else {
|
|
112
|
-
throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
|
|
113
|
-
}
|
|
114
|
-
});
|
|
115
124
|
const feeInfo = _feeInfo;
|
|
116
125
|
const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, feeCustom);
|
|
126
|
+
const transferData = generateTransferData(to, transferValue);
|
|
127
|
+
let gasLimit;
|
|
128
|
+
if (isEnergyWebChain) {
|
|
129
|
+
gasLimit = gasSettingsForEWC.gasLimit;
|
|
130
|
+
feeCombine.maxFeePerGas = gasSettingsForEWC.maxFeePerGas;
|
|
131
|
+
if (!feeCombine.maxPriorityFeePerGas || new _bignumber.default(feeCombine.maxPriorityFeePerGas).gt(feeCombine.maxFeePerGas)) {
|
|
132
|
+
feeCombine.maxPriorityFeePerGas = gasSettingsForEWC.maxFeePerGas;
|
|
133
|
+
}
|
|
134
|
+
} else {
|
|
135
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
|
|
136
|
+
gasLimit = await erc20Contract.methods.transfer(to, transferValue).estimateGas({
|
|
137
|
+
from
|
|
138
|
+
}).catch(e => {
|
|
139
|
+
console.log('Cannot estimate fee with token contract', assetAddress, chain, e);
|
|
140
|
+
if (fallbackFee) {
|
|
141
|
+
errorOnEstimateFee = e.message;
|
|
142
|
+
return 70000;
|
|
143
|
+
} else {
|
|
144
|
+
throw Error('Unable to estimate fee for this transaction. Edit fee and try again.');
|
|
145
|
+
}
|
|
146
|
+
});
|
|
147
|
+
}
|
|
117
148
|
const transactionObject = {
|
|
118
149
|
gas: gasLimit,
|
|
119
150
|
from,
|
|
@@ -142,7 +173,9 @@ async function getERC721Transaction(web3Api, chain, contractAddress, senderAddre
|
|
|
142
173
|
const error = e;
|
|
143
174
|
if (error.message.includes('transfer to non ERC721Receiver implementer')) {
|
|
144
175
|
error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.nftNotSupportedOnRecipient');
|
|
176
|
+
throw error;
|
|
145
177
|
}
|
|
178
|
+
error.message = (0, _i18next.t)('bg.BALANCE.services.service.balance.transfer.smartContract.temporarilyNontransferableNFT');
|
|
146
179
|
throw error;
|
|
147
180
|
}
|
|
148
181
|
const feeInfo = _feeInfo;
|