@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.
Files changed (57) hide show
  1. package/background/KoniTypes.d.ts +3 -1
  2. package/background/KoniTypes.js +1 -0
  3. package/background/errors/TransactionError.js +5 -1
  4. package/cjs/background/KoniTypes.js +1 -0
  5. package/cjs/background/errors/TransactionError.js +4 -0
  6. package/cjs/constants/index.js +6 -3
  7. package/cjs/koni/api/dotsama/balance.js +5 -2
  8. package/cjs/koni/api/dotsama/crowdloan.js +1 -1
  9. package/cjs/koni/api/dotsama/transfer.js +19 -5
  10. package/cjs/koni/api/tokens/wasm/index.js +7 -0
  11. package/cjs/koni/api/xcm/polkadotXcm.js +18 -37
  12. package/cjs/koni/api/xcm/utils.js +78 -11
  13. package/cjs/koni/api/xcm/xTokens.js +4 -33
  14. package/cjs/koni/api/xcm/xcmPallet.js +4 -36
  15. package/cjs/koni/background/handlers/Extension.js +83 -25
  16. package/cjs/koni/background/handlers/State.js +1 -1
  17. package/cjs/packageInfo.js +1 -1
  18. package/cjs/services/chain-service/constants.js +9 -7
  19. package/cjs/services/chain-service/index.js +19 -15
  20. package/cjs/services/chain-service/utils.js +1 -5
  21. package/cjs/services/history-service/constants/index.js +13 -0
  22. package/cjs/services/history-service/subsquid-multi-chain-history.js +38 -3
  23. package/cjs/services/transaction-service/helpers/index.js +45 -2
  24. package/cjs/services/transaction-service/index.js +58 -24
  25. package/cjs/utils/eth/parseTransaction/index.js +69 -59
  26. package/cjs/utils/number.js +112 -0
  27. package/constants/index.d.ts +1 -0
  28. package/constants/index.js +1 -0
  29. package/koni/api/dotsama/balance.js +4 -2
  30. package/koni/api/dotsama/crowdloan.js +2 -2
  31. package/koni/api/dotsama/transfer.js +19 -5
  32. package/koni/api/tokens/wasm/index.js +7 -0
  33. package/koni/api/xcm/polkadotXcm.js +20 -39
  34. package/koni/api/xcm/utils.d.ts +36 -3
  35. package/koni/api/xcm/utils.js +72 -11
  36. package/koni/api/xcm/xTokens.js +6 -35
  37. package/koni/api/xcm/xcmPallet.js +5 -35
  38. package/koni/background/handlers/Extension.js +82 -24
  39. package/koni/background/handlers/State.js +2 -2
  40. package/package.json +18 -8
  41. package/packageInfo.js +1 -1
  42. package/services/chain-service/constants.d.ts +2 -0
  43. package/services/chain-service/constants.js +9 -7
  44. package/services/chain-service/index.js +13 -8
  45. package/services/chain-service/utils.d.ts +0 -1
  46. package/services/chain-service/utils.js +1 -4
  47. package/services/history-service/constants/index.d.ts +2 -0
  48. package/services/history-service/constants/index.js +5 -0
  49. package/services/history-service/subsquid-multi-chain-history.d.ts +1 -1
  50. package/services/history-service/subsquid-multi-chain-history.js +36 -3
  51. package/services/transaction-service/helpers/index.d.ts +2 -0
  52. package/services/transaction-service/helpers/index.js +42 -0
  53. package/services/transaction-service/index.js +54 -20
  54. package/services/transaction-service/types.d.ts +2 -2
  55. package/utils/eth/parseTransaction/index.js +69 -59
  56. package/utils/number.d.ts +9 -0
  57. 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 _types = require("@polkadot/types");
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
- if ((0, _utilCrypto.isEthereumAddress)(from) && (0, _utilCrypto.isEthereumAddress)(to) && (0, _utils._isTokenTransferredByEvm)(tokenInfo)) {
1451
- // TODO: review this
1452
- chainType = _KoniTypes.ChainType.EVM;
1453
- const txVal = transferAll ? freeBalance.value : value || '0';
1454
-
1455
- // Estimate with EVM API
1456
- if ((0, _utils._isTokenEvmSmartContract)(tokenInfo) || (0, _utils._isLocalToken)(tokenInfo)) {
1457
- [transaction, transferAmount.value] = await (0, _transfer3.getERC20TransactionObject)((0, _utils._getContractAddressOfToken)(tokenInfo), chainInfo, from, to, txVal, !!transferAll, evmApiMap);
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
- [transaction, transferAmount.value] = await (0, _transfer3.getEVMTransactionObject)(chainInfo, to, txVal, !!transferAll, evmApiMap);
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
- } else {
1462
- const substrateApi = this.#koniState.getSubstrateApi(networkKey);
1463
- [transaction, transferAmount.value] = await (0, _transfer.createTransferExtrinsic)({
1464
- transferAll: !!transferAll,
1465
- value: value || '0',
1466
- from: from,
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: true,
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 _types.TypeRegistry();
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._isSubstrateParachain)(chainInfo)) {
55
+ if ((0, _utils._isSubstrateParaChain)(chainInfo)) {
56
56
  crowdloanMap[networkKey] = {
57
57
  state: _KoniTypes.APIItemState.PENDING,
58
58
  contribute: '0'
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.0.7-2'
16
+ version: '1.0.9-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -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.getXcmRefMap());
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
- const result = {};
58
- Object.entries(_chainList.AssetRefMap).forEach(_ref => {
59
- let [key, assetRef] = _ref;
60
- if (assetRef.path === _types._AssetRefPath.XCM) {
61
- result[key] = assetRef;
62
- }
63
- });
64
- return result;
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(_ref2 => {
374
- let [slug, chainInfo] = _ref2;
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(_ref3 => {
621
- let [slug, chainInfo] = _ref3;
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 _ref4 => {
1140
- let [chain, chainState] = _ref4;
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] : 25;
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;