@subwallet/extension-base 1.3.6-0 → 1.3.7-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 (60) hide show
  1. package/background/KoniTypes.d.ts +13 -0
  2. package/cjs/constants/blocked-actions.js +108 -0
  3. package/cjs/constants/index.js +4 -4
  4. package/cjs/core/substrate/xcm-parser.js +4 -3
  5. package/cjs/koni/api/nft/config.js +6 -4
  6. package/cjs/koni/api/nft/index.js +9 -0
  7. package/cjs/koni/api/nft/story_odyssey_nft/index.js +126 -0
  8. package/cjs/koni/background/handlers/Extension.js +22 -1
  9. package/cjs/koni/background/handlers/State.js +12 -0
  10. package/cjs/packageInfo.js +1 -1
  11. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  12. package/cjs/services/chain-service/constants.js +2 -1
  13. package/cjs/services/earning-service/handlers/native-staking/para-chain.js +20 -17
  14. package/cjs/services/environment-service/stores/Environment.js +19 -0
  15. package/cjs/services/setting-service/SettingService.js +13 -0
  16. package/cjs/services/transaction-service/index.js +12 -6
  17. package/cjs/services/transaction-service/utils.js +3 -0
  18. package/cjs/stores/EnvironmentStore.js +18 -0
  19. package/cjs/stores/index.js +8 -1
  20. package/cjs/utils/environment.js +15 -1
  21. package/cjs/utils/staticData/index.js +7 -2
  22. package/constants/blocked-actions.d.ts +29 -0
  23. package/constants/blocked-actions.js +96 -0
  24. package/constants/index.d.ts +1 -1
  25. package/constants/index.js +1 -1
  26. package/core/substrate/xcm-parser.d.ts +1 -1
  27. package/core/substrate/xcm-parser.js +4 -3
  28. package/koni/api/nft/config.d.ts +1 -1
  29. package/koni/api/nft/config.js +5 -2
  30. package/koni/api/nft/index.js +9 -0
  31. package/koni/api/nft/story_odyssey_nft/index.d.ts +40 -0
  32. package/koni/api/nft/story_odyssey_nft/index.js +119 -0
  33. package/koni/background/handlers/Extension.d.ts +3 -0
  34. package/koni/background/handlers/Extension.js +22 -1
  35. package/koni/background/handlers/State.d.ts +3 -0
  36. package/koni/background/handlers/State.js +12 -0
  37. package/package.json +26 -10
  38. package/packageInfo.js +1 -1
  39. package/services/balance-service/helpers/subscribe/substrate/index.js +2 -1
  40. package/services/chain-service/constants.d.ts +1 -0
  41. package/services/chain-service/constants.js +2 -1
  42. package/services/earning-service/handlers/native-staking/para-chain.js +20 -17
  43. package/services/environment-service/stores/Environment.d.ts +10 -0
  44. package/services/environment-service/stores/Environment.js +12 -0
  45. package/services/setting-service/SettingService.d.ts +5 -0
  46. package/services/setting-service/SettingService.js +13 -0
  47. package/services/transaction-service/index.js +13 -7
  48. package/services/transaction-service/utils.js +3 -0
  49. package/stores/EnvironmentStore.d.ts +5 -0
  50. package/stores/EnvironmentStore.js +10 -0
  51. package/stores/index.d.ts +1 -0
  52. package/stores/index.js +2 -1
  53. package/utils/environment.d.ts +6 -0
  54. package/utils/environment.js +8 -0
  55. package/utils/staticData/blockedActions.json +1 -0
  56. package/utils/staticData/index.d.ts +7 -3
  57. package/utils/staticData/index.js +5 -1
  58. package/cjs/constants/blocked-actions-list.js +0 -14
  59. package/constants/blocked-actions-list.d.ts +0 -7
  60. package/constants/blocked-actions-list.js +0 -7
@@ -2,6 +2,7 @@ import { _AssetRef, _AssetType, _ChainAsset, _ChainInfo, _FundStatus, _MultiChai
2
2
  import { TransactionError } from '@subwallet/extension-base/background/errors/TransactionError';
3
3
  import { Resolver } from '@subwallet/extension-base/background/handlers/State';
4
4
  import { AccountAuthType, AuthorizeRequest, ConfirmationRequestBase, RequestAccountList, RequestAccountSubscribe, RequestAccountUnsubscribe, RequestAuthorizeCancel, RequestAuthorizeReject, RequestAuthorizeSubscribe, RequestAuthorizeTab, RequestCurrentAccountAddress, ResponseAuthorizeList } from '@subwallet/extension-base/background/types';
5
+ import { AppConfig, BrowserConfig, OSConfig } from '@subwallet/extension-base/constants';
5
6
  import { RequestOptimalTransferProcess } from '@subwallet/extension-base/services/balance-service/helpers';
6
7
  import { TonTransactionConfig } from '@subwallet/extension-base/services/balance-service/transfer/ton-transfer';
7
8
  import { _CHAIN_VALIDATION_ERROR } from '@subwallet/extension-base/services/chain-service/handler/types';
@@ -335,6 +336,15 @@ export declare type RequestChangeShowBalance = {
335
336
  enable: boolean;
336
337
  };
337
338
  export declare type DetectBalanceCache = Record<string, number>;
339
+ export declare type RequestSaveAppConfig = {
340
+ appConfig: AppConfig;
341
+ };
342
+ export declare type RequestSaveBrowserConfig = {
343
+ browserConfig: BrowserConfig;
344
+ };
345
+ export declare type RequestSaveOSConfig = {
346
+ osConfig: OSConfig;
347
+ };
338
348
  export interface RandomTestRequest {
339
349
  start: number;
340
350
  end: number;
@@ -1553,6 +1563,9 @@ export interface KoniRequestSignatures {
1553
1563
  'pri(settings.saveShowBalance)': [RequestChangeShowBalance, boolean];
1554
1564
  'pri(settings.logo.assets.subscribe)': [null, Record<string, string>, Record<string, string>];
1555
1565
  'pri(settings.logo.chains.subscribe)': [null, Record<string, string>, Record<string, string>];
1566
+ 'pri(settings.saveAppConfig)': [RequestSaveAppConfig, boolean];
1567
+ 'pri(settings.saveBrowserConfig)': [RequestSaveBrowserConfig, boolean];
1568
+ 'pri(settings.saveOSConfig)': [RequestSaveOSConfig, boolean];
1556
1569
  'pri(yield.subscribePoolInfo)': [null, YieldPoolInfo[], YieldPoolInfo[]];
1557
1570
  'pri(yield.subscribeYieldPosition)': [null, YieldPositionInfo[], YieldPositionInfo[]];
1558
1571
  'pri(yield.subscribeYieldReward)': [null, EarningRewardJson, EarningRewardJson];
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.APP_VER = exports.APP_ENV = void 0;
7
+ exports.fetchBlockedConfigObjects = fetchBlockedConfigObjects;
8
+ exports.fetchLastestBlockedActionsAndFeatures = fetchLastestBlockedActionsAndFeatures;
9
+ exports.getPassConfigId = getPassConfigId;
10
+ var _extensionBase = require("@subwallet/extension-base");
11
+ var _utils = require("@subwallet/extension-base/utils");
12
+ var _staticData = require("@subwallet/extension-base/utils/staticData");
13
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
14
+ // SPDX-License-Identifier: Apache-2.0
15
+
16
+ const APP_ENV = process.env.TARGET_ENV;
17
+ exports.APP_ENV = APP_ENV;
18
+ const APP_VER = _extensionBase.packageInfo.version;
19
+ exports.APP_VER = APP_VER;
20
+ const PRODUCTION_BRANCHES = ['master', 'webapp', 'webapp-dev'];
21
+ const branchName = process.env.BRANCH_NAME || 'koni-dev';
22
+ const targetFolder = PRODUCTION_BRANCHES.indexOf(branchName) > -1 ? 'list' : 'preview';
23
+ async function fetchBlockedConfigObjects() {
24
+ const targetFile = `${targetFolder}/envConfig.json`;
25
+ return await (0, _utils.fetchStaticData)('blocked-actions', targetFile);
26
+ }
27
+ function getPassConfigId(currentConfig, blockedConfigObjects) {
28
+ const passList = [];
29
+ Object.entries(blockedConfigObjects).forEach(_ref => {
30
+ let [key, appliedConfig] = _ref;
31
+ let passAppConfig = false;
32
+ let passBrowserConfig = false;
33
+ let passOSConfig = false;
34
+ if (!appliedConfig.appConfig || !currentConfig.appConfig) {
35
+ passAppConfig = true;
36
+ } else {
37
+ const isPassEnv = currentConfig.appConfig.environment === appliedConfig.appConfig.environment;
38
+ const isPassVer = isPassVersion(currentConfig.appConfig.version, appliedConfig.appConfig.version);
39
+ passAppConfig = isPassEnv && isPassVer;
40
+ }
41
+ if (!appliedConfig.browserConfig || !currentConfig.browserConfig) {
42
+ passBrowserConfig = true;
43
+ } else {
44
+ const isPassType = currentConfig.browserConfig.type === appliedConfig.browserConfig.type;
45
+ const isPassVer = isPassVersion(currentConfig.browserConfig.version, appliedConfig.browserConfig.version);
46
+ passBrowserConfig = isPassType && isPassVer;
47
+ }
48
+ if (!appliedConfig.osConfig || !currentConfig.osConfig) {
49
+ passOSConfig = true;
50
+ } else {
51
+ const isPassType = currentConfig.osConfig.type === appliedConfig.osConfig.type;
52
+ const isPassVer = isPassVersion(currentConfig.osConfig.version, appliedConfig.osConfig.version);
53
+ passOSConfig = isPassType && isPassVer;
54
+ }
55
+ if (passAppConfig && passBrowserConfig && passOSConfig) {
56
+ passList.push(key);
57
+ }
58
+ });
59
+ return passList;
60
+ }
61
+ function isPassVersion(versionStr, versionCondition) {
62
+ // todo: check if has case versionStr = undefined?
63
+ const versionArr = versionStr.split('.');
64
+ if (!versionCondition) {
65
+ return true;
66
+ }
67
+ if (versionCondition.includes('>=')) {
68
+ const versionConditionStr = versionCondition.replace('>=', '').trim();
69
+ const versionConditionArr = versionConditionStr.split('.'); // todo: map(Number) instead of parseInt later
70
+
71
+ if (versionConditionStr === versionStr) {
72
+ return true;
73
+ }
74
+ for (let i = 0; i < versionArr.length; i++) {
75
+ if (parseInt(versionArr[i]) < parseInt(versionConditionArr[i])) {
76
+ return false;
77
+ }
78
+ if (parseInt(versionArr[i]) > parseInt(versionConditionArr[i])) {
79
+ return true;
80
+ }
81
+ }
82
+ return true;
83
+ }
84
+ if (versionCondition.includes('>')) {
85
+ const versionConditionArr = versionCondition.replace('>', '').trim().split('.');
86
+ for (let i = 0; i < versionArr.length; i++) {
87
+ if (parseInt(versionArr[i]) < parseInt(versionConditionArr[i])) {
88
+ return false;
89
+ }
90
+ if (parseInt(versionArr[i]) > parseInt(versionConditionArr[i])) {
91
+ return true;
92
+ }
93
+ }
94
+ return false;
95
+ }
96
+
97
+ // todo: also handle less use cases: <, <=
98
+
99
+ const versionConditionStr = versionCondition.trim();
100
+ return versionStr === versionConditionStr;
101
+ }
102
+ async function fetchLastestBlockedActionsAndFeatures(ids) {
103
+ if (ids.length === 0) {
104
+ return [_staticData.staticData[_staticData.StaticKey.BLOCKED_ACTIONS_FEATURES]];
105
+ }
106
+ const targetFiles = ids.map(id => `${targetFolder}/${id}.json`);
107
+ return await Promise.all(targetFiles.map(targetFile => (0, _utils.fetchStaticData)('blocked-actions', targetFile)));
108
+ }
@@ -42,15 +42,15 @@ var _exportNames = {
42
42
  PERMISSIONS_TO_REVOKE: true
43
43
  };
44
44
  exports.XCM_MIN_AMOUNT_RATIO = exports.XCM_FEE_RATIO = exports.SUB_TOKEN_REFRESH_BALANCE_INTERVAL = exports.PERMISSIONS_TO_REVOKE = exports.ORDINAL_METHODS = exports.ORDINAL_COLLECTION = exports.NETWORK_MULTI_GAS_FEE = exports.MANTA_PAY_BALANCE_INTERVAL = exports.IGNORE_QR_SIGNER = exports.IGNORE_GET_SUBSTRATE_FEATURES_LIST = exports.GAS_PRICE_RATIO = exports.CRON_SYNC_MANTA_PAY = exports.CRON_REFRESH_STAKING_REWARD_INTERVAL = exports.CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL = exports.CRON_REFRESH_PRICE_INTERVAL = exports.CRON_REFRESH_NFT_INTERVAL = exports.CRON_REFRESH_MKT_CAMPAIGN_INTERVAL = exports.CRON_REFRESH_HISTORY_INTERVAL = exports.CRON_REFRESH_EARNING_REWARD_HISTORY_INTERVAL = exports.CRON_REFRESH_CHAIN_STAKING_METADATA = exports.CRON_REFRESH_CHAIN_NOMINATOR_METADATA = exports.CRON_RECOVER_HISTORY_INTERVAL = exports.CRON_LISTEN_AVAIL_BRIDGE_CLAIM = exports.CRON_GET_API_MAP_STATUS = exports.CRON_AUTO_RECOVER_WEB3_INTERVAL = exports.CRON_AUTO_RECOVER_DOTSAMA_INTERVAL = exports.BITTENSOR_REFRESH_STAKE_INFO = exports.BITTENSOR_REFRESH_STAKE_APY = exports.BASE_SECOND_INTERVAL = exports.BASE_MINUTE_INTERVAL = exports.ASTAR_REFRESH_BALANCE_INTERVAL = exports.ALL_NETWORK_KEY = exports.ALL_GENESIS_HASH = exports.ALL_ACCOUNT_KEY = exports.ALL_ACCOUNT_AUTH_TYPES = exports.ACALA_REFRESH_CROWDLOAN_INTERVAL = void 0;
45
- var _blockedActionsList = require("./blocked-actions-list");
46
- Object.keys(_blockedActionsList).forEach(function (key) {
45
+ var _blockedActions = require("./blocked-actions");
46
+ Object.keys(_blockedActions).forEach(function (key) {
47
47
  if (key === "default" || key === "__esModule") return;
48
48
  if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
49
- if (key in exports && exports[key] === _blockedActionsList[key]) return;
49
+ if (key in exports && exports[key] === _blockedActions[key]) return;
50
50
  Object.defineProperty(exports, key, {
51
51
  enumerable: true,
52
52
  get: function () {
53
- return _blockedActionsList[key];
53
+ return _blockedActions[key];
54
54
  }
55
55
  });
56
56
  });
@@ -231,17 +231,18 @@ function _getAssetIdentifier(tokenInfo, version) {
231
231
  throw new Error('Asset must have multilocation');
232
232
  }
233
233
  const assetIdentifier = ['statemint-LOCAL-KSM', 'statemine-LOCAL-DOT'].includes(tokenInfo.slug) // todo: hotfix for ksm statemint recheck all chain
234
- ? _assetIdentifier : _adaptX1Interior(structuredClone(_assetIdentifier), version);
234
+ ? _assetIdentifier : _adaptX1Interior(_assetIdentifier, version);
235
235
  return version >= 4 // from V4, Concrete is removed
236
236
  ? assetIdentifier : {
237
237
  Concrete: assetIdentifier
238
238
  };
239
239
  }
240
- function _adaptX1Interior(assetIdentifier, version) {
240
+ function _adaptX1Interior(_assetIdentifier, version) {
241
+ const assetIdentifier = structuredClone(_assetIdentifier);
241
242
  const interior = assetIdentifier.interior;
242
243
  const isInteriorObj = typeof interior === 'object' && interior !== null;
243
244
  const isX1 = isInteriorObj && 'X1' in interior;
244
- const needModifyX1 = version <= 4 && Array.isArray(interior.X1);
245
+ const needModifyX1 = version < 4 && Array.isArray(interior.X1);
245
246
  if (isInteriorObj && isX1 && needModifyX1) {
246
247
  // X1 is an object for version < 4. From V4, it's an array
247
248
  // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.W3S_IPFS = exports.VARA_SCAN_ENDPOINT = exports.UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = exports.UNIQUE_SCAN_ENDPOINT = exports.UNIQUE_IPFS_GATEWAY = exports.TRANSFER_CHAIN_ID = exports.TERNOA_MAINNET_GATEWAY = exports.TERNOA_MAINNET_CLIENT_NFT = exports.TERNOA_ALPHANET_GATEWAY = exports.TERNOA_ALPHANET_CLIENT_NFT = exports.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN = exports.SUPPORTED_NFT_NETWORKS = exports.SUBWALLET_IPFS = exports.SINGULAR_V2_ENDPOINT = exports.SINGULAR_V2_COLLECTION_ENDPOINT = exports.SINGULAR_V1_ENDPOINT = exports.SINGULAR_V1_COLLECTION_ENDPOINT = exports.RMRK_PINATA_SERVER = exports.QUARTZ_SCAN_ENDPOINT = exports.PINATA_IPFS_GATEWAY = exports.OPAL_SCAN_ENDPOINT = exports.NFT_STORAGE_GATEWAY = exports.KANARIA_EXTERNAL_SERVER = exports.KANARIA_ENDPOINT = exports.IPFS_W3S_LINK = exports.IPFS_IO = exports.IPFS_GATEWAY_4EVERLAND = exports.IPFS_FLEEK = exports.IPFS_ETH_ARAGON = exports.IPFS2_RMRK = exports.GATEWAY_IPFS_IO = exports.DWEB_LINK = exports.CLOUDFLARE_PINATA_SERVER = exports.CF_IPFS_GATEWAY = exports.BIT_COUNTRY_THUMBNAIL_RESOLVER = exports.BIT_COUNTRY_LAND_ESTATE_METADATA_API = exports.BIT_COUNTRY_IPFS_SERVER = exports.BIT_AVATAR_API = exports.AVAIL_LIGHT_CLIENT_NFT = void 0;
6
+ exports.W3S_IPFS = exports.VARA_SCAN_ENDPOINT = exports.UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = exports.UNIQUE_SCAN_ENDPOINT = exports.UNIQUE_IPFS_GATEWAY = exports.TRANSFER_CHAIN_ID = exports.TERNOA_MAINNET_GATEWAY = exports.TERNOA_MAINNET_CLIENT_NFT = exports.TERNOA_ALPHANET_GATEWAY = exports.TERNOA_ALPHANET_CLIENT_NFT = exports.SUPPORTED_TRANSFER_SUBSTRATE_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = exports.SUPPORTED_TRANSFER_EVM_CHAIN = exports.SUPPORTED_NFT_NETWORKS = exports.SUBWALLET_IPFS = exports.SINGULAR_V2_ENDPOINT = exports.SINGULAR_V2_COLLECTION_ENDPOINT = exports.SINGULAR_V1_ENDPOINT = exports.SINGULAR_V1_COLLECTION_ENDPOINT = exports.RMRK_PINATA_SERVER = exports.QUARTZ_SCAN_ENDPOINT = exports.OPAL_SCAN_ENDPOINT = exports.ODYSSEY_ENDPOINT = exports.NFT_STORAGE_GATEWAY = exports.KANARIA_EXTERNAL_SERVER = exports.KANARIA_ENDPOINT = exports.IPFS_W3S_LINK = exports.IPFS_IO = exports.IPFS_GATEWAY_4EVERLAND = exports.IPFS_FLEEK = exports.IPFS_ETH_ARAGON = exports.IPFS2_RMRK = exports.GATEWAY_IPFS_IO = exports.DWEB_LINK = exports.CLOUDFLARE_PINATA_SERVER = exports.CF_IPFS_GATEWAY = exports.BIT_COUNTRY_THUMBNAIL_RESOLVER = exports.BIT_COUNTRY_LAND_ESTATE_METADATA_API = exports.BIT_COUNTRY_IPFS_SERVER = exports.BIT_AVATAR_API = exports.AVAIL_LIGHT_CLIENT_NFT = void 0;
7
7
  exports.getRandomIpfsGateway = getRandomIpfsGateway;
8
8
  var _environment = require("@subwallet/extension-base/utils/environment");
9
9
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
@@ -41,12 +41,12 @@ const CF_IPFS_GATEWAY = 'https://cf-ipfs.com/ipfs/';
41
41
 
42
42
  // XOrigin
43
43
  exports.CF_IPFS_GATEWAY = CF_IPFS_GATEWAY;
44
- const PINATA_IPFS_GATEWAY = 'https://gateway.pinata.cloud/ipfs/';
44
+ const ODYSSEY_ENDPOINT = 'https://indexer-v2.dev.aurascan.io/api/v2/graphql';
45
45
 
46
46
  // deprecated
47
47
  // export const UNIQUE_SCAN_ENDPOINT = 'https://explorer-api.unique.network/v1/graphql';
48
48
  // export const QUARTZ_SCAN_ENDPOINT = 'https://hasura-quartz.unique.network/v1/graphql';
49
- exports.PINATA_IPFS_GATEWAY = PINATA_IPFS_GATEWAY;
49
+ exports.ODYSSEY_ENDPOINT = ODYSSEY_ENDPOINT;
50
50
  const VARA_SCAN_ENDPOINT = 'https://nft-explorer.vara-network.io/graphql';
51
51
  exports.VARA_SCAN_ENDPOINT = VARA_SCAN_ENDPOINT;
52
52
  const AVAIL_LIGHT_CLIENT_NFT = 'https://indexer.availspace.app/graphql'; // 'https://indexer-nft.availspace.app/graphql';
@@ -87,6 +87,8 @@ exports.TERNOA_ALPHANET_CLIENT_NFT = TERNOA_ALPHANET_CLIENT_NFT;
87
87
  const TERNOA_MAINNET_GATEWAY = 'https://ipfs-mainnet.trnnfr.com/ipfs/';
88
88
  exports.TERNOA_MAINNET_GATEWAY = TERNOA_MAINNET_GATEWAY;
89
89
  const TERNOA_ALPHANET_GATEWAY = 'https://ipfs-dev.trnnfr.com/ipfs/';
90
+
91
+ // XOrigin
90
92
  exports.TERNOA_ALPHANET_GATEWAY = TERNOA_ALPHANET_GATEWAY;
91
93
  const IPFS_GATEWAY_4EVERLAND = 'https://4everland.io/ipfs/';
92
94
  exports.IPFS_GATEWAY_4EVERLAND = IPFS_GATEWAY_4EVERLAND;
@@ -124,7 +126,7 @@ exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = SUPPORTED_TRANSFER_EVM_CHAIN_NAME;
124
126
  })(SUPPORTED_TRANSFER_EVM_CHAIN_NAME || (exports.SUPPORTED_TRANSFER_EVM_CHAIN_NAME = SUPPORTED_TRANSFER_EVM_CHAIN_NAME = {}));
125
127
  const SUPPORTED_TRANSFER_EVM_CHAIN = [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbeam, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonriver, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.astarEvm, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shiden, SUPPORTED_TRANSFER_EVM_CHAIN_NAME.shibuya];
126
128
  exports.SUPPORTED_TRANSFER_EVM_CHAIN = SUPPORTED_TRANSFER_EVM_CHAIN;
127
- const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari'];
129
+ const UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = ['unique_evm', 'rari', 'storyOdyssey_testnet'];
128
130
  exports.UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME = UNSUPPORTED_TRANSFER_EVM_CHAIN_NAME;
129
131
  const TRANSFER_CHAIN_ID = {
130
132
  [SUPPORTED_TRANSFER_EVM_CHAIN_NAME.moonbase]: 1287,
@@ -21,6 +21,7 @@ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
21
21
  var _utils2 = require("@subwallet/extension-base/utils");
22
22
  var _assethub_nft = _interopRequireDefault(require("./assethub_nft"));
23
23
  var _rari = require("./rari");
24
+ var _story_odyssey_nft = require("./story_odyssey_nft");
24
25
  var _ternoa_nft = require("./ternoa_nft");
25
26
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
26
27
  // SPDX-License-Identifier: Apache-2.0
@@ -56,6 +57,8 @@ function createSubstrateNftApi(chain, substrateApi, addresses) {
56
57
  return [new _ternoa_nft.TernoaNftApi(substrateApi, substrateAddresses, chain)];
57
58
  } else if (_constants._NFT_CHAIN_GROUP.rari.includes(chain)) {
58
59
  return [new _rari.RariNftApi(chain, evmAddresses)];
60
+ } else if (_constants._NFT_CHAIN_GROUP.story_odyssey.includes(chain)) {
61
+ return [new _story_odyssey_nft.OdysseyNftApi(chain, evmAddresses)];
59
62
  }
60
63
  return null;
61
64
  }
@@ -166,6 +169,12 @@ class NftHandler {
166
169
  this.handlers.push(...handlers);
167
170
  }
168
171
  }
172
+ if (chain === 'storyOdyssey_testnet') {
173
+ const handlers = createSubstrateNftApi(chain, null, evmAddresses);
174
+ if (handlers && !!handlers.length) {
175
+ this.handlers.push(...handlers);
176
+ }
177
+ }
169
178
  if ((0, _utils._isChainSupportWasmNft)(chainInfo)) {
170
179
  if (this.substrateApiMap[chain]) {
171
180
  const handler = createWasmNftApi(chain, this.substrateApiMap[chain], substrateAddresses);
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.OdysseyNftApi = void 0;
7
+ var _config = require("../config");
8
+ var _nft = require("../nft");
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class OdysseyNftApi extends _nft.BaseNftApi {
13
+ constructor(chain, addresses) {
14
+ super(chain, undefined, addresses);
15
+ }
16
+ endpoint = _config.ODYSSEY_ENDPOINT;
17
+ static parseNftRequest(address) {
18
+ const lowerCaseAddress = address.toLowerCase();
19
+ return `
20
+ query MyQuery {
21
+ odyssey {
22
+ erc721_token(
23
+ where: {owner: {_eq: "${lowerCaseAddress}"}}
24
+ ) {
25
+ media_info
26
+ owner
27
+ token_id
28
+ erc721_contract_address
29
+ }
30
+ }
31
+ }
32
+ `;
33
+ }
34
+ async fetchNftData(query) {
35
+ try {
36
+ const response = await fetch(this.endpoint, {
37
+ method: 'POST',
38
+ headers: {
39
+ 'Content-Type': 'application/json'
40
+ },
41
+ body: JSON.stringify({
42
+ operationName: 'MyQuery',
43
+ variables: {},
44
+ query
45
+ })
46
+ });
47
+ const result = await response.json();
48
+ return result.data.odyssey.erc721_token;
49
+ } catch (err) {
50
+ console.error('Error:', err);
51
+ return null;
52
+ }
53
+ }
54
+ async fetchUrlMetadata(url) {
55
+ try {
56
+ const response = await fetch(url);
57
+ return await response.json();
58
+ } catch (err) {
59
+ console.error('Error:', err);
60
+ return null;
61
+ }
62
+ }
63
+ parseUrlIfIpfs(url) {
64
+ if (url.startsWith('ipfs://')) {
65
+ return this.parseUrl(url);
66
+ }
67
+ if (url.includes('github.com')) {
68
+ return `${url}?raw=true`;
69
+ }
70
+ return url;
71
+ }
72
+ parseNftItem(nft, metadata, address) {
73
+ var _metadata$media, _metadata$media$;
74
+ const urlMetadataImage = this.parseUrlIfIpfs((metadata === null || metadata === void 0 ? void 0 : metadata.image) || '');
75
+ return {
76
+ id: nft.token_id,
77
+ name: (metadata === null || metadata === void 0 ? void 0 : metadata.name) || (metadata === null || metadata === void 0 ? void 0 : metadata.title),
78
+ description: metadata === null || metadata === void 0 ? void 0 : metadata.description,
79
+ image: urlMetadataImage || (metadata === null || metadata === void 0 ? void 0 : (_metadata$media = metadata.media) === null || _metadata$media === void 0 ? void 0 : (_metadata$media$ = _metadata$media[0]) === null || _metadata$media$ === void 0 ? void 0 : _metadata$media$.url),
80
+ collectionId: nft.erc721_contract_address,
81
+ chain: this.chain,
82
+ owner: address
83
+ };
84
+ }
85
+ parseNftCollection(nft) {
86
+ const image = this.parseUrlIfIpfs(nft.media_info.onchain.metadata.image || '');
87
+ return {
88
+ collectionId: nft.erc721_contract_address,
89
+ chain: this.chain,
90
+ collectionName: nft.media_info.onchain.metadata.name,
91
+ image: image || undefined
92
+ };
93
+ }
94
+ async processNftItem(nft, address, params) {
95
+ const tokenUri = this.parseUrlIfIpfs(nft.media_info.onchain.token_uri) || '';
96
+ const urlMetadata = await this.fetchUrlMetadata(tokenUri);
97
+ const parsedNft = this.parseNftItem(nft, urlMetadata, address);
98
+ params.updateItem(this.chain, parsedNft, address);
99
+ const parsedCollection = this.parseNftCollection(nft);
100
+ params.updateCollection(this.chain, parsedCollection);
101
+ }
102
+ async handleNfts(params) {
103
+ await Promise.all(this.addresses.map(async address => {
104
+ const nftDetails = await this.fetchNftsWithDetail(address);
105
+ if (!nftDetails || nftDetails.length === 0) {
106
+ return;
107
+ }
108
+ await Promise.all(nftDetails.map(async nft => {
109
+ await this.processNftItem(nft, address, params);
110
+ }));
111
+ }));
112
+ }
113
+ async fetchNftsWithDetail(address) {
114
+ const query = OdysseyNftApi.parseNftRequest(address);
115
+ return await this.fetchNftData(query);
116
+ }
117
+ async fetchNfts(params) {
118
+ try {
119
+ await this.handleNfts(params);
120
+ } catch (e) {
121
+ return 0;
122
+ }
123
+ return 1;
124
+ }
125
+ }
126
+ exports.OdysseyNftApi = OdysseyNftApi;
@@ -2578,7 +2578,6 @@ class KoniExtension {
2578
2578
  }
2579
2579
 
2580
2580
  // Phishing detect
2581
-
2582
2581
  async passPhishingPage(_ref46) {
2583
2582
  let {
2584
2583
  url
@@ -2586,6 +2585,20 @@ class KoniExtension {
2586
2585
  return await this.#koniState.approvePassPhishingPage(url);
2587
2586
  }
2588
2587
 
2588
+ // Set environment config
2589
+ saveAppConfig(request) {
2590
+ this.#koniState.saveEnvConfig('appConfig', request.appConfig);
2591
+ return true;
2592
+ }
2593
+ saveBrowserConfig(request) {
2594
+ this.#koniState.saveEnvConfig('browserConfig', request.browserConfig);
2595
+ return true;
2596
+ }
2597
+ saveOSConfig(request) {
2598
+ this.#koniState.saveEnvConfig('osConfig', request.osConfig);
2599
+ return true;
2600
+ }
2601
+
2589
2602
  /// Wallet connect
2590
2603
 
2591
2604
  // Connect
@@ -3875,6 +3888,14 @@ class KoniExtension {
3875
3888
  case 'pri(phishing.pass)':
3876
3889
  return await this.passPhishingPage(request);
3877
3890
 
3891
+ // Set Environment config
3892
+ case 'pri(settings.saveAppConfig)':
3893
+ return this.saveAppConfig(request);
3894
+ case 'pri(settings.saveBrowserConfig)':
3895
+ return this.saveBrowserConfig(request);
3896
+ case 'pri(settings.saveOSConfig)':
3897
+ return this.saveOSConfig(request);
3898
+
3878
3899
  /// Keyring state
3879
3900
  case 'pri(keyring.subscribe)':
3880
3901
  return this.keyringStateSubscribe(id, port);
@@ -1322,6 +1322,18 @@ class KoniState {
1322
1322
  });
1323
1323
  });
1324
1324
  }
1325
+ saveEnvConfig(key, value) {
1326
+ this.settingService.getEnvironmentList(config => {
1327
+ const newSettings = {
1328
+ ...config,
1329
+ [key]: value
1330
+ };
1331
+ this.settingService.setEnvironment(newSettings);
1332
+ });
1333
+ }
1334
+ initEnvConfig(envConfig) {
1335
+ this.settingService.setEnvironment(envConfig);
1336
+ }
1325
1337
  async resetWallet(resetAll) {
1326
1338
  await this.keyringService.resetWallet(resetAll);
1327
1339
  await this.earningService.resetYieldPosition();
@@ -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-0'
16
+ version: '1.3.7-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];
@@ -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--------------------------------------------------------------------------------------------------------------
@@ -308,7 +308,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
308
308
  for (const collator of _allCollators) {
309
309
  const _collatorAddress = collator[0].toHuman();
310
310
  const collatorAddress = _collatorAddress[0];
311
- if (allCollatorsPool.includes(collatorAddress)) {
311
+ if (selectedCollators.includes(collatorAddress)) {
312
312
  const collatorInfo = collator[1].toPrimitive();
313
313
  const bnTotalStake = new _util.BN(collatorInfo.totalCounted);
314
314
  const bnOwnStake = new _util.BN(collatorInfo.bond);
@@ -331,7 +331,7 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
331
331
  }
332
332
  }
333
333
  await Promise.all(allCollators.map(async collator => {
334
- if (allCollatorsPool.includes(collator.address)) {
334
+ if (selectedCollators.includes(collator.address)) {
335
335
  // noted: number of blocks = total points / points per block
336
336
  const _collatorPoints = await apiProps.api.query.parachainStaking.awardedPts(parseInt(round.current) - 1, collator.address);
337
337
  const collatorPoints = _collatorPoints.toPrimitive();
@@ -362,10 +362,11 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
362
362
  async getParachainPoolTargets() {
363
363
  const apiProps = await this.substrateApi.isReady;
364
364
  const allCollators = [];
365
- const [_allCollators, _collatorCommission] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.collatorCommission()]);
365
+ const [_allCollators, _collatorCommission, _selectedCandidates] = await Promise.all([apiProps.api.query.parachainStaking.candidateInfo.entries(), apiProps.api.query.parachainStaking.collatorCommission(), apiProps.api.query.parachainStaking.selectedCandidates()]);
366
366
  const maxDelegationPerCollator = apiProps.api.consts.parachainStaking.maxTopDelegationsPerCandidate.toString();
367
367
  const rawCollatorCommission = _collatorCommission.toHuman();
368
368
  const collatorCommission = parseFloat(rawCollatorCommission.split('%')[0]);
369
+ const selectedCollators = _selectedCandidates.toPrimitive();
369
370
  for (const collator of _allCollators) {
370
371
  const _collatorAddress = collator[0].toHuman();
371
372
  const collatorAddress = _collatorAddress[0];
@@ -375,20 +376,22 @@ class ParaNativeStakingPoolHandler extends _basePara.default {
375
376
  const bnOtherStake = bnTotalStake.sub(bnOwnStake);
376
377
  const bnMinBond = new _util.BN(collatorInfo.lowestTopDelegationAmount);
377
378
  const maxNominatorRewarded = parseInt(maxDelegationPerCollator);
378
- allCollators.push({
379
- commission: 0,
380
- expectedReturn: 0,
381
- address: collatorAddress,
382
- totalStake: bnTotalStake.toString(),
383
- ownStake: bnOwnStake.toString(),
384
- otherStake: bnOtherStake.toString(),
385
- nominatorCount: collatorInfo.delegationCount,
386
- blocked: false,
387
- isVerified: false,
388
- minBond: bnMinBond.toString(),
389
- chain: this.chain,
390
- isCrowded: collatorInfo.delegationCount ? collatorInfo.delegationCount >= maxNominatorRewarded : false
391
- });
379
+ if (selectedCollators.includes(collatorAddress)) {
380
+ allCollators.push({
381
+ commission: 0,
382
+ expectedReturn: 0,
383
+ address: collatorAddress,
384
+ totalStake: bnTotalStake.toString(),
385
+ ownStake: bnOwnStake.toString(),
386
+ otherStake: bnOtherStake.toString(),
387
+ nominatorCount: collatorInfo.delegationCount,
388
+ blocked: false,
389
+ isVerified: false,
390
+ minBond: bnMinBond.toString(),
391
+ chain: this.chain,
392
+ isCrowded: collatorInfo.delegationCount ? collatorInfo.delegationCount >= maxNominatorRewarded : false
393
+ });
394
+ }
392
395
  }
393
396
  const extraInfoMap = {};
394
397
  await Promise.all(allCollators.map(async collator => {
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.EnvironmentStoreSubject = void 0;
7
+ var _Base = require("@subwallet/extension-base/services/keyring-service/context/stores/Base");
8
+ var _stores = require("@subwallet/extension-base/stores");
9
+ var _rxjs = require("rxjs");
10
+ // Copyright 2019-2022 @subwallet/extension-base
11
+ // SPDX-License-Identifier: Apache-2.0
12
+
13
+ class EnvironmentStoreSubject extends _Base.StoreSubject {
14
+ store = new _stores.EnvironmentStore();
15
+ subject = new _rxjs.BehaviorSubject({});
16
+ key = 'Environment';
17
+ defaultValue = {};
18
+ }
19
+ exports.EnvironmentStoreSubject = EnvironmentStoreSubject;
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _constants = require("@subwallet/extension-base/constants");
9
+ var _Environment = require("@subwallet/extension-base/services/environment-service/stores/Environment");
9
10
  var _storage = require("@subwallet/extension-base/storage");
10
11
  var _PassPhishingStore = _interopRequireDefault(require("@subwallet/extension-base/stores/PassPhishingStore"));
11
12
  var _Settings = _interopRequireDefault(require("@subwallet/extension-base/stores/Settings"));
@@ -17,6 +18,7 @@ var _constants2 = require("./constants");
17
18
  class SettingService {
18
19
  settingsStore = new _Settings.default();
19
20
  passPhishingStore = new _PassPhishingStore.default();
21
+ environmentStore = new _Environment.EnvironmentStoreSubject();
20
22
  constructor() {
21
23
  this.initSetting().catch(console.error);
22
24
  }
@@ -69,6 +71,17 @@ class SettingService {
69
71
  setPassPhishing(data, callback) {
70
72
  this.passPhishingStore.set('PassPhishing', data, callback);
71
73
  }
74
+ getEnvironmentSetting() {
75
+ return this.environmentStore.subject.value;
76
+ }
77
+ getEnvironmentList(update) {
78
+ this.environmentStore.store.get('Environment', value => {
79
+ update(value || {});
80
+ });
81
+ }
82
+ setEnvironment(data) {
83
+ this.environmentStore.upsertData(data);
84
+ }
72
85
 
73
86
  // Use for mobile only
74
87
  get isAlwaysRequired() {
@@ -77,12 +77,18 @@ class TransactionService {
77
77
  extrinsicType
78
78
  } = validationResponse;
79
79
  const chainInfo = this.state.chainService.getChainInfoByKey(chain);
80
- const {
81
- blockedActionsMap,
82
- blockedFeaturesList
83
- } = await (0, _constants.fetchLastestBlockedActionsAndFeatures)();
84
- (0, _transfer.checkSupportForFeature)(validationResponse, blockedFeaturesList, chainInfo);
85
- (0, _transfer.checkSupportForAction)(validationResponse, blockedActionsMap);
80
+ const blockedConfigObjects = await (0, _constants.fetchBlockedConfigObjects)();
81
+ const currentConfig = this.state.settingService.getEnvironmentSetting();
82
+ const passBlockedConfigId = (0, _constants.getPassConfigId)(currentConfig, blockedConfigObjects);
83
+ const blockedActionsFeaturesMaps = await (0, _constants.fetchLastestBlockedActionsAndFeatures)(passBlockedConfigId);
84
+ for (const blockedActionsFeaturesMap of blockedActionsFeaturesMaps) {
85
+ const {
86
+ blockedActionsMap,
87
+ blockedFeaturesList
88
+ } = blockedActionsFeaturesMap;
89
+ (0, _transfer.checkSupportForFeature)(validationResponse, blockedFeaturesList, chainInfo);
90
+ (0, _transfer.checkSupportForAction)(validationResponse, blockedActionsMap);
91
+ }
86
92
  const transaction = transactionInput.transaction;
87
93
 
88
94
  // Check duplicated transaction
@@ -42,6 +42,9 @@ function getBlockExplorerAccountRoute(explorerLink) {
42
42
  if (explorerLink.includes('explorer.zkverify.io')) {
43
43
  return 'account';
44
44
  }
45
+ if (explorerLink.includes('astral.autonomys')) {
46
+ return 'accounts';
47
+ }
45
48
  return 'address';
46
49
  }
47
50
  function getBlockExplorerTxRoute(chainInfo) {