@subwallet/extension-base 1.3.6-1 → 1.3.8-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 (132) hide show
  1. package/background/KoniTypes.d.ts +20 -5
  2. package/background/KoniTypes.js +1 -1
  3. package/cjs/background/KoniTypes.js +1 -1
  4. package/cjs/constants/blocked-actions.js +108 -0
  5. package/cjs/constants/index.js +4 -4
  6. package/cjs/core/substrate/xcm-parser.js +20 -5
  7. package/cjs/koni/api/contract-handler/utils/index.js +15 -1
  8. package/cjs/koni/api/nft/config.js +6 -4
  9. package/cjs/koni/api/nft/index.js +9 -0
  10. package/cjs/koni/api/nft/story_odyssey_nft/index.js +126 -0
  11. package/cjs/koni/background/handlers/Extension.js +64 -4
  12. package/cjs/koni/background/handlers/State.js +23 -2
  13. package/cjs/packageInfo.js +1 -1
  14. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  15. package/cjs/services/balance-service/transfer/xcm/index.js +31 -1
  16. package/cjs/services/balance-service/transfer/xcm/polygonBridge.js +108 -0
  17. package/cjs/services/chain-online-service/constants.js +32 -0
  18. package/cjs/services/chain-online-service/index.js +190 -0
  19. package/cjs/services/chain-service/constants.js +2 -1
  20. package/cjs/services/chain-service/index.js +87 -127
  21. package/cjs/services/chain-service/utils/index.js +0 -2
  22. package/cjs/services/chain-service/utils/patch.js +7 -3
  23. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +20 -17
  24. package/cjs/services/environment-service/stores/Environment.js +19 -0
  25. package/cjs/services/fee-service/utils/index.js +14 -0
  26. package/cjs/services/inapp-notification-service/consts.js +6 -4
  27. package/cjs/services/inapp-notification-service/index.js +110 -6
  28. package/cjs/services/inapp-notification-service/interfaces.js +9 -1
  29. package/cjs/services/inapp-notification-service/utils/avail.js +88 -0
  30. package/cjs/services/inapp-notification-service/{utils.js → utils/common.js} +1 -84
  31. package/cjs/services/inapp-notification-service/utils/index.js +38 -0
  32. package/cjs/services/inapp-notification-service/utils/polygon.js +66 -0
  33. package/cjs/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +37 -0
  34. package/cjs/services/migration-service/scripts/index.js +3 -1
  35. package/cjs/services/setting-service/SettingService.js +21 -0
  36. package/cjs/services/setting-service/constants.js +2 -1
  37. package/cjs/services/storage-service/DatabaseService.js +3 -0
  38. package/cjs/services/transaction-service/index.js +13 -7
  39. package/cjs/services/transaction-service/utils.js +3 -0
  40. package/cjs/stores/ChainlistStore.js +18 -0
  41. package/cjs/stores/EnvironmentStore.js +18 -0
  42. package/cjs/stores/index.js +8 -1
  43. package/cjs/types/index.js +11 -0
  44. package/cjs/utils/account/transform.js +1 -1
  45. package/cjs/utils/environment.js +15 -1
  46. package/cjs/utils/staticData/index.js +7 -2
  47. package/constants/blocked-actions.d.ts +29 -0
  48. package/constants/blocked-actions.js +96 -0
  49. package/constants/index.d.ts +1 -1
  50. package/constants/index.js +1 -1
  51. package/core/substrate/xcm-parser.d.ts +2 -1
  52. package/core/substrate/xcm-parser.js +19 -5
  53. package/koni/api/contract-handler/utils/index.d.ts +2 -0
  54. package/koni/api/contract-handler/utils/index.js +12 -0
  55. package/koni/api/contract-handler/utils/polygon_bridge_abi.json +1004 -0
  56. package/koni/api/nft/config.d.ts +1 -1
  57. package/koni/api/nft/config.js +5 -2
  58. package/koni/api/nft/index.js +9 -0
  59. package/koni/api/nft/story_odyssey_nft/index.d.ts +40 -0
  60. package/koni/api/nft/story_odyssey_nft/index.js +119 -0
  61. package/koni/background/handlers/Extension.d.ts +5 -0
  62. package/koni/background/handlers/Extension.js +65 -5
  63. package/koni/background/handlers/State.d.ts +5 -0
  64. package/koni/background/handlers/State.js +23 -2
  65. package/package.json +76 -18
  66. package/packageInfo.js +1 -1
  67. package/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  68. package/services/balance-service/transfer/xcm/index.d.ts +1 -0
  69. package/services/balance-service/transfer/xcm/index.js +29 -1
  70. package/services/balance-service/transfer/xcm/polygonBridge.d.ts +22 -0
  71. package/services/balance-service/transfer/xcm/polygonBridge.js +95 -0
  72. package/services/chain-online-service/constants.d.ts +4 -0
  73. package/services/chain-online-service/constants.js +23 -0
  74. package/services/chain-online-service/index.d.ts +22 -0
  75. package/services/chain-online-service/index.js +182 -0
  76. package/services/chain-service/constants.d.ts +1 -0
  77. package/services/chain-service/constants.js +2 -1
  78. package/services/chain-service/index.d.ts +6 -7
  79. package/services/chain-service/index.js +78 -116
  80. package/services/chain-service/utils/index.js +0 -2
  81. package/services/chain-service/utils/patch.d.ts +16 -1
  82. package/services/chain-service/utils/patch.js +7 -3
  83. package/services/earning-service/handlers/native-staking/para-chain.js +20 -17
  84. package/services/environment-service/stores/Environment.d.ts +10 -0
  85. package/services/environment-service/stores/Environment.js +12 -0
  86. package/services/fee-service/utils/index.js +14 -0
  87. package/services/inapp-notification-service/consts.d.ts +3 -1
  88. package/services/inapp-notification-service/consts.js +6 -4
  89. package/services/inapp-notification-service/index.d.ts +10 -2
  90. package/services/inapp-notification-service/index.js +111 -7
  91. package/services/inapp-notification-service/interfaces.d.ts +27 -3
  92. package/services/inapp-notification-service/interfaces.js +7 -0
  93. package/services/inapp-notification-service/utils/avail.d.ts +40 -0
  94. package/services/inapp-notification-service/utils/avail.js +73 -0
  95. package/services/inapp-notification-service/utils/common.d.ts +11 -0
  96. package/services/inapp-notification-service/{utils.js → utils/common.js} +1 -72
  97. package/services/inapp-notification-service/utils/index.d.ts +3 -0
  98. package/services/inapp-notification-service/utils/index.js +6 -0
  99. package/services/inapp-notification-service/utils/polygon.d.ts +71 -0
  100. package/services/inapp-notification-service/utils/polygon.js +54 -0
  101. package/services/migration-service/scripts/MigrateTransactionHistoryBridge.d.ts +4 -0
  102. package/services/migration-service/scripts/MigrateTransactionHistoryBridge.js +29 -0
  103. package/services/migration-service/scripts/index.js +3 -1
  104. package/services/setting-service/SettingService.d.ts +9 -0
  105. package/services/setting-service/SettingService.js +21 -0
  106. package/services/setting-service/constants.js +2 -1
  107. package/services/storage-service/DatabaseService.d.ts +1 -0
  108. package/services/storage-service/DatabaseService.js +3 -0
  109. package/services/transaction-service/index.js +14 -8
  110. package/services/transaction-service/utils.js +3 -0
  111. package/stores/ChainlistStore.d.ts +7 -0
  112. package/stores/ChainlistStore.js +10 -0
  113. package/stores/EnvironmentStore.d.ts +5 -0
  114. package/stores/EnvironmentStore.js +10 -0
  115. package/stores/index.d.ts +1 -0
  116. package/stores/index.js +2 -1
  117. package/types/{avail-bridge → bridge}/index.d.ts +1 -1
  118. package/types/index.d.ts +1 -0
  119. package/types/index.js +1 -0
  120. package/types/notification/index.d.ts +5 -0
  121. package/utils/account/transform.js +1 -1
  122. package/utils/environment.d.ts +6 -0
  123. package/utils/environment.js +8 -0
  124. package/utils/staticData/blockedActions.json +1 -0
  125. package/utils/staticData/index.d.ts +7 -3
  126. package/utils/staticData/index.js +5 -1
  127. package/cjs/constants/blocked-actions-list.js +0 -14
  128. package/constants/blocked-actions-list.d.ts +0 -7
  129. package/constants/blocked-actions-list.js +0 -7
  130. package/services/inapp-notification-service/utils.d.ts +0 -55
  131. /package/cjs/types/{avail-bridge → bridge}/index.js +0 -0
  132. /package/types/{avail-bridge → bridge}/index.js +0 -0
@@ -33,6 +33,7 @@ var _token = require("@subwallet/extension-base/services/balance-service/transfe
33
33
  var _tonTransfer = require("@subwallet/extension-base/services/balance-service/transfer/ton-transfer");
34
34
  var _xcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm");
35
35
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
36
+ var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
36
37
  var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
37
38
  var _types2 = require("@subwallet/extension-base/services/chain-service/types");
38
39
  var _utils4 = require("@subwallet/extension-base/services/chain-service/utils");
@@ -1295,6 +1296,7 @@ class KoniExtension {
1295
1296
  const isAvailBridgeFromEvm = (0, _utils4._isPureEvmChain)(chainInfoMap[originNetworkKey]) && (0, _availBridge.isAvailChainBridge)(destinationNetworkKey);
1296
1297
  const isAvailBridgeFromAvail = (0, _availBridge.isAvailChainBridge)(originNetworkKey) && (0, _utils4._isPureEvmChain)(chainInfoMap[destinationNetworkKey]);
1297
1298
  const isSnowBridgeEvmTransfer = (0, _utils4._isPureEvmChain)(chainInfoMap[originNetworkKey]) && (0, _xcmParser._isSnowBridgeXcm)(chainInfoMap[originNetworkKey], chainInfoMap[destinationNetworkKey]) && !isAvailBridgeFromEvm;
1299
+ const isPolygonBridgeTransfer = (0, _polygonBridge._isPolygonChainBridge)(originNetworkKey, destinationNetworkKey);
1298
1300
  let additionalValidator;
1299
1301
  let eventsHandler;
1300
1302
  if (fromKeyPair && destinationTokenInfo) {
@@ -1311,7 +1313,9 @@ class KoniExtension {
1311
1313
  evmApi
1312
1314
  };
1313
1315
  let funcCreateExtrinsic;
1314
- if (isSnowBridgeEvmTransfer) {
1316
+ if (isPolygonBridgeTransfer) {
1317
+ funcCreateExtrinsic = _xcm.createPolygonBridgeExtrinsic;
1318
+ } else if (isSnowBridgeEvmTransfer) {
1315
1319
  funcCreateExtrinsic = _xcm.createSnowBridgeExtrinsic;
1316
1320
  } else if (isAvailBridgeFromEvm) {
1317
1321
  funcCreateExtrinsic = _xcm.createAvailBridgeTxFromEth;
@@ -1376,7 +1380,7 @@ class KoniExtension {
1376
1380
  transaction: extrinsic,
1377
1381
  data: inputData,
1378
1382
  extrinsicType: _KoniTypes.ExtrinsicType.TRANSFER_XCM,
1379
- chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM,
1383
+ chainType: !isSnowBridgeEvmTransfer && !isAvailBridgeFromEvm && !isPolygonBridgeTransfer ? _KoniTypes.ChainType.SUBSTRATE : _KoniTypes.ChainType.EVM,
1380
1384
  transferNativeAmount: (0, _utils4._isNativeToken)(originTokenInfo) ? value : '0',
1381
1385
  ignoreWarnings,
1382
1386
  isTransferAll: transferAll,
@@ -2578,7 +2582,6 @@ class KoniExtension {
2578
2582
  }
2579
2583
 
2580
2584
  // Phishing detect
2581
-
2582
2585
  async passPhishingPage(_ref46) {
2583
2586
  let {
2584
2587
  url
@@ -2586,6 +2589,20 @@ class KoniExtension {
2586
2589
  return await this.#koniState.approvePassPhishingPage(url);
2587
2590
  }
2588
2591
 
2592
+ // Set environment config
2593
+ saveAppConfig(request) {
2594
+ this.#koniState.saveEnvConfig('appConfig', request.appConfig);
2595
+ return true;
2596
+ }
2597
+ saveBrowserConfig(request) {
2598
+ this.#koniState.saveEnvConfig('browserConfig', request.browserConfig);
2599
+ return true;
2600
+ }
2601
+ saveOSConfig(request) {
2602
+ this.#koniState.saveEnvConfig('osConfig', request.osConfig);
2603
+ return true;
2604
+ }
2605
+
2589
2606
  /// Wallet connect
2590
2607
 
2591
2608
  // Connect
@@ -3439,7 +3456,7 @@ class KoniExtension {
3439
3456
  chain,
3440
3457
  notification
3441
3458
  } = data;
3442
- const extrinsicType = _KoniTypes.ExtrinsicType.CLAIM_AVAIL_BRIDGE;
3459
+ const extrinsicType = _KoniTypes.ExtrinsicType.CLAIM_BRIDGE;
3443
3460
  let transaction = null;
3444
3461
  let chainType;
3445
3462
  if ((0, _keyring.isSubstrateAddress)(address)) {
@@ -3460,6 +3477,32 @@ class KoniExtension {
3460
3477
  chainType
3461
3478
  });
3462
3479
  }
3480
+ async getIsClaimedPolygonBridge(data) {
3481
+ const evmApi = this.#koniState.getEvmApi(data.chainslug);
3482
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
3483
+ const isClaimed = await (0, _polygonBridge.isClaimedPolygonBridge)(data.chainslug, data.counter, data.sourceNetwork, evmApi);
3484
+ return isClaimed;
3485
+ }
3486
+ async submitClaimPolygonBridge(data) {
3487
+ const {
3488
+ address,
3489
+ chain,
3490
+ notification
3491
+ } = data;
3492
+ const extrinsicType = _KoniTypes.ExtrinsicType.CLAIM_BRIDGE;
3493
+ let transaction = null;
3494
+ const evmApi = this.#koniState.getEvmApi(chain);
3495
+ transaction = await (0, _polygonBridge.getClaimPolygonBridge)(chain, notification, evmApi);
3496
+ const chainType = _KoniTypes.ChainType.EVM;
3497
+ return await this.#koniState.transactionService.handleTransaction({
3498
+ address,
3499
+ chain,
3500
+ transaction,
3501
+ data,
3502
+ extrinsicType,
3503
+ chainType
3504
+ });
3505
+ }
3463
3506
 
3464
3507
  /* Ledger */
3465
3508
 
@@ -3875,6 +3918,14 @@ class KoniExtension {
3875
3918
  case 'pri(phishing.pass)':
3876
3919
  return await this.passPhishingPage(request);
3877
3920
 
3921
+ // Set Environment config
3922
+ case 'pri(settings.saveAppConfig)':
3923
+ return this.saveAppConfig(request);
3924
+ case 'pri(settings.saveBrowserConfig)':
3925
+ return this.saveBrowserConfig(request);
3926
+ case 'pri(settings.saveOSConfig)':
3927
+ return this.saveOSConfig(request);
3928
+
3878
3929
  /// Keyring state
3879
3930
  case 'pri(keyring.subscribe)':
3880
3931
  return this.keyringStateSubscribe(id, port);
@@ -4039,6 +4090,8 @@ class KoniExtension {
4039
4090
  return this.fetchInappNotifications(request);
4040
4091
  case 'pri(inappNotification.get)':
4041
4092
  return this.getInappNotification(request);
4093
+ case 'pri(inappNotification.isClaimedPolygonBridge)':
4094
+ return this.getIsClaimedPolygonBridge(request);
4042
4095
  /* Notification service */
4043
4096
 
4044
4097
  /* Avail Bridge */
@@ -4046,6 +4099,13 @@ class KoniExtension {
4046
4099
  return this.submitClaimAvailBridge(request);
4047
4100
  /* Avail Bridge */
4048
4101
 
4102
+ /* Polygon Bridge */
4103
+
4104
+ case 'pri(polygonBridge.submitClaimPolygonBridge)':
4105
+ return this.submitClaimPolygonBridge(request);
4106
+
4107
+ /* Polygon Bridge */
4108
+
4049
4109
  /* Ledger */
4050
4110
  case 'pri(ledger.generic.allow)':
4051
4111
  return this.subscribeLedgerGenericAllowChains(id, port);
@@ -15,6 +15,7 @@ var _balanceService = require("@subwallet/extension-base/services/balance-servic
15
15
  var _types = require("@subwallet/extension-base/services/base/types");
16
16
  var _buyService = _interopRequireDefault(require("@subwallet/extension-base/services/buy-service"));
17
17
  var _campaignService = _interopRequireDefault(require("@subwallet/extension-base/services/campaign-service"));
18
+ var _chainOnlineService = require("@subwallet/extension-base/services/chain-online-service");
18
19
  var _chainService = require("@subwallet/extension-base/services/chain-service");
19
20
  var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
20
21
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
@@ -112,6 +113,7 @@ class KoniState {
112
113
  this.feeService = new _service2.default(this);
113
114
  this.swapService = new _swapService.SwapService(this);
114
115
  this.inappNotificationService = new _inappNotificationService.InappNotificationService(this.dbService, this.keyringService, this.eventService, this.chainService);
116
+ this.chainOnlineService = new _chainOnlineService.ChainOnlineService(this.chainService, this.settingService, this.eventService, this.dbService);
115
117
  this.subscription = new _subscription.KoniSubscription(this, this.dbService);
116
118
  this.cron = new _cron.KoniCron(this, this.subscription, this.dbService);
117
119
  this.logger = (0, _util.logger)('State');
@@ -206,7 +208,6 @@ class KoniState {
206
208
  async init() {
207
209
  await this.eventService.waitCryptoReady;
208
210
  await this.chainService.init();
209
- this.afterChainServiceInit();
210
211
  await this.migrationService.run();
211
212
  this.campaignService.init();
212
213
  this.mktCampaignService.init();
@@ -222,7 +223,11 @@ class KoniState {
222
223
  // TODO: consider moving this to a separate service
223
224
  await this.dbService.stores.crowdloan.removeEndedCrowdloans();
224
225
  await this.startSubscription();
226
+ this.chainOnlineService.checkLatestData();
225
227
  this.chainService.checkLatestData();
228
+ this.chainService.subscribeChainInfoMap().subscribe(() => {
229
+ this.afterChainServiceInit();
230
+ });
226
231
  }
227
232
  async initMantaPay(password) {
228
233
  var _this$chainService, _this$chainService$ma;
@@ -792,6 +797,7 @@ class KoniState {
792
797
  return this.chainService.stopAllChainApis();
793
798
  }
794
799
  async resumeAllNetworks() {
800
+ this.chainOnlineService.checkLatestData();
795
801
  return this.chainService.resumeAllChainApis();
796
802
  }
797
803
  publishCrowdloan(reset) {
@@ -1322,6 +1328,18 @@ class KoniState {
1322
1328
  });
1323
1329
  });
1324
1330
  }
1331
+ saveEnvConfig(key, value) {
1332
+ this.settingService.getEnvironmentList(config => {
1333
+ const newSettings = {
1334
+ ...config,
1335
+ [key]: value
1336
+ };
1337
+ this.settingService.setEnvironment(newSettings);
1338
+ });
1339
+ }
1340
+ initEnvConfig(envConfig) {
1341
+ this.settingService.setEnvironment(envConfig);
1342
+ }
1325
1343
  async resetWallet(resetAll) {
1326
1344
  await this.keyringService.resetWallet(resetAll);
1327
1345
  await this.earningService.resetYieldPosition();
@@ -1339,8 +1357,11 @@ class KoniState {
1339
1357
  this.chainService.resetWallet(resetAll);
1340
1358
  await this.walletConnectService.resetWallet(resetAll);
1341
1359
  await this.chainService.init();
1342
- this.afterChainServiceInit();
1360
+ this.chainOnlineService.checkLatestData();
1343
1361
  this.chainService.checkLatestData();
1362
+ this.chainService.subscribeChainInfoMap().subscribe(() => {
1363
+ this.afterChainServiceInit();
1364
+ });
1344
1365
  }
1345
1366
  async enableMantaPay(updateStore, address, password, seedPhrase) {
1346
1367
  var _this$chainService3, _this$chainService3$m, _this$chainService4, _this$chainService4$m, _this$chainService4$m2, _this$chainService11, _this$chainService11$, _this$chainService11$2;
@@ -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.6-1'
16
+ version: '1.3.8-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -202,11 +202,12 @@ const subscribeForeignAssetBalance = async _ref2 => {
202
202
  const unsubList = await Promise.all(Object.values(tokenMap).map(tokenInfo => {
203
203
  try {
204
204
  if ((0, _utils2._isBridgedToken)(tokenInfo)) {
205
+ const version = ['statemint', 'statemine'].includes(chainInfo.slug) ? 4 : 3;
205
206
  const params = [{
206
207
  section: 'query',
207
208
  module: foreignAssetsAccountKey.split('_')[1],
208
209
  method: foreignAssetsAccountKey.split('_')[2],
209
- args: addresses.map(address => [(0, _utils2._getTokenOnChainInfo)(tokenInfo) || (0, _xcmParser._adaptX1Interior)((0, _utils2._getXcmAssetMultilocation)(tokenInfo), 3), address])
210
+ args: addresses.map(address => [(0, _utils2._getTokenOnChainInfo)(tokenInfo) || (0, _xcmParser._adaptX1Interior)((0, _utils2._getXcmAssetMultilocation)(tokenInfo), version), address])
210
211
  }];
211
212
  return substrateApi.subscribeDataWithMulti(params, rs => {
212
213
  const balances = rs[foreignAssetsAccountKey];
@@ -4,10 +4,11 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
4
4
  Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
- exports.getXcmMockTxFee = exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = void 0;
7
+ exports.getXcmMockTxFee = exports.createXcmExtrinsic = exports.createSnowBridgeExtrinsic = exports.createPolygonBridgeExtrinsic = exports.createAvailBridgeTxFromEth = exports.createAvailBridgeExtrinsicFromAvail = void 0;
8
8
  var _xcmParser = require("@subwallet/extension-base/core/substrate/xcm-parser");
9
9
  var _availBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/availBridge");
10
10
  var _polkadotXcm = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polkadotXcm");
11
+ var _polygonBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/polygonBridge");
11
12
  var _snowBridge = require("@subwallet/extension-base/services/balance-service/transfer/xcm/snowBridge");
12
13
  var _xcmPallet = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xcmPallet");
13
14
  var _xTokens = require("@subwallet/extension-base/services/balance-service/transfer/xcm/xTokens");
@@ -100,6 +101,35 @@ const createAvailBridgeExtrinsicFromAvail = async _ref4 => {
100
101
  return await (0, _availBridge.getAvailBridgeExtrinsicFromAvail)(recipient, sendingValue, substrateApi);
101
102
  };
102
103
  exports.createAvailBridgeExtrinsicFromAvail = createAvailBridgeExtrinsicFromAvail;
104
+ const createPolygonBridgeExtrinsic = async _ref5 => {
105
+ let {
106
+ chainInfoMap,
107
+ destinationTokenInfo,
108
+ evmApi,
109
+ originTokenInfo,
110
+ recipient,
111
+ sender,
112
+ sendingValue
113
+ } = _ref5;
114
+ const originChainInfo = chainInfoMap[originTokenInfo.originChain];
115
+ const destinationChainInfo = chainInfoMap[destinationTokenInfo.originChain];
116
+ if (!(0, _xcmParser._isPolygonBridgeXcm)(originChainInfo, destinationChainInfo)) {
117
+ throw new Error('This is not a valid PolygonBridge transfer');
118
+ }
119
+ if (!evmApi) {
120
+ throw Error('Evm API is not available');
121
+ }
122
+ if (!sender) {
123
+ throw Error('Sender is required');
124
+ }
125
+ const sourceChain = originChainInfo.slug;
126
+ if (sourceChain === 'polygonzkEvm_cardona' || sourceChain === 'polygonZkEvm') {
127
+ return (0, _polygonBridge._createPolygonBridgeL2toL1Extrinsic)(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi);
128
+ } else {
129
+ return (0, _polygonBridge._createPolygonBridgeL1toL2Extrinsic)(originTokenInfo, originChainInfo, sender, recipient, sendingValue, evmApi);
130
+ }
131
+ };
132
+ exports.createPolygonBridgeExtrinsic = createPolygonBridgeExtrinsic;
103
133
  const getXcmMockTxFee = async (substrateApi, chainInfoMap, originTokenInfo, destinationTokenInfo) => {
104
134
  try {
105
135
  var _paymentInfo$partialF;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.POLYGON_PROOF_INDEXER = exports.POLYGON_GAS_INDEXER = void 0;
7
+ exports._createPolygonBridgeL1toL2Extrinsic = _createPolygonBridgeL1toL2Extrinsic;
8
+ exports._createPolygonBridgeL2toL1Extrinsic = _createPolygonBridgeL2toL1Extrinsic;
9
+ exports._isPolygonChainBridge = _isPolygonChainBridge;
10
+ exports.getClaimPolygonBridge = getClaimPolygonBridge;
11
+ exports.isClaimedPolygonBridge = isClaimedPolygonBridge;
12
+ var _chainList = require("@subwallet/chain-list");
13
+ var _web = require("@subwallet/extension-base/koni/api/contract-handler/evm/web3");
14
+ var _utils = require("@subwallet/extension-base/koni/api/contract-handler/utils");
15
+ var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
16
+ var _utils3 = require("@subwallet/extension-base/services/fee-service/utils");
17
+ // Copyright 2019-2022 @subwallet/extension-base
18
+ // SPDX-License-Identifier: Apache-2.0
19
+
20
+ const POLYGON_PROOF_INDEXER = {
21
+ MAINNET: 'https://api-gateway.polygon.technology/api/v3/proof/mainnet/merkle-proof',
22
+ TESTNET: 'https://api-gateway.polygon.technology/api/v3/proof/testnet/merkle-proof'
23
+ };
24
+ exports.POLYGON_PROOF_INDEXER = POLYGON_PROOF_INDEXER;
25
+ const POLYGON_GAS_INDEXER = {
26
+ MAINNET: 'https://gasstation.polygon.technology/zkevm',
27
+ TESTNET: 'https://gasstation.polygon.technology/zkevm/cardona'
28
+ };
29
+ exports.POLYGON_GAS_INDEXER = POLYGON_GAS_INDEXER;
30
+ async function createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, destinationNetwork, evmApi) {
31
+ var _priority$maxFeePerGa, _priority$maxPriority;
32
+ const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(originChainInfo.slug);
33
+ const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
34
+ const tokenContract = (0, _utils2._getContractAddressOfToken)(tokenInfo) || '0x0000000000000000000000000000000000000000'; // FOR Ethereum: use null address
35
+
36
+ if (tokenContract !== '0x0000000000000000000000000000000000000000') {
37
+ throw new Error('Only native token transfer is supported');
38
+ }
39
+
40
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
41
+ const transferCall = polygonBridgeContract.methods.bridgeAsset(destinationNetwork, recipientAddress, value, tokenContract, true, '0x');
42
+ const transferEncodedCall = transferCall.encodeABI();
43
+ const priority = await (0, _utils3.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
44
+ const transactionConfig = {
45
+ from: sender,
46
+ to: polygonBridgeContractAddress,
47
+ value: value,
48
+ data: transferEncodedCall,
49
+ gasPrice: priority.gasPrice,
50
+ maxFeePerGas: priority === null || priority === void 0 ? void 0 : (_priority$maxFeePerGa = priority.maxFeePerGas) === null || _priority$maxFeePerGa === void 0 ? void 0 : _priority$maxFeePerGa.toString(),
51
+ maxPriorityFeePerGas: priority === null || priority === void 0 ? void 0 : (_priority$maxPriority = priority.maxPriorityFeePerGas) === null || _priority$maxPriority === void 0 ? void 0 : _priority$maxPriority.toString()
52
+ };
53
+ const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000);
54
+ transactionConfig.gas = gasLimit.toString();
55
+ return transactionConfig;
56
+ }
57
+ async function _createPolygonBridgeL1toL2Extrinsic(tokenInfo, originChainInfo, sender, recipientAddress, value, evmApi) {
58
+ return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 1, evmApi);
59
+ }
60
+ async function _createPolygonBridgeL2toL1Extrinsic(tokenInfo, originChainInfo, sender, recipientAddress, value, evmApi) {
61
+ return createPolygonBridgeTransaction(tokenInfo, originChainInfo, sender, recipientAddress, value, 0, evmApi);
62
+ }
63
+ async function getClaimPolygonBridge(chainSlug, notification, evmApi) {
64
+ var _priority$maxFeePerGa2, _priority$maxPriority2;
65
+ const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(chainSlug);
66
+ const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
67
+ const metadata = notification.metadata;
68
+ const isTestnet = chainSlug === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA;
69
+ const proofDomain = isTestnet ? POLYGON_PROOF_INDEXER.TESTNET : POLYGON_PROOF_INDEXER.MAINNET;
70
+ const proofResponse = await fetch(`${proofDomain}?networkId=${metadata.sourceNetwork}&depositCount=${metadata.counter}`).then(res => res.json());
71
+ const proof = proofResponse.proof;
72
+
73
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
74
+ const transferCall = polygonBridgeContract.methods.claimAsset(proof.merkle_proof, proof.rollup_merkle_proof, metadata.counter, proof.main_exit_root, proof.rollup_exit_root, metadata.originTokenNetwork, metadata.originTokenAddress, metadata.destinationNetwork, metadata.receiver, metadata.amounts[0], '0x');
75
+ const transferEncodedCall = transferCall.encodeABI();
76
+ const priority = await (0, _utils3.calculateGasFeeParams)(evmApi, evmApi.chainSlug);
77
+ const transactionConfig = {
78
+ from: metadata.userAddress,
79
+ to: polygonBridgeContractAddress,
80
+ value: '0',
81
+ data: transferEncodedCall,
82
+ gasPrice: priority.gasPrice,
83
+ maxFeePerGas: (_priority$maxFeePerGa2 = priority.maxFeePerGas) === null || _priority$maxFeePerGa2 === void 0 ? void 0 : _priority$maxFeePerGa2.toString(),
84
+ maxPriorityFeePerGas: (_priority$maxPriority2 = priority.maxPriorityFeePerGas) === null || _priority$maxPriority2 === void 0 ? void 0 : _priority$maxPriority2.toString()
85
+ };
86
+ const gasLimit = await evmApi.api.eth.estimateGas(transactionConfig).catch(() => 200000);
87
+ transactionConfig.gas = gasLimit.toString();
88
+ return transactionConfig;
89
+ }
90
+ async function isClaimedPolygonBridge(chainSlug, counter, sourceNetwork, evmApi) {
91
+ const polygonBridgeContractAddress = (0, _utils.getPolygonBridgeContract)(chainSlug);
92
+ const polygonBridgeContract = (0, _web.getWeb3Contract)(polygonBridgeContractAddress, evmApi, _utils._POLYGON_BRIDGE_ABI);
93
+
94
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-return,@typescript-eslint/no-unsafe-member-access
95
+ return await polygonBridgeContract.methods.isClaimed(counter, sourceNetwork).call();
96
+ }
97
+ function _isPolygonChainBridge(srcChain, destChain) {
98
+ if (srcChain === 'polygonzkEvm_cardona' && destChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA) {
99
+ return true;
100
+ } else if (srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM_SEPOLIA && destChain === 'polygonzkEvm_cardona') {
101
+ return true;
102
+ } else if (srcChain === 'polygonZkEvm' && destChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM) {
103
+ return true;
104
+ } else if (srcChain === _chainList.COMMON_CHAIN_SLUGS.ETHEREUM && destChain === 'polygonZkEvm') {
105
+ return true;
106
+ }
107
+ return false;
108
+ }
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.LATEST_CHAIN_PATCH_FETCHING_INTERVAL = void 0;
7
+ exports.md5HashChainAsset = md5HashChainAsset;
8
+ exports.md5HashChainInfo = md5HashChainInfo;
9
+ var _tsMd = require("ts-md5");
10
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
11
+ // SPDX-License-Identifier: Apache-2.0
12
+
13
+ const LATEST_CHAIN_PATCH_FETCHING_INTERVAL = 180000;
14
+ exports.LATEST_CHAIN_PATCH_FETCHING_INTERVAL = LATEST_CHAIN_PATCH_FETCHING_INTERVAL;
15
+ function md5HashChainInfo(data) {
16
+ // todo: use from chain list package later
17
+ const {
18
+ chainStatus,
19
+ icon,
20
+ providers,
21
+ ...chainBaseInfo
22
+ } = data;
23
+ return _tsMd.Md5.hashStr(JSON.stringify(chainBaseInfo));
24
+ }
25
+ function md5HashChainAsset(data) {
26
+ // todo: use from chain list package later
27
+ const {
28
+ icon,
29
+ ...assetBaseInfo
30
+ } = data;
31
+ return _tsMd.Md5.hashStr(JSON.stringify(assetBaseInfo));
32
+ }
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ChainOnlineService = void 0;
7
+ var _chainList = require("@subwallet/chain-list");
8
+ var _constants = require("@subwallet/extension-base/services/chain-online-service/constants");
9
+ var _chainService = require("@subwallet/extension-base/services/chain-service");
10
+ var _types = require("@subwallet/extension-base/services/chain-service/types");
11
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
13
+ // SPDX-License-Identifier: Apache-2.0
14
+
15
+ class ChainOnlineService {
16
+ constructor(chainService, settingService, eventService, dbService) {
17
+ this.chainService = chainService;
18
+ this.settingService = settingService;
19
+ this.eventService = eventService;
20
+ this.dbService = dbService;
21
+ this.firstApplied = false;
22
+ }
23
+ validatePatchWithHash(latestPatch) {
24
+ const {
25
+ ChainAsset,
26
+ ChainAssetHashMap,
27
+ ChainInfo,
28
+ ChainInfoHashMap
29
+ } = latestPatch;
30
+ for (const [chainSlug, chain] of Object.entries(ChainInfo)) {
31
+ if ((0, _constants.md5HashChainInfo)(chain) !== ChainInfoHashMap[chainSlug]) {
32
+ return false;
33
+ }
34
+ }
35
+ for (const [assetSlug, asset] of Object.entries(ChainAsset)) {
36
+ if ((0, _constants.md5HashChainAsset)(asset) !== ChainAssetHashMap[assetSlug]) {
37
+ return false;
38
+ }
39
+ }
40
+ return true;
41
+ }
42
+ validatePatchBeforeStore(candidateChainInfoMap, candidateAssetRegistry, latestPatch) {
43
+ for (const [chainSlug, chainHash] of Object.entries(latestPatch.ChainInfoHashMap)) {
44
+ if ((0, _constants.md5HashChainInfo)(candidateChainInfoMap[chainSlug]) !== chainHash) {
45
+ return false;
46
+ }
47
+ }
48
+ for (const [assetSlug, assetHash] of Object.entries(latestPatch.ChainAssetHashMap)) {
49
+ if (!candidateAssetRegistry[assetSlug]) {
50
+ if (!latestPatch.ChainInfo[assetSlug]) {
51
+ // assets are not existed in case chain is removed
52
+ continue;
53
+ }
54
+ return false;
55
+ }
56
+ if ((0, _constants.md5HashChainAsset)(candidateAssetRegistry[assetSlug]) !== assetHash) {
57
+ return false;
58
+ }
59
+ }
60
+ return true;
61
+ }
62
+ async handleLatestPatch(latestPatch) {
63
+ try {
64
+ var _await$this$settingSe;
65
+ // 1. validate fetch data with its hash
66
+ const isSafePatch = this.validatePatchWithHash(latestPatch);
67
+ const {
68
+ AssetLogoMap: latestAssetLogoMap,
69
+ ChainAsset: latestAssetInfo,
70
+ ChainInfo: latestChainInfo,
71
+ ChainLogoMap: latestChainLogoMap,
72
+ patchVersion: latestPatchVersion
73
+ } = latestPatch;
74
+ const currentPatchVersion = ((_await$this$settingSe = await this.settingService.getChainlistSetting()) === null || _await$this$settingSe === void 0 ? void 0 : _await$this$settingSe.patchVersion) || '';
75
+ const oldChainInfoMap = structuredClone(this.chainService.getChainInfoMap());
76
+ const oldAssetRegistry = structuredClone(this.chainService.getAssetRegistry());
77
+ let chainInfoMap = structuredClone(this.chainService.getChainInfoMap());
78
+ let assetRegistry = structuredClone(this.chainService.getAssetRegistry());
79
+ const currentChainStateMap = structuredClone(this.chainService.getChainStateMap());
80
+ const currentChainStatusMap = structuredClone(this.chainService.getChainStatusMap());
81
+ let addedChain = [];
82
+ if (isSafePatch && (!this.firstApplied || currentPatchVersion !== latestPatchVersion)) {
83
+ this.firstApplied = true;
84
+
85
+ // 2. merge data map
86
+ if (latestChainInfo && Object.keys(latestChainInfo).length > 0) {
87
+ chainInfoMap = Object.assign({}, oldChainInfoMap, latestChainInfo);
88
+ const [currentChainStateKey, newChainKey] = [Object.keys(currentChainStateMap), Object.keys(chainInfoMap)];
89
+ addedChain = newChainKey.filter(chain => !currentChainStateKey.includes(chain));
90
+ addedChain.forEach(key => {
91
+ currentChainStateMap[key] = {
92
+ active: false,
93
+ currentProvider: (0, _utils.randomizeProvider)(chainInfoMap[key].providers).providerKey,
94
+ manualTurnOff: false,
95
+ slug: key
96
+ };
97
+ currentChainStatusMap[key] = {
98
+ slug: key,
99
+ connectionStatus: _types._ChainConnectionStatus.DISCONNECTED,
100
+ lastUpdated: Date.now()
101
+ };
102
+ });
103
+ }
104
+ if (latestAssetInfo && Object.keys(latestAssetInfo).length > 0) {
105
+ assetRegistry = (0, _chainService.filterAssetInfoMap)(oldChainInfoMap, Object.assign({}, oldAssetRegistry, latestAssetInfo), addedChain);
106
+ }
107
+
108
+ // 3. validate data before write
109
+ const isCorrectPatch = this.validatePatchBeforeStore(chainInfoMap, assetRegistry, latestPatch);
110
+
111
+ // 4. write to subject
112
+ if (isCorrectPatch) {
113
+ this.chainService.setChainInfoMap(chainInfoMap);
114
+ this.chainService.subscribeChainInfoMap().next(chainInfoMap);
115
+ this.chainService.setAssetRegistry(assetRegistry);
116
+ this.chainService.subscribeAssetRegistry().next(assetRegistry);
117
+ this.chainService.autoEnableTokens().then(() => {
118
+ this.eventService.emit('asset.updateState', '');
119
+ }).catch(console.error);
120
+ this.chainService.setChainStateMap(currentChainStateMap);
121
+ this.chainService.subscribeChainStateMap().next(currentChainStateMap);
122
+ this.chainService.subscribeChainStatusMap().next(currentChainStatusMap);
123
+ const storedChainInfoList = Object.keys(chainInfoMap).map(chainSlug => {
124
+ return {
125
+ ...chainInfoMap[chainSlug],
126
+ ...currentChainStateMap[chainSlug]
127
+ };
128
+ });
129
+ await this.dbService.bulkUpdateChainStore(storedChainInfoList);
130
+ const addedAssets = [];
131
+
132
+ // todo: the stored asset is lack of adding new assets and edited assets of old chain, update to tracking exactly updated assets from patch online.
133
+ Object.entries(assetRegistry).forEach(_ref => {
134
+ let [slug, asset] = _ref;
135
+ if (addedChain.includes(asset.originChain)) {
136
+ addedAssets.push(asset);
137
+ }
138
+ });
139
+ await this.dbService.bulkUpdateAssetsStore(addedAssets);
140
+ if (latestChainLogoMap) {
141
+ const logoMap = Object.assign({}, _chainList.ChainLogoMap, latestChainLogoMap);
142
+ this.chainService.subscribeChainLogoMap().next(logoMap);
143
+ }
144
+ if (latestAssetLogoMap) {
145
+ const logoMap = Object.assign({}, _chainList.AssetLogoMap, latestAssetLogoMap);
146
+ this.chainService.subscribeAssetLogoMap().next(logoMap);
147
+ }
148
+ this.settingService.setChainlist({
149
+ patchVersion: latestPatchVersion
150
+ });
151
+ }
152
+ }
153
+ } catch (e) {
154
+ console.error('Error fetching latest patch data');
155
+ }
156
+ }
157
+ async fetchLatestPatchData() {
158
+ return await (0, _utils.fetchPatchData)();
159
+ }
160
+ handleLatestPatchData() {
161
+ this.fetchLatestPatchData().then(latestPatch => {
162
+ return new Promise(resolve => {
163
+ if (latestPatch && !this.chainService.getlockChainInfoMap()) {
164
+ this.eventService.waitAssetReady.then(() => {
165
+ this.chainService.setLockChainInfoMap(true);
166
+ this.handleLatestPatch(latestPatch).then(() => this.chainService.setLockChainInfoMap(false)).catch(e => {
167
+ this.chainService.setLockChainInfoMap(false);
168
+ console.error('Error update latest patch', e);
169
+ }).finally(resolve);
170
+ }).catch(e => {
171
+ console.error('Asset fail to ready', e);
172
+ resolve();
173
+ });
174
+ } else {
175
+ resolve();
176
+ }
177
+ });
178
+ }).catch(e => {
179
+ console.error('Error get latest patch or data map is locking', e);
180
+ }).finally(() => {
181
+ this.eventService.emit('asset.online.ready', true);
182
+ });
183
+ }
184
+ checkLatestData() {
185
+ clearInterval(this.refreshLatestChainDataTimeOut);
186
+ this.handleLatestPatchData();
187
+ this.refreshLatestChainDataTimeOut = setInterval(this.handleLatestPatchData.bind(this), _constants.LATEST_CHAIN_PATCH_FETCHING_INTERVAL);
188
+ }
189
+ }
190
+ exports.ChainOnlineService = ChainOnlineService;
@@ -66,7 +66,8 @@ const _NFT_CHAIN_GROUP = {
66
66
  vara: ['vara_network'],
67
67
  avail: ['avail_mainnet'],
68
68
  ternoa: ['ternoa', 'ternoa_alphanet'],
69
- rari: ['rari']
69
+ rari: ['rari'],
70
+ story_odyssey: ['storyOdyssey', 'storyOdyssey_testnet']
70
71
  };
71
72
 
72
73
  // Staking--------------------------------------------------------------------------------------------------------------