@subwallet/extension-base 1.3.31-0 → 1.3.32-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 (129) hide show
  1. package/background/KoniTypes.d.ts +70 -3
  2. package/background/KoniTypes.js +14 -0
  3. package/background/errors/CardanoProviderError.d.ts +6 -0
  4. package/background/errors/CardanoProviderError.js +61 -0
  5. package/background/types.d.ts +2 -2
  6. package/cjs/background/KoniTypes.js +16 -1
  7. package/cjs/background/errors/CardanoProviderError.js +67 -0
  8. package/cjs/constants/index.js +4 -1
  9. package/cjs/core/logic-validation/request.js +50 -3
  10. package/cjs/koni/api/contract-handler/evm/web3.js +21 -0
  11. package/cjs/koni/api/staking/bonding/utils.js +24 -3
  12. package/cjs/koni/background/handlers/Extension.js +115 -107
  13. package/cjs/koni/background/handlers/State.js +228 -5
  14. package/cjs/koni/background/handlers/Tabs.js +277 -55
  15. package/cjs/packageInfo.js +1 -1
  16. package/cjs/page/cardano/cips/cip30.js +63 -0
  17. package/cjs/page/cardano/cips/index.js +20 -0
  18. package/cjs/page/cardano/index.js +41 -0
  19. package/cjs/page/{SubWalleEvmProvider.js → evm/index.js} +2 -2
  20. package/cjs/page/index.js +9 -4
  21. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +33 -1
  22. package/cjs/services/balance-service/transfer/xcm/acrossBridge/index.js +6 -2
  23. package/cjs/services/balance-service/transfer/xcm/index.js +2 -0
  24. package/cjs/services/chain-service/handler/CardanoApi.js +33 -0
  25. package/cjs/services/chain-service/index.js +31 -0
  26. package/cjs/services/chain-service/utils/patch.js +1 -1
  27. package/cjs/services/earning-service/handlers/liquid-staking/stella-swap.js +3 -3
  28. package/cjs/services/earning-service/handlers/native-staking/dtao.js +2 -2
  29. package/cjs/services/earning-service/handlers/native-staking/mythos.js +42 -8
  30. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
  31. package/cjs/services/earning-service/handlers/native-staking/tao.js +13 -13
  32. package/cjs/services/earning-service/handlers/nomination-pool/index.js +1 -1
  33. package/cjs/services/migration-service/scripts/MigrateAuthUrls.js +1 -1
  34. package/cjs/services/request-service/constants.js +3 -1
  35. package/cjs/services/request-service/handler/AuthRequestHandler.js +38 -5
  36. package/cjs/services/request-service/handler/CardanoRequestHandler.js +45 -3
  37. package/cjs/services/request-service/helper/index.js +419 -1
  38. package/cjs/services/swap-service/handler/asset-hub/handler.js +1 -1
  39. package/cjs/services/swap-service/handler/base-handler.js +81 -21
  40. package/cjs/services/swap-service/handler/hydradx-handler.js +1 -1
  41. package/cjs/services/swap-service/handler/uniswap-handler.js +274 -45
  42. package/cjs/services/swap-service/index.js +33 -11
  43. package/cjs/services/swap-service/utils.js +15 -2
  44. package/cjs/utils/auth.js +2 -1
  45. package/cjs/utils/cardano.js +20 -0
  46. package/cjs/utils/index.js +4 -4
  47. package/constants/index.d.ts +1 -0
  48. package/constants/index.js +1 -0
  49. package/core/logic-validation/request.d.ts +6 -2
  50. package/core/logic-validation/request.js +51 -5
  51. package/koni/api/contract-handler/evm/web3.d.ts +2 -0
  52. package/koni/api/contract-handler/evm/web3.js +19 -0
  53. package/koni/api/staking/bonding/utils.d.ts +2 -1
  54. package/koni/api/staking/bonding/utils.js +23 -3
  55. package/koni/background/handlers/Extension.js +7 -2
  56. package/koni/background/handlers/State.d.ts +6 -1
  57. package/koni/background/handlers/State.js +223 -4
  58. package/koni/background/handlers/Tabs.d.ts +11 -1
  59. package/koni/background/handlers/Tabs.js +242 -19
  60. package/package.json +62 -42
  61. package/packageInfo.js +1 -1
  62. package/page/cardano/cips/cip30.d.ts +22 -0
  63. package/page/cardano/cips/cip30.js +55 -0
  64. package/page/cardano/cips/index.d.ts +3 -0
  65. package/page/cardano/cips/index.js +7 -0
  66. package/page/cardano/index.d.ts +13 -0
  67. package/page/cardano/index.js +34 -0
  68. package/page/{SubWalleEvmProvider.d.ts → evm/index.d.ts} +3 -2
  69. package/page/{SubWalleEvmProvider.js → evm/index.js} +1 -1
  70. package/page/index.d.ts +3 -2
  71. package/page/index.js +6 -2
  72. package/page/{Accounts.d.ts → substrate/Accounts.d.ts} +1 -1
  73. package/page/{Metadata.d.ts → substrate/Metadata.d.ts} +1 -1
  74. package/page/{PostMessageProvider.d.ts → substrate/PostMessageProvider.d.ts} +1 -1
  75. package/page/{Signer.d.ts → substrate/Signer.d.ts} +1 -1
  76. package/page/{Injected.d.ts → substrate/index.d.ts} +1 -1
  77. package/services/balance-service/helpers/subscribe/cardano/types.d.ts +14 -0
  78. package/services/balance-service/helpers/subscribe/substrate/index.js +34 -2
  79. package/services/balance-service/transfer/xcm/acrossBridge/index.d.ts +4 -0
  80. package/services/balance-service/transfer/xcm/acrossBridge/index.js +4 -1
  81. package/services/balance-service/transfer/xcm/index.js +2 -0
  82. package/services/chain-service/handler/CardanoApi.d.ts +3 -1
  83. package/services/chain-service/handler/CardanoApi.js +33 -0
  84. package/services/chain-service/index.d.ts +5 -1
  85. package/services/chain-service/index.js +32 -1
  86. package/services/chain-service/utils/patch.js +1 -1
  87. package/services/earning-service/handlers/liquid-staking/stella-swap.js +3 -3
  88. package/services/earning-service/handlers/native-staking/dtao.js +2 -2
  89. package/services/earning-service/handlers/native-staking/mythos.js +42 -8
  90. package/services/earning-service/handlers/native-staking/relay-chain.js +1 -1
  91. package/services/earning-service/handlers/native-staking/tao.js +14 -14
  92. package/services/earning-service/handlers/nomination-pool/index.js +1 -1
  93. package/services/migration-service/scripts/MigrateAuthUrls.js +1 -1
  94. package/services/request-service/constants.js +3 -1
  95. package/services/request-service/handler/AuthRequestHandler.js +40 -7
  96. package/services/request-service/handler/CardanoRequestHandler.d.ts +2 -0
  97. package/services/request-service/handler/CardanoRequestHandler.js +45 -3
  98. package/services/request-service/helper/index.d.ts +54 -0
  99. package/services/request-service/helper/index.js +406 -1
  100. package/services/request-service/types.d.ts +3 -1
  101. package/services/swap-service/handler/asset-hub/handler.js +1 -1
  102. package/services/swap-service/handler/base-handler.d.ts +3 -1
  103. package/services/swap-service/handler/base-handler.js +82 -22
  104. package/services/swap-service/handler/hydradx-handler.js +1 -1
  105. package/services/swap-service/handler/uniswap-handler.d.ts +5 -0
  106. package/services/swap-service/handler/uniswap-handler.js +275 -46
  107. package/services/swap-service/index.js +34 -12
  108. package/services/swap-service/utils.d.ts +3 -2
  109. package/services/swap-service/utils.js +13 -1
  110. package/types/swap/index.d.ts +1 -0
  111. package/types/transaction/process.d.ts +2 -0
  112. package/utils/auth.js +3 -2
  113. package/utils/cardano.d.ts +2 -0
  114. package/utils/cardano.js +12 -0
  115. package/utils/index.d.ts +1 -1
  116. package/utils/index.js +1 -1
  117. package/cjs/utils/canDerive.js +0 -12
  118. package/utils/canDerive.d.ts +0 -2
  119. package/utils/canDerive.js +0 -6
  120. /package/cjs/page/{Accounts.js → substrate/Accounts.js} +0 -0
  121. /package/cjs/page/{Metadata.js → substrate/Metadata.js} +0 -0
  122. /package/cjs/page/{PostMessageProvider.js → substrate/PostMessageProvider.js} +0 -0
  123. /package/cjs/page/{Signer.js → substrate/Signer.js} +0 -0
  124. /package/cjs/page/{Injected.js → substrate/index.js} +0 -0
  125. /package/page/{Accounts.js → substrate/Accounts.js} +0 -0
  126. /package/page/{Metadata.js → substrate/Metadata.js} +0 -0
  127. /package/page/{PostMessageProvider.js → substrate/PostMessageProvider.js} +0 -0
  128. /package/page/{Signer.js → substrate/Signer.js} +0 -0
  129. /package/page/{Injected.js → substrate/index.js} +0 -0
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CIP30Api = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
8
+ // SPDX-License-Identifier: Apache-2.0
9
+
10
+ class CIP30Api {
11
+ constructor(sendMessage) {
12
+ this.sendMessage = sendMessage;
13
+ }
14
+ getExtension() {
15
+ return [{
16
+ cip: 30
17
+ }];
18
+ }
19
+ async getNetworkId() {
20
+ return await this.sendMessage('cardano(network.get.current)');
21
+ }
22
+ async getCollateral(payload) {
23
+ return await this.sendMessage('cardano(account.get.collateral)', payload);
24
+ }
25
+ async getUtxos(amount, paginate) {
26
+ return await this.sendMessage('cardano(account.get.utxos)', {
27
+ amount,
28
+ paginate
29
+ });
30
+ }
31
+ async getUsedAddresses() {
32
+ return await this.sendMessage('cardano(account.get.address)');
33
+ }
34
+ async getChangeAddress() {
35
+ return await this.sendMessage('cardano(account.get.change.address)');
36
+ }
37
+ async getUnusedAddresses() {
38
+ return new Promise(resolve => resolve([]));
39
+ }
40
+ async getRewardAddresses() {
41
+ return new Promise(resolve => resolve([]));
42
+ }
43
+ async signTx(tx) {
44
+ let partialSign = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
45
+ return await this.sendMessage('cardano(transaction.sign)', {
46
+ tx,
47
+ partialSign
48
+ });
49
+ }
50
+ async signData(address, payload) {
51
+ return await this.sendMessage('cardano(data.sign)', {
52
+ address,
53
+ payload
54
+ });
55
+ }
56
+ async submitTx(tx) {
57
+ return await this.sendMessage('cardano(transaction.submit)', tx);
58
+ }
59
+ async getBalance() {
60
+ return await this.sendMessage('cardano(account.get.balance)');
61
+ }
62
+ }
63
+ exports.CIP30Api = CIP30Api;
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ Object.defineProperty(exports, "CIP30Api", {
7
+ enumerable: true,
8
+ get: function () {
9
+ return _cip.CIP30Api;
10
+ }
11
+ });
12
+ exports.ExtensionCIPsSupported = void 0;
13
+ var _cip = require("./cip30");
14
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ const ExtensionCIPsSupported = [{
18
+ cip: 30
19
+ }];
20
+ exports.ExtensionCIPsSupported = ExtensionCIPsSupported;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = void 0;
7
+ var _cips = require("@subwallet/extension-base/page/cardano/cips");
8
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
9
+ // SPDX-License-Identifier: Apache-2.0
10
+
11
+ const WALLET_NAME = 'SubWallet';
12
+ const WALLET_VERSION = process.env.PKG_VERSION;
13
+ const WALLET_ICON = 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMTYwIiBoZWlnaHQ9IjE2MCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCBkPSJNODAgNGM1Ny42MyAwIDc2IDE4LjM3IDc2IDc2IDAgNTcuNjMtMTguMzcgNzYtNzYgNzYtNTcuNjMgMC03Ni0xOC4zNy03Ni03NkM0IDIyLjM3IDIyLjM3IDQgODAgNFoiIGZpbGw9InVybCgjYSkiLz48ZyBjbGlwLXBhdGg9InVybCgjYikiPjxwYXRoIGQ9Ik0xMTIuNjE1IDY2LjcyVjUzLjM5OEw1OC43NiAzMiA0OCAzNy40MTJsLjA1NyA0MS40NjQgNDAuMjkyIDE2LjA3LTIxLjUyIDkuMDc1di03LjAxOEw1Ni45NSA5My4wM2wtOC44OTMgNC4xNjN2MjUuMzk1TDU4Ljc2OSAxMjhsNTMuODQ2LTI0LjA2MlY4Ni44NjlMNjQuMTU0IDY3LjY1N1Y1NmwzOC40NDkgMTUuMjE2IDEwLjAxMi00LjQ5NloiIGZpbGw9IiNmZmYiLz48L2c+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJhIiB4MT0iODAiIHkxPSI0IiB4Mj0iODAiIHkyPSIxNTYiIGdyYWRpZW50VW5pdHM9InVzZXJTcGFjZU9uVXNlIj48c3RvcCBzdG9wLWNvbG9yPSIjMDA0QkZGIi8+PHN0b3Agb2Zmc2V0PSIxIiBzdG9wLWNvbG9yPSIjNENFQUFDIi8+PC9saW5lYXJHcmFkaWVudD48Y2xpcFBhdGggaWQ9ImIiPjxwYXRoIGZpbGw9IiNmZmYiIHRyYW5zZm9ybT0idHJhbnNsYXRlKDQ4IDMyKSIgZD0iTTAgMGg2NC42MTV2OTZIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4=';
14
+ class SubWalletCardanoProvider {
15
+ apiVersion = WALLET_VERSION;
16
+ icon = WALLET_ICON;
17
+ name = WALLET_NAME;
18
+ supportedExtensions = [..._cips.ExtensionCIPsSupported];
19
+ constructor(sendMessage) {
20
+ this.icon = WALLET_ICON;
21
+ this.sendMessage = sendMessage;
22
+ }
23
+ async enable() {
24
+ const isEnabled = await this.sendMessage('pub(authorize.tabV2)', {
25
+ origin,
26
+ accountAuthTypes: ['cardano']
27
+ });
28
+ if (!isEnabled) {
29
+ throw new Error('Access to the wallet is denied');
30
+ }
31
+ const CIP30 = new _cips.CIP30Api(this.sendMessage);
32
+ return Object.freeze(CIP30);
33
+ }
34
+ async isEnable() {
35
+ const accountList = await this.sendMessage('pub(accounts.list)', {
36
+ accountAuthType: 'cardano'
37
+ });
38
+ return accountList.length > 0;
39
+ }
40
+ }
41
+ exports.default = SubWalletCardanoProvider;
@@ -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.SubWalletEvmProvider = void 0;
7
+ exports.default = void 0;
8
8
  var _safeEventEmitter = _interopRequireDefault(require("@metamask/safe-event-emitter"));
9
9
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
10
  // SPDX-License-Identifier: Apache-2.0
@@ -156,4 +156,4 @@ class SubWalletEvmProvider extends _safeEventEmitter.default {
156
156
  });
157
157
  }
158
158
  }
159
- exports.SubWalletEvmProvider = SubWalletEvmProvider;
159
+ exports.default = SubWalletEvmProvider;
package/cjs/page/index.js CHANGED
@@ -6,14 +6,16 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.enable = enable;
8
8
  exports.handleResponse = handleResponse;
9
+ exports.initCardanoProvider = initCardanoProvider;
9
10
  exports.initEvmProvider = initEvmProvider;
10
11
  exports.sendMessage = sendMessage;
11
12
  var _ProviderError = require("@subwallet/extension-base/background/errors/ProviderError");
12
13
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
13
- var _SubWalleEvmProvider = require("@subwallet/extension-base/page/SubWalleEvmProvider");
14
+ var _cardano = _interopRequireDefault(require("@subwallet/extension-base/page/cardano"));
15
+ var _evm = _interopRequireDefault(require("@subwallet/extension-base/page/evm"));
16
+ var _substrate = _interopRequireDefault(require("@subwallet/extension-base/page/substrate"));
14
17
  var _defaults = require("../defaults");
15
18
  var _getId = require("../utils/getId");
16
- var _Injected = _interopRequireDefault(require("./Injected"));
17
19
  // Copyright 2019-2022 @polkadot/extension authors & contributors
18
20
  // SPDX-License-Identifier: Apache-2.0
19
21
 
@@ -48,7 +50,7 @@ async function enable(origin, opt) {
48
50
  origin,
49
51
  accountAuthTypes
50
52
  });
51
- return new _Injected.default(sendMessage);
53
+ return new _substrate.default(sendMessage);
52
54
  }
53
55
  function handleResponse(data) {
54
56
  const handler = handlers[data.id];
@@ -70,5 +72,8 @@ function handleResponse(data) {
70
72
  }
71
73
  }
72
74
  function initEvmProvider(version) {
73
- return new _SubWalleEvmProvider.SubWalletEvmProvider(sendMessage, version);
75
+ return new _evm.default(sendMessage, version);
76
+ }
77
+ function initCardanoProvider() {
78
+ return new _cardano.default(sendMessage);
74
79
  }
@@ -21,6 +21,7 @@ var _constants2 = require("@subwallet/extension-base/services/chain-service/cons
21
21
  var _utils2 = require("@subwallet/extension-base/services/chain-service/utils");
22
22
  var _utils3 = require("@subwallet/extension-base/utils");
23
23
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
24
+ var _rxjs = require("rxjs");
24
25
  var _evm = require("../evm");
25
26
  var _equilibrium = require("./equilibrium");
26
27
  var _gear = require("./gear");
@@ -337,7 +338,19 @@ const subscribeTokensAccountsPallet = async _ref6 => {
337
338
  const tokensAccountsKey = 'query_tokens_accounts';
338
339
  const tokenTypes = includeNativeToken ? [_types._AssetType.NATIVE, _types._AssetType.LOCAL] : [_types._AssetType.LOCAL];
339
340
  const tokenMap = (0, _utils3.filterAssetsByChainAndType)(assetMap, chainInfo.slug, tokenTypes);
341
+
342
+ // Hotfix balance for gdot
343
+ const getGdotBalance = async () => {
344
+ const gdotBalances = await queryGdotBalance(substrateApi, addresses, assetMap[gdotSlug], extrinsicType);
345
+ callback(gdotBalances);
346
+ };
340
347
  const unsubList = await Promise.all(Object.values(tokenMap).map(tokenInfo => {
348
+ // Hotfix balance for gdot
349
+ if (tokenInfo.slug === gdotSlug) {
350
+ return (0, _rxjs.timer)(0, _constants.CRON_REFRESH_PRICE_INTERVAL).subscribe(() => {
351
+ getGdotBalance().catch(console.error);
352
+ });
353
+ }
341
354
  try {
342
355
  const params = [{
343
356
  section: 'query',
@@ -547,4 +560,23 @@ const subscribeSubnetAlphaPallet = async _ref9 => {
547
560
  cancel = true;
548
561
  clearInterval(interval);
549
562
  };
550
- };
563
+ };
564
+
565
+ // Hot fix for gdot balance
566
+
567
+ const gdotSlug = 'hydradx_main-LOCAL-GDOT';
568
+ async function queryGdotBalance(substrateApi, addresses, tokenInfo, extrinsicType) {
569
+ return await Promise.all(addresses.map(async address => {
570
+ const _balanceInfo = await substrateApi.api.call.currenciesApi.account((0, _utils2._getTokenOnChainAssetId)(tokenInfo), address);
571
+ const balanceInfo = _balanceInfo.toPrimitive();
572
+ const transferableBalance = (0, _tokensPallet._getTokensPalletTransferable)(balanceInfo, (0, _utils2._getAssetExistentialDeposit)(tokenInfo), extrinsicType);
573
+ const totalLockedFromTransfer = (0, _tokensPallet._getTokensPalletLocked)(balanceInfo);
574
+ return {
575
+ address,
576
+ tokenSlug: tokenInfo.slug,
577
+ state: _KoniTypes.APIItemState.READY,
578
+ free: transferableBalance.toString(),
579
+ locked: totalLockedFromTransfer.toString()
580
+ };
581
+ }));
582
+ }
@@ -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.SpokePoolMapping = void 0;
7
+ exports.SpokePoolMapping = exports.AcrossErrorMsg = void 0;
8
8
  exports._isAcrossChainBridge = _isAcrossChainBridge;
9
9
  exports._isAcrossTestnetBridge = _isAcrossTestnetBridge;
10
10
  exports.getAcrossQuote = void 0;
@@ -196,6 +196,11 @@ const SpokePoolMapping = {
196
196
  }
197
197
  };
198
198
  exports.SpokePoolMapping = SpokePoolMapping;
199
+ const AcrossErrorMsg = {
200
+ AMOUNT_TOO_LOW: 'amount too low',
201
+ AMOUNT_TOO_HIGH: 'amount too high'
202
+ };
203
+ exports.AcrossErrorMsg = AcrossErrorMsg;
199
204
  // Calculate fee for across bridge transfer
200
205
  const getAcrossQuote = async _ref => {
201
206
  let {
@@ -208,7 +213,6 @@ const getAcrossQuote = async _ref => {
208
213
  sendingValue
209
214
  } = _ref;
210
215
  const isAcrossBridgeXcm = (0, _xcmParser._isAcrossBridgeXcm)(originChain, destinationChain);
211
- console.log('sendingValue', sendingValue);
212
216
  if (!isAcrossBridgeXcm) {
213
217
  throw new Error('This is not a valid AcrossBridge transfer');
214
218
  }
@@ -202,6 +202,8 @@ const createAcrossBridgeExtrinsic = async _ref6 => {
202
202
  const data = await ((_subwalletApiSdk$xcmA = _subwalletApiSdk.default.xcmApi) === null || _subwalletApiSdk$xcmA === void 0 ? void 0 : _subwalletApiSdk$xcmA.fetchXcmData(sender, originTokenInfo.slug, destinationTokenInfo.slug, recipient, sendingValue));
203
203
  const _feeCustom = feeCustom;
204
204
  const feeCombine = (0, _utils3.combineEthFee)(feeInfo, feeOption, _feeCustom);
205
+
206
+ // todo: validate data before sending
205
207
  const transactionConfig = {
206
208
  from: data === null || data === void 0 ? void 0 : data.sender,
207
209
  to: data === null || data === void 0 ? void 0 : data.to,
@@ -129,6 +129,39 @@ class CardanoApi {
129
129
  return [];
130
130
  }
131
131
  }
132
+ async getUtxos(address, page, limit) {
133
+ try {
134
+ let url = this.isTestnet ? `https://cardano-preprod.blockfrost.io/api/v0/addresses/${address}/utxos` : `https://cardano-mainnet.blockfrost.io/api/v0/addresses/${address}/utxos`;
135
+ url += `?page=${page}&count=${limit}`;
136
+ const response = await fetch(url, {
137
+ method: 'GET',
138
+ headers: {
139
+ Project_id: this.projectId
140
+ }
141
+ });
142
+ const utxos = await response.json();
143
+ return utxos;
144
+ } catch (e) {
145
+ console.error('Error on getting account balance', e);
146
+ return [];
147
+ }
148
+ }
149
+ async getSpecificUtxo(txHash) {
150
+ try {
151
+ const url = this.isTestnet ? `https://cardano-preprod.blockfrost.io/api/v0/txs/${txHash}/utxos` : `https://cardano-mainnet.blockfrost.io/api/v0/txs/${txHash}/utxos`;
152
+ const response = await fetch(url, {
153
+ method: 'GET',
154
+ headers: {
155
+ Project_id: this.projectId
156
+ }
157
+ });
158
+ const utxo = await response.json();
159
+ return utxo;
160
+ } catch (e) {
161
+ console.error('Error on getting account balance', e);
162
+ return {};
163
+ }
164
+ }
132
165
  async sendCardanoTxReturnHash(tx) {
133
166
  try {
134
167
  const url = this.isTestnet ? 'https://cardano-preprod.blockfrost.io/api/v0/tx/submit' : 'https://cardano-mainnet.blockfrost.io/api/v0/tx/submit';
@@ -17,10 +17,12 @@ var _types2 = require("@subwallet/extension-base/services/chain-service/handler/
17
17
  var _types3 = require("@subwallet/extension-base/services/chain-service/types");
18
18
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
19
19
  var _scripts = require("@subwallet/extension-base/services/migration-service/scripts");
20
+ var _helper = require("@subwallet/extension-base/services/request-service/helper");
20
21
  var _AssetSetting = _interopRequireDefault(require("@subwallet/extension-base/stores/AssetSetting"));
21
22
  var _utils2 = require("@subwallet/extension-base/utils");
22
23
  var _rxjs = require("rxjs");
23
24
  var _web = _interopRequireDefault(require("web3"));
25
+ var _util = require("@polkadot/util");
24
26
  var _logger = require("@polkadot/util/logger");
25
27
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
26
28
  // SPDX-License-Identifier: Apache-2.0
@@ -171,6 +173,35 @@ class ChainService {
171
173
  getCardanoApi(slug) {
172
174
  return this.cardanoChainHandler.getCardanoApiByChain(slug);
173
175
  }
176
+ async getUtxosByAddress(address, slug, paginate) {
177
+ const cardanoApi = this.getCardanoApi(slug);
178
+ const isTestnet = slug === 'cardano_preproduction';
179
+ const formattedAddress = isTestnet ? (0, _utils2.reformatAddress)(address, 0) : address;
180
+ const limit = (paginate === null || paginate === void 0 ? void 0 : paginate.limit) || 100;
181
+ const utxos = [];
182
+ let needStop = false;
183
+ let page = ((paginate === null || paginate === void 0 ? void 0 : paginate.page) || 0) + 1;
184
+ while (!needStop) {
185
+ const utxoRaw = await cardanoApi.getUtxos(formattedAddress, page, limit);
186
+ if (utxoRaw.length === 0 || !(0, _util.isArray)(utxoRaw)) {
187
+ needStop = true;
188
+ } else {
189
+ utxos.push(...utxoRaw);
190
+ page++;
191
+ }
192
+ }
193
+ return (0, _helper.convertUtxoRawToUtxo)(utxos);
194
+ }
195
+ getSpecificUtxo(slug) {
196
+ const cardanoApi = this.getCardanoApi(slug);
197
+ return async (txHash, txId) => {
198
+ const utxoRaw = await cardanoApi.getSpecificUtxo(txHash);
199
+ if (!(utxoRaw !== null && utxoRaw !== void 0 && utxoRaw.outputs)) {
200
+ return undefined;
201
+ }
202
+ return utxoRaw.outputs[txId];
203
+ };
204
+ }
174
205
  getCardanoApiMap() {
175
206
  return this.cardanoChainHandler.getCardanoApiMap();
176
207
  }
@@ -11,7 +11,7 @@ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
11
11
  const branchName = process.env.BRANCH_NAME || 'subwallet-dev';
12
12
  const fetchDomain = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'https://chain-list-assets.subwallet.app' : 'https://dev.sw-chain-list-assets.pages.dev';
13
13
  const fetchFile = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list.json' : 'preview.json';
14
- const ChainListVersion = '0.2.103'; // update this when build chainlist
14
+ const ChainListVersion = '0.2.104'; // update this when build chainlist
15
15
 
16
16
  // todo: move this interface to chainlist
17
17
 
@@ -25,7 +25,7 @@ const getStellaswapLiquidStakingContract = function (networkKey, assetAddress, e
25
25
  return new evmApi.api.eth.Contract(_constants.ST_LIQUID_TOKEN_ABI, assetAddress, options);
26
26
  };
27
27
  exports.getStellaswapLiquidStakingContract = getStellaswapLiquidStakingContract;
28
- const APR_STATS_URL = 'https://apr-api.stellaswap.com/api/v1/stdot';
28
+ const APR_STATS_URL = 'https://stdot-apr.stellaswap.com/';
29
29
  const SUBWALLET_REFERRAL = '0x7e6815f45E624768548d085231f2d453f16FD7DD';
30
30
  const TOP_HOLDER = '0x4300e09284e3bB4d9044DdAB31EfAF5f3301DABa';
31
31
  class StellaSwapLiquidStakingPoolHandler extends _base.default {
@@ -95,7 +95,7 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
95
95
  statistic: {
96
96
  assetEarning: [{
97
97
  slug: this.rewardAssets[0],
98
- apr: aprObject.result,
98
+ apr: aprObject.stDOTAPR,
99
99
  exchangeRate: exchangeRate
100
100
  }],
101
101
  unstakingPeriod: 24 * 28,
@@ -106,7 +106,7 @@ class StellaSwapLiquidStakingPoolHandler extends _base.default {
106
106
  defaultUnstake: '0',
107
107
  fastUnstake: '0'
108
108
  },
109
- totalApr: aprObject.result,
109
+ totalApr: aprObject.stDOTAPR,
110
110
  tvl: tvl.toString()
111
111
  }
112
112
  };
@@ -462,7 +462,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
462
462
  const BNlimitPrice = new _bignumber.default(limitPrice.integerValue(_bignumber.default.ROUND_CEIL).toFixed());
463
463
  const selectedValidatorInfo = targetValidators[0];
464
464
  const hotkey = selectedValidatorInfo.address;
465
- const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount, BNlimitPrice, false);
465
+ const extrinsic = chainApi.api.tx.subtensorModule.addStakeLimit(hotkey, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
466
466
  return [extrinsic, {
467
467
  slug: this.nativeToken.slug,
468
468
  amount: '0'
@@ -495,7 +495,7 @@ class SubnetTaoStakingPoolHandler extends _basePara.default {
495
495
  const alphaToTaoPrice = new _bignumber.default(await getAlphaToTaoRate(this.substrateApi, netuid || 0));
496
496
  const limitPrice = alphaToTaoPrice.multipliedBy(10 ** (0, _utils2._getAssetDecimals)(this.nativeToken)).multipliedBy(1 - (slippage || DEFAULT_BITTENSOR_SLIPPAGE));
497
497
  const BNlimitPrice = new _bignumber.default(limitPrice.integerValue(_bignumber.default.ROUND_CEIL).toFixed());
498
- const extrinsic = apiPromise.api.tx.subtensorModule.removeStakeLimit(selectedTarget, netuid, binaryAmount, BNlimitPrice, false);
498
+ const extrinsic = apiPromise.api.tx.subtensorModule.removeStakeLimit(selectedTarget, netuid, binaryAmount.toFixed(), BNlimitPrice.toFixed(), false);
499
499
  return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
500
500
  }
501
501
  async validateYieldLeave(amount, address, fastLeave, selectedTarget, slug, poolInfo) {
@@ -12,9 +12,24 @@ var _constants = require("@subwallet/extension-base/services/chain-service/const
12
12
  var _basePara = _interopRequireDefault(require("@subwallet/extension-base/services/earning-service/handlers/native-staking/base-para"));
13
13
  var _types = require("@subwallet/extension-base/types");
14
14
  var _utils2 = require("@subwallet/extension-base/utils");
15
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
15
16
  // Copyright 2019-2022 @subwallet/extension-base
16
17
  // SPDX-License-Identifier: Apache-2.0
17
18
 
19
+ const FIXED_DAY_REWARD = '123287670000000000000000';
20
+ const COMMISSION = 0.1;
21
+ const DAYS_PER_YEAR = 365;
22
+ function calculateCollatorApy(numberOfCollators, totalStakeStr) {
23
+ const totalStake = new _bignumber.default(totalStakeStr);
24
+ const collatorRewardPerDay = new _bignumber.default(FIXED_DAY_REWARD).div(numberOfCollators);
25
+ const dayRate = collatorRewardPerDay.div(totalStake);
26
+ const finalTokens = totalStake.multipliedBy(dayRate.multipliedBy(DAYS_PER_YEAR).plus(1));
27
+ const yearReward = finalTokens.minus(totalStake).multipliedBy(1 - COMMISSION);
28
+ return yearReward.div(totalStake).multipliedBy(100).toNumber();
29
+ }
30
+ function calculateNetworkApy(totalStake) {
31
+ return new _bignumber.default(FIXED_DAY_REWARD).multipliedBy(DAYS_PER_YEAR).multipliedBy(1 - COMMISSION).div(totalStake).multipliedBy(100).toNumber();
32
+ }
18
33
  class MythosNativeStakingPoolHandler extends _basePara.default {
19
34
  availableMethod = {
20
35
  join: true,
@@ -63,7 +78,12 @@ class MythosNativeStakingPoolHandler extends _basePara.default {
63
78
  const sessionTime = _constants._STAKING_ERA_LENGTH_MAP[this.chain] || _constants._STAKING_ERA_LENGTH_MAP.default; // in hours
64
79
  const blockTime = _constants._EXPECTED_BLOCK_TIME[this.chain];
65
80
  const unstakingPeriod = parseInt(unstakeDelay) * blockTime / 60 / 60;
66
- const _minStake = await substrateApi.api.query.collatorStaking.minStake();
81
+ const [_minStake, _candidates] = await Promise.all([substrateApi.api.query.collatorStaking.minStake(), substrateApi.api.query.collatorStaking.candidates.entries()]);
82
+ const bnTotalChainStake = _candidates.reduce((total, _candidate) => {
83
+ const collatorInfo = _candidate[1].toPrimitive();
84
+ const collatorTotalStake = new _bignumber.default(collatorInfo.stake);
85
+ return total.plus(collatorTotalStake);
86
+ }, new _bignumber.default(0));
67
87
  const minStake = _minStake.toString();
68
88
  const minStakeToHuman = (0, _utils2.formatNumber)(minStake, nativeToken.decimals || 0, _utils2.balanceFormatter);
69
89
  const data = {
@@ -87,7 +107,7 @@ class MythosNativeStakingPoolHandler extends _basePara.default {
87
107
  era: parseInt(currentSession),
88
108
  eraTime: sessionTime,
89
109
  unstakingPeriod: unstakingPeriod,
90
- totalApy: undefined
110
+ totalApy: calculateNetworkApy(bnTotalChainStake)
91
111
  // tvl: totalStake.toString(),
92
112
  // inflation
93
113
  },
@@ -215,27 +235,41 @@ class MythosNativeStakingPoolHandler extends _basePara.default {
215
235
 
216
236
  async getPoolTargets() {
217
237
  const substrateApi = await this.substrateApi.isReady;
218
- const [_allCollators, _minStake, _commission] = await Promise.all([substrateApi.api.query.collatorStaking.candidates.entries(), substrateApi.api.query.collatorStaking.minStake(), substrateApi.api.query.collatorStaking.collatorRewardPercentage()]);
238
+ const [_allCollators, _minStake, _commission, _desiredCandidates] = await Promise.all([substrateApi.api.query.collatorStaking.candidates.entries(), substrateApi.api.query.collatorStaking.minStake(), substrateApi.api.query.collatorStaking.collatorRewardPercentage(), substrateApi.api.query.collatorStaking.desiredCandidates()]);
219
239
  const maxStakersPerCollator = substrateApi.api.consts.collatorStaking.maxStakers.toPrimitive();
220
- return _allCollators.map(_collator => {
240
+ const numberOfRewardCollators = parseInt(_desiredCandidates.toString());
241
+ const numberOfCollators = _allCollators.length;
242
+ const allTargets = _allCollators.map(_collator => {
221
243
  const _collatorAddress = _collator[0].toHuman();
222
244
  const collatorAddress = _collatorAddress[0];
223
245
  const collatorInfo = _collator[1].toPrimitive();
224
- const bnTotalStake = BigInt(collatorInfo.stake);
246
+ const totalStake = collatorInfo.stake;
225
247
  const numOfStakers = parseInt(collatorInfo.stakers);
226
248
  const isCrowded = numOfStakers >= maxStakersPerCollator;
227
249
  return {
228
250
  address: collatorAddress,
229
251
  chain: this.chain,
230
- totalStake: bnTotalStake.toString(),
252
+ totalStake: totalStake,
231
253
  ownStake: '0',
232
- otherStake: bnTotalStake.toString(),
254
+ otherStake: totalStake,
233
255
  minBond: _minStake.toPrimitive(),
234
256
  nominatorCount: numOfStakers,
235
257
  commission: (0, _utils.getCommission)(_commission.toString()),
236
258
  blocked: false,
237
259
  isVerified: false,
238
- isCrowded
260
+ isCrowded,
261
+ expectedReturn: calculateCollatorApy(numberOfCollators, totalStake)
262
+ };
263
+ });
264
+ const sortTargetsByStake = allTargets.sort((a, b) => (0, _bignumber.default)(b.totalStake).minus((0, _bignumber.default)(a.totalStake)).toNumber());
265
+ return sortTargetsByStake.map((target, rank) => {
266
+ let expectedReturn = target.expectedReturn;
267
+ if (rank >= numberOfRewardCollators) {
268
+ expectedReturn = 0.000000000000001;
269
+ }
270
+ return {
271
+ ...target,
272
+ expectedReturn
239
273
  };
240
274
  });
241
275
  }
@@ -82,7 +82,7 @@ class RelayNativeStakingPoolHandler extends _base.default {
82
82
  const bnTotalEraStake = new _util.BN(rawTotalEraStake);
83
83
  const bnTotalIssuance = new _util.BN(rawTotalIssuance);
84
84
  const inflation = (0, _utils.calculateInflation)(bnTotalEraStake, bnTotalIssuance, numAuctions, chainInfo.slug);
85
- const expectedReturn = (0, _utils.calculateChainStakedReturnV2)(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, new _bignumber.default(inflation), true);
85
+ const expectedReturn = await (0, _utils.calculateChainStakedReturnV2)(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, new _bignumber.default(inflation), true);
86
86
  const eraTime = _constants._STAKING_ERA_LENGTH_MAP[chainInfo.slug] || _constants._STAKING_ERA_LENGTH_MAP.default; // in hours
87
87
  const unlockingPeriod = parseInt(unlockingEras) * eraTime; // in hours
88
88
  const farmerCount = _counterForNominators.toPrimitive();
@@ -175,8 +175,8 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
175
175
  /* Unimplemented function */
176
176
 
177
177
  get maintainBalance() {
178
- const ed = new _util.BN(this.nativeToken.minAmount || '0');
179
- const calculateMaintainBalance = new _util.BN(15).mul(ed).div(_util.BN_TEN);
178
+ const ed = new _bignumber.default(this.nativeToken.minAmount || '0');
179
+ const calculateMaintainBalance = new _bignumber.default(15).multipliedBy(ed).dividedBy(10);
180
180
  const maintainBalance = calculateMaintainBalance;
181
181
  return maintainBalance.toString();
182
182
  }
@@ -202,7 +202,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
202
202
  highestApr = validators[i];
203
203
  }
204
204
  }
205
- const bnTaoIn = new _util.BN(taoIn);
205
+ const bnTaoIn = new _bignumber.default(taoIn);
206
206
  const BNminDelegatorStake = new _bignumber.default(minDelegatorStake.toString());
207
207
  const apr = this.chain === 'bittensor' ? Number(highestApr.apr) * 100 : 0;
208
208
  const data = {
@@ -430,7 +430,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
430
430
  const testnetDelegate = (await this.substrateApi.api.call.delegateInfoRuntimeApi.getDelegates()).toJSON();
431
431
  const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
432
432
  const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
433
- const bnMinBond = new _util.BN(nominatorMinRequiredStake);
433
+ const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
434
434
  return testnetDelegate.map(delegate => ({
435
435
  address: delegate.delegateSs58,
436
436
  totalStake: '0',
@@ -450,14 +450,14 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
450
450
  const topValidator = _topValidator;
451
451
  const getNominatorMinRequiredStake = this.substrateApi.api.query.subtensorModule.nominatorMinRequiredStake();
452
452
  const nominatorMinRequiredStake = (await getNominatorMinRequiredStake).toString();
453
- const bnMinBond = new _util.BN(nominatorMinRequiredStake);
453
+ const bnMinBond = new _bignumber.default(nominatorMinRequiredStake);
454
454
  const validatorList = topValidator.data;
455
455
  const validatorAddresses = Object.keys(validatorList);
456
456
  const results = await Promise.all(validatorAddresses.map(i => {
457
457
  const address = validatorList[i].hotkey.ss58;
458
- const bnTotalStake = new _util.BN(validatorList[i].stake);
459
- const bnOwnStake = new _util.BN(validatorList[i].validator_stake);
460
- const otherStake = bnTotalStake.sub(bnOwnStake);
458
+ const bnTotalStake = new _bignumber.default(validatorList[i].stake);
459
+ const bnOwnStake = new _bignumber.default(validatorList[i].validator_stake);
460
+ const otherStake = bnTotalStake.minus(bnOwnStake);
461
461
  const nominatorCount = validatorList[i].nominators;
462
462
  const commission = validatorList[i].take;
463
463
  const roundedCommission = (parseFloat(commission) * 100).toFixed(0);
@@ -501,10 +501,10 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
501
501
  selectedValidators: targetValidators
502
502
  } = data;
503
503
  const chainApi = await this.substrateApi.isReady;
504
- const binaryAmount = new _util.BN(amount);
504
+ const binaryAmount = new _bignumber.default(amount);
505
505
  const selectedValidatorInfo = targetValidators[0];
506
506
  const hotkey = selectedValidatorInfo.address;
507
- const extrinsic = chainApi.api.tx.subtensorModule.addStake(hotkey, 0, binaryAmount);
507
+ const extrinsic = chainApi.api.tx.subtensorModule.addStake(hotkey, 0, binaryAmount.toFixed());
508
508
  return [extrinsic, {
509
509
  slug: this.nativeToken.slug,
510
510
  amount: '0'
@@ -518,7 +518,7 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
518
518
  const {
519
519
  amount
520
520
  } = data;
521
- if (new _util.BN(amount).lt(new _util.BN(_dtao.DEFAULT_DTAO_MINBOND))) {
521
+ if (new _bignumber.default(amount).lt(new _bignumber.default(_dtao.DEFAULT_DTAO_MINBOND))) {
522
522
  return [new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS, (0, _i18next.t)(`Insufficient stake. You need to stake at least ${(0, _utils3.formatNumber)(_dtao.DEFAULT_DTAO_MINBOND, (0, _utils2._getAssetDecimals)(this.nativeToken))} ${(0, _utils2._getAssetSymbol)(this.nativeToken)} to earn rewards`))];
523
523
  }
524
524
  return baseErrors;
@@ -530,12 +530,12 @@ class TaoNativeStakingPoolHandler extends _basePara.default {
530
530
 
531
531
  async handleYieldUnstake(amount, address, selectedTarget) {
532
532
  const apiPromise = await this.substrateApi.isReady;
533
- const binaryAmount = new _util.BN(amount);
533
+ const binaryAmount = new _bignumber.default(amount);
534
534
  const poolPosition = await this.getPoolPosition(address);
535
535
  if (!selectedTarget || !poolPosition) {
536
536
  return Promise.reject(new _TransactionError.TransactionError(_types.BasicTxErrorType.INVALID_PARAMS));
537
537
  }
538
- const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, 0, binaryAmount);
538
+ const extrinsic = apiPromise.api.tx.subtensorModule.removeStake(selectedTarget, 0, binaryAmount.toFixed());
539
539
  return [_KoniTypes.ExtrinsicType.STAKING_UNBOND, extrinsic];
540
540
  }
541
541
  async validateYieldLeave(amount, address, fastLeave, selectedTarget, slug, poolInfo) {
@@ -103,7 +103,7 @@ class NominationPoolHandler extends _base.default {
103
103
  const bnTotalIssuance = new _util.BN(rawTotalIssuance);
104
104
  const inflation = (0, _utils.calculateInflation)(bnTotalEraStake, bnTotalIssuance, numAuctions, chainInfo.slug);
105
105
  const minPoolJoin = (_minPoolJoin === null || _minPoolJoin === void 0 ? void 0 : _minPoolJoin.toString()) || undefined;
106
- const expectedReturn = (0, _utils.calculateChainStakedReturnV2)(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, new _bignumber.default(inflation), true);
106
+ const expectedReturn = await (0, _utils.calculateChainStakedReturnV2)(chainInfo, rawTotalIssuance, erasPerDay, lastTotalStaked, validatorEraReward, new _bignumber.default(inflation), true);
107
107
  const eraTime = _constants._STAKING_ERA_LENGTH_MAP[this.chain] || _constants._STAKING_ERA_LENGTH_MAP.default; // in hours
108
108
  const unlockingPeriod = parseInt(unlockingEras) * eraTime; // in hours
109
109
 
@@ -18,7 +18,7 @@ class MigrateSettings extends _Base.default {
18
18
  const key = 'app.stellaswap.com';
19
19
  const stellaSwap = value[key];
20
20
  if (stellaSwap) {
21
- stellaSwap.currentEvmNetworkKey = 'moonbeam';
21
+ stellaSwap.currentNetworkMap.evm = 'moonbeam';
22
22
  value[key] = stellaSwap;
23
23
  this.state.setAuthorize(value, () => {
24
24
  resolve();
@@ -12,7 +12,9 @@ exports.EXTENSION_REQUEST_URL = EXTENSION_REQUEST_URL;
12
12
  const PREDEFINED_CHAIN_DAPP_CHAIN_MAP = {
13
13
  'portal.astar.network': ['astar', 'astarEvm'],
14
14
  'apps.moonbeam.network': ['moonbeam', 'moonriver'],
15
- 'app.stellaswap.com': ['moonbeam']
15
+ 'app.stellaswap.com': ['moonbeam'],
16
+ 'testnet-preprod.minswap.org': ['cardano_preproduction'],
17
+ 'localhost:7777': ['cardano_preproduction']
16
18
  };
17
19
  exports.PREDEFINED_CHAIN_DAPP_CHAIN_MAP = PREDEFINED_CHAIN_DAPP_CHAIN_MAP;
18
20
  const WEB_APP_URL = [