@subwallet/extension-base 1.2.29-0 → 1.2.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 (33) hide show
  1. package/background/KoniTypes.d.ts +2 -2
  2. package/cjs/constants/blocked-actions-list.js +15 -0
  3. package/cjs/constants/index.js +12 -0
  4. package/cjs/core/logic-validation/transfer.js +166 -0
  5. package/cjs/koni/background/handlers/Extension.js +34 -10
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/balance-service/helpers/subscribe/index.js +2 -2
  8. package/cjs/services/balance-service/helpers/subscribe/substrate/gear.js +6 -4
  9. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +6 -6
  10. package/cjs/services/swap-service/handler/chainflip-handler.js +47 -19
  11. package/cjs/services/swap-service/utils.js +34 -3
  12. package/cjs/services/transaction-service/index.js +7 -1
  13. package/cjs/utils/staticData/index.js +7 -2
  14. package/constants/blocked-actions-list.d.ts +7 -0
  15. package/constants/blocked-actions-list.js +8 -0
  16. package/constants/index.d.ts +1 -0
  17. package/constants/index.js +2 -1
  18. package/core/logic-validation/transfer.d.ts +2 -0
  19. package/core/logic-validation/transfer.js +164 -0
  20. package/koni/background/handlers/Extension.js +35 -11
  21. package/package.json +16 -10
  22. package/packageInfo.js +1 -1
  23. package/services/balance-service/helpers/subscribe/index.js +2 -2
  24. package/services/balance-service/helpers/subscribe/substrate/gear.js +6 -4
  25. package/services/earning-service/handlers/liquid-staking/stella-swap.js +6 -6
  26. package/services/swap-service/handler/chainflip-handler.d.ts +4 -2
  27. package/services/swap-service/handler/chainflip-handler.js +47 -20
  28. package/services/swap-service/utils.d.ts +12 -0
  29. package/services/swap-service/utils.js +32 -3
  30. package/services/transaction-service/index.js +9 -3
  31. package/utils/staticData/blockedActionsFeatures.json +39 -0
  32. package/utils/staticData/index.d.ts +4 -1
  33. package/utils/staticData/index.js +5 -1
@@ -1652,8 +1652,8 @@ export interface KoniRequestSignatures {
1652
1652
  'pri(accounts.inject.add)': [RequestAddInjectedAccounts, boolean];
1653
1653
  'pri(accounts.inject.remove)': [RequestRemoveInjectedAccounts, boolean];
1654
1654
  'pri(derivation.createV2)': [RequestDeriveCreateV2, boolean];
1655
- 'pri(json.restoreV2)': [RequestJsonRestoreV2, void];
1656
- 'pri(json.batchRestoreV2)': [RequestBatchRestoreV2, void];
1655
+ 'pri(json.restoreV2)': [RequestJsonRestoreV2, string[]];
1656
+ 'pri(json.batchRestoreV2)': [RequestBatchRestoreV2, string[]];
1657
1657
  'pri(accounts.batchExportV2)': [RequestAccountBatchExportV2, ResponseAccountBatchExportV2];
1658
1658
  'pri(accounts.exportPrivateKey)': [RequestAccountExportPrivateKey, ResponseAccountExportPrivateKey];
1659
1659
  'pri(accounts.subscribeWithCurrentAddress)': [RequestAccountSubscribe, AccountsWithCurrentAddress, AccountsWithCurrentAddress];
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.fetchLastestBlockedActionsAndFeatures = void 0;
7
+ var _utils = require("@subwallet/extension-base/utils");
8
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
9
+ // SPDX-License-Identifier: Apache-2.0
10
+
11
+ const BLOCKED_ACTIONS_AND_FEATURES_PROMISE = (0, _utils.fetchStaticData)('blocked-actions-features');
12
+ const fetchLastestBlockedActionsAndFeatures = async () => {
13
+ return await BLOCKED_ACTIONS_AND_FEATURES_PROMISE;
14
+ };
15
+ exports.fetchLastestBlockedActionsAndFeatures = fetchLastestBlockedActionsAndFeatures;
@@ -62,6 +62,18 @@ Object.keys(_storage).forEach(function (key) {
62
62
  }
63
63
  });
64
64
  });
65
+ var _blockedActionsList = require("./blocked-actions-list");
66
+ Object.keys(_blockedActionsList).forEach(function (key) {
67
+ if (key === "default" || key === "__esModule") return;
68
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
69
+ if (key in exports && exports[key] === _blockedActionsList[key]) return;
70
+ Object.defineProperty(exports, key, {
71
+ enumerable: true,
72
+ get: function () {
73
+ return _blockedActionsList[key];
74
+ }
75
+ });
76
+ });
65
77
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
66
78
  // SPDX-License-Identifier: Apache-2.0
67
79
 
@@ -8,6 +8,8 @@ exports.additionalValidateTransfer = additionalValidateTransfer;
8
8
  exports.additionalValidateXcmTransfer = additionalValidateXcmTransfer;
9
9
  exports.checkBalanceWithTransactionFee = checkBalanceWithTransactionFee;
10
10
  exports.checkSigningAccountForTransaction = checkSigningAccountForTransaction;
11
+ exports.checkSupportForAction = checkSupportForAction;
12
+ exports.checkSupportForFeature = checkSupportForFeature;
11
13
  exports.checkSupportForTransaction = checkSupportForTransaction;
12
14
  exports.estimateFeeForTransaction = estimateFeeForTransaction;
13
15
  exports.validateTransferRequest = validateTransferRequest;
@@ -152,6 +154,170 @@ function additionalValidateXcmTransfer(originTokenInfo, destinationTokenInfo, se
152
154
  }
153
155
  return [warning, error];
154
156
  }
157
+ function checkSupportForFeature(validationResponse, blockedFeaturesList, chainInfo) {
158
+ const extrinsicType = validationResponse.extrinsicType;
159
+ const chain = validationResponse.chain;
160
+ const currentFeature = `${extrinsicType}___${chain}`;
161
+ if (blockedFeaturesList.includes(currentFeature)) {
162
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED, (0, _i18next.t)(`Feature under maintenance on ${chainInfo.name} network. Try again later`)));
163
+ }
164
+ }
165
+ function checkSupportForAction(validationResponse, blockedActionsMap) {
166
+ const extrinsicType = validationResponse.extrinsicType;
167
+ let currentAction = '';
168
+ switch (extrinsicType) {
169
+ case _KoniTypes.ExtrinsicType.TRANSFER_BALANCE:
170
+
171
+ // eslint-disable-next-line no-fallthrough
172
+ case _KoniTypes.ExtrinsicType.TRANSFER_TOKEN:
173
+ {
174
+ const data = validationResponse.data;
175
+ const tokenSlug = data.tokenSlug;
176
+ currentAction = `${extrinsicType}___${tokenSlug}`;
177
+ break;
178
+ }
179
+ case _KoniTypes.ExtrinsicType.TRANSFER_XCM:
180
+ {
181
+ const data = validationResponse.data;
182
+ const tokenSlug = data.tokenSlug;
183
+ const destinationNetworkKey = data.destinationNetworkKey;
184
+ currentAction = `${extrinsicType}___${tokenSlug}___${destinationNetworkKey}`;
185
+ break;
186
+ }
187
+ case _KoniTypes.ExtrinsicType.SEND_NFT:
188
+ {
189
+ const data = validationResponse.data;
190
+ const networkKey = data.networkKey;
191
+ const collectionId = data.nftItem.collectionId;
192
+ currentAction = `${extrinsicType}___${networkKey}___${collectionId}`;
193
+ break;
194
+ }
195
+ case _KoniTypes.ExtrinsicType.SWAP:
196
+ {
197
+ const data = validationResponse.data;
198
+ const pairSlug = data.quote.pair.slug;
199
+ const providerId = data.provider.id;
200
+ currentAction = `${extrinsicType}___${pairSlug}___${providerId}`;
201
+ break;
202
+ }
203
+ case _KoniTypes.ExtrinsicType.STAKING_BOND:
204
+ {
205
+ const data = validationResponse.data;
206
+ const chain = data.chain;
207
+ currentAction = `${extrinsicType}___${chain}`;
208
+ break;
209
+ }
210
+ case _KoniTypes.ExtrinsicType.STAKING_LEAVE_POOL:
211
+ {
212
+ const data = validationResponse.data;
213
+ const slug = data.slug;
214
+ currentAction = `${extrinsicType}___${slug}`;
215
+ break;
216
+ }
217
+ case _KoniTypes.ExtrinsicType.STAKING_UNBOND:
218
+ {
219
+ const data = validationResponse.data;
220
+ const chain = data.chain;
221
+ currentAction = `${extrinsicType}___${chain}`;
222
+ break;
223
+ }
224
+ case _KoniTypes.ExtrinsicType.STAKING_CLAIM_REWARD:
225
+ {
226
+ const data = validationResponse.data;
227
+ const slug = data.slug;
228
+ currentAction = `${extrinsicType}___${slug}`;
229
+ break;
230
+ }
231
+ case _KoniTypes.ExtrinsicType.STAKING_WITHDRAW:
232
+ {
233
+ const data = validationResponse.data;
234
+ const slug = data.slug;
235
+ currentAction = `${extrinsicType}___${slug}`;
236
+ break;
237
+ }
238
+ case _KoniTypes.ExtrinsicType.STAKING_COMPOUNDING:
239
+ {
240
+ const data = validationResponse.data;
241
+ const networkKey = data.networkKey;
242
+ currentAction = `${extrinsicType}___${networkKey}`;
243
+ break;
244
+ }
245
+ case _KoniTypes.ExtrinsicType.STAKING_CANCEL_COMPOUNDING:
246
+ {
247
+ const data = validationResponse.data;
248
+ const networkKey = data.networkKey;
249
+ currentAction = `${extrinsicType}___${networkKey}`;
250
+ break;
251
+ }
252
+ case _KoniTypes.ExtrinsicType.STAKING_CANCEL_UNSTAKE:
253
+ {
254
+ const data = validationResponse.data;
255
+ const slug = data.slug;
256
+ currentAction = `${extrinsicType}___${slug}`;
257
+ break;
258
+ }
259
+ case _KoniTypes.ExtrinsicType.JOIN_YIELD_POOL:
260
+ {
261
+ const data = validationResponse.data;
262
+ const slug = data.data.slug;
263
+ currentAction = `${extrinsicType}___${slug}`;
264
+ break;
265
+ }
266
+ case _KoniTypes.ExtrinsicType.MINT_VDOT:
267
+ case _KoniTypes.ExtrinsicType.MINT_LDOT:
268
+ case _KoniTypes.ExtrinsicType.MINT_SDOT:
269
+ case _KoniTypes.ExtrinsicType.MINT_QDOT:
270
+ case _KoniTypes.ExtrinsicType.MINT_STDOT:
271
+
272
+ // eslint-disable-next-line no-fallthrough
273
+ case _KoniTypes.ExtrinsicType.MINT_VMANTA:
274
+ {
275
+ const data = validationResponse.data;
276
+ const slug = data.slug;
277
+ currentAction = `${extrinsicType}___${slug}`;
278
+ break;
279
+ }
280
+ case _KoniTypes.ExtrinsicType.REDEEM_VDOT:
281
+ case _KoniTypes.ExtrinsicType.REDEEM_LDOT:
282
+ case _KoniTypes.ExtrinsicType.REDEEM_SDOT:
283
+ case _KoniTypes.ExtrinsicType.REDEEM_QDOT:
284
+ case _KoniTypes.ExtrinsicType.REDEEM_STDOT:
285
+
286
+ // eslint-disable-next-line no-fallthrough
287
+ case _KoniTypes.ExtrinsicType.REDEEM_VMANTA:
288
+ {
289
+ const data = validationResponse.data;
290
+ const slug = data.slug;
291
+ currentAction = `${extrinsicType}___${slug}`;
292
+ break;
293
+ }
294
+ case _KoniTypes.ExtrinsicType.UNSTAKE_VDOT:
295
+ case _KoniTypes.ExtrinsicType.UNSTAKE_LDOT:
296
+ case _KoniTypes.ExtrinsicType.UNSTAKE_SDOT:
297
+ case _KoniTypes.ExtrinsicType.UNSTAKE_QDOT:
298
+ case _KoniTypes.ExtrinsicType.UNSTAKE_STDOT:
299
+
300
+ // eslint-disable-next-line no-fallthrough
301
+ case _KoniTypes.ExtrinsicType.UNSTAKE_VMANTA:
302
+ {
303
+ const data = validationResponse.data;
304
+ const slug = data.slug;
305
+ currentAction = `${extrinsicType}___${slug}`;
306
+ break;
307
+ }
308
+ case _KoniTypes.ExtrinsicType.TOKEN_SPENDING_APPROVAL:
309
+ {
310
+ const data = validationResponse.data;
311
+ const chain = data.chain;
312
+ currentAction = `${extrinsicType}___${chain}`;
313
+ break;
314
+ }
315
+ }
316
+ const blockedActionsList = Object.values(blockedActionsMap).flat();
317
+ if (blockedActionsList.includes(currentAction)) {
318
+ validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.UNSUPPORTED, (0, _i18next.t)('Feature under maintenance. Try again later')));
319
+ }
320
+ }
155
321
 
156
322
  // general validations
157
323
  function checkSupportForTransaction(validationResponse, transaction) {
@@ -1431,6 +1431,10 @@ class KoniExtension {
1431
1431
  withMasterPassword
1432
1432
  } = _ref43;
1433
1433
  const isPasswordValidated = this.validatePassword(file, password);
1434
+ const {
1435
+ promise,
1436
+ resolve
1437
+ } = (0, _utils4.createPromiseHandler)();
1434
1438
  if (isPasswordValidated) {
1435
1439
  try {
1436
1440
  this._saveCurrentAccountAddress(address, () => {
@@ -1445,10 +1449,12 @@ class KoniExtension {
1445
1449
  });
1446
1450
  }
1447
1451
  this._addAddressToAuthList(address, isAllowed);
1452
+ resolve([address]);
1448
1453
  });
1449
1454
  if (this.#alwaysLock) {
1450
1455
  this.keyringLock();
1451
1456
  }
1457
+ return promise;
1452
1458
  } catch (error) {
1453
1459
  throw new Error(error.message);
1454
1460
  }
@@ -1465,17 +1471,35 @@ class KoniExtension {
1465
1471
  } = _ref44;
1466
1472
  const addressList = accountsInfo.map(acc => acc.address);
1467
1473
  const isPasswordValidated = this.validatedAccountsPassword(file, password);
1474
+ const {
1475
+ promise,
1476
+ resolve
1477
+ } = (0, _utils4.createPromiseHandler)();
1468
1478
  if (isPasswordValidated) {
1469
1479
  try {
1470
1480
  this._saveCurrentAccountAddress(_constants.ALL_ACCOUNT_KEY, () => {
1471
1481
  _uiKeyring.keyring.restoreAccounts(file, password);
1472
1482
  this.#koniState.keyringService.removeNoneHardwareGenesisHash();
1473
- this._addAddressesToAuthList(addressList, isAllowed);
1483
+ const successAddressList = addressList.reduce((addressList, address) => {
1484
+ try {
1485
+ const account = _uiKeyring.keyring.getPair(address);
1486
+ if (account) {
1487
+ addressList.push(address);
1488
+ }
1489
+ } catch (error) {
1490
+ console.log(error);
1491
+ }
1492
+ return addressList;
1493
+ }, []);
1494
+ this._addAddressesToAuthList(successAddressList, isAllowed);
1495
+ resolve(successAddressList);
1474
1496
  });
1475
1497
 
1476
1498
  // if (this.#alwaysLock) {
1477
1499
  // this.keyringLock();
1478
1500
  // }
1501
+
1502
+ return promise;
1479
1503
  } catch (error) {
1480
1504
  throw new Error(error.message);
1481
1505
  }
@@ -2003,8 +2027,9 @@ class KoniExtension {
2003
2027
  const substrateApi = this.#koniState.chainService.getSubstrateApi(originTokenInfo.originChain);
2004
2028
  const chainInfoMap = this.#koniState.chainService.getChainInfoMap();
2005
2029
  const destinationTokenInfo = this.#koniState.getXcmEqualAssetByChain(destChain, originTokenInfo.slug);
2030
+ const existentialDeposit = originTokenInfo.minAmount || '0';
2006
2031
  if (destinationTokenInfo) {
2007
- const [bnMockFee, {
2032
+ const [bnMockExecutionFee, {
2008
2033
  value
2009
2034
  }] = await Promise.all([(0, _xcm.getXcmMockTxFee)(substrateApi, chainInfoMap, originTokenInfo, destinationTokenInfo), this.getAddressTransferableBalance({
2010
2035
  extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
@@ -2013,8 +2038,7 @@ class KoniExtension {
2013
2038
  token: originTokenInfo.slug
2014
2039
  })]);
2015
2040
  const bnMaxTransferable = new _bignumber.default(value);
2016
- const estimatedFee = bnMockFee.multipliedBy(_constants.XCM_FEE_RATIO); // multiply by weight to account for destination chain fee
2017
-
2041
+ const estimatedFee = bnMockExecutionFee.multipliedBy(_constants.XCM_FEE_RATIO).plus(new _bignumber.default(existentialDeposit));
2018
2042
  return bnMaxTransferable.minus(estimatedFee);
2019
2043
  }
2020
2044
  return new _bignumber.default(0);
@@ -3051,14 +3075,14 @@ class KoniExtension {
3051
3075
  } else {
3052
3076
  metadata = await this.#koniState.chainService.getMetadataByHash(payload.genesisHash);
3053
3077
  if (metadata) {
3054
- var _chainInfo$substrateI, _chainInfo$substrateI2, _chainInfo$substrateI3;
3078
+ var _chainInfo$substrateI, _chainInfo$substrateI2, _chainInfo$substrateI3, _chainInfo$substrateI4;
3055
3079
  registry = new _types3.TypeRegistry();
3056
3080
  const _metadata = new _types3.Metadata(registry, metadata.hexValue);
3057
3081
  registry.register(metadata.types);
3058
3082
  registry.setChainProperties(registry.createType('ChainProperties', {
3059
- ss58Format: (chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI = chainInfo.substrateInfo) === null || _chainInfo$substrateI === void 0 ? void 0 : _chainInfo$substrateI.addressPrefix) || 42,
3060
- tokenDecimals: chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI2 = chainInfo.substrateInfo) === null || _chainInfo$substrateI2 === void 0 ? void 0 : _chainInfo$substrateI2.decimals,
3061
- tokenSymbol: chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI3 = chainInfo.substrateInfo) === null || _chainInfo$substrateI3 === void 0 ? void 0 : _chainInfo$substrateI3.symbol
3083
+ ss58Format: (_chainInfo$substrateI = chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI2 = chainInfo.substrateInfo) === null || _chainInfo$substrateI2 === void 0 ? void 0 : _chainInfo$substrateI2.addressPrefix) !== null && _chainInfo$substrateI !== void 0 ? _chainInfo$substrateI : 42,
3084
+ tokenDecimals: chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI3 = chainInfo.substrateInfo) === null || _chainInfo$substrateI3 === void 0 ? void 0 : _chainInfo$substrateI3.decimals,
3085
+ tokenSymbol: chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI4 = chainInfo.substrateInfo) === null || _chainInfo$substrateI4 === void 0 ? void 0 : _chainInfo$substrateI4.symbol
3062
3086
  }));
3063
3087
  registry.setMetadata(_metadata, payload.signedExtensions, metadata.userExtensions);
3064
3088
  } else {
@@ -4409,9 +4433,9 @@ class KoniExtension {
4409
4433
  case 'pri(accounts.batchExportV2)':
4410
4434
  return this.batchExportV2(request);
4411
4435
  case 'pri(json.restoreV2)':
4412
- return this.jsonRestoreV2(request);
4436
+ return await this.jsonRestoreV2(request);
4413
4437
  case 'pri(json.batchRestoreV2)':
4414
- return this.batchRestoreV2(request);
4438
+ return await this.batchRestoreV2(request);
4415
4439
  case 'pri(nft.getNft)':
4416
4440
  return await this.getNft();
4417
4441
  case 'pri(nft.getSubscription)':
@@ -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.2.29-0'
16
+ version: '1.2.31-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -123,10 +123,10 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
123
123
  evmApi
124
124
  });
125
125
  }
126
- if (!substrateApiMap[chainSlug].isApiReady) {
126
+ const substrateApi = await substrateApiMap[chainSlug].isReady;
127
+ if (!substrateApi.isApiReady) {
127
128
  handleUnsupportedOrPendingAddresses(useAddresses, chainSlug, chainAssetMap, _KoniTypes.APIItemState.PENDING, callback);
128
129
  }
129
- const substrateApi = await substrateApiMap[chainSlug].isReady;
130
130
  return (0, _substrate.subscribeSubstrateBalance)(useAddresses, chainInfo, chainAssetMap, substrateApi, evmApi, callback, extrinsicType);
131
131
  });
132
132
  return () => {
@@ -23,7 +23,8 @@ const subscribeGRC20Balance = _ref => {
23
23
  chainInfo,
24
24
  substrateApi
25
25
  } = _ref;
26
- if (!(substrateApi instanceof _api.GearApi)) {
26
+ const apiPromise = substrateApi.api;
27
+ if (!(apiPromise instanceof _api.GearApi)) {
27
28
  console.warn('Cannot subscribe GRC20 balance without GearApi instance');
28
29
  return _util.noop;
29
30
  }
@@ -32,7 +33,7 @@ const subscribeGRC20Balance = _ref => {
32
33
  const tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.GRC20]);
33
34
  Object.entries(tokenList).forEach(_ref2 => {
34
35
  let [slug, tokenInfo] = _ref2;
35
- grc20ContractMap[slug] = (0, _utils2.getGRC20ContractPromise)(substrateApi, (0, _utils._getContractAddressOfToken)(tokenInfo));
36
+ grc20ContractMap[slug] = (0, _utils2.getGRC20ContractPromise)(apiPromise, (0, _utils._getContractAddressOfToken)(tokenInfo));
36
37
  });
37
38
  const getTokenBalances = () => {
38
39
  Object.values(tokenList).map(async tokenInfo => {
@@ -82,7 +83,8 @@ const subscribeVftBalance = _ref3 => {
82
83
  chainInfo,
83
84
  substrateApi
84
85
  } = _ref3;
85
- if (!(substrateApi instanceof _api.GearApi)) {
86
+ const apiPromise = substrateApi.api;
87
+ if (!(apiPromise instanceof _api.GearApi)) {
86
88
  console.warn('Cannot subscribe VFT balance without GearApi instance');
87
89
  return _util.noop;
88
90
  }
@@ -91,7 +93,7 @@ const subscribeVftBalance = _ref3 => {
91
93
  const tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.VFT]);
92
94
  Object.entries(tokenList).forEach(_ref4 => {
93
95
  let [slug, tokenInfo] = _ref4;
94
- vftContractMap[slug] = (0, _utils2.getVFTContractPromise)(substrateApi, (0, _utils._getContractAddressOfToken)(tokenInfo));
96
+ vftContractMap[slug] = (0, _utils2.getVFTContractPromise)(apiPromise, (0, _utils._getContractAddressOfToken)(tokenInfo));
95
97
  });
96
98
  const getTokenBalances = () => {
97
99
  Object.values(tokenList).map(async tokenInfo => {
@@ -73,16 +73,16 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
73
73
  const tvlCall = stakingContract.methods.fundRaisedBalance();
74
74
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
75
75
  const exchangeRateCall = stakingContract.methods.getPooledTokenByShares(sampleTokenShare);
76
-
77
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
78
- const [aprObject, tvl, equivalentTokenShare] = await Promise.all([aprPromise,
79
- // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
80
- tvlCall.call(),
81
76
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
82
- exchangeRateCall.call()]);
77
+ const equivalentTokenShare = await exchangeRateCall.call();
83
78
  const rate = equivalentTokenShare;
84
79
  const exchangeRate = rate / 10 ** (0, _utils._getAssetDecimals)(derivativeTokenInfo);
85
80
  this.updateExchangeRate(rate);
81
+
82
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
83
+ const [aprObject, tvl] = await Promise.all([aprPromise,
84
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
85
+ tvlCall.call()]);
86
86
  return {
87
87
  ...this.baseInfo,
88
88
  type: this.type,
@@ -4,7 +4,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.ChainflipSwapHandler = void 0;
7
+ exports.ChainflipSwapHandler = exports.CHAINFLIP_BROKER_API = void 0;
8
8
  var _swap = require("@chainflip/sdk/swap");
9
9
  var _chainList = require("@subwallet/chain-list");
10
10
  var _SwapError = require("@subwallet/extension-base/background/errors/SwapError");
@@ -26,10 +26,13 @@ var ChainflipFeeType;
26
26
  ChainflipFeeType["INGRESS"] = "INGRESS";
27
27
  ChainflipFeeType["NETWORK"] = "NETWORK";
28
28
  ChainflipFeeType["EGRESS"] = "EGRESS";
29
- ChainflipFeeType["LIQUIDITY"] = "LIQUIDITY";
29
+ ChainflipFeeType["BOOST"] = "BOOST";
30
+ ChainflipFeeType["BROKER"] = "BROKER";
30
31
  })(ChainflipFeeType || (ChainflipFeeType = {}));
31
32
  const INTERMEDIARY_MAINNET_ASSET_SLUG = _chainList.COMMON_ASSETS.USDC_ETHEREUM;
32
33
  const INTERMEDIARY_TESTNET_ASSET_SLUG = _chainList.COMMON_ASSETS.USDC_SEPOLIA;
34
+ const CHAINFLIP_BROKER_API = process.env.CHAINFLIP_BROKER_API || '';
35
+ exports.CHAINFLIP_BROKER_API = CHAINFLIP_BROKER_API;
33
36
  var CHAINFLIP_QUOTE_ERROR;
34
37
  (function (CHAINFLIP_QUOTE_ERROR) {
35
38
  CHAINFLIP_QUOTE_ERROR["InsufficientLiquidity"] = "InsufficientLiquidity";
@@ -47,9 +50,9 @@ class ChainflipSwapHandler {
47
50
  });
48
51
  this.isTestnet = isTestnet;
49
52
  this.providerSlug = isTestnet ? _swap3.SwapProviderId.CHAIN_FLIP_TESTNET : _swap3.SwapProviderId.CHAIN_FLIP_MAINNET;
50
- this.swapSdk = new _swap.SwapSDK({
51
- network: isTestnet ? 'perseverance' : 'mainnet'
52
- });
53
+
54
+ // @ts-ignore
55
+ this.swapSdk = new _swap.SwapSDK((0, _utils2.getChainflipOptions)(isTestnet));
53
56
  }
54
57
  get chainService() {
55
58
  return this.swapBaseHandler.chainService;
@@ -95,11 +98,12 @@ class ChainflipSwapHandler {
95
98
  const toAsset = this.chainService.getAssetBySlug(request.pair.to);
96
99
  const srcChain = fromAsset.originChain;
97
100
  const destChain = toAsset.originChain;
101
+ const isSwapCrossChain = srcChain !== destChain;
98
102
  const srcChainInfo = this.chainService.getChainInfoByKey(srcChain);
99
103
  const srcChainId = this.chainMapping[srcChain];
100
104
  const destChainId = this.chainMapping[destChain];
101
- const fromAssetId = this.assetMapping[fromAsset.slug];
102
- const toAssetId = this.assetMapping[toAsset.slug];
105
+ const fromAssetId = (0, _utils._getAssetSymbol)(fromAsset);
106
+ const toAssetId = (0, _utils._getAssetSymbol)(toAsset);
103
107
  if (!srcChainId || !destChainId || !fromAssetId || !toAssetId) {
104
108
  return {
105
109
  error: _swap3.SwapErrorType.ASSET_NOT_SUPPORTED
@@ -107,9 +111,21 @@ class ChainflipSwapHandler {
107
111
  }
108
112
  const [supportedDestChains, srcAssets, destAssets] = await Promise.all([this.swapSdk.getChains(srcChainId), this.swapSdk.getAssets(srcChainId), this.swapSdk.getAssets(destChainId)]);
109
113
  const supportedDestChainId = supportedDestChains.find(c => c.chain === destChainId);
110
- const srcAssetData = srcAssets.find(a => a.asset === fromAssetId);
111
- const destAssetData = destAssets.find(a => a.asset === toAssetId);
112
- if (!destAssetData || !srcAssetData || !supportedDestChainId) {
114
+ const srcAssetData = srcAssets.find(a => {
115
+ if ((0, _utils._isSmartContractToken)(fromAsset)) {
116
+ var _a$contractAddress;
117
+ return (a === null || a === void 0 ? void 0 : (_a$contractAddress = a.contractAddress) === null || _a$contractAddress === void 0 ? void 0 : _a$contractAddress.toLowerCase()) === (0, _utils._getContractAddressOfToken)(fromAsset).toLowerCase() && a.asset === fromAssetId;
118
+ }
119
+ return a.asset === fromAssetId;
120
+ });
121
+ const destAssetData = destAssets.find(a => {
122
+ if ((0, _utils._isSmartContractToken)(toAsset)) {
123
+ var _a$contractAddress2;
124
+ return (a === null || a === void 0 ? void 0 : (_a$contractAddress2 = a.contractAddress) === null || _a$contractAddress2 === void 0 ? void 0 : _a$contractAddress2.toLowerCase()) === (0, _utils._getContractAddressOfToken)(toAsset).toLowerCase() && a.asset === toAssetId;
125
+ }
126
+ return a.asset === toAssetId;
127
+ });
128
+ if (!destAssetData || !srcAssetData || isSwapCrossChain && !supportedDestChainId) {
113
129
  return {
114
130
  error: _swap3.SwapErrorType.UNKNOWN
115
131
  };
@@ -205,8 +221,8 @@ class ChainflipSwapHandler {
205
221
  }
206
222
  const srcChainId = this.chainMapping[fromAsset.originChain];
207
223
  const destChainId = this.chainMapping[toAsset.originChain];
208
- const fromAssetId = this.assetMapping[fromAsset.slug];
209
- const toAssetId = this.assetMapping[toAsset.slug];
224
+ const fromAssetId = (0, _utils._getAssetSymbol)(fromAsset);
225
+ const toAssetId = (0, _utils._getAssetSymbol)(toAsset);
210
226
  try {
211
227
  var _metadata$maxSwap;
212
228
  const quoteResponse = await this.swapSdk.getQuote({
@@ -220,13 +236,22 @@ class ChainflipSwapHandler {
220
236
  quoteResponse.quote.includedFees.forEach(fee => {
221
237
  switch (fee.type) {
222
238
  case ChainflipFeeType.INGRESS:
239
+ {
240
+ console.log('ingress', fee);
241
+ feeComponent.push({
242
+ tokenSlug: fromAsset.slug,
243
+ amount: fee.amount,
244
+ feeType: _swap3.SwapFeeType.NETWORK_FEE
245
+ });
246
+ break;
247
+ }
223
248
 
224
249
  // eslint-disable-next-line no-fallthrough
225
250
  case ChainflipFeeType.EGRESS:
226
251
  {
227
- const tokenSlug = Object.keys(this.assetMapping).find(assetSlug => this.assetMapping[assetSlug] === fee.asset);
252
+ console.log('egress', fee);
228
253
  feeComponent.push({
229
- tokenSlug,
254
+ tokenSlug: toAsset.slug,
230
255
  amount: fee.amount,
231
256
  feeType: _swap3.SwapFeeType.NETWORK_FEE
232
257
  });
@@ -235,11 +260,14 @@ class ChainflipSwapHandler {
235
260
  case ChainflipFeeType.NETWORK:
236
261
 
237
262
  // eslint-disable-next-line no-fallthrough
238
- case ChainflipFeeType.LIQUIDITY:
263
+ case ChainflipFeeType.BOOST:
264
+
265
+ // eslint-disable-next-line no-fallthrough
266
+ case ChainflipFeeType.BROKER:
239
267
  {
240
- const tokenSlug = Object.keys(this.assetMapping).find(assetSlug => this.assetMapping[assetSlug] === fee.asset);
268
+ console.log('broker fee', fee);
241
269
  feeComponent.push({
242
- tokenSlug,
270
+ tokenSlug: this.intermediaryAssetSlug,
243
271
  amount: fee.amount,
244
272
  feeType: _swap3.SwapFeeType.PLATFORM_FEE
245
273
  });
@@ -324,8 +352,8 @@ class ChainflipSwapHandler {
324
352
  const receiver = recipient !== null && recipient !== void 0 ? recipient : address;
325
353
  const srcChainId = this.chainMapping[fromAsset.originChain];
326
354
  const destChainId = this.chainMapping[toAsset.originChain];
327
- const fromAssetId = this.assetMapping[fromAsset.slug];
328
- const toAssetId = this.assetMapping[toAsset.slug];
355
+ const fromAssetId = (0, _utils._getAssetSymbol)(fromAsset);
356
+ const toAssetId = (0, _utils._getAssetSymbol)(toAsset);
329
357
  const depositAddressResponse = await this.swapSdk.requestDepositAddress({
330
358
  srcChain: srcChainId,
331
359
  destChain: destChainId,
@@ -7,11 +7,14 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports._PROVIDER_TO_SUPPORTED_PAIR_MAP = exports.SWAP_QUOTE_TIMEOUT_MAP = exports.CHAIN_FLIP_TESTNET_EXPLORER = exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = exports.CHAIN_FLIP_MAINNET_EXPLORER = void 0;
8
8
  exports.calculateSwapRate = calculateSwapRate;
9
9
  exports.convertSwapRate = convertSwapRate;
10
+ exports.getChainflipBroker = getChainflipBroker;
11
+ exports.getChainflipOptions = getChainflipOptions;
10
12
  exports.getSwapAltToken = getSwapAltToken;
11
13
  exports.getSwapAlternativeAsset = getSwapAlternativeAsset;
12
14
  var _swap = require("@chainflip/sdk/swap");
13
15
  var _chainList = require("@subwallet/chain-list");
14
16
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
17
+ var _chainflipHandler = require("@subwallet/extension-base/services/swap-service/handler/chainflip-handler");
15
18
  var _swap2 = require("@subwallet/extension-base/types/swap");
16
19
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
17
20
  // Copyright 2019-2022 @subwallet/extension-base
@@ -23,7 +26,8 @@ const CHAIN_FLIP_MAINNET_EXPLORER = 'https://scan.chainflip.io';
23
26
  exports.CHAIN_FLIP_MAINNET_EXPLORER = CHAIN_FLIP_MAINNET_EXPLORER;
24
27
  const CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = {
25
28
  [_chainList.COMMON_CHAIN_SLUGS.POLKADOT]: _swap.Chains.Polkadot,
26
- [_chainList.COMMON_CHAIN_SLUGS.ETHEREUM]: _swap.Chains.Ethereum
29
+ [_chainList.COMMON_CHAIN_SLUGS.ETHEREUM]: _swap.Chains.Ethereum,
30
+ [_chainList.COMMON_CHAIN_SLUGS.ARBITRUM]: _swap.Chains.Arbitrum
27
31
  };
28
32
  exports.CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING = CHAIN_FLIP_SUPPORTED_MAINNET_MAPPING;
29
33
  const CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = {
@@ -34,7 +38,8 @@ exports.CHAIN_FLIP_SUPPORTED_TESTNET_MAPPING = CHAIN_FLIP_SUPPORTED_TESTNET_MAPP
34
38
  const CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = {
35
39
  [_chainList.COMMON_ASSETS.DOT]: _swap.Assets.DOT,
36
40
  [_chainList.COMMON_ASSETS.ETH]: _swap.Assets.ETH,
37
- [_chainList.COMMON_ASSETS.USDC_ETHEREUM]: _swap.Assets.USDC
41
+ [_chainList.COMMON_ASSETS.USDC_ETHEREUM]: _swap.Assets.USDC,
42
+ [_chainList.COMMON_ASSETS.USDT_ETHEREUM]: _swap.Assets.USDT
38
43
  };
39
44
  exports.CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING = CHAIN_FLIP_SUPPORTED_MAINNET_ASSET_MAPPING;
40
45
  const CHAIN_FLIP_SUPPORTED_TESTNET_ASSET_MAPPING = {
@@ -53,7 +58,7 @@ exports.SWAP_QUOTE_TIMEOUT_MAP = SWAP_QUOTE_TIMEOUT_MAP;
53
58
  const _PROVIDER_TO_SUPPORTED_PAIR_MAP = {
54
59
  [_swap2.SwapProviderId.HYDRADX_MAINNET]: [_chainList.COMMON_CHAIN_SLUGS.HYDRADX],
55
60
  [_swap2.SwapProviderId.HYDRADX_TESTNET]: [_chainList.COMMON_CHAIN_SLUGS.HYDRADX_TESTNET],
56
- [_swap2.SwapProviderId.CHAIN_FLIP_MAINNET]: [_chainList.COMMON_CHAIN_SLUGS.POLKADOT, _chainList.COMMON_CHAIN_SLUGS.ETHEREUM],
61
+ [_swap2.SwapProviderId.CHAIN_FLIP_MAINNET]: [_chainList.COMMON_CHAIN_SLUGS.POLKADOT, _chainList.COMMON_CHAIN_SLUGS.ETHEREUM, _chainList.COMMON_CHAIN_SLUGS.ARBITRUM],
57
62
  [_swap2.SwapProviderId.CHAIN_FLIP_TESTNET]: [_chainList.COMMON_CHAIN_SLUGS.CHAINFLIP_POLKADOT, _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA],
58
63
  [_swap2.SwapProviderId.POLKADOT_ASSET_HUB]: [_chainList.COMMON_CHAIN_SLUGS.POLKADOT_ASSET_HUB],
59
64
  [_swap2.SwapProviderId.KUSAMA_ASSET_HUB]: [_chainList.COMMON_CHAIN_SLUGS.KUSAMA_ASSET_HUB],
@@ -79,4 +84,30 @@ function convertSwapRate(rate, fromAsset, toAsset) {
79
84
  const decimalDiff = (0, _utils._getAssetDecimals)(toAsset) - (0, _utils._getAssetDecimals)(fromAsset);
80
85
  const bnRate = new _bignumber.default(rate);
81
86
  return bnRate.times(10 ** decimalDiff).pow(-1).toNumber();
87
+ }
88
+ function getChainflipOptions(isTestnet) {
89
+ if (isTestnet) {
90
+ return {
91
+ network: getChainflipNetwork(isTestnet)
92
+ };
93
+ }
94
+ return {
95
+ network: getChainflipNetwork(isTestnet),
96
+ broker: getChainflipBroker(isTestnet)
97
+ };
98
+ }
99
+ function getChainflipNetwork(isTestnet) {
100
+ return isTestnet ? 'perseverance' : 'mainnet';
101
+ }
102
+ function getChainflipBroker(isTestnet) {
103
+ // noted: currently not use testnet broker
104
+ if (isTestnet) {
105
+ return {
106
+ url: `https://perseverance.chainflip-broker.io/rpc/${_chainflipHandler.CHAINFLIP_BROKER_API}`
107
+ };
108
+ } else {
109
+ return {
110
+ url: `https://chainflip-broker.io/rpc/${_chainflipHandler.CHAINFLIP_BROKER_API}`
111
+ };
112
+ }
82
113
  }
@@ -75,6 +75,13 @@ class TransactionService {
75
75
  chain,
76
76
  extrinsicType
77
77
  } = validationResponse;
78
+ const chainInfo = this.state.chainService.getChainInfoByKey(chain);
79
+ const {
80
+ blockedActionsMap,
81
+ blockedFeaturesList
82
+ } = await (0, _constants.fetchLastestBlockedActionsAndFeatures)();
83
+ (0, _transfer.checkSupportForFeature)(validationResponse, blockedFeaturesList, chainInfo);
84
+ (0, _transfer.checkSupportForAction)(validationResponse, blockedActionsMap);
78
85
  const transaction = transactionInput.transaction;
79
86
 
80
87
  // Check duplicated transaction
@@ -82,7 +89,6 @@ class TransactionService {
82
89
 
83
90
  // Check support for transaction
84
91
  (0, _transfer.checkSupportForTransaction)(validationResponse, transaction);
85
- const chainInfo = this.state.chainService.getChainInfoByKey(chain);
86
92
  if (!chainInfo) {
87
93
  validationResponse.errors.push(new _TransactionError.TransactionError(_KoniTypes.BasicTxErrorType.INTERNAL_ERROR, (0, _i18next.t)('Cannot find network')));
88
94
  }