@talismn/scale 0.1.1 → 0.2.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.
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var metadataBuilders = require('@polkadot-api/metadata-builders');
4
- var utils = require('@polkadot-api/utils');
5
4
  var substrateBindings = require('@polkadot-api/substrate-bindings');
5
+ var utils = require('@polkadot-api/utils');
6
6
  var anylogger = require('anylogger');
7
7
  var scaleTs = require('scale-ts');
8
8
 
@@ -27,7 +27,10 @@ var log = anylogger__default.default(packageJson.name);
27
27
  * E.g. if `palletsAndItems` is `{ pallet: "System", items: ["Account"] }`, then only the
28
28
  * types used in the `System.Account` storage query will remain inside of metadata.lookups.
29
29
  */
30
- const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods = [], extraKeepTypes = []) => {
30
+ const compactMetadata = (anyMetadata, palletsAndItems = [], runtimeApisAndMethods = [], extraKeepTypes = []) => {
31
+ if (!isCompactableMetadata(anyMetadata)) throw new Error(`Metadata version ${anyMetadata.metadata.tag} not supported in compactMetadata`);
32
+ const metadata = anyMetadata.metadata.value;
33
+
31
34
  // remove pallets we don't care about
32
35
  metadata.pallets = metadata.pallets.filter(pallet =>
33
36
  // keep this pallet if it's listed in `palletsAndItems`
@@ -42,10 +45,7 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
42
45
  items: itemNames
43
46
  }) => {
44
47
  const pallet = metadata.pallets.find(pallet => pallet.name === palletName);
45
- if (!pallet) {
46
- log.debug("Failed to find pallet", palletName);
47
- return [];
48
- }
48
+ if (!pallet) return [];
49
49
 
50
50
  // remove pallet fields we don't care about
51
51
  pallet.calls = undefined;
@@ -81,10 +81,7 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
81
81
  methods: methodNames
82
82
  }) => {
83
83
  const runtimeApi = metadata.apis.find(runtimeApi => runtimeApi.name === runtimeApiName);
84
- if (!runtimeApi) {
85
- log.debug("Failed to find runtimeApi", runtimeApiName);
86
- return [];
87
- }
84
+ if (!runtimeApi) return [];
88
85
 
89
86
  // remove runtime fields we don't care about
90
87
  runtimeApi.docs = [];
@@ -124,14 +121,11 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
124
121
  return newTypeId ?? 0;
125
122
  };
126
123
  remapTypeIds(metadata, getNewTypeId);
127
- if ("address" in metadata.extrinsic) {
128
- // metadata is v15 (NOT v14)
129
- metadata.extrinsic.address = 0;
130
- metadata.extrinsic.call = 0;
131
- metadata.extrinsic.extra = 0;
132
- metadata.extrinsic.signature = 0;
133
- }
134
- metadata.extrinsic.signedExtensions = [];
124
+ if ("address" in metadata.extrinsic) metadata.extrinsic.address = 0;
125
+ if ("call" in metadata.extrinsic) metadata.extrinsic.call = 0;
126
+ if ("signature" in metadata.extrinsic) metadata.extrinsic.signature = 0;
127
+ if ("extra" in metadata.extrinsic) metadata.extrinsic.extra = 0;
128
+ if ("signedExtensions" in metadata.extrinsic) metadata.extrinsic.signedExtensions = [];
135
129
  if ("outerEnums" in metadata) {
136
130
  // metadata is v15 (NOT v14)
137
131
  metadata.outerEnums.call = 0;
@@ -139,6 +133,16 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
139
133
  metadata.outerEnums.event = 0;
140
134
  }
141
135
  };
136
+ const isCompactableMetadata = metadata => {
137
+ switch (metadata.metadata.tag) {
138
+ case "v14":
139
+ case "v15":
140
+ case "v16":
141
+ return true;
142
+ default:
143
+ return false;
144
+ }
145
+ };
142
146
  const addDependentTypes = (metadataTysMap, keepTypes, types,
143
147
  // Prevent stack overflow when a type references itself
144
148
  addedTypes = new Set()) => {
@@ -269,43 +273,6 @@ const remapRuntimeApisTypeIds = (metadata, getNewTypeId) => {
269
273
  }
270
274
  };
271
275
 
272
- /**
273
- * Extracts the `version` u8 from a SCALE-encoded metadata blob and returns it as a `number`.
274
- *
275
- * Only reads the first 40 bytes of the blob.
276
- */
277
- const getMetadataVersion = metadataRpc => {
278
- try {
279
- return scaleTs.Struct({
280
- magicNumber: scaleTs.u32,
281
- version: scaleTs.u8
282
- }).dec(metadataRpc).version;
283
- } catch {
284
- return 0;
285
- }
286
- };
287
-
288
- const decodeMetadata = metadataRpc => {
289
- const metadataVersion = getMetadataVersion(metadataRpc);
290
- if (metadataVersion !== 15 && metadataVersion !== 14) return {
291
- metadataVersion
292
- };
293
- const decoded = substrateBindings.metadata.dec(metadataRpc);
294
- if (decoded.metadata.tag === "v15") return {
295
- metadataVersion,
296
- metadata: decoded.metadata.value,
297
- tag: decoded.metadata.tag
298
- };
299
- if (decoded.metadata.tag === "v14") return {
300
- metadataVersion,
301
- metadata: decoded.metadata.value,
302
- tag: decoded.metadata.tag
303
- };
304
- return {
305
- metadataVersion
306
- };
307
- };
308
-
309
276
  const decodeScale = (scaleCoder, change, error) => {
310
277
  if (change === null) return null;
311
278
  try {
@@ -316,19 +283,7 @@ const decodeScale = (scaleCoder, change, error) => {
316
283
  }
317
284
  };
318
285
 
319
- const encodeMetadata = ({
320
- metadata,
321
- tag
322
- }) => utils.toHex(substrateBindings.metadata.enc({
323
- magicNumber,
324
- metadata: tag === "v15" ? {
325
- tag,
326
- value: metadata
327
- } : {
328
- tag,
329
- value: metadata
330
- }
331
- }));
286
+ const encodeMetadata = metadata => utils.toHex(substrateBindings.metadata.enc(metadata));
332
287
 
333
288
  const encodeStateKey = (scaleCoder, error, ...args) => {
334
289
  try {
@@ -339,6 +294,22 @@ const encodeStateKey = (scaleCoder, error, ...args) => {
339
294
  }
340
295
  };
341
296
 
297
+ /**
298
+ * Extracts the `version` u8 from a SCALE-encoded metadata blob and returns it as a `number`.
299
+ *
300
+ * Only reads the first 40 bytes of the blob.
301
+ */
302
+ const getMetadataVersion = metadataRpc => {
303
+ try {
304
+ return scaleTs.Struct({
305
+ magicNumber: scaleTs.u32,
306
+ version: scaleTs.u8
307
+ }).dec(metadataRpc).version;
308
+ } catch {
309
+ return 0;
310
+ }
311
+ };
312
+
342
313
  /**
343
314
  * For the substrate-tokens (and other) modules, we configure the `onChainId` field in chaindata to tell the module how to query each token.
344
315
  * These queries are made to the tokens pallet.
@@ -388,6 +359,30 @@ const papiStringify = (value, space) => {
388
359
  return JSON.stringify(value, replacer, space);
389
360
  };
390
361
 
362
+ const parseMetadataRpc = metadataRpc => {
363
+ const metadata = substrateBindings.decAnyMetadata(metadataRpc);
364
+ const unifiedMetadata = substrateBindings.unifyMetadata(metadata);
365
+ const lookupFn = metadataBuilders.getLookupFn(unifiedMetadata);
366
+ const builder = metadataBuilders.getDynamicBuilder(lookupFn);
367
+ return {
368
+ metadata,
369
+ unifiedMetadata,
370
+ lookupFn,
371
+ builder
372
+ };
373
+ };
374
+
375
+ const getStorageKeyPrefix = (palletName, storageName) => {
376
+ const palletHash = substrateBindings.Twox128(new TextEncoder().encode(palletName));
377
+ const storageHash = substrateBindings.Twox128(new TextEncoder().encode(storageName));
378
+
379
+ // Concatenate and convert to hex
380
+ const combined = new Uint8Array(palletHash.length + storageHash.length);
381
+ combined.set(palletHash, 0);
382
+ combined.set(storageHash, palletHash.length);
383
+ return utils.toHex(combined);
384
+ };
385
+
391
386
  Object.defineProperty(exports, "getDynamicBuilder", {
392
387
  enumerable: true,
393
388
  get: function () { return metadataBuilders.getDynamicBuilder; }
@@ -396,32 +391,65 @@ Object.defineProperty(exports, "getLookupFn", {
396
391
  enumerable: true,
397
392
  get: function () { return metadataBuilders.getLookupFn; }
398
393
  });
399
- Object.defineProperty(exports, "fromHex", {
394
+ Object.defineProperty(exports, "Blake2128", {
400
395
  enumerable: true,
401
- get: function () { return utils.fromHex; }
396
+ get: function () { return substrateBindings.Blake2128; }
402
397
  });
403
- Object.defineProperty(exports, "toHex", {
398
+ Object.defineProperty(exports, "Blake2128Concat", {
404
399
  enumerable: true,
405
- get: function () { return utils.toHex; }
400
+ get: function () { return substrateBindings.Blake2128Concat; }
401
+ });
402
+ Object.defineProperty(exports, "Blake2256", {
403
+ enumerable: true,
404
+ get: function () { return substrateBindings.Blake2256; }
405
+ });
406
+ Object.defineProperty(exports, "Blake3256", {
407
+ enumerable: true,
408
+ get: function () { return substrateBindings.Blake3256; }
409
+ });
410
+ Object.defineProperty(exports, "Blake3256Concat", {
411
+ enumerable: true,
412
+ get: function () { return substrateBindings.Blake3256Concat; }
413
+ });
414
+ Object.defineProperty(exports, "Twox128", {
415
+ enumerable: true,
416
+ get: function () { return substrateBindings.Twox128; }
417
+ });
418
+ Object.defineProperty(exports, "Twox256", {
419
+ enumerable: true,
420
+ get: function () { return substrateBindings.Twox256; }
421
+ });
422
+ Object.defineProperty(exports, "Twox64Concat", {
423
+ enumerable: true,
424
+ get: function () { return substrateBindings.Twox64Concat; }
425
+ });
426
+ Object.defineProperty(exports, "decAnyMetadata", {
427
+ enumerable: true,
428
+ get: function () { return substrateBindings.decAnyMetadata; }
406
429
  });
407
430
  Object.defineProperty(exports, "metadata", {
408
431
  enumerable: true,
409
432
  get: function () { return substrateBindings.metadata; }
410
433
  });
411
- Object.defineProperty(exports, "v14", {
434
+ Object.defineProperty(exports, "unifyMetadata", {
435
+ enumerable: true,
436
+ get: function () { return substrateBindings.unifyMetadata; }
437
+ });
438
+ Object.defineProperty(exports, "fromHex", {
412
439
  enumerable: true,
413
- get: function () { return substrateBindings.v14; }
440
+ get: function () { return utils.fromHex; }
414
441
  });
415
- Object.defineProperty(exports, "v15", {
442
+ Object.defineProperty(exports, "toHex", {
416
443
  enumerable: true,
417
- get: function () { return substrateBindings.v15; }
444
+ get: function () { return utils.toHex; }
418
445
  });
419
446
  exports.compactMetadata = compactMetadata;
420
- exports.decodeMetadata = decodeMetadata;
421
447
  exports.decodeScale = decodeScale;
422
448
  exports.encodeMetadata = encodeMetadata;
423
449
  exports.encodeStateKey = encodeStateKey;
424
450
  exports.getMetadataVersion = getMetadataVersion;
451
+ exports.getStorageKeyPrefix = getStorageKeyPrefix;
425
452
  exports.magicNumber = magicNumber;
426
453
  exports.papiParse = papiParse;
427
454
  exports.papiStringify = papiStringify;
455
+ exports.parseMetadataRpc = parseMetadataRpc;
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
3
  var metadataBuilders = require('@polkadot-api/metadata-builders');
4
- var utils = require('@polkadot-api/utils');
5
4
  var substrateBindings = require('@polkadot-api/substrate-bindings');
5
+ var utils = require('@polkadot-api/utils');
6
6
  var anylogger = require('anylogger');
7
7
  var scaleTs = require('scale-ts');
8
8
 
@@ -27,7 +27,10 @@ var log = anylogger__default.default(packageJson.name);
27
27
  * E.g. if `palletsAndItems` is `{ pallet: "System", items: ["Account"] }`, then only the
28
28
  * types used in the `System.Account` storage query will remain inside of metadata.lookups.
29
29
  */
30
- const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods = [], extraKeepTypes = []) => {
30
+ const compactMetadata = (anyMetadata, palletsAndItems = [], runtimeApisAndMethods = [], extraKeepTypes = []) => {
31
+ if (!isCompactableMetadata(anyMetadata)) throw new Error(`Metadata version ${anyMetadata.metadata.tag} not supported in compactMetadata`);
32
+ const metadata = anyMetadata.metadata.value;
33
+
31
34
  // remove pallets we don't care about
32
35
  metadata.pallets = metadata.pallets.filter(pallet =>
33
36
  // keep this pallet if it's listed in `palletsAndItems`
@@ -42,10 +45,7 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
42
45
  items: itemNames
43
46
  }) => {
44
47
  const pallet = metadata.pallets.find(pallet => pallet.name === palletName);
45
- if (!pallet) {
46
- log.debug("Failed to find pallet", palletName);
47
- return [];
48
- }
48
+ if (!pallet) return [];
49
49
 
50
50
  // remove pallet fields we don't care about
51
51
  pallet.calls = undefined;
@@ -81,10 +81,7 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
81
81
  methods: methodNames
82
82
  }) => {
83
83
  const runtimeApi = metadata.apis.find(runtimeApi => runtimeApi.name === runtimeApiName);
84
- if (!runtimeApi) {
85
- log.debug("Failed to find runtimeApi", runtimeApiName);
86
- return [];
87
- }
84
+ if (!runtimeApi) return [];
88
85
 
89
86
  // remove runtime fields we don't care about
90
87
  runtimeApi.docs = [];
@@ -124,14 +121,11 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
124
121
  return newTypeId ?? 0;
125
122
  };
126
123
  remapTypeIds(metadata, getNewTypeId);
127
- if ("address" in metadata.extrinsic) {
128
- // metadata is v15 (NOT v14)
129
- metadata.extrinsic.address = 0;
130
- metadata.extrinsic.call = 0;
131
- metadata.extrinsic.extra = 0;
132
- metadata.extrinsic.signature = 0;
133
- }
134
- metadata.extrinsic.signedExtensions = [];
124
+ if ("address" in metadata.extrinsic) metadata.extrinsic.address = 0;
125
+ if ("call" in metadata.extrinsic) metadata.extrinsic.call = 0;
126
+ if ("signature" in metadata.extrinsic) metadata.extrinsic.signature = 0;
127
+ if ("extra" in metadata.extrinsic) metadata.extrinsic.extra = 0;
128
+ if ("signedExtensions" in metadata.extrinsic) metadata.extrinsic.signedExtensions = [];
135
129
  if ("outerEnums" in metadata) {
136
130
  // metadata is v15 (NOT v14)
137
131
  metadata.outerEnums.call = 0;
@@ -139,6 +133,16 @@ const compactMetadata = (metadata, palletsAndItems = [], runtimeApisAndMethods =
139
133
  metadata.outerEnums.event = 0;
140
134
  }
141
135
  };
136
+ const isCompactableMetadata = metadata => {
137
+ switch (metadata.metadata.tag) {
138
+ case "v14":
139
+ case "v15":
140
+ case "v16":
141
+ return true;
142
+ default:
143
+ return false;
144
+ }
145
+ };
142
146
  const addDependentTypes = (metadataTysMap, keepTypes, types,
143
147
  // Prevent stack overflow when a type references itself
144
148
  addedTypes = new Set()) => {
@@ -269,43 +273,6 @@ const remapRuntimeApisTypeIds = (metadata, getNewTypeId) => {
269
273
  }
270
274
  };
271
275
 
272
- /**
273
- * Extracts the `version` u8 from a SCALE-encoded metadata blob and returns it as a `number`.
274
- *
275
- * Only reads the first 40 bytes of the blob.
276
- */
277
- const getMetadataVersion = metadataRpc => {
278
- try {
279
- return scaleTs.Struct({
280
- magicNumber: scaleTs.u32,
281
- version: scaleTs.u8
282
- }).dec(metadataRpc).version;
283
- } catch {
284
- return 0;
285
- }
286
- };
287
-
288
- const decodeMetadata = metadataRpc => {
289
- const metadataVersion = getMetadataVersion(metadataRpc);
290
- if (metadataVersion !== 15 && metadataVersion !== 14) return {
291
- metadataVersion
292
- };
293
- const decoded = substrateBindings.metadata.dec(metadataRpc);
294
- if (decoded.metadata.tag === "v15") return {
295
- metadataVersion,
296
- metadata: decoded.metadata.value,
297
- tag: decoded.metadata.tag
298
- };
299
- if (decoded.metadata.tag === "v14") return {
300
- metadataVersion,
301
- metadata: decoded.metadata.value,
302
- tag: decoded.metadata.tag
303
- };
304
- return {
305
- metadataVersion
306
- };
307
- };
308
-
309
276
  const decodeScale = (scaleCoder, change, error) => {
310
277
  if (change === null) return null;
311
278
  try {
@@ -316,19 +283,7 @@ const decodeScale = (scaleCoder, change, error) => {
316
283
  }
317
284
  };
318
285
 
319
- const encodeMetadata = ({
320
- metadata,
321
- tag
322
- }) => utils.toHex(substrateBindings.metadata.enc({
323
- magicNumber,
324
- metadata: tag === "v15" ? {
325
- tag,
326
- value: metadata
327
- } : {
328
- tag,
329
- value: metadata
330
- }
331
- }));
286
+ const encodeMetadata = metadata => utils.toHex(substrateBindings.metadata.enc(metadata));
332
287
 
333
288
  const encodeStateKey = (scaleCoder, error, ...args) => {
334
289
  try {
@@ -339,6 +294,22 @@ const encodeStateKey = (scaleCoder, error, ...args) => {
339
294
  }
340
295
  };
341
296
 
297
+ /**
298
+ * Extracts the `version` u8 from a SCALE-encoded metadata blob and returns it as a `number`.
299
+ *
300
+ * Only reads the first 40 bytes of the blob.
301
+ */
302
+ const getMetadataVersion = metadataRpc => {
303
+ try {
304
+ return scaleTs.Struct({
305
+ magicNumber: scaleTs.u32,
306
+ version: scaleTs.u8
307
+ }).dec(metadataRpc).version;
308
+ } catch {
309
+ return 0;
310
+ }
311
+ };
312
+
342
313
  /**
343
314
  * For the substrate-tokens (and other) modules, we configure the `onChainId` field in chaindata to tell the module how to query each token.
344
315
  * These queries are made to the tokens pallet.
@@ -388,6 +359,30 @@ const papiStringify = (value, space) => {
388
359
  return JSON.stringify(value, replacer, space);
389
360
  };
390
361
 
362
+ const parseMetadataRpc = metadataRpc => {
363
+ const metadata = substrateBindings.decAnyMetadata(metadataRpc);
364
+ const unifiedMetadata = substrateBindings.unifyMetadata(metadata);
365
+ const lookupFn = metadataBuilders.getLookupFn(unifiedMetadata);
366
+ const builder = metadataBuilders.getDynamicBuilder(lookupFn);
367
+ return {
368
+ metadata,
369
+ unifiedMetadata,
370
+ lookupFn,
371
+ builder
372
+ };
373
+ };
374
+
375
+ const getStorageKeyPrefix = (palletName, storageName) => {
376
+ const palletHash = substrateBindings.Twox128(new TextEncoder().encode(palletName));
377
+ const storageHash = substrateBindings.Twox128(new TextEncoder().encode(storageName));
378
+
379
+ // Concatenate and convert to hex
380
+ const combined = new Uint8Array(palletHash.length + storageHash.length);
381
+ combined.set(palletHash, 0);
382
+ combined.set(storageHash, palletHash.length);
383
+ return utils.toHex(combined);
384
+ };
385
+
391
386
  Object.defineProperty(exports, "getDynamicBuilder", {
392
387
  enumerable: true,
393
388
  get: function () { return metadataBuilders.getDynamicBuilder; }
@@ -396,32 +391,65 @@ Object.defineProperty(exports, "getLookupFn", {
396
391
  enumerable: true,
397
392
  get: function () { return metadataBuilders.getLookupFn; }
398
393
  });
399
- Object.defineProperty(exports, "fromHex", {
394
+ Object.defineProperty(exports, "Blake2128", {
400
395
  enumerable: true,
401
- get: function () { return utils.fromHex; }
396
+ get: function () { return substrateBindings.Blake2128; }
402
397
  });
403
- Object.defineProperty(exports, "toHex", {
398
+ Object.defineProperty(exports, "Blake2128Concat", {
404
399
  enumerable: true,
405
- get: function () { return utils.toHex; }
400
+ get: function () { return substrateBindings.Blake2128Concat; }
401
+ });
402
+ Object.defineProperty(exports, "Blake2256", {
403
+ enumerable: true,
404
+ get: function () { return substrateBindings.Blake2256; }
405
+ });
406
+ Object.defineProperty(exports, "Blake3256", {
407
+ enumerable: true,
408
+ get: function () { return substrateBindings.Blake3256; }
409
+ });
410
+ Object.defineProperty(exports, "Blake3256Concat", {
411
+ enumerable: true,
412
+ get: function () { return substrateBindings.Blake3256Concat; }
413
+ });
414
+ Object.defineProperty(exports, "Twox128", {
415
+ enumerable: true,
416
+ get: function () { return substrateBindings.Twox128; }
417
+ });
418
+ Object.defineProperty(exports, "Twox256", {
419
+ enumerable: true,
420
+ get: function () { return substrateBindings.Twox256; }
421
+ });
422
+ Object.defineProperty(exports, "Twox64Concat", {
423
+ enumerable: true,
424
+ get: function () { return substrateBindings.Twox64Concat; }
425
+ });
426
+ Object.defineProperty(exports, "decAnyMetadata", {
427
+ enumerable: true,
428
+ get: function () { return substrateBindings.decAnyMetadata; }
406
429
  });
407
430
  Object.defineProperty(exports, "metadata", {
408
431
  enumerable: true,
409
432
  get: function () { return substrateBindings.metadata; }
410
433
  });
411
- Object.defineProperty(exports, "v14", {
434
+ Object.defineProperty(exports, "unifyMetadata", {
435
+ enumerable: true,
436
+ get: function () { return substrateBindings.unifyMetadata; }
437
+ });
438
+ Object.defineProperty(exports, "fromHex", {
412
439
  enumerable: true,
413
- get: function () { return substrateBindings.v14; }
440
+ get: function () { return utils.fromHex; }
414
441
  });
415
- Object.defineProperty(exports, "v15", {
442
+ Object.defineProperty(exports, "toHex", {
416
443
  enumerable: true,
417
- get: function () { return substrateBindings.v15; }
444
+ get: function () { return utils.toHex; }
418
445
  });
419
446
  exports.compactMetadata = compactMetadata;
420
- exports.decodeMetadata = decodeMetadata;
421
447
  exports.decodeScale = decodeScale;
422
448
  exports.encodeMetadata = encodeMetadata;
423
449
  exports.encodeStateKey = encodeStateKey;
424
450
  exports.getMetadataVersion = getMetadataVersion;
451
+ exports.getStorageKeyPrefix = getStorageKeyPrefix;
425
452
  exports.magicNumber = magicNumber;
426
453
  exports.papiParse = papiParse;
427
454
  exports.papiStringify = papiStringify;
455
+ exports.parseMetadataRpc = parseMetadataRpc;