@subwallet/extension-base 1.3.35-0 → 1.3.37-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 (39) hide show
  1. package/background/KoniTypes.d.ts +13 -0
  2. package/background/types.d.ts +2 -1
  3. package/cjs/core/logic-validation/request.js +13 -1
  4. package/cjs/koni/background/handlers/Extension.js +189 -108
  5. package/cjs/koni/background/handlers/State.js +14 -9
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/request-service/handler/AuthRequestHandler.js +4 -1
  8. package/cjs/services/request-service/handler/EvmRequestHandler.js +4 -1
  9. package/cjs/services/swap-service/handler/kyber-handler.js +355 -0
  10. package/cjs/services/swap-service/handler/uniswap-handler.js +209 -40
  11. package/cjs/services/swap-service/index.js +28 -2
  12. package/cjs/services/swap-service/utils.js +4 -1
  13. package/cjs/services/transaction-service/index.js +252 -28
  14. package/cjs/types/swap/index.js +2 -1
  15. package/cjs/utils/cardano.js +10 -2
  16. package/core/logic-validation/request.js +13 -1
  17. package/koni/background/handlers/Extension.d.ts +1 -0
  18. package/koni/background/handlers/Extension.js +82 -2
  19. package/koni/background/handlers/State.js +15 -10
  20. package/package.json +14 -9
  21. package/packageInfo.js +1 -1
  22. package/services/chain-service/types.d.ts +1 -1
  23. package/services/event-service/types.d.ts +6 -6
  24. package/services/request-service/handler/AuthRequestHandler.js +4 -1
  25. package/services/request-service/handler/EvmRequestHandler.js +4 -1
  26. package/services/swap-service/handler/kyber-handler.d.ts +28 -0
  27. package/services/swap-service/handler/kyber-handler.js +346 -0
  28. package/services/swap-service/handler/uniswap-handler.d.ts +48 -0
  29. package/services/swap-service/handler/uniswap-handler.js +209 -40
  30. package/services/swap-service/index.js +28 -2
  31. package/services/swap-service/utils.js +4 -1
  32. package/services/transaction-service/helpers/index.d.ts +5 -5
  33. package/services/transaction-service/index.d.ts +10 -5
  34. package/services/transaction-service/index.js +234 -12
  35. package/services/transaction-service/types.d.ts +23 -10
  36. package/types/swap/index.d.ts +4 -1
  37. package/types/swap/index.js +2 -1
  38. package/utils/cardano.d.ts +2 -0
  39. package/utils/cardano.js +7 -0
@@ -207,6 +207,22 @@ class TransactionService {
207
207
  extrinsicHash: transactionId
208
208
  };
209
209
  }
210
+ fillDutchTransactionDefaultInfo(transaction) {
211
+ const isInternal = !transaction.url;
212
+ const transactionId = (0, _helpers.getTransactionId)(transaction.chainType, transaction.chain, isInternal, (0, _helpers2.isWalletConnectRequest)(transaction.id));
213
+ return {
214
+ ...transaction,
215
+ createdAt: new Date().getTime(),
216
+ updatedAt: new Date().getTime(),
217
+ errors: transaction.errors || [],
218
+ warnings: transaction.warnings || [],
219
+ url: transaction.url || _constants2.EXTENSION_REQUEST_URL,
220
+ status: _KoniTypes.ExtrinsicStatus.QUEUED,
221
+ isInternal,
222
+ id: transactionId,
223
+ extrinsicHash: transactionId
224
+ };
225
+ }
210
226
  async addTransaction(inputTransaction) {
211
227
  const transactions = this.transactions;
212
228
  // Fill transaction default info
@@ -219,6 +235,15 @@ class TransactionService {
219
235
  });
220
236
  return await this.sendTransaction(transaction);
221
237
  }
238
+ addDutchTransaction(inputTransaction) {
239
+ const transactions = this.transactions;
240
+ const transaction = this.fillDutchTransactionDefaultInfo(inputTransaction);
241
+ transactions[transaction.id] = transaction;
242
+ this.transactionSubject.next({
243
+ ...transactions
244
+ });
245
+ return this.sendDutchTransaction(transaction);
246
+ }
222
247
  generateBeforeHandleResponseErrors(errors) {
223
248
  return {
224
249
  errors,
@@ -334,6 +359,62 @@ class TransactionService {
334
359
  'eventsHandler' in validatedTransaction && delete validatedTransaction.eventsHandler;
335
360
  return validatedTransaction;
336
361
  }
362
+ async handleDutchTransaction(transaction) {
363
+ var _transaction$step2;
364
+ const transactionId = (0, _helpers.getTransactionId)(transaction.chainType, transaction.chain, true);
365
+ const validatedTransaction = {
366
+ ...transaction,
367
+ id: transactionId,
368
+ extrinsicHash: '',
369
+ status: undefined,
370
+ errors: transaction.errors || [],
371
+ warnings: transaction.warnings || [],
372
+ processId: (_transaction$step2 = transaction.step) === null || _transaction$step2 === void 0 ? void 0 : _transaction$step2.processId
373
+ };
374
+ const txInput = {
375
+ ...transaction,
376
+ isInternal: true,
377
+ status: _KoniTypes.ExtrinsicStatus.QUEUED,
378
+ id: transactionId,
379
+ extrinsicHash: transactionId,
380
+ createdAt: new Date().getTime(),
381
+ updatedAt: new Date().getTime()
382
+ };
383
+ const emitter = this.addDutchTransaction(txInput);
384
+ await new Promise(resolve => {
385
+ if (transaction.resolveOnDone) {
386
+ emitter.on('success', data => {
387
+ validatedTransaction.id = data.id;
388
+ validatedTransaction.extrinsicHash = data.extrinsicHash;
389
+ resolve();
390
+ });
391
+ } else {
392
+ emitter.on('signed', data => {
393
+ validatedTransaction.id = data.id;
394
+ validatedTransaction.extrinsicHash = data.extrinsicHash;
395
+ resolve();
396
+ });
397
+ }
398
+ emitter.on('error', data => {
399
+ if (data.errors.length > 0) {
400
+ validatedTransaction.errors.push(...data.errors);
401
+ resolve();
402
+ }
403
+ });
404
+ emitter.on('timeout', data => {
405
+ if (transaction.errorOnTimeOut && data.errors.length > 0) {
406
+ validatedTransaction.errors.push(...data.errors);
407
+ resolve();
408
+ }
409
+ });
410
+ });
411
+
412
+ // @ts-ignore
413
+ 'transaction' in validatedTransaction && delete validatedTransaction.transaction;
414
+ 'additionalValidator' in validatedTransaction && delete validatedTransaction.additionalValidator;
415
+ 'eventsHandler' in validatedTransaction && delete validatedTransaction.eventsHandler;
416
+ return validatedTransaction;
417
+ }
337
418
  async sendTransaction(transaction) {
338
419
  // Send Transaction
339
420
  const emitter = await (transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) : transaction.chainType === 'evm' ? this.signAndSendEvmTransaction(transaction) : transaction.chainType === 'cardano' ? this.signAndSendCardanoTransaction(transaction) : this.signAndSendTonTransaction(transaction));
@@ -381,10 +462,7 @@ class TransactionService {
381
462
  if (step) {
382
463
  const rejectError = data.errors.find(error => {
383
464
  // TODO: REFACTOR ERROR CODE
384
- if ([_types.BasicTxErrorType.UNABLE_TO_SIGN, _types.BasicTxErrorType.USER_REJECT_REQUEST].includes(error.errorType)) {
385
- return true;
386
- }
387
- return false;
465
+ return [_types.BasicTxErrorType.UNABLE_TO_SIGN, _types.BasicTxErrorType.USER_REJECT_REQUEST].includes(error.errorType);
388
466
  });
389
467
 
390
468
  /**
@@ -457,10 +535,7 @@ class TransactionService {
457
535
  if (step) {
458
536
  const rejectError = data.errors.find(error => {
459
537
  // TODO: REFACTOR ERROR CODE
460
- if ([_types.BasicTxErrorType.UNABLE_TO_SIGN, _types.BasicTxErrorType.USER_REJECT_REQUEST].includes(error.errorType)) {
461
- return true;
462
- }
463
- return false;
538
+ return [_types.BasicTxErrorType.UNABLE_TO_SIGN, _types.BasicTxErrorType.USER_REJECT_REQUEST].includes(error.errorType);
464
539
  });
465
540
 
466
541
  /**
@@ -482,6 +557,83 @@ class TransactionService {
482
557
  eventsHandler === null || eventsHandler === void 0 ? void 0 : eventsHandler(emitter);
483
558
  return emitter;
484
559
  }
560
+ sendDutchTransaction(transaction) {
561
+ // Send Transaction
562
+ const emitter = this.signAndSendEvmDutchTransaction(transaction);
563
+ const {
564
+ eventsHandler,
565
+ step
566
+ } = transaction;
567
+ emitter.on('send', data => {
568
+ this.onSend(data);
569
+ if (step) {
570
+ this.updateProcessStepStatus(step, {
571
+ transactionId: transaction.id,
572
+ status: _types.StepStatus.SUBMITTING,
573
+ chain: transaction.chain
574
+ });
575
+ }
576
+ });
577
+ emitter.on('extrinsicHash', data => {
578
+ this.onHasTransactionHash(data);
579
+ if (step) {
580
+ this.updateProcessStepStatus(step, {
581
+ extrinsicHash: data.extrinsicHash,
582
+ status: _types.StepStatus.PROCESSING
583
+ });
584
+ }
585
+ });
586
+ emitter.on('success', data => {
587
+ this.handlePostProcessing(data.id);
588
+ this.onSuccess(data);
589
+ if (step) {
590
+ this.updateProcessStepStatus(step, {
591
+ status: _types.StepStatus.COMPLETE
592
+ });
593
+ }
594
+ });
595
+ emitter.on('error', data => {
596
+ // this.handlePostProcessing(data.id); // might enable this later
597
+ this.onFailed({
598
+ ...data,
599
+ errors: [...data.errors, new _TransactionError.TransactionError(_types.BasicTxErrorType.INTERNAL_ERROR)]
600
+ });
601
+ if (step) {
602
+ const rejectError = data.errors.find(error => {
603
+ // TODO: REFACTOR ERROR CODE
604
+ return [_types.BasicTxErrorType.UNABLE_TO_SIGN, _types.BasicTxErrorType.USER_REJECT_REQUEST].includes(error.errorType);
605
+ });
606
+
607
+ /**
608
+ * Now simple check, first step have step id = 1.
609
+ * Improve to fetch the process from db
610
+ * */
611
+ if (rejectError && step.stepId === 1) {
612
+ this.deleteProcess(step);
613
+ } else {
614
+ this.updateProcessStepStatus(step, {
615
+ status: _types.StepStatus.FAILED
616
+ });
617
+ }
618
+ }
619
+ });
620
+ emitter.on('timeout', data => {
621
+ this.onTimeOut({
622
+ ...data,
623
+ errors: [...data.errors, new _TransactionError.TransactionError(_types.BasicTxErrorType.TIMEOUT)]
624
+ });
625
+ if (step) {
626
+ this.updateProcessStepStatus(step, {
627
+ status: _types.StepStatus.TIMEOUT
628
+ });
629
+ }
630
+ });
631
+
632
+ // Todo: handle any event with transaction.eventsHandler
633
+
634
+ eventsHandler === null || eventsHandler === void 0 ? void 0 : eventsHandler(emitter);
635
+ return emitter;
636
+ }
485
637
  removeTransaction(id) {
486
638
  if (this.transactions[id]) {
487
639
  delete this.transactions[id];
@@ -505,7 +657,7 @@ class TransactionService {
505
657
  return (0, _utils3.getExplorerLink)(chainInfo, transaction.extrinsicHash, 'tx');
506
658
  }
507
659
  transactionToHistories(id, startBlock, nonce, eventLogs) {
508
- var _transaction$step2;
660
+ var _transaction$step3;
509
661
  const transaction = this.getTransaction(id);
510
662
  const extrinsicType = transaction.extrinsicType;
511
663
  const chainInfo = this.state.chainService.getChainInfoByKey(transaction.chain);
@@ -530,7 +682,7 @@ class TransactionService {
530
682
  // Will be added in next step
531
683
  nonce: nonce !== null && nonce !== void 0 ? nonce : 0,
532
684
  startBlock: startBlock || 0,
533
- processId: (_transaction$step2 = transaction.step) === null || _transaction$step2 === void 0 ? void 0 : _transaction$step2.processId
685
+ processId: (_transaction$step3 = transaction.step) === null || _transaction$step3 === void 0 ? void 0 : _transaction$step3.processId
534
686
  };
535
687
  const nativeAsset = (0, _utils2._getChainNativeTokenBasicInfo)(chainInfo);
536
688
  const baseNativeAmount = {
@@ -1369,7 +1521,79 @@ class TransactionService {
1369
1521
  });
1370
1522
  return emitter;
1371
1523
  }
1372
- signAndSendSubstrateTransaction(_ref12) {
1524
+ signAndSendEvmDutchTransaction(_ref12) {
1525
+ let {
1526
+ address,
1527
+ id,
1528
+ isPassConfirmation,
1529
+ step,
1530
+ transaction,
1531
+ url
1532
+ } = _ref12;
1533
+ const emitter = new _eventemitter.default();
1534
+ const eventData = {
1535
+ id,
1536
+ errors: [],
1537
+ warnings: [],
1538
+ extrinsicHash: id,
1539
+ processId: step === null || step === void 0 ? void 0 : step.processId
1540
+ };
1541
+
1542
+ // todo: review this object
1543
+ const evmSignaturePayload = {
1544
+ id: id,
1545
+ type: 'eth_signTypedData_v4',
1546
+ payload: transaction,
1547
+ address: address,
1548
+ hashPayload: '',
1549
+ canSign: true,
1550
+ processId: step === null || step === void 0 ? void 0 : step.processId
1551
+ };
1552
+ this.state.requestService.addConfirmation(id, url || _constants2.EXTENSION_REQUEST_URL, 'submitApiRequest', evmSignaturePayload, {
1553
+ isPassConfirmation
1554
+ }).then(_ref13 => {
1555
+ let {
1556
+ isApproved,
1557
+ payload: signature
1558
+ } = _ref13;
1559
+ if (isApproved) {
1560
+ emitter.emit('signed', eventData);
1561
+ emitter.emit('send', eventData);
1562
+ transaction.submitSwapOrder().then(isSendSuccess => {
1563
+ if (!isSendSuccess) {
1564
+ throw new _EvmProviderError.EvmProviderError(_KoniTypes.EvmProviderErrorType.UNAUTHORIZED, (0, _i18next.t)('Failed to sign'));
1565
+ }
1566
+ this.handleTransactionTimeout(emitter, eventData);
1567
+ transaction.cronCheckTxSuccess().then(order => {
1568
+ if (!order) {
1569
+ eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.SEND_TRANSACTION_FAILED));
1570
+ emitter.emit('error', eventData);
1571
+ } else {
1572
+ eventData.extrinsicHash = order.txHash;
1573
+ emitter.emit('extrinsicHash', eventData);
1574
+ emitter.emit('success', eventData);
1575
+ }
1576
+ }).catch(e => {
1577
+ eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.SEND_TRANSACTION_FAILED, (0, _i18next.t)(e.message)));
1578
+ emitter.emit('error', eventData);
1579
+ });
1580
+ }).catch(e => {
1581
+ eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SEND, (0, _i18next.t)(e.message)));
1582
+ emitter.emit('error', eventData);
1583
+ });
1584
+ } else {
1585
+ this.removeTransaction(id);
1586
+ eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.USER_REJECT_REQUEST));
1587
+ emitter.emit('error', eventData);
1588
+ }
1589
+ }).catch(e => {
1590
+ this.removeTransaction(id);
1591
+ eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.UNABLE_TO_SIGN, (0, _i18next.t)(e.message)));
1592
+ emitter.emit('error', eventData);
1593
+ });
1594
+ return emitter;
1595
+ }
1596
+ signAndSendSubstrateTransaction(_ref14) {
1373
1597
  var _this$state$chainServ;
1374
1598
  let {
1375
1599
  address,
@@ -1381,7 +1605,7 @@ class TransactionService {
1381
1605
  tokenPayFeeSlug,
1382
1606
  transaction,
1383
1607
  url
1384
- } = _ref12;
1608
+ } = _ref14;
1385
1609
  const tip = (feeCustom === null || feeCustom === void 0 ? void 0 : feeCustom.tip) || '0';
1386
1610
  const feeAssetId = tokenPayFeeSlug && !(0, _utils2._isNativeTokenBySlug)(tokenPayFeeSlug) && _constants._SUPPORT_TOKEN_PAY_FEE_GROUP.assetHub.includes(chain) ? (_this$state$chainServ = this.state.chainService.getAssetBySlug(tokenPayFeeSlug).metadata) === null || _this$state$chainServ === void 0 ? void 0 : _this$state$chainServ.multilocation : undefined;
1387
1611
  const emitter = new _eventemitter.default();
@@ -1470,20 +1694,20 @@ class TransactionService {
1470
1694
  if (!eventData.extrinsicHash) {
1471
1695
  eventData.extrinsicHash = txState.txHash.toHex();
1472
1696
  }
1473
- txState.events.filter(_ref13 => {
1697
+ txState.events.filter(_ref15 => {
1474
1698
  let {
1475
1699
  event: {
1476
1700
  section
1477
1701
  }
1478
- } = _ref13;
1702
+ } = _ref15;
1479
1703
  return section === 'system';
1480
- }).forEach(_ref14 => {
1704
+ }).forEach(_ref16 => {
1481
1705
  let {
1482
1706
  event: {
1483
1707
  data: [error],
1484
1708
  method
1485
1709
  }
1486
- } = _ref14;
1710
+ } = _ref16;
1487
1711
  if (method === 'ExtrinsicFailed') {
1488
1712
  eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.SEND_TRANSACTION_FAILED, error.toString()));
1489
1713
  emitter.emit('error', eventData);
@@ -1506,7 +1730,7 @@ class TransactionService {
1506
1730
  });
1507
1731
  return emitter;
1508
1732
  }
1509
- signAndSendTonTransaction(_ref15) {
1733
+ signAndSendTonTransaction(_ref17) {
1510
1734
  let {
1511
1735
  address,
1512
1736
  chain,
@@ -1515,7 +1739,7 @@ class TransactionService {
1515
1739
  step,
1516
1740
  transaction,
1517
1741
  url
1518
- } = _ref15;
1742
+ } = _ref17;
1519
1743
  const walletContract = _uiKeyring.default.getPair(address).ton.currentContract;
1520
1744
  const emitter = new _eventemitter.default();
1521
1745
  const eventData = {
@@ -1532,11 +1756,11 @@ class TransactionService {
1532
1756
  ...payload,
1533
1757
  messagePayload: (0, _utils.cellToBase64Str)(message),
1534
1758
  messages: []
1535
- }, {}).then(_ref16 => {
1759
+ }, {}).then(_ref18 => {
1536
1760
  let {
1537
1761
  isApproved,
1538
1762
  payload
1539
- } = _ref16;
1763
+ } = _ref18;
1540
1764
  if (!isApproved) {
1541
1765
  this.removeTransaction(id);
1542
1766
  eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.USER_REJECT_REQUEST));
@@ -1571,8 +1795,8 @@ class TransactionService {
1571
1795
  if (!externalMsgHash) {
1572
1796
  return;
1573
1797
  }
1574
- tonApi.getStatusByExtMsgHash(externalMsgHash, extrinsicType).then(_ref17 => {
1575
- let [status, hex] = _ref17;
1798
+ tonApi.getStatusByExtMsgHash(externalMsgHash, extrinsicType).then(_ref19 => {
1799
+ let [status, hex] = _ref19;
1576
1800
  if (status && hex) {
1577
1801
  eventData.extrinsicHash = hex;
1578
1802
  emitter.emit('extrinsicHash', eventData);
@@ -1601,13 +1825,13 @@ class TransactionService {
1601
1825
  });
1602
1826
  return emitter;
1603
1827
  }
1604
- signAndSendCardanoTransaction(_ref18) {
1828
+ signAndSendCardanoTransaction(_ref20) {
1605
1829
  let {
1606
1830
  chain,
1607
1831
  id,
1608
1832
  transaction,
1609
1833
  url
1610
- } = _ref18;
1834
+ } = _ref20;
1611
1835
  const emitter = new _eventemitter.default();
1612
1836
  const eventData = {
1613
1837
  id,
@@ -1617,11 +1841,11 @@ class TransactionService {
1617
1841
  };
1618
1842
  const transactionConfig = transaction;
1619
1843
  const cardanoApi = this.state.chainService.getCardanoApi(chain);
1620
- this.state.requestService.addConfirmationCardano(id, url || _constants2.EXTENSION_REQUEST_URL, 'cardanoSendTransactionRequest', transactionConfig, {}).then(_ref19 => {
1844
+ this.state.requestService.addConfirmationCardano(id, url || _constants2.EXTENSION_REQUEST_URL, 'cardanoSendTransactionRequest', transactionConfig, {}).then(_ref21 => {
1621
1845
  let {
1622
1846
  isApproved,
1623
1847
  payload
1624
- } = _ref19;
1848
+ } = _ref21;
1625
1849
  if (!isApproved) {
1626
1850
  this.removeTransaction(id);
1627
1851
  eventData.errors.push(new _TransactionError.TransactionError(_types.BasicTxErrorType.USER_REJECT_REQUEST));
@@ -1812,9 +2036,9 @@ class TransactionService {
1812
2036
  }
1813
2037
  }
1814
2038
  async createProcessNotification(transactionId) {
1815
- var _transaction$step3;
2039
+ var _transaction$step4;
1816
2040
  const transaction = this.getTransaction(transactionId);
1817
- if (transaction && (_transaction$step3 = transaction.step) !== null && _transaction$step3 !== void 0 && _transaction$step3.processId) {
2041
+ if (transaction && (_transaction$step4 = transaction.step) !== null && _transaction$step4 !== void 0 && _transaction$step4.processId) {
1818
2042
  const process = this.aliveProcessMap.get(transaction.step.processId);
1819
2043
  if (process) {
1820
2044
  await this.state.inappNotificationService.createProcessNotification(process);
@@ -42,13 +42,14 @@ exports.SwapProviderId = SwapProviderId;
42
42
  SwapProviderId["WESTEND_ASSET_HUB"] = "WESTEND_ASSET_HUB";
43
43
  SwapProviderId["SIMPLE_SWAP"] = "SIMPLE_SWAP";
44
44
  SwapProviderId["UNISWAP"] = "UNISWAP";
45
+ SwapProviderId["KYBER"] = "KYBER";
45
46
  })(SwapProviderId || (exports.SwapProviderId = SwapProviderId = {}));
46
47
  const _SUPPORTED_SWAP_PROVIDERS = [SwapProviderId.CHAIN_FLIP_TESTNET, SwapProviderId.CHAIN_FLIP_MAINNET, SwapProviderId.HYDRADX_MAINNET,
47
48
  // SwapProviderId.HYDRADX_TESTNET,
48
49
  SwapProviderId.POLKADOT_ASSET_HUB, SwapProviderId.KUSAMA_ASSET_HUB,
49
50
  // SwapProviderId.ROCOCO_ASSET_HUB,
50
51
  // SwapProviderId.WESTEND_ASSET_HUB,
51
- SwapProviderId.SIMPLE_SWAP, SwapProviderId.UNISWAP];
52
+ SwapProviderId.SIMPLE_SWAP, SwapProviderId.UNISWAP, SwapProviderId.KYBER];
52
53
  exports._SUPPORTED_SWAP_PROVIDERS = _SUPPORTED_SWAP_PROVIDERS;
53
54
  // process handling
54
55
  let SwapFeeType;
@@ -3,8 +3,9 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.convertCardanoHexToBech32 = exports.convertCardanoAddressToHex = void 0;
6
+ exports.validateAddressNetwork = exports.convertCardanoHexToBech32 = exports.convertCardanoAddressToHex = void 0;
7
7
  var _cardanoSerializationLibNodejs = require("@emurgo/cardano-serialization-lib-nodejs");
8
+ var _keyring = require("@subwallet/keyring");
8
9
  // Copyright 2019-2022 @polkadot/extension authors & contributors
9
10
  // SPDX-License-Identifier: Apache-2.0
10
11
 
@@ -17,4 +18,11 @@ const convertCardanoHexToBech32 = hexAddress => {
17
18
  const addr = _cardanoSerializationLibNodejs.Address.from_hex(hexAddress);
18
19
  return addr.to_bech32();
19
20
  };
20
- exports.convertCardanoHexToBech32 = convertCardanoHexToBech32;
21
+ exports.convertCardanoHexToBech32 = convertCardanoHexToBech32;
22
+ const validateAddressNetwork = (address, chainInfo) => {
23
+ if (!(chainInfo !== null && chainInfo !== void 0 && chainInfo.cardanoInfo) || !chainInfo.isTestnet) {
24
+ return (0, _keyring.isCardanoMainnetAddress)(address);
25
+ }
26
+ return (0, _keyring.isCardanoTestnetAddress)(address);
27
+ };
28
+ exports.validateAddressNetwork = validateAddressNetwork;
@@ -8,6 +8,7 @@ import { TransactionError } from '@subwallet/extension-base/background/errors/Tr
8
8
  import { CardanoProviderErrorType, EvmProviderErrorType } from '@subwallet/extension-base/background/KoniTypes';
9
9
  import { BasicTxErrorType } from '@subwallet/extension-base/types';
10
10
  import { BN_ZERO, combineEthFee, createPromiseHandler, isSameAddress, stripUrl, wait } from '@subwallet/extension-base/utils';
11
+ import { validateAddressNetwork } from '@subwallet/extension-base/utils/cardano';
11
12
  import { isContractAddress, parseContractInput } from '@subwallet/extension-base/utils/eth/parseTransaction';
12
13
  import { getId } from '@subwallet/extension-base/utils/getId';
13
14
  import { isCardanoAddress, isSubstrateAddress } from '@subwallet/keyring';
@@ -547,8 +548,10 @@ export function validationAuthWCMiddleware(koni, url, payload, topic) {
547
548
  export async function validationCardanoSignDataMiddleware(koni, url, payload_) {
548
549
  const {
549
550
  address,
551
+ authInfo,
550
552
  errors,
551
- pair: pair_
553
+ pair: pair_,
554
+ type
552
555
  } = payload_;
553
556
  const payload = payload_.payloadAfterValidated;
554
557
  const {
@@ -570,6 +573,15 @@ export async function validationCardanoSignDataMiddleware(koni, url, payload_) {
570
573
  if (!isCardanoAddress(address)) {
571
574
  handleError('Not found cardano address');
572
575
  }
576
+ const currentCardanoNetwork = koni.requestService.getDAppChainInfo({
577
+ autoActive: true,
578
+ accessType: 'cardano',
579
+ defaultChain: authInfo === null || authInfo === void 0 ? void 0 : authInfo.currentNetworkMap[type],
580
+ url
581
+ });
582
+ if (!validateAddressNetwork(address, currentCardanoNetwork)) {
583
+ handleError('Invalid address network');
584
+ }
573
585
  const pair = pair_ || keyring.getPair(address);
574
586
  if (!(pair !== null && pair !== void 0 && pair.meta.isExtneral)) {
575
587
  canSign = true;
@@ -59,6 +59,7 @@ export default class KoniExtension {
59
59
  private changeAuthorizationAll;
60
60
  private _changeAuthorization;
61
61
  toggleAuthorization2(url: string): Promise<ResponseAuthorizeList>;
62
+ private switchCurrentNetworkAuthorization;
62
63
  private changeAuthorization;
63
64
  private _changeAuthorizationPerAcc;
64
65
  private _changeAuthorizationBlock;
@@ -36,7 +36,7 @@ import { _isPolygonChainBridge, getClaimPolygonBridge, isClaimedPolygonBridge }
36
36
  import { _isPosChainBridge, getClaimPosBridge } from '@subwallet/extension-base/services/balance-service/transfer/xcm/posBridge';
37
37
  import { _DEFAULT_MANTA_ZK_CHAIN, _MANTA_ZK_CHAIN_GROUP, _ZK_ASSET_PREFIX } from '@subwallet/extension-base/services/chain-service/constants';
38
38
  import { _ChainConnectionStatus } from '@subwallet/extension-base/services/chain-service/types';
39
- import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEvmCompatible, _isChainSubstrateCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isNativeTokenBySlug, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByCardano, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils';
39
+ import { _getAssetDecimals, _getAssetSymbol, _getChainNativeTokenBasicInfo, _getContractAddressOfToken, _getEvmChainId, _isAssetSmartContractNft, _isChainEnabled, _isChainEvmCompatible, _isChainSubstrateCompatible, _isCustomAsset, _isLocalToken, _isMantaZkAsset, _isNativeToken, _isNativeTokenBySlug, _isPureEvmChain, _isTokenEvmSmartContract, _isTokenTransferredByCardano, _isTokenTransferredByEvm, _isTokenTransferredByTon } from '@subwallet/extension-base/services/chain-service/utils';
40
40
  import { calculateToAmountByReservePool } from '@subwallet/extension-base/services/fee-service/utils';
41
41
  import { batchExtrinsicSetFeeHydration, getAssetHubTokensCanPayFee, getHydrationTokensCanPayFee } from '@subwallet/extension-base/services/fee-service/utils/tokenPayFee';
42
42
  import { EXTENSION_REQUEST_URL } from '@subwallet/extension-base/services/request-service/constants';
@@ -45,7 +45,7 @@ import { isProposalExpired, isSupportWalletConnectChain, isSupportWalletConnectN
45
45
  import { SWStorage } from '@subwallet/extension-base/storage';
46
46
  import { AccountsStore } from '@subwallet/extension-base/stores';
47
47
  import { AccountSignMode, BasicTxErrorType, BasicTxWarningCode, CommonStepType, EarningProcessType, ProcessType, StakingTxErrorType, StepStatus, SwapFeeType, YieldPoolType, YieldStepType } from '@subwallet/extension-base/types';
48
- import { _analyzeAddress, calculateMaxTransferable, combineAllAccountProxy, createTransactionFromRLP, detectTransferTxType, getAccountSignMode, isSameAddress, MODULE_SUPPORT, reformatAddress, signatureToHex, transformAccounts, transformAddresses, uniqueStringArray } from '@subwallet/extension-base/utils';
48
+ import { _analyzeAddress, calculateMaxTransferable, combineAllAccountProxy, createPromiseHandler, createTransactionFromRLP, detectTransferTxType, getAccountSignMode, isSameAddress, MODULE_SUPPORT, reformatAddress, signatureToHex, transformAccounts, transformAddresses, uniqueStringArray } from '@subwallet/extension-base/utils';
49
49
  import { parseContractInput, parseEvmRlp } from '@subwallet/extension-base/utils/eth/parseTransaction';
50
50
  import { getId } from '@subwallet/extension-base/utils/getId';
51
51
  import { getKeypairTypeByAddress, isAddress, isCardanoAddress, isSubstrateAddress, isTonAddress } from '@subwallet/keyring';
@@ -648,6 +648,63 @@ export default class KoniExtension {
648
648
  });
649
649
  });
650
650
  }
651
+ async switchCurrentNetworkAuthorization({
652
+ authSwitchNetworkType,
653
+ networkKey,
654
+ url
655
+ }) {
656
+ const authUrls = await this.#koniState.getAuthList();
657
+ const chainInfo = this.#koniState.chainService.getChainInfoByKey(networkKey);
658
+ const chainState = this.#koniState.getChainStateByKey(networkKey);
659
+ const {
660
+ promise,
661
+ resolve
662
+ } = createPromiseHandler();
663
+ const typeInfoMap = {
664
+ substrate: 'substrateInfo',
665
+ evm: 'evmInfo',
666
+ cardano: 'cardanoInfo',
667
+ ton: 'tonInfo'
668
+ };
669
+ const typeInfoKey = typeInfoMap[authSwitchNetworkType];
670
+ if (!typeInfoKey || !chainInfo[typeInfoKey]) {
671
+ throw new Error(t('Network {{networkKey}} is not {{authSwitchNetworkType}}', {
672
+ replace: {
673
+ networkKey,
674
+ authSwitchNetworkType
675
+ }
676
+ }));
677
+ }
678
+ const authUrl = authUrls[url];
679
+ if (!authUrl) {
680
+ throw new Error(t('Not found {{url}} in auth list', {
681
+ replace: {
682
+ url
683
+ }
684
+ }));
685
+ }
686
+ if (chainInfo && !_isChainEnabled(chainState)) {
687
+ await this.enableChainWithPriorityAssets({
688
+ chainSlug: networkKey,
689
+ enableTokens: true
690
+ });
691
+ }
692
+ if (!authUrl.accountAuthTypes.includes(authSwitchNetworkType)) {
693
+ throw new Error(t('Network {{networkKey}} is not supported by {{authSwitchNetworkType}}', {
694
+ replace: {
695
+ networkKey,
696
+ authSwitchNetworkType
697
+ }
698
+ }));
699
+ }
700
+ authUrl.currentNetworkMap[authSwitchNetworkType] = networkKey;
701
+ this.#koniState.setAuthorize(authUrls, () => {
702
+ resolve({
703
+ list: authUrls
704
+ });
705
+ });
706
+ return promise;
707
+ }
651
708
  changeAuthorization(data, id, port) {
652
709
  const cb = createSubscription(id, port);
653
710
  this._changeAuthorization(data.url, data.connectValue, items => {
@@ -2720,6 +2777,7 @@ export default class KoniExtension {
2720
2777
  getTransaction({
2721
2778
  id
2722
2779
  }) {
2780
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2723
2781
  const {
2724
2782
  transaction,
2725
2783
  ...transactionResult
@@ -2730,6 +2788,7 @@ export default class KoniExtension {
2730
2788
  const cb = createSubscription(id, port);
2731
2789
  function convertRs(rs, processMap) {
2732
2790
  return Object.fromEntries(Object.entries(rs).map(([key, value]) => {
2791
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
2733
2792
  const {
2734
2793
  additionalValidator,
2735
2794
  eventsHandler,
@@ -3767,6 +3826,7 @@ export default class KoniExtension {
3767
3826
  chainType,
3768
3827
  extrinsic,
3769
3828
  extrinsicType,
3829
+ isDutch,
3770
3830
  isPermit,
3771
3831
  transferNativeAmount,
3772
3832
  txChain,
@@ -3823,6 +3883,24 @@ export default class KoniExtension {
3823
3883
  step
3824
3884
  });
3825
3885
  }
3886
+ if (isDutch) {
3887
+ return await this.#koniState.transactionService.handleDutchTransaction({
3888
+ address,
3889
+ chain: txChain,
3890
+ transaction: extrinsic,
3891
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
3892
+ data: txData,
3893
+ extrinsicType,
3894
+ // change this depends on step
3895
+ chainType,
3896
+ resolveOnDone: !isLastStep,
3897
+ transferNativeAmount,
3898
+ ...this.createPassConfirmationParams(isPassConfirmation),
3899
+ errorOnTimeOut,
3900
+ eventsHandler,
3901
+ step
3902
+ });
3903
+ }
3826
3904
  return await this.#koniState.transactionService.handleTransaction({
3827
3905
  address,
3828
3906
  chain: txChain,
@@ -4234,6 +4312,8 @@ export default class KoniExtension {
4234
4312
  return this.getAuthListV2();
4235
4313
  case 'pri(authorize.toggle)':
4236
4314
  return this.toggleAuthorization2(request);
4315
+ case 'pri(authorize.switchCurrentNetwork)':
4316
+ return this.switchCurrentNetworkAuthorization(request);
4237
4317
  case 'pri(settings.changeBalancesVisibility)':
4238
4318
  return await this.toggleBalancesVisibility();
4239
4319