@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
@@ -0,0 +1,197 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.BittensorSwapHandler = void 0;
8
+ var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
9
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
+ var _types = require("@subwallet/extension-base/types");
11
+ var _utils = require("@subwallet/extension-base/utils");
12
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
13
+ var _utils2 = require("../../chain-service/utils");
14
+ var _baseHandler = require("./base-handler");
15
+ // Copyright 2019-2022 @subwallet/extension-base
16
+ // SPDX-License-Identifier: Apache-2.0
17
+
18
+ class BittensorSwapHandler {
19
+ isReady = false;
20
+ constructor(chainService, balanceService, feeService, isTestnet) {
21
+ this.swapBaseHandler = new _baseHandler.SwapBaseHandler({
22
+ chainService,
23
+ balanceService,
24
+ feeService,
25
+ providerName: isTestnet ? 'Bittensor Testnet' : 'Bittensor',
26
+ providerSlug: isTestnet ? _types.SwapProviderId.BITTENSOR_TESTNET : _types.SwapProviderId.BITTENSOR
27
+ });
28
+ this.providerSlug = isTestnet ? _types.SwapProviderId.BITTENSOR_TESTNET : _types.SwapProviderId.BITTENSOR;
29
+ }
30
+ get chainService() {
31
+ return this.swapBaseHandler.chainService;
32
+ }
33
+ get providerInfo() {
34
+ return this.swapBaseHandler.providerInfo;
35
+ }
36
+ generateOptimalProcessV2(params) {
37
+ return this.swapBaseHandler.generateOptimalProcessV2(params, [this.getSubmitStep.bind(this)]);
38
+ }
39
+ async getSubmitStep(params) {
40
+ if (!params.selectedQuote) {
41
+ return Promise.resolve(undefined);
42
+ }
43
+ const originTokenInfo = this.chainService.getAssetBySlug(params.selectedQuote.pair.from);
44
+ const destinationTokenInfo = this.chainService.getAssetBySlug(params.selectedQuote.pair.to);
45
+ const originChain = this.chainService.getChainInfoByKey(originTokenInfo.originChain);
46
+ const destinationChain = this.chainService.getChainInfoByKey(destinationTokenInfo.originChain);
47
+ const submitStep = {
48
+ name: 'Swap',
49
+ type: _types.SwapStepType.SWAP,
50
+ // @ts-ignore
51
+ metadata: {
52
+ sendingValue: params.request.fromAmount.toString(),
53
+ expectedReceive: params.selectedQuote.toAmount,
54
+ originTokenInfo,
55
+ destinationTokenInfo,
56
+ sender: (0, _utils._reformatAddressWithChain)(params.request.address, originChain),
57
+ receiver: (0, _utils._reformatAddressWithChain)(params.request.recipient || params.request.address, destinationChain),
58
+ version: 2
59
+ }
60
+ };
61
+ return Promise.resolve([submitStep, params.selectedQuote.feeInfo]);
62
+ }
63
+ async validateSwapProcessV2(params) {
64
+ // todo: recheck address and recipient format in params
65
+ const {
66
+ process,
67
+ selectedQuote
68
+ } = params; // todo: review flow, currentStep param.
69
+
70
+ // todo: validate path with optimalProcess
71
+ // todo: review error message in case many step swap
72
+ if ((0, _bignumber.default)(selectedQuote.fromAmount).lte(0)) {
73
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, 'Amount must be greater than 0')];
74
+ }
75
+ const actionList = JSON.stringify(process.path.map(step => step.action));
76
+ const swap = actionList === JSON.stringify([_types.DynamicSwapType.SWAP]);
77
+ const swapXcm = actionList === JSON.stringify([_types.DynamicSwapType.SWAP, _types.DynamicSwapType.BRIDGE]);
78
+ const xcmSwap = actionList === JSON.stringify([_types.DynamicSwapType.BRIDGE, _types.DynamicSwapType.SWAP]);
79
+ const xcmSwapXcm = actionList === JSON.stringify([_types.DynamicSwapType.BRIDGE, _types.DynamicSwapType.SWAP, _types.DynamicSwapType.BRIDGE]);
80
+ const swapIndex = params.process.steps.findIndex(step => step.type === _types.SwapStepType.SWAP); // todo
81
+
82
+ if (swapIndex <= -1) {
83
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR)];
84
+ }
85
+ if (swap) {
86
+ return this.swapBaseHandler.validateSwapOnlyProcess(params, swapIndex); // todo: create interface for input request
87
+ }
88
+ if (swapXcm) {
89
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR)];
90
+ }
91
+ if (xcmSwap) {
92
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR)];
93
+ }
94
+ if (xcmSwapXcm) {
95
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR)];
96
+ }
97
+ return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR)];
98
+ }
99
+ async handleSwapProcess(params) {
100
+ const {
101
+ currentStep,
102
+ process
103
+ } = params;
104
+ const type = process.steps[currentStep].type;
105
+ switch (type) {
106
+ case _types.CommonStepType.DEFAULT:
107
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
108
+ case _types.SwapStepType.SWAP:
109
+ return this.handleSubmitStep(params);
110
+ default:
111
+ return this.handleSubmitStep(params);
112
+ }
113
+ }
114
+ async handleSubmitStep(params) {
115
+ var _fromAsset$metadata, _toAsset$metadata;
116
+ const {
117
+ address,
118
+ quote
119
+ } = params;
120
+ const pair = quote.pair;
121
+ const fromAsset = this.chainService.getAssetBySlug(pair.from);
122
+ const toAsset = this.chainService.getAssetBySlug(pair.to);
123
+ const chainInfo = this.chainService.getChainInfoByKey(fromAsset.originChain);
124
+ const fromNetuid = (0, _utils2._isNativeTokenBySlug)(fromAsset.slug) ? 0 : (_fromAsset$metadata = fromAsset.metadata) === null || _fromAsset$metadata === void 0 ? void 0 : _fromAsset$metadata.netuid;
125
+ const toNetuid = (0, _utils2._isNativeTokenBySlug)(toAsset.slug) ? 0 : (_toAsset$metadata = toAsset.metadata) === null || _toAsset$metadata === void 0 ? void 0 : _toAsset$metadata.netuid;
126
+ if (fromNetuid == null || toNetuid == null || fromNetuid === toNetuid) {
127
+ return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNSUPPORTED));
128
+ }
129
+ const txData = {
130
+ address,
131
+ provider: this.providerInfo,
132
+ quote: params.quote,
133
+ slippage: params.slippage,
134
+ process: params.process
135
+ };
136
+ const chainApi = this.chainService.getSubstrateApi(chainInfo.slug);
137
+ const substrateApi = await chainApi.isReady;
138
+ const _stakeInfo = await substrateApi.api.call.stakeInfoRuntimeApi.getStakeInfoForColdkey(address);
139
+ const stakeInfo = _stakeInfo.toPrimitive();
140
+
141
+ // TAO/ALPHA ratio
142
+ const priceRatio = new _bignumber.default((0, _utils.toBNString)(quote.rate, (0, _utils2._getAssetDecimals)(fromAsset)));
143
+ const limitPrice = priceRatio.multipliedBy(new _bignumber.default(1).minus(params.slippage)).integerValue(_bignumber.default.ROUND_DOWN).toFixed();
144
+ const calls = this.buildSwapCalls({
145
+ stakeInfo,
146
+ fromNetuid,
147
+ toNetuid,
148
+ amount: new _bignumber.default(quote.fromAmount),
149
+ limitPrice
150
+ }, substrateApi.api);
151
+ let extrinsic;
152
+ if (calls.length === 1) {
153
+ extrinsic = calls[0];
154
+ } else {
155
+ extrinsic = substrateApi.api.tx.utility.batchAll(calls);
156
+ }
157
+ return {
158
+ txChain: fromAsset.originChain,
159
+ extrinsic,
160
+ txData,
161
+ extrinsicType: _KoniTypes.ExtrinsicType.SWAP,
162
+ chainType: _KoniTypes.ChainType.SUBSTRATE
163
+ // using staked balance so we do not need transferNativeAmount
164
+ };
165
+ }
166
+
167
+ // Sort hotkeys by stake descending
168
+ getHotkeysByNetuidDesc(stakeInfo, fromNetuid) {
169
+ return stakeInfo.filter(i => i.netuid === fromNetuid && new _bignumber.default(i.stake).gt(0)).sort((a, b) => new _bignumber.default(b.stake).minus(a.stake).toNumber());
170
+ }
171
+ buildSwapCalls(params, api) {
172
+ const {
173
+ amount,
174
+ fromNetuid,
175
+ limitPrice,
176
+ stakeInfo,
177
+ toNetuid
178
+ } = params;
179
+ const hotkeys = this.getHotkeysByNetuidDesc(stakeInfo, fromNetuid);
180
+ let remaining = amount;
181
+ const calls = [];
182
+ for (const item of hotkeys) {
183
+ if (remaining.lte(0)) {
184
+ break;
185
+ }
186
+ const stake = new _bignumber.default(item.stake);
187
+ if (stake.lte(0)) {
188
+ continue;
189
+ }
190
+ const swapAmount = _bignumber.default.minimum(stake, remaining);
191
+ calls.push(api.tx.subtensorModule.swapStakeLimit(item.hotkey, fromNetuid, toNetuid, swapAmount.toFixed(), limitPrice, false));
192
+ remaining = remaining.minus(swapAmount);
193
+ }
194
+ return calls;
195
+ }
196
+ }
197
+ exports.BittensorSwapHandler = BittensorSwapHandler;
@@ -24,6 +24,7 @@ var _subwalletServicesSdk = _interopRequireDefault(require("@subwallet-monorepos
24
24
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
25
25
  var _i18next = require("i18next");
26
26
  var _rxjs = require("rxjs");
27
+ var _bittensorHandler = require("./handler/bittensor-handler");
27
28
  var _kyberHandler = require("./handler/kyber-handler");
28
29
  var _simpleswapHandler = require("./handler/simpleswap-handler");
29
30
  var _uniswapHandler = require("./handler/uniswap-handler");
@@ -296,6 +297,12 @@ class SwapService {
296
297
  case _swap.SwapProviderId.OPTIMEX_TESTNET:
297
298
  this.handlers[providerId] = new _optimexHandler.OptimexHandler(this.chainService, this.state.balanceService, this.state.feeService, true);
298
299
  break;
300
+ case _swap.SwapProviderId.BITTENSOR:
301
+ this.handlers[providerId] = new _bittensorHandler.BittensorSwapHandler(this.chainService, this.state.balanceService, this.state.feeService, false);
302
+ break;
303
+ case _swap.SwapProviderId.BITTENSOR_TESTNET:
304
+ this.handlers[providerId] = new _bittensorHandler.BittensorSwapHandler(this.chainService, this.state.balanceService, this.state.feeService, true);
305
+ break;
299
306
  default:
300
307
  throw new Error('Unsupported provider');
301
308
  }
@@ -937,6 +937,7 @@ class TransactionService {
937
937
  nonce: nonce !== null && nonce !== void 0 ? nonce : 0,
938
938
  startBlock: startBlock || 0,
939
939
  processId: (_transaction$step3 = transaction.step) === null || _transaction$step3 === void 0 ? void 0 : _transaction$step3.processId,
940
+ crossChainFeeInfo: transaction === null || transaction === void 0 ? void 0 : transaction.xcmDestinationFee,
940
941
  substrateProxyAddresses: []
941
942
  };
942
943
  const substrateProxyHistories = [];
@@ -23,6 +23,7 @@ exports.BalanceType = BalanceType;
23
23
  BalanceType["TOTAL"] = "total";
24
24
  BalanceType["TOTAL_MINUS_RESERVED"] = "totalMinusReserved";
25
25
  BalanceType["KEEP_ALIVE"] = "keepAlive";
26
+ BalanceType["STAKING"] = "staking";
26
27
  })(BalanceType || (exports.BalanceType = BalanceType = {}));
27
28
  /** Balance info of all tokens on an address */
28
29
  // Key is tokenSlug
@@ -45,8 +45,10 @@ exports.SwapProviderId = SwapProviderId;
45
45
  SwapProviderId["KYBER"] = "KYBER";
46
46
  SwapProviderId["OPTIMEX"] = "OPTIMEX";
47
47
  SwapProviderId["OPTIMEX_TESTNET"] = "OPTIMEX_TESTNET";
48
+ SwapProviderId["BITTENSOR"] = "BITTENSOR";
49
+ SwapProviderId["BITTENSOR_TESTNET"] = "BITTENSOR_TESTNET";
48
50
  })(SwapProviderId || (exports.SwapProviderId = SwapProviderId = {}));
49
- const _SUPPORTED_SWAP_PROVIDERS = [SwapProviderId.CHAIN_FLIP_TESTNET, SwapProviderId.CHAIN_FLIP_MAINNET, SwapProviderId.HYDRADX_MAINNET, SwapProviderId.POLKADOT_ASSET_HUB, SwapProviderId.KUSAMA_ASSET_HUB, SwapProviderId.SIMPLE_SWAP, SwapProviderId.UNISWAP, SwapProviderId.KYBER, SwapProviderId.OPTIMEX, SwapProviderId.OPTIMEX_TESTNET];
51
+ const _SUPPORTED_SWAP_PROVIDERS = [SwapProviderId.CHAIN_FLIP_TESTNET, SwapProviderId.CHAIN_FLIP_MAINNET, SwapProviderId.HYDRADX_MAINNET, SwapProviderId.POLKADOT_ASSET_HUB, SwapProviderId.KUSAMA_ASSET_HUB, SwapProviderId.SIMPLE_SWAP, SwapProviderId.UNISWAP, SwapProviderId.KYBER, SwapProviderId.OPTIMEX, SwapProviderId.OPTIMEX_TESTNET, SwapProviderId.BITTENSOR, SwapProviderId.BITTENSOR_TESTNET];
50
52
  exports._SUPPORTED_SWAP_PROVIDERS = _SUPPORTED_SWAP_PROVIDERS;
51
53
  // process handling
52
54
  let SwapFeeType;
@@ -16,6 +16,7 @@ var _tonTransfer = require("@subwallet/extension-base/services/balance-service/t
16
16
  var _xcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm");
17
17
  var _acrossBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge");
18
18
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
19
+ var _nativeTokenBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge");
19
20
  var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
20
21
  var _posBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge");
21
22
  var _utils = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
@@ -92,6 +93,7 @@ const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) =
92
93
  feeOption,
93
94
  isTransferLocalTokenAndPayThatTokenAsFee,
94
95
  isTransferNativeTokenAndPayLocalTokenAsFee,
96
+ metadata,
95
97
  nativeToken,
96
98
  srcChain,
97
99
  srcToken,
@@ -194,7 +196,8 @@ const calculateTransferMaxTransferable = async (id, request, freeBalance, fee) =
194
196
  networkKey: srcChain.slug,
195
197
  tokenInfo: srcToken,
196
198
  to: recipient,
197
- substrateApi
199
+ substrateApi,
200
+ metadata
198
201
  });
199
202
  }
200
203
  if (feeChainType === 'evm') {
@@ -348,10 +351,12 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
348
351
  srcChain,
349
352
  srcToken,
350
353
  substrateApi,
354
+ transferAll,
351
355
  value
352
356
  } = request;
353
357
  const feeChainType = fee.type;
354
358
  let estimatedFee = '0';
359
+ let crossChainFee = '0';
355
360
  let feeOptions;
356
361
  let maxTransferable;
357
362
  let error;
@@ -361,7 +366,9 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
361
366
  const isPolygonBridgeTransfer = (0, _polygonBridge._isPolygonChainBridge)(srcChain.slug, destChain.slug);
362
367
  const isPosBridgeTransfer = (0, _posBridge._isPosChainBridge)(srcChain.slug, destChain.slug);
363
368
  const isAcrossBridgeTransfer = (0, _acrossBridge._isAcrossChainBridge)(srcChain.slug, destChain.slug);
364
- const isSubstrateXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer);
369
+ const isBittensorBridgeTransfer = (0, _nativeTokenBridge._isBittensorToSubtensorBridge)(srcChain.slug, destChain.slug);
370
+ const isSubtensorEvmBridgeTransfer = (0, _nativeTokenBridge._isSubtensorToBittensorBridge)(srcChain.slug, destChain.slug);
371
+ const isSubstrateParaspellXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer || isBittensorBridgeTransfer || isSubtensorEvmBridgeTransfer);
365
372
  const fakeAddress = '5DRewsYzhJqZXU3SRaWy1FSt5iDr875ao91aw5fjrJmDG4Ap'; // todo: move this
366
373
  const substrateAddress = fakeAddress; // todo: move this
367
374
  const evmAddress = (0, _util.u8aToHex)((0, _utilCrypto.addressToEvm)(fakeAddress)); // todo: move this
@@ -384,7 +391,8 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
384
391
  evmApi,
385
392
  feeCustom,
386
393
  feeOption,
387
- feeInfo: fee
394
+ feeInfo: fee,
395
+ transferAll
388
396
  };
389
397
  let funcCreateExtrinsic;
390
398
  if (isPosBridgeTransfer || isPolygonBridgeTransfer) {
@@ -392,6 +400,10 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
392
400
  } else if (isAcrossBridgeTransfer) {
393
401
  funcCreateExtrinsic = _xcm.createAcrossBridgeExtrinsic;
394
402
  params.sendingValue = await (0, _acrossBridge.getAcrossSendingValue)(srcChain, srcToken, destChain, (0, _acrossBridge._isAcrossTestnetBridge)(srcChain.slug));
403
+ } else if (isBittensorBridgeTransfer) {
404
+ funcCreateExtrinsic = _xcm.createBittensorToSubtensorEvmExtrinsic;
405
+ } else if (isSubtensorEvmBridgeTransfer) {
406
+ funcCreateExtrinsic = _xcm.createSubtensorEvmToBittensorExtrinsic;
395
407
  } else if (isSnowBridgeEvmTransfer) {
396
408
  funcCreateExtrinsic = _xcm.createSnowBridgeExtrinsic;
397
409
  } else if (isAvailBridgeFromEvm) {
@@ -423,7 +435,8 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
423
435
  };
424
436
  } else if (feeChainType === 'substrate') {
425
437
  // Calculate fee for substrate transaction
426
- if (isSubstrateXcm) {
438
+ if (isSubstrateParaspellXcm) {
439
+ var _xcmFeeInfo$destinati;
427
440
  const xcmFeeInfo = await (0, _utils.estimateXcmFee)({
428
441
  fromChainInfo: params.originChain,
429
442
  fromTokenInfo: params.originTokenInfo,
@@ -433,6 +446,7 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
433
446
  value: params.sendingValue
434
447
  });
435
448
  estimatedFee = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : xcmFeeInfo.origin.fee) || '0';
449
+ crossChainFee = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : (_xcmFeeInfo$destinati = xcmFeeInfo.destination) === null || _xcmFeeInfo$destinati === void 0 ? void 0 : _xcmFeeInfo$destinati.fee) || '0';
436
450
  } else {
437
451
  try {
438
452
  var _paymentInfo$partialF2;
@@ -447,7 +461,8 @@ const calculateXcmMaxTransferable = async (id, request, freeBalance, fee) => {
447
461
  estimatedFee = new _bignumber.default(estimatedFee).plus(tip).toFixed(0);
448
462
  feeOptions = {
449
463
  ...fee,
450
- estimatedFee
464
+ estimatedFee,
465
+ crossChainFee
451
466
  };
452
467
  } else if (feeChainType === 'bitcoin') {
453
468
  feeOptions = {
@@ -21,7 +21,7 @@ export function validateSpendingAndFeePayment(spendingToken, feeToken, bnSpendin
21
21
  }))];
22
22
  }
23
23
  } else {
24
- if (bnFromTokenBalance.lte(bnSpendingAmount.plus(_isNativeToken(spendingToken) ? '0' : _getTokenMinAmount(spendingToken)))) {
24
+ if (bnFromTokenBalance.lt(bnSpendingAmount.plus(_isNativeToken(spendingToken) ? '0' : _getTokenMinAmount(spendingToken)))) {
25
25
  return [new TransactionError(BasicTxErrorType.NOT_ENOUGH_BALANCE, t('bg.core.validation.insufficientSpendingTokenBalance', {
26
26
  replace: {
27
27
  spendingTokenSymbol: spendingToken.symbol
@@ -8,5 +8,7 @@ export declare function _isMythosFromHydrationToMythos(originChainInfo: _ChainIn
8
8
  export declare function _isPolygonBridgeXcm(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean;
9
9
  export declare function _isPosBridgeXcm(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean;
10
10
  export declare function _isAcrossBridgeXcm(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean;
11
+ export declare function _isBittensorToSubtensorEvmBridge(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean;
12
+ export declare function _isSubtensorEvmtoBittensorBridge(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean;
11
13
  export declare function _isAssetHubBridgeXcm(originChainInfo: _ChainInfo, destChainInfo: _ChainInfo): boolean;
12
14
  export declare function _adaptX1Interior(_assetIdentifier: Record<string, any>, version: number): Record<string, any>;
@@ -4,11 +4,12 @@
4
4
  import { COMMON_CHAIN_SLUGS } from '@subwallet/chain-list';
5
5
  import { _isAcrossChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge';
6
6
  import { isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge';
7
+ import { _isBittensorToSubtensorBridge, _isSubtensorToBittensorBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge';
7
8
  import { _isPolygonChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge';
8
9
  import { _isPosChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge';
9
10
  import { _getSubstrateRelayParent, _isPureEvmChain } from '@subwallet/extension-base/services/chain-service/utils';
10
11
  export function _isXcmTransferUnstable(originChainInfo, destChainInfo, assetSlug) {
11
- return !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) && !_isAssetHubBridgeXcm || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug) || _isPolygonBridgeXcm(originChainInfo, destChainInfo) || _isPosBridgeXcm(originChainInfo, destChainInfo);
12
+ return !_isBittensorToSubtensorEvmBridge(originChainInfo, destChainInfo) && !_isSubtensorEvmtoBittensorBridge(originChainInfo, destChainInfo) && !_isXcmWithinSameConsensus(originChainInfo, destChainInfo) && !_isAssetHubBridgeXcm(originChainInfo, destChainInfo) || _isMythosFromHydrationToMythos(originChainInfo, destChainInfo, assetSlug) || _isPolygonBridgeXcm(originChainInfo, destChainInfo) || _isPosBridgeXcm(originChainInfo, destChainInfo);
12
13
  }
13
14
  function getDefaultUnstableWarning() {
14
15
  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';
@@ -81,6 +82,12 @@ export function _isPosBridgeXcm(originChainInfo, destChainInfo) {
81
82
  export function _isAcrossBridgeXcm(originChainInfo, destChainInfo) {
82
83
  return _isAcrossChainBridge(originChainInfo.slug, destChainInfo.slug);
83
84
  }
85
+ export function _isBittensorToSubtensorEvmBridge(originChainInfo, destChainInfo) {
86
+ return _isBittensorToSubtensorBridge(originChainInfo.slug, destChainInfo.slug);
87
+ }
88
+ export function _isSubtensorEvmtoBittensorBridge(originChainInfo, destChainInfo) {
89
+ return _isSubtensorToBittensorBridge(originChainInfo.slug, destChainInfo.slug);
90
+ }
84
91
  export function _isAssetHubBridgeXcm(originChainInfo, destChainInfo) {
85
92
  return originChainInfo.slug === 'statemint' && destChainInfo.slug === 'statemine' || originChainInfo.slug === 'statemine' && destChainInfo.slug === 'statemint';
86
93
  }
@@ -32,9 +32,10 @@ import { createCardanoTransaction } from '@subwallet/extension-base/services/bal
32
32
  import { getERC20TransactionObject, getERC721Transaction, getEVMTransactionObject, getPSP34TransferExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/smart-contract';
33
33
  import { createSubstrateExtrinsic } from '@subwallet/extension-base/services/balance-service/transfer/token';
34
34
  import { createTonTransaction } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer';
35
- import { createAcrossBridgeExtrinsic, createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createPolygonBridgeExtrinsic, createSnowBridgeExtrinsic, createXcmExtrinsicV2, dryRunXcmExtrinsicV2 } from '@subwallet/extension-base/services/balance-service/transfer/xcm';
35
+ import { createAcrossBridgeExtrinsic, createAvailBridgeExtrinsicFromAvail, createAvailBridgeTxFromEth, createBittensorToSubtensorEvmExtrinsic, createPolygonBridgeExtrinsic, createSnowBridgeExtrinsic, createSubtensorEvmToBittensorExtrinsic, createXcmExtrinsicV2, dryRunXcmExtrinsicV2 } from '@subwallet/extension-base/services/balance-service/transfer/xcm';
36
36
  import { _isAcrossChainBridge, getAcrossQuote } from '@subwallet/extension-base/services/balance-service/transfer/xcm/acrossBridge';
37
37
  import { getClaimTxOnAvail, getClaimTxOnEthereum, isAvailChainBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge';
38
+ import { _isBittensorToSubtensorBridge, _isSubtensorToBittensorBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge';
38
39
  import { _isPolygonChainBridge, getClaimPolygonBridge, isClaimedPolygonBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge';
39
40
  import { _isPosChainBridge, getClaimPosBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge';
40
41
  import { estimateXcmFee } from '@subwallet/extension-base/services/balance-service/transfer/xcm/utils';
@@ -1259,6 +1260,7 @@ export default class KoniExtension {
1259
1260
  feeCustom,
1260
1261
  feeOption,
1261
1262
  from,
1263
+ metadata,
1262
1264
  to,
1263
1265
  tokenPayFeeSlug,
1264
1266
  tokenSlug,
@@ -1399,7 +1401,8 @@ export default class KoniExtension {
1399
1401
  networkKey: chain,
1400
1402
  tokenInfo: transferTokenInfo,
1401
1403
  to: to,
1402
- substrateApi
1404
+ substrateApi,
1405
+ metadata
1403
1406
  });
1404
1407
  if (_SUPPORT_TOKEN_PAY_FEE_GROUP.hydration.includes(chain)) {
1405
1408
  var _this$koniState$chain, _substrateApi$api$que;
@@ -1526,11 +1529,18 @@ export default class KoniExtension {
1526
1529
  const isPolygonBridgeTransfer = _isPolygonChainBridge(originNetworkKey, destinationNetworkKey);
1527
1530
  const isPosBridgeTransfer = _isPosChainBridge(originNetworkKey, destinationNetworkKey);
1528
1531
  const isAcrossBridgeTransfer = _isAcrossChainBridge(originNetworkKey, destinationNetworkKey);
1532
+ const isBittensorBridgeTransfer = _isBittensorToSubtensorBridge(originNetworkKey, destinationNetworkKey);
1533
+ const isSubtensorEvmBridgeTransfer = _isSubtensorToBittensorBridge(originNetworkKey, destinationNetworkKey);
1529
1534
  const extrinsicType = ExtrinsicType.TRANSFER_XCM;
1530
- const isSubstrateXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer);
1535
+ const isSubstrateParaspellXcm = !(isAvailBridgeFromEvm || isAvailBridgeFromAvail || isSnowBridgeEvmTransfer || isPolygonBridgeTransfer || isPosBridgeTransfer || isAcrossBridgeTransfer || isBittensorBridgeTransfer || isSubtensorEvmBridgeTransfer);
1531
1536
  const isTransferNative = this.#koniState.getNativeTokenInfo(originNetworkKey).slug === tokenSlug;
1532
1537
  const isTransferLocalTokenAndPayThatTokenAsFee = !isTransferNative && tokenSlug === tokenPayFeeSlug;
1533
1538
  let xcmFeeDryRun;
1539
+ const xcmDestinationFee = {
1540
+ symbol: (destinationTokenInfo === null || destinationTokenInfo === void 0 ? void 0 : destinationTokenInfo.symbol) || '',
1541
+ decimals: (destinationTokenInfo === null || destinationTokenInfo === void 0 ? void 0 : destinationTokenInfo.decimals) || 0,
1542
+ value: '0'
1543
+ };
1534
1544
  let additionalValidator;
1535
1545
  let eventsHandler;
1536
1546
  if (fromKeyPair && destinationTokenInfo) {
@@ -1541,6 +1551,9 @@ export default class KoniExtension {
1541
1551
  if (isPosBridgeTransfer || isPolygonBridgeTransfer) {
1542
1552
  funcCreateExtrinsic = createPolygonBridgeExtrinsic;
1543
1553
  type = 'evm';
1554
+ } else if (isSubtensorEvmBridgeTransfer) {
1555
+ funcCreateExtrinsic = createSubtensorEvmToBittensorExtrinsic;
1556
+ type = 'evm';
1544
1557
  } else if (isAcrossBridgeTransfer) {
1545
1558
  funcCreateExtrinsic = createAcrossBridgeExtrinsic;
1546
1559
  type = 'evm';
@@ -1550,6 +1563,9 @@ export default class KoniExtension {
1550
1563
  } else if (isAvailBridgeFromEvm) {
1551
1564
  funcCreateExtrinsic = createAvailBridgeTxFromEth;
1552
1565
  type = 'evm';
1566
+ } else if (isBittensorBridgeTransfer) {
1567
+ funcCreateExtrinsic = createBittensorToSubtensorEvmExtrinsic;
1568
+ type = 'substrate';
1553
1569
  } else if (isAvailBridgeFromAvail) {
1554
1570
  funcCreateExtrinsic = createAvailBridgeExtrinsicFromAvail;
1555
1571
  type = 'substrate';
@@ -1570,10 +1586,11 @@ export default class KoniExtension {
1570
1586
  evmApi,
1571
1587
  feeCustom,
1572
1588
  feeOption,
1573
- feeInfo
1589
+ feeInfo,
1590
+ transferAll
1574
1591
  };
1575
1592
  extrinsic = await funcCreateExtrinsic(params);
1576
- if (isSubstrateXcm) {
1593
+ if (isSubstrateParaspellXcm) {
1577
1594
  const xcmFeeInfo = await estimateXcmFee({
1578
1595
  fromChainInfo: params.originChain,
1579
1596
  fromTokenInfo: params.originTokenInfo,
@@ -1582,7 +1599,11 @@ export default class KoniExtension {
1582
1599
  sender: params.sender,
1583
1600
  value: params.sendingValue
1584
1601
  });
1602
+
1603
+ // todo: refactor name
1604
+ // todo: check to use full interface to has full AmountData, include symbol, decimal
1585
1605
  xcmFeeDryRun = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : xcmFeeInfo.origin.fee) || '0';
1606
+ xcmDestinationFee.value = (xcmFeeInfo === null || xcmFeeInfo === void 0 ? void 0 : xcmFeeInfo.destination.fee) || '0';
1586
1607
  }
1587
1608
  if (isAcrossBridgeTransfer) {
1588
1609
  const data = await getAcrossQuote(params);
@@ -1650,7 +1671,7 @@ export default class KoniExtension {
1650
1671
  warning.length && inputTransaction.warnings.push(...warning);
1651
1672
  error.length && inputTransaction.errors.push(...error);
1652
1673
  }
1653
- if (isSubstrateXcm) {
1674
+ if (isSubstrateParaspellXcm) {
1654
1675
  const isDryRunSuccess = await dryRunXcmExtrinsicV2(params, false);
1655
1676
  if (!isDryRunSuccess) {
1656
1677
  inputTransaction.errors.push(new TransactionError(BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again'));
@@ -1688,7 +1709,7 @@ export default class KoniExtension {
1688
1709
  transaction: extrinsic,
1689
1710
  data: inputData,
1690
1711
  extrinsicType,
1691
- chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer && !isPosBridgeTransfer && !isAcrossBridgeTransfer ? ChainType.SUBSTRATE : ChainType.EVM,
1712
+ chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer && !isPosBridgeTransfer && !isAcrossBridgeTransfer && !isSubtensorEvmBridgeTransfer ? ChainType.SUBSTRATE : ChainType.EVM,
1692
1713
  transferNativeAmount: _isNativeToken(originTokenInfo) ? value : '0',
1693
1714
  ignoreWarnings,
1694
1715
  tokenPayFeeSlug,
@@ -1696,6 +1717,7 @@ export default class KoniExtension {
1696
1717
  isTransferLocalTokenAndPayThatTokenAsFee,
1697
1718
  isPassConfirmation,
1698
1719
  xcmFeeDryRun,
1720
+ xcmDestinationFee,
1699
1721
  errors,
1700
1722
  additionalValidator: additionalValidator,
1701
1723
  eventsHandler: eventsHandler
@@ -2159,6 +2181,7 @@ export default class KoniExtension {
2159
2181
  destChain: _destChain,
2160
2182
  feeCustom,
2161
2183
  feeOption,
2184
+ metadata,
2162
2185
  to,
2163
2186
  token,
2164
2187
  tokenPayFeeSlug,
@@ -2200,7 +2223,8 @@ export default class KoniExtension {
2200
2223
  isTransferLocalTokenAndPayThatTokenAsFee,
2201
2224
  isTransferNativeTokenAndPayLocalTokenAsFee,
2202
2225
  nativeToken,
2203
- transferAll: transferAll
2226
+ transferAll,
2227
+ metadata
2204
2228
  };
2205
2229
  const subscription = combineLatest({
2206
2230
  freeBalance: freeBalanceSubject,
@@ -4515,7 +4539,8 @@ export default class KoniExtension {
4515
4539
  errorOnTimeOut,
4516
4540
  ...this.createPassConfirmationParams(isPassConfirmation),
4517
4541
  eventsHandler,
4518
- step
4542
+ step,
4543
+ xcmFeeDryRun: extrinsicType === ExtrinsicType.TRANSFER_XCM ? submitData.xcmStepFee : undefined
4519
4544
  });
4520
4545
  }
4521
4546
  async handleYieldLeave(params) {
@@ -5817,6 +5842,8 @@ export default class KoniExtension {
5817
5842
  return await this.reconnectChain(request);
5818
5843
  case 'pri(chainService.disableChain)':
5819
5844
  return await this.disableChain(request);
5845
+ case 'pri(chainService.disableAllChains)':
5846
+ return await this.#koniState.disableAllChains();
5820
5847
  case 'pri(chainService.removeChain)':
5821
5848
  return this.removeCustomChain(request);
5822
5849
  case 'pri(chainService.validateCustomChain)':
@@ -196,6 +196,7 @@ export default class KoniState {
196
196
  forceRemoveChain(networkKey: string): void;
197
197
  private getDefaultNetworkKeys;
198
198
  disableChain(chainSlug: string): Promise<boolean>;
199
+ disableAllChains(): Promise<boolean>;
199
200
  enableChain(chainSlug: string, enableTokens?: boolean): Promise<boolean>;
200
201
  enableChainWithPriorityAssets(chainSlug: string, enableTokens?: boolean): Promise<boolean>;
201
202
  resetDefaultChains(): boolean;
@@ -749,6 +749,26 @@ export default class KoniState {
749
749
  }
750
750
  return this.chainService.disableChain(chainSlug);
751
751
  }
752
+ async disableAllChains() {
753
+ const chainStateMap = this.chainService.getChainStateMap();
754
+ const activeChainSlugs = Object.keys(chainStateMap).filter(slug => chainStateMap[slug].active);
755
+ const failedChainSlugs = [];
756
+ for (const chainSlug of activeChainSlugs) {
757
+ try {
758
+ const isDisabled = await this.disableChain(chainSlug);
759
+ if (!isDisabled) {
760
+ failedChainSlugs.push(chainSlug);
761
+ }
762
+ } catch (error) {
763
+ failedChainSlugs.push(chainSlug);
764
+ this.logger.error(`Failed to disable chain ${chainSlug}`, error);
765
+ }
766
+ }
767
+ if (failedChainSlugs.length) {
768
+ throw new Error('Unable to turn off all networks. Please try again later');
769
+ }
770
+ return true;
771
+ }
752
772
  async enableChain(chainSlug, enableTokens = true) {
753
773
  if (enableTokens) {
754
774
  await this.chainService.updateAssetSettingByChain(chainSlug, true);
package/package.json CHANGED
@@ -17,7 +17,7 @@
17
17
  "./cjs/detectPackage.js"
18
18
  ],
19
19
  "type": "module",
20
- "version": "1.3.77-0",
20
+ "version": "1.3.78-0",
21
21
  "main": "./cjs/index.js",
22
22
  "module": "./index.js",
23
23
  "types": "./index.d.ts",
@@ -804,6 +804,21 @@
804
804
  "require": "./cjs/services/balance-service/transfer/xcm/availBridge.js",
805
805
  "default": "./services/balance-service/transfer/xcm/availBridge.js"
806
806
  },
807
+ "./services/balance-service/transfer/xcm/bittensorBridge": {
808
+ "types": "./services/balance-service/transfer/xcm/bittensorBridge/index.d.ts",
809
+ "require": "./cjs/services/balance-service/transfer/xcm/bittensorBridge/index.js",
810
+ "default": "./services/balance-service/transfer/xcm/bittensorBridge/index.js"
811
+ },
812
+ "./services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge": {
813
+ "types": "./services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.d.ts",
814
+ "require": "./cjs/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js",
815
+ "default": "./services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js"
816
+ },
817
+ "./services/balance-service/transfer/xcm/bittensorBridge/utils": {
818
+ "types": "./services/balance-service/transfer/xcm/bittensorBridge/utils.d.ts",
819
+ "require": "./cjs/services/balance-service/transfer/xcm/bittensorBridge/utils.js",
820
+ "default": "./services/balance-service/transfer/xcm/bittensorBridge/utils.js"
821
+ },
807
822
  "./services/balance-service/transfer/xcm/polygonBridge": {
808
823
  "types": "./services/balance-service/transfer/xcm/polygonBridge.d.ts",
809
824
  "require": "./cjs/services/balance-service/transfer/xcm/polygonBridge.js",
@@ -2091,6 +2106,11 @@
2091
2106
  "require": "./cjs/services/swap-service/handler/base-handler.js",
2092
2107
  "default": "./services/swap-service/handler/base-handler.js"
2093
2108
  },
2109
+ "./services/swap-service/handler/bittensor-handler": {
2110
+ "types": "./services/swap-service/handler/bittensor-handler.d.ts",
2111
+ "require": "./cjs/services/swap-service/handler/bittensor-handler.js",
2112
+ "default": "./services/swap-service/handler/bittensor-handler.js"
2113
+ },
2094
2114
  "./services/swap-service/handler/chainflip-handler": {
2095
2115
  "types": "./services/swap-service/handler/chainflip-handler.d.ts",
2096
2116
  "require": "./cjs/services/swap-service/handler/chainflip-handler.js",
@@ -3008,11 +3028,11 @@
3008
3028
  "@sora-substrate/type-definitions": "^1.17.7",
3009
3029
  "@substrate/connect": "^0.8.9",
3010
3030
  "@subwallet-monorepos/subwallet-services-sdk": "0.1.16",
3011
- "@subwallet/chain-list": "0.2.126",
3012
- "@subwallet/extension-base": "^1.3.77-0",
3013
- "@subwallet/extension-chains": "^1.3.77-0",
3014
- "@subwallet/extension-dapp": "^1.3.77-0",
3015
- "@subwallet/extension-inject": "^1.3.77-0",
3031
+ "@subwallet/chain-list": "0.2.127",
3032
+ "@subwallet/extension-base": "^1.3.78-0",
3033
+ "@subwallet/extension-chains": "^1.3.78-0",
3034
+ "@subwallet/extension-dapp": "^1.3.78-0",
3035
+ "@subwallet/extension-inject": "^1.3.78-0",
3016
3036
  "@subwallet/keyring": "^0.1.14",
3017
3037
  "@subwallet/ui-keyring": "^0.1.14",
3018
3038
  "@ton/core": "^0.56.3",