@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.
- package/background/KoniTypes.d.ts +2 -0
- package/cjs/core/logic-validation/index.js +1 -1
- package/cjs/core/substrate/xcm-parser.js +10 -1
- package/cjs/koni/background/handlers/Extension.js +35 -8
- package/cjs/koni/background/handlers/State.js +20 -0
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/subscribe/evm.js +85 -6
- package/cjs/services/balance-service/helpers/subscribe/index.js +2 -1
- package/cjs/services/balance-service/index.js +6 -2
- package/cjs/services/balance-service/transfer/token.js +15 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/index.js +27 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +58 -0
- package/cjs/services/balance-service/transfer/xcm/bittensorBridge/utils.js +36 -0
- package/cjs/services/balance-service/transfer/xcm/index.js +61 -2
- package/cjs/services/balance-service/transfer/xcm/utils.js +94 -6
- package/cjs/services/chain-service/constants.js +4 -2
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/constants/chains.js +4 -2
- package/cjs/services/earning-service/handlers/special.js +82 -65
- package/cjs/services/earning-service/service.js +1 -0
- package/cjs/services/swap-service/handler/bittensor-handler.js +197 -0
- package/cjs/services/swap-service/index.js +7 -0
- package/cjs/services/transaction-service/index.js +1 -0
- package/cjs/types/balance/index.js +1 -0
- package/cjs/types/swap/index.js +3 -1
- package/cjs/utils/fee/transfer.js +20 -5
- package/core/logic-validation/index.js +1 -1
- package/core/substrate/xcm-parser.d.ts +2 -0
- package/core/substrate/xcm-parser.js +8 -1
- package/koni/background/handlers/Extension.js +36 -9
- package/koni/background/handlers/State.d.ts +1 -0
- package/koni/background/handlers/State.js +20 -0
- package/package.json +26 -6
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/subscribe/evm.d.ts +1 -0
- package/services/balance-service/helpers/subscribe/evm.js +76 -1
- package/services/balance-service/helpers/subscribe/index.js +2 -1
- package/services/balance-service/index.js +6 -2
- package/services/balance-service/transfer/token.d.ts +2 -1
- package/services/balance-service/transfer/token.js +15 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/index.d.ts +2 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/index.js +5 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.d.ts +6 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/nativeTokenBridge.js +50 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/utils.d.ts +8 -0
- package/services/balance-service/transfer/xcm/bittensorBridge/utils.js +29 -0
- package/services/balance-service/transfer/xcm/index.d.ts +5 -0
- package/services/balance-service/transfer/xcm/index.js +57 -2
- package/services/balance-service/transfer/xcm/utils.d.ts +3 -2
- package/services/balance-service/transfer/xcm/utils.js +87 -1
- package/services/chain-service/constants.d.ts +2 -0
- package/services/chain-service/constants.js +4 -2
- package/services/chain-service/utils/patch.d.ts +1 -1
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/constants/chains.d.ts +1 -0
- package/services/earning-service/constants/chains.js +2 -1
- package/services/earning-service/handlers/special.d.ts +1 -1
- package/services/earning-service/handlers/special.js +85 -68
- package/services/earning-service/service.js +1 -0
- package/services/swap-service/handler/bittensor-handler.d.ts +21 -0
- package/services/swap-service/handler/bittensor-handler.js +189 -0
- package/services/swap-service/index.js +7 -0
- package/services/transaction-service/index.js +1 -0
- package/services/transaction-service/types.d.ts +4 -3
- package/types/balance/index.d.ts +3 -1
- package/types/balance/index.js +1 -0
- package/types/balance/transfer.d.ts +7 -0
- package/types/fee/base.d.ts +1 -0
- package/types/swap/index.d.ts +3 -1
- package/types/swap/index.js +3 -1
- package/types/yield/actions/join/step.d.ts +6 -0
- package/types/yield/actions/join/submit.d.ts +1 -0
- package/utils/fee/transfer.d.ts +1 -0
- 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
|
package/cjs/types/swap/index.js
CHANGED
|
@@ -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
|
|
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 (
|
|
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.
|
|
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
|
|
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 (
|
|
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 (
|
|
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
|
|
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.
|
|
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.
|
|
3012
|
-
"@subwallet/extension-base": "^1.3.
|
|
3013
|
-
"@subwallet/extension-chains": "^1.3.
|
|
3014
|
-
"@subwallet/extension-dapp": "^1.3.
|
|
3015
|
-
"@subwallet/extension-inject": "^1.3.
|
|
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",
|