@proto-kit/common 0.1.1-develop.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 (150) hide show
  1. package/LICENSE.md +201 -0
  2. package/dist/compiling/AtomicCompileHelper.d.ts +13 -0
  3. package/dist/compiling/AtomicCompileHelper.d.ts.map +1 -0
  4. package/dist/compiling/AtomicCompileHelper.js +40 -0
  5. package/dist/compiling/AtomicCompileHelper.js.map +1 -0
  6. package/dist/compiling/CompilableModule.d.ts +6 -0
  7. package/dist/compiling/CompilableModule.d.ts.map +1 -0
  8. package/dist/compiling/CompilableModule.js +2 -0
  9. package/dist/compiling/CompilableModule.js.map +1 -0
  10. package/dist/compiling/CompileRegistry.d.ts +26 -0
  11. package/dist/compiling/CompileRegistry.d.ts.map +1 -0
  12. package/dist/compiling/CompileRegistry.js +68 -0
  13. package/dist/compiling/CompileRegistry.js.map +1 -0
  14. package/dist/compiling/services/ChildVerificationKeyService.d.ts +10 -0
  15. package/dist/compiling/services/ChildVerificationKeyService.d.ts.map +1 -0
  16. package/dist/compiling/services/ChildVerificationKeyService.js +27 -0
  17. package/dist/compiling/services/ChildVerificationKeyService.js.map +1 -0
  18. package/dist/config/ChildContainerCreatable.d.ts +5 -0
  19. package/dist/config/ChildContainerCreatable.d.ts.map +1 -0
  20. package/dist/config/ChildContainerCreatable.js +2 -0
  21. package/dist/config/ChildContainerCreatable.js.map +1 -0
  22. package/dist/config/ChildContainerProvider.d.ts +5 -0
  23. package/dist/config/ChildContainerProvider.d.ts.map +1 -0
  24. package/dist/config/ChildContainerProvider.js +2 -0
  25. package/dist/config/ChildContainerProvider.js.map +1 -0
  26. package/dist/config/ConfigurableModule.d.ts +25 -0
  27. package/dist/config/ConfigurableModule.d.ts.map +1 -0
  28. package/dist/config/ConfigurableModule.js +24 -0
  29. package/dist/config/ConfigurableModule.js.map +1 -0
  30. package/dist/config/ModuleContainer.d.ts +162 -0
  31. package/dist/config/ModuleContainer.d.ts.map +1 -0
  32. package/dist/config/ModuleContainer.js +289 -0
  33. package/dist/config/ModuleContainer.js.map +1 -0
  34. package/dist/config/injectAlias.d.ts +18 -0
  35. package/dist/config/injectAlias.d.ts.map +1 -0
  36. package/dist/config/injectAlias.js +47 -0
  37. package/dist/config/injectAlias.js.map +1 -0
  38. package/dist/dependencyFactory/DependencyFactory.d.ts +29 -0
  39. package/dist/dependencyFactory/DependencyFactory.d.ts.map +1 -0
  40. package/dist/dependencyFactory/DependencyFactory.js +2 -0
  41. package/dist/dependencyFactory/DependencyFactory.js.map +1 -0
  42. package/dist/dependencyFactory/injectOptional.d.ts +16 -0
  43. package/dist/dependencyFactory/injectOptional.d.ts.map +1 -0
  44. package/dist/dependencyFactory/injectOptional.js +40 -0
  45. package/dist/dependencyFactory/injectOptional.js.map +1 -0
  46. package/dist/dummyVerificationKey.d.ts +3 -0
  47. package/dist/dummyVerificationKey.d.ts.map +1 -0
  48. package/dist/dummyVerificationKey.js +8 -0
  49. package/dist/dummyVerificationKey.js.map +1 -0
  50. package/dist/events/EventEmitter.d.ts +19 -0
  51. package/dist/events/EventEmitter.d.ts.map +1 -0
  52. package/dist/events/EventEmitter.js +35 -0
  53. package/dist/events/EventEmitter.js.map +1 -0
  54. package/dist/events/EventEmitterProxy.d.ts +18 -0
  55. package/dist/events/EventEmitterProxy.d.ts.map +1 -0
  56. package/dist/events/EventEmitterProxy.js +35 -0
  57. package/dist/events/EventEmitterProxy.js.map +1 -0
  58. package/dist/events/EventEmittingComponent.d.ts +9 -0
  59. package/dist/events/EventEmittingComponent.d.ts.map +1 -0
  60. package/dist/events/EventEmittingComponent.js +2 -0
  61. package/dist/events/EventEmittingComponent.js.map +1 -0
  62. package/dist/events/ReplayingSingleUseEventEmitter.d.ts +17 -0
  63. package/dist/events/ReplayingSingleUseEventEmitter.d.ts.map +1 -0
  64. package/dist/events/ReplayingSingleUseEventEmitter.js +34 -0
  65. package/dist/events/ReplayingSingleUseEventEmitter.js.map +1 -0
  66. package/dist/index.d.ts +26 -0
  67. package/dist/index.d.ts.map +1 -0
  68. package/dist/index.js +26 -0
  69. package/dist/index.js.map +1 -0
  70. package/dist/log.d.ts +37 -0
  71. package/dist/log.d.ts.map +1 -0
  72. package/dist/log.js +114 -0
  73. package/dist/log.js.map +1 -0
  74. package/dist/trees/InMemoryMerkleTreeStorage.d.ts +11 -0
  75. package/dist/trees/InMemoryMerkleTreeStorage.d.ts.map +1 -0
  76. package/dist/trees/InMemoryMerkleTreeStorage.js +13 -0
  77. package/dist/trees/InMemoryMerkleTreeStorage.js.map +1 -0
  78. package/dist/trees/MerkleTreeStore.d.ts +5 -0
  79. package/dist/trees/MerkleTreeStore.d.ts.map +1 -0
  80. package/dist/trees/MerkleTreeStore.js +2 -0
  81. package/dist/trees/MerkleTreeStore.js.map +1 -0
  82. package/dist/trees/MockAsyncMerkleStore.d.ts +9 -0
  83. package/dist/trees/MockAsyncMerkleStore.d.ts.map +1 -0
  84. package/dist/trees/MockAsyncMerkleStore.js +20 -0
  85. package/dist/trees/MockAsyncMerkleStore.js.map +1 -0
  86. package/dist/trees/RollupMerkleTree.d.ts +147 -0
  87. package/dist/trees/RollupMerkleTree.d.ts.map +1 -0
  88. package/dist/trees/RollupMerkleTree.js +218 -0
  89. package/dist/trees/RollupMerkleTree.js.map +1 -0
  90. package/dist/trees/VirtualMerkleTreeStore.d.ts +13 -0
  91. package/dist/trees/VirtualMerkleTreeStore.d.ts.map +1 -0
  92. package/dist/trees/VirtualMerkleTreeStore.js +18 -0
  93. package/dist/trees/VirtualMerkleTreeStore.js.map +1 -0
  94. package/dist/types.d.ts +27 -0
  95. package/dist/types.d.ts.map +1 -0
  96. package/dist/types.js +12 -0
  97. package/dist/types.js.map +1 -0
  98. package/dist/utils.d.ts +48 -0
  99. package/dist/utils.d.ts.map +1 -0
  100. package/dist/utils.js +113 -0
  101. package/dist/utils.js.map +1 -0
  102. package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts +54 -0
  103. package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts.map +1 -0
  104. package/dist/zkProgrammable/ProvableMethodExecutionContext.js +97 -0
  105. package/dist/zkProgrammable/ProvableMethodExecutionContext.js.map +1 -0
  106. package/dist/zkProgrammable/ZkProgrammable.d.ts +40 -0
  107. package/dist/zkProgrammable/ZkProgrammable.d.ts.map +1 -0
  108. package/dist/zkProgrammable/ZkProgrammable.js +79 -0
  109. package/dist/zkProgrammable/ZkProgrammable.js.map +1 -0
  110. package/dist/zkProgrammable/provableMethod.d.ts +19 -0
  111. package/dist/zkProgrammable/provableMethod.d.ts.map +1 -0
  112. package/dist/zkProgrammable/provableMethod.js +71 -0
  113. package/dist/zkProgrammable/provableMethod.js.map +1 -0
  114. package/jest.config.cjs +12 -0
  115. package/package.json +34 -0
  116. package/src/compiling/AtomicCompileHelper.ts +62 -0
  117. package/src/compiling/CompilableModule.ts +6 -0
  118. package/src/compiling/CompileRegistry.ts +78 -0
  119. package/src/compiling/services/ChildVerificationKeyService.ts +26 -0
  120. package/src/config/ChildContainerCreatable.ts +5 -0
  121. package/src/config/ChildContainerProvider.ts +5 -0
  122. package/src/config/ConfigurableModule.ts +57 -0
  123. package/src/config/ModuleContainer.ts +487 -0
  124. package/src/config/injectAlias.ts +70 -0
  125. package/src/dependencyFactory/DependencyFactory.ts +57 -0
  126. package/src/dependencyFactory/injectOptional.ts +41 -0
  127. package/src/dummyVerificationKey.ts +10 -0
  128. package/src/events/EventEmitter.ts +61 -0
  129. package/src/events/EventEmitterProxy.ts +83 -0
  130. package/src/events/EventEmittingComponent.ts +11 -0
  131. package/src/events/ReplayingSingleUseEventEmitter.ts +42 -0
  132. package/src/index.ts +25 -0
  133. package/src/log.ts +143 -0
  134. package/src/trees/InMemoryMerkleTreeStorage.ts +17 -0
  135. package/src/trees/MerkleTreeStore.ts +5 -0
  136. package/src/trees/MockAsyncMerkleStore.ts +30 -0
  137. package/src/trees/RollupMerkleTree.ts +356 -0
  138. package/src/trees/VirtualMerkleTreeStore.ts +20 -0
  139. package/src/types.ts +58 -0
  140. package/src/utils.ts +200 -0
  141. package/src/zkProgrammable/ProvableMethodExecutionContext.ts +122 -0
  142. package/src/zkProgrammable/ZkProgrammable.ts +151 -0
  143. package/src/zkProgrammable/provableMethod.ts +124 -0
  144. package/test/config/ContainerEvents.test.ts +67 -0
  145. package/test/config/ModuleContainer.test.ts +215 -0
  146. package/test/config/injectAlias.test.ts +28 -0
  147. package/test/trees/MerkleTree.test.ts +106 -0
  148. package/test/tsconfig.json +7 -0
  149. package/test/zkProgrammable/ZkProgrammable.test.ts +304 -0
  150. package/tsconfig.json +8 -0
@@ -0,0 +1,147 @@
1
+ import { Bool, Field } from "o1js";
2
+ import { TypedClass } from "../types";
3
+ import { MerkleTreeStore } from "./MerkleTreeStore";
4
+ declare const StructTemplate_base: (new (value: {
5
+ path: import("o1js/dist/node/lib/provable/field").Field[];
6
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
7
+ }) => {
8
+ path: import("o1js/dist/node/lib/provable/field").Field[];
9
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
10
+ }) & {
11
+ _isStruct: true;
12
+ } & Omit<import("o1js/dist/node/lib/provable/types/provable-intf").Provable<{
13
+ path: import("o1js/dist/node/lib/provable/field").Field[];
14
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
15
+ }, {
16
+ path: bigint[];
17
+ isLeft: boolean[];
18
+ }>, "fromFields"> & {
19
+ fromFields: (fields: import("o1js/dist/node/lib/provable/field").Field[]) => {
20
+ path: import("o1js/dist/node/lib/provable/field").Field[];
21
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
22
+ };
23
+ } & {
24
+ fromValue: (value: {
25
+ path: import("o1js/dist/node/lib/provable/field").Field[] | bigint[];
26
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[] | boolean[];
27
+ }) => {
28
+ path: import("o1js/dist/node/lib/provable/field").Field[];
29
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
30
+ };
31
+ toInput: (x: {
32
+ path: import("o1js/dist/node/lib/provable/field").Field[];
33
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
34
+ }) => {
35
+ fields?: import("o1js/dist/node/lib/provable/field").Field[] | undefined;
36
+ packed?: [import("o1js/dist/node/lib/provable/field").Field, number][] | undefined;
37
+ };
38
+ toJSON: (x: {
39
+ path: import("o1js/dist/node/lib/provable/field").Field[];
40
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
41
+ }) => {
42
+ path: string[];
43
+ isLeft: boolean[];
44
+ };
45
+ fromJSON: (x: {
46
+ path: string[];
47
+ isLeft: boolean[];
48
+ }) => {
49
+ path: import("o1js/dist/node/lib/provable/field").Field[];
50
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
51
+ };
52
+ empty: () => {
53
+ path: import("o1js/dist/node/lib/provable/field").Field[];
54
+ isLeft: import("o1js/dist/node/lib/provable/bool").Bool[];
55
+ };
56
+ };
57
+ declare class StructTemplate extends StructTemplate_base {
58
+ }
59
+ export interface AbstractMerkleWitness extends StructTemplate {
60
+ height(): number;
61
+ /**
62
+ * Calculates a root depending on the leaf value.
63
+ * @param leaf Value of the leaf node that belongs to this Witness.
64
+ * @returns The calculated root.
65
+ */
66
+ calculateRoot(hash: Field): Field;
67
+ /**
68
+ * Calculates the index of the leaf node that belongs to this Witness.
69
+ * @returns Index of the leaf.
70
+ */
71
+ calculateIndex(): Field;
72
+ checkMembership(root: Field, key: Field, value: Field): Bool;
73
+ checkMembershipGetRoots(root: Field, key: Field, value: Field): [Bool, Field, Field];
74
+ toShortenedEntries(): string[];
75
+ }
76
+ export interface AbstractMerkleTree {
77
+ store: MerkleTreeStore;
78
+ readonly leafCount: bigint;
79
+ assertIndexRange(index: bigint): void;
80
+ /**
81
+ * Returns a node which lives at a given index and level.
82
+ * @param level Level of the node.
83
+ * @param index Index of the node.
84
+ * @returns The data of the node.
85
+ */
86
+ getNode(level: number, index: bigint): Field;
87
+ /**
88
+ * Returns the root of the [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree).
89
+ * @returns The root of the Merkle Tree.
90
+ */
91
+ getRoot(): Field;
92
+ /**
93
+ * Sets the value of a leaf node at a given index to a given value.
94
+ * @param index Position of the leaf node.
95
+ * @param leaf New value.
96
+ */
97
+ setLeaf(index: bigint, leaf: Field): void;
98
+ /**
99
+ * Returns the witness (also known as
100
+ * [Merkle Proof or Merkle Witness](https://computersciencewiki.org/index.php/Merkle_proof))
101
+ * for the leaf at the given index.
102
+ * @param index Position of the leaf node.
103
+ * @returns The witness that belongs to the leaf.
104
+ */
105
+ getWitness(index: bigint): AbstractMerkleWitness;
106
+ /**
107
+ * Fills all leaves of the tree.
108
+ * @param leaves Values to fill the leaves with.
109
+ */
110
+ fill(leaves: Field[]): void;
111
+ }
112
+ export interface AbstractMerkleTreeClass {
113
+ new (store: MerkleTreeStore): AbstractMerkleTree;
114
+ WITNESS: TypedClass<AbstractMerkleWitness> & typeof StructTemplate & {
115
+ dummy: () => AbstractMerkleWitness;
116
+ };
117
+ HEIGHT: number;
118
+ EMPTY_ROOT: bigint;
119
+ get leafCount(): bigint;
120
+ }
121
+ /**
122
+ * A [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree) is a binary tree in
123
+ * which every leaf is the cryptography hash of a piece of data,
124
+ * and every node is the hash of the concatenation of its two child nodes.
125
+ *
126
+ * A Merkle Tree allows developers to easily and securely verify
127
+ * the integrity of large amounts of data.
128
+ *
129
+ * Take a look at our [documentation](https://docs.minaprotocol.com/en/zkapps)
130
+ * on how to use Merkle Trees in combination with zkApps and
131
+ * zero knowledge programming!
132
+ *
133
+ * Levels are indexed from leaves (level 0) to root (level N - 1).
134
+ *
135
+ * This function takes a height as argument and returns a class
136
+ * that implements a merkletree with that specified height.
137
+ *
138
+ * It also holds the Witness class under tree.WITNESS
139
+ */
140
+ export declare function createMerkleTree(height: number): AbstractMerkleTreeClass;
141
+ declare const RollupMerkleTree_base: AbstractMerkleTreeClass;
142
+ export declare class RollupMerkleTree extends RollupMerkleTree_base {
143
+ }
144
+ export declare class RollupMerkleTreeWitness extends RollupMerkleTree.WITNESS {
145
+ }
146
+ export {};
147
+ //# sourceMappingURL=RollupMerkleTree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RollupMerkleTree.d.ts","sourceRoot":"","sources":["../../src/trees/RollupMerkleTree.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAA8B,MAAM,MAAM,CAAC;AAG/D,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGpD,cAAM,cAAe,SAAQ,mBAG3B;CAAG;AAEL,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,MAAM,IAAI,MAAM,CAAC;IAEjB;;;;OAIG;IACH,aAAa,CAAC,IAAI,EAAE,KAAK,GAAG,KAAK,CAAC;IAElC;;;OAGG;IACH,cAAc,IAAI,KAAK,CAAC;IAExB,eAAe,CAAC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IAE7D,uBAAuB,CACrB,IAAI,EAAE,KAAK,EACX,GAAG,EAAE,KAAK,EACV,KAAK,EAAE,KAAK,GACX,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAExB,kBAAkB,IAAI,MAAM,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,eAAe,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAE3B,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtC;;;;;OAKG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,KAAK,CAAC;IAE7C;;;OAGG;IACH,OAAO,IAAI,KAAK,CAAC;IAEjB;;;;OAIG;IACH,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC;IAE1C;;;;;;OAMG;IACH,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,qBAAqB,CAAC;IAEjD;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,KAAK,KAAK,EAAE,eAAe,GAAG,kBAAkB,CAAC;IAEjD,OAAO,EAAE,UAAU,CAAC,qBAAqB,CAAC,GACxC,OAAO,cAAc,GAAG;QAAE,KAAK,EAAE,MAAM,qBAAqB,CAAA;KAAE,CAAC;IAEjE,MAAM,EAAE,MAAM,CAAC;IAEf,UAAU,EAAE,MAAM,CAAC;IAEnB,IAAI,SAAS,IAAI,MAAM,CAAC;CACzB;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,uBAAuB,CAkOxE;;AAED,qBAAa,gBAAiB,SAAQ,qBAAqB;CAAG;AAC9D,qBAAa,uBAAwB,SAAQ,gBAAgB,CAAC,OAAO;CAAG"}
@@ -0,0 +1,218 @@
1
+ import { Bool, Field, Poseidon, Provable, Struct } from "o1js";
2
+ import { range } from "../utils";
3
+ import { InMemoryMerkleTreeStorage } from "./InMemoryMerkleTreeStorage";
4
+ class StructTemplate extends Struct({
5
+ path: Provable.Array(Field, 0),
6
+ isLeft: Provable.Array(Bool, 0),
7
+ }) {
8
+ }
9
+ /**
10
+ * A [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree) is a binary tree in
11
+ * which every leaf is the cryptography hash of a piece of data,
12
+ * and every node is the hash of the concatenation of its two child nodes.
13
+ *
14
+ * A Merkle Tree allows developers to easily and securely verify
15
+ * the integrity of large amounts of data.
16
+ *
17
+ * Take a look at our [documentation](https://docs.minaprotocol.com/en/zkapps)
18
+ * on how to use Merkle Trees in combination with zkApps and
19
+ * zero knowledge programming!
20
+ *
21
+ * Levels are indexed from leaves (level 0) to root (level N - 1).
22
+ *
23
+ * This function takes a height as argument and returns a class
24
+ * that implements a merkletree with that specified height.
25
+ *
26
+ * It also holds the Witness class under tree.WITNESS
27
+ */
28
+ export function createMerkleTree(height) {
29
+ var _a;
30
+ /**
31
+ * The {@link BaseMerkleWitness} class defines a circuit-compatible base class
32
+ * for [Merkle Witness'](https://computersciencewiki.org/index.php/Merkle_proof).
33
+ */
34
+ class RollupMerkleWitness extends Struct({
35
+ path: Provable.Array(Field, height - 1),
36
+ isLeft: Provable.Array(Bool, height - 1),
37
+ }) {
38
+ height() {
39
+ return RollupMerkleWitness.height;
40
+ }
41
+ /**
42
+ * Calculates a root depending on the leaf value.
43
+ * @param leaf Value of the leaf node that belongs to this Witness.
44
+ * @returns The calculated root.
45
+ */
46
+ calculateRoot(leaf) {
47
+ let hash = leaf;
48
+ const n = this.height();
49
+ for (let index = 1; index < n; ++index) {
50
+ const isLeft = this.isLeft[index - 1];
51
+ // eslint-disable-next-line @typescript-eslint/no-use-before-define
52
+ const [left, right] = maybeSwap(isLeft, hash, this.path[index - 1]);
53
+ hash = Poseidon.hash([left, right]);
54
+ }
55
+ return hash;
56
+ }
57
+ /**
58
+ * Calculates the index of the leaf node that belongs to this Witness.
59
+ * @returns Index of the leaf.
60
+ */
61
+ calculateIndex() {
62
+ let powerOfTwo = Field(1);
63
+ let index = Field(0);
64
+ const n = this.height();
65
+ for (let i = 1; i < n; ++i) {
66
+ index = Provable.if(this.isLeft[i - 1], index, index.add(powerOfTwo));
67
+ powerOfTwo = powerOfTwo.mul(2);
68
+ }
69
+ return index;
70
+ }
71
+ checkMembership(root, key, value) {
72
+ const calculatedRoot = this.calculateRoot(value);
73
+ const calculatedKey = this.calculateIndex();
74
+ // We don't have to range-check the key, because if it would be greater
75
+ // than leafCount, it would not match the computedKey
76
+ key.assertEquals(calculatedKey, "Keys of MerkleWitness does not match");
77
+ return root.equals(calculatedRoot);
78
+ }
79
+ checkMembershipGetRoots(root, key, value) {
80
+ const calculatedRoot = this.calculateRoot(value);
81
+ const calculatedKey = this.calculateIndex();
82
+ key.assertEquals(calculatedKey, "Keys of MerkleWitness does not match");
83
+ return [root.equals(calculatedRoot), root, calculatedRoot];
84
+ }
85
+ toShortenedEntries() {
86
+ return range(0, 5)
87
+ .concat(range(this.height() - 4, this.height()))
88
+ .map((index) => [
89
+ this.path[index].toString(),
90
+ this.isLeft[index].toString(),
91
+ ].toString());
92
+ }
93
+ static dummy() {
94
+ return new RollupMerkleWitness({
95
+ isLeft: Array(height - 1).fill(Bool(false)),
96
+ path: Array(height - 1).fill(Field(0)),
97
+ });
98
+ }
99
+ }
100
+ RollupMerkleWitness.height = height;
101
+ return _a = class AbstractRollupMerkleTree {
102
+ static get leafCount() {
103
+ return 2n ** BigInt(AbstractRollupMerkleTree.HEIGHT - 1);
104
+ }
105
+ constructor(store) {
106
+ this.store = store;
107
+ this.zeroes = [0n];
108
+ for (let index = 1; index < AbstractRollupMerkleTree.HEIGHT; index += 1) {
109
+ const previousLevel = Field(this.zeroes[index - 1]);
110
+ this.zeroes.push(Poseidon.hash([previousLevel, previousLevel]).toBigInt());
111
+ }
112
+ }
113
+ assertIndexRange(index) {
114
+ if (index > this.leafCount) {
115
+ throw new Error("Index greater than maximum leaf number");
116
+ }
117
+ }
118
+ /**
119
+ * Returns a node which lives at a given index and level.
120
+ * @param level Level of the node.
121
+ * @param index Index of the node.
122
+ * @returns The data of the node.
123
+ */
124
+ getNode(level, index) {
125
+ this.assertIndexRange(index);
126
+ return Field(this.store.getNode(index, level) ?? this.zeroes[level]);
127
+ }
128
+ /**
129
+ * Returns the root of the [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree).
130
+ * @returns The root of the Merkle Tree.
131
+ */
132
+ getRoot() {
133
+ return this.getNode(AbstractRollupMerkleTree.HEIGHT - 1, 0n).toConstant();
134
+ }
135
+ // private in interface
136
+ setNode(level, index, value) {
137
+ this.store.setNode(index, level, value.toBigInt());
138
+ }
139
+ /**
140
+ * Sets the value of a leaf node at a given index to a given value.
141
+ * @param index Position of the leaf node.
142
+ * @param leaf New value.
143
+ */
144
+ setLeaf(index, leaf) {
145
+ this.assertIndexRange(index);
146
+ this.setNode(0, index, leaf);
147
+ let currentIndex = index;
148
+ for (let level = 1; level < AbstractRollupMerkleTree.HEIGHT; level += 1) {
149
+ currentIndex /= 2n;
150
+ const left = this.getNode(level - 1, currentIndex * 2n);
151
+ const right = this.getNode(level - 1, currentIndex * 2n + 1n);
152
+ this.setNode(level, currentIndex, Poseidon.hash([left, right]));
153
+ }
154
+ }
155
+ /**
156
+ * Returns the witness (also known as
157
+ * [Merkle Proof or Merkle Witness](https://computersciencewiki.org/index.php/Merkle_proof))
158
+ * for the leaf at the given index.
159
+ * @param index Position of the leaf node.
160
+ * @returns The witness that belongs to the leaf.
161
+ */
162
+ getWitness(index) {
163
+ this.assertIndexRange(index);
164
+ const path = [];
165
+ const isLefts = [];
166
+ let currentIndex = index;
167
+ for (let level = 0; level < AbstractRollupMerkleTree.HEIGHT - 1; level += 1) {
168
+ const isLeft = currentIndex % 2n === 0n;
169
+ const sibling = this.getNode(level, isLeft ? currentIndex + 1n : currentIndex - 1n);
170
+ isLefts.push(Bool(isLeft));
171
+ path.push(sibling);
172
+ currentIndex /= 2n;
173
+ }
174
+ return new RollupMerkleWitness({
175
+ isLeft: isLefts,
176
+ path,
177
+ });
178
+ }
179
+ // TODO: should this take an optional offset? should it fail if the array is too long?
180
+ /**
181
+ * Fills all leaves of the tree.
182
+ * @param leaves Values to fill the leaves with.
183
+ */
184
+ fill(leaves) {
185
+ leaves.forEach((value, index) => {
186
+ this.setLeaf(BigInt(index), value);
187
+ });
188
+ }
189
+ /**
190
+ * Returns the amount of leaf nodes.
191
+ * @returns Amount of leaf nodes.
192
+ */
193
+ get leafCount() {
194
+ return AbstractRollupMerkleTree.leafCount;
195
+ }
196
+ },
197
+ _a.HEIGHT = height,
198
+ _a.EMPTY_ROOT = new _a(new InMemoryMerkleTreeStorage())
199
+ .getRoot()
200
+ .toBigInt(),
201
+ _a.WITNESS = RollupMerkleWitness,
202
+ _a;
203
+ }
204
+ export class RollupMerkleTree extends createMerkleTree(256) {
205
+ }
206
+ export class RollupMerkleTreeWitness extends RollupMerkleTree.WITNESS {
207
+ }
208
+ /**
209
+ * More efficient version of `maybeSwapBad` which
210
+ * reuses an intermediate variable
211
+ */
212
+ function maybeSwap(b, x, y) {
213
+ const m = b.toField().mul(x.sub(y)); // b*(x - y)
214
+ const x1 = y.add(m); // y + b*(x - y)
215
+ const y2 = x.sub(m); // x - b*(x - y) = x + b*(y - x)
216
+ return [x1, y2];
217
+ }
218
+ //# sourceMappingURL=RollupMerkleTree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RollupMerkleTree.js","sourceRoot":"","sources":["../../src/trees/RollupMerkleTree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { MerkleTreeStore } from "./MerkleTreeStore";
2
+ import { InMemoryMerkleTreeStorage } from "./InMemoryMerkleTreeStorage";
3
+ /**
4
+ * A MemoryMerkleTreeStore that, if falls back to a parent store if it
5
+ * has no data
6
+ */
7
+ export declare class VirtualMerkleTreeStore extends InMemoryMerkleTreeStorage {
8
+ private readonly parent;
9
+ constructor(parent: MerkleTreeStore);
10
+ getNode(key: bigint, level: number): bigint | undefined;
11
+ setNode(key: bigint, level: number, value: bigint): void;
12
+ }
13
+ //# sourceMappingURL=VirtualMerkleTreeStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualMerkleTreeStore.d.ts","sourceRoot":"","sources":["../../src/trees/VirtualMerkleTreeStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE;;;GAGG;AACH,qBAAa,sBAAuB,SAAQ,yBAAyB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,eAAe;IAIpD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS;IAIvD,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;CAGhE"}
@@ -0,0 +1,18 @@
1
+ import { InMemoryMerkleTreeStorage } from "./InMemoryMerkleTreeStorage";
2
+ /**
3
+ * A MemoryMerkleTreeStore that, if falls back to a parent store if it
4
+ * has no data
5
+ */
6
+ export class VirtualMerkleTreeStore extends InMemoryMerkleTreeStorage {
7
+ constructor(parent) {
8
+ super();
9
+ this.parent = parent;
10
+ }
11
+ getNode(key, level) {
12
+ return super.getNode(key, level) ?? this.parent.getNode(key, level);
13
+ }
14
+ setNode(key, level, value) {
15
+ super.setNode(key, level, value);
16
+ }
17
+ }
18
+ //# sourceMappingURL=VirtualMerkleTreeStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"VirtualMerkleTreeStore.js","sourceRoot":"","sources":["../../src/trees/VirtualMerkleTreeStore.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE;;;GAGG;AACH,MAAM,OAAO,sBAAuB,SAAQ,yBAAyB;IACnE,YAAoC,MAAuB;QACzD,KAAK,EAAE,CAAC;QAD0B,WAAM,GAAN,MAAM,CAAiB;IAE3D,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa;QACvC,OAAO,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtE,CAAC;IAEM,OAAO,CAAC,GAAW,EAAE,KAAa,EAAE,KAAa;QACtD,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IACnC,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import { DynamicProof, Proof, ProofBase, PublicKey } from "o1js";
2
+ export type TypedClass<Class> = new (...args: any[]) => Class;
3
+ export type UnTypedClass = new (...args: any[]) => unknown;
4
+ /**
5
+ * Using simple `keyof Target` would result into the key
6
+ * being `string | number | symbol`, but we want just a `string`
7
+ */
8
+ export type StringKeyOf<Target extends object> = Extract<keyof Target, string> & string;
9
+ /**
10
+ * Utility type to infer element type from an array type
11
+ */
12
+ export type ArrayElement<ArrayType extends readonly unknown[]> = ArrayType extends readonly (infer ElementType)[] ? ElementType : never;
13
+ /**
14
+ * Transforms X | Y => X & Y
15
+ */
16
+ export type UnionToIntersection<Union> = (Union extends any ? (x: Union) => void : never) extends (x: infer Intersection) => void ? Intersection : never;
17
+ export type MergeObjects<Input extends Record<string, unknown>> = UnionToIntersection<Input[keyof Input]>;
18
+ export type OmitKeys<Record, Keys> = {
19
+ [Key in keyof Record as Key extends Keys ? never : Key]: Record[Key];
20
+ };
21
+ export declare const EMPTY_PUBLICKEY_X: import("o1js/dist/node/lib/provable/field").Field;
22
+ export declare const EMPTY_PUBLICKEY: PublicKey;
23
+ export type OverwriteObjectType<Base, New> = {
24
+ [Key in keyof Base]: Key extends keyof New ? New[Key] : Base[Key];
25
+ } & New;
26
+ export type InferProofBase<ProofType extends Proof<any, any> | DynamicProof<any, any>> = ProofType extends Proof<infer PI, infer PO> ? ProofBase<PI, PO> : ProofType extends DynamicProof<infer PI, infer PO> ? ProofBase<PI, PO> : undefined;
27
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,OAAO,EAAQ,YAAY,EAAS,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAE9E,MAAM,MAAM,UAAU,CAAC,KAAK,IAAI,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,KAAK,CAAC;AAE9D,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC;AAE3D;;;GAGG;AACH,MAAM,MAAM,WAAW,CAAC,MAAM,SAAS,MAAM,IAAI,OAAO,CAAC,MAAM,MAAM,EAAE,MAAM,CAAC,GAC5E,MAAM,CAAC;AAET;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,SAAS,OAAO,EAAE,IAC3D,SAAS,SAAS,SAAS,CAAC,MAAM,WAAW,CAAC,EAAE,GAAG,WAAW,GAAG,KAAK,CAAC;AAEzE;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,KAAK,IAAI,CACvC,KAAK,SAAS,GAAG,GAAG,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,GAAG,KAAK,CAC/C,SAAS,CAAC,CAAC,EAAE,MAAM,YAAY,KAAK,IAAI,GACrC,YAAY,GACZ,KAAK,CAAC;AAEV,MAAM,MAAM,YAAY,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAC5D,mBAAmB,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;AAE1C,MAAM,MAAM,QAAQ,CAAC,MAAM,EAAE,IAAI,IAAI;KAClC,GAAG,IAAI,MAAM,MAAM,IAAI,GAAG,SAAS,IAAI,GAAG,KAAK,GAAG,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC;CACrE,CAAC;AAMF,eAAO,MAAM,iBAAiB,mDAAc,CAAC;AAC7C,eAAO,MAAM,eAAe,WAG1B,CAAC;AAEH,MAAM,MAAM,mBAAmB,CAAC,IAAI,EAAE,GAAG,IAAI;KAC1C,GAAG,IAAI,MAAM,IAAI,GAAG,GAAG,SAAS,MAAM,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;CAClE,GAAG,GAAG,CAAC;AAER,MAAM,MAAM,cAAc,CACxB,SAAS,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,IAE1D,SAAS,SAAS,KAAK,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GACvC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,GACjB,SAAS,SAAS,YAAY,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,GAChD,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,GACjB,SAAS,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,12 @@
1
+ // allows to reference interfaces as 'classes' rather than instances
2
+ import { Bool, Field, PublicKey } from "o1js";
3
+ // Because Publickey.empty() is not usable in combination with real
4
+ // cryptographic operations because it's group evaluation isn't defined in Fp,
5
+ // we use some other arbitrary point which we treat as "empty" in our circuits
6
+ // other arbitrary point
7
+ export const EMPTY_PUBLICKEY_X = Field(4600);
8
+ export const EMPTY_PUBLICKEY = PublicKey.fromObject({
9
+ x: EMPTY_PUBLICKEY_X,
10
+ isOdd: Bool(true),
11
+ });
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,OAAO,EAAE,IAAI,EAAgB,KAAK,EAAoB,SAAS,EAAE,MAAM,MAAM,CAAC;AAmC9E,mEAAmE;AACnE,+EAA+E;AAC/E,8EAA8E;AAC9E,wBAAwB;AACxB,MAAM,CAAC,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,eAAe,GAAG,SAAS,CAAC,UAAU,CAAC;IAClD,CAAC,EAAE,iBAAiB;IACpB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC;CAClB,CAAC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { Field, FlexibleProvablePure, DynamicProof, Proof } from "o1js";
2
+ import { TypedClass } from "./types";
3
+ export declare function requireTrue(condition: boolean, errorOrFunction: Error | (() => Error)): void;
4
+ /**
5
+ * Utility function to split an array of type T into a record <K, T[]> based on a
6
+ * function T => K that determines the key of each record
7
+ */
8
+ export declare function splitArray<T, K extends string | number>(arr: T[], split: (t: T) => K): Record<K, T[] | undefined>;
9
+ export declare function range(startOrEnd: number, endOrNothing?: number | undefined): number[];
10
+ export declare function reduceSequential<T, U>(array: T[], callbackfn: (previousValue: U, currentValue: T, currentIndex: number, array: T[]) => Promise<U>, initialValue: U): Promise<U>;
11
+ export declare function mapSequential<T, R>(array: T[], f: (element: T, index: number, array: T[]) => Promise<R>): Promise<R[]>;
12
+ /**
13
+ * Computes a dummy value for the given value type.
14
+ *
15
+ * @param valueType - Value type to generate the dummy value for
16
+ * @returns Dummy value for the given value type
17
+ */
18
+ export declare function dummyValue<Value>(valueType: FlexibleProvablePure<Value>): Value;
19
+ export declare function noop(): void;
20
+ export interface ToFieldable {
21
+ toFields: () => Field[];
22
+ }
23
+ export interface ToFieldableStatic {
24
+ toFields: (value: unknown) => Field[];
25
+ }
26
+ export interface ToJSONableStatic {
27
+ toJSON: (value: unknown) => any;
28
+ }
29
+ export type ProofTypes = typeof Proof<unknown, unknown> | typeof DynamicProof<unknown, unknown>;
30
+ export declare function sleep(ms: number): Promise<void>;
31
+ export declare function filterNonNull<Type>(value: Type | null): value is Type;
32
+ export declare function filterNonUndefined<Type>(value: Type | undefined): value is Type;
33
+ export declare function prefixToField(prefix: string): Field;
34
+ export declare function hashWithPrefix(prefix: string, input: Field[]): import("o1js/dist/node/lib/provable/field").Field;
35
+ export declare function expectDefined<T>(value: T | undefined): asserts value is T;
36
+ type NonMethodKeys<Type> = {
37
+ [Key in keyof Type]: Type[Key] extends Function ? never : Key;
38
+ }[keyof Type];
39
+ export type NonMethods<Type> = Pick<Type, NonMethodKeys<Type>>;
40
+ export declare const MAX_FIELD: import("o1js/dist/node/lib/provable/field").Field;
41
+ /**
42
+ * Returns a boolean indicating whether a given class is a subclass of another class,
43
+ * indicated by the name parameter.
44
+ */
45
+ export declare function isSubtypeOfName(clas: TypedClass<unknown>, name: string): boolean;
46
+ export declare function safeParseJson<T>(json: string): T;
47
+ export {};
48
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/dist/utils.js ADDED
@@ -0,0 +1,113 @@
1
+ import { Field, Poseidon, } from "o1js";
2
+ export function requireTrue(condition, errorOrFunction) {
3
+ if (!condition) {
4
+ throw typeof errorOrFunction === "function"
5
+ ? errorOrFunction()
6
+ : errorOrFunction;
7
+ }
8
+ }
9
+ /**
10
+ * Utility function to split an array of type T into a record <K, T[]> based on a
11
+ * function T => K that determines the key of each record
12
+ */
13
+ export function splitArray(arr, split) {
14
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
15
+ const record = {};
16
+ arr.forEach((element) => {
17
+ const k = split(element);
18
+ if (record[k] !== undefined) {
19
+ record[k].push(element);
20
+ }
21
+ else {
22
+ record[k] = [element];
23
+ }
24
+ });
25
+ return record;
26
+ }
27
+ export function range(startOrEnd, endOrNothing) {
28
+ let end = endOrNothing;
29
+ let start = startOrEnd;
30
+ if (end === undefined) {
31
+ end = startOrEnd;
32
+ start = 0;
33
+ }
34
+ return Array.from({ length: end - start }, (ignored, index) => index + start);
35
+ }
36
+ export function reduceSequential(array, callbackfn, initialValue) {
37
+ return array.reduce(async (previousPromise, current, index, arr) => {
38
+ const previous = await previousPromise;
39
+ return await callbackfn(previous, current, index, arr);
40
+ }, Promise.resolve(initialValue));
41
+ }
42
+ export function mapSequential(array, f) {
43
+ return array.reduce(async (r, element, index, a) => {
44
+ const ret = await r;
45
+ const next = await f(element, index, a);
46
+ ret.push(next);
47
+ return ret;
48
+ }, Promise.resolve([]));
49
+ }
50
+ /**
51
+ * Computes a dummy value for the given value type.
52
+ *
53
+ * @param valueType - Value type to generate the dummy value for
54
+ * @returns Dummy value for the given value type
55
+ */
56
+ export function dummyValue(valueType) {
57
+ const length = valueType.sizeInFields();
58
+ const fields = Array.from({ length }, () => Field(0));
59
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
60
+ return valueType.fromFields(fields);
61
+ }
62
+ export function noop() { }
63
+ export async function sleep(ms) {
64
+ await new Promise((resolve) => {
65
+ setTimeout(resolve, ms);
66
+ });
67
+ }
68
+ export function filterNonNull(value) {
69
+ return value !== null;
70
+ }
71
+ export function filterNonUndefined(value) {
72
+ return value !== undefined;
73
+ }
74
+ const encoder = new TextEncoder();
75
+ // Copied from o1js binable.ts:317
76
+ export function prefixToField(prefix) {
77
+ const fieldSize = Field.sizeInBytes;
78
+ if (prefix.length >= fieldSize)
79
+ throw Error("prefix too long");
80
+ const stringBytes = [...encoder.encode(prefix)];
81
+ return Field.fromBytes(stringBytes.concat(Array(fieldSize - stringBytes.length).fill(0)));
82
+ }
83
+ export function hashWithPrefix(prefix, input) {
84
+ const salt = Poseidon.update([Field(0), Field(0), Field(0)], [prefixToField(prefix)]);
85
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
86
+ return Poseidon.update(salt, input)[0];
87
+ }
88
+ // end copy
89
+ export function expectDefined(value) {
90
+ expect(value).toBeDefined();
91
+ }
92
+ export const MAX_FIELD = Field(Field.ORDER - 1n);
93
+ /**
94
+ * Returns a boolean indicating whether a given class is a subclass of another class,
95
+ * indicated by the name parameter.
96
+ */
97
+ // TODO Change to class reference based comparisons
98
+ export function isSubtypeOfName(clas, name) {
99
+ if (clas === undefined || clas === null) {
100
+ return false;
101
+ }
102
+ if (clas.name === name) {
103
+ return true;
104
+ }
105
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
106
+ return isSubtypeOfName(Object.getPrototypeOf(clas), name);
107
+ }
108
+ // TODO Eventually, replace this by a schema validation library
109
+ export function safeParseJson(json) {
110
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
111
+ return JSON.parse(json);
112
+ }
113
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}