@subwallet/extension-base 1.1.2-0 → 1.1.2-1

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 (77) hide show
  1. package/background/KoniTypes.d.ts +14 -4
  2. package/cjs/constants/i18n.js +10 -2
  3. package/cjs/koni/api/dotsama/transfer.js +6 -0
  4. package/cjs/koni/api/nft/acala_nft/index.js +0 -2
  5. package/cjs/koni/api/nft/bit.country/index.js +49 -18
  6. package/cjs/koni/api/nft/config.js +5 -3
  7. package/cjs/koni/api/nft/evm_nft/index.js +0 -5
  8. package/cjs/koni/api/nft/index.js +2 -3
  9. package/cjs/koni/api/nft/karura_nft/index.js +0 -2
  10. package/cjs/koni/api/nft/rmrk_nft/index.js +0 -4
  11. package/cjs/koni/api/nft/statemine_nft/index.js +0 -2
  12. package/cjs/koni/api/nft/unique_nft/index.js +0 -5
  13. package/cjs/koni/api/nft/wasm_nft/index.js +0 -5
  14. package/cjs/koni/api/staking/bonding/amplitude.js +6 -6
  15. package/cjs/koni/api/staking/bonding/astar.js +6 -6
  16. package/cjs/koni/api/staking/bonding/paraChain.js +5 -5
  17. package/cjs/koni/api/staking/bonding/relayChain.js +24 -14
  18. package/cjs/koni/api/staking/bonding/utils.js +1 -7
  19. package/cjs/koni/api/xcm/xTokens.js +1 -1
  20. package/cjs/koni/background/cron.js +2 -37
  21. package/cjs/koni/background/handlers/Extension.js +133 -123
  22. package/cjs/koni/background/handlers/State.js +6 -43
  23. package/cjs/koni/background/subscription.js +6 -88
  24. package/cjs/packageInfo.js +1 -1
  25. package/cjs/services/chain-service/constants.js +6 -4
  26. package/cjs/services/setting-service/constants.js +16 -6
  27. package/cjs/services/storage-service/DatabaseService.js +3 -0
  28. package/cjs/services/storage-service/db-stores/Nft.js +3 -0
  29. package/cjs/services/storage-service/db-stores/NominatorMetadata.js +3 -2
  30. package/cjs/utils/index.js +12 -0
  31. package/cjs/utils/translate.js +11 -0
  32. package/constants/i18n.d.ts +2 -1
  33. package/constants/i18n.js +8 -1
  34. package/koni/api/dotsama/transfer.js +6 -0
  35. package/koni/api/nft/acala_nft/index.js +0 -2
  36. package/koni/api/nft/bit.country/index.d.ts +1 -0
  37. package/koni/api/nft/bit.country/index.js +50 -19
  38. package/koni/api/nft/config.d.ts +2 -1
  39. package/koni/api/nft/config.js +2 -1
  40. package/koni/api/nft/evm_nft/index.js +0 -4
  41. package/koni/api/nft/index.d.ts +1 -1
  42. package/koni/api/nft/index.js +2 -3
  43. package/koni/api/nft/karura_nft/index.js +0 -2
  44. package/koni/api/nft/nft.d.ts +0 -1
  45. package/koni/api/nft/rmrk_nft/index.js +0 -4
  46. package/koni/api/nft/statemine_nft/index.js +0 -2
  47. package/koni/api/nft/unique_nft/index.js +0 -5
  48. package/koni/api/nft/wasm_nft/index.js +0 -4
  49. package/koni/api/staking/bonding/amplitude.js +6 -6
  50. package/koni/api/staking/bonding/astar.js +6 -6
  51. package/koni/api/staking/bonding/paraChain.js +5 -5
  52. package/koni/api/staking/bonding/relayChain.js +24 -14
  53. package/koni/api/staking/bonding/utils.js +1 -7
  54. package/koni/api/xcm/xTokens.js +1 -1
  55. package/koni/background/cron.d.ts +0 -5
  56. package/koni/background/cron.js +4 -39
  57. package/koni/background/handlers/Extension.d.ts +2 -0
  58. package/koni/background/handlers/Extension.js +25 -17
  59. package/koni/background/handlers/State.d.ts +2 -6
  60. package/koni/background/handlers/State.js +6 -43
  61. package/koni/background/subscription.d.ts +1 -4
  62. package/koni/background/subscription.js +9 -88
  63. package/package.json +11 -6
  64. package/packageInfo.js +1 -1
  65. package/services/chain-service/constants.d.ts +1 -0
  66. package/services/chain-service/constants.js +6 -4
  67. package/services/setting-service/constants.d.ts +6 -1
  68. package/services/setting-service/constants.js +10 -5
  69. package/services/storage-service/DatabaseService.d.ts +1 -0
  70. package/services/storage-service/DatabaseService.js +3 -0
  71. package/services/storage-service/db-stores/Nft.d.ts +1 -0
  72. package/services/storage-service/db-stores/Nft.js +3 -0
  73. package/services/storage-service/db-stores/NominatorMetadata.js +3 -2
  74. package/utils/index.d.ts +1 -0
  75. package/utils/index.js +2 -1
  76. package/utils/translate.d.ts +1 -0
  77. package/utils/translate.js +4 -0
@@ -620,51 +620,11 @@ class KoniState {
620
620
  setSettings(settings, callback) {
621
621
  this.settingService.setSettings(settings, callback);
622
622
  }
623
- setTheme(theme, callback) {
623
+ updateSetting(key, value) {
624
624
  this.settingService.getSettings(settings => {
625
625
  const newSettings = {
626
626
  ...settings,
627
- theme
628
- };
629
- this.settingService.setSettings(newSettings, () => {
630
- callback && callback(newSettings);
631
- });
632
- });
633
- }
634
- setBrowserConfirmationType(browserConfirmationType, callback) {
635
- this.settingService.getSettings(settings => {
636
- const newSettings = {
637
- ...settings,
638
- browserConfirmationType
639
- };
640
- this.settingService.setSettings(newSettings, () => {
641
- callback && callback(newSettings);
642
- });
643
- });
644
- }
645
- setCamera(value) {
646
- this.settingService.getSettings(settings => {
647
- const newSettings = {
648
- ...settings,
649
- camera: value
650
- };
651
- this.settingService.setSettings(newSettings);
652
- });
653
- }
654
- setAutoLockTime(value) {
655
- this.settingService.getSettings(settings => {
656
- const newSettings = {
657
- ...settings,
658
- timeAutoLock: value
659
- };
660
- this.settingService.setSettings(newSettings);
661
- });
662
- }
663
- setEnableChainPatrol(value) {
664
- this.settingService.getSettings(settings => {
665
- const newSettings = {
666
- ...settings,
667
- enableChainPatrol: value
627
+ [key]: value
668
628
  };
669
629
  this.settingService.setSettings(newSettings);
670
630
  });
@@ -1561,10 +1521,13 @@ class KoniState {
1561
1521
  });
1562
1522
  }
1563
1523
  async reloadNft() {
1524
+ const currentAddress = this.keyringService.currentAccount.address;
1525
+ await this.dbService.removeNftsByAddress(currentAddress);
1564
1526
  return await this.cron.reloadNft();
1565
1527
  }
1566
1528
  async reloadStaking() {
1567
- return await this.cron.reloadStaking();
1529
+ await this.subscription.reloadStaking();
1530
+ return true;
1568
1531
  }
1569
1532
  async approvePassPhishingPage(_url) {
1570
1533
  return new Promise(resolve => {
@@ -1,24 +1,19 @@
1
1
  "use strict";
2
2
 
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
3
  Object.defineProperty(exports, "__esModule", {
5
4
  value: true
6
5
  });
7
6
  exports.KoniSubscription = void 0;
8
- var _constants = require("@subwallet/extension-base/constants");
9
7
  var _balance = require("@subwallet/extension-base/koni/api/dotsama/balance");
10
8
  var _crowdloan = require("@subwallet/extension-base/koni/api/dotsama/crowdloan");
11
9
  var _staking = require("@subwallet/extension-base/koni/api/staking");
12
10
  var _bonding = require("@subwallet/extension-base/koni/api/staking/bonding");
13
- var _relayChain = require("@subwallet/extension-base/koni/api/staking/bonding/relayChain");
14
11
  var _paraChain = require("@subwallet/extension-base/koni/api/staking/paraChain");
15
12
  var _handlers = require("@subwallet/extension-base/koni/background/handlers");
16
- var _constants2 = require("@subwallet/extension-base/services/chain-service/constants");
17
13
  var _utils = require("@subwallet/extension-base/services/chain-service/utils");
18
14
  var _types = require("@subwallet/extension-base/services/event-service/types");
19
- var _axios = _interopRequireDefault(require("axios"));
15
+ var _utils2 = require("@subwallet/extension-base/utils");
20
16
  var _util = require("@polkadot/util");
21
- var _utilCrypto = require("@polkadot/util-crypto");
22
17
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
23
18
  // SPDX-License-Identifier: Apache-2.0
24
19
 
@@ -198,8 +193,6 @@ class KoniSubscription {
198
193
  return _this.state.updateNftData(...arguments);
199
194
  }, function () {
200
195
  return _this.state.setNftCollection(...arguments);
201
- }, function () {
202
- return _this.state.cleanUpNfts(...arguments);
203
196
  }).catch(this.logger.log);
204
197
  }
205
198
  async subscribeStakingReward(address) {
@@ -250,86 +243,11 @@ class KoniSubscription {
250
243
  };
251
244
  await Promise.all([(0, _staking.getPoolingStakingRewardData)(pooledAddresses, targetChainMap, this.state.getSubstrateApiMap(), updateState), (0, _paraChain.getAmplitudeUnclaimedStakingReward)(this.state.getSubstrateApiMap(), addresses, chainInfoMap, activeNetworks, updateState)]);
252
245
  }
253
- async fetchingStakingFromApi() {
254
- try {
255
- const response = await _axios.default.get('https://staking-data.subwallet.app/api/staking/get');
256
- if (response.status === 200) {
257
- return response.data;
258
- }
259
- } catch (e) {
260
- this.logger.error(e);
261
- }
262
- return {};
263
- }
264
- async fetchChainStakingMetadata(chainInfoMap, chainStateMap, substrateApiMap) {
265
- const filteredChainInfoMap = {};
266
- Object.values(chainInfoMap).forEach(chainInfo => {
267
- const chainState = chainStateMap[chainInfo.slug];
268
- if (chainState !== null && chainState !== void 0 && chainState.active && (0, _utils._isChainSupportSubstrateStaking)(chainInfo)) {
269
- filteredChainInfoMap[chainInfo.slug] = chainInfo;
270
- }
271
- });
272
- if (Object.values(filteredChainInfoMap).length === 0) {
273
- return;
274
- }
275
- const timeout = new Promise(resolve => {
276
- const id = setTimeout(() => {
277
- clearTimeout(id);
278
- resolve(null);
279
- }, 3000);
280
- });
281
-
282
- // Fetch data from helper API
283
- const _dataFromApi = await Promise.race([this.fetchingStakingFromApi(), timeout]);
284
- const dataFromApi = _dataFromApi;
285
- await Promise.all(Object.values(filteredChainInfoMap).map(async chainInfo => {
286
- // Use fetch API data if available
287
- if (dataFromApi && dataFromApi[chainInfo.slug]) {
288
- this.state.updateChainStakingMetadata(dataFromApi[chainInfo.slug], {
289
- expectedReturn: dataFromApi[chainInfo.slug].expectedReturn,
290
- inflation: dataFromApi[chainInfo.slug].inflation,
291
- nominatorCount: dataFromApi[chainInfo.slug].nominatorCount
292
- });
293
- } else {
294
- const chainStakingMetadata = await (0, _bonding.getChainStakingMetadata)(chainInfo, substrateApiMap[chainInfo.slug]);
295
- this.state.updateChainStakingMetadata(chainStakingMetadata, {
296
- expectedReturn: chainStakingMetadata.expectedReturn,
297
- inflation: chainStakingMetadata.inflation,
298
- nominatorCount: chainStakingMetadata.nominatorCount
299
- });
300
- }
301
- }));
302
- }
303
- async fetchNominatorMetadata(currentAddress, chainInfoMap, chainStateMap, substrateApiMap) {
304
- const filteredChainInfoMap = {};
305
- Object.values(chainInfoMap).forEach(chainInfo => {
306
- const chainState = chainStateMap[chainInfo.slug];
307
- if (chainState !== null && chainState !== void 0 && chainState.active && (0, _utils._isChainSupportSubstrateStaking)(chainInfo)) {
308
- filteredChainInfoMap[chainInfo.slug] = chainInfo;
309
- }
310
- });
311
- let addresses = [currentAddress];
312
- if (currentAddress === _constants.ALL_ACCOUNT_KEY) {
313
- addresses = await this.state.getStakingOwnersByChains(Object.keys(filteredChainInfoMap));
314
- }
315
- await Promise.all(addresses.map(async address => {
316
- const isEvmAddress = (0, _utilCrypto.isEthereumAddress)(address);
317
- await Promise.all(Object.values(filteredChainInfoMap).map(async chainInfo => {
318
- if (isEvmAddress && !(0, _utils._isChainEvmCompatible)(chainInfo)) {
319
- return;
320
- }
321
- if ((0, _utils._isSubstrateRelayChain)(chainInfo) && _constants2._STAKING_CHAIN_GROUP.nominationPool.includes(chainInfo.slug)) {
322
- const poolMemberMetadata = await (0, _relayChain.getRelayChainPoolMemberMetadata)(chainInfo, address, substrateApiMap[chainInfo.slug]);
323
- if (poolMemberMetadata) {
324
- this.state.updateStakingNominatorMetadata(poolMemberMetadata);
325
- }
326
- }
327
- const nominatorMetadata = await (0, _bonding.getNominatorMetadata)(chainInfo, address, substrateApiMap[chainInfo.slug]);
328
- if (nominatorMetadata) {
329
- this.state.updateStakingNominatorMetadata(nominatorMetadata);
330
- }
331
- }));
332
- }));
246
+ async reloadStaking() {
247
+ var _this$state$keyringSe2;
248
+ const currentAddress = (_this$state$keyringSe2 = this.state.keyringService.currentAccount) === null || _this$state$keyringSe2 === void 0 ? void 0 : _this$state$keyringSe2.address;
249
+ this.subscribeStakingOnChain(currentAddress, this.state.getSubstrateApiMap());
250
+ await (0, _utils2.waitTimeout)(1800);
333
251
  }
334
252
  }
335
253
  exports.KoniSubscription = KoniSubscription;
@@ -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.1.2-0'
16
+ version: '1.1.2-1'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -37,7 +37,7 @@ const _BALANCE_CHAIN_GROUP = {
37
37
  kintsugi: ['kintsugi', 'interlay', 'kintsugi_test', 'mangatax_para'],
38
38
  genshiro: ['genshiro_testnet', 'genshiro'],
39
39
  equilibrium_parachain: ['equilibrium_parachain'],
40
- bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main'],
40
+ bifrost: ['bifrost', 'acala', 'karura', 'acala_testnet', 'pioneer', 'bitcountry', 'bifrost_dot', 'hydradx_main', 'pendulum'],
41
41
  statemine: ['statemine', 'astar', 'shiden', 'statemint', 'moonbeam', 'moonbase', 'moonriver', 'crabParachain', 'darwinia2', 'parallel', 'calamari'],
42
42
  kusama: ['kusama', 'kintsugi', 'kintsugi_test', 'interlay', 'acala', 'statemint', 'karura', 'bifrost'] // perhaps there are some runtime updates
43
43
  };
@@ -63,7 +63,7 @@ const _STAKING_CHAIN_GROUP = {
63
63
  relay: ['polkadot', 'kusama', 'aleph', 'polkadex', 'ternoa', 'ternoa_alphanet', 'alephTest', 'polkadexTest', 'westend'],
64
64
  para: ['moonbeam', 'moonriver', 'moonbase', 'turing', 'turingStaging', 'bifrost', 'bifrost_testnet', 'calamari_test', 'calamari'],
65
65
  astar: ['astar', 'shiden', 'shibuya'],
66
- amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine'],
66
+ amplitude: ['amplitude', 'amplitude_test', 'kilt', 'kilt_peregrine', 'pendulum'],
67
67
  // amplitude and kilt only share some common logic
68
68
  kilt: ['kilt', 'kilt_peregrine'],
69
69
  nominationPool: ['polkadot', 'kusama', 'westend', 'alephTest', 'aleph'],
@@ -97,6 +97,7 @@ const _STAKING_ERA_LENGTH_MAP = {
97
97
  calamari_test: 6,
98
98
  amplitude: 2,
99
99
  amplitude_test: 2,
100
+ pendulum: 2,
100
101
  kilt: 2,
101
102
  kilt_peregrine: 2
102
103
  };
@@ -201,7 +202,8 @@ const _TRANSFER_CHAIN_GROUP = {
201
202
  statemine: ['statemint', 'statemine', 'darwinia2', 'astar', 'shiden', 'shibuya', 'parallel'],
202
203
  riochain: ['riochain'],
203
204
  sora_substrate: ['sora_substrate'],
204
- avail: ['kate']
205
+ avail: ['kate'],
206
+ pendulum: ['pendulum']
205
207
  };
206
208
  exports._TRANSFER_CHAIN_GROUP = _TRANSFER_CHAIN_GROUP;
207
209
  const _BALANCE_PARSING_CHAIN_GROUP = {
@@ -234,7 +236,7 @@ const _DEFAULT_ACTIVE_CHAINS = [..._chainList._DEFAULT_CHAINS];
234
236
 
235
237
  // TODO: review
236
238
  exports._DEFAULT_ACTIVE_CHAINS = _DEFAULT_ACTIVE_CHAINS;
237
- const TARGET_BRANCH = process.env.NODE_ENV !== 'production' ? 'koni/dev/issue-15' : 'master';
239
+ const TARGET_BRANCH = process.env.NODE_ENV !== 'production' ? 'koni-dev' : 'master';
238
240
  const _CHAIN_INFO_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainInfo.json`;
239
241
  exports._CHAIN_INFO_SRC = _CHAIN_INFO_SRC;
240
242
  const _CHAIN_ASSET_SRC = `https://raw.githubusercontent.com/Koniverse/SubWallet-Chain/${TARGET_BRANCH}/packages/chain-list/src/data/ChainAsset.json`;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.DEFAULT_THEME = exports.DEFAULT_SETTING = exports.DEFAULT_NOTIFICATION_TYPE = exports.DEFAULT_CHAIN_PATROL_ENABLE = exports.DEFAULT_AUTO_LOCK_TIME = void 0;
6
+ exports.DEFAULT_THEME = exports.DEFAULT_SHOW_ZERO_BALANCE = exports.DEFAULT_SHOW_BALANCE = exports.DEFAULT_SETTING = exports.DEFAULT_NOTIFICATION_TYPE = exports.DEFAULT_LANGUAGE = exports.DEFAULT_CHAIN_PATROL_ENABLE = exports.DEFAULT_CAMERA_ENABLE = exports.DEFAULT_AUTO_LOCK_TIME = exports.DEFAULT_ALL_LOGO = void 0;
7
7
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
8
  // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
9
9
  // SPDX-License-Identifier: Apache-2.0
@@ -16,14 +16,24 @@ const DEFAULT_AUTO_LOCK_TIME = 15;
16
16
  exports.DEFAULT_AUTO_LOCK_TIME = DEFAULT_AUTO_LOCK_TIME;
17
17
  const DEFAULT_CHAIN_PATROL_ENABLE = false;
18
18
  exports.DEFAULT_CHAIN_PATROL_ENABLE = DEFAULT_CHAIN_PATROL_ENABLE;
19
+ const DEFAULT_LANGUAGE = 'en';
20
+ exports.DEFAULT_LANGUAGE = DEFAULT_LANGUAGE;
21
+ const DEFAULT_SHOW_ZERO_BALANCE = true;
22
+ exports.DEFAULT_SHOW_ZERO_BALANCE = DEFAULT_SHOW_ZERO_BALANCE;
23
+ const DEFAULT_SHOW_BALANCE = false;
24
+ exports.DEFAULT_SHOW_BALANCE = DEFAULT_SHOW_BALANCE;
25
+ const DEFAULT_ALL_LOGO = '';
26
+ exports.DEFAULT_ALL_LOGO = DEFAULT_ALL_LOGO;
27
+ const DEFAULT_CAMERA_ENABLE = false;
28
+ exports.DEFAULT_CAMERA_ENABLE = DEFAULT_CAMERA_ENABLE;
19
29
  const DEFAULT_SETTING = {
20
- // language: 'en',
30
+ language: DEFAULT_LANGUAGE,
21
31
  browserConfirmationType: DEFAULT_NOTIFICATION_TYPE,
22
- // isShowZeroBalance: true,
23
- isShowBalance: false,
24
- accountAllLogo: '',
32
+ isShowZeroBalance: DEFAULT_SHOW_ZERO_BALANCE,
33
+ isShowBalance: DEFAULT_SHOW_BALANCE,
34
+ accountAllLogo: DEFAULT_ALL_LOGO,
25
35
  theme: DEFAULT_THEME,
26
- camera: false,
36
+ camera: DEFAULT_CAMERA_ENABLE,
27
37
  timeAutoLock: DEFAULT_AUTO_LOCK_TIME,
28
38
  enableChainPatrol: DEFAULT_CHAIN_PATROL_ENABLE
29
39
  };
@@ -178,6 +178,9 @@ class DatabaseService {
178
178
  removeNfts(chain, address, collectionId, nftIds) {
179
179
  return this.stores.nft.removeNfts(chain, address, collectionId, nftIds);
180
180
  }
181
+ removeNftsByAddress(address) {
182
+ return this.stores.nft.removeNftsByAddress([address]);
183
+ }
181
184
 
182
185
  // Chain
183
186
  async updateChainStore(item) {
@@ -55,6 +55,9 @@ class NftStore extends _BaseStoreWithAddressAndChain.default {
55
55
  collectionId
56
56
  }).filter(item => nftIds.includes(item.id || '')).delete();
57
57
  }
58
+ removeNftsByAddress(addresses) {
59
+ return this.table.where('address').anyOfIgnoreCase(addresses).delete();
60
+ }
58
61
 
59
62
  // reformatCollectionIds (items: INft[]) {
60
63
  // return items.map((item) => {
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.default = void 0;
8
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
8
9
  var _BaseStoreWithAddressAndChain = _interopRequireDefault(require("@subwallet/extension-base/services/storage-service/db-stores/BaseStoreWithAddressAndChain"));
9
10
  var _dexie = require("dexie");
10
11
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
@@ -12,7 +13,7 @@ var _dexie = require("dexie");
12
13
 
13
14
  class NominatorMetadataStore extends _BaseStoreWithAddressAndChain.default {
14
15
  async getAll() {
15
- return this.table.toArray();
16
+ return this.table.filter(item => item.status !== _KoniTypes.StakingStatus.NOT_STAKING).toArray();
16
17
  }
17
18
  subscribeByAddresses(addresses) {
18
19
  return (0, _dexie.liveQuery)(() => this.getByAddress(addresses));
@@ -21,7 +22,7 @@ class NominatorMetadataStore extends _BaseStoreWithAddressAndChain.default {
21
22
  return (0, _dexie.liveQuery)(() => this.getAll());
22
23
  }
23
24
  getByAddress(addresses) {
24
- return this.table.where('address').anyOfIgnoreCase(addresses).toArray();
25
+ return this.table.where('address').anyOfIgnoreCase(addresses).and(item => item.status !== _KoniTypes.StakingStatus.NOT_STAKING).toArray();
25
26
  }
26
27
  async removeByAddress(address) {
27
28
  return this.table.where('address').anyOfIgnoreCase(address).delete();
@@ -109,6 +109,18 @@ Object.keys(_lazy).forEach(function (key) {
109
109
  }
110
110
  });
111
111
  });
112
+ var _translate = require("./translate");
113
+ Object.keys(_translate).forEach(function (key) {
114
+ if (key === "default" || key === "__esModule") return;
115
+ if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
116
+ if (key in exports && exports[key] === _translate[key]) return;
117
+ Object.defineProperty(exports, key, {
118
+ enumerable: true,
119
+ get: function () {
120
+ return _translate[key];
121
+ }
122
+ });
123
+ });
112
124
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
113
125
  // SPDX-License-Identifier: Apache-2.0
114
126
 
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.detectTranslate = void 0;
7
+ // Copyright 2019-2022 @subwallet/extension-base
8
+ // SPDX-License-Identifier: Apache-2.0
9
+
10
+ const detectTranslate = message => message;
11
+ exports.detectTranslate = detectTranslate;
@@ -1,2 +1,3 @@
1
- import { LanguageOptionType } from '@subwallet/extension-base/background/KoniTypes';
1
+ import { LanguageOptionType, LanguageType } from '@subwallet/extension-base/background/KoniTypes';
2
2
  export declare const languageOptions: LanguageOptionType[];
3
+ export declare const ENABLE_LANGUAGES: LanguageType[];
package/constants/i18n.js CHANGED
@@ -4,9 +4,15 @@
4
4
  export const languageOptions = [{
5
5
  text: 'English',
6
6
  value: 'en'
7
+ }, {
8
+ text: 'Tiếng Việt',
9
+ value: 'vi'
7
10
  }, {
8
11
  text: '汉语',
9
12
  value: 'zh'
13
+ }, {
14
+ text: '日本語',
15
+ value: 'ja'
10
16
  }, {
11
17
  text: 'Français',
12
18
  value: 'fr'
@@ -22,4 +28,5 @@ export const languageOptions = [{
22
28
  }, {
23
29
  text: 'اردو',
24
30
  value: 'ur'
25
- }];
31
+ }];
32
+ export const ENABLE_LANGUAGES = ['en', 'vi', 'zh'];
@@ -140,6 +140,12 @@ export const createTransferExtrinsic = async ({
140
140
  } else if (value) {
141
141
  transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo) || _getTokenOnChainAssetId(tokenInfo), new BN(value));
142
142
  }
143
+ } else if (_TRANSFER_CHAIN_GROUP.pendulum.includes(networkKey) && isTxTokensSupported) {
144
+ if (transferAll) {
145
+ transfer = api.tx.tokens.transferAll(to, _getTokenOnChainInfo(tokenInfo), false);
146
+ } else if (value) {
147
+ transfer = api.tx.tokens.transfer(to, _getTokenOnChainInfo(tokenInfo), new BN(value));
148
+ }
143
149
  } else if (_TRANSFER_CHAIN_GROUP.genshiro.includes(networkKey)
144
150
  // && isTxEqBalancesSupported
145
151
  ) {
@@ -75,7 +75,6 @@ export class AcalaNftApi extends BaseNftApi {
75
75
  const assetIds = await this.getNfts([address]);
76
76
  try {
77
77
  if (!assetIds || assetIds.length === 0) {
78
- params.cleanUpNfts(this.chain, address, [], [], true);
79
78
  return;
80
79
  }
81
80
  const collectionIds = [];
@@ -111,7 +110,6 @@ export class AcalaNftApi extends BaseNftApi {
111
110
  params.updateItem(this.chain, parsedNft, address);
112
111
  params.updateCollection(this.chain, parsedCollection);
113
112
  }));
114
- params.cleanUpNfts(this.chain, address, collectionIds, nftIds);
115
113
  } catch (e) {
116
114
  console.error(`${this.chain}`, e);
117
115
  }
@@ -6,6 +6,7 @@ export declare class BitCountryNftApi extends BaseNftApi {
6
6
  private getNfts;
7
7
  private getTokenDetails;
8
8
  private getCollectionDetails;
9
+ private parseMetadata;
9
10
  fetchNfts(params: HandleNftParams): Promise<number>;
10
11
  handleNft(address: string, params: HandleNftParams): Promise<void>;
11
12
  handleNfts(params: HandleNftParams): Promise<void>;
@@ -1,10 +1,11 @@
1
1
  // Copyright 2019-2022 @subwallet/extension-base
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
 
4
- import { BIT_COUNTRY_SERVER } from '@subwallet/extension-base/koni/api/nft/config';
4
+ import { BIT_COUNTRY_IPFS_SERVER, BIT_COUNTRY_LAND_ESTATE_METADATA_API } from '@subwallet/extension-base/koni/api/nft/config';
5
5
  import { BaseNftApi } from '@subwallet/extension-base/koni/api/nft/nft';
6
6
  import { isUrl } from '@subwallet/extension-base/utils';
7
7
  import fetch from 'cross-fetch';
8
+ import { BN_ZERO, hexToBn } from '@polkadot/util';
8
9
  export class BitCountryNftApi extends BaseNftApi {
9
10
  constructor(api, addresses, chain) {
10
11
  super(chain, api, addresses);
@@ -17,9 +18,9 @@ export class BitCountryNftApi extends BaseNftApi {
17
18
  return input;
18
19
  }
19
20
  if (!input.includes('ipfs://')) {
20
- return BIT_COUNTRY_SERVER + input;
21
+ return BIT_COUNTRY_IPFS_SERVER + input;
21
22
  }
22
- return BIT_COUNTRY_SERVER + input.split('ipfs://')[1];
23
+ return BIT_COUNTRY_IPFS_SERVER + input.split('ipfs://')[1];
23
24
  }
24
25
  async getNfts(addresses) {
25
26
  if (!this.substrateApi) {
@@ -48,7 +49,13 @@ export class BitCountryNftApi extends BaseNftApi {
48
49
  if (!onChainMeta.metadata) {
49
50
  return null;
50
51
  }
51
- return await fetch(BIT_COUNTRY_SERVER + onChainMeta.metadata).then(resp => resp.json());
52
+
53
+ // check if NFT is Land/Estate
54
+ if (onChainMeta.data.attributes['MetaverseId:']) {
55
+ return await fetch(`${BIT_COUNTRY_LAND_ESTATE_METADATA_API}/${assetId.classId}/${assetId.tokenId}/metadata.json`).then(resp => resp.json());
56
+ } else {
57
+ return await fetch(BIT_COUNTRY_IPFS_SERVER + onChainMeta.metadata).then(resp => resp.json());
58
+ }
52
59
  }
53
60
  async getCollectionDetails(collectionId) {
54
61
  if (!this.substrateApi) {
@@ -58,7 +65,41 @@ export class BitCountryNftApi extends BaseNftApi {
58
65
  if (!metadataCollection.metadata) {
59
66
  return null;
60
67
  }
61
- return await fetch(BIT_COUNTRY_SERVER + metadataCollection.metadata).then(resp => resp.json());
68
+ if (metadataCollection.data.attributes['MetaverseId:']) {
69
+ const category = metadataCollection.data.attributes['Category:'];
70
+ const hexMetaverseId = metadataCollection.data.attributes['MetaverseId:'];
71
+ let metaverseId = BN_ZERO;
72
+ try {
73
+ metaverseId = hexToBn(hexMetaverseId);
74
+ } catch (e) {
75
+ console.warn('Error parsing metaverse id', e);
76
+ }
77
+ return {
78
+ name: `${category} #${collectionId}`,
79
+ metaverseId: metaverseId.toString()
80
+ };
81
+ } else {
82
+ return await fetch(BIT_COUNTRY_IPFS_SERVER + metadataCollection.metadata).then(resp => resp.json());
83
+ }
84
+ }
85
+ parseMetadata(data) {
86
+ const traitList = data !== null && data !== void 0 && data.traits ? data.traits : data === null || data === void 0 ? void 0 : data.attributes;
87
+ const propertiesMap = {};
88
+ if (traitList) {
89
+ traitList.forEach(traitMap => {
90
+ propertiesMap[traitMap.trait_type] = {
91
+ value: traitMap.value
92
+ };
93
+ });
94
+ }
95
+ return {
96
+ name: data === null || data === void 0 ? void 0 : data.name,
97
+ image: data !== null && data !== void 0 && data.image_url ? this.parseUrl(data.image_url) : this.parseUrl(data === null || data === void 0 ? void 0 : data.image),
98
+ description: data === null || data === void 0 ? void 0 : data.description,
99
+ properties: propertiesMap,
100
+ externalUrl: data === null || data === void 0 ? void 0 : data.external_url,
101
+ chain: this.chain
102
+ };
62
103
  }
63
104
  async fetchNfts(params) {
64
105
  try {
@@ -73,7 +114,6 @@ export class BitCountryNftApi extends BaseNftApi {
73
114
  const assetIds = await this.getNfts([address]);
74
115
  try {
75
116
  if (!assetIds || assetIds.length === 0) {
76
- params.cleanUpNfts(this.chain, address, [], [], true);
77
117
  return;
78
118
  }
79
119
  const collectionIds = [];
@@ -86,18 +126,10 @@ export class BitCountryNftApi extends BaseNftApi {
86
126
  }
87
127
  nftIds.push(parsedTokenId);
88
128
  const [tokenInfo, collectionMeta] = await Promise.all([this.getTokenDetails(assetId), this.getCollectionDetails(parsedClassId)]);
89
- const parsedNft = {
90
- id: parsedTokenId,
91
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
92
- name: tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.name,
93
- // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-member-access
94
- description: tokenInfo && tokenInfo.description ? tokenInfo.description : collectionMeta === null || collectionMeta === void 0 ? void 0 : collectionMeta.description,
95
- // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access,@typescript-eslint/no-unsafe-assignment
96
- image: tokenInfo && tokenInfo.image_url ? this.parseUrl(tokenInfo === null || tokenInfo === void 0 ? void 0 : tokenInfo.image_url) : this.parseUrl(collectionMeta === null || collectionMeta === void 0 ? void 0 : collectionMeta.image_url),
97
- collectionId: parsedClassId,
98
- chain: this.chain,
99
- owner: address
100
- };
129
+ const parsedNft = this.parseMetadata(tokenInfo);
130
+ parsedNft.collectionId = parsedClassId;
131
+ parsedNft.id = parsedTokenId;
132
+ parsedNft.owner = address;
101
133
  const parsedCollection = {
102
134
  collectionId: parsedClassId,
103
135
  chain: this.chain,
@@ -109,7 +141,6 @@ export class BitCountryNftApi extends BaseNftApi {
109
141
  params.updateItem(this.chain, parsedNft, address);
110
142
  params.updateCollection(this.chain, parsedCollection);
111
143
  }));
112
- params.cleanUpNfts(this.chain, address, collectionIds, nftIds);
113
144
  } catch (e) {
114
145
  console.error(`${this.chain}`, e);
115
146
  }
@@ -6,7 +6,8 @@ export declare const SINGULAR_V1_COLLECTION_ENDPOINT = "https://singular.rmrk.ap
6
6
  export declare const SINGULAR_V2_COLLECTION_ENDPOINT = "https://singular.app/api/rmrk2/collection/";
7
7
  export declare const KANARIA_EXTERNAL_SERVER = "https://kanaria.rmrk.app/catalogue/";
8
8
  export declare const CLOUDFLARE_PINATA_SERVER = "https://cloudflare-ipfs.com/ipfs/";
9
- export declare const BIT_COUNTRY_SERVER = "https://ipfs-cdn.bit.country/";
9
+ export declare const BIT_COUNTRY_IPFS_SERVER = "https://ipfs-cdn.bit.country/";
10
+ export declare const BIT_COUNTRY_LAND_ESTATE_METADATA_API = "https://pioneer-api.bit.country/metadata/landTokenUriPioneer";
10
11
  export declare const BIT_COUNTRY_THUMBNAIL_RESOLVER = "https://res.cloudinary.com/ddftctzph/image/upload/c_scale,q_100,w_250/production-ipfs/asset/";
11
12
  export declare const CF_IPFS_GATEWAY = "https://cf-ipfs.com/ipfs/";
12
13
  export declare const PINATA_IPFS_GATEWAY = "https://gateway.pinata.cloud/ipfs/";
@@ -10,7 +10,8 @@ export const SINGULAR_V1_COLLECTION_ENDPOINT = 'https://singular.rmrk.app/api/rm
10
10
  export const SINGULAR_V2_COLLECTION_ENDPOINT = 'https://singular.app/api/rmrk2/collection/';
11
11
  export const KANARIA_EXTERNAL_SERVER = 'https://kanaria.rmrk.app/catalogue/';
12
12
  export const CLOUDFLARE_PINATA_SERVER = 'https://cloudflare-ipfs.com/ipfs/';
13
- export const BIT_COUNTRY_SERVER = 'https://ipfs-cdn.bit.country/';
13
+ export const BIT_COUNTRY_IPFS_SERVER = 'https://ipfs-cdn.bit.country/';
14
+ export const BIT_COUNTRY_LAND_ESTATE_METADATA_API = 'https://pioneer-api.bit.country/metadata/landTokenUriPioneer';
14
15
  export const BIT_COUNTRY_THUMBNAIL_RESOLVER = 'https://res.cloudinary.com/ddftctzph/image/upload/c_scale,q_100,w_250/production-ipfs/asset/';
15
16
  export const CF_IPFS_GATEWAY = 'https://cf-ipfs.com/ipfs/';
16
17
  export const PINATA_IPFS_GATEWAY = 'https://gateway.pinata.cloud/ipfs/';
@@ -85,7 +85,6 @@ export class EvmNftApi extends BaseNftApi {
85
85
  // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
86
86
  const balance = await contract.methods.balanceOf(address).call();
87
87
  if (Number(balance) === 0) {
88
- nftParams.cleanUpNfts(this.chain, address, [smartContract], []);
89
88
  return;
90
89
  }
91
90
  const itemIndexes = [];
@@ -140,9 +139,6 @@ export class EvmNftApi extends BaseNftApi {
140
139
  originAsset: tokenInfo.slug
141
140
  };
142
141
  nftParams.updateCollection(this.chain, nftCollection);
143
- Object.entries(nftOwnerMap).forEach(([owner, nftIds]) => {
144
- nftParams.cleanUpNfts(this.chain, owner, [smartContract], nftIds);
145
- });
146
142
  }
147
143
  }
148
144
  async handleNfts(params) {
@@ -17,5 +17,5 @@ export declare class NftHandler {
17
17
  setAddresses(addresses: string[]): void;
18
18
  private setupNftContracts;
19
19
  private setupApi;
20
- handleNfts(nftContracts: _ChainAsset[], updateItem: (chain: string, data: NftItem, owner: string) => void, updateCollection: (chain: string, data: NftCollection) => void, cleanUpNfts: (chain: string, owner: string, collectionId: string[], nftIds: string[], ownNothing?: boolean) => void): Promise<void>;
20
+ handleNfts(nftContracts: _ChainAsset[], updateItem: (chain: string, data: NftItem, owner: string) => void, updateCollection: (chain: string, data: NftCollection) => void): Promise<void>;
21
21
  }
@@ -123,14 +123,13 @@ export class NftHandler {
123
123
  console.error(e);
124
124
  }
125
125
  }
126
- async handleNfts(nftContracts, updateItem, updateCollection, cleanUpNfts) {
126
+ async handleNfts(nftContracts, updateItem, updateCollection) {
127
127
  this.setupApi();
128
128
  this.setupNftContracts(nftContracts);
129
129
  await Promise.all(this.handlers.map(async handler => {
130
130
  await handler.fetchNfts({
131
131
  updateItem,
132
- updateCollection,
133
- cleanUpNfts
132
+ updateCollection
134
133
  });
135
134
  }));
136
135
  }
@@ -82,7 +82,6 @@ export class KaruraNftApi extends BaseNftApi {
82
82
  const assetIds = await this.getNfts([address]);
83
83
  try {
84
84
  if (!assetIds || assetIds.length === 0) {
85
- params.cleanUpNfts(this.chain, address, [], [], true);
86
85
  return;
87
86
  }
88
87
  const collectionIds = [];
@@ -116,7 +115,6 @@ export class KaruraNftApi extends BaseNftApi {
116
115
  params.updateItem(this.chain, parsedNft, address);
117
116
  params.updateCollection(this.chain, parsedCollection);
118
117
  }));
119
- params.cleanUpNfts(this.chain, address, collectionIds, nftIds);
120
118
  } catch (e) {
121
119
  console.error(`${this.chain}`, e);
122
120
  }
@@ -3,7 +3,6 @@ import { _EvmApi, _SubstrateApi } from '@subwallet/extension-base/services/chain
3
3
  export interface HandleNftParams {
4
4
  updateItem: (chain: string, data: NftItem, owner: string) => void;
5
5
  updateCollection: (chain: string, data: NftCollection) => void;
6
- cleanUpNfts: (chain: string, owner: string, collectionId: string[], nftIds: string[], ownNothing?: boolean) => void;
7
6
  }
8
7
  export declare abstract class BaseNftApi {
9
8
  chain: string;