@subwallet/extension-base 1.3.77-0 → 1.3.78-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 (74) hide show
  1. package/background/KoniTypes.d.ts +2 -0
  2. package/cjs/core/logic-validation/index.js +1 -1
  3. package/cjs/core/substrate/xcm-parser.js +10 -1
  4. package/cjs/koni/background/handlers/Extension.js +35 -8
  5. package/cjs/koni/background/handlers/State.js +20 -0
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/balance-service/helpers/subscribe/evm.js +85 -6
  8. package/cjs/services/balance-service/helpers/subscribe/index.js +2 -1
  9. package/cjs/services/balance-service/index.js +6 -2
  10. package/cjs/services/balance-service/transfer/token.js +15 -0
  11. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/index.js +27 -0
  12. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +58 -0
  13. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/utils.js +36 -0
  14. package/cjs/services/balance-service/transfer/xcm/index.js +61 -2
  15. package/cjs/services/balance-service/transfer/xcm/utils.js +94 -6
  16. package/cjs/services/chain-service/constants.js +4 -2
  17. package/cjs/services/chain-service/utils/patch.js +1 -1
  18. package/cjs/services/earning-service/constants/chains.js +4 -2
  19. package/cjs/services/earning-service/handlers/special.js +82 -65
  20. package/cjs/services/earning-service/service.js +1 -0
  21. package/cjs/services/swap-service/handler/bittensor-handler.js +197 -0
  22. package/cjs/services/swap-service/index.js +7 -0
  23. package/cjs/services/transaction-service/index.js +1 -0
  24. package/cjs/types/balance/index.js +1 -0
  25. package/cjs/types/swap/index.js +3 -1
  26. package/cjs/utils/fee/transfer.js +20 -5
  27. package/core/logic-validation/index.js +1 -1
  28. package/core/substrate/xcm-parser.d.ts +2 -0
  29. package/core/substrate/xcm-parser.js +8 -1
  30. package/koni/background/handlers/Extension.js +36 -9
  31. package/koni/background/handlers/State.d.ts +1 -0
  32. package/koni/background/handlers/State.js +20 -0
  33. package/package.json +26 -6
  34. package/packageInfo.js +1 -1
  35. package/services/balance-service/helpers/subscribe/evm.d.ts +1 -0
  36. package/services/balance-service/helpers/subscribe/evm.js +76 -1
  37. package/services/balance-service/helpers/subscribe/index.js +2 -1
  38. package/services/balance-service/index.js +6 -2
  39. package/services/balance-service/transfer/token.d.ts +2 -1
  40. package/services/balance-service/transfer/token.js +15 -0
  41. package/services/balance-service/transfer/xcm/bittensorBridge/index.d.ts +2 -0
  42. package/services/balance-service/transfer/xcm/bittensorBridge/index.js +5 -0
  43. package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.d.ts +6 -0
  44. package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +50 -0
  45. package/services/balance-service/transfer/xcm/bittensorBridge/utils.d.ts +8 -0
  46. package/services/balance-service/transfer/xcm/bittensorBridge/utils.js +29 -0
  47. package/services/balance-service/transfer/xcm/index.d.ts +5 -0
  48. package/services/balance-service/transfer/xcm/index.js +57 -2
  49. package/services/balance-service/transfer/xcm/utils.d.ts +3 -2
  50. package/services/balance-service/transfer/xcm/utils.js +87 -1
  51. package/services/chain-service/constants.d.ts +2 -0
  52. package/services/chain-service/constants.js +4 -2
  53. package/services/chain-service/utils/patch.d.ts +1 -1
  54. package/services/chain-service/utils/patch.js +1 -1
  55. package/services/earning-service/constants/chains.d.ts +1 -0
  56. package/services/earning-service/constants/chains.js +2 -1
  57. package/services/earning-service/handlers/special.d.ts +1 -1
  58. package/services/earning-service/handlers/special.js +85 -68
  59. package/services/earning-service/service.js +1 -0
  60. package/services/swap-service/handler/bittensor-handler.d.ts +21 -0
  61. package/services/swap-service/handler/bittensor-handler.js +189 -0
  62. package/services/swap-service/index.js +7 -0
  63. package/services/transaction-service/index.js +1 -0
  64. package/services/transaction-service/types.d.ts +4 -3
  65. package/types/balance/index.d.ts +3 -1
  66. package/types/balance/index.js +1 -0
  67. package/types/balance/transfer.d.ts +7 -0
  68. package/types/fee/base.d.ts +1 -0
  69. package/types/swap/index.d.ts +3 -1
  70. package/types/swap/index.js +3 -1
  71. package/types/yield/actions/join/step.d.ts +6 -0
  72. package/types/yield/actions/join/submit.d.ts +1 -0
  73. package/utils/fee/transfer.d.ts +1 -0
  74. package/utils/fee/transfer.js +21 -6
@@ -570,6 +570,7 @@ export interface XCMTransactionAdditionalInfo {
570
570
  destinationChain: string;
571
571
  originalChain: string;
572
572
  fee?: AmountData;
573
+ sendingTokenInfo?: _ChainAsset;
573
574
  }
574
575
  export interface NFTTransactionAdditionalInfo {
575
576
  collectionName: string;
@@ -629,6 +630,7 @@ export interface TransactionHistoryItem<ET extends ExtrinsicType = ExtrinsicType
629
630
  addressPrefix?: number;
630
631
  processId?: string;
631
632
  apiTxIndex?: number;
633
+ crossChainFeeInfo?: AmountData;
632
634
  substrateProxyAddresses?: string[];
633
635
  }
634
636
  export interface SWWarning {
@@ -73,7 +73,7 @@ function validateSpendingAndFeePayment(spendingToken, feeToken, bnSpendingAmount
73
73
  }))];
74
74
  }
75
75
  } else {
76
- if (bnFromTokenBalance.lte(bnSpendingAmount.plus((0, _utils._isNativeToken)(spendingToken) ? '0' : (0, _utils._getTokenMinAmount)(spendingToken)))) {
76
+ if (bnFromTokenBalance.lt(bnSpendingAmount.plus((0, _utils._isNativeToken)(spendingToken) ? '0' : (0, _utils._getTokenMinAmount)(spendingToken)))) {
77
77
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.NOT_ENOUGH_BALANCE, (0, _i18next.t)('bg.core.validation.insufficientSpendingTokenBalance', {
78
78
  replace: {
79
79
  spendingTokenSymbol: spendingToken.symbol
@@ -8,15 +8,18 @@ exports._getXcmUnstableWarning = _getXcmUnstableWarning;
8
8
  exports._isAcrossBridgeXcm = _isAcrossBridgeXcm;
9
9
  exports._isAssetHubBridgeXcm = _isAssetHubBridgeXcm;
10
10
  exports._isAvailBridgeXcm = _isAvailBridgeXcm;
11
+ exports._isBittensorToSubtensorEvmBridge = _isBittensorToSubtensorEvmBridge;
11
12
  exports._isMythosFromHydrationToMythos = _isMythosFromHydrationToMythos;
12
13
  exports._isPolygonBridgeXcm = _isPolygonBridgeXcm;
13
14
  exports._isPosBridgeXcm = _isPosBridgeXcm;
14
15
  exports._isSnowBridgeXcm = _isSnowBridgeXcm;
16
+ exports._isSubtensorEvmtoBittensorBridge = _isSubtensorEvmtoBittensorBridge;
15
17
  exports._isXcmTransferUnstable = _isXcmTransferUnstable;
16
18
  exports._isXcmWithinSameConsensus = _isXcmWithinSameConsensus;
17
19
  var _chainList = require("@subwallet/chain-list");
18
20
  var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
19
21
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
22
+ var _nativeTokenBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge");
20
23
  var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
21
24
  var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
22
25
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
@@ -24,7 +27,7 @@ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
24
27
  // SPDX-License-Identifier: Apache-2.0
25
28
 
26
29
  function _isXcmTransferUnstable(originChainInfo, destChainInfo, assetSlug) {
27
- return !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) && !_isAssetHubBridgeXcm || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug) || _isPolygonBridgeXcm(originChainInfo, destChainInfo) || _isPosBridgeXcm(originChainInfo, destChainInfo);
30
+ return !_isBittensorToSubtensorEvmBridge(originChainInfo, destChainInfo) && !_isSubtensorEvmtoBittensorBridge(originChainInfo, destChainInfo) && !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) && !_isAssetHubBridgeXcm(originChainInfo, destChainInfo) || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug) || _isPolygonBridgeXcm(originChainInfo, destChainInfo) || _isPosBridgeXcm(originChainInfo, destChainInfo);
28
31
  }
29
32
  function getDefaultUnstableWarning() {
30
33
  return 'Cross-chain transfer of this token is not recommended as it is in beta and incurs a large transaction fee. Continue at your own risk';
@@ -97,6 +100,12 @@ function _isPosBridgeXcm(originChainInfo, destChainInfo) {
97
100
  function _isAcrossBridgeXcm(originChainInfo, destChainInfo) {
98
101
  return (0, _acrossBridge._isAcrossChainBridge)(originChainInfo.slug, destChainInfo.slug);
99
102
  }
103
+ function _isBittensorToSubtensorEvmBridge(originChainInfo, destChainInfo) {
104
+ return (0, _nativeTokenBridge._isBittensorToSubtensorBridge)(originChainInfo.slug, destChainInfo.slug);
105
+ }
106
+ function _isSubtensorEvmtoBittensorBridge(originChainInfo, destChainInfo) {
107
+ return (0, _nativeTokenBridge._isSubtensorToBittensorBridge)(originChainInfo.slug, destChainInfo.slug);
108
+ }
100
109
  function _isAssetHubBridgeXcm(originChainInfo, destChainInfo) {
101
110
  return originChainInfo.slug === 'statemint' && destChainInfo.slug === 'statemine' || originChainInfo.slug === 'statemine' && destChainInfo.slug === 'statemint';
102
111
  }
@@ -40,6 +40,7 @@ var _tonTransfer = require("@subwallet/extension-base/services/balance-service/t
40
40
  var _xcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm");
41
41
  var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
42
42
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
43
+ var _nativeTokenBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge");
43
44
  var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
44
45
  var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
45
46
  var _utils5 = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
@@ -1308,6 +1309,7 @@ class KoniExtension {
1308
1309
  feeCustom,
1309
1310
  feeOption,
1310
1311
  from,
1312
+ metadata,
1311
1313
  to,
1312
1314
  tokenPayFeeSlug,
1313
1315
  tokenSlug,
@@ -1448,7 +1450,8 @@ class KoniExtension {
1448
1450
  networkKey: chain,
1449
1451
  tokenInfo: transferTokenInfo,
1450
1452
  to: to,
1451
- substrateApi
1453
+ substrateApi,
1454
+ metadata
1452
1455
  });
1453
1456
  if (_constants._SUPPORT_TOKEN_PAY_FEE_GROUP.hydration.includes(chain)) {
1454
1457
  var _this$koniState$chain, _substrateApi$api$que;
@@ -1575,11 +1578,18 @@ class KoniExtension {
1575
1578
  const isPolygonBridgeTransfer = (0, _polygonBridge._isPolygonChainBridge)(originNetworkKey, destinationNetworkKey);
1576
1579
  const isPosBridgeTransfer = (0, _posBridge._isPosChainBridge)(originNetworkKey, destinationNetworkKey);
1577
1580
  const isAcrossBridgeTransfer = (0, _acrossBridge._isAcrossChainBridge)(originNetworkKey, destinationNetworkKey);
1581
+ const isBittensorBridgeTransfer = (0, _nativeTokenBridge._isBittensorToSubtensorBridge)(originNetworkKey, destinationNetworkKey);
1582
+ const isSubtensorEvmBridgeTransfer = (0, _nativeTokenBridge._isSubtensorToBittensorBridge)(originNetworkKey, destinationNetworkKey);
1578
1583
  const extrinsicType = _KoniTypes.ExtrinsicType.TRANSFER_XCM;
1579
- const isSubstrateXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer);
1584
+ const isSubstrateParaspellXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer || isBittensorBridgeTransfer || isSubtensorEvmBridgeTransfer);
1580
1585
  const isTransferNative = this.#koniState.getNativeTokenInfo(originNetworkKey).slug === tokenSlug;
1581
1586
  const isTransferLocalTokenAndPayThatTokenAsFee = !isTransferNative && tokenSlug === tokenPayFeeSlug;
1582
1587
  let xcmFeeDryRun;
1588
+ const xcmDestinationFee = {
1589
+ symbol: (destinationTokenInfo === null || destinationTokenInfo === void 0 ? void 0 : destinationTokenInfo.symbol) || '',
1590
+ decimals: (destinationTokenInfo === null || destinationTokenInfo === void 0 ? void 0 : destinationTokenInfo.decimals) || 0,
1591
+ value: '0'
1592
+ };
1583
1593
  let additionalValidator;
1584
1594
  let eventsHandler;
1585
1595
  if (fromKeyPair && destinationTokenInfo) {
@@ -1590,6 +1600,9 @@ class KoniExtension {
1590
1600
  if (isPosBridgeTransfer || isPolygonBridgeTransfer) {
1591
1601
  funcCreateExtrinsic = _xcm.createPolygonBridgeExtrinsic;
1592
1602
  type = 'evm';
1603
+ } else if (isSubtensorEvmBridgeTransfer) {
1604
+ funcCreateExtrinsic = _xcm.createSubtensorEvmToBittensorExtrinsic;
1605
+ type = 'evm';
1593
1606
  } else if (isAcrossBridgeTransfer) {
1594
1607
  funcCreateExtrinsic = _xcm.createAcrossBridgeExtrinsic;
1595
1608
  type = 'evm';
@@ -1599,6 +1612,9 @@ class KoniExtension {
1599
1612
  } else if (isAvailBridgeFromEvm) {
1600
1613
  funcCreateExtrinsic = _xcm.createAvailBridgeTxFromEth;
1601
1614
  type = 'evm';
1615
+ } else if (isBittensorBridgeTransfer) {
1616
+ funcCreateExtrinsic = _xcm.createBittensorToSubtensorEvmExtrinsic;
1617
+ type = 'substrate';
1602
1618
  } else if (isAvailBridgeFromAvail) {
1603
1619
  funcCreateExtrinsic = _xcm.createAvailBridgeExtrinsicFromAvail;
1604
1620
  type = 'substrate';
@@ -1619,10 +1635,11 @@ class KoniExtension {
1619
1635
  evmApi,
1620
1636
  feeCustom,
1621
1637
  feeOption,
1622
- feeInfo
1638
+ feeInfo,
1639
+ transferAll
1623
1640
  };
1624
1641
  extrinsic = await funcCreateExtrinsic(params);
1625
- if (isSubstrateXcm) {
1642
+ if (isSubstrateParaspellXcm) {
1626
1643
  const xcmFeeInfo = await (0, _utils5.estimateXcmFee)({
1627
1644
  fromChainInfo: params.originChain,
1628
1645
  fromTokenInfo: params.originTokenInfo,
@@ -1631,7 +1648,11 @@ class KoniExtension {
1631
1648
  sender: params.sender,
1632
1649
  value: params.sendingValue
1633
1650
  });
1651
+
1652
+ // todo: refactor name
1653
+ // todo: check to use full interface to has full AmountData, include symbol, decimal
1634
1654
  xcmFeeDryRun = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : xcmFeeInfo.origin.fee) || '0';
1655
+ xcmDestinationFee.value = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : xcmFeeInfo.destination.fee) || '0';
1635
1656
  }
1636
1657
  if (isAcrossBridgeTransfer) {
1637
1658
  const data = await (0, _acrossBridge.getAcrossQuote)(params);
@@ -1699,7 +1720,7 @@ class KoniExtension {
1699
1720
  warning.length && inputTransaction.warnings.push(...warning);
1700
1721
  error.length && inputTransaction.errors.push(...error);
1701
1722
  }
1702
- if (isSubstrateXcm) {
1723
+ if (isSubstrateParaspellXcm) {
1703
1724
  const isDryRunSuccess = await (0, _xcm.dryRunXcmExtrinsicV2)(params, false);
1704
1725
  if (!isDryRunSuccess) {
1705
1726
  inputTransaction.errors.push(new _TransactionError.TransactionError(_types5.BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again'));
@@ -1737,7 +1758,7 @@ class KoniExtension {
1737
1758
  transaction: extrinsic,
1738
1759
  data: inputData,
1739
1760
  extrinsicType,
1740
- chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer && !isPosBridgeTransfer && !isAcrossBridgeTransfer ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM,
1761
+ chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer && !isPosBridgeTransfer && !isAcrossBridgeTransfer && !isSubtensorEvmBridgeTransfer ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM,
1741
1762
  transferNativeAmount: (0, _utils6._isNativeToken)(originTokenInfo) ? value : '0',
1742
1763
  ignoreWarnings,
1743
1764
  tokenPayFeeSlug,
@@ -1745,6 +1766,7 @@ class KoniExtension {
1745
1766
  isTransferLocalTokenAndPayThatTokenAsFee,
1746
1767
  isPassConfirmation,
1747
1768
  xcmFeeDryRun,
1769
+ xcmDestinationFee,
1748
1770
  errors,
1749
1771
  additionalValidator: additionalValidator,
1750
1772
  eventsHandler: eventsHandler
@@ -2216,6 +2238,7 @@ class KoniExtension {
2216
2238
  destChain: _destChain,
2217
2239
  feeCustom,
2218
2240
  feeOption,
2241
+ metadata,
2219
2242
  to,
2220
2243
  token,
2221
2244
  tokenPayFeeSlug,
@@ -2257,7 +2280,8 @@ class KoniExtension {
2257
2280
  isTransferLocalTokenAndPayThatTokenAsFee,
2258
2281
  isTransferNativeTokenAndPayLocalTokenAsFee,
2259
2282
  nativeToken,
2260
- transferAll: transferAll
2283
+ transferAll,
2284
+ metadata
2261
2285
  };
2262
2286
  const subscription = (0, _rxjs.combineLatest)({
2263
2287
  freeBalance: freeBalanceSubject,
@@ -4611,7 +4635,8 @@ class KoniExtension {
4611
4635
  errorOnTimeOut,
4612
4636
  ...this.createPassConfirmationParams(isPassConfirmation),
4613
4637
  eventsHandler,
4614
- step
4638
+ step,
4639
+ xcmFeeDryRun: extrinsicType === _KoniTypes.ExtrinsicType.TRANSFER_XCM ? submitData.xcmStepFee : undefined
4615
4640
  });
4616
4641
  }
4617
4642
  async handleYieldLeave(params) {
@@ -5918,6 +5943,8 @@ class KoniExtension {
5918
5943
  return await this.reconnectChain(request);
5919
5944
  case 'pri(chainService.disableChain)':
5920
5945
  return await this.disableChain(request);
5946
+ case 'pri(chainService.disableAllChains)':
5947
+ return await this.#koniState.disableAllChains();
5921
5948
  case 'pri(chainService.removeChain)':
5922
5949
  return this.removeCustomChain(request);
5923
5950
  case 'pri(chainService.validateCustomChain)':
@@ -762,6 +762,26 @@ class KoniState {
762
762
  }
763
763
  return this.chainService.disableChain(chainSlug);
764
764
  }
765
+ async disableAllChains() {
766
+ const chainStateMap = this.chainService.getChainStateMap();
767
+ const activeChainSlugs = Object.keys(chainStateMap).filter(slug => chainStateMap[slug].active);
768
+ const failedChainSlugs = [];
769
+ for (const chainSlug of activeChainSlugs) {
770
+ try {
771
+ const isDisabled = await this.disableChain(chainSlug);
772
+ if (!isDisabled) {
773
+ failedChainSlugs.push(chainSlug);
774
+ }
775
+ } catch (error) {
776
+ failedChainSlugs.push(chainSlug);
777
+ this.logger.error(`Failed to disable chain ${chainSlug}`, error);
778
+ }
779
+ }
780
+ if (failedChainSlugs.length) {
781
+ throw new Error('Unable to turn off all networks. Please try again later');
782
+ }
783
+ return true;
784
+ }
765
785
  async enableChain(chainSlug) {
766
786
  let enableTokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
767
787
  if (enableTokens) {
@@ -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.3.77-0'
16
+ version: '1.3.78-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -1,17 +1,21 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
  Object.defineProperty(exports, "__esModule", {
4
5
  value: true
5
6
  });
6
7
  exports.subscribeERC20Interval = subscribeERC20Interval;
8
+ exports.subscribeERC20IntervalForSubtensorEvm = subscribeERC20IntervalForSubtensorEvm;
7
9
  exports.subscribeEVMBalance = subscribeEVMBalance;
8
10
  var _types = require("@subwallet/chain-list/types");
9
11
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
12
  var _constants = require("@subwallet/extension-base/constants");
11
13
  var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
14
+ var _utils = require("@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/utils");
12
15
  var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
13
- var _utils = require("@subwallet/extension-base/services/chain-service/utils");
14
- var _utils2 = require("@subwallet/extension-base/utils");
16
+ var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
17
+ var _utils3 = require("@subwallet/extension-base/utils");
18
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
15
19
  var _util = require("@polkadot/util");
16
20
  // Copyright 2019-2022 @subwallet/extension-base
17
21
  // SPDX-License-Identifier: Apache-2.0
@@ -25,15 +29,15 @@ function subscribeERC20Interval(_ref) {
25
29
  evmApi
26
30
  } = _ref;
27
31
  const chain = chainInfo.slug;
28
- let tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.ERC20]);
32
+ let tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.ERC20]);
29
33
  if (_constants2._BALANCE_CHAIN_GROUP.moonbeam.includes(chain)) {
30
- const moonbeamLocal = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.LOCAL]);
34
+ const moonbeamLocal = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.LOCAL]);
31
35
  tokenList = Object.assign({}, tokenList, moonbeamLocal);
32
36
  }
33
37
  const erc20ContractMap = {};
34
38
  Object.entries(tokenList).forEach(_ref2 => {
35
39
  let [slug, tokenInfo] = _ref2;
36
- erc20ContractMap[slug] = (0, _web.getERC20Contract)((0, _utils._getContractAddressOfToken)(tokenInfo), evmApi);
40
+ erc20ContractMap[slug] = (0, _web.getERC20Contract)((0, _utils2._getContractAddressOfToken)(tokenInfo), evmApi);
37
41
  });
38
42
  const getTokenBalances = () => {
39
43
  Object.values(tokenList).map(async tokenInfo => {
@@ -69,6 +73,79 @@ function subscribeERC20Interval(_ref) {
69
73
  clearInterval(interval);
70
74
  };
71
75
  }
76
+ function subscribeERC20IntervalForSubtensorEvm(_ref3) {
77
+ let {
78
+ addresses,
79
+ assetMap,
80
+ callback,
81
+ chainInfo,
82
+ evmApi,
83
+ substrateApiMap
84
+ } = _ref3;
85
+ const chain = chainInfo.slug;
86
+ const tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.ERC20]);
87
+ let cancel = false;
88
+ const getTokenBalances = () => {
89
+ Object.values(tokenList).map(async tokenInfo => {
90
+ try {
91
+ var _tokenInfo$metadata;
92
+ if ((_tokenInfo$metadata = tokenInfo.metadata) !== null && _tokenInfo$metadata !== void 0 && _tokenInfo$metadata.isAlphaToken && substrateApiMap) {
93
+ const ss58ToEvmMap = {};
94
+ const subtensorEvmSs58Address = [];
95
+ addresses.forEach(address => {
96
+ const ss58Address = (0, _utils.evmToSs58)(address);
97
+ subtensorEvmSs58Address.push(ss58Address);
98
+ ss58ToEvmMap[ss58Address] = address;
99
+ });
100
+ if (cancel) {
101
+ return;
102
+ }
103
+ const substrateApi = await substrateApiMap.bittensor.isReady;
104
+ const rawData = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkeys(subtensorEvmSs58Address);
105
+ const values = rawData.toPrimitive();
106
+ const converted = {};
107
+ for (let i = 0; i < values.length; i++) {
108
+ const [, stakes] = values[i];
109
+ const s58Address = subtensorEvmSs58Address[i];
110
+ const address = ss58ToEvmMap[s58Address];
111
+ converted[address] = {};
112
+ stakes.forEach(stakeInfo => {
113
+ const {
114
+ netuid,
115
+ stake
116
+ } = stakeInfo;
117
+ const currentValue = converted[address][netuid] || (0, _bignumber.default)(0);
118
+ converted[address][netuid] = currentValue.plus(stake);
119
+ });
120
+ }
121
+ const netuid = (0, _utils2._getAssetNetuid)(tokenInfo);
122
+ const items = Object.entries(converted).map(_ref4 => {
123
+ let [address, stakeMap] = _ref4;
124
+ const value = stakeMap[netuid] || (0, _bignumber.default)(0);
125
+ return {
126
+ address: address,
127
+ tokenSlug: tokenInfo.slug,
128
+ state: _KoniTypes.APIItemState.READY,
129
+ free: value.toFixed(0),
130
+ locked: '0'
131
+ };
132
+ });
133
+ if (!cancel) {
134
+ callback(items);
135
+ }
136
+ }
137
+ } catch (err) {
138
+ console.log(tokenInfo.slug, err);
139
+ }
140
+ });
141
+ };
142
+ getTokenBalances();
143
+ const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
144
+ return () => {
145
+ cancel = true;
146
+ clearInterval(interval);
147
+ };
148
+ }
72
149
  async function getEVMBalance(addresses, web3Api) {
73
150
  return await Promise.all(addresses.map(async address => {
74
151
  try {
@@ -88,7 +165,7 @@ function subscribeEVMBalance(params) {
88
165
  evmApi
89
166
  } = params;
90
167
  const chain = chainInfo.slug;
91
- const nativeTokenInfo = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.NATIVE]);
168
+ const nativeTokenInfo = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.NATIVE]);
92
169
  const nativeTokenSlug = ((_Object$values$ = Object.values(nativeTokenInfo)[0]) === null || _Object$values$ === void 0 ? void 0 : _Object$values$.slug) || '';
93
170
  function getBalance() {
94
171
  getEVMBalance(addresses, evmApi).then(balances => {
@@ -119,8 +196,10 @@ function subscribeEVMBalance(params) {
119
196
  getBalance();
120
197
  const interval = setInterval(getBalance, _constants.ASTAR_REFRESH_BALANCE_INTERVAL);
121
198
  const unsub2 = subscribeERC20Interval(params);
199
+ const unsub3 = subscribeERC20IntervalForSubtensorEvm(params);
122
200
  return () => {
123
201
  clearInterval(interval);
124
202
  unsub2 && unsub2();
203
+ unsub3 && unsub3();
125
204
  };
126
205
  }
@@ -58,7 +58,8 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
58
58
  assetMap: chainAssetMap,
59
59
  callback,
60
60
  chainInfo,
61
- evmApi
61
+ evmApi,
62
+ substrateApiMap
62
63
  });
63
64
  }
64
65
  const tonApi = tonApiMap[chainSlug];
@@ -216,12 +216,16 @@ class BalanceService {
216
216
  const bitcoinApiMap = this.state.chainService.getBitcoinApiMap();
217
217
  let unsub = _util.noop;
218
218
  unsub = (0, _helpers.subscribeBalance)([address], [chain], [tSlug], assetMap, chainInfoMap, substrateApiMap, evmApiMap, tonApiMap, cardanoApiMap, bitcoinApiMap, result => {
219
+ var _rs$lockedDetails;
219
220
  const rs = result[0];
220
221
  let value;
221
222
  switch (balanceType) {
222
223
  case _types2.BalanceType.TOTAL:
223
224
  value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).toFixed();
224
225
  break;
226
+ case _types2.BalanceType.STAKING:
227
+ value = ((_rs$lockedDetails = rs.lockedDetails) === null || _rs$lockedDetails === void 0 ? void 0 : _rs$lockedDetails.staking) || '0';
228
+ break;
225
229
  case _types2.BalanceType.TOTAL_MINUS_RESERVED:
226
230
  if (_constants2._BALANCE_CHAIN_GROUP.notSupportGetBalanceByType.includes(chainInfo.slug)) {
227
231
  // TODO: Currently Vara and Avail staking from nomination pools is not fully supported.
@@ -229,8 +233,8 @@ class BalanceService {
229
233
  // Improve later when full staking breakdown is available.
230
234
  value = rs.free;
231
235
  } 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();
236
+ var _rs$lockedDetails2, _rs$lockedDetails3;
237
+ value = new _bignumber.default(rs.free).plus(new _bignumber.default(rs.locked)).minus(_bignumber.default.max(new _bignumber.default(((_rs$lockedDetails2 = rs.lockedDetails) === null || _rs$lockedDetails2 === void 0 ? void 0 : _rs$lockedDetails2.reserved) || 0), new _bignumber.default(((_rs$lockedDetails3 = rs.lockedDetails) === null || _rs$lockedDetails3 === void 0 ? void 0 : _rs$lockedDetails3.staking) || 0))).toFixed();
234
238
  }
235
239
  break;
236
240
  default:
@@ -28,6 +28,7 @@ const createSubstrateExtrinsic = async _ref => {
28
28
  var _tokenInfo$metadata;
29
29
  let {
30
30
  from,
31
+ metadata,
31
32
  networkKey,
32
33
  substrateApi,
33
34
  to,
@@ -129,6 +130,20 @@ const createSubstrateExtrinsic = async _ref => {
129
130
  }
130
131
  } else if (_constants._TRANSFER_CHAIN_GROUP.truth.includes(networkKey)) {
131
132
  transfer = api.tx.assetManager.transfer(to, (0, _utils3._getTokenOnChainInfo)(tokenInfo), value);
133
+ } else if (_constants._TRANSFER_CHAIN_GROUP.bittensor.includes(networkKey) && !!metadata) {
134
+ const {
135
+ fromValidator,
136
+ netuid,
137
+ toValidator
138
+ } = metadata;
139
+ const formatToValidator = toValidator === null || toValidator === void 0 ? void 0 : toValidator.split('___')[0];
140
+ if (fromValidator === formatToValidator) {
141
+ transfer = substrateApi.api.tx.subtensorModule.transferStake(to, fromValidator, netuid, netuid, value);
142
+ } else {
143
+ const moveStakeTx = substrateApi.api.tx.subtensorModule.moveStake(fromValidator, formatToValidator, netuid, netuid, value);
144
+ const transferStakeTx = substrateApi.api.tx.subtensorModule.transferStake(to, formatToValidator, netuid, netuid, value);
145
+ transfer = substrateApi.api.tx.utility.batchAll([moveStakeTx, transferStakeTx]);
146
+ }
132
147
  }
133
148
  return [transfer, transferAmount || value];
134
149
  };
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ var _nativeTokenBridge = require("./nativeTokenBridge");
7
+ Object.keys(_nativeTokenBridge).forEach(function (key) {
8
+ if (key === "default" || key === "__esModule") return;
9
+ if (key in exports && exports[key] === _nativeTokenBridge[key]) return;
10
+ Object.defineProperty(exports, key, {
11
+ enumerable: true,
12
+ get: function () {
13
+ return _nativeTokenBridge[key];
14
+ }
15
+ });
16
+ });
17
+ var _utils = require("./utils");
18
+ Object.keys(_utils).forEach(function (key) {
19
+ if (key === "default" || key === "__esModule") return;
20
+ if (key in exports && exports[key] === _utils[key]) return;
21
+ Object.defineProperty(exports, key, {
22
+ enumerable: true,
23
+ get: function () {
24
+ return _utils[key];
25
+ }
26
+ });
27
+ });
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports._isBittensorToSubtensorBridge = _isBittensorToSubtensorBridge;
7
+ exports._isSubtensorToBittensorBridge = _isSubtensorToBittensorBridge;
8
+ exports.getSubtensorEvmtoBittensorExtrinsic = getSubtensorEvmtoBittensorExtrinsic;
9
+ var _chainList = require("@subwallet/chain-list");
10
+ var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
11
+ var _utils = require("@subwallet/extension-base/utils");
12
+ var _util = require("@polkadot/util");
13
+ var _utilCrypto = require("@polkadot/util-crypto");
14
+ // Copyright 2019-2022 @subwallet/extension-base
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ const NATIVE_SUBTENSOR_ABI = [{
18
+ inputs: [{
19
+ internalType: 'bytes32',
20
+ name: 'data',
21
+ type: 'bytes32'
22
+ }],
23
+ name: 'transfer',
24
+ outputs: [],
25
+ stateMutability: 'payable',
26
+ type: 'function'
27
+ }];
28
+ const nativeSubtensorEvmContractAddress = '0x0000000000000000000000000000000000000800';
29
+ async function getSubtensorEvmtoBittensorExtrinsic(sender, recipientAddress, sendingValue, evmApi, _feeInfo, feeCustom, feeOption) {
30
+ const contract = (0, _web.getWeb3Contract)(nativeSubtensorEvmContractAddress, evmApi, NATIVE_SUBTENSOR_ABI);
31
+ const toAccountId = (0, _utilCrypto.decodeAddress)(recipientAddress);
32
+ const amountSubstrate = new _util.BN(sendingValue).div(new _util.BN(10).pow(new _util.BN(9)));
33
+ const amountU8a = (0, _util.compactToU8a)(amountSubstrate);
34
+ const scaleEncoded = (0, _util.u8aConcat)(toAccountId, amountU8a);
35
+ const dataU8a = scaleEncoded.slice(0, 32);
36
+ const dataHex = (0, _util.u8aToHex)(dataU8a);
37
+
38
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-unsafe-call
39
+ const transferCall = contract.methods.transfer(dataHex);
40
+ const txData = transferCall.encodeABI();
41
+ const feeInfo = _feeInfo;
42
+ const feeCombine = (0, _utils.combineEthFee)(feeInfo, feeOption, feeCustom);
43
+ const transactionConfig = {
44
+ from: sender,
45
+ to: nativeSubtensorEvmContractAddress,
46
+ value: sendingValue,
47
+ data: txData,
48
+ ...feeCombine
49
+ };
50
+ transactionConfig.gas = (await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 30000)).toString();
51
+ return transactionConfig;
52
+ }
53
+ function _isBittensorToSubtensorBridge(srcChain, destChain) {
54
+ return srcChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR && destChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM || srcChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR_TESTNET && destChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM_TESTNET;
55
+ }
56
+ function _isSubtensorToBittensorBridge(srcChain, destChain) {
57
+ return srcChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM && destChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR || srcChain === _chainList.COMMON_CHAIN_SLUGS.SUBTENSOR_EVM_TESTNET && destChain === _chainList.COMMON_CHAIN_SLUGS.BITTENSOR_TESTNET;
58
+ }
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.evmToSs58 = evmToSs58;
7
+ var _util = require("@polkadot/util");
8
+ var _utilCrypto = require("@polkadot/util-crypto");
9
+ // Copyright 2019-2022 @subwallet/extension-base
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ const EVM_PREFIX = new TextEncoder().encode('evm:');
13
+
14
+ /**
15
+ * Convert an EVM address (0x...) into a Substrate SS58 address
16
+ *
17
+ * @param evmAddress EVM address, with or without the "0x" prefix
18
+ * @param ss58Prefix SS58 network prefix (default is 42 – generic Substrate)
19
+ * @returns SS58-encoded Substrate address
20
+ */
21
+ function evmToSs58(evmAddress) {
22
+ let ss58Prefix = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 42;
23
+ // Normalize input: ensure "0x" prefix and convert to Uint8Array
24
+ const addressBytes = (0, _util.hexToU8a)(evmAddress.startsWith('0x') ? evmAddress : '0x' + evmAddress);
25
+
26
+ // Build the input buffer: "evm:" prefix + 20-byte EVM address
27
+ const combined = new Uint8Array(EVM_PREFIX.length + addressBytes.length);
28
+ combined.set(EVM_PREFIX);
29
+ combined.set(addressBytes, EVM_PREFIX.length);
30
+
31
+ // Hash using blake2b-256 to derive a Substrate AccountId
32
+ const hash = (0, _utilCrypto.blake2AsU8a)(combined);
33
+
34
+ // Encode the hash into an SS58 address with the given prefix
35
+ return (0, _utilCrypto.encodeAddress)(hash, ss58Prefix);
36
+ }