UNPKG

4.74 kBJavaScriptView Raw
1import { Struct } from '@polkadot/types-codec';
2import { getUniqTypes, toCallsOnly } from './util/index.js';
3import { toV10 } from './v9/toV10.js';
4import { toV11 } from './v10/toV11.js';
5import { toV12 } from './v11/toV12.js';
6import { toV13 } from './v12/toV13.js';
7import { toV14 } from './v13/toV14.js';
8import { toV15 } from './v14/toV15.js';
9import { toLatest } from './v15/toLatest.js';
10import { MagicNumber } from './MagicNumber.js';
11const KNOWN_VERSIONS = [15, 14, 13, 12, 11, 10, 9];
12const LATEST_VERSION = KNOWN_VERSIONS[0];
13const TO_CALLS_VERSION = 14; // LATEST_VERSION;
14/**
15 * @name MetadataVersioned
16 * @description
17 * The versioned runtime metadata as a decoded structure
18 */
19export class MetadataVersioned extends Struct {
20 constructor(registry, value) {
21 // const timeStart = performance.now()
22 super(registry, {
23 magicNumber: MagicNumber,
24 metadata: 'MetadataAll'
25 }, value);
26 this.__internal__converted = new Map();
27 this.__internal__assertVersion = (version) => {
28 if (this.version > version) {
29 throw new Error(`Cannot convert metadata from version ${this.version} to ${version}`);
30 }
31 return this.version === version;
32 };
33 this.__internal__getVersion = (version, fromPrev) => {
34 if (version !== 'latest' && this.__internal__assertVersion(version)) {
35 const asCurr = `asV${version}`;
36 return this.__internal__metadata()[asCurr];
37 }
38 if (!this.__internal__converted.has(version)) {
39 const asPrev = version === 'latest'
40 ? `asV${LATEST_VERSION}`
41 : `asV${(version - 1)}`;
42 this.__internal__converted.set(version, fromPrev(this.registry, this[asPrev], this.version));
43 }
44 return this.__internal__converted.get(version);
45 };
46 /**
47 * @description the metadata wrapped
48 */
49 this.__internal__metadata = () => {
50 return this.getT('metadata');
51 };
52 // console.log('MetadataVersioned', `${(performance.now() - timeStart).toFixed(2)}ms`)
53 }
54 /**
55 * @description Returns the wrapped metadata as a limited calls-only (latest) version
56 */
57 get asCallsOnly() {
58 return new MetadataVersioned(this.registry, {
59 magicNumber: this.magicNumber,
60 metadata: this.registry.createTypeUnsafe('MetadataAll', [toCallsOnly(this.registry, this.asLatest), TO_CALLS_VERSION])
61 });
62 }
63 /**
64 * @description Returns the wrapped metadata as a V9 object
65 */
66 get asV9() {
67 this.__internal__assertVersion(9);
68 return this.__internal__metadata().asV9;
69 }
70 /**
71 * @description Returns the wrapped values as a V10 object
72 */
73 get asV10() {
74 return this.__internal__getVersion(10, toV10);
75 }
76 /**
77 * @description Returns the wrapped values as a V11 object
78 */
79 get asV11() {
80 return this.__internal__getVersion(11, toV11);
81 }
82 /**
83 * @description Returns the wrapped values as a V12 object
84 */
85 get asV12() {
86 return this.__internal__getVersion(12, toV12);
87 }
88 /**
89 * @description Returns the wrapped values as a V13 object
90 */
91 get asV13() {
92 return this.__internal__getVersion(13, toV13);
93 }
94 /**
95 * @description Returns the wrapped values as a V14 object
96 */
97 get asV14() {
98 return this.__internal__getVersion(14, toV14);
99 }
100 /**
101 * @description Returns the wrapped values as a V14 object
102 */
103 get asV15() {
104 return this.__internal__getVersion(15, toV15);
105 }
106 /**
107 * @description Returns the wrapped values as a latest version object
108 */
109 get asLatest() {
110 return this.__internal__getVersion('latest', toLatest);
111 }
112 /**
113 * @description The magicNumber for the Metadata (known constant)
114 */
115 get magicNumber() {
116 return this.getT('magicNumber');
117 }
118 /**
119 * @description the metadata version this structure represents
120 */
121 get version() {
122 return this.__internal__metadata().index;
123 }
124 getUniqTypes(throwError) {
125 return getUniqTypes(this.registry, this.asLatest, throwError);
126 }
127 /**
128 * @description Converts the Object to JSON, typically used for RPC transfers
129 */
130 toJSON() {
131 // HACK(y): ensure that we apply the aliases if we have not done so already, this is
132 // needed to ensure we have the correct overrides (which is only applied in toLatest)
133 // eslint-disable-next-line no-unused-expressions
134 this.asLatest;
135 return super.toJSON();
136 }
137}