@subwallet/extension-base 1.3.76-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 (96) hide show
  1. package/background/KoniTypes.d.ts +4 -1
  2. package/cjs/core/logic-validation/index.js +1 -1
  3. package/cjs/core/substrate/xcm-parser.js +17 -11
  4. package/cjs/koni/background/handlers/Extension.js +293 -71
  5. package/cjs/koni/background/handlers/State.js +20 -0
  6. package/cjs/koni/background/handlers/Tabs.js +2 -3
  7. package/cjs/packageInfo.js +1 -1
  8. package/cjs/services/balance-service/helpers/subscribe/evm.js +85 -6
  9. package/cjs/services/balance-service/helpers/subscribe/index.js +2 -1
  10. package/cjs/services/balance-service/index.js +6 -2
  11. package/cjs/services/balance-service/transfer/token.js +15 -0
  12. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/index.js +27 -0
  13. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +58 -0
  14. package/cjs/services/balance-service/transfer/xcm/bittensorBridge/utils.js +36 -0
  15. package/cjs/services/balance-service/transfer/xcm/index.js +61 -2
  16. package/cjs/services/balance-service/transfer/xcm/utils.js +94 -6
  17. package/cjs/services/chain-service/constants.js +4 -2
  18. package/cjs/services/chain-service/utils/patch.js +1 -1
  19. package/cjs/services/earning-service/constants/chains.js +7 -2
  20. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +8 -5
  21. package/cjs/services/earning-service/handlers/special.js +82 -65
  22. package/cjs/services/earning-service/service.js +19 -2
  23. package/cjs/services/multisig-service/index.js +1 -1
  24. package/cjs/services/request-service/handler/SubstrateRequestHandler.js +12 -0
  25. package/cjs/services/request-service/index.js +3 -0
  26. package/cjs/services/setting-service/constants.js +2 -1
  27. package/cjs/services/storage-service/db-stores/InappNotification.js +1 -1
  28. package/cjs/services/swap-service/handler/bittensor-handler.js +197 -0
  29. package/cjs/services/swap-service/index.js +7 -0
  30. package/cjs/services/transaction-service/index.js +10 -0
  31. package/cjs/types/balance/index.js +1 -0
  32. package/cjs/types/swap/index.js +3 -1
  33. package/cjs/utils/fee/transfer.js +20 -5
  34. package/core/logic-validation/index.js +1 -1
  35. package/core/substrate/xcm-parser.d.ts +3 -0
  36. package/core/substrate/xcm-parser.js +14 -11
  37. package/koni/background/handlers/Extension.d.ts +19 -0
  38. package/koni/background/handlers/Extension.js +233 -14
  39. package/koni/background/handlers/State.d.ts +1 -0
  40. package/koni/background/handlers/State.js +20 -0
  41. package/koni/background/handlers/Tabs.js +2 -3
  42. package/package.json +26 -6
  43. package/packageInfo.js +1 -1
  44. package/services/balance-service/helpers/subscribe/evm.d.ts +1 -0
  45. package/services/balance-service/helpers/subscribe/evm.js +76 -1
  46. package/services/balance-service/helpers/subscribe/index.js +2 -1
  47. package/services/balance-service/index.js +6 -2
  48. package/services/balance-service/transfer/token.d.ts +2 -1
  49. package/services/balance-service/transfer/token.js +15 -0
  50. package/services/balance-service/transfer/xcm/bittensorBridge/index.d.ts +2 -0
  51. package/services/balance-service/transfer/xcm/bittensorBridge/index.js +5 -0
  52. package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.d.ts +6 -0
  53. package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +50 -0
  54. package/services/balance-service/transfer/xcm/bittensorBridge/utils.d.ts +8 -0
  55. package/services/balance-service/transfer/xcm/bittensorBridge/utils.js +29 -0
  56. package/services/balance-service/transfer/xcm/index.d.ts +5 -0
  57. package/services/balance-service/transfer/xcm/index.js +57 -2
  58. package/services/balance-service/transfer/xcm/utils.d.ts +3 -2
  59. package/services/balance-service/transfer/xcm/utils.js +87 -1
  60. package/services/chain-service/constants.d.ts +2 -0
  61. package/services/chain-service/constants.js +4 -2
  62. package/services/chain-service/utils/patch.d.ts +1 -1
  63. package/services/chain-service/utils/patch.js +1 -1
  64. package/services/earning-service/constants/chains.d.ts +2 -0
  65. package/services/earning-service/constants/chains.js +4 -1
  66. package/services/earning-service/handlers/liquid-staking/stella-swap.d.ts +1 -0
  67. package/services/earning-service/handlers/liquid-staking/stella-swap.js +6 -4
  68. package/services/earning-service/handlers/special.d.ts +1 -1
  69. package/services/earning-service/handlers/special.js +85 -68
  70. package/services/earning-service/service.js +21 -4
  71. package/services/inapp-notification-service/interfaces.d.ts +1 -0
  72. package/services/multisig-service/index.js +1 -1
  73. package/services/request-service/handler/SubstrateRequestHandler.d.ts +1 -0
  74. package/services/request-service/handler/SubstrateRequestHandler.js +12 -0
  75. package/services/request-service/index.d.ts +1 -0
  76. package/services/request-service/index.js +3 -0
  77. package/services/request-service/types.d.ts +1 -0
  78. package/services/setting-service/constants.js +2 -1
  79. package/services/storage-service/db-stores/InappNotification.js +1 -1
  80. package/services/swap-service/handler/bittensor-handler.d.ts +21 -0
  81. package/services/swap-service/handler/bittensor-handler.js +189 -0
  82. package/services/swap-service/index.js +7 -0
  83. package/services/transaction-service/index.d.ts +1 -1
  84. package/services/transaction-service/index.js +10 -0
  85. package/services/transaction-service/types.d.ts +4 -3
  86. package/types/balance/index.d.ts +3 -1
  87. package/types/balance/index.js +1 -0
  88. package/types/balance/transfer.d.ts +9 -0
  89. package/types/fee/base.d.ts +1 -0
  90. package/types/multisig/index.d.ts +12 -0
  91. package/types/swap/index.d.ts +3 -1
  92. package/types/swap/index.js +3 -1
  93. package/types/yield/actions/join/step.d.ts +6 -0
  94. package/types/yield/actions/join/submit.d.ts +1 -0
  95. package/utils/fee/transfer.d.ts +1 -0
  96. package/utils/fee/transfer.js +21 -6
@@ -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) {
@@ -83,12 +83,11 @@ function transformAccountsV2(accounts) {
83
83
  let {
84
84
  json: {
85
85
  meta: {
86
- isHidden,
87
- isMultisig
86
+ isHidden
88
87
  }
89
88
  }
90
89
  } = _ref2;
91
- return !isHidden && !isMultisig;
90
+ return !isHidden;
92
91
  }).filter(authTypeFilter).filter(_ref3 => {
93
92
  let {
94
93
  json: {
@@ -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.76-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
+ }
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getXcmOriginFee = exports.dryRunXcmExtrinsicV2 = exports.createXcmExtrinsicV2 = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = exports.createAcrossBridgeExtrinsic = void 0;
7
+ exports.getXcmOriginFee = exports.getMinXcmTransferableAmount = exports.dryRunXcmExtrinsicV2 = exports.createXcmExtrinsicV2 = exports.createSubtensorEvmToBittensorExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createBittensorToSubtensorEvmExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = exports.createAcrossBridgeExtrinsic = void 0;
8
8
  var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
9
9
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
10
10
  var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
@@ -12,6 +12,7 @@ var _snowBridge = require("@subwallet/extension-base/services/balance-service/tr
12
12
  var _utils = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
13
13
  var _utils2 = require("@subwallet/extension-base/utils");
14
14
  var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos/subwallet-services-sdk"));
15
+ var _bittensorBridge = require("./bittensorBridge");
15
16
  var _posBridge = require("./posBridge");
16
17
  // Copyright 2019-2022 @subwallet/extension-base
17
18
  // SPDX-License-Identifier: Apache-2.0
@@ -112,6 +113,14 @@ const createXcmExtrinsicV2 = async request => {
112
113
  }
113
114
  };
114
115
  exports.createXcmExtrinsicV2 = createXcmExtrinsicV2;
116
+ const getMinXcmTransferableAmount = async request => {
117
+ try {
118
+ return await (0, _utils.fetchMinXcmTransferableAmount)(request);
119
+ } catch (e) {
120
+ return undefined;
121
+ }
122
+ };
123
+ exports.getMinXcmTransferableAmount = getMinXcmTransferableAmount;
115
124
  const dryRunXcmExtrinsicV2 = async function (request) {
116
125
  let isPreview = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
117
126
  try {
@@ -216,4 +225,54 @@ const createAcrossBridgeExtrinsic = async _ref5 => {
216
225
  return Promise.reject(new Error(error === null || error === void 0 ? void 0 : error.message));
217
226
  }
218
227
  };
219
- exports.createAcrossBridgeExtrinsic = createAcrossBridgeExtrinsic;
228
+
229
+ // Native bittensor <-> subtensor EVM bridge
230
+ exports.createAcrossBridgeExtrinsic = createAcrossBridgeExtrinsic;
231
+ const createBittensorToSubtensorEvmExtrinsic = async _ref6 => {
232
+ let {
233
+ destinationChain,
234
+ originChain,
235
+ recipient,
236
+ sendingValue,
237
+ substrateApi,
238
+ transferAll
239
+ } = _ref6;
240
+ if (!(0, _xcmParser._isBittensorToSubtensorEvmBridge)(originChain, destinationChain)) {
241
+ throw new Error('This is not a valid Bittensor bridge transfer');
242
+ }
243
+ if (!substrateApi) {
244
+ throw Error('Substrate API is not available');
245
+ }
246
+ const api = substrateApi.api;
247
+ await api.isReady;
248
+ const subtensorEvmAddress = (0, _bittensorBridge.evmToSs58)(recipient);
249
+ if (transferAll) {
250
+ return api.tx.balances.transferAll(subtensorEvmAddress, false);
251
+ }
252
+ return api.tx.balances.transferKeepAlive(subtensorEvmAddress, sendingValue);
253
+ };
254
+ exports.createBittensorToSubtensorEvmExtrinsic = createBittensorToSubtensorEvmExtrinsic;
255
+ const createSubtensorEvmToBittensorExtrinsic = async _ref7 => {
256
+ let {
257
+ destinationChain,
258
+ evmApi,
259
+ feeCustom,
260
+ feeInfo,
261
+ feeOption,
262
+ originChain,
263
+ recipient,
264
+ sender,
265
+ sendingValue
266
+ } = _ref7;
267
+ if (!(0, _xcmParser._isSubtensorEvmtoBittensorBridge)(originChain, destinationChain)) {
268
+ throw new Error('This is not a valid Subtensor EVM bridge transfer');
269
+ }
270
+ if (!evmApi) {
271
+ throw Error('Evm API is not available');
272
+ }
273
+ if (!sender) {
274
+ throw Error('Sender is required');
275
+ }
276
+ return (0, _bittensorBridge.getSubtensorEvmtoBittensorExtrinsic)(sender, recipient, sendingValue, evmApi, feeInfo, feeCustom, feeOption);
277
+ };
278
+ exports.createSubtensorEvmToBittensorExtrinsic = createSubtensorEvmToBittensorExtrinsic;
@@ -8,13 +8,22 @@ exports.buildXcm = buildXcm;
8
8
  exports.dryRunPreviewXcm = dryRunPreviewXcm;
9
9
  exports.dryRunXcm = dryRunXcm;
10
10
  exports.estimateXcmFee = estimateXcmFee;
11
+ exports.fetchMinXcmTransferableAmount = fetchMinXcmTransferableAmount;
11
12
  exports.isChainNotSupportDryRun = isChainNotSupportDryRun;
12
13
  exports.isChainNotSupportPolkadotApi = isChainNotSupportPolkadotApi;
14
+ exports.isSubstrateCrossChain = isSubstrateCrossChain;
13
15
  var _paraspellChainMap = require("@subwallet/extension-base/constants/paraspell-chain-map");
16
+ var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
17
+ var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
18
+ var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
19
+ var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
20
+ var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
21
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
14
22
  var _environment = require("@subwallet/extension-base/types/environment");
15
- var _utils = require("@subwallet/extension-base/utils");
23
+ var _utils2 = require("@subwallet/extension-base/utils");
16
24
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
17
25
  var _util = require("@polkadot/util");
26
+ var _bittensorBridge = require("./bittensorBridge");
18
27
  // Copyright 2019-2022 @subwallet/extension-base
19
28
  // SPDX-License-Identifier: Apache-2.0
20
29
 
@@ -23,7 +32,9 @@ const paraSpellApi = {
23
32
  buildXcm: `${version}/x-transfer`,
24
33
  feeXcm: `${version}/xcm-fee`,
25
34
  dryRunXcm: `${version}/dry-run`,
26
- dryRunPreviewXcm: `${version}/dry-run-preview`
35
+ dryRunPreviewXcm: `${version}/dry-run-preview`,
36
+ maxTransferable: `${version}/transferable-amount`,
37
+ minTransferable: `${version}/min-transferable-amount`
27
38
  };
28
39
  function txHexToSubmittableExtrinsic(api, hex) {
29
40
  try {
@@ -105,7 +116,7 @@ async function buildXcm(request) {
105
116
  abstractDecimals: false
106
117
  }
107
118
  };
108
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.buildXcm, {
119
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.buildXcm, {
109
120
  method: 'POST',
110
121
  body: JSON.stringify(bodyData),
111
122
  headers: {
@@ -146,7 +157,7 @@ async function dryRunXcm(request) {
146
157
  abstractDecimals: false
147
158
  }
148
159
  };
149
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunXcm, {
160
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunXcm, {
150
161
  method: 'POST',
151
162
  body: JSON.stringify(bodyData),
152
163
  headers: {
@@ -191,7 +202,7 @@ async function dryRunPreviewXcm(request) {
191
202
  mintFeeAssets: true
192
203
  }
193
204
  };
194
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunPreviewXcm, {
205
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.dryRunPreviewXcm, {
195
206
  method: 'POST',
196
207
  body: JSON.stringify(bodyData),
197
208
  headers: {
@@ -238,7 +249,7 @@ async function estimateXcmFee(request) {
238
249
  abstractDecimals: false
239
250
  }
240
251
  };
241
- const response = await (0, _utils.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.feeXcm, {
252
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.feeXcm, {
242
253
  method: 'POST',
243
254
  body: JSON.stringify(bodyData),
244
255
  headers: {
@@ -252,6 +263,41 @@ async function estimateXcmFee(request) {
252
263
  }
253
264
  return await response.json();
254
265
  }
266
+ async function fetchMinXcmTransferableAmount(request) {
267
+ var _originTokenInfo$meta4;
268
+ const {
269
+ fromChainInfo: originChain,
270
+ fromTokenInfo: originTokenInfo,
271
+ recipient,
272
+ sender,
273
+ toChainInfo: destinationChain,
274
+ value: sendingValue
275
+ } = request;
276
+ const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
277
+ const paraSpellIdentifyV4 = (_originTokenInfo$meta4 = originTokenInfo.metadata) === null || _originTokenInfo$meta4 === void 0 ? void 0 : _originTokenInfo$meta4.paraSpellIdentifyV4;
278
+ if (!paraSpellIdentifyV4) {
279
+ throw new Error('Token is not support XCM at this time');
280
+ }
281
+ const bodyData = {
282
+ senderAddress: sender,
283
+ address: recipient,
284
+ from: paraSpellChainMap[originChain.slug],
285
+ to: paraSpellChainMap[destinationChain.slug],
286
+ currency: createParaSpellCurrency(paraSpellIdentifyV4, sendingValue),
287
+ options: {
288
+ abstractDecimals: false
289
+ }
290
+ };
291
+ const response = await (0, _utils2.fetchFromProxyService)(_environment.ProxyServiceRoute.PARASPELL, paraSpellApi.minTransferable, {
292
+ method: 'POST',
293
+ body: JSON.stringify(bodyData),
294
+ headers: {
295
+ 'Content-Type': 'application/json',
296
+ Accept: 'application/json'
297
+ }
298
+ });
299
+ return await response.json();
300
+ }
255
301
  function createParaSpellCurrency(paraSpellIdentifyV4, amount) {
256
302
  return {
257
303
  ...paraSpellIdentifyV4,
@@ -267,4 +313,46 @@ function isChainNotSupportDryRun(str) {
267
313
  const regex = /(?=.*DryRunApi)(?=.*not available).*/i; // Example: DryRunApi is not available on node Acala
268
314
 
269
315
  return regex.test(str);
316
+ }
317
+ function isSubstrateCrossChain(originChainInfo, destinationChainInfo) {
318
+ if (originChainInfo.slug === destinationChainInfo.slug) {
319
+ return false;
320
+ }
321
+
322
+ // isAvailBridgeFromEvm
323
+ if ((0, _utils._isPureEvmChain)(originChainInfo) && (0, _availBridge.isAvailChainBridge)(destinationChainInfo.slug)) {
324
+ return false;
325
+ }
326
+
327
+ // isAvailBridgeFromAvail
328
+ if ((0, _availBridge.isAvailChainBridge)(originChainInfo.slug) && (0, _utils._isPureEvmChain)(destinationChainInfo)) {
329
+ return false;
330
+ }
331
+
332
+ // isSnowBridgeEvmTransfer
333
+ if ((0, _utils._isPureEvmChain)(originChainInfo) && (0, _xcmParser._isSnowBridgeXcm)(originChainInfo, destinationChainInfo)) {
334
+ return false;
335
+ }
336
+
337
+ // isPolygonBridgeTransfer
338
+ if ((0, _polygonBridge._isPolygonChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
339
+ return false;
340
+ }
341
+
342
+ // isPosBridgeTransfer
343
+ if ((0, _posBridge._isPosChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
344
+ return false;
345
+ }
346
+
347
+ // isAcrossBridgeTransfer
348
+ if ((0, _acrossBridge._isAcrossChainBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
349
+ return false;
350
+ }
351
+ if ((0, _bittensorBridge._isBittensorToSubtensorBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
352
+ return false;
353
+ }
354
+ if ((0, _bittensorBridge._isSubtensorToBittensorBridge)(originChainInfo.slug, destinationChainInfo.slug)) {
355
+ return false;
356
+ }
357
+ return true;
270
358
  }
@@ -54,7 +54,8 @@ const _BALANCE_CHAIN_GROUP = {
54
54
  supportBridged: ['rococo_assethub', 'statemint', 'statemine', 'polimec'],
55
55
  bittensor: ['bittensor', 'bittensor_testnet'],
56
56
  moonbeam: ['moonbeam', 'moonriver', 'moonbase'],
57
- notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet']
57
+ notSupportGetBalanceByType: ['vara_network', 'vara_testnet', 'availTuringTest', 'avail_mainnet'],
58
+ subtensor_evm: ['subtensor_evm']
58
59
  };
59
60
  exports._BALANCE_CHAIN_GROUP = _BALANCE_CHAIN_GROUP;
60
61
  const _BALANCE_LOCKED_ID_GROUP = {
@@ -313,7 +314,8 @@ const _TRANSFER_CHAIN_GROUP = {
313
314
  pendulum: ['pendulum', 'amplitude', 'amplitude_test', 'hydradx_main', 'bifrost', 'bifrost_dot', 'jamton', 'hydradx_hollarnet'],
314
315
  centrifuge: ['centrifuge'],
315
316
  disable_transfer: ['crab', 'pangolin'],
316
- truth: ['truth_network']
317
+ truth: ['truth_network'],
318
+ bittensor: ['bittensor', 'bittensor_testnet']
317
319
  };
318
320
  exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
319
321
  const USE_MULTILOCATION_INDEX = ['energy_web_x'];
@@ -12,7 +12,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
12
12
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
13
13
  const fetchDomain = process.env.PATCH_CHAIN_LIST_URL || (PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev');
14
14
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
15
- const ChainListVersion = '0.2.123'; // update this when build chain-list
15
+ const ChainListVersion = '0.2.127'; // update this when build chain-list
16
16
 
17
17
  // todo: move this interface to chainlist
18
18
  exports.ChainListVersion = ChainListVersion;