@subwallet/extension-base 1.0.7-2 → 1.0.9-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 -1
- package/background/KoniTypes.js +1 -0
- package/background/errors/TransactionError.js +5 -1
- package/cjs/background/KoniTypes.js +1 -0
- package/cjs/background/errors/TransactionError.js +4 -0
- package/cjs/constants/index.js +6 -3
- package/cjs/koni/api/dotsama/balance.js +5 -2
- package/cjs/koni/api/dotsama/crowdloan.js +1 -1
- package/cjs/koni/api/dotsama/transfer.js +19 -5
- package/cjs/koni/api/tokens/wasm/index.js +7 -0
- package/cjs/koni/api/xcm/polkadotXcm.js +18 -37
- package/cjs/koni/api/xcm/utils.js +78 -11
- package/cjs/koni/api/xcm/xTokens.js +4 -33
- package/cjs/koni/api/xcm/xcmPallet.js +4 -36
- package/cjs/koni/background/handlers/Extension.js +83 -25
- package/cjs/koni/background/handlers/State.js +1 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/chain-service/constants.js +9 -7
- package/cjs/services/chain-service/index.js +19 -15
- package/cjs/services/chain-service/utils.js +1 -5
- package/cjs/services/history-service/constants/index.js +13 -0
- package/cjs/services/history-service/subsquid-multi-chain-history.js +38 -3
- package/cjs/services/transaction-service/helpers/index.js +45 -2
- package/cjs/services/transaction-service/index.js +58 -24
- package/cjs/utils/eth/parseTransaction/index.js +69 -59
- package/cjs/utils/number.js +112 -0
- package/constants/index.d.ts +1 -0
- package/constants/index.js +1 -0
- package/koni/api/dotsama/balance.js +4 -2
- package/koni/api/dotsama/crowdloan.js +2 -2
- package/koni/api/dotsama/transfer.js +19 -5
- package/koni/api/tokens/wasm/index.js +7 -0
- package/koni/api/xcm/polkadotXcm.js +20 -39
- package/koni/api/xcm/utils.d.ts +36 -3
- package/koni/api/xcm/utils.js +72 -11
- package/koni/api/xcm/xTokens.js +6 -35
- package/koni/api/xcm/xcmPallet.js +5 -35
- package/koni/background/handlers/Extension.js +82 -24
- package/koni/background/handlers/State.js +2 -2
- package/package.json +18 -8
- package/packageInfo.js +1 -1
- package/services/chain-service/constants.d.ts +2 -0
- package/services/chain-service/constants.js +9 -7
- package/services/chain-service/index.js +13 -8
- package/services/chain-service/utils.d.ts +0 -1
- package/services/chain-service/utils.js +1 -4
- package/services/history-service/constants/index.d.ts +2 -0
- package/services/history-service/constants/index.js +5 -0
- package/services/history-service/subsquid-multi-chain-history.d.ts +1 -1
- package/services/history-service/subsquid-multi-chain-history.js +36 -3
- package/services/transaction-service/helpers/index.d.ts +2 -0
- package/services/transaction-service/helpers/index.js +42 -0
- package/services/transaction-service/index.js +54 -20
- package/services/transaction-service/types.d.ts +2 -2
- package/utils/eth/parseTransaction/index.js +69 -59
- package/utils/number.d.ts +9 -0
- package/utils/number.js +100 -0
|
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
});
|
|
7
7
|
exports.default = void 0;
|
|
8
8
|
var _common = _interopRequireDefault(require("@ethereumjs/common"));
|
|
9
|
+
var _types = require("@subwallet/chain-list/types");
|
|
9
10
|
var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
|
|
10
11
|
var _Extension = require("@subwallet/extension-base/background/handlers/Extension");
|
|
11
12
|
var _helpers = require("@subwallet/extension-base/background/handlers/helpers");
|
|
@@ -30,11 +31,12 @@ var _utils2 = require("@subwallet/extension-base/utils");
|
|
|
30
31
|
var _address2 = require("@subwallet/extension-base/utils/address");
|
|
31
32
|
var _eth = require("@subwallet/extension-base/utils/eth");
|
|
32
33
|
var _parseTransaction2 = require("@subwallet/extension-base/utils/eth/parseTransaction");
|
|
34
|
+
var _number = require("@subwallet/extension-base/utils/number");
|
|
33
35
|
var _keyring = require("@subwallet/keyring");
|
|
34
36
|
var _uiKeyring = require("@subwallet/ui-keyring");
|
|
35
37
|
var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
36
38
|
var _ethereumjsTx = require("ethereumjs-tx");
|
|
37
|
-
var
|
|
39
|
+
var _types2 = require("@polkadot/types");
|
|
38
40
|
var _util = require("@polkadot/util");
|
|
39
41
|
var _utilCrypto = require("@polkadot/util-crypto");
|
|
40
42
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
@@ -1447,41 +1449,57 @@ class KoniExtension {
|
|
|
1447
1449
|
|
|
1448
1450
|
// Get native token amount
|
|
1449
1451
|
const freeBalance = await this.#koniState.balanceService.getTokenFreeBalance(from, networkKey, tokenSlug);
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1453
|
-
|
|
1454
|
-
|
|
1455
|
-
|
|
1456
|
-
|
|
1457
|
-
|
|
1452
|
+
try {
|
|
1453
|
+
if ((0, _utilCrypto.isEthereumAddress)(from) && (0, _utilCrypto.isEthereumAddress)(to) && (0, _utils._isTokenTransferredByEvm)(tokenInfo)) {
|
|
1454
|
+
// TODO: review this
|
|
1455
|
+
chainType = _KoniTypes.ChainType.EVM;
|
|
1456
|
+
const txVal = transferAll ? freeBalance.value : value || '0';
|
|
1457
|
+
|
|
1458
|
+
// Estimate with EVM API
|
|
1459
|
+
if ((0, _utils._isTokenEvmSmartContract)(tokenInfo) || (0, _utils._isLocalToken)(tokenInfo)) {
|
|
1460
|
+
[transaction, transferAmount.value] = await (0, _transfer3.getERC20TransactionObject)((0, _utils._getContractAddressOfToken)(tokenInfo), chainInfo, from, to, txVal, !!transferAll, evmApiMap);
|
|
1461
|
+
} else {
|
|
1462
|
+
[transaction, transferAmount.value] = await (0, _transfer3.getEVMTransactionObject)(chainInfo, to, txVal, !!transferAll, evmApiMap);
|
|
1463
|
+
}
|
|
1458
1464
|
} else {
|
|
1459
|
-
|
|
1465
|
+
const substrateApi = this.#koniState.getSubstrateApi(networkKey);
|
|
1466
|
+
[transaction, transferAmount.value] = await (0, _transfer.createTransferExtrinsic)({
|
|
1467
|
+
transferAll: !!transferAll,
|
|
1468
|
+
value: value || '0',
|
|
1469
|
+
from: from,
|
|
1470
|
+
networkKey,
|
|
1471
|
+
tokenInfo,
|
|
1472
|
+
to: to,
|
|
1473
|
+
substrateApi
|
|
1474
|
+
});
|
|
1460
1475
|
}
|
|
1461
|
-
}
|
|
1462
|
-
const
|
|
1463
|
-
|
|
1464
|
-
|
|
1465
|
-
|
|
1466
|
-
|
|
1467
|
-
networkKey,
|
|
1468
|
-
tokenInfo,
|
|
1469
|
-
to: to,
|
|
1470
|
-
substrateApi
|
|
1471
|
-
});
|
|
1476
|
+
} catch (e) {
|
|
1477
|
+
const error = e;
|
|
1478
|
+
if (error.message.includes('transfer amount exceeds balance')) {
|
|
1479
|
+
error.message = 'Not enough balance';
|
|
1480
|
+
}
|
|
1481
|
+
throw error;
|
|
1472
1482
|
}
|
|
1473
1483
|
const transferNativeAmount = isTransferNativeToken ? transferAmount.value : '0';
|
|
1474
1484
|
this.addContact(to);
|
|
1475
1485
|
const additionalValidator = async inputTransaction => {
|
|
1486
|
+
const minAmount = tokenInfo.minAmount || '0';
|
|
1476
1487
|
if (!isTransferNativeToken) {
|
|
1477
1488
|
const {
|
|
1478
1489
|
value: balance
|
|
1479
1490
|
} = await this.#koniState.balanceService.getTokenFreeBalance(from, networkKey, tokenSlug);
|
|
1480
|
-
const minAmount = tokenInfo.minAmount || '0';
|
|
1481
1491
|
if (new _bignumber.default(balance).minus(transferAmount.value).lt(minAmount)) {
|
|
1482
1492
|
inputTransaction.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
|
|
1483
1493
|
}
|
|
1484
1494
|
}
|
|
1495
|
+
const {
|
|
1496
|
+
value: receiverBalance
|
|
1497
|
+
} = await this.#koniState.balanceService.getTokenFreeBalance(to, networkKey, tokenSlug);
|
|
1498
|
+
if (new _bignumber.default(receiverBalance).plus(transferAmount.value).lt(minAmount)) {
|
|
1499
|
+
const atLeast = new _bignumber.default(minAmount).minus(receiverBalance).plus((tokenInfo.decimals || 0) === 0 ? 0 : 1);
|
|
1500
|
+
const atLeastStr = (0, _number.formatNumber)(atLeast, tokenInfo.decimals || 0, _number.balanceFormatter);
|
|
1501
|
+
inputTransaction.errors.push(new _TransactionError.TransactionError(_KoniTypes.TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, `You must transfer at least ${atLeastStr} ${tokenInfo.symbol} to keep the destination account alive`));
|
|
1502
|
+
}
|
|
1485
1503
|
};
|
|
1486
1504
|
return this.#koniState.transactionService.handleTransaction({
|
|
1487
1505
|
errors,
|
|
@@ -1495,7 +1513,7 @@ class KoniExtension {
|
|
|
1495
1513
|
extrinsicType: isTransferNativeToken ? _KoniTypes.ExtrinsicType.TRANSFER_BALANCE : _KoniTypes.ExtrinsicType.TRANSFER_TOKEN,
|
|
1496
1514
|
ignoreWarnings: transferAll,
|
|
1497
1515
|
isTransferAll: isTransferNativeToken ? transferAll : false,
|
|
1498
|
-
edAsWarning:
|
|
1516
|
+
edAsWarning: isTransferNativeToken,
|
|
1499
1517
|
additionalValidator: additionalValidator
|
|
1500
1518
|
});
|
|
1501
1519
|
}
|
|
@@ -1524,6 +1542,8 @@ class KoniExtension {
|
|
|
1524
1542
|
if (errors.length > 0) {
|
|
1525
1543
|
return this.#koniState.transactionService.generateBeforeHandleResponseErrors(errors);
|
|
1526
1544
|
}
|
|
1545
|
+
let additionalValidator;
|
|
1546
|
+
let eventsHandler;
|
|
1527
1547
|
if (fromKeyPair && destinationTokenInfo) {
|
|
1528
1548
|
const substrateApi = this.#koniState.getSubstrateApi(originNetworkKey);
|
|
1529
1549
|
const chainInfoMap = this.#koniState.getChainInfoMap();
|
|
@@ -1535,6 +1555,40 @@ class KoniExtension {
|
|
|
1535
1555
|
chainInfoMap,
|
|
1536
1556
|
substrateApi
|
|
1537
1557
|
});
|
|
1558
|
+
additionalValidator = async inputTransaction => {
|
|
1559
|
+
const destMinAmount = destinationTokenInfo.minAmount || '0';
|
|
1560
|
+
const atLeast = new _bignumber.default(destMinAmount).multipliedBy(_constants.XCM_MIN_AMOUNT_RATIO);
|
|
1561
|
+
if (new _bignumber.default(value).lt(atLeast)) {
|
|
1562
|
+
const atLeastStr = (0, _number.formatNumber)(atLeast, destinationTokenInfo.decimals || 0, _number.balanceFormatter);
|
|
1563
|
+
inputTransaction.errors.push(new _TransactionError.TransactionError(_KoniTypes.TransferTxErrorType.RECEIVER_NOT_ENOUGH_EXISTENTIAL_DEPOSIT, `You must transfer at least ${atLeastStr} ${originTokenInfo.symbol} to keep the destination account alive`));
|
|
1564
|
+
}
|
|
1565
|
+
const srcMinAmount = originTokenInfo.minAmount || '0';
|
|
1566
|
+
const isTransferNativeToken = originTokenInfo.assetType === _types._AssetType.NATIVE;
|
|
1567
|
+
if (!isTransferNativeToken) {
|
|
1568
|
+
const {
|
|
1569
|
+
value: balance
|
|
1570
|
+
} = await this.#koniState.balanceService.getTokenFreeBalance(from, originNetworkKey, originTokenInfo.slug);
|
|
1571
|
+
if (new _bignumber.default(balance).minus(value).lt(srcMinAmount)) {
|
|
1572
|
+
inputTransaction.warnings.push(new _TransactionWarning.TransactionWarning(_KoniTypes.BasicTxWarningCode.NOT_ENOUGH_EXISTENTIAL_DEPOSIT, ''));
|
|
1573
|
+
}
|
|
1574
|
+
}
|
|
1575
|
+
};
|
|
1576
|
+
eventsHandler = eventEmitter => {
|
|
1577
|
+
eventEmitter.on('send', () => {
|
|
1578
|
+
try {
|
|
1579
|
+
const dest = _uiKeyring.keyring.getPair(to);
|
|
1580
|
+
if (dest) {
|
|
1581
|
+
this.updateAssetSetting({
|
|
1582
|
+
autoEnableNativeToken: false,
|
|
1583
|
+
tokenSlug: destinationTokenInfo.slug,
|
|
1584
|
+
assetSetting: {
|
|
1585
|
+
visible: true
|
|
1586
|
+
}
|
|
1587
|
+
}).catch(console.error);
|
|
1588
|
+
}
|
|
1589
|
+
} catch (e) {}
|
|
1590
|
+
});
|
|
1591
|
+
};
|
|
1538
1592
|
}
|
|
1539
1593
|
this.addContact(to);
|
|
1540
1594
|
return await this.#koniState.transactionService.handleTransaction({
|
|
@@ -1546,8 +1600,11 @@ class KoniExtension {
|
|
|
1546
1600
|
extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
|
|
1547
1601
|
chainType: _KoniTypes.ChainType.SUBSTRATE,
|
|
1548
1602
|
transferNativeAmount: (0, _utils._isNativeToken)(originTokenInfo) ? value : '0',
|
|
1603
|
+
ignoreWarnings: inputData.transferAll,
|
|
1549
1604
|
isTransferAll: inputData.transferAll,
|
|
1550
|
-
errors
|
|
1605
|
+
errors,
|
|
1606
|
+
additionalValidator: additionalValidator,
|
|
1607
|
+
eventsHandler: eventsHandler
|
|
1551
1608
|
});
|
|
1552
1609
|
}
|
|
1553
1610
|
async evmNftSubmitTransaction(inputData) {
|
|
@@ -2670,7 +2727,7 @@ class KoniExtension {
|
|
|
2670
2727
|
const {
|
|
2671
2728
|
payload
|
|
2672
2729
|
} = request;
|
|
2673
|
-
const registry = new
|
|
2730
|
+
const registry = new _types2.TypeRegistry();
|
|
2674
2731
|
let isEvm = false;
|
|
2675
2732
|
if ((0, _Extension.isJsonPayload)(payload)) {
|
|
2676
2733
|
// Get the metadata for the genesisHash
|
|
@@ -2943,6 +3000,7 @@ class KoniExtension {
|
|
|
2943
3000
|
let [key, value] = _ref72;
|
|
2944
3001
|
const {
|
|
2945
3002
|
additionalValidator,
|
|
3003
|
+
eventsHandler,
|
|
2946
3004
|
transaction,
|
|
2947
3005
|
...transactionResult
|
|
2948
3006
|
} = value;
|
|
@@ -52,7 +52,7 @@ const generateDefaultCrowdloanMap = () => {
|
|
|
52
52
|
const crowdloanMap = {};
|
|
53
53
|
Object.entries(_chainList.ChainInfoMap).forEach(_ref => {
|
|
54
54
|
let [networkKey, chainInfo] = _ref;
|
|
55
|
-
if ((0, _utils.
|
|
55
|
+
if ((0, _utils._isSubstrateParaChain)(chainInfo)) {
|
|
56
56
|
crowdloanMap[networkKey] = {
|
|
57
57
|
state: _KoniTypes.APIItemState.PENDING,
|
|
58
58
|
contribute: '0'
|
package/cjs/packageInfo.js
CHANGED
|
@@ -32,11 +32,11 @@ const _PURE_EVM_CHAINS = ['binance', 'binance_test', 'ethereum', 'ethereum_goerl
|
|
|
32
32
|
// Get balance----------------------------------------------------------------------------------------------------------
|
|
33
33
|
exports._PURE_EVM_CHAINS = _PURE_EVM_CHAINS;
|
|
34
34
|
const _BALANCE_CHAIN_GROUP = {
|
|
35
|
-
kintsugi: ['kintsugi', 'interlay', 'kintsugi_test'],
|
|
35
|
+
kintsugi: ['kintsugi', 'interlay', 'kintsugi_test', 'mangatax_para'],
|
|
36
36
|
genshiro: ['genshiro_testnet', 'genshiro'],
|
|
37
37
|
equilibrium_parachain: ['equilibrium_parachain'],
|
|
38
|
-
bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry'],
|
|
39
|
-
statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2'],
|
|
38
|
+
bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main'],
|
|
39
|
+
statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel'],
|
|
40
40
|
kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'] // perhaps there are some runtime updates
|
|
41
41
|
};
|
|
42
42
|
exports._BALANCE_CHAIN_GROUP = _BALANCE_CHAIN_GROUP;
|
|
@@ -192,11 +192,13 @@ const _TRANSFER_NOT_SUPPORTED_CHAINS = ['subspace_gemini_3a', 'kulupu', 'joystre
|
|
|
192
192
|
exports._TRANSFER_NOT_SUPPORTED_CHAINS = _TRANSFER_NOT_SUPPORTED_CHAINS;
|
|
193
193
|
const _TRANSFER_CHAIN_GROUP = {
|
|
194
194
|
acala: ['karura', 'acala', 'acala_testnet'],
|
|
195
|
-
kintsugi: ['kintsugi', 'kintsugi_test', 'interlay'],
|
|
195
|
+
kintsugi: ['kintsugi', 'kintsugi_test', 'interlay', 'bifrost_dot', 'hydradx_main', 'mangatax_para'],
|
|
196
196
|
genshiro: ['genshiro_testnet', 'genshiro', 'equilibrium_parachain'],
|
|
197
197
|
crab: ['crab', 'pangolin'],
|
|
198
|
-
bitcountry: ['pioneer', 'bitcountry'],
|
|
199
|
-
statemine: ['statemint', 'statemine', 'darwinia2']
|
|
198
|
+
bitcountry: ['pioneer', 'bitcountry', 'bifrost'],
|
|
199
|
+
statemine: ['statemint', 'statemine', 'darwinia2', 'astar', 'shiden', 'shibuya', 'parallel'],
|
|
200
|
+
riochain: ['riochain'],
|
|
201
|
+
sora_substrate: ['sora_substrate']
|
|
200
202
|
};
|
|
201
203
|
exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
|
|
202
204
|
const _BALANCE_PARSING_CHAIN_GROUP = {
|
|
@@ -206,7 +208,7 @@ const _BALANCE_PARSING_CHAIN_GROUP = {
|
|
|
206
208
|
// XCM------------------------------------------------------------------------------------------------------------------
|
|
207
209
|
exports._BALANCE_PARSING_CHAIN_GROUP = _BALANCE_PARSING_CHAIN_GROUP;
|
|
208
210
|
const _XCM_CHAIN_GROUP = {
|
|
209
|
-
polkadotXcm: ['astar', 'shiden', 'statemine', 'statemint'],
|
|
211
|
+
polkadotXcm: ['astar', 'shiden', 'statemine', 'statemint', 'equilibrium_parachain'],
|
|
210
212
|
xcmPallet: ['polkadot', 'kusama']
|
|
211
213
|
// default is xTokens pallet
|
|
212
214
|
};
|
|
@@ -47,22 +47,25 @@ class ChainService {
|
|
|
47
47
|
this.chainInfoMapSubject.next(this.dataMap.chainInfoMap);
|
|
48
48
|
this.chainStateMapSubject.next(this.dataMap.chainStateMap);
|
|
49
49
|
this.assetRegistrySubject.next(this.dataMap.assetRegistry);
|
|
50
|
-
this.xcmRefMapSubject.next(this.
|
|
50
|
+
this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
|
|
51
51
|
this.logger = (0, _logger.logger)('chain-service');
|
|
52
52
|
this.refreshChainStateInterval(3000, 6);
|
|
53
53
|
}
|
|
54
54
|
|
|
55
55
|
// Getter
|
|
56
56
|
getXcmRefMap() {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
57
|
+
return this.dataMap.assetRefMap;
|
|
58
|
+
// const result: Record<string, _AssetRef> = {};
|
|
59
|
+
//
|
|
60
|
+
// Object.entries(AssetRefMap).forEach(([key, assetRef]) => {
|
|
61
|
+
// if (assetRef.path === _AssetRefPath.XCM) {
|
|
62
|
+
// result[key] = assetRef;
|
|
63
|
+
// }
|
|
64
|
+
// });
|
|
65
|
+
//
|
|
66
|
+
// return result;
|
|
65
67
|
}
|
|
68
|
+
|
|
66
69
|
getEvmApi(slug) {
|
|
67
70
|
return this.evmChainHandler.getEvmApiByChain(slug);
|
|
68
71
|
}
|
|
@@ -365,13 +368,14 @@ class ChainService {
|
|
|
365
368
|
this.chainInfoMapSubject.next(this.getChainInfoMap());
|
|
366
369
|
this.chainStateMapSubject.next(this.getChainStateMap());
|
|
367
370
|
this.assetRegistrySubject.next(this.getAssetRegistry());
|
|
371
|
+
this.xcmRefMapSubject.next(this.dataMap.assetRefMap);
|
|
368
372
|
this.initApis();
|
|
369
373
|
await this.initAssetSettings();
|
|
370
374
|
}
|
|
371
375
|
initApis() {
|
|
372
376
|
// TODO: this might be async
|
|
373
|
-
Object.entries(this.getChainInfoMap()).forEach(
|
|
374
|
-
let [slug, chainInfo] =
|
|
377
|
+
Object.entries(this.getChainInfoMap()).forEach(_ref => {
|
|
378
|
+
let [slug, chainInfo] = _ref;
|
|
375
379
|
if (this.getChainStateByKey(slug).active) {
|
|
376
380
|
this.initApiForChain(chainInfo);
|
|
377
381
|
}
|
|
@@ -617,8 +621,8 @@ class ChainService {
|
|
|
617
621
|
}
|
|
618
622
|
|
|
619
623
|
// Fill in the missing chainState and storageData (new chains never before seen)
|
|
620
|
-
Object.entries(mergedChainInfoMap).forEach(
|
|
621
|
-
let [slug, chainInfo] =
|
|
624
|
+
Object.entries(mergedChainInfoMap).forEach(_ref2 => {
|
|
625
|
+
let [slug, chainInfo] = _ref2;
|
|
622
626
|
if (!(slug in this.dataMap.chainStateMap)) {
|
|
623
627
|
this.dataMap.chainStateMap[slug] = {
|
|
624
628
|
currentProvider: Object.keys(chainInfo.providers)[0],
|
|
@@ -1136,8 +1140,8 @@ class ChainService {
|
|
|
1136
1140
|
update = true;
|
|
1137
1141
|
}
|
|
1138
1142
|
}
|
|
1139
|
-
const promiseList = Object.entries(chainStateMap).map(async
|
|
1140
|
-
let [chain, chainState] =
|
|
1143
|
+
const promiseList = Object.entries(chainStateMap).map(async _ref3 => {
|
|
1144
|
+
let [chain, chainState] = _ref3;
|
|
1141
1145
|
try {
|
|
1142
1146
|
if (chainState.active) {
|
|
1143
1147
|
if (substrateApiMap[chain]) {
|
|
@@ -58,7 +58,6 @@ exports._isPureSubstrateChain = _isPureSubstrateChain;
|
|
|
58
58
|
exports._isSmartContractToken = _isSmartContractToken;
|
|
59
59
|
exports._isSubstrateChain = _isSubstrateChain;
|
|
60
60
|
exports._isSubstrateParaChain = _isSubstrateParaChain;
|
|
61
|
-
exports._isSubstrateParachain = _isSubstrateParachain;
|
|
62
61
|
exports._isSubstrateRelayChain = _isSubstrateRelayChain;
|
|
63
62
|
exports._isTokenEvmSmartContract = _isTokenEvmSmartContract;
|
|
64
63
|
exports._isTokenTransferredByEvm = _isTokenTransferredByEvm;
|
|
@@ -198,9 +197,6 @@ function _isChainSupportSubstrateStaking(chainInfo) {
|
|
|
198
197
|
function _isChainEnabled(chainState) {
|
|
199
198
|
return chainState.active;
|
|
200
199
|
}
|
|
201
|
-
function _isSubstrateParachain(chainInfo) {
|
|
202
|
-
return chainInfo.substrateInfo !== null && chainInfo.substrateInfo.paraId !== null;
|
|
203
|
-
}
|
|
204
200
|
function _getChainSubstrateAddressPrefix(chainInfo) {
|
|
205
201
|
var _chainInfo$substrateI5, _chainInfo$substrateI6;
|
|
206
202
|
return (_chainInfo$substrateI5 = chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI6 = chainInfo.substrateInfo) === null || _chainInfo$substrateI6 === void 0 ? void 0 : _chainInfo$substrateI6.addressPrefix) !== null && _chainInfo$substrateI5 !== void 0 ? _chainInfo$substrateI5 : -1;
|
|
@@ -327,7 +323,7 @@ function _isSubstrateRelayChain(chainInfo) {
|
|
|
327
323
|
}
|
|
328
324
|
function _isSubstrateParaChain(chainInfo) {
|
|
329
325
|
var _chainInfo$substrateI11;
|
|
330
|
-
return ((_chainInfo$substrateI11 = chainInfo.substrateInfo) === null || _chainInfo$substrateI11 === void 0 ? void 0 : _chainInfo$substrateI11.chainType) === _types._SubstrateChainType.PARACHAIN;
|
|
326
|
+
return chainInfo.substrateInfo !== null && chainInfo.substrateInfo.paraId !== null && ((_chainInfo$substrateI11 = chainInfo.substrateInfo) === null || _chainInfo$substrateI11 === void 0 ? void 0 : _chainInfo$substrateI11.chainType) === _types._SubstrateChainType.PARACHAIN;
|
|
331
327
|
}
|
|
332
328
|
function _getEvmAbiExplorer(chainInfo) {
|
|
333
329
|
var _chainInfo$evmInfo3;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.MIN__NUM_HISTORY_PER_ACCOUNT = exports.MAX_FETCH_PAGE_PER_SESSION = void 0;
|
|
7
|
+
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
8
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
9
|
+
|
|
10
|
+
const MAX_FETCH_PAGE_PER_SESSION = 25;
|
|
11
|
+
exports.MAX_FETCH_PAGE_PER_SESSION = MAX_FETCH_PAGE_PER_SESSION;
|
|
12
|
+
const MIN__NUM_HISTORY_PER_ACCOUNT = 50;
|
|
13
|
+
exports.MIN__NUM_HISTORY_PER_ACCOUNT = MIN__NUM_HISTORY_PER_ACCOUNT;
|
|
@@ -9,7 +9,9 @@ exports.fetchMultiChainHistories = fetchMultiChainHistories;
|
|
|
9
9
|
exports.parseSubsquidTransactionData = parseSubsquidTransactionData;
|
|
10
10
|
var _client = require("@apollo/client");
|
|
11
11
|
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
12
|
+
var _constants = require("@subwallet/extension-base/services/history-service/constants");
|
|
12
13
|
var _crossFetch = _interopRequireDefault(require("cross-fetch"));
|
|
14
|
+
var _util = require("@polkadot/util");
|
|
13
15
|
var _utilCrypto = require("@polkadot/util-crypto");
|
|
14
16
|
// Copyright 2019-2022 @subwallet/extension-koni authors & contributors
|
|
15
17
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -81,6 +83,17 @@ function generateSignature(input) {
|
|
|
81
83
|
const vHex = parseInt(v).toString(16);
|
|
82
84
|
return `0x${rHex}${sHex}${vHex}`;
|
|
83
85
|
}
|
|
86
|
+
const parseArgs = args => {
|
|
87
|
+
if ((0, _util.isArray)(args)) {
|
|
88
|
+
return {
|
|
89
|
+
from: args[0],
|
|
90
|
+
to: args[1],
|
|
91
|
+
amount: args[2]
|
|
92
|
+
};
|
|
93
|
+
} else {
|
|
94
|
+
return args;
|
|
95
|
+
}
|
|
96
|
+
};
|
|
84
97
|
function parseSubsquidTransactionData(address, type, historyItem, chainInfo, args, data) {
|
|
85
98
|
var _chainInfo$substrateI, _chainInfo$evmInfo, _chainInfo$substrateI2, _chainInfo$evmInfo2;
|
|
86
99
|
const chainType = chainInfo.substrateInfo ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM;
|
|
@@ -101,7 +114,7 @@ function parseSubsquidTransactionData(address, type, historyItem, chainInfo, arg
|
|
|
101
114
|
{
|
|
102
115
|
transactionType = _KoniTypes.ExtrinsicType.TRANSFER_BALANCE;
|
|
103
116
|
const extrinsic = data.extrinsic;
|
|
104
|
-
const parsedArgs = args;
|
|
117
|
+
const parsedArgs = parseArgs(args);
|
|
105
118
|
to = autoFormatAddress(parsedArgs.to);
|
|
106
119
|
from = autoFormatAddress(parsedArgs.from);
|
|
107
120
|
amount = parsedArgs.amount;
|
|
@@ -207,10 +220,12 @@ function parseSubsquidTransactionData(address, type, historyItem, chainInfo, arg
|
|
|
207
220
|
};
|
|
208
221
|
}
|
|
209
222
|
async function fetchMultiChainHistories(addresses, chainMap) {
|
|
210
|
-
let maxPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] :
|
|
223
|
+
let maxPage = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants.MAX_FETCH_PAGE_PER_SESSION;
|
|
224
|
+
let countMap = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
225
|
+
let _lastId = arguments.length > 4 ? arguments[4] : undefined;
|
|
211
226
|
const responseData = [];
|
|
212
227
|
let currentPage = 0;
|
|
213
|
-
let lastId;
|
|
228
|
+
let lastId = _lastId;
|
|
214
229
|
while (true) {
|
|
215
230
|
try {
|
|
216
231
|
if (maxPage) {
|
|
@@ -239,6 +254,9 @@ async function fetchMultiChainHistories(addresses, chainMap) {
|
|
|
239
254
|
}
|
|
240
255
|
const histories = [];
|
|
241
256
|
const lowerAddresses = addresses.map(a => a.toLowerCase());
|
|
257
|
+
for (const lowerAddress of lowerAddresses) {
|
|
258
|
+
countMap[lowerAddress] = countMap[lowerAddress] || 0;
|
|
259
|
+
}
|
|
242
260
|
responseData.forEach(historyItem => {
|
|
243
261
|
const {
|
|
244
262
|
_data,
|
|
@@ -259,6 +277,10 @@ async function fetchMultiChainHistories(addresses, chainMap) {
|
|
|
259
277
|
|
|
260
278
|
return;
|
|
261
279
|
}
|
|
280
|
+
usedAddresses.forEach(address => {
|
|
281
|
+
const adr = address.toLowerCase();
|
|
282
|
+
countMap[adr] = (countMap[adr] || 0) + 1;
|
|
283
|
+
});
|
|
262
284
|
usedAddresses.forEach(address => {
|
|
263
285
|
try {
|
|
264
286
|
const transactionData = parseSubsquidTransactionData(address, name, historyItem, chainInfo, parseData(args), parseData(_data));
|
|
@@ -268,5 +290,18 @@ async function fetchMultiChainHistories(addresses, chainMap) {
|
|
|
268
290
|
}
|
|
269
291
|
});
|
|
270
292
|
});
|
|
293
|
+
if (currentPage > 1) {
|
|
294
|
+
const retryAddresses = [];
|
|
295
|
+
for (const [address, number] of Object.entries(countMap)) {
|
|
296
|
+
if (number < _constants.MIN__NUM_HISTORY_PER_ACCOUNT) {
|
|
297
|
+
retryAddresses.push(address);
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
const _addresses = addresses.filter(add => retryAddresses.includes(add.toLowerCase()));
|
|
301
|
+
if (_addresses.length > 0) {
|
|
302
|
+
const retryHistories = await fetchMultiChainHistories(_addresses, chainMap, maxPage, countMap, lastId);
|
|
303
|
+
histories.push(...retryHistories);
|
|
304
|
+
}
|
|
305
|
+
}
|
|
271
306
|
return histories;
|
|
272
307
|
}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isSubstrateTransaction = exports.getValidationId = exports.getTransactionId = void 0;
|
|
6
|
+
exports.isSubstrateTransaction = exports.getValidationId = exports.getTransactionId = exports.getBaseTransactionInfo = void 0;
|
|
7
|
+
var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
|
|
7
8
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
8
9
|
// SPDX-License-Identifier: Apache-2.0
|
|
9
10
|
|
|
@@ -20,4 +21,46 @@ exports.getValidationId = getValidationId;
|
|
|
20
21
|
const isSubstrateTransaction = tx => {
|
|
21
22
|
return !!tx.send;
|
|
22
23
|
};
|
|
23
|
-
exports.isSubstrateTransaction = isSubstrateTransaction;
|
|
24
|
+
exports.isSubstrateTransaction = isSubstrateTransaction;
|
|
25
|
+
const typeName = type => {
|
|
26
|
+
switch (type) {
|
|
27
|
+
case _KoniTypes.ExtrinsicType.TRANSFER_BALANCE:
|
|
28
|
+
case _KoniTypes.ExtrinsicType.TRANSFER_TOKEN:
|
|
29
|
+
case _KoniTypes.ExtrinsicType.TRANSFER_XCM:
|
|
30
|
+
return 'Transfer';
|
|
31
|
+
case _KoniTypes.ExtrinsicType.SEND_NFT:
|
|
32
|
+
return 'Send NFT';
|
|
33
|
+
case _KoniTypes.ExtrinsicType.CROWDLOAN:
|
|
34
|
+
return 'Crowdloan contribution';
|
|
35
|
+
case _KoniTypes.ExtrinsicType.STAKING_JOIN_POOL:
|
|
36
|
+
return 'Join pool';
|
|
37
|
+
case _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL:
|
|
38
|
+
return 'Leave pool';
|
|
39
|
+
case _KoniTypes.ExtrinsicType.STAKING_BOND:
|
|
40
|
+
return 'Bond';
|
|
41
|
+
case _KoniTypes.ExtrinsicType.STAKING_UNBOND:
|
|
42
|
+
return 'Unbond';
|
|
43
|
+
case _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD:
|
|
44
|
+
return 'Claim reward';
|
|
45
|
+
case _KoniTypes.ExtrinsicType.STAKING_WITHDRAW:
|
|
46
|
+
return 'Withdraw';
|
|
47
|
+
case _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE:
|
|
48
|
+
return 'Cancel unstake';
|
|
49
|
+
case _KoniTypes.ExtrinsicType.STAKING_COMPOUNDING:
|
|
50
|
+
return 'Stake compound';
|
|
51
|
+
case _KoniTypes.ExtrinsicType.EVM_EXECUTE:
|
|
52
|
+
return 'EVM execute';
|
|
53
|
+
case _KoniTypes.ExtrinsicType.STAKING_CANCEL_COMPOUNDING:
|
|
54
|
+
return 'Cancel compounding';
|
|
55
|
+
case _KoniTypes.ExtrinsicType.STAKING_POOL_WITHDRAW:
|
|
56
|
+
return 'Withdraw pool';
|
|
57
|
+
case _KoniTypes.ExtrinsicType.UNKNOWN:
|
|
58
|
+
default:
|
|
59
|
+
return 'unknown';
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
const getBaseTransactionInfo = (transaction, chainInfoMap) => {
|
|
63
|
+
var _chainInfoMap$transac;
|
|
64
|
+
return `${typeName(transaction.extrinsicType)} on ${((_chainInfoMap$transac = chainInfoMap[transaction.chain]) === null || _chainInfoMap$transac === void 0 ? void 0 : _chainInfoMap$transac.name) || 'unknown network'}`;
|
|
65
|
+
};
|
|
66
|
+
exports.getBaseTransactionInfo = getBaseTransactionInfo;
|