@subwallet/extension-base 1.3.30-0 → 1.3.31-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 +12 -0
- package/cjs/constants/paraspell-chain-map.js +13 -0
- package/cjs/core/logic-validation/transfer.js +13 -1
- package/cjs/core/substrate/xcm-parser.js +5 -1
- package/cjs/core/utils.js +36 -15
- package/cjs/koni/background/handlers/Extension.js +136 -90
- package/cjs/koni/background/handlers/State.js +8 -1
- package/cjs/packageInfo.js +1 -1
- package/cjs/services/balance-service/helpers/process.js +27 -0
- package/cjs/services/balance-service/index.js +9 -0
- package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +229 -0
- package/cjs/services/balance-service/transfer/xcm/index.js +96 -7
- package/cjs/services/balance-service/transfer/xcm/utils.js +213 -0
- package/cjs/services/chain-service/constants.js +2 -4
- package/cjs/services/chain-service/index.js +71 -17
- package/cjs/services/chain-service/utils/patch.js +1 -1
- package/cjs/services/earning-service/handlers/special.js +18 -9
- package/cjs/services/keyring-service/context/handlers/Ledger.js +1 -1
- package/cjs/services/keyring-service/context/state.js +3 -0
- package/cjs/services/migration-service/scripts/DisableZeroBalanceTokens.js +60 -0
- package/cjs/services/migration-service/scripts/EnableChain.js +1 -1
- package/cjs/services/migration-service/scripts/index.js +3 -2
- package/cjs/services/swap-service/handler/base-handler.js +24 -11
- package/cjs/services/transaction-service/utils.js +38 -14
- package/cjs/utils/fee/transfer.js +52 -28
- package/cjs/utils/staticData/index.js +7 -2
- package/constants/paraspell-chain-map.d.ts +1 -0
- package/constants/paraspell-chain-map.js +7 -0
- package/core/logic-validation/transfer.d.ts +1 -0
- package/core/logic-validation/transfer.js +12 -1
- package/core/substrate/xcm-parser.d.ts +1 -0
- package/core/substrate/xcm-parser.js +4 -1
- package/core/utils.d.ts +2 -2
- package/core/utils.js +36 -15
- package/koni/background/handlers/Extension.d.ts +1 -0
- package/koni/background/handlers/Extension.js +60 -15
- package/koni/background/handlers/State.d.ts +1 -0
- package/koni/background/handlers/State.js +7 -1
- package/package.json +23 -7
- package/packageInfo.js +1 -1
- package/services/balance-service/helpers/process.d.ts +2 -1
- package/services/balance-service/helpers/process.js +26 -0
- package/services/balance-service/index.js +11 -2
- package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +15 -0
- package/services/balance-service/transfer/xcm/acrossBridge/index.js +216 -0
- package/services/balance-service/transfer/xcm/index.d.ts +5 -1
- package/services/balance-service/transfer/xcm/index.js +85 -1
- package/services/balance-service/transfer/xcm/utils.d.ts +11 -0
- package/services/balance-service/transfer/xcm/utils.js +208 -0
- package/services/chain-service/constants.d.ts +0 -1
- package/services/chain-service/constants.js +1 -2
- package/services/chain-service/index.d.ts +9 -2
- package/services/chain-service/index.js +72 -18
- package/services/chain-service/utils/patch.js +1 -1
- package/services/earning-service/handlers/special.js +19 -10
- package/services/keyring-service/context/handlers/Ledger.js +1 -1
- package/services/keyring-service/context/state.d.ts +1 -0
- package/services/keyring-service/context/state.js +3 -0
- package/services/migration-service/scripts/DisableZeroBalanceTokens.d.ts +4 -0
- package/services/migration-service/scripts/DisableZeroBalanceTokens.js +51 -0
- package/services/migration-service/scripts/EnableChain.js +1 -1
- package/services/migration-service/scripts/index.js +3 -2
- package/services/swap-service/handler/base-handler.js +25 -12
- package/services/transaction-service/types.d.ts +3 -2
- package/services/transaction-service/utils.d.ts +1 -0
- package/services/transaction-service/utils.js +38 -15
- package/types/balance/transfer.d.ts +1 -0
- package/types/transaction/request.d.ts +7 -0
- package/utils/fee/transfer.d.ts +1 -0
- package/utils/fee/transfer.js +54 -30
- package/utils/staticData/index.d.ts +4 -1
- package/utils/staticData/index.js +5 -1
- package/utils/staticData/paraSpellChainMap.json +1 -0
|
@@ -438,7 +438,7 @@ class KoniState {
|
|
|
438
438
|
const chainState = this.chainService.getChainStateByKey(networkKey);
|
|
439
439
|
if (authUrls[shortenUrl]) {
|
|
440
440
|
if (chainInfo && !(0, _utils._isChainEnabled)(chainState)) {
|
|
441
|
-
await this.
|
|
441
|
+
await this.enableChainWithPriorityAssets(networkKey);
|
|
442
442
|
}
|
|
443
443
|
authUrls[shortenUrl].currentEvmNetworkKey = networkKey;
|
|
444
444
|
this.setAuthorize(authUrls);
|
|
@@ -712,6 +712,13 @@ class KoniState {
|
|
|
712
712
|
}
|
|
713
713
|
return this.chainService.enableChain(chainSlug);
|
|
714
714
|
}
|
|
715
|
+
async enableChainWithPriorityAssets(chainSlug) {
|
|
716
|
+
let enableTokens = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
|
|
717
|
+
if (enableTokens) {
|
|
718
|
+
await this.chainService.updatePriorityAssetsByChain(chainSlug, true);
|
|
719
|
+
}
|
|
720
|
+
return this.chainService.enableChain(chainSlug);
|
|
721
|
+
}
|
|
715
722
|
resetDefaultChains() {
|
|
716
723
|
const defaultChains = this.getDefaultNetworkKeys();
|
|
717
724
|
return this.chainService.resetChainInfoMap(defaultChains);
|
package/cjs/packageInfo.js
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
exports.getAcrossbridgeTransferProcessFromEvm = getAcrossbridgeTransferProcessFromEvm;
|
|
6
7
|
exports.getDefaultTransferProcess = getDefaultTransferProcess;
|
|
7
8
|
exports.getSnowbridgeTransferProcessFromEvm = getSnowbridgeTransferProcessFromEvm;
|
|
8
9
|
var _chainList = require("@subwallet/chain-list");
|
|
9
10
|
var _serviceBase = require("@subwallet/extension-base/types/service-base");
|
|
11
|
+
var _utils = require("../../chain-service/utils");
|
|
12
|
+
var _acrossBridge = require("../transfer/xcm/acrossBridge");
|
|
10
13
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
11
14
|
// SPDX-License-Identifier: Apache-2.0
|
|
12
15
|
|
|
@@ -41,6 +44,30 @@ async function getSnowbridgeTransferProcessFromEvm(address, evmApi, tokenInfo, a
|
|
|
41
44
|
// if (!allowance || BigInt(allowance) < BigInt(amount)) {
|
|
42
45
|
// }
|
|
43
46
|
|
|
47
|
+
result.steps.push({
|
|
48
|
+
id: result.steps.length,
|
|
49
|
+
type: _serviceBase.CommonStepType.TRANSFER,
|
|
50
|
+
name: 'Transfer'
|
|
51
|
+
});
|
|
52
|
+
result.totalFee.push(_serviceBase.MOCK_STEP_FEE);
|
|
53
|
+
return Promise.resolve(result);
|
|
54
|
+
}
|
|
55
|
+
async function getAcrossbridgeTransferProcessFromEvm(originChainInfo) {
|
|
56
|
+
const chainId = (0, _utils._getEvmChainId)(originChainInfo);
|
|
57
|
+
const SpokePoolAddress = _acrossBridge.SpokePoolMapping[chainId].SpokePool.address;
|
|
58
|
+
const result = {
|
|
59
|
+
totalFee: [_serviceBase.MOCK_STEP_FEE],
|
|
60
|
+
steps: [_serviceBase.DEFAULT_FIRST_STEP]
|
|
61
|
+
};
|
|
62
|
+
result.steps.push({
|
|
63
|
+
id: result.steps.length,
|
|
64
|
+
type: _serviceBase.CommonStepType.TOKEN_APPROVAL,
|
|
65
|
+
name: 'Approve spending',
|
|
66
|
+
metadata: {
|
|
67
|
+
SpokePoolAddress
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
result.totalFee.push(_serviceBase.MOCK_STEP_FEE);
|
|
44
71
|
result.steps.push({
|
|
45
72
|
id: result.steps.length,
|
|
46
73
|
type: _serviceBase.CommonStepType.TRANSFER,
|
|
@@ -22,6 +22,7 @@ var _bignumber = _interopRequireDefault(require("bignumber.js"));
|
|
|
22
22
|
var _i18next = require("i18next");
|
|
23
23
|
var _rxjs = require("rxjs");
|
|
24
24
|
var _util = require("@polkadot/util");
|
|
25
|
+
var _acrossBridge = require("./transfer/xcm/acrossBridge");
|
|
25
26
|
var _BalanceMapImpl = require("./BalanceMapImpl");
|
|
26
27
|
var _helpers = require("./helpers");
|
|
27
28
|
// Copyright 2019-2022 @subwallet/extension-base authors & contributors
|
|
@@ -580,6 +581,14 @@ class BalanceService {
|
|
|
580
581
|
const tokenInfo = this.state.chainService.getAssetBySlug(params.tokenSlug);
|
|
581
582
|
return (0, _process.getSnowbridgeTransferProcessFromEvm)(params.address, evmApi, tokenInfo, params.amount);
|
|
582
583
|
}
|
|
584
|
+
|
|
585
|
+
// Across Bridge
|
|
586
|
+
if ((0, _acrossBridge._isAcrossChainBridge)(originChainInfo.slug, destChainInfo.slug)) {
|
|
587
|
+
const tokenInfo = this.state.chainService.getAssetBySlug(params.tokenSlug);
|
|
588
|
+
if (!(0, _utils._isNativeToken)(tokenInfo)) {
|
|
589
|
+
return (0, _process.getAcrossbridgeTransferProcessFromEvm)(originChainInfo);
|
|
590
|
+
}
|
|
591
|
+
}
|
|
583
592
|
return (0, _process.getDefaultTransferProcess)();
|
|
584
593
|
}
|
|
585
594
|
}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.SpokePoolMapping = void 0;
|
|
8
|
+
exports._isAcrossChainBridge = _isAcrossChainBridge;
|
|
9
|
+
exports._isAcrossTestnetBridge = _isAcrossTestnetBridge;
|
|
10
|
+
exports.getAcrossQuote = void 0;
|
|
11
|
+
var _chainList = require("@subwallet/chain-list");
|
|
12
|
+
var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
|
|
13
|
+
var _subwalletApiSdk = _interopRequireDefault(require("@subwallet/subwallet-api-sdk"));
|
|
14
|
+
// Copyright 2019-2022 @subwallet/extension-base
|
|
15
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
16
|
+
|
|
17
|
+
// Across Bridge
|
|
18
|
+
const acrossPairsMap = new Map([[_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, new Set(['optimism', 'base_mainnet', 'arbitrum_one'])], ['optimism', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, 'base_mainnet', 'arbitrum_one'])], ['base_mainnet', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, 'optimism', 'arbitrum_one'])], ['arbitrum_one', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM, 'optimism', 'base_mainnet'])], [_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA, new Set(['base_sepolia', 'arbitrum_sepolia'])],
|
|
19
|
+
// TESTNET START HERE
|
|
20
|
+
['base_sepolia', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA])], ['arbitrum_sepolia', new Set([_chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA])]]);
|
|
21
|
+
function _isAcrossChainBridge(srcChain, destChain) {
|
|
22
|
+
var _acrossPairsMap$get$h, _acrossPairsMap$get;
|
|
23
|
+
return (_acrossPairsMap$get$h = (_acrossPairsMap$get = acrossPairsMap.get(srcChain)) === null || _acrossPairsMap$get === void 0 ? void 0 : _acrossPairsMap$get.has(destChain)) !== null && _acrossPairsMap$get$h !== void 0 ? _acrossPairsMap$get$h : false;
|
|
24
|
+
}
|
|
25
|
+
function _isAcrossTestnetBridge(srcChain) {
|
|
26
|
+
return srcChain === 'base_sepolia' || srcChain === 'arbitrum_sepolia' || srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA;
|
|
27
|
+
}
|
|
28
|
+
const SpokePoolMapping = {
|
|
29
|
+
1: {
|
|
30
|
+
SpokePool: {
|
|
31
|
+
address: '0x5c7BCd6E7De5423a257D81B442095A1a6ced35C5',
|
|
32
|
+
blockNumber: 17117454
|
|
33
|
+
}
|
|
34
|
+
},
|
|
35
|
+
10: {
|
|
36
|
+
SpokePool: {
|
|
37
|
+
address: '0x6f26Bf09B1C792e3228e5467807a900A503c0281',
|
|
38
|
+
blockNumber: 93903076
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
11155111: {
|
|
42
|
+
SpokePool: {
|
|
43
|
+
address: '0x5ef6C01E11889d86803e0B23e3cB3F9E9d97B662',
|
|
44
|
+
blockNumber: 5288470
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
11155420: {
|
|
48
|
+
SpokePool: {
|
|
49
|
+
address: '0x4e8E101924eDE233C13e2D8622DC8aED2872d505',
|
|
50
|
+
blockNumber: 7762656
|
|
51
|
+
}
|
|
52
|
+
},
|
|
53
|
+
1135: {
|
|
54
|
+
SpokePool: {
|
|
55
|
+
address: '0x9552a0a6624A23B848060AE5901659CDDa1f83f8',
|
|
56
|
+
blockNumber: 2602337
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
130: {
|
|
60
|
+
SpokePool: {
|
|
61
|
+
address: '0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64',
|
|
62
|
+
blockNumber: 7915488
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
137: {
|
|
66
|
+
SpokePool: {
|
|
67
|
+
address: '0x9295ee1d8C5b022Be115A2AD3c30C72E34e7F096',
|
|
68
|
+
blockNumber: 41908657
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
168587773: {
|
|
72
|
+
SpokePool: {
|
|
73
|
+
address: '0x5545092553Cf5Bf786e87a87192E902D50D8f022',
|
|
74
|
+
blockNumber: 7634204
|
|
75
|
+
}
|
|
76
|
+
},
|
|
77
|
+
1868: {
|
|
78
|
+
SpokePool: {
|
|
79
|
+
address: '0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96',
|
|
80
|
+
blockNumber: 1709997
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
288: {
|
|
84
|
+
SpokePool: {
|
|
85
|
+
address: '0xBbc6009fEfFc27ce705322832Cb2068F8C1e0A58',
|
|
86
|
+
blockNumber: 619993
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
324: {
|
|
90
|
+
SpokePool: {
|
|
91
|
+
address: '0xE0B015E54d54fc84a6cB9B666099c46adE9335FF',
|
|
92
|
+
blockNumber: 10352565
|
|
93
|
+
}
|
|
94
|
+
},
|
|
95
|
+
34443: {
|
|
96
|
+
SpokePool: {
|
|
97
|
+
address: '0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96',
|
|
98
|
+
blockNumber: 8043187
|
|
99
|
+
}
|
|
100
|
+
},
|
|
101
|
+
37111: {
|
|
102
|
+
SpokePool: {
|
|
103
|
+
address: '0x6A0a7f39530923911832Dd60667CE5da5449967B',
|
|
104
|
+
blockNumber: 156275
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
41455: {
|
|
108
|
+
SpokePool: {
|
|
109
|
+
address: '0x13fDac9F9b4777705db45291bbFF3c972c6d1d97',
|
|
110
|
+
blockNumber: 4240318
|
|
111
|
+
}
|
|
112
|
+
},
|
|
113
|
+
4202: {
|
|
114
|
+
SpokePool: {
|
|
115
|
+
address: '0xeF684C38F94F48775959ECf2012D7E864ffb9dd4',
|
|
116
|
+
blockNumber: 7267988
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
42161: {
|
|
120
|
+
SpokePool: {
|
|
121
|
+
address: '0xe35e9842fceaCA96570B734083f4a58e8F7C5f2A',
|
|
122
|
+
blockNumber: 83868041
|
|
123
|
+
}
|
|
124
|
+
},
|
|
125
|
+
421614: {
|
|
126
|
+
SpokePool: {
|
|
127
|
+
address: '0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75',
|
|
128
|
+
blockNumber: 12411026
|
|
129
|
+
}
|
|
130
|
+
},
|
|
131
|
+
480: {
|
|
132
|
+
SpokePool: {
|
|
133
|
+
address: '0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64',
|
|
134
|
+
blockNumber: 4524742
|
|
135
|
+
}
|
|
136
|
+
},
|
|
137
|
+
534352: {
|
|
138
|
+
SpokePool: {
|
|
139
|
+
address: '0x3baD7AD0728f9917d1Bf08af5782dCbD516cDd96',
|
|
140
|
+
blockNumber: 7489705
|
|
141
|
+
}
|
|
142
|
+
},
|
|
143
|
+
57073: {
|
|
144
|
+
SpokePool: {
|
|
145
|
+
address: '0xeF684C38F94F48775959ECf2012D7E864ffb9dd4',
|
|
146
|
+
blockNumber: 1139240
|
|
147
|
+
}
|
|
148
|
+
},
|
|
149
|
+
59144: {
|
|
150
|
+
SpokePool: {
|
|
151
|
+
address: '0x7E63A5f1a8F0B4d0934B2f2327DAED3F6bb2ee75',
|
|
152
|
+
blockNumber: 2721169
|
|
153
|
+
}
|
|
154
|
+
},
|
|
155
|
+
690: {
|
|
156
|
+
SpokePool: {
|
|
157
|
+
address: '0x13fDac9F9b4777705db45291bbFF3c972c6d1d97',
|
|
158
|
+
blockNumber: 5512122
|
|
159
|
+
}
|
|
160
|
+
},
|
|
161
|
+
7777777: {
|
|
162
|
+
SpokePool: {
|
|
163
|
+
address: '0x13fDac9F9b4777705db45291bbFF3c972c6d1d97',
|
|
164
|
+
blockNumber: 18382867
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
80002: {
|
|
168
|
+
SpokePool: {
|
|
169
|
+
address: '0xd08baaE74D6d2eAb1F3320B2E1a53eeb391ce8e5',
|
|
170
|
+
blockNumber: 7529960
|
|
171
|
+
}
|
|
172
|
+
},
|
|
173
|
+
81457: {
|
|
174
|
+
SpokePool: {
|
|
175
|
+
address: '0x2D509190Ed0172ba588407D4c2df918F955Cc6E1',
|
|
176
|
+
blockNumber: 5574280
|
|
177
|
+
}
|
|
178
|
+
},
|
|
179
|
+
8453: {
|
|
180
|
+
SpokePool: {
|
|
181
|
+
address: '0x09aea4b2242abC8bb4BB78D537A67a245A7bEC64',
|
|
182
|
+
blockNumber: 2164878
|
|
183
|
+
}
|
|
184
|
+
},
|
|
185
|
+
84532: {
|
|
186
|
+
SpokePool: {
|
|
187
|
+
address: '0x82B564983aE7274c86695917BBf8C99ECb6F0F8F',
|
|
188
|
+
blockNumber: 6082004
|
|
189
|
+
}
|
|
190
|
+
},
|
|
191
|
+
919: {
|
|
192
|
+
SpokePool: {
|
|
193
|
+
address: '0xbd886FC0725Cc459b55BbFEb3E4278610331f83b',
|
|
194
|
+
blockNumber: 13999465
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
};
|
|
198
|
+
exports.SpokePoolMapping = SpokePoolMapping;
|
|
199
|
+
// Calculate fee for across bridge transfer
|
|
200
|
+
const getAcrossQuote = async _ref => {
|
|
201
|
+
let {
|
|
202
|
+
destinationChain,
|
|
203
|
+
destinationTokenInfo,
|
|
204
|
+
originChain,
|
|
205
|
+
originTokenInfo,
|
|
206
|
+
recipient,
|
|
207
|
+
sender,
|
|
208
|
+
sendingValue
|
|
209
|
+
} = _ref;
|
|
210
|
+
const isAcrossBridgeXcm = (0, _xcmParser._isAcrossBridgeXcm)(originChain, destinationChain);
|
|
211
|
+
console.log('sendingValue', sendingValue);
|
|
212
|
+
if (!isAcrossBridgeXcm) {
|
|
213
|
+
throw new Error('This is not a valid AcrossBridge transfer');
|
|
214
|
+
}
|
|
215
|
+
if (!sender) {
|
|
216
|
+
throw new Error('Sender is required');
|
|
217
|
+
}
|
|
218
|
+
try {
|
|
219
|
+
var _subwalletApiSdk$xcmA;
|
|
220
|
+
const data = await ((_subwalletApiSdk$xcmA = _subwalletApiSdk.default.xcmApi) === null || _subwalletApiSdk$xcmA === void 0 ? void 0 : _subwalletApiSdk$xcmA.fetchXcmData(sender, originTokenInfo.slug, destinationTokenInfo.slug, recipient, sendingValue));
|
|
221
|
+
if (!data || !data.metadata) {
|
|
222
|
+
throw new Error('Failed to get AcrossBridge quote');
|
|
223
|
+
}
|
|
224
|
+
return data.metadata;
|
|
225
|
+
} catch (error) {
|
|
226
|
+
return Promise.reject(error);
|
|
227
|
+
}
|
|
228
|
+
};
|
|
229
|
+
exports.getAcrossQuote = getAcrossQuote;
|
|
@@ -1,18 +1,23 @@
|
|
|
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
|
-
exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = void 0;
|
|
7
|
+
exports.dryRunXcmExtrinsicV2 = exports.createXcmExtrinsicV2 = exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = exports.createAcrossBridgeExtrinsic = void 0;
|
|
8
|
+
var _constants = require("@subwallet/extension-base/constants");
|
|
7
9
|
var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
|
|
8
10
|
var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
|
|
9
11
|
var _polkadotXcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polkadotXcm");
|
|
10
12
|
var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
|
|
11
13
|
var _snowBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/snowBridge");
|
|
14
|
+
var _utils = require("@subwallet/extension-base/services/balance-service/transfer/xcm/utils");
|
|
12
15
|
var _xcmPallet = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xcmPallet");
|
|
13
16
|
var _xTokens = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xTokens");
|
|
14
|
-
var
|
|
15
|
-
var
|
|
17
|
+
var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
|
|
18
|
+
var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
|
|
19
|
+
var _utils3 = require("@subwallet/extension-base/utils");
|
|
20
|
+
var _subwalletApiSdk = _interopRequireDefault(require("@subwallet/subwallet-api-sdk"));
|
|
16
21
|
var _posBridge = require("./posBridge");
|
|
17
22
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
18
23
|
// SPDX-License-Identifier: Apache-2.0
|
|
@@ -57,11 +62,11 @@ const createXcmExtrinsic = async _ref2 => {
|
|
|
57
62
|
}
|
|
58
63
|
const chainApi = await substrateApi.isReady;
|
|
59
64
|
const api = chainApi.api;
|
|
60
|
-
const polkadotXcmSpecialCases =
|
|
61
|
-
if (
|
|
65
|
+
const polkadotXcmSpecialCases = _constants2._XCM_CHAIN_GROUP.polkadotXcmSpecialCases.includes(originChain.slug) && (0, _utils2._isNativeToken)(originTokenInfo);
|
|
66
|
+
if (_constants2._XCM_CHAIN_GROUP.polkadotXcm.includes(originTokenInfo.originChain) || polkadotXcmSpecialCases) {
|
|
62
67
|
return (0, _polkadotXcm.getExtrinsicByPolkadotXcmPallet)(originTokenInfo, originChain, destinationChain, recipient, sendingValue, api);
|
|
63
68
|
}
|
|
64
|
-
if (
|
|
69
|
+
if (_constants2._XCM_CHAIN_GROUP.xcmPallet.includes(originTokenInfo.originChain)) {
|
|
65
70
|
return (0, _xcmPallet.getExtrinsicByXcmPalletPallet)(originTokenInfo, originChain, destinationChain, recipient, sendingValue, api);
|
|
66
71
|
}
|
|
67
72
|
return (0, _xTokens.getExtrinsicByXtokensPallet)(originTokenInfo, originChain, destinationChain, recipient, sendingValue, api);
|
|
@@ -127,4 +132,88 @@ const createPolygonBridgeExtrinsic = async _ref5 => {
|
|
|
127
132
|
const createExtrinsic = isPolygonBridgeXcm ? sourceChain === 'polygonzkEvm_cardona' || sourceChain === 'polygonZkEvm' ? _polygonBridge._createPolygonBridgeL2toL1Extrinsic : _polygonBridge._createPolygonBridgeL1toL2Extrinsic : sourceChain === 'polygon_amoy' || sourceChain === 'polygon' ? _posBridge._createPosBridgeL2toL1Extrinsic : _posBridge._createPosBridgeL1toL2Extrinsic;
|
|
128
133
|
return createExtrinsic(originTokenInfo, originChain, sender, recipient, sendingValue, evmApi, feeInfo, feeCustom, feeOption);
|
|
129
134
|
};
|
|
130
|
-
exports.createPolygonBridgeExtrinsic = createPolygonBridgeExtrinsic;
|
|
135
|
+
exports.createPolygonBridgeExtrinsic = createPolygonBridgeExtrinsic;
|
|
136
|
+
const createXcmExtrinsicV2 = async request => {
|
|
137
|
+
try {
|
|
138
|
+
return await (0, _utils.buildXcm)(request);
|
|
139
|
+
} catch (e) {
|
|
140
|
+
console.log('createXcmExtrinsicV2 error: ', e);
|
|
141
|
+
const errorMessage = e instanceof Error ? e.message : 'Unknown error occurred';
|
|
142
|
+
if ((0, _utils.isChainNotSupportPolkadotApi)(errorMessage)) {
|
|
143
|
+
return createXcmExtrinsic(request);
|
|
144
|
+
}
|
|
145
|
+
return undefined;
|
|
146
|
+
}
|
|
147
|
+
};
|
|
148
|
+
exports.createXcmExtrinsicV2 = createXcmExtrinsicV2;
|
|
149
|
+
const dryRunXcmExtrinsicV2 = async request => {
|
|
150
|
+
try {
|
|
151
|
+
return await (0, _utils.dryRunXcmV2)(request);
|
|
152
|
+
} catch (e) {
|
|
153
|
+
const errorMessage = e instanceof Error ? e.message : 'Unknown error occurred';
|
|
154
|
+
if ((0, _utils.isChainNotSupportDryRun)(errorMessage) || (0, _utils.isChainNotSupportPolkadotApi)(errorMessage)) {
|
|
155
|
+
const xcmTransfer = await createXcmExtrinsicV2(request);
|
|
156
|
+
if (!xcmTransfer) {
|
|
157
|
+
return {
|
|
158
|
+
success: false
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
const _xcmFeeInfo = await xcmTransfer.paymentInfo(request.sender);
|
|
162
|
+
const xcmFeeInfo = _xcmFeeInfo.toPrimitive();
|
|
163
|
+
|
|
164
|
+
// skip dry run in this case
|
|
165
|
+
return {
|
|
166
|
+
success: true,
|
|
167
|
+
fee: Math.round(xcmFeeInfo.partialFee * _constants.XCM_MIN_AMOUNT_RATIO).toString()
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
return {
|
|
171
|
+
success: false
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
};
|
|
175
|
+
exports.dryRunXcmExtrinsicV2 = dryRunXcmExtrinsicV2;
|
|
176
|
+
const createAcrossBridgeExtrinsic = async _ref6 => {
|
|
177
|
+
let {
|
|
178
|
+
destinationChain,
|
|
179
|
+
destinationTokenInfo,
|
|
180
|
+
evmApi,
|
|
181
|
+
feeCustom,
|
|
182
|
+
feeInfo,
|
|
183
|
+
feeOption,
|
|
184
|
+
originChain,
|
|
185
|
+
originTokenInfo,
|
|
186
|
+
recipient,
|
|
187
|
+
sender,
|
|
188
|
+
sendingValue
|
|
189
|
+
} = _ref6;
|
|
190
|
+
const isAcrossBridgeXcm = (0, _xcmParser._isAcrossBridgeXcm)(originChain, destinationChain);
|
|
191
|
+
if (!isAcrossBridgeXcm) {
|
|
192
|
+
throw new Error('This is not a valid AcrossBridge transfer');
|
|
193
|
+
}
|
|
194
|
+
if (!evmApi) {
|
|
195
|
+
throw new Error('Evm API is not available');
|
|
196
|
+
}
|
|
197
|
+
if (!sender) {
|
|
198
|
+
throw new Error('Sender is required');
|
|
199
|
+
}
|
|
200
|
+
try {
|
|
201
|
+
var _subwalletApiSdk$xcmA;
|
|
202
|
+
const data = await ((_subwalletApiSdk$xcmA = _subwalletApiSdk.default.xcmApi) === null || _subwalletApiSdk$xcmA === void 0 ? void 0 : _subwalletApiSdk$xcmA.fetchXcmData(sender, originTokenInfo.slug, destinationTokenInfo.slug, recipient, sendingValue));
|
|
203
|
+
const _feeCustom = feeCustom;
|
|
204
|
+
const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, _feeCustom);
|
|
205
|
+
const transactionConfig = {
|
|
206
|
+
from: data === null || data === void 0 ? void 0 : data.sender,
|
|
207
|
+
to: data === null || data === void 0 ? void 0 : data.to,
|
|
208
|
+
value: data === null || data === void 0 ? void 0 : data.value,
|
|
209
|
+
data: data === null || data === void 0 ? void 0 : data.transferEncodedCall,
|
|
210
|
+
...feeCombine
|
|
211
|
+
};
|
|
212
|
+
const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000);
|
|
213
|
+
transactionConfig.gas = gasLimit.toString();
|
|
214
|
+
return transactionConfig;
|
|
215
|
+
} catch (error) {
|
|
216
|
+
return Promise.reject(error);
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
exports.createAcrossBridgeExtrinsic = createAcrossBridgeExtrinsic;
|
|
@@ -4,11 +4,224 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.STABLE_XCM_VERSION = void 0;
|
|
7
|
+
exports.buildXcm = buildXcm;
|
|
8
|
+
exports.dryRunXcm = dryRunXcm;
|
|
9
|
+
exports.dryRunXcmV2 = dryRunXcmV2;
|
|
10
|
+
exports.isChainNotSupportDryRun = isChainNotSupportDryRun;
|
|
11
|
+
exports.isChainNotSupportPolkadotApi = isChainNotSupportPolkadotApi;
|
|
7
12
|
exports.isUseTeleportProtocol = isUseTeleportProtocol;
|
|
13
|
+
var _TransactionError = require("@subwallet/extension-base/background/errors/TransactionError");
|
|
14
|
+
var _paraspellChainMap = require("@subwallet/extension-base/constants/paraspell-chain-map");
|
|
15
|
+
var _types = require("@subwallet/extension-base/types");
|
|
16
|
+
var _util = require("@polkadot/util");
|
|
8
17
|
// Copyright 2019-2022 @subwallet/extension-base
|
|
9
18
|
// SPDX-License-Identifier: Apache-2.0
|
|
10
19
|
|
|
20
|
+
const paraSpellEndpoint = 'https://api.lightspell.xyz';
|
|
21
|
+
const paraSpellApi = {
|
|
22
|
+
buildXcm: `${paraSpellEndpoint}/x-transfer`,
|
|
23
|
+
dryRunXcm: `${paraSpellEndpoint}/dry-run`
|
|
24
|
+
};
|
|
25
|
+
const paraSpellKey = process.env.PARASPELL_API_KEY || '';
|
|
26
|
+
function txHexToSubmittableExtrinsic(api, hex) {
|
|
27
|
+
try {
|
|
28
|
+
(0, _util.assert)((0, _util.isHex)(hex), 'Expected a hex-encoded call');
|
|
29
|
+
let extrinsicCall;
|
|
30
|
+
let extrinsicPayload = null;
|
|
31
|
+
let decoded = null;
|
|
32
|
+
try {
|
|
33
|
+
// attempt to decode with api.tx
|
|
34
|
+
const tx = api.tx(hex);
|
|
35
|
+
|
|
36
|
+
// ensure that the full data matches here
|
|
37
|
+
(0, _util.assert)(tx.toHex() === hex, 'Cannot decode data as extrinsic, length mismatch');
|
|
38
|
+
decoded = tx;
|
|
39
|
+
extrinsicCall = api.createType('Call', decoded.method);
|
|
40
|
+
} catch {
|
|
41
|
+
try {
|
|
42
|
+
// attempt to decode as Call
|
|
43
|
+
extrinsicCall = api.createType('Call', hex);
|
|
44
|
+
const callHex = extrinsicCall.toHex();
|
|
45
|
+
if (callHex === hex) {
|
|
46
|
+
// ok
|
|
47
|
+
} else if (hex.startsWith(callHex)) {
|
|
48
|
+
// this could be an un-prefixed payload...
|
|
49
|
+
const prefixed = (0, _util.u8aConcat)((0, _util.compactToU8a)(extrinsicCall.encodedLength), hex);
|
|
50
|
+
extrinsicPayload = api.createType('ExtrinsicPayload', prefixed);
|
|
51
|
+
(0, _util.assert)((0, _util.u8aEq)(extrinsicPayload.toU8a(), prefixed), 'Unable to decode data as un-prefixed ExtrinsicPayload');
|
|
52
|
+
extrinsicCall = api.createType('Call', extrinsicPayload.method.toHex());
|
|
53
|
+
} else {
|
|
54
|
+
console.error('Unable to decode data as Call, length mismatch in supplied data');
|
|
55
|
+
}
|
|
56
|
+
} catch {
|
|
57
|
+
// final attempt, we try this as-is as a (prefixed) payload
|
|
58
|
+
extrinsicPayload = api.createType('ExtrinsicPayload', hex);
|
|
59
|
+
(0, _util.assert)(extrinsicPayload.toHex() === hex, 'Unable to decode input data as Call, Extrinsic or ExtrinsicPayload');
|
|
60
|
+
extrinsicCall = api.createType('Call', extrinsicPayload.method.toHex());
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
const {
|
|
64
|
+
method,
|
|
65
|
+
section
|
|
66
|
+
} = api.registry.findMetaCall(extrinsicCall.callIndex);
|
|
67
|
+
const extrinsicFn = api.tx[section][method];
|
|
68
|
+
if (!decoded) {
|
|
69
|
+
decoded = extrinsicFn(...extrinsicCall.args);
|
|
70
|
+
}
|
|
71
|
+
return decoded;
|
|
72
|
+
} catch (e) {
|
|
73
|
+
console.error('Failed to decode extrinsic hex', e);
|
|
74
|
+
throw new Error('Failed to decode extrinsic hex');
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
async function buildXcm(request) {
|
|
78
|
+
var _originTokenInfo$meta, _originTokenInfo$meta2;
|
|
79
|
+
const {
|
|
80
|
+
destinationChain,
|
|
81
|
+
originChain,
|
|
82
|
+
originTokenInfo,
|
|
83
|
+
recipient,
|
|
84
|
+
sendingValue,
|
|
85
|
+
substrateApi
|
|
86
|
+
} = request;
|
|
87
|
+
if (!substrateApi) {
|
|
88
|
+
return Promise.reject(new Error('Substrate API is not available'));
|
|
89
|
+
}
|
|
90
|
+
const psAssetType = (_originTokenInfo$meta = originTokenInfo.metadata) === null || _originTokenInfo$meta === void 0 ? void 0 : _originTokenInfo$meta.paraSpellAssetType;
|
|
91
|
+
const psAssetValue = (_originTokenInfo$meta2 = originTokenInfo.metadata) === null || _originTokenInfo$meta2 === void 0 ? void 0 : _originTokenInfo$meta2.paraSpellValue;
|
|
92
|
+
if (!psAssetType || !psAssetValue) {
|
|
93
|
+
throw new Error('Token is not support XCM at this time');
|
|
94
|
+
}
|
|
95
|
+
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
96
|
+
const bodyData = {
|
|
97
|
+
address: recipient,
|
|
98
|
+
from: paraSpellChainMap[originChain.slug],
|
|
99
|
+
to: paraSpellChainMap[destinationChain.slug],
|
|
100
|
+
currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
|
|
101
|
+
};
|
|
102
|
+
const response = await fetch(paraSpellApi.buildXcm, {
|
|
103
|
+
method: 'POST',
|
|
104
|
+
body: JSON.stringify(bodyData),
|
|
105
|
+
headers: {
|
|
106
|
+
'Content-Type': 'application/json',
|
|
107
|
+
Accept: 'application/json',
|
|
108
|
+
'X-API-KEY': paraSpellKey
|
|
109
|
+
}
|
|
110
|
+
});
|
|
111
|
+
if (!response.ok) {
|
|
112
|
+
const error = await response.json();
|
|
113
|
+
throw new Error(error.message);
|
|
114
|
+
}
|
|
115
|
+
const extrinsicHex = await response.text();
|
|
116
|
+
const chainApi = await substrateApi.isReady;
|
|
117
|
+
return txHexToSubmittableExtrinsic(chainApi.api, extrinsicHex);
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// dry run can fail due to sender address & amount token
|
|
121
|
+
async function dryRunXcm(request) {
|
|
122
|
+
var _originTokenInfo$meta3, _originTokenInfo$meta4;
|
|
123
|
+
const {
|
|
124
|
+
destinationChain,
|
|
125
|
+
originChain,
|
|
126
|
+
originTokenInfo,
|
|
127
|
+
recipient,
|
|
128
|
+
sender,
|
|
129
|
+
sendingValue
|
|
130
|
+
} = request;
|
|
131
|
+
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
132
|
+
const psAssetType = (_originTokenInfo$meta3 = originTokenInfo.metadata) === null || _originTokenInfo$meta3 === void 0 ? void 0 : _originTokenInfo$meta3.paraSpellAssetType;
|
|
133
|
+
const psAssetValue = (_originTokenInfo$meta4 = originTokenInfo.metadata) === null || _originTokenInfo$meta4 === void 0 ? void 0 : _originTokenInfo$meta4.paraSpellValue;
|
|
134
|
+
if (!psAssetType || !psAssetValue) {
|
|
135
|
+
throw new Error('Token is not support XCM at this time'); // todo: content
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let dryRunInfo;
|
|
139
|
+
try {
|
|
140
|
+
const bodyData = {
|
|
141
|
+
senderAddress: sender,
|
|
142
|
+
address: recipient,
|
|
143
|
+
from: paraSpellChainMap[originChain.slug],
|
|
144
|
+
to: paraSpellChainMap[destinationChain.slug],
|
|
145
|
+
currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
|
|
146
|
+
};
|
|
147
|
+
const response = await fetch(paraSpellApi.dryRunXcm, {
|
|
148
|
+
method: 'POST',
|
|
149
|
+
body: JSON.stringify(bodyData),
|
|
150
|
+
headers: {
|
|
151
|
+
'Content-Type': 'application/json',
|
|
152
|
+
Accept: 'application/json',
|
|
153
|
+
'X-API-KEY': paraSpellKey
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
dryRunInfo = await response.json();
|
|
157
|
+
} catch (e) {
|
|
158
|
+
console.error('Unable to dry run', e);
|
|
159
|
+
}
|
|
160
|
+
if (!dryRunInfo || !dryRunInfo.success) {
|
|
161
|
+
throw new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, 'Unable to perform transaction. Select another token or destination chain and try again');
|
|
162
|
+
}
|
|
163
|
+
return dryRunInfo;
|
|
164
|
+
}
|
|
165
|
+
async function dryRunXcmV2(request) {
|
|
166
|
+
var _originTokenInfo$meta5, _originTokenInfo$meta6;
|
|
167
|
+
const {
|
|
168
|
+
destinationChain,
|
|
169
|
+
originChain,
|
|
170
|
+
originTokenInfo,
|
|
171
|
+
recipient,
|
|
172
|
+
sender,
|
|
173
|
+
sendingValue
|
|
174
|
+
} = request;
|
|
175
|
+
const paraSpellChainMap = await (0, _paraspellChainMap.fetchParaSpellChainMap)();
|
|
176
|
+
const psAssetType = (_originTokenInfo$meta5 = originTokenInfo.metadata) === null || _originTokenInfo$meta5 === void 0 ? void 0 : _originTokenInfo$meta5.paraSpellAssetType;
|
|
177
|
+
const psAssetValue = (_originTokenInfo$meta6 = originTokenInfo.metadata) === null || _originTokenInfo$meta6 === void 0 ? void 0 : _originTokenInfo$meta6.paraSpellValue;
|
|
178
|
+
if (!psAssetType || !psAssetValue) {
|
|
179
|
+
throw new Error('Token is not support XCM at this time');
|
|
180
|
+
}
|
|
181
|
+
const bodyData = {
|
|
182
|
+
senderAddress: sender,
|
|
183
|
+
address: recipient,
|
|
184
|
+
from: paraSpellChainMap[originChain.slug],
|
|
185
|
+
to: paraSpellChainMap[destinationChain.slug],
|
|
186
|
+
currency: createParaSpellCurrency(psAssetType, psAssetValue, sendingValue)
|
|
187
|
+
};
|
|
188
|
+
const response = await fetch(paraSpellApi.dryRunXcm, {
|
|
189
|
+
method: 'POST',
|
|
190
|
+
body: JSON.stringify(bodyData),
|
|
191
|
+
headers: {
|
|
192
|
+
'Content-Type': 'application/json',
|
|
193
|
+
Accept: 'application/json',
|
|
194
|
+
'X-API-KEY': paraSpellKey
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
if (!response.ok) {
|
|
198
|
+
const error = await response.json();
|
|
199
|
+
throw new Error(error.message);
|
|
200
|
+
}
|
|
201
|
+
return await response.json();
|
|
202
|
+
}
|
|
203
|
+
function createParaSpellCurrency(assetType, assetValue, amount) {
|
|
204
|
+
// todo: handle complex conditions for asset has same symbol in a chain: Id, Multi-location, ...
|
|
205
|
+
return {
|
|
206
|
+
[assetType]: assetValue,
|
|
207
|
+
amount
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
function isChainNotSupportPolkadotApi(str) {
|
|
211
|
+
const regex = /(?=.*not yet supported)(?=.*Polkadot API).*/i; // Example: The node Interlay is not yet supported by the Polkadot API.
|
|
212
|
+
|
|
213
|
+
return regex.test(str);
|
|
214
|
+
}
|
|
215
|
+
function isChainNotSupportDryRun(str) {
|
|
216
|
+
const regex = /(?=.*DryRunApi)(?=.*not available).*/i; // Example: DryRunApi is not available on node Acala
|
|
217
|
+
|
|
218
|
+
return regex.test(str);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// todo: remove
|
|
11
222
|
const STABLE_XCM_VERSION = 3;
|
|
223
|
+
|
|
224
|
+
// todo: remove
|
|
12
225
|
exports.STABLE_XCM_VERSION = STABLE_XCM_VERSION;
|
|
13
226
|
function isUseTeleportProtocol(originChainInfo, destChainInfo, tokenSlug) {
|
|
14
227
|
const relayChainToSystemChain = ['polkadot'].includes(originChainInfo.slug) && ['statemint'].includes(destChainInfo.slug) || ['kusama'].includes(originChainInfo.slug) && ['statemine'].includes(destChainInfo.slug) || ['rococo'].includes(originChainInfo.slug) && ['rococo_assethub'].includes(destChainInfo.slug) || ['westend'].includes(originChainInfo.slug) && ['westend_assethub'].includes(destChainInfo.slug);
|