@subwallet/extension-base 1.2.22-0 → 1.2.24-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 (44) hide show
  1. package/background/KoniTypes.d.ts +14 -0
  2. package/cjs/constants/index.js +4 -1
  3. package/cjs/koni/background/cron.js +10 -0
  4. package/cjs/koni/background/handlers/Extension.js +60 -4
  5. package/cjs/koni/background/handlers/State.js +3 -0
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/chain-service/constants.js +2 -1
  8. package/cjs/services/migration-service/scripts/MigrateLedgerAccountV2.js +3 -3
  9. package/cjs/services/mkt-campaign-service/index.js +284 -0
  10. package/cjs/services/mkt-campaign-service/types.js +17 -0
  11. package/cjs/services/storage-service/DatabaseService.js +115 -0
  12. package/cjs/services/storage-service/db-stores/Balance.js +6 -0
  13. package/cjs/services/storage-service/db-stores/Crowdloan.js +8 -0
  14. package/cjs/services/storage-service/db-stores/Nft.js +12 -0
  15. package/cjs/services/storage-service/db-stores/NftCollection.js +11 -0
  16. package/cjs/services/storage-service/db-stores/YieldPositionStore.js +6 -0
  17. package/constants/index.d.ts +1 -0
  18. package/constants/index.js +1 -0
  19. package/koni/background/cron.d.ts +1 -0
  20. package/koni/background/cron.js +11 -1
  21. package/koni/background/handlers/Extension.d.ts +3 -0
  22. package/koni/background/handlers/Extension.js +60 -4
  23. package/koni/background/handlers/State.d.ts +2 -0
  24. package/koni/background/handlers/State.js +3 -0
  25. package/package.json +16 -6
  26. package/packageInfo.js +1 -1
  27. package/services/chain-service/constants.js +2 -1
  28. package/services/migration-service/scripts/MigrateLedgerAccountV2.js +3 -3
  29. package/services/mkt-campaign-service/index.d.ts +30 -0
  30. package/services/mkt-campaign-service/index.js +275 -0
  31. package/services/mkt-campaign-service/types.d.ts +107 -0
  32. package/services/mkt-campaign-service/types.js +11 -0
  33. package/services/storage-service/DatabaseService.d.ts +5 -0
  34. package/services/storage-service/DatabaseService.js +116 -1
  35. package/services/storage-service/db-stores/Balance.d.ts +2 -0
  36. package/services/storage-service/db-stores/Balance.js +6 -0
  37. package/services/storage-service/db-stores/Crowdloan.d.ts +2 -0
  38. package/services/storage-service/db-stores/Crowdloan.js +8 -0
  39. package/services/storage-service/db-stores/Nft.d.ts +2 -0
  40. package/services/storage-service/db-stores/Nft.js +12 -0
  41. package/services/storage-service/db-stores/NftCollection.d.ts +1 -0
  42. package/services/storage-service/db-stores/NftCollection.js +11 -0
  43. package/services/storage-service/db-stores/YieldPositionStore.d.ts +2 -0
  44. package/services/storage-service/db-stores/YieldPositionStore.js +6 -0
@@ -5,6 +5,7 @@ import { AccountAuthType, AccountJson, AddressJson, AuthorizeRequest, Confirmati
5
5
  import { RequestOptimalTransferProcess } from '@subwallet/extension-base/services/balance-service/helpers';
6
6
  import { _CHAIN_VALIDATION_ERROR } from '@subwallet/extension-base/services/chain-service/handler/types';
7
7
  import { _ChainState, _EvmApi, _NetworkUpsertParams, _SubstrateApi, _ValidateCustomAssetRequest, _ValidateCustomAssetResponse, EnableChainParams, EnableMultiChainParams } from '@subwallet/extension-base/services/chain-service/types';
8
+ import { AppBannerData, AppConfirmationData, AppPopupData } from '@subwallet/extension-base/services/mkt-campaign-service/types';
8
9
  import { CrowdloanContributionsResponse } from '@subwallet/extension-base/services/subscan-service/types';
9
10
  import { SWTransactionResponse, SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types';
10
11
  import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types';
@@ -737,6 +738,7 @@ export interface RequestAccountCreateHardwareV2 {
737
738
  address: string;
738
739
  addressOffset: number;
739
740
  genesisHash: string;
741
+ originGenesisHash: string;
740
742
  hardwareType: string;
741
743
  name: string;
742
744
  isAllowed?: boolean;
@@ -746,6 +748,7 @@ export interface CreateHardwareAccountItem {
746
748
  address: string;
747
749
  addressOffset: number;
748
750
  genesisHash: string;
751
+ originGenesisHash: string;
749
752
  hardwareType: string;
750
753
  name: string;
751
754
  isEthereum: boolean;
@@ -1079,9 +1082,14 @@ export interface LedgerNetwork {
1079
1082
  isGeneric: boolean;
1080
1083
  /** Use for evm account */
1081
1084
  isEthereum: boolean;
1085
+ /** Hide networks that are supported by the dot migration app */
1086
+ isHide?: boolean;
1082
1087
  /** Slip44 in the derivation path */
1083
1088
  slip44: number;
1084
1089
  }
1090
+ export interface MigrationLedgerNetwork extends Omit<LedgerNetwork, 'isGeneric' | 'isEthereum' | 'isDevMode' | 'icon'> {
1091
+ ss58_addr_type: number;
1092
+ }
1085
1093
  export interface FormattedMethod {
1086
1094
  args?: ArgInfo[];
1087
1095
  methodName: string;
@@ -1766,6 +1774,12 @@ export interface KoniRequestSignatures {
1766
1774
  'pri(campaign.banner.subscribe)': [null, CampaignBanner[], CampaignBanner[]];
1767
1775
  'pri(campaign.popup.subscribeVisibility)': [null, ShowCampaignPopupRequest, ShowCampaignPopupRequest];
1768
1776
  'pri(campaign.popup.toggle)': [ShowCampaignPopupRequest, null];
1777
+ 'pri(campaign.popup.getData)': [null, AppPopupData[]];
1778
+ 'pri(campaign.banner.getData)': [null, AppBannerData[]];
1779
+ 'pri(campaign.confirmation.getData)': [null, AppConfirmationData[]];
1780
+ 'pri(campaign.popups.subscribe)': [null, AppPopupData[], AppPopupData[]];
1781
+ 'pri(campaign.banners.subscribe)': [null, AppBannerData[], AppBannerData[]];
1782
+ 'pri(campaign.confirmations.subscribe)': [null, AppConfirmationData[], AppConfirmationData[]];
1769
1783
  'pri(campaign.banner.complete)': [RequestCampaignBannerComplete, boolean];
1770
1784
  'pri(buyService.tokens.subscribe)': [null, Record<string, BuyTokenInfo>, Record<string, BuyTokenInfo>];
1771
1785
  'pri(buyService.services.subscribe)': [null, Record<string, BuyServiceInfo>, Record<string, BuyServiceInfo>];
@@ -13,6 +13,7 @@ var _exportNames = {
13
13
  ASTAR_REFRESH_BALANCE_INTERVAL: true,
14
14
  SUB_TOKEN_REFRESH_BALANCE_INTERVAL: true,
15
15
  CRON_REFRESH_NFT_INTERVAL: true,
16
+ CRON_REFRESH_MKT_CAMPAIGN_INTERVAL: true,
16
17
  CRON_REFRESH_STAKING_REWARD_INTERVAL: true,
17
18
  CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL: true,
18
19
  CRON_REFRESH_HISTORY_INTERVAL: true,
@@ -35,7 +36,7 @@ var _exportNames = {
35
36
  ORDINAL_COLLECTION: true,
36
37
  ORDINAL_METHODS: true
37
38
  };
38
- exports.XCM_MIN_AMOUNT_RATIO = exports.XCM_FEE_RATIO = exports.SUB_TOKEN_REFRESH_BALANCE_INTERVAL = 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_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_GET_API_MAP_STATUS = exports.CRON_AUTO_RECOVER_WEB3_INTERVAL = exports.CRON_AUTO_RECOVER_DOTSAMA_INTERVAL = 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.ACALA_REFRESH_CROWDLOAN_INTERVAL = void 0;
39
+ exports.XCM_MIN_AMOUNT_RATIO = exports.XCM_FEE_RATIO = exports.SUB_TOKEN_REFRESH_BALANCE_INTERVAL = 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_GET_API_MAP_STATUS = exports.CRON_AUTO_RECOVER_WEB3_INTERVAL = exports.CRON_AUTO_RECOVER_DOTSAMA_INTERVAL = 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.ACALA_REFRESH_CROWDLOAN_INTERVAL = void 0;
39
40
  var _staking = require("./staking");
40
41
  Object.keys(_staking).forEach(function (key) {
41
42
  if (key === "default" || key === "__esModule") return;
@@ -81,6 +82,8 @@ const SUB_TOKEN_REFRESH_BALANCE_INTERVAL = 60000;
81
82
  exports.SUB_TOKEN_REFRESH_BALANCE_INTERVAL = SUB_TOKEN_REFRESH_BALANCE_INTERVAL;
82
83
  const CRON_REFRESH_NFT_INTERVAL = 7200000;
83
84
  exports.CRON_REFRESH_NFT_INTERVAL = CRON_REFRESH_NFT_INTERVAL;
85
+ const CRON_REFRESH_MKT_CAMPAIGN_INTERVAL = 15 * BASE_MINUTE_INTERVAL;
86
+ exports.CRON_REFRESH_MKT_CAMPAIGN_INTERVAL = CRON_REFRESH_MKT_CAMPAIGN_INTERVAL;
84
87
  const CRON_REFRESH_STAKING_REWARD_INTERVAL = 900000;
85
88
  exports.CRON_REFRESH_STAKING_REWARD_INTERVAL = CRON_REFRESH_STAKING_REWARD_INTERVAL;
86
89
  const CRON_REFRESH_STAKING_REWARD_FAST_INTERVAL = 90000;
@@ -65,10 +65,12 @@ class KoniCron {
65
65
  await Promise.all([this.state.eventService.waitKeyringReady, this.state.eventService.waitAssetReady]);
66
66
  const currentAccountInfo = this.state.keyringService.currentAccount;
67
67
  const commonReloadEvents = ['account.add', 'account.remove', 'account.updateCurrent', 'chain.add', 'asset.updateState'];
68
+ const mktCampaignReloadEvents = ['account.add', 'account.remove'];
68
69
  this.eventHandler = (events, eventTypes) => {
69
70
  var _serviceInfo$currentA;
70
71
  const serviceInfo = this.state.getServiceInfo();
71
72
  const commonReload = eventTypes.some(eventType => commonReloadEvents.includes(eventType));
73
+ const mktCampaignNeedReload = eventTypes.some(eventType => mktCampaignReloadEvents.includes(eventType));
72
74
  const chainUpdated = eventTypes.includes('chain.updateState');
73
75
  const reloadMantaPay = eventTypes.includes('mantaPay.submitTransaction') || eventTypes.includes('mantaPay.enable');
74
76
  const updatedChains = [];
@@ -98,6 +100,10 @@ class KoniCron {
98
100
  (commonReload || needUpdateNft) && this.resetNft(address);
99
101
  (commonReload || needUpdateNft) && this.removeCron('refreshNft');
100
102
  commonReload && this.removeCron('refreshPoolingStakingReward');
103
+ if (mktCampaignNeedReload) {
104
+ this.removeCron('fetchMktCampaignData');
105
+ this.addCron('fetchMktCampaignData', this.fetchMktCampaignData, _constants.CRON_REFRESH_MKT_CAMPAIGN_INTERVAL);
106
+ }
101
107
  if (chainUpdated) {
102
108
  this.stopPoolInfo();
103
109
  this.removeCron('fetchPoolInfo');
@@ -113,6 +119,7 @@ class KoniCron {
113
119
  };
114
120
  this.state.eventService.onLazy(this.eventHandler);
115
121
  this.addCron('fetchPoolInfo', this.fetchPoolInfo, _constants.CRON_REFRESH_CHAIN_STAKING_METADATA);
122
+ this.addCron('fetchMktCampaignData', this.fetchMktCampaignData, _constants.CRON_REFRESH_MKT_CAMPAIGN_INTERVAL);
116
123
  if (!(currentAccountInfo !== null && currentAccountInfo !== void 0 && currentAccountInfo.address)) {
117
124
  return;
118
125
  }
@@ -151,6 +158,9 @@ class KoniCron {
151
158
  fetchPoolInfo = () => {
152
159
  this.state.earningService.runSubscribePoolsInfo().catch(console.error);
153
160
  };
161
+ fetchMktCampaignData = () => {
162
+ this.state.mktCampaignService.fetchMktCampaignData();
163
+ };
154
164
  stopPoolInfo = () => {
155
165
  this.state.earningService.runUnsubscribePoolsInfo();
156
166
  };
@@ -2192,14 +2192,15 @@ class KoniExtension {
2192
2192
  genesisHash,
2193
2193
  hardwareType,
2194
2194
  isAllowed,
2195
- name
2195
+ name,
2196
+ originGenesisHash
2196
2197
  } = _ref56;
2197
2198
  const key = _uiKeyring.keyring.addHardware(address, hardwareType, {
2198
2199
  accountIndex,
2199
2200
  addressOffset,
2200
2201
  genesisHash,
2201
2202
  name,
2202
- originGenesisHash: genesisHash
2203
+ originGenesisHash
2203
2204
  });
2204
2205
  const result = key.pair;
2205
2206
  const _address = result.address;
@@ -2234,7 +2235,8 @@ class KoniExtension {
2234
2235
  hardwareType,
2235
2236
  isEthereum,
2236
2237
  isGeneric,
2237
- name
2238
+ name,
2239
+ originGenesisHash
2238
2240
  } = account;
2239
2241
  let result;
2240
2242
  const baseMeta = {
@@ -2243,7 +2245,7 @@ class KoniExtension {
2243
2245
  accountIndex,
2244
2246
  addressOffset,
2245
2247
  genesisHash,
2246
- originGenesisHash: genesisHash,
2248
+ originGenesisHash,
2247
2249
  isGeneric
2248
2250
  };
2249
2251
  if (isEthereum) {
@@ -4083,6 +4085,54 @@ class KoniExtension {
4083
4085
  this.#koniState.campaignService.toggleCampaignPopup(value);
4084
4086
  return null;
4085
4087
  }
4088
+ subscribeAppPopupData(id, port) {
4089
+ const cb = (0, _subscriptions.createSubscription)(id, port);
4090
+ let ready = false;
4091
+ const callback = rs => {
4092
+ if (ready) {
4093
+ cb(rs);
4094
+ }
4095
+ };
4096
+ const subscription = this.#koniState.mktCampaignService.subscribePopupsData(callback);
4097
+ this.createUnsubscriptionHandle(id, subscription.unsubscribe);
4098
+ port.onDisconnect.addListener(() => {
4099
+ this.cancelSubscription(id);
4100
+ });
4101
+ ready = true;
4102
+ return this.#koniState.mktCampaignService.getAppPopupsData();
4103
+ }
4104
+ subscribeAppBannerData(id, port) {
4105
+ const cb = (0, _subscriptions.createSubscription)(id, port);
4106
+ let ready = false;
4107
+ const callback = rs => {
4108
+ if (ready) {
4109
+ cb(rs);
4110
+ }
4111
+ };
4112
+ const subscription = this.#koniState.mktCampaignService.subscribeBannersData(callback);
4113
+ this.createUnsubscriptionHandle(id, subscription.unsubscribe);
4114
+ port.onDisconnect.addListener(() => {
4115
+ this.cancelSubscription(id);
4116
+ });
4117
+ ready = true;
4118
+ return this.#koniState.mktCampaignService.getAppBannersData();
4119
+ }
4120
+ subscribeAppConfirmationData(id, port) {
4121
+ const cb = (0, _subscriptions.createSubscription)(id, port);
4122
+ let ready = false;
4123
+ const callback = rs => {
4124
+ if (ready) {
4125
+ cb(rs);
4126
+ }
4127
+ };
4128
+ const subscription = this.#koniState.mktCampaignService.subscribeConfirmationsData(callback);
4129
+ this.createUnsubscriptionHandle(id, subscription.unsubscribe);
4130
+ port.onDisconnect.addListener(() => {
4131
+ this.cancelSubscription(id);
4132
+ });
4133
+ ready = true;
4134
+ return this.#koniState.mktCampaignService.getAppConfirmationsData();
4135
+ }
4086
4136
 
4087
4137
  /* Campaign */
4088
4138
 
@@ -4709,6 +4759,12 @@ class KoniExtension {
4709
4759
  return this.subscribeCampaignPopupVisibility(id, port);
4710
4760
  case 'pri(campaign.popup.toggle)':
4711
4761
  return this.toggleCampaignPopup(request);
4762
+ case 'pri(campaign.popups.subscribe)':
4763
+ return this.subscribeAppPopupData(id, port);
4764
+ case 'pri(campaign.banners.subscribe)':
4765
+ return this.subscribeAppBannerData(id, port);
4766
+ case 'pri(campaign.confirmations.subscribe)':
4767
+ return this.subscribeAppConfirmationData(id, port);
4712
4768
 
4713
4769
  /* Campaign */
4714
4770
 
@@ -25,6 +25,7 @@ var _historyService = require("@subwallet/extension-base/services/history-servic
25
25
  var _keyringService = require("@subwallet/extension-base/services/keyring-service");
26
26
  var _migrationService = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service"));
27
27
  var _mintCampaignService = _interopRequireDefault(require("@subwallet/extension-base/services/mint-campaign-service"));
28
+ var _mktCampaignService = _interopRequireDefault(require("@subwallet/extension-base/services/mkt-campaign-service"));
28
29
  var _NotificationService = _interopRequireDefault(require("@subwallet/extension-base/services/notification-service/NotificationService"));
29
30
  var _priceService = require("@subwallet/extension-base/services/price-service");
30
31
  var _requestService = _interopRequireDefault(require("@subwallet/extension-base/services/request-service"));
@@ -110,6 +111,7 @@ class KoniState {
110
111
  this.walletConnectService = new _walletConnectService.default(this, this.requestService);
111
112
  this.migrationService = new _migrationService.default(this, this.eventService);
112
113
  this.campaignService = new _campaignService.default(this);
114
+ this.mktCampaignService = new _mktCampaignService.default(this);
113
115
  this.buyService = new _buyService.default(this);
114
116
  this.transactionService = new _transactionService.default(this);
115
117
  this.earningService = new _service.default(this);
@@ -235,6 +237,7 @@ class KoniState {
235
237
  this.afterChainServiceInit();
236
238
  await this.migrationService.run();
237
239
  this.campaignService.init();
240
+ this.mktCampaignService.init();
238
241
  this.eventService.emit('chain.ready', true);
239
242
  await this.balanceService.init();
240
243
  await this.earningService.init();
@@ -13,6 +13,6 @@ const packageInfo = {
13
13
  name: '@subwallet/extension-base',
14
14
  path: typeof __dirname === 'string' ? __dirname : 'auto',
15
15
  type: 'cjs',
16
- version: '1.2.22-0'
16
+ version: '1.2.24-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -297,7 +297,8 @@ const EVM_PASS_CONNECT_STATUS = {
297
297
  arbitrum_one: ['*'],
298
298
  okxTest: ['*'],
299
299
  astarZkEvm: ['*'],
300
- xlayer: ['*']
300
+ xlayer: ['*'],
301
+ aleph_evm: ['*']
301
302
  };
302
303
  exports.EVM_PASS_CONNECT_STATUS = EVM_PASS_CONNECT_STATUS;
303
304
  const EVM_REFORMAT_DECIMALS = {
@@ -19,7 +19,7 @@ class MigrateLedgerAccountV2 extends _Base.default {
19
19
  const store = new _stores.AccountsStore();
20
20
  const update = (key, value) => {
21
21
  var _value$meta;
22
- if (key.startsWith('account:') && value.meta && (0, _util.isString)((_value$meta = value.meta) === null || _value$meta === void 0 ? void 0 : _value$meta.originGenesisHash)) {
22
+ if (key.startsWith('account:') && value.meta && (0, _util.isString)((_value$meta = value.meta) === null || _value$meta === void 0 ? void 0 : _value$meta.genesisHash)) {
23
23
  const newValue = {
24
24
  ...value
25
25
  };
@@ -28,10 +28,10 @@ class MigrateLedgerAccountV2 extends _Base.default {
28
28
  if (isEther) {
29
29
  newValue.meta.isGeneric = true;
30
30
  } else {
31
- newValue.meta.isGeneric = !newValue.meta.originGenesisHash;
31
+ newValue.meta.isGeneric = !newValue.meta.genesisHash;
32
32
  }
33
33
  }
34
- newValue.meta.availableGenesisHashes = [value.meta.originGenesisHash];
34
+ newValue.meta.availableGenesisHashes = [value.meta.genesisHash];
35
35
  store.set(key, newValue);
36
36
  }
37
37
  };
@@ -0,0 +1,284 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
9
+ var _types = require("@subwallet/extension-base/services/mkt-campaign-service/types");
10
+ var _utils2 = require("@subwallet/extension-base/utils");
11
+ var _uiKeyring = require("@subwallet/ui-keyring");
12
+ var _bignumber = _interopRequireDefault(require("bignumber.js"));
13
+ var _rxjs = require("rxjs");
14
+ // Copyright 2019-2022 @subwallet/extension-base authors & contributors
15
+ // SPDX-License-Identifier: Apache-2.0
16
+
17
+ class MktCampaignService {
18
+ #state;
19
+ appPopupSubject = new _rxjs.BehaviorSubject([]);
20
+ appBannerSubject = new _rxjs.BehaviorSubject([]);
21
+ appConfirmationSubject = new _rxjs.BehaviorSubject([]);
22
+ constructor(state) {
23
+ this.#state = state;
24
+ this.appPopupSubject.next([]);
25
+ this.appBannerSubject.next([]);
26
+ this.appConfirmationSubject.next([]);
27
+ this.fetchPopupData().catch(e => {
28
+ console.error('Error on fetch popup', e);
29
+ });
30
+ this.fetchBannerData().catch(e => {
31
+ console.error('Error on fetch banner', e);
32
+ });
33
+ this.fetchConfirmationData().catch(e => {
34
+ console.error('Error on fetch confirmation', e);
35
+ });
36
+ }
37
+ fetchMktCampaignData() {
38
+ let timeout = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 10000;
39
+ (0, _utils2.wait)(timeout).finally(() => {
40
+ this.fetchPopupData().catch(console.error);
41
+ this.fetchBannerData().catch(console.error);
42
+ this.fetchConfirmationData().catch(console.error);
43
+ });
44
+ }
45
+ init() {
46
+ this.fetchMktCampaignData();
47
+ console.log('Mkt campaign service ready');
48
+ }
49
+ async fetchPopupData() {
50
+ const respAppPopupData = await (0, _utils2.fetchStaticData)('app-popups');
51
+ const result = await this.handleMktCampaignData(respAppPopupData);
52
+ this.appPopupSubject.next(result);
53
+ }
54
+ async fetchBannerData() {
55
+ const respAppBannerData = await (0, _utils2.fetchStaticData)('app-banners');
56
+ const result = await this.handleMktCampaignData(respAppBannerData);
57
+ this.appBannerSubject.next(result);
58
+ }
59
+ async fetchConfirmationData() {
60
+ const respAppConfirmationData = await (0, _utils2.fetchStaticData)('app-confirmations');
61
+ const result = await this.handleMktCampaignData(respAppConfirmationData);
62
+ this.appConfirmationSubject.next(result);
63
+ }
64
+ subscribePopupsData(callback) {
65
+ return this.appPopupSubject.subscribe({
66
+ next: callback
67
+ });
68
+ }
69
+ subscribeBannersData(callback) {
70
+ return this.appBannerSubject.subscribe({
71
+ next: callback
72
+ });
73
+ }
74
+ subscribeConfirmationsData(callback) {
75
+ return this.appConfirmationSubject.subscribe({
76
+ next: callback
77
+ });
78
+ }
79
+ getAppPopupsData() {
80
+ return this.appPopupSubject.getValue();
81
+ }
82
+ getAppBannersData() {
83
+ return this.appBannerSubject.getValue();
84
+ }
85
+ getAppConfirmationsData() {
86
+ return this.appConfirmationSubject.getValue();
87
+ }
88
+ async handleMktCampaignData(data) {
89
+ const addresses = _uiKeyring.keyring.getPairs().map(pair => pair.address);
90
+ const allConditions = this.getAllConditions(data);
91
+ const conditionBalanceMap = await this.checkBalanceCondition(allConditions, addresses);
92
+ const conditionEarningMap = await this.checkEarningCondition(allConditions, addresses);
93
+ const conditionNftMap = await this.checkNftCondition(allConditions, addresses);
94
+ const conditionCrowdloanMap = await this.checkCrowdloanCondition(allConditions, addresses);
95
+ const conditionHasMoneyMap = await this.checkHasMoneyCondition(allConditions, addresses);
96
+
97
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
98
+ const conditionMap = Object.assign({}, conditionBalanceMap, conditionEarningMap, conditionNftMap, conditionCrowdloanMap, conditionHasMoneyMap);
99
+ const filteredData = this.checkActiveAndPlatformCondition(data);
100
+ return filteredData.filter(item => this.filterCampaignFunc(item, conditionMap));
101
+ }
102
+ checkActiveAndPlatformCondition(data) {
103
+ return data.filter(item => {
104
+ if (item.info) {
105
+ return this.checkCampaignExistTime(item.info) && item.info.platforms.includes(_utils2.TARGET_ENV);
106
+ } else {
107
+ return true;
108
+ }
109
+ });
110
+ }
111
+ checkCampaignExistTime(info) {
112
+ if (info.start_time && info.stop_time) {
113
+ const now = new Date();
114
+ const startTime = new Date(info.start_time);
115
+ const endTime = new Date(info.stop_time);
116
+ return now >= startTime && now <= endTime;
117
+ } else {
118
+ return false;
119
+ }
120
+ }
121
+ async checkBalanceCondition(allConditions, addresses) {
122
+ var _allConditions$MktCam;
123
+ const allBalanceConditions = (_allConditions$MktCam = allConditions[_types.MktCampaignConditionTypeValue.BALANCE]) === null || _allConditions$MktCam === void 0 ? void 0 : _allConditions$MktCam.map(condition => {
124
+ return JSON.parse(condition);
125
+ });
126
+ const allBalanceConditionPromises = [];
127
+ allBalanceConditions.forEach(balanceCondition => {
128
+ const decimals = (0, _utils._getAssetDecimals)(this.#state.getAssetBySlug(balanceCondition.chain_asset));
129
+ const convertedValue = new _bignumber.default(balanceCondition.value).shiftedBy(decimals);
130
+ allBalanceConditionPromises.push(this.#state.dbService.checkBalanceByTokens([balanceCondition.chain_asset], balanceCondition.comparison, addresses, convertedValue.toString()));
131
+ });
132
+ const promiseBalanceResult = await Promise.all(allBalanceConditionPromises);
133
+ const conditionBalanceMap = {};
134
+ promiseBalanceResult.forEach((rs, i) => {
135
+ conditionBalanceMap[allConditions[_types.MktCampaignConditionTypeValue.BALANCE][i]] = rs > 0;
136
+ });
137
+ return conditionBalanceMap;
138
+ }
139
+ async checkEarningCondition(allConditions, addresses) {
140
+ var _allConditions$MktCam2;
141
+ const allEarningConditions = (_allConditions$MktCam2 = allConditions[_types.MktCampaignConditionTypeValue.EARNING]) === null || _allConditions$MktCam2 === void 0 ? void 0 : _allConditions$MktCam2.map(condition => {
142
+ return JSON.parse(condition);
143
+ });
144
+ const allEarningConditionPromises = [];
145
+ allEarningConditions.forEach(earningCondition => {
146
+ const poolSlugSplittedArr = earningCondition.pool_slug.split('___');
147
+ if (poolSlugSplittedArr[1] === 'liquid_staking') {
148
+ allEarningConditionPromises.push(new Promise(() => false));
149
+ }
150
+ const chain = earningCondition.pool_slug.split('___')[2];
151
+ const chainInfo = this.#state.getChainInfo(chain);
152
+ const {
153
+ decimals
154
+ } = (0, _utils._getChainNativeTokenBasicInfo)(chainInfo);
155
+ const convertedValue = new _bignumber.default(earningCondition.value).shiftedBy(decimals);
156
+ allEarningConditionPromises.push(this.#state.dbService.checkEarningByTokens(earningCondition.pool_slug, earningCondition.comparison, addresses, convertedValue.toString()));
157
+ });
158
+ const promiseEarningResult = await Promise.all(allEarningConditionPromises);
159
+ const conditionEarningMap = {};
160
+ promiseEarningResult.forEach((rs, i) => {
161
+ conditionEarningMap[allConditions[_types.MktCampaignConditionTypeValue.EARNING][i]] = rs > 0;
162
+ });
163
+ return conditionEarningMap;
164
+ }
165
+ async checkNftCondition(allConditions, addresses) {
166
+ var _allConditions$MktCam3;
167
+ const allNftConditions = (_allConditions$MktCam3 = allConditions[_types.MktCampaignConditionTypeValue.NFT]) === null || _allConditions$MktCam3 === void 0 ? void 0 : _allConditions$MktCam3.map(condition => {
168
+ return JSON.parse(condition);
169
+ });
170
+ const allNftConditionPromises = [];
171
+ allNftConditions.forEach(nftCondition => {
172
+ allNftConditionPromises.push(this.#state.dbService.checkNftByTokens(nftCondition.chain, addresses, nftCondition.collection_id));
173
+ });
174
+ const promiseNftResult = await Promise.all(allNftConditionPromises);
175
+ const conditionNftMap = {};
176
+ promiseNftResult.forEach((rs, i) => {
177
+ conditionNftMap[allConditions[_types.MktCampaignConditionTypeValue.NFT][i]] = rs > 0;
178
+ });
179
+ return conditionNftMap;
180
+ }
181
+ async checkCrowdloanCondition(allConditions, addresses) {
182
+ var _allConditions$MktCam4;
183
+ const allCrowdloanConditions = (_allConditions$MktCam4 = allConditions[_types.MktCampaignConditionTypeValue.CROWDLOAN]) === null || _allConditions$MktCam4 === void 0 ? void 0 : _allConditions$MktCam4.map(condition => {
184
+ return JSON.parse(condition);
185
+ });
186
+ const allCrowdloanConditionPromises = [];
187
+ allCrowdloanConditions.forEach(crowdloanCondition => {
188
+ allCrowdloanConditionPromises.push(this.#state.dbService.checkCrowdloanByChain(crowdloanCondition.chain, addresses));
189
+ });
190
+ const promiseCrowdloanResult = await Promise.all(allCrowdloanConditionPromises);
191
+ const conditionCrowdloanMap = {};
192
+ promiseCrowdloanResult.forEach((rs, i) => {
193
+ conditionCrowdloanMap[allConditions[_types.MktCampaignConditionTypeValue.CROWDLOAN][i]] = rs > 0;
194
+ });
195
+ return conditionCrowdloanMap;
196
+ }
197
+ async checkHasMoneyCondition(allConditions, addresses) {
198
+ const hasMoneyCondition = allConditions[_types.MktCampaignConditionTypeValue.HAS_MONEY];
199
+ const allHasMoneyConditions = hasMoneyCondition === null || hasMoneyCondition === void 0 ? void 0 : hasMoneyCondition.map(condition => {
200
+ return JSON.parse(condition);
201
+ });
202
+ const allHasMoneyConditionPromises = [];
203
+ allHasMoneyConditions.forEach(hasMoneyCondition => {
204
+ allHasMoneyConditionPromises.push(this.#state.dbService.checkHasMoneyByTokens(hasMoneyCondition.has_money, addresses));
205
+ });
206
+ const promiseHasMoneyResult = await Promise.all(allHasMoneyConditionPromises);
207
+ const conditionHasMoneyMap = {};
208
+ promiseHasMoneyResult.forEach((rs, i) => {
209
+ conditionHasMoneyMap[hasMoneyCondition[i]] = rs > 0;
210
+ });
211
+ return conditionHasMoneyMap;
212
+ }
213
+ getAllConditions(respAppPopupData) {
214
+ const result = {
215
+ [_types.MktCampaignConditionTypeValue.BALANCE]: [],
216
+ [_types.MktCampaignConditionTypeValue.EARNING]: [],
217
+ [_types.MktCampaignConditionTypeValue.CROWDLOAN]: [],
218
+ [_types.MktCampaignConditionTypeValue.NFT]: [],
219
+ [_types.MktCampaignConditionTypeValue.HAS_MONEY]: []
220
+ };
221
+ const getConditionByType = (campaignCondition, type) => {
222
+ const campaignConditionByType = campaignCondition[type];
223
+ campaignConditionByType === null || campaignConditionByType === void 0 ? void 0 : campaignConditionByType.forEach(condition => {
224
+ const conditionStringify = JSON.stringify(condition);
225
+ if (!result[type].includes(conditionStringify)) {
226
+ result[type].push(conditionStringify);
227
+ }
228
+ });
229
+ };
230
+ respAppPopupData.forEach(popup => {
231
+ const conditionKeys = Object.keys(popup.conditions);
232
+ if (conditionKeys && conditionKeys.length) {
233
+ conditionKeys.forEach(con => getConditionByType(popup.conditions, con));
234
+ }
235
+ });
236
+ return result;
237
+ }
238
+ filterCampaignFunc(item, conditionMap) {
239
+ const isPassValidation = [];
240
+ if (Object.values(item.conditions) && Object.values(item.conditions).length) {
241
+ const conditionBalance = Object.values(item.conditions[_types.MktCampaignConditionTypeValue.BALANCE] || {});
242
+ const conditionEarning = Object.values(item.conditions[_types.MktCampaignConditionTypeValue.EARNING] || {});
243
+ const conditionNft = Object.values(item.conditions[_types.MktCampaignConditionTypeValue.NFT] || {});
244
+ const conditionCrowdloan = Object.values(item.conditions[_types.MktCampaignConditionTypeValue.CROWDLOAN] || {});
245
+ const conditionHasMoney = Object.values(item.conditions[_types.MktCampaignConditionTypeValue.HAS_MONEY] || {});
246
+ if (conditionBalance && conditionBalance.length) {
247
+ const isValidArr = conditionBalance.map(condition => {
248
+ return conditionMap[JSON.stringify(condition)];
249
+ });
250
+ isPassValidation.push(isValidArr.some(i => i));
251
+ }
252
+ if (conditionEarning && conditionEarning.length) {
253
+ const isValidArr = conditionEarning.map(condition => {
254
+ return conditionMap[JSON.stringify(condition)];
255
+ });
256
+ isPassValidation.push(isValidArr.some(i => i));
257
+ }
258
+ if (conditionNft && conditionNft.length) {
259
+ const isValidArr = conditionNft.map(condition => {
260
+ return conditionMap[JSON.stringify(condition)];
261
+ });
262
+ isPassValidation.push(isValidArr.some(i => i));
263
+ }
264
+ if (conditionCrowdloan && conditionCrowdloan.length) {
265
+ const isValidArr = conditionCrowdloan.map(condition => {
266
+ return conditionMap[JSON.stringify(condition)];
267
+ });
268
+ isPassValidation.push(isValidArr.some(i => i));
269
+ }
270
+ if (conditionHasMoney && conditionHasMoney.length) {
271
+ const isValidArr = conditionHasMoney.map(condition => {
272
+ return conditionMap[JSON.stringify(condition)];
273
+ });
274
+ isPassValidation.push(isValidArr.some(i => i));
275
+ }
276
+ }
277
+ if (isPassValidation && isPassValidation.length) {
278
+ return isPassValidation.some(_i => _i);
279
+ } else {
280
+ return true;
281
+ }
282
+ }
283
+ }
284
+ exports.default = MktCampaignService;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.MktCampaignConditionTypeValue = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
8
+ // SPDX-License-Identifier: Apache-2.0
9
+ let MktCampaignConditionTypeValue;
10
+ exports.MktCampaignConditionTypeValue = MktCampaignConditionTypeValue;
11
+ (function (MktCampaignConditionTypeValue) {
12
+ MktCampaignConditionTypeValue["BALANCE"] = "condition-balance";
13
+ MktCampaignConditionTypeValue["EARNING"] = "condition-earning";
14
+ MktCampaignConditionTypeValue["NFT"] = "condition-nft";
15
+ MktCampaignConditionTypeValue["CROWDLOAN"] = "condition-crowdloan";
16
+ MktCampaignConditionTypeValue["HAS_MONEY"] = "condition-has-money";
17
+ })(MktCampaignConditionTypeValue || (exports.MktCampaignConditionTypeValue = MktCampaignConditionTypeValue = {}));