@subwallet/extension-base 1.2.15-0 → 1.2.17-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 (65) hide show
  1. package/background/KoniTypes.d.ts +6 -1
  2. package/cjs/constants/staking.js +2 -1
  3. package/cjs/koni/api/staking/bonding/utils.js +15 -0
  4. package/cjs/koni/background/handlers/Extension.js +33 -7
  5. package/cjs/koni/background/handlers/State.js +11 -1
  6. package/cjs/packageInfo.js +1 -1
  7. package/cjs/services/balance-service/helpers/subscribe/index.js +1 -1
  8. package/cjs/services/balance-service/helpers/subscribe/substrate/gear.js +135 -0
  9. package/cjs/services/balance-service/helpers/subscribe/substrate/index.js +9 -62
  10. package/cjs/services/balance-service/transfer/token.js +4 -3
  11. package/cjs/services/chain-service/handler/SubstrateApi.js +3 -1
  12. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +21 -26
  13. package/cjs/services/chain-service/index.js +48 -3
  14. package/cjs/services/chain-service/types.js +1 -1
  15. package/cjs/services/chain-service/utils/index.js +18 -12
  16. package/cjs/services/earning-service/handlers/native-staking/relay-chain.js +38 -4
  17. package/cjs/services/earning-service/service.js +3 -0
  18. package/cjs/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
  19. package/cjs/services/migration-service/scripts/index.js +7 -7
  20. package/cjs/services/transaction-service/index.js +12 -7
  21. package/cjs/utils/gear/combine.js +28 -0
  22. package/cjs/utils/gear/grc20.js +56 -49
  23. package/cjs/utils/gear/index.js +22 -0
  24. package/cjs/utils/gear/vft.js +173 -0
  25. package/cjs/utils/metadata.js +45 -34
  26. package/constants/staking.js +2 -1
  27. package/koni/api/staking/bonding/utils.d.ts +1 -0
  28. package/koni/api/staking/bonding/utils.js +14 -0
  29. package/koni/background/handlers/Extension.d.ts +2 -0
  30. package/koni/background/handlers/Extension.js +25 -1
  31. package/koni/background/handlers/State.d.ts +2 -0
  32. package/koni/background/handlers/State.js +11 -1
  33. package/package.json +24 -8
  34. package/packageInfo.js +1 -1
  35. package/services/balance-service/helpers/subscribe/index.js +1 -1
  36. package/services/balance-service/helpers/subscribe/substrate/gear.d.ts +4 -0
  37. package/services/balance-service/helpers/subscribe/substrate/gear.js +123 -0
  38. package/services/balance-service/helpers/subscribe/substrate/index.js +10 -61
  39. package/services/balance-service/transfer/token.js +5 -4
  40. package/services/chain-service/handler/SubstrateApi.d.ts +1 -1
  41. package/services/chain-service/handler/SubstrateApi.js +3 -1
  42. package/services/chain-service/handler/SubstrateChainHandler.d.ts +1 -0
  43. package/services/chain-service/handler/SubstrateChainHandler.js +22 -27
  44. package/services/chain-service/index.d.ts +4 -0
  45. package/services/chain-service/index.js +49 -4
  46. package/services/chain-service/types.d.ts +1 -0
  47. package/services/chain-service/types.js +1 -1
  48. package/services/chain-service/utils/index.d.ts +1 -0
  49. package/services/chain-service/utils/index.js +16 -12
  50. package/services/earning-service/handlers/native-staking/relay-chain.js +39 -5
  51. package/services/earning-service/service.js +3 -0
  52. package/services/migration-service/scripts/databases/ClearMetadataDatabase.js +16 -0
  53. package/services/migration-service/scripts/index.js +7 -7
  54. package/services/transaction-service/index.js +13 -8
  55. package/types/metadata.d.ts +9 -2
  56. package/utils/gear/combine.d.ts +10 -0
  57. package/utils/gear/combine.js +18 -0
  58. package/utils/gear/grc20.d.ts +18 -20
  59. package/utils/gear/grc20.js +53 -45
  60. package/utils/gear/index.d.ts +2 -0
  61. package/utils/gear/index.js +3 -1
  62. package/utils/gear/vft.d.ts +36 -0
  63. package/utils/gear/vft.js +162 -0
  64. package/utils/metadata.d.ts +7 -2
  65. package/utils/metadata.js +41 -31
@@ -8,7 +8,7 @@ import { _ChainState, _EvmApi, _NetworkUpsertParams, _SubstrateApi, _ValidateCus
8
8
  import { CrowdloanContributionsResponse } from '@subwallet/extension-base/services/subscan-service/types';
9
9
  import { SWTransactionResponse, SWTransactionResult } from '@subwallet/extension-base/services/transaction-service/types';
10
10
  import { WalletConnectNotSupportRequest, WalletConnectSessionRequest } from '@subwallet/extension-base/services/wallet-connect-service/types';
11
- import { BalanceJson, BuyServiceInfo, BuyTokenInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestGetYieldPoolTargets, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseEarlyValidateYield, ResponseGetYieldPoolTargets, StorageDataInterface, SubmitYieldStepData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo, YieldValidationStatus } from '@subwallet/extension-base/types';
11
+ import { BalanceJson, BuyServiceInfo, BuyTokenInfo, EarningRewardHistoryItem, EarningRewardJson, EarningStatus, HandleYieldStepParams, LeavePoolAdditionalData, NominationPoolInfo, OptimalYieldPath, OptimalYieldPathParams, RequestEarlyValidateYield, RequestGetYieldPoolTargets, RequestMetadataHash, RequestShortenMetadata, RequestStakeCancelWithdrawal, RequestStakeClaimReward, RequestUnlockDotCheckCanMint, RequestUnlockDotSubscribeMintedData, RequestYieldLeave, RequestYieldStepSubmit, RequestYieldWithdrawal, ResponseEarlyValidateYield, ResponseGetYieldPoolTargets, ResponseMetadataHash, ResponseShortenMetadata, StorageDataInterface, SubmitYieldStepData, TokenSpendingApprovalParams, UnlockDotTransactionNft, UnstakingStatus, ValidateYieldProcessParams, YieldPoolInfo, YieldPositionInfo, YieldValidationStatus } from '@subwallet/extension-base/types';
12
12
  import { CommonOptimalPath } from '@subwallet/extension-base/types/service-base';
13
13
  import { SwapErrorType, SwapPair, SwapQuoteResponse, SwapRequest, SwapRequestResult, SwapSubmitParams, SwapTxData, ValidateSwapProcessParams } from '@subwallet/extension-base/types/swap';
14
14
  import { InjectedAccount, InjectedAccountWithMeta, MetadataDefBase } from '@subwallet/extension-inject/types';
@@ -201,10 +201,12 @@ export interface NftCollectionJson {
201
201
  }
202
202
  export interface MetadataItem {
203
203
  genesisHash: string;
204
+ specName: string;
204
205
  specVersion: string;
205
206
  hexValue: HexString;
206
207
  types: Record<string, Record<string, string> | string>;
207
208
  userExtensions?: ExtDef;
209
+ hexV15?: HexString;
208
210
  }
209
211
  export interface CrowdloanItem {
210
212
  state: APIItemState;
@@ -998,6 +1000,7 @@ export interface AddNetworkRequestExternal {
998
1000
  decimals: number;
999
1001
  };
1000
1002
  }
1003
+ export declare type AddNetworkToRequestConnect = AddNetworkRequestExternal;
1001
1004
  export interface AddTokenRequestExternal {
1002
1005
  slug?: string;
1003
1006
  contractAddress: string;
@@ -1756,6 +1759,8 @@ export interface KoniRequestSignatures {
1756
1759
  'pri(walletConnect.notSupport.approve)': [RequestApproveWalletConnectNotSupport, boolean];
1757
1760
  'pri(walletConnect.notSupport.reject)': [RequestRejectWalletConnectNotSupport, boolean];
1758
1761
  'pri(metadata.find)': [RequestFindRawMetadata, ResponseFindRawMetadata];
1762
+ 'pri(metadata.hash)': [RequestMetadataHash, ResponseMetadataHash];
1763
+ 'pri(metadata.transaction.shorten)': [RequestShortenMetadata, ResponseShortenMetadata];
1759
1764
  'pri(campaign.unlockDot.canMint)': [RequestUnlockDotCheckCanMint, boolean];
1760
1765
  'pri(campaign.unlockDot.subscribe)': [RequestUnlockDotSubscribeMintedData, UnlockDotTransactionNft, UnlockDotTransactionNft];
1761
1766
  'pri(campaign.banner.subscribe)': [null, CampaignBanner[], CampaignBanner[]];
@@ -20,7 +20,8 @@ const PREDEFINED_EARNING_POOL = {
20
20
  kusama: [80],
21
21
  vara_network: [62, 29, 50],
22
22
  aleph: [82],
23
- availTuringTest: [11]
23
+ availTuringTest: [11],
24
+ avail_mainnet: [4]
24
25
  };
25
26
  exports.PREDEFINED_EARNING_POOL = PREDEFINED_EARNING_POOL;
26
27
  const MAX_NOMINATIONS = '16';
@@ -26,6 +26,7 @@ exports.getRelayEraRewardMap = getRelayEraRewardMap;
26
26
  exports.getRelayMaxNominations = getRelayMaxNominations;
27
27
  exports.getRelayTopValidatorByPoints = getRelayTopValidatorByPoints;
28
28
  exports.getRelayValidatorPointsMap = getRelayValidatorPointsMap;
29
+ exports.getRelayWaitingValidatorList = getRelayWaitingValidatorList;
29
30
  exports.getStakingAvailableActionsByChain = getStakingAvailableActionsByChain;
30
31
  exports.getStakingAvailableActionsByNominator = getStakingAvailableActionsByNominator;
31
32
  exports.getSupportedDaysByHistoryDepth = getSupportedDaysByHistoryDepth;
@@ -436,6 +437,20 @@ function getRelayBlockedValidatorList(validators) {
436
437
  }
437
438
  return blockValidatorList;
438
439
  }
440
+ function getRelayWaitingValidatorList(validators) {
441
+ const waitingValidators = [];
442
+ for (const validator of validators) {
443
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
444
+ const validatorAddress = validator[0].toHuman()[0];
445
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-call,@typescript-eslint/no-unsafe-member-access
446
+ const validatorPrefs = validator[1].toHuman();
447
+ const isBlocked = validatorPrefs.blocked;
448
+ if (!isBlocked) {
449
+ waitingValidators.push(validatorAddress);
450
+ }
451
+ }
452
+ return waitingValidators;
453
+ }
439
454
  function getRelayEraRewardMap(eraRewardPointArray, startEraForPoints) {
440
455
  const eraRewardMap = {};
441
456
  for (const item of eraRewardPointArray) {
@@ -3734,7 +3734,7 @@ class KoniExtension {
3734
3734
  };
3735
3735
  }
3736
3736
 
3737
- /// Metadata
3737
+ /* Metadata */
3738
3738
 
3739
3739
  async findRawMetadata(_ref90) {
3740
3740
  let {
@@ -3753,6 +3753,28 @@ class KoniExtension {
3753
3753
  userExtensions
3754
3754
  };
3755
3755
  }
3756
+ async calculateMetadataHash(_ref91) {
3757
+ let {
3758
+ chain
3759
+ } = _ref91;
3760
+ const hash = await this.#koniState.calculateMetadataHash(chain);
3761
+ return {
3762
+ metadataHash: hash || ''
3763
+ };
3764
+ }
3765
+ async shortenMetadata(_ref92) {
3766
+ let {
3767
+ chain,
3768
+ txBlob
3769
+ } = _ref92;
3770
+ const shorten = await this.#koniState.shortenMetadata(chain, txBlob);
3771
+ return {
3772
+ txMetadata: shorten || ''
3773
+ };
3774
+ }
3775
+
3776
+ /* Metadata */
3777
+
3756
3778
  async resolveDomainByAddress(request) {
3757
3779
  const chainApi = this.#koniState.getSubstrateApi(request.chain);
3758
3780
  return await (0, _domain.resolveAzeroDomainToAddress)(request.domain, request.chain, chainApi.api);
@@ -3990,18 +4012,18 @@ class KoniExtension {
3990
4012
 
3991
4013
  /* Campaign */
3992
4014
 
3993
- unlockDotCheckCanMint(_ref91) {
4015
+ unlockDotCheckCanMint(_ref93) {
3994
4016
  let {
3995
4017
  address,
3996
4018
  network,
3997
4019
  slug
3998
- } = _ref91;
4020
+ } = _ref93;
3999
4021
  return this.#koniState.mintCampaignService.unlockDotCampaign.canMint(address, slug, network);
4000
4022
  }
4001
- unlockDotSubscribeMintedData(id, port, _ref92) {
4023
+ unlockDotSubscribeMintedData(id, port, _ref94) {
4002
4024
  let {
4003
4025
  transactionId
4004
- } = _ref92;
4026
+ } = _ref94;
4005
4027
  const cb = (0, _subscriptions.createSubscription)(id, port);
4006
4028
  const subscription = this.#koniState.mintCampaignService.unlockDotCampaign.subscribeMintedNft(transactionId, cb);
4007
4029
  this.createUnsubscriptionHandle(id, subscription.unsubscribe);
@@ -4033,10 +4055,10 @@ class KoniExtension {
4033
4055
  });
4034
4056
  return filterBanner(await this.#koniState.campaignService.getProcessingCampaign());
4035
4057
  }
4036
- async completeCampaignBanner(_ref93) {
4058
+ async completeCampaignBanner(_ref95) {
4037
4059
  let {
4038
4060
  slug
4039
- } = _ref93;
4061
+ } = _ref95;
4040
4062
  const campaign = await this.#koniState.dbService.getCampaign(slug);
4041
4063
  if (campaign) {
4042
4064
  await this.#koniState.dbService.upsertCampaign({
@@ -4693,6 +4715,10 @@ class KoniExtension {
4693
4715
  // Metadata
4694
4716
  case 'pri(metadata.find)':
4695
4717
  return this.findRawMetadata(request);
4718
+ case 'pri(metadata.hash)':
4719
+ return this.calculateMetadataHash(request);
4720
+ case 'pri(metadata.transaction.shorten)':
4721
+ return this.shortenMetadata(request);
4696
4722
 
4697
4723
  /* Campaign */
4698
4724
  case 'pri(campaign.banner.subscribe)':
@@ -1813,7 +1813,8 @@ class KoniState {
1813
1813
  return (_this$chainService34 = this.chainService) === null || _this$chainService34 === void 0 ? void 0 : (_this$chainService34$ = _this$chainService34.mantaPay) === null || _this$chainService34$ === void 0 ? void 0 : _this$chainService34$.subscribeSyncState();
1814
1814
  }
1815
1815
 
1816
- // Metadata
1816
+ /* Metadata */
1817
+
1817
1818
  async findMetadata(hash) {
1818
1819
  const metadata = await this.chainService.getMetadataByHash(hash);
1819
1820
  return {
@@ -1823,6 +1824,15 @@ class KoniState {
1823
1824
  userExtensions: metadata === null || metadata === void 0 ? void 0 : metadata.userExtensions
1824
1825
  };
1825
1826
  }
1827
+ async calculateMetadataHash(chain) {
1828
+ return this.chainService.calculateMetadataHash(chain);
1829
+ }
1830
+ async shortenMetadata(chain, txBlob) {
1831
+ return this.chainService.shortenMetadata(chain, txBlob);
1832
+ }
1833
+
1834
+ /* Metadata */
1835
+
1826
1836
  getCrowdloanContributions(_ref11) {
1827
1837
  let {
1828
1838
  address,
@@ -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.15-0'
16
+ version: '1.2.17-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -96,7 +96,7 @@ function subscribeBalance(addresses, chains, tokens, _chainAssetMap, _chainInfoM
96
96
  const chainSlug = chainInfo.slug;
97
97
  const [useAddresses, notSupportAddresses] = filterAddress(addresses, chainInfo);
98
98
  if (notSupportAddresses.length) {
99
- const tokens = (0, _utils2.filterAssetsByChainAndType)(chainAssetMap, chainSlug, [_types._AssetType.NATIVE, _types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.LOCAL, _types._AssetType.GRC20]);
99
+ const tokens = (0, _utils2.filterAssetsByChainAndType)(chainAssetMap, chainSlug, [_types._AssetType.NATIVE, _types._AssetType.ERC20, _types._AssetType.PSP22, _types._AssetType.LOCAL, _types._AssetType.GRC20, _types._AssetType.VFT]);
100
100
  const now = new Date().getTime();
101
101
  Object.values(tokens).forEach(token => {
102
102
  const items = notSupportAddresses.map(address => ({
@@ -0,0 +1,135 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.subscribeVftBalance = exports.subscribeGRC20Balance = void 0;
7
+ var _api = require("@gear-js/api");
8
+ var _types = require("@subwallet/chain-list/types");
9
+ var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
10
+ var _constants = require("@subwallet/extension-base/constants");
11
+ var _utils = require("@subwallet/extension-base/services/chain-service/utils");
12
+ var _utils2 = require("@subwallet/extension-base/utils");
13
+ var _util = require("@polkadot/util");
14
+ var _utilCrypto = require("@polkadot/util-crypto");
15
+ // Copyright 2019-2022 @subwallet/extension-base
16
+ // SPDX-License-Identifier: Apache-2.0
17
+
18
+ const subscribeGRC20Balance = _ref => {
19
+ let {
20
+ addresses,
21
+ assetMap,
22
+ callback,
23
+ chainInfo,
24
+ substrateApi
25
+ } = _ref;
26
+ if (!(substrateApi instanceof _api.GearApi)) {
27
+ console.warn('Cannot subscribe GRC20 balance without GearApi instance');
28
+ return _util.noop;
29
+ }
30
+ const chain = chainInfo.slug;
31
+ const grc20ContractMap = {};
32
+ const tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.GRC20]);
33
+ Object.entries(tokenList).forEach(_ref2 => {
34
+ let [slug, tokenInfo] = _ref2;
35
+ grc20ContractMap[slug] = (0, _utils2.getGRC20ContractPromise)(substrateApi, (0, _utils._getContractAddressOfToken)(tokenInfo));
36
+ });
37
+ const getTokenBalances = () => {
38
+ Object.values(tokenList).map(async tokenInfo => {
39
+ try {
40
+ const contract = grc20ContractMap[tokenInfo.slug];
41
+ const balances = await Promise.all(addresses.map(async address => {
42
+ try {
43
+ const actor = (0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(address));
44
+ const _balanceOf = await contract.service.balanceOf(actor, address);
45
+ return {
46
+ address: address,
47
+ tokenSlug: tokenInfo.slug,
48
+ free: _balanceOf.toString(10),
49
+ locked: '0',
50
+ state: _KoniTypes.APIItemState.READY
51
+ };
52
+ } catch (err) {
53
+ console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, err);
54
+ return {
55
+ address: address,
56
+ tokenSlug: tokenInfo.slug,
57
+ free: '0',
58
+ locked: '0',
59
+ state: _KoniTypes.APIItemState.READY
60
+ };
61
+ }
62
+ }));
63
+ callback(balances);
64
+ } catch (err) {
65
+ console.warn(tokenInfo.slug, err); // TODO: error createType
66
+ }
67
+ });
68
+ };
69
+
70
+ getTokenBalances();
71
+ const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
72
+ return () => {
73
+ clearInterval(interval);
74
+ };
75
+ };
76
+ exports.subscribeGRC20Balance = subscribeGRC20Balance;
77
+ const subscribeVftBalance = _ref3 => {
78
+ let {
79
+ addresses,
80
+ assetMap,
81
+ callback,
82
+ chainInfo,
83
+ substrateApi
84
+ } = _ref3;
85
+ if (!(substrateApi instanceof _api.GearApi)) {
86
+ console.warn('Cannot subscribe VFT balance without GearApi instance');
87
+ return _util.noop;
88
+ }
89
+ const chain = chainInfo.slug;
90
+ const vftContractMap = {};
91
+ const tokenList = (0, _utils2.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.VFT]);
92
+ Object.entries(tokenList).forEach(_ref4 => {
93
+ let [slug, tokenInfo] = _ref4;
94
+ vftContractMap[slug] = (0, _utils2.getVFTContractPromise)(substrateApi, (0, _utils._getContractAddressOfToken)(tokenInfo));
95
+ });
96
+ const getTokenBalances = () => {
97
+ Object.values(tokenList).map(async tokenInfo => {
98
+ try {
99
+ const contract = vftContractMap[tokenInfo.slug];
100
+ const balances = await Promise.all(addresses.map(async address => {
101
+ try {
102
+ const actor = (0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(address));
103
+ const _balanceOf = await contract.service.balanceOf(actor, address);
104
+ return {
105
+ address: address,
106
+ tokenSlug: tokenInfo.slug,
107
+ free: _balanceOf.toString(10),
108
+ locked: '0',
109
+ state: _KoniTypes.APIItemState.READY
110
+ };
111
+ } catch (err) {
112
+ console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, err);
113
+ return {
114
+ address: address,
115
+ tokenSlug: tokenInfo.slug,
116
+ free: '0',
117
+ locked: '0',
118
+ state: _KoniTypes.APIItemState.READY
119
+ };
120
+ }
121
+ }));
122
+ callback(balances);
123
+ } catch (err) {
124
+ console.warn(tokenInfo.slug, err); // TODO: error createType
125
+ }
126
+ });
127
+ };
128
+
129
+ getTokenBalances();
130
+ const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
131
+ return () => {
132
+ clearInterval(interval);
133
+ };
134
+ };
135
+ exports.subscribeVftBalance = subscribeVftBalance;
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  value: true
6
6
  });
7
7
  exports.subscribeSubstrateBalance = void 0;
8
- var _api = require("@gear-js/api");
9
8
  var _types = require("@subwallet/chain-list/types");
10
9
  var _KoniTypes = require("@subwallet/extension-base/background/KoniTypes");
11
10
  var _constants = require("@subwallet/extension-base/constants");
@@ -20,9 +19,9 @@ var _utils3 = require("@subwallet/extension-base/utils");
20
19
  var _bignumber = _interopRequireDefault(require("bignumber.js"));
21
20
  var _rxjs = require("rxjs");
22
21
  var _util = require("@polkadot/util");
23
- var _utilCrypto = require("@polkadot/util-crypto");
24
22
  var _evm = require("../evm");
25
23
  var _equilibrium = require("./equilibrium");
24
+ var _gear = require("./gear");
26
25
  // Copyright 2019-2022 @subwallet/extension-base
27
26
  // SPDX-License-Identifier: Apache-2.0
28
27
 
@@ -33,6 +32,7 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
33
32
  let unsubWasmContractToken;
34
33
  let unsubBridgedToken;
35
34
  let unsubGrcToken;
35
+ let unsubVftToken;
36
36
  const chain = chainInfo.slug;
37
37
  const baseParams = {
38
38
  addresses,
@@ -87,19 +87,24 @@ const subscribeSubstrateBalance = async (addresses, chainInfo, assetMap, substra
87
87
  }
88
88
  if ((0, _utils2._checkSmartContractSupportByChain)(chainInfo, _types._AssetType.GRC20)) {
89
89
  // Get sub-token for substrate-based chains
90
- unsubGrcToken = subscribeGRC20Balance(substrateParams);
90
+ unsubGrcToken = (0, _gear.subscribeGRC20Balance)(substrateParams);
91
+ }
92
+ if ((0, _utils2._checkSmartContractSupportByChain)(chainInfo, _types._AssetType.VFT)) {
93
+ // Get sub-token for substrate-based chains
94
+ unsubVftToken = (0, _gear.subscribeVftBalance)(substrateParams);
91
95
  }
92
96
  } catch (err) {
93
97
  console.warn(err);
94
98
  }
95
99
  return () => {
96
- var _unsubGrcToken;
100
+ var _unsubGrcToken, _unsubVftToken;
97
101
  unsubNativeToken && unsubNativeToken();
98
102
  unsubLocalToken && unsubLocalToken();
99
103
  unsubEvmContractToken && unsubEvmContractToken();
100
104
  unsubWasmContractToken && unsubWasmContractToken();
101
105
  unsubBridgedToken && unsubBridgedToken();
102
106
  (_unsubGrcToken = unsubGrcToken) === null || _unsubGrcToken === void 0 ? void 0 : _unsubGrcToken();
107
+ (_unsubVftToken = unsubVftToken) === null || _unsubVftToken === void 0 ? void 0 : _unsubVftToken();
103
108
  };
104
109
  };
105
110
 
@@ -437,62 +442,4 @@ const subscribeOrmlTokensPallet = async _ref8 => {
437
442
  }).catch(console.error);
438
443
  });
439
444
  };
440
- };
441
- const subscribeGRC20Balance = _ref9 => {
442
- let {
443
- addresses,
444
- assetMap,
445
- callback,
446
- chainInfo,
447
- substrateApi
448
- } = _ref9;
449
- if (!(substrateApi instanceof _api.GearApi)) {
450
- console.warn('Cannot subscribe VFT balance without GearApi instance');
451
- return _util.noop;
452
- }
453
- const chain = chainInfo.slug;
454
- const psp22ContractMap = {};
455
- const tokenList = (0, _utils3.filterAssetsByChainAndType)(assetMap, chain, [_types._AssetType.GRC20]);
456
- Object.entries(tokenList).forEach(_ref10 => {
457
- let [slug, tokenInfo] = _ref10;
458
- psp22ContractMap[slug] = (0, _utils3.getGRC20ContractPromise)(substrateApi, (0, _utils2._getContractAddressOfToken)(tokenInfo));
459
- });
460
- const getTokenBalances = () => {
461
- Object.values(tokenList).map(async tokenInfo => {
462
- try {
463
- const contract = psp22ContractMap[tokenInfo.slug];
464
- const balances = await Promise.all(addresses.map(async address => {
465
- try {
466
- const actor = (0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(address));
467
- const _balanceOf = await contract.balanceOf(actor, address);
468
- return {
469
- address: address,
470
- tokenSlug: tokenInfo.slug,
471
- free: _balanceOf.toString(10),
472
- locked: '0',
473
- state: _KoniTypes.APIItemState.READY
474
- };
475
- } catch (err) {
476
- console.error(`Error on get balance of account ${address} for token ${tokenInfo.slug}`, err);
477
- return {
478
- address: address,
479
- tokenSlug: tokenInfo.slug,
480
- free: '0',
481
- locked: '0',
482
- state: _KoniTypes.APIItemState.READY
483
- };
484
- }
485
- }));
486
- callback(balances);
487
- } catch (err) {
488
- console.warn(tokenInfo.slug, err); // TODO: error createType
489
- }
490
- });
491
- };
492
-
493
- getTokenBalances();
494
- const interval = setInterval(getTokenBalances, _constants.SUB_TOKEN_REFRESH_BALANCE_INTERVAL);
495
- return () => {
496
- clearInterval(interval);
497
- };
498
445
  };
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.getTransferMockTxFee = exports.createTransferExtrinsic = void 0;
8
8
  var _api = require("@gear-js/api");
9
+ var _types = require("@subwallet/chain-list/types");
9
10
  var _wasm = require("@subwallet/extension-base/koni/api/contract-handler/wasm");
10
11
  var _utils = require("@subwallet/extension-base/koni/api/contract-handler/wasm/utils");
11
12
  var _constants = require("@subwallet/extension-base/services/chain-service/constants");
@@ -61,12 +62,12 @@ const createTransferExtrinsic = async _ref => {
61
62
  }, to, value, {});
62
63
  transferAmount = value;
63
64
  } else if ((0, _utils2._isTokenGearSmartContract)(tokenInfo) && api instanceof _api.GearApi) {
64
- const contractPromise = (0, _utils4.getGRC20ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
65
- const transaction = await contractPromise.transfer((0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(to)), BigInt(value)) // Create transfer transaction
65
+ const contractPromise = tokenInfo.assetType === _types._AssetType.GRC20 ? (0, _utils4.getGRC20ContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo)) : (0, _utils4.getVFTContractPromise)(api, (0, _utils2._getContractAddressOfToken)(tokenInfo));
66
+ const transaction = await contractPromise.service.transfer((0, _util.u8aToHex)((0, _utilCrypto.decodeAddress)(to)), value) // Create transfer transaction
66
67
  .withAccount(from) // Set sender account
67
68
  .calculateGas(); // Add account arg to extrinsic
68
69
 
69
- transfer = transaction.tx;
70
+ transfer = transaction.extrinsic;
70
71
  transferAmount = value;
71
72
  } else if (_constants._TRANSFER_CHAIN_GROUP.acala.includes(networkKey)) {
72
73
  if (!(0, _utils2._isNativeToken)(tokenInfo)) {
@@ -166,14 +166,16 @@ class SubstrateApi {
166
166
  this.provider = this.createProvider(apiUrl);
167
167
  this.api = this.createApi(this.provider);
168
168
  }
169
- connect() {
169
+ connect(_callbackUpdateMetadata) {
170
170
  if (this.api.isConnected) {
171
171
  this.updateConnectionStatus(_types2._ChainConnectionStatus.CONNECTED);
172
+ _callbackUpdateMetadata === null || _callbackUpdateMetadata === void 0 ? void 0 : _callbackUpdateMetadata(this);
172
173
  } else {
173
174
  this.updateConnectionStatus(_types2._ChainConnectionStatus.CONNECTING);
174
175
  this.api.connect().then(() => {
175
176
  this.api.isReady.then(() => {
176
177
  this.updateConnectionStatus(_types2._ChainConnectionStatus.CONNECTED);
178
+ _callbackUpdateMetadata === null || _callbackUpdateMetadata === void 0 ? void 0 : _callbackUpdateMetadata(this);
177
179
  }).catch(console.error);
178
180
  }).catch(console.error);
179
181
  }
@@ -11,7 +11,6 @@ var _AbstractChainHandler = require("@subwallet/extension-base/services/chain-se
11
11
  var _SubstrateApi2 = require("@subwallet/extension-base/services/chain-service/handler/SubstrateApi");
12
12
  var _utils2 = require("@subwallet/extension-base/utils");
13
13
  var _apiContract = require("@polkadot/api-contract");
14
- var _typesKnown = require("@polkadot/types-known");
15
14
  var _util = require("@polkadot/util");
16
15
  var _logger = require("@polkadot/util/logger");
17
16
  var _utils3 = require("../../../koni/api/contract-handler/utils");
@@ -144,12 +143,26 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
144
143
  }
145
144
  async getGrc20TokenInfo(apiPromise, contractAddress) {
146
145
  if (!(apiPromise instanceof _api.GearApi)) {
147
- console.warn('Cannot subscribe VFT balance without GearApi instance');
146
+ console.warn('Cannot subscribe GRC20 balance without GearApi instance');
148
147
  return ['', -1, '', true];
149
148
  }
150
149
  let contractError = false;
151
150
  const tokenContract = (0, _utils2.getGRC20ContractPromise)(apiPromise, contractAddress);
152
- const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.name(_utils2.DEFAULT_GEAR_ADDRESS.ALICE), tokenContract.symbol(_utils2.DEFAULT_GEAR_ADDRESS.ALICE), tokenContract.decimals(_utils2.DEFAULT_GEAR_ADDRESS.ALICE)]);
151
+ const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
152
+ const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
153
+ if (!nameRes || !symbolRes) {
154
+ contractError = true;
155
+ }
156
+ return [nameRes, decimals, symbolRes, contractError];
157
+ }
158
+ async getVftTokenInfo(apiPromise, contractAddress) {
159
+ if (!(apiPromise instanceof _api.GearApi)) {
160
+ console.warn('Cannot subscribe VFT balance without GearApi instance');
161
+ return ['', -1, '', true];
162
+ }
163
+ let contractError = false;
164
+ const tokenContract = (0, _utils2.getVFTContractPromise)(apiPromise, contractAddress);
165
+ const [nameRes, symbolRes, decimalsRes] = await Promise.all([tokenContract.service.name(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.symbol(_utils2.GEAR_DEFAULT_ADDRESS), tokenContract.service.decimals(_utils2.GEAR_DEFAULT_ADDRESS)]);
153
166
  const decimals = typeof decimalsRes === 'string' ? parseInt(decimalsRes) : decimalsRes;
154
167
  if (!nameRes || !symbolRes) {
155
168
  contractError = true;
@@ -175,6 +188,9 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
175
188
  case _types._AssetType.GRC20:
176
189
  [name, decimals, symbol, contractError] = await this.getGrc20TokenInfo(apiPromise, contractAddress);
177
190
  break;
191
+ case _types._AssetType.VFT:
192
+ [name, decimals, symbol, contractError] = await this.getVftTokenInfo(apiPromise, contractAddress);
193
+ break;
178
194
  }
179
195
  return {
180
196
  name,
@@ -207,31 +223,9 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
207
223
  providerName
208
224
  } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
209
225
  const existed = this.substrateApiMap[chainSlug];
210
- const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
211
226
  const updateMetadata = substrateApi => {
212
227
  // Update metadata to database with async methods
213
- substrateApi.api.isReady.then(async api => {
214
- var _this$parent3;
215
- const currentSpecVersion = api.runtimeVersion.specVersion.toString();
216
- const genesisHash = api.genesisHash.toHex();
217
-
218
- // Avoid date existed metadata
219
- if (metadata && metadata.specVersion === currentSpecVersion && metadata.genesisHash === genesisHash) {
220
- return;
221
- }
222
- const systemChain = await api.rpc.system.chain();
223
- // const _metadata: Option<OpaqueMetadata> = await api.call.metadata.metadataAtVersion(15);
224
- // const metadataHex = _metadata.isSome ? _metadata.unwrap().toHex().slice(2) : ''; // Need unwrap to create metadata object
225
-
226
- (_this$parent3 = this.parent) === null || _this$parent3 === void 0 ? void 0 : _this$parent3.upsertMetadata(chainSlug, {
227
- chain: chainSlug,
228
- genesisHash: genesisHash,
229
- specVersion: currentSpecVersion,
230
- hexValue: api.runtimeMetadata.toHex(),
231
- types: (0, _typesKnown.getSpecTypes)(api.registry, systemChain, api.runtimeVersion.specName, api.runtimeVersion.specVersion),
232
- userExtensions: (0, _typesKnown.getSpecExtensions)(api.registry, systemChain, api.runtimeVersion.specName)
233
- }).catch(console.error);
234
- }).catch(console.error);
228
+ (0, _utils2.cacheMetadata)(chainSlug, substrateApi, this.parent);
235
229
  };
236
230
 
237
231
  // Return existed to avoid re-init metadata
@@ -245,6 +239,7 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
245
239
  updateMetadata(existed);
246
240
  return existed;
247
241
  }
242
+ const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
248
243
  const apiObject = new _SubstrateApi2.SubstrateApi(chainSlug, apiUrl, {
249
244
  providerName,
250
245
  metadata,