@subwallet/extension-base 1.2.9-0 → 1.2.11-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 (43) hide show
  1. package/background/KoniTypes.d.ts +19 -0
  2. package/background/types.d.ts +42 -0
  3. package/cjs/koni/background/handlers/Extension.js +47 -15
  4. package/cjs/koni/background/handlers/State.js +3 -1
  5. package/cjs/packageInfo.js +1 -1
  6. package/cjs/services/balance-service/helpers/subscribe/index.js +8 -4
  7. package/cjs/services/chain-service/handler/SubstrateApi.js +20 -14
  8. package/cjs/services/chain-service/handler/SubstrateChainHandler.js +31 -16
  9. package/cjs/services/history-service/subscan-history.js +1 -1
  10. package/cjs/services/migration-service/scripts/ClearMetadataDatabase.js +19 -0
  11. package/cjs/services/migration-service/scripts/MigrateLedgerAccountV2.js +51 -0
  12. package/cjs/services/migration-service/scripts/index.js +5 -1
  13. package/cjs/services/transaction-service/index.js +15 -4
  14. package/cjs/types/index.js +22 -11
  15. package/cjs/types/metadata.js +1 -0
  16. package/cjs/utils/index.js +12 -0
  17. package/cjs/utils/metadata.js +48 -0
  18. package/cjs/utils/registry.js +4 -3
  19. package/koni/background/handlers/Extension.js +48 -16
  20. package/koni/background/handlers/State.d.ts +2 -0
  21. package/koni/background/handlers/State.js +3 -1
  22. package/package.json +26 -5
  23. package/packageInfo.js +1 -1
  24. package/services/balance-service/helpers/subscribe/index.js +8 -4
  25. package/services/chain-service/handler/SubstrateApi.js +20 -14
  26. package/services/chain-service/handler/SubstrateChainHandler.js +31 -16
  27. package/services/history-service/subscan-history.js +1 -1
  28. package/services/migration-service/scripts/ClearMetadataDatabase.d.ts +4 -0
  29. package/services/migration-service/scripts/ClearMetadataDatabase.js +11 -0
  30. package/services/migration-service/scripts/MigrateLedgerAccountV2.d.ts +4 -0
  31. package/services/migration-service/scripts/MigrateLedgerAccountV2.js +42 -0
  32. package/services/migration-service/scripts/index.js +5 -1
  33. package/services/transaction-service/index.js +16 -5
  34. package/types/index.d.ts +2 -1
  35. package/types/index.js +2 -1
  36. package/types/metadata.d.ts +6 -0
  37. package/types/metadata.js +1 -0
  38. package/utils/index.d.ts +1 -0
  39. package/utils/index.js +1 -0
  40. package/utils/metadata.d.ts +3 -0
  41. package/utils/metadata.js +39 -0
  42. package/utils/registry.d.ts +2 -2
  43. package/utils/registry.js +4 -3
@@ -20,6 +20,7 @@ import { DexieExportJsonStructure } from 'dexie-export-import';
20
20
  import Web3 from 'web3';
21
21
  import { RequestArguments, TransactionConfig } from 'web3-core';
22
22
  import { JsonRpcPayload, JsonRpcResponse } from 'web3-core-helpers';
23
+ import { ExtDef } from '@polkadot/types/extrinsic/signedExtensions/types';
23
24
  import { SignerResult } from '@polkadot/types/types/extrinsic';
24
25
  import { HexString } from '@polkadot/util/types';
25
26
  import { KeypairType } from '@polkadot/util-crypto/types';
@@ -202,6 +203,8 @@ export interface MetadataItem {
202
203
  genesisHash: string;
203
204
  specVersion: string;
204
205
  hexValue: HexString;
206
+ types: Record<string, Record<string, string> | string>;
207
+ userExtensions?: ExtDef;
205
208
  }
206
209
  export interface CrowdloanItem {
207
210
  state: APIItemState;
@@ -744,6 +747,7 @@ export interface CreateHardwareAccountItem {
744
747
  hardwareType: string;
745
748
  name: string;
746
749
  isEthereum: boolean;
750
+ isGeneric: boolean;
747
751
  }
748
752
  export interface RequestAccountCreateHardwareMultiple {
749
753
  accounts: CreateHardwareAccountItem[];
@@ -1051,15 +1055,28 @@ export interface ResponseParseEvmContractInput {
1051
1055
  result: EvmTransactionData;
1052
1056
  }
1053
1057
  export interface LedgerNetwork {
1058
+ /** GenesisHash for substrate app */
1054
1059
  genesisHash: string;
1060
+ /** Display in selector */
1055
1061
  networkName: string;
1062
+ /** Name for account(Ledger X Account) */
1056
1063
  accountName: string;
1064
+ /** Name in Ledger */
1057
1065
  appName: string;
1066
+ /** Network is predefined in ledger lib */
1058
1067
  network: string;
1068
+ /** slug in chain list */
1059
1069
  slug: string;
1070
+ /** Deprecated */
1060
1071
  icon: 'substrate' | 'ethereum';
1072
+ /** Dev mode on Ledger */
1061
1073
  isDevMode: boolean;
1074
+ /** Is use generic Ledger app */
1075
+ isGeneric: boolean;
1076
+ /** Use for evm account */
1062
1077
  isEthereum: boolean;
1078
+ /** Slip44 in the derivation path */
1079
+ slip44: number;
1063
1080
  }
1064
1081
  export interface FormattedMethod {
1065
1082
  args?: ArgInfo[];
@@ -1449,6 +1466,8 @@ export interface RequestFindRawMetadata {
1449
1466
  export interface ResponseFindRawMetadata {
1450
1467
  rawMetadata: string;
1451
1468
  specVersion: number;
1469
+ types: Record<string, Record<string, string> | string>;
1470
+ userExtensions?: ExtDef;
1452
1471
  }
1453
1472
  export interface ResolveDomainRequest {
1454
1473
  chain: string;
@@ -28,23 +28,63 @@ export interface AbstractAddressJson extends KeyringPair$Meta {
28
28
  whenCreated?: number;
29
29
  name?: string;
30
30
  }
31
+ /**
32
+ * @interface AccountJson
33
+ * @prop {number} [accountIndex] - Ledger's account index
34
+ * @prop {number} [addressOffset] - Ledger's address offset
35
+ * @prop {string[]} [availableGenesisHashes] - Ledger's availableGenesisHashes
36
+ * @prop {string|null} [genesisHash] - Ledger's genesisHash
37
+ * @prop {boolean} [isExternal] - Is external account
38
+ * @prop {boolean} [isHardware] - Is hardware account
39
+ * @prop {boolean} [isHidden] - Is hidden account
40
+ * @prop {boolean} [isInjected] - Is injected account
41
+ * @prop {boolean} [isGeneric] - Is generic account
42
+ * @prop {boolean} [isMasterAccount] - Is master account - account has seed
43
+ * @prop {boolean} [isMasterPassword] - Account has migrated with wallet password
44
+ * @prop {boolean} [isReadOnly] - Is readonly account
45
+ * @prop {boolean} [isReadOnly] - Is readonly account
46
+ * @prop {boolean} [isSubWallet] - Import from SubWallet
47
+ * @prop {boolean} [pendingMigrate] - Pending migrate password
48
+ * @prop {string|null} [originGenesisHash] - Ledger's originGenesisHash
49
+ * @prop {string} [source] - Account's source
50
+ * @prop {string} [suri] - Derivate path
51
+ * */
31
52
  export interface AccountJson extends AbstractAddressJson {
53
+ /** Ledger's account index */
32
54
  accountIndex?: number;
55
+ /** Ledger's address offset */
33
56
  addressOffset?: number;
57
+ /** Ledger's availableGenesisHashes */
34
58
  availableGenesisHashes?: string[];
59
+ /** Ledger's genesisHash */
35
60
  genesisHash?: string | null;
61
+ /** Is external account */
36
62
  isExternal?: boolean;
63
+ /** Is hardware account */
37
64
  isHardware?: boolean;
65
+ /** Is hidden account */
38
66
  isHidden?: boolean;
67
+ /** Is injected account */
39
68
  isInjected?: boolean;
69
+ /** Is generic ledger account */
70
+ isGeneric?: boolean;
71
+ /** Is master account - account has seed */
40
72
  isMasterAccount?: boolean;
73
+ /** Account has migrated with wallet password */
41
74
  isMasterPassword?: boolean;
75
+ /** Is readonly account */
42
76
  isReadOnly?: boolean;
77
+ /** Import from SubWallet */
43
78
  isSubWallet?: boolean;
79
+ /** Pending migrate password */
44
80
  pendingMigrate?: boolean;
81
+ /** Ledger's originGenesisHash */
45
82
  originGenesisHash?: string | null;
83
+ /** Parent's address */
46
84
  parentAddress?: string;
85
+ /** Account's source */
47
86
  source?: string;
87
+ /** Derivate path */
48
88
  suri?: string;
49
89
  }
50
90
  export interface AddressJson extends AbstractAddressJson {
@@ -283,6 +323,7 @@ export interface RequestSigningApprovePassword {
283
323
  export interface RequestSigningApproveSignature {
284
324
  id: string;
285
325
  signature: HexString;
326
+ signedTransaction?: HexString;
286
327
  }
287
328
  export interface RequestSigningCancel {
288
329
  id: string;
@@ -327,6 +368,7 @@ export declare type TransportResponseMessage<TMessageType extends MessageTypes>
327
368
  export interface ResponseSigning {
328
369
  id: string;
329
370
  signature: HexString;
371
+ signedTransaction?: HexString | Uint8Array;
330
372
  }
331
373
  export interface ResponseDeriveValidate {
332
374
  address: string;
@@ -40,6 +40,7 @@ var _stores = require("@subwallet/extension-base/stores");
40
40
  var _types2 = require("@subwallet/extension-base/types");
41
41
  var _utils4 = require("@subwallet/extension-base/utils");
42
42
  var _parseTransaction2 = require("@subwallet/extension-base/utils/eth/parseTransaction");
43
+ var _extensionChains = require("@subwallet/extension-chains");
43
44
  var _keyring = require("@subwallet/keyring");
44
45
  var _uiKeyring = require("@subwallet/ui-keyring");
45
46
  var _utils5 = require("@walletconnect/utils");
@@ -375,7 +376,8 @@ class KoniExtension {
375
376
  signingApproveSignature(_ref16) {
376
377
  let {
377
378
  id,
378
- signature
379
+ signature,
380
+ signedTransaction
379
381
  } = _ref16;
380
382
  const queued = this.#koniState.getSignRequest(id);
381
383
  (0, _util.assert)(queued, (0, _i18next.t)('Unable to proceed. Please try again'));
@@ -384,7 +386,8 @@ class KoniExtension {
384
386
  } = queued;
385
387
  resolve({
386
388
  id,
387
- signature
389
+ signature,
390
+ signedTransaction
388
391
  });
389
392
  return true;
390
393
  }
@@ -2218,6 +2221,7 @@ class KoniExtension {
2218
2221
  genesisHash,
2219
2222
  hardwareType,
2220
2223
  isEthereum,
2224
+ isGeneric,
2221
2225
  name
2222
2226
  } = account;
2223
2227
  let result;
@@ -2227,7 +2231,8 @@ class KoniExtension {
2227
2231
  accountIndex,
2228
2232
  addressOffset,
2229
2233
  genesisHash,
2230
- originGenesisHash: genesisHash
2234
+ originGenesisHash: genesisHash,
2235
+ isGeneric
2231
2236
  };
2232
2237
  if (isEthereum) {
2233
2238
  result = _uiKeyring.keyring.keyring.addFromAddress(address, {
@@ -2980,7 +2985,7 @@ class KoniExtension {
2980
2985
  }
2981
2986
 
2982
2987
  /// Signing substrate request
2983
- signingApprovePasswordV2(_ref70) {
2988
+ async signingApprovePasswordV2(_ref70) {
2984
2989
  let {
2985
2990
  id
2986
2991
  } = _ref70;
@@ -3009,22 +3014,42 @@ class KoniExtension {
3009
3014
  const {
3010
3015
  payload
3011
3016
  } = request;
3012
- let registry = new _types3.TypeRegistry();
3017
+ let registry;
3013
3018
  let isEvm = false;
3014
3019
  if (isJsonPayload(payload)) {
3020
+ const [, chainInfo] = this.#koniState.findNetworkKeyByGenesisHash(payload.genesisHash);
3021
+ let metadata;
3022
+
3015
3023
  /**
3016
3024
  * Get the metadata for the genesisHash
3017
3025
  * @todo: need to handle case metadata store in db
3018
3026
  */
3019
- const currentMetadata = this.#koniState.knownMetadata.find(meta => meta.genesisHash === payload.genesisHash);
3020
-
3021
- // set the registry before calling the sign function
3022
- registry.setSignedExtensions(payload.signedExtensions, currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.userExtensions);
3023
- if (currentMetadata) {
3024
- registry.register(currentMetadata === null || currentMetadata === void 0 ? void 0 : currentMetadata.types);
3027
+ metadata = this.#koniState.knownMetadata.find(meta => meta.genesisHash === payload.genesisHash);
3028
+ if (metadata) {
3029
+ // we have metadata, expand it and extract the info/registry
3030
+ const expanded = (0, _extensionChains.metadataExpand)(metadata, false);
3031
+ registry = expanded.registry;
3032
+ registry.setSignedExtensions(payload.signedExtensions, expanded.definition.userExtensions);
3033
+ } else {
3034
+ metadata = await this.#koniState.chainService.getMetadataByHash(payload.genesisHash);
3035
+ if (metadata) {
3036
+ var _chainInfo$substrateI, _chainInfo$substrateI2, _chainInfo$substrateI3;
3037
+ registry = new _types3.TypeRegistry();
3038
+ const _metadata = new _types3.Metadata(registry, metadata.hexValue);
3039
+ registry.register(metadata.types);
3040
+ registry.setChainProperties(registry.createType('ChainProperties', {
3041
+ ss58Format: (chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI = chainInfo.substrateInfo) === null || _chainInfo$substrateI === void 0 ? void 0 : _chainInfo$substrateI.addressPrefix) || 42,
3042
+ tokenDecimals: chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI2 = chainInfo.substrateInfo) === null || _chainInfo$substrateI2 === void 0 ? void 0 : _chainInfo$substrateI2.decimals,
3043
+ tokenSymbol: chainInfo === null || chainInfo === void 0 ? void 0 : (_chainInfo$substrateI3 = chainInfo.substrateInfo) === null || _chainInfo$substrateI3 === void 0 ? void 0 : _chainInfo$substrateI3.symbol
3044
+ }));
3045
+ registry.setMetadata(_metadata, payload.signedExtensions, metadata.userExtensions);
3046
+ } else {
3047
+ // we have no metadata, create a new registry
3048
+ registry = new _types3.TypeRegistry();
3049
+ registry.setSignedExtensions(payload.signedExtensions);
3050
+ }
3025
3051
  }
3026
- const [, chainInfo] = this.#koniState.findNetworkKeyByGenesisHash(payload.genesisHash);
3027
- if (!currentMetadata) {
3052
+ if (!metadata) {
3028
3053
  /*
3029
3054
  * Some networks must have metadata to signing,
3030
3055
  * so if the chain not active (cannot use metadata from api), it must be rejected
@@ -3047,6 +3072,9 @@ class KoniExtension {
3047
3072
  if (chainInfo) {
3048
3073
  isEvm = (0, _utils3._isChainEvmCompatible)(chainInfo);
3049
3074
  }
3075
+ } else {
3076
+ // for non-payload, just create a registry to use
3077
+ registry = new _types3.TypeRegistry();
3050
3078
  }
3051
3079
  const result = request.sign(registry, pair);
3052
3080
  resolve({
@@ -3706,11 +3734,15 @@ class KoniExtension {
3706
3734
  } = _ref90;
3707
3735
  const {
3708
3736
  metadata,
3709
- specVersion
3737
+ specVersion,
3738
+ types,
3739
+ userExtensions
3710
3740
  } = await this.#koniState.findMetadata(genesisHash);
3711
3741
  return {
3712
3742
  rawMetadata: metadata,
3713
- specVersion
3743
+ specVersion,
3744
+ types,
3745
+ userExtensions
3714
3746
  };
3715
3747
  }
3716
3748
  async resolveDomainByAddress(request) {
@@ -1815,7 +1815,9 @@ class KoniState {
1815
1815
  const metadata = await this.chainService.getMetadataByHash(hash);
1816
1816
  return {
1817
1817
  metadata: (metadata === null || metadata === void 0 ? void 0 : metadata.hexValue) || '',
1818
- specVersion: parseInt((metadata === null || metadata === void 0 ? void 0 : metadata.specVersion) || '0')
1818
+ specVersion: parseInt((metadata === null || metadata === void 0 ? void 0 : metadata.specVersion) || '0'),
1819
+ types: (metadata === null || metadata === void 0 ? void 0 : metadata.types) || {},
1820
+ userExtensions: metadata === null || metadata === void 0 ? void 0 : metadata.userExtensions
1819
1821
  };
1820
1822
  }
1821
1823
  getCrowdloanContributions(_ref11) {
@@ -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.9-0'
16
+ version: '1.2.11-0'
17
17
  };
18
18
  exports.packageInfo = packageInfo;
@@ -57,12 +57,16 @@ const filterAddress = (addresses, chainInfo) => {
57
57
  const account = getAccountJsonByAddress(address);
58
58
  if (account) {
59
59
  if (account.isHardware) {
60
- const availGen = account.availableGenesisHashes || [];
61
- const gen = (0, _utils._getSubstrateGenesisHash)(chainInfo);
62
- if (availGen.includes(gen)) {
60
+ if (account.isGeneric) {
63
61
  fetchList.push(address);
64
62
  } else {
65
- unfetchList.push(address);
63
+ const availGen = account.availableGenesisHashes || [];
64
+ const gen = (0, _utils._getSubstrateGenesisHash)(chainInfo);
65
+ if (availGen.includes(gen)) {
66
+ fetchList.push(address);
67
+ } else {
68
+ unfetchList.push(address);
69
+ }
66
70
  }
67
71
  } else {
68
72
  fetchList.push(address);
@@ -23,6 +23,17 @@ var _defaults = require("@polkadot/util-crypto/address/defaults");
23
23
  // Copyright 2019-2022 @subwallet/extension-base authors & contributors
24
24
  // SPDX-License-Identifier: Apache-2.0
25
25
 
26
+ const typesBundle = {
27
+ ..._api4.typesBundle
28
+ };
29
+
30
+ // Override avail spec for signedExtensions
31
+ const _availSpec = {
32
+ signedExtensions: _availJsSdk.spec.signedExtensions
33
+ };
34
+ if (typesBundle.spec) {
35
+ typesBundle.spec.avail = _availSpec;
36
+ }
26
37
  class SubstrateApi {
27
38
  useLightClient = false;
28
39
  isApiReady = false;
@@ -62,8 +73,9 @@ class SubstrateApi {
62
73
  createApi(provider, externalApiPromise) {
63
74
  const apiOption = {
64
75
  provider,
65
- typesBundle: _api4.typesBundle,
76
+ typesBundle,
66
77
  registry: this.registry,
78
+ // This line makes this object registry to be the same as the api registry
67
79
  noInitWarn: true
68
80
  };
69
81
  if (this.metadata) {
@@ -77,32 +89,26 @@ class SubstrateApi {
77
89
  if (externalApiPromise) {
78
90
  api = externalApiPromise;
79
91
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.acala.includes(this.chainSlug)) {
80
- api = new _api3.ApiPromise((0, _api.options)({
81
- provider,
82
- noInitWarn: true
83
- }));
92
+ api = new _api3.ApiPromise((0, _api.options)(apiOption));
84
93
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.turing.includes(this.chainSlug)) {
85
94
  api = new _api3.ApiPromise({
86
- provider,
95
+ ...apiOption,
87
96
  rpc: _types.rpc,
88
- types: _types.types,
89
- noInitWarn: true
97
+ types: _types.types
90
98
  });
91
99
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.avail.includes(this.chainSlug)) {
92
100
  api = new _api3.ApiPromise({
93
- provider,
101
+ ...apiOption,
94
102
  rpc: _availJsSdk.spec.rpc,
95
103
  types: _availJsSdk.spec.types,
96
- signedExtensions: _availJsSdk.spec.signedExtensions,
97
- noInitWarn: true
104
+ signedExtensions: _availJsSdk.spec.signedExtensions
98
105
  });
99
106
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.goldberg.includes(this.chainSlug)) {
100
107
  api = new _api3.ApiPromise({
101
- provider,
108
+ ...apiOption,
102
109
  rpc: _availJsSdk.goldbergRpc,
103
110
  types: _availJsSdk.goldbergTypes,
104
- signedExtensions: _availJsSdk.spec.signedExtensions,
105
- noInitWarn: true
111
+ signedExtensions: _availJsSdk.spec.signedExtensions
106
112
  });
107
113
  } else if (_constants._API_OPTIONS_CHAIN_GROUP.gear.includes(this.chainSlug)) {
108
114
  api = new _api2.GearApi({
@@ -11,6 +11,7 @@ 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");
14
15
  var _util = require("@polkadot/util");
15
16
  var _logger = require("@polkadot/util/logger");
16
17
  var _utils3 = require("../../../koni/api/contract-handler/utils");
@@ -206,6 +207,32 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
206
207
  providerName
207
208
  } = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
208
209
  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
+ const updateMetadata = substrateApi => {
212
+ // 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);
235
+ };
209
236
 
210
237
  // Return existed to avoid re-init metadata
211
238
  if (existed) {
@@ -213,9 +240,11 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
213
240
  if (apiUrl !== existed.apiUrl) {
214
241
  await existed.updateApiUrl(apiUrl);
215
242
  }
243
+
244
+ // Update data in case of existed api (if needed - old provider cannot connect)
245
+ updateMetadata(existed);
216
246
  return existed;
217
247
  }
218
- const metadata = await ((_this$parent2 = this.parent) === null || _this$parent2 === void 0 ? void 0 : _this$parent2.getMetadata(chainSlug));
219
248
  const apiObject = new _SubstrateApi2.SubstrateApi(chainSlug, apiUrl, {
220
249
  providerName,
221
250
  metadata,
@@ -223,21 +252,7 @@ class SubstrateChainHandler extends _AbstractChainHandler.AbstractChainHandler {
223
252
  });
224
253
  apiObject.connectionStatusSubject.subscribe(this.handleConnection.bind(this, chainSlug));
225
254
  onUpdateStatus && apiObject.connectionStatusSubject.subscribe(onUpdateStatus);
226
-
227
- // Update metadata to database with async methods
228
- apiObject.isReady.then(api => {
229
- var _this$parent3;
230
- // Avoid date existed metadata
231
- if (metadata && metadata.specVersion === api.specVersion && metadata.genesisHash === api.api.genesisHash.toHex()) {
232
- return;
233
- }
234
- (_this$parent3 = this.parent) === null || _this$parent3 === void 0 ? void 0 : _this$parent3.upsertMetadata(chainSlug, {
235
- chain: chainSlug,
236
- genesisHash: api.api.genesisHash.toHex(),
237
- specVersion: api.specVersion,
238
- hexValue: api.api.runtimeMetadata.toHex()
239
- }).catch(console.error);
240
- }).catch(console.error);
255
+ updateMetadata(apiObject);
241
256
  return apiObject;
242
257
  }
243
258
  }
@@ -98,7 +98,7 @@ function parseSubscanTransferData(address, transferItem, chainInfo) {
98
98
  amount: {
99
99
  value: transferItem.amount,
100
100
  decimals: 0,
101
- symbol: transferItem.asset_symbol
101
+ symbol: transferItem.asset_type === 'nfts' ? 'NFT' : transferItem.asset_symbol
102
102
  },
103
103
  fee: {
104
104
  value: transferItem.fee,
@@ -0,0 +1,19 @@
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 _Base = _interopRequireDefault(require("@subwallet/extension-base/services/migration-service/Base"));
9
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
10
+ // SPDX-License-Identifier: Apache-2.0
11
+
12
+ class ClearMetadataDatabase extends _Base.default {
13
+ async run() {
14
+ // Clear all old metadata data
15
+ await this.state.dbService.stores.metadata.clear();
16
+ return Promise.resolve();
17
+ }
18
+ }
19
+ exports.default = ClearMetadataDatabase;
@@ -0,0 +1,51 @@
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 _stores = require("@subwallet/extension-base/stores");
9
+ var _util = require("@polkadot/util");
10
+ var _utilCrypto = require("@polkadot/util-crypto");
11
+ var _Base = _interopRequireDefault(require("../Base"));
12
+ // Copyright 2019-2022 @subwallet/extension-koni authors & contributors
13
+ // SPDX-License-Identifier: Apache-2.0
14
+
15
+ class MigrateLedgerAccountV2 extends _Base.default {
16
+ async run() {
17
+ try {
18
+ return new Promise(resolve => {
19
+ const store = new _stores.AccountsStore();
20
+ const update = (key, value) => {
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)) {
23
+ const newValue = {
24
+ ...value
25
+ };
26
+ if (value.meta.isHardware) {
27
+ const isEther = (0, _utilCrypto.isEthereumAddress)(value.address);
28
+ if (isEther) {
29
+ newValue.meta.isGeneric = true;
30
+ } else {
31
+ newValue.meta.isGeneric = !newValue.meta.originGenesisHash;
32
+ }
33
+ }
34
+ newValue.meta.availableGenesisHashes = [value.meta.originGenesisHash];
35
+ store.set(key, newValue);
36
+ }
37
+ };
38
+ store.allMap(map => {
39
+ Object.entries(map).forEach(_ref => {
40
+ let [key, value] = _ref;
41
+ update(key, value);
42
+ });
43
+ resolve();
44
+ });
45
+ });
46
+ } catch (e) {
47
+ console.error(e);
48
+ }
49
+ }
50
+ }
51
+ exports.default = MigrateLedgerAccountV2;
@@ -16,6 +16,7 @@ var _MigratePioneerProvider = _interopRequireDefault(require("./providers/Migrat
16
16
  var _MigrateProvidersV1M1P = _interopRequireDefault(require("./providers/MigrateProvidersV1M1P24"));
17
17
  var _MigratePolygonUSDCProvider = _interopRequireDefault(require("./tokens/MigratePolygonUSDCProvider"));
18
18
  var _AutoEnableChainsTokens = _interopRequireDefault(require("./AutoEnableChainsTokens"));
19
+ var _ClearMetadataDatabase = _interopRequireDefault(require("./ClearMetadataDatabase"));
19
20
  var _DeleteChain = _interopRequireDefault(require("./DeleteChain"));
20
21
  var _DeleteChainStaking = _interopRequireDefault(require("./DeleteChainStaking"));
21
22
  var _EnableVaraChain = _interopRequireDefault(require("./EnableVaraChain"));
@@ -24,6 +25,7 @@ var _MigrateAutoLock = _interopRequireDefault(require("./MigrateAutoLock"));
24
25
  var _MigrateChainPatrol = _interopRequireDefault(require("./MigrateChainPatrol"));
25
26
  var _MigrateImportedToken = _interopRequireDefault(require("./MigrateImportedToken"));
26
27
  var _MigrateLedgerAccount = _interopRequireDefault(require("./MigrateLedgerAccount"));
28
+ var _MigrateLedgerAccountV = _interopRequireDefault(require("./MigrateLedgerAccountV2"));
27
29
  var _MigrateNetworkSettings = _interopRequireDefault(require("./MigrateNetworkSettings"));
28
30
  var _MigrateSettings = _interopRequireDefault(require("./MigrateSettings"));
29
31
  var _MigrateTokenDecimals = _interopRequireDefault(require("./MigrateTokenDecimals"));
@@ -55,11 +57,13 @@ var _default = {
55
57
  '1.1.24-01': _MigrateProvidersV1M1P.default,
56
58
  '1.1.26-01': _MigratePolygonUSDCProvider.default,
57
59
  '1.1.28-01': _MigrateEarningVersion.default,
60
+ '1.1.33-01': _MigrateLedgerAccountV.default,
58
61
  '1.1.41-01': _DeleteChainStaking.default,
59
62
  '1.1.46-01': _AutoEnableSomeTokens.default,
60
63
  '1.1.69-03': _MigrateAssetSetting.default,
61
64
  '1.1.69-02': _MigrateTransactionHistoryBySymbol.default,
62
- '1.2.69-01': _MigrateRemoveGenesisHash.default
65
+ '1.2.69-01': _MigrateRemoveGenesisHash.default,
66
+ '1.2.1-01': _ClearMetadataDatabase.default
63
67
  // [`${EVERYTIME}-1.1.42-02`]: MigrateTransactionHistoryBySymbol
64
68
  // [`${EVERYTIME}-1`]: AutoEnableChainsTokens
65
69
  };
@@ -196,7 +196,7 @@ class TransactionService {
196
196
  }
197
197
  async sendTransaction(transaction) {
198
198
  // Send Transaction
199
- const emitter = transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) : await this.signAndSendEvmTransaction(transaction);
199
+ const emitter = await (transaction.chainType === 'substrate' ? this.signAndSendSubstrateTransaction(transaction) : this.signAndSendEvmTransaction(transaction));
200
200
  const {
201
201
  eventsHandler
202
202
  } = transaction;
@@ -1026,7 +1026,7 @@ class TransactionService {
1026
1026
  }
1027
1027
  return emitter;
1028
1028
  }
1029
- signAndSendSubstrateTransaction(_ref10) {
1029
+ async signAndSendSubstrateTransaction(_ref10) {
1030
1030
  let {
1031
1031
  address,
1032
1032
  chain,
@@ -1041,7 +1041,10 @@ class TransactionService {
1041
1041
  warnings: [],
1042
1042
  extrinsicHash: id
1043
1043
  };
1044
- transaction.signAsync(address, {
1044
+ const extrinsic = transaction;
1045
+ const registry = extrinsic.registry;
1046
+ const signedExtensions = registry.signedExtensions;
1047
+ const signerOption = {
1045
1048
  signer: {
1046
1049
  signPayload: async payload => {
1047
1050
  const signing = await this.state.requestService.signInternalTransaction(id, address, url || _constants2.EXTENSION_REQUEST_URL, payload);
@@ -1051,7 +1054,15 @@ class TransactionService {
1051
1054
  };
1052
1055
  }
1053
1056
  }
1054
- }).then(async rs => {
1057
+ };
1058
+ if ((0, _utils3._isRuntimeUpdated)(signedExtensions)) {
1059
+ try {
1060
+ const metadataHash = await (0, _utils3.getMetadataHash)(chain);
1061
+ signerOption.mode = 1;
1062
+ signerOption.metadataHash = `0x${metadataHash}`;
1063
+ } catch (e) {}
1064
+ }
1065
+ extrinsic.signAsync(address, signerOption).then(async rs => {
1055
1066
  // Emit signed event
1056
1067
  emitter.emit('signed', eventData);
1057
1068
 
@@ -36,6 +36,17 @@ Object.keys(_campaigns).forEach(function (key) {
36
36
  }
37
37
  });
38
38
  });
39
+ var _common = require("./common");
40
+ Object.keys(_common).forEach(function (key) {
41
+ if (key === "default" || key === "__esModule") return;
42
+ if (key in exports && exports[key] === _common[key]) return;
43
+ Object.defineProperty(exports, key, {
44
+ enumerable: true,
45
+ get: function () {
46
+ return _common[key];
47
+ }
48
+ });
49
+ });
39
50
  var _fee = require("./fee");
40
51
  Object.keys(_fee).forEach(function (key) {
41
52
  if (key === "default" || key === "__esModule") return;
@@ -47,6 +58,17 @@ Object.keys(_fee).forEach(function (key) {
47
58
  }
48
59
  });
49
60
  });
61
+ var _metadata = require("./metadata");
62
+ Object.keys(_metadata).forEach(function (key) {
63
+ if (key === "default" || key === "__esModule") return;
64
+ if (key in exports && exports[key] === _metadata[key]) return;
65
+ Object.defineProperty(exports, key, {
66
+ enumerable: true,
67
+ get: function () {
68
+ return _metadata[key];
69
+ }
70
+ });
71
+ });
50
72
  var _ordinal = require("./ordinal");
51
73
  Object.keys(_ordinal).forEach(function (key) {
52
74
  if (key === "default" || key === "__esModule") return;
@@ -79,15 +101,4 @@ Object.keys(_yield).forEach(function (key) {
79
101
  return _yield[key];
80
102
  }
81
103
  });
82
- });
83
- var _common = require("./common");
84
- Object.keys(_common).forEach(function (key) {
85
- if (key === "default" || key === "__esModule") return;
86
- if (key in exports && exports[key] === _common[key]) return;
87
- Object.defineProperty(exports, key, {
88
- enumerable: true,
89
- get: function () {
90
- return _common[key];
91
- }
92
- });
93
104
  });