@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.
Files changed (73) hide show
  1. package/background/KoniTypes.d.ts +12 -0
  2. package/cjs/constants/paraspell-chain-map.js +13 -0
  3. package/cjs/core/logic-validation/transfer.js +13 -1
  4. package/cjs/core/substrate/xcm-parser.js +5 -1
  5. package/cjs/core/utils.js +36 -15
  6. package/cjs/koni/background/handlers/Extension.js +136 -90
  7. package/cjs/koni/background/handlers/State.js +8 -1
  8. package/cjs/packageInfo.js +1 -1
  9. package/cjs/services/balance-service/helpers/process.js +27 -0
  10. package/cjs/services/balance-service/index.js +9 -0
  11. package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +229 -0
  12. package/cjs/services/balance-service/transfer/xcm/index.js +96 -7
  13. package/cjs/services/balance-service/transfer/xcm/utils.js +213 -0
  14. package/cjs/services/chain-service/constants.js +2 -4
  15. package/cjs/services/chain-service/index.js +71 -17
  16. package/cjs/services/chain-service/utils/patch.js +1 -1
  17. package/cjs/services/earning-service/handlers/special.js +18 -9
  18. package/cjs/services/keyring-service/context/handlers/Ledger.js +1 -1
  19. package/cjs/services/keyring-service/context/state.js +3 -0
  20. package/cjs/services/migration-service/scripts/DisableZeroBalanceTokens.js +60 -0
  21. package/cjs/services/migration-service/scripts/EnableChain.js +1 -1
  22. package/cjs/services/migration-service/scripts/index.js +3 -2
  23. package/cjs/services/swap-service/handler/base-handler.js +24 -11
  24. package/cjs/services/transaction-service/utils.js +38 -14
  25. package/cjs/utils/fee/transfer.js +52 -28
  26. package/cjs/utils/staticData/index.js +7 -2
  27. package/constants/paraspell-chain-map.d.ts +1 -0
  28. package/constants/paraspell-chain-map.js +7 -0
  29. package/core/logic-validation/transfer.d.ts +1 -0
  30. package/core/logic-validation/transfer.js +12 -1
  31. package/core/substrate/xcm-parser.d.ts +1 -0
  32. package/core/substrate/xcm-parser.js +4 -1
  33. package/core/utils.d.ts +2 -2
  34. package/core/utils.js +36 -15
  35. package/koni/background/handlers/Extension.d.ts +1 -0
  36. package/koni/background/handlers/Extension.js +60 -15
  37. package/koni/background/handlers/State.d.ts +1 -0
  38. package/koni/background/handlers/State.js +7 -1
  39. package/package.json +23 -7
  40. package/packageInfo.js +1 -1
  41. package/services/balance-service/helpers/process.d.ts +2 -1
  42. package/services/balance-service/helpers/process.js +26 -0
  43. package/services/balance-service/index.js +11 -2
  44. package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +15 -0
  45. package/services/balance-service/transfer/xcm/acrossBridge/index.js +216 -0
  46. package/services/balance-service/transfer/xcm/index.d.ts +5 -1
  47. package/services/balance-service/transfer/xcm/index.js +85 -1
  48. package/services/balance-service/transfer/xcm/utils.d.ts +11 -0
  49. package/services/balance-service/transfer/xcm/utils.js +208 -0
  50. package/services/chain-service/constants.d.ts +0 -1
  51. package/services/chain-service/constants.js +1 -2
  52. package/services/chain-service/index.d.ts +9 -2
  53. package/services/chain-service/index.js +72 -18
  54. package/services/chain-service/utils/patch.js +1 -1
  55. package/services/earning-service/handlers/special.js +19 -10
  56. package/services/keyring-service/context/handlers/Ledger.js +1 -1
  57. package/services/keyring-service/context/state.d.ts +1 -0
  58. package/services/keyring-service/context/state.js +3 -0
  59. package/services/migration-service/scripts/DisableZeroBalanceTokens.d.ts +4 -0
  60. package/services/migration-service/scripts/DisableZeroBalanceTokens.js +51 -0
  61. package/services/migration-service/scripts/EnableChain.js +1 -1
  62. package/services/migration-service/scripts/index.js +3 -2
  63. package/services/swap-service/handler/base-handler.js +25 -12
  64. package/services/transaction-service/types.d.ts +3 -2
  65. package/services/transaction-service/utils.d.ts +1 -0
  66. package/services/transaction-service/utils.js +38 -15
  67. package/types/balance/transfer.d.ts +1 -0
  68. package/types/transaction/request.d.ts +7 -0
  69. package/utils/fee/transfer.d.ts +1 -0
  70. package/utils/fee/transfer.js +54 -30
  71. package/utils/staticData/index.d.ts +4 -1
  72. package/utils/staticData/index.js +5 -1
  73. 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.enableChain(networkKey);
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);
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.3.30-0'
16
+ version: '1.3.31-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -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 _constants = require("@subwallet/extension-base/services/chain-service/constants");
15
- var _utils = require("@subwallet/extension-base/services/chain-service/utils");
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 = _constants._XCM_CHAIN_GROUP.polkadotXcmSpecialCases.includes(originChain.slug) && (0, _utils._isNativeToken)(originTokenInfo);
61
- if (_constants._XCM_CHAIN_GROUP.polkadotXcm.includes(originTokenInfo.originChain) || polkadotXcmSpecialCases) {
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 (_constants._XCM_CHAIN_GROUP.xcmPallet.includes(originTokenInfo.originChain)) {
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);