@proto-kit/common 0.1.1-develop.165 → 0.1.1-develop.1665

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 (249) hide show
  1. package/dist/compiling/AtomicCompileHelper.d.ts +13 -0
  2. package/dist/compiling/AtomicCompileHelper.d.ts.map +1 -0
  3. package/dist/compiling/AtomicCompileHelper.js +40 -0
  4. package/dist/compiling/AtomicCompileHelper.js.map +1 -0
  5. package/dist/compiling/CompilableModule.d.ts +6 -0
  6. package/dist/compiling/CompilableModule.d.ts.map +1 -0
  7. package/dist/compiling/CompilableModule.js +2 -0
  8. package/dist/compiling/CompilableModule.js.map +1 -0
  9. package/dist/compiling/CompileRegistry.d.ts +26 -0
  10. package/dist/compiling/CompileRegistry.d.ts.map +1 -0
  11. package/dist/compiling/CompileRegistry.js +69 -0
  12. package/dist/compiling/CompileRegistry.js.map +1 -0
  13. package/dist/compiling/services/ChildVerificationKeyService.d.ts +10 -0
  14. package/dist/compiling/services/ChildVerificationKeyService.d.ts.map +1 -0
  15. package/dist/compiling/services/ChildVerificationKeyService.js +27 -0
  16. package/dist/compiling/services/ChildVerificationKeyService.js.map +1 -0
  17. package/dist/config/ChildContainerCreatable.d.ts +5 -0
  18. package/dist/config/ChildContainerCreatable.d.ts.map +1 -0
  19. package/dist/config/ChildContainerCreatable.js +2 -0
  20. package/dist/config/ChildContainerCreatable.js.map +1 -0
  21. package/dist/config/ChildContainerProvider.d.ts +5 -0
  22. package/dist/config/ChildContainerProvider.d.ts.map +1 -0
  23. package/dist/config/ChildContainerProvider.js +2 -0
  24. package/dist/config/ChildContainerProvider.js.map +1 -0
  25. package/dist/config/ConfigurableModule.d.ts +6 -2
  26. package/dist/config/ConfigurableModule.d.ts.map +1 -1
  27. package/dist/config/ConfigurableModule.js +5 -0
  28. package/dist/config/ConfigurableModule.js.map +1 -0
  29. package/dist/config/ModuleContainer.d.ts +70 -17
  30. package/dist/config/ModuleContainer.d.ts.map +1 -1
  31. package/dist/config/ModuleContainer.js +164 -22
  32. package/dist/config/ModuleContainer.js.map +1 -0
  33. package/dist/config/Startable.d.ts +4 -0
  34. package/dist/config/Startable.d.ts.map +1 -0
  35. package/dist/config/Startable.js +2 -0
  36. package/dist/config/Startable.js.map +1 -0
  37. package/dist/config/injectAlias.d.ts +18 -0
  38. package/dist/config/injectAlias.d.ts.map +1 -0
  39. package/dist/config/injectAlias.js +47 -0
  40. package/dist/config/injectAlias.js.map +1 -0
  41. package/dist/dependencyFactory/DependencyFactory.d.ts +29 -0
  42. package/dist/dependencyFactory/DependencyFactory.d.ts.map +1 -0
  43. package/dist/dependencyFactory/DependencyFactory.js +2 -0
  44. package/dist/dependencyFactory/DependencyFactory.js.map +1 -0
  45. package/dist/dummyVerificationKey.d.ts +3 -0
  46. package/dist/dummyVerificationKey.d.ts.map +1 -0
  47. package/dist/dummyVerificationKey.js +8 -0
  48. package/dist/dummyVerificationKey.js.map +1 -0
  49. package/dist/events/EventEmitter.d.ts +19 -0
  50. package/dist/events/EventEmitter.d.ts.map +1 -0
  51. package/dist/events/EventEmitter.js +35 -0
  52. package/dist/events/EventEmitter.js.map +1 -0
  53. package/dist/events/EventEmitterProxy.d.ts +18 -0
  54. package/dist/events/EventEmitterProxy.d.ts.map +1 -0
  55. package/dist/events/EventEmitterProxy.js +35 -0
  56. package/dist/events/EventEmitterProxy.js.map +1 -0
  57. package/dist/events/EventEmittingComponent.d.ts +9 -0
  58. package/dist/events/EventEmittingComponent.d.ts.map +1 -0
  59. package/dist/events/EventEmittingComponent.js +2 -0
  60. package/dist/events/EventEmittingComponent.js.map +1 -0
  61. package/dist/events/ReplayingSingleUseEventEmitter.d.ts +17 -0
  62. package/dist/events/ReplayingSingleUseEventEmitter.d.ts.map +1 -0
  63. package/dist/events/ReplayingSingleUseEventEmitter.js +34 -0
  64. package/dist/events/ReplayingSingleUseEventEmitter.js.map +1 -0
  65. package/dist/index.d.ts +24 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js +25 -2
  68. package/dist/index.js.map +1 -0
  69. package/dist/log.d.ts +37 -0
  70. package/dist/log.d.ts.map +1 -0
  71. package/dist/log.js +114 -0
  72. package/dist/log.js.map +1 -0
  73. package/dist/trees/lmt/AbstractLinkedMerkleTree.d.ts +288 -0
  74. package/dist/trees/lmt/AbstractLinkedMerkleTree.d.ts.map +1 -0
  75. package/dist/trees/lmt/AbstractLinkedMerkleTree.js +22 -0
  76. package/dist/trees/lmt/AbstractLinkedMerkleTree.js.map +1 -0
  77. package/dist/trees/lmt/InMemoryLinkedLeafStore.d.ts +21 -0
  78. package/dist/trees/lmt/InMemoryLinkedLeafStore.d.ts.map +1 -0
  79. package/dist/trees/lmt/InMemoryLinkedLeafStore.js +26 -0
  80. package/dist/trees/lmt/InMemoryLinkedLeafStore.js.map +1 -0
  81. package/dist/trees/lmt/LinkedLeafStore.d.ts +16 -0
  82. package/dist/trees/lmt/LinkedLeafStore.d.ts.map +1 -0
  83. package/dist/trees/lmt/LinkedLeafStore.js +2 -0
  84. package/dist/trees/lmt/LinkedLeafStore.js.map +1 -0
  85. package/dist/trees/lmt/LinkedMerkleTree.d.ts +11 -0
  86. package/dist/trees/lmt/LinkedMerkleTree.d.ts.map +1 -0
  87. package/dist/trees/lmt/LinkedMerkleTree.js +241 -0
  88. package/dist/trees/lmt/LinkedMerkleTree.js.map +1 -0
  89. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.d.ts +113 -0
  90. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.d.ts.map +1 -0
  91. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.js +113 -0
  92. package/dist/trees/lmt/LinkedMerkleTreeCircuitOps.js.map +1 -0
  93. package/dist/trees/lmt/LinkedMerkleTreeTypes.d.ts +74 -0
  94. package/dist/trees/lmt/LinkedMerkleTreeTypes.d.ts.map +1 -0
  95. package/dist/trees/lmt/LinkedMerkleTreeTypes.js +50 -0
  96. package/dist/trees/lmt/LinkedMerkleTreeTypes.js.map +1 -0
  97. package/dist/trees/sparse/InMemoryMerkleTreeStorage.d.ts +11 -0
  98. package/dist/trees/sparse/InMemoryMerkleTreeStorage.d.ts.map +1 -0
  99. package/dist/trees/sparse/InMemoryMerkleTreeStorage.js +13 -0
  100. package/dist/trees/sparse/InMemoryMerkleTreeStorage.js.map +1 -0
  101. package/dist/trees/sparse/MerkleTreeStore.d.ts +5 -0
  102. package/dist/trees/sparse/MerkleTreeStore.d.ts.map +1 -0
  103. package/dist/trees/sparse/MerkleTreeStore.js +2 -0
  104. package/dist/trees/sparse/MerkleTreeStore.js.map +1 -0
  105. package/dist/trees/sparse/MockAsyncMerkleStore.d.ts +9 -0
  106. package/dist/trees/sparse/MockAsyncMerkleStore.d.ts.map +1 -0
  107. package/dist/trees/sparse/MockAsyncMerkleStore.js +20 -0
  108. package/dist/trees/sparse/MockAsyncMerkleStore.js.map +1 -0
  109. package/dist/trees/sparse/RollupMerkleTree.d.ts +157 -0
  110. package/dist/trees/sparse/RollupMerkleTree.d.ts.map +1 -0
  111. package/dist/trees/sparse/RollupMerkleTree.js +272 -0
  112. package/dist/trees/sparse/RollupMerkleTree.js.map +1 -0
  113. package/dist/types.d.ts +16 -0
  114. package/dist/types.d.ts.map +1 -1
  115. package/dist/types.js +12 -1
  116. package/dist/types.js.map +1 -0
  117. package/dist/utils.d.ts +62 -0
  118. package/dist/utils.d.ts.map +1 -1
  119. package/dist/utils.js +155 -0
  120. package/dist/utils.js.map +1 -0
  121. package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts +4 -3
  122. package/dist/zkProgrammable/ProvableMethodExecutionContext.d.ts.map +1 -1
  123. package/dist/zkProgrammable/ProvableMethodExecutionContext.js +2 -3
  124. package/dist/zkProgrammable/ProvableMethodExecutionContext.js.map +1 -0
  125. package/dist/zkProgrammable/ZkProgrammable.d.ts +15 -7
  126. package/dist/zkProgrammable/ZkProgrammable.d.ts.map +1 -1
  127. package/dist/zkProgrammable/ZkProgrammable.js +34 -15
  128. package/dist/zkProgrammable/ZkProgrammable.js.map +1 -0
  129. package/dist/zkProgrammable/provableMethod.d.ts +8 -5
  130. package/dist/zkProgrammable/provableMethod.d.ts.map +1 -1
  131. package/dist/zkProgrammable/provableMethod.js +15 -13
  132. package/dist/zkProgrammable/provableMethod.js.map +1 -0
  133. package/jest.config.cjs +12 -1
  134. package/package.json +8 -7
  135. package/src/compiling/AtomicCompileHelper.ts +62 -0
  136. package/src/compiling/CompilableModule.ts +6 -0
  137. package/src/compiling/CompileRegistry.ts +79 -0
  138. package/src/compiling/services/ChildVerificationKeyService.ts +26 -0
  139. package/src/config/ChildContainerCreatable.ts +5 -0
  140. package/src/config/ChildContainerProvider.ts +5 -0
  141. package/src/config/ConfigurableModule.ts +15 -2
  142. package/src/config/ModuleContainer.ts +287 -46
  143. package/src/config/Startable.ts +3 -0
  144. package/src/config/injectAlias.ts +70 -0
  145. package/src/dependencyFactory/DependencyFactory.ts +57 -0
  146. package/src/dummyVerificationKey.ts +10 -0
  147. package/src/events/EventEmitter.ts +61 -0
  148. package/src/events/EventEmitterProxy.ts +81 -0
  149. package/src/events/EventEmittingComponent.ts +11 -0
  150. package/src/events/ReplayingSingleUseEventEmitter.ts +42 -0
  151. package/src/index.ts +24 -2
  152. package/src/log.ts +143 -0
  153. package/src/trees/lmt/AbstractLinkedMerkleTree.ts +102 -0
  154. package/src/trees/lmt/InMemoryLinkedLeafStore.ts +42 -0
  155. package/src/trees/lmt/LinkedLeafStore.ts +13 -0
  156. package/src/trees/lmt/LinkedMerkleTree.ts +335 -0
  157. package/src/trees/lmt/LinkedMerkleTreeCircuitOps.ts +188 -0
  158. package/src/trees/lmt/LinkedMerkleTreeTypes.ts +53 -0
  159. package/src/trees/sparse/InMemoryMerkleTreeStorage.ts +17 -0
  160. package/src/trees/sparse/MerkleTreeStore.ts +5 -0
  161. package/src/trees/sparse/MockAsyncMerkleStore.ts +30 -0
  162. package/src/trees/sparse/RollupMerkleTree.ts +427 -0
  163. package/src/types.ts +43 -2
  164. package/src/utils.ts +287 -0
  165. package/src/zkProgrammable/ProvableMethodExecutionContext.ts +6 -6
  166. package/src/zkProgrammable/ZkProgrammable.ts +61 -29
  167. package/src/zkProgrammable/provableMethod.ts +38 -21
  168. package/test/config/ContainerEvents.test.ts +65 -0
  169. package/test/config/ModuleContainer.test.ts +146 -15
  170. package/test/config/injectAlias.test.ts +28 -0
  171. package/test/trees/LinkedMerkleTree.test.ts +124 -0
  172. package/test/trees/LinkedMerkleTreeCircuitOps.test.ts +147 -0
  173. package/test/trees/MerkleTree.test.ts +220 -0
  174. package/test/tsconfig.json +5 -2
  175. package/test/zkProgrammable/ZkProgrammable.test.ts +135 -114
  176. package/tsconfig.json +1 -1
  177. package/dist/Constants.d.ts +0 -4
  178. package/dist/Constants.d.ts.map +0 -1
  179. package/dist/Constants.js +0 -3
  180. package/dist/config/ConfigurationAggregator.d.ts +0 -10
  181. package/dist/config/ConfigurationAggregator.d.ts.map +0 -1
  182. package/dist/config/ConfigurationAggregator.js +0 -35
  183. package/dist/config/ConfigurationReceiver.d.ts +0 -25
  184. package/dist/config/ConfigurationReceiver.d.ts.map +0 -1
  185. package/dist/config/ConfigurationReceiver.js +0 -36
  186. package/dist/config/types.d.ts +0 -2
  187. package/dist/config/types.d.ts.map +0 -1
  188. package/dist/config/types.js +0 -1
  189. package/dist/model/MethodPublicInput.d.ts +0 -51
  190. package/dist/model/MethodPublicInput.d.ts.map +0 -1
  191. package/dist/model/MethodPublicInput.js +0 -11
  192. package/dist/model/Option.d.ts +0 -89
  193. package/dist/model/Option.d.ts.map +0 -1
  194. package/dist/model/Option.js +0 -86
  195. package/dist/model/Path.d.ts +0 -31
  196. package/dist/model/Path.d.ts.map +0 -1
  197. package/dist/model/Path.js +0 -44
  198. package/dist/model/StateTransition.d.ts +0 -85
  199. package/dist/model/StateTransition.d.ts.map +0 -1
  200. package/dist/model/StateTransition.js +0 -58
  201. package/dist/model/StateTransitionProvableBatch.d.ts +0 -56
  202. package/dist/model/StateTransitionProvableBatch.d.ts.map +0 -1
  203. package/dist/model/StateTransitionProvableBatch.js +0 -20
  204. package/dist/prover/block/BlockProver.d.ts +0 -199
  205. package/dist/prover/block/BlockProver.d.ts.map +0 -1
  206. package/dist/prover/block/BlockProver.js +0 -119
  207. package/dist/prover/block/BlockScopedModule.d.ts +0 -3
  208. package/dist/prover/block/BlockScopedModule.d.ts.map +0 -1
  209. package/dist/prover/block/BlockScopedModule.js +0 -6
  210. package/dist/prover/statetransition/StateTransitionProver.d.ts +0 -92
  211. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +0 -1
  212. package/dist/prover/statetransition/StateTransitionProver.js +0 -127
  213. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +0 -16
  214. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +0 -1
  215. package/dist/prover/statetransition/StateTransitionWitnessProvider.js +0 -17
  216. package/dist/src/model/Option.d.ts +0 -158
  217. package/dist/src/model/Option.d.ts.map +0 -1
  218. package/dist/src/model/Option.js +0 -53
  219. package/dist/src/model/Path.d.ts +0 -35
  220. package/dist/src/model/Path.d.ts.map +0 -1
  221. package/dist/src/model/Path.js +0 -51
  222. package/dist/src/model/StateTransition.d.ts +0 -201
  223. package/dist/src/model/StateTransition.d.ts.map +0 -1
  224. package/dist/src/model/StateTransition.js +0 -43
  225. package/dist/src/utils/PrefixedHashList.d.ts +0 -15
  226. package/dist/src/utils/PrefixedHashList.d.ts.map +0 -1
  227. package/dist/src/utils/PrefixedHashList.js +0 -28
  228. package/dist/src/utils/ProvableHashList.d.ts +0 -30
  229. package/dist/src/utils/ProvableHashList.d.ts.map +0 -1
  230. package/dist/src/utils/ProvableHashList.js +0 -43
  231. package/dist/utils/PrefixedHashList.d.ts +0 -14
  232. package/dist/utils/PrefixedHashList.d.ts.map +0 -1
  233. package/dist/utils/PrefixedHashList.js +0 -12
  234. package/dist/utils/PrefixedProvableHashList.d.ts +0 -8
  235. package/dist/utils/PrefixedProvableHashList.d.ts.map +0 -1
  236. package/dist/utils/PrefixedProvableHashList.js +0 -12
  237. package/dist/utils/ProvableHashList.d.ts +0 -26
  238. package/dist/utils/ProvableHashList.d.ts.map +0 -1
  239. package/dist/utils/ProvableHashList.js +0 -35
  240. package/dist/utils/Utils.d.ts +0 -22
  241. package/dist/utils/Utils.d.ts.map +0 -1
  242. package/dist/utils/Utils.js +0 -41
  243. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +0 -26
  244. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +0 -1
  245. package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +0 -79
  246. package/dist/utils/merkletree/RollupMerkleTree.d.ts +0 -143
  247. package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +0 -1
  248. package/dist/utils/merkletree/RollupMerkleTree.js +0 -246
  249. package/tsconfig.test.json +0 -9
@@ -0,0 +1,81 @@
1
+ import type {
2
+ BaseModuleType,
3
+ ModuleContainer,
4
+ ModulesRecord,
5
+ } from "../config/ModuleContainer";
6
+ import { StringKeyOf, UnionToIntersection } from "../types";
7
+
8
+ import { EventEmitter } from "./EventEmitter";
9
+ import {
10
+ EventEmittingComponent,
11
+ EventEmittingContainer,
12
+ EventsRecord,
13
+ } from "./EventEmittingComponent";
14
+
15
+ export type CastToEventsRecord<Record> = Record extends EventsRecord
16
+ ? Record
17
+ : {};
18
+
19
+ export type ModuleEvents<ModuleType extends BaseModuleType> =
20
+ InstanceType<ModuleType> extends EventEmittingComponent<infer Events>
21
+ ? Events
22
+ : InstanceType<ModuleType> extends ModuleContainer<infer NestedModules>
23
+ ? CastToEventsRecord<ContainerEvents<NestedModules>>
24
+ : // &
25
+ // (InstanceType<ModuleType> extends EventEmittingContainer<
26
+ // infer ContainerEvents
27
+ // >
28
+ // ? ContainerEvents
29
+ // : {})
30
+ EventsRecord;
31
+
32
+ export type ContainerEvents<Modules extends ModulesRecord> = {
33
+ [Key in StringKeyOf<Modules>]: ModuleEvents<Modules[Key]>;
34
+ };
35
+
36
+ export type FlattenObject<Target extends Record<string, EventsRecord>> =
37
+ UnionToIntersection<Target[keyof Target]>;
38
+
39
+ export type FlattenedContainerEvents<Modules extends ModulesRecord> =
40
+ FlattenObject<ContainerEvents<Modules>>; // & FlattenObject<any>;
41
+
42
+ export class EventEmitterProxy<
43
+ Modules extends ModulesRecord,
44
+ > extends EventEmitter<CastToEventsRecord<FlattenedContainerEvents<Modules>>> {
45
+ public constructor(private readonly container: ModuleContainer<Modules>) {
46
+ super();
47
+ container.moduleNames.forEach((moduleName) => {
48
+ if (container.isValidModuleName(container.definition, moduleName)) {
49
+ const module = container.resolve(moduleName);
50
+ if (this.isEventEmitter(module)) {
51
+ module.events.onAll((events: any, args: any[]) => {
52
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
53
+ this.emit(events, ...args);
54
+ });
55
+ }
56
+ if (this.isEventEmittingContainer(module)) {
57
+ module.containerEvents.onAll((events: any, args: any[]) => {
58
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-argument
59
+ this.emit(events, ...args);
60
+ });
61
+ }
62
+ }
63
+ });
64
+ }
65
+
66
+ private isEventEmittingContainer(
67
+ module: any
68
+ ): module is EventEmittingContainer<EventsRecord> {
69
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
70
+ const emitter = module.containerEvents;
71
+ return emitter !== undefined && emitter instanceof EventEmitter;
72
+ }
73
+
74
+ private isEventEmitter(
75
+ module: any
76
+ ): module is EventEmittingComponent<EventsRecord> {
77
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
78
+ const emitter = module.events;
79
+ return emitter !== undefined && emitter instanceof EventEmitter;
80
+ }
81
+ }
@@ -0,0 +1,11 @@
1
+ import type { EventEmitter } from "./EventEmitter";
2
+
3
+ export type EventsRecord = Record<string, unknown[]>;
4
+
5
+ export interface EventEmittingComponent<Events extends EventsRecord> {
6
+ events: EventEmitter<Events>;
7
+ }
8
+
9
+ export interface EventEmittingContainer<Events extends EventsRecord> {
10
+ containerEvents: EventEmitter<Events>;
11
+ }
@@ -0,0 +1,42 @@
1
+ import { EventsRecord } from "./EventEmittingComponent";
2
+ import { EventEmitter } from "./EventEmitter";
3
+
4
+ /**
5
+ * Event Emitter variant that emits a certain event only once to a registered listener.
6
+ * Additionally, if a listener registers to a event that has already been emitted, it
7
+ * re-emits it to said listener.
8
+ * This pattern is especially useful for listening for inclusions of transactions.
9
+ * Those events will only occur once, and listeners could come too late to the party,
10
+ * so we need to make sure they get notified as well in those cases.
11
+ */
12
+ export class ReplayingSingleUseEventEmitter<
13
+ Events extends EventsRecord,
14
+ > extends EventEmitter<Events> {
15
+ public emitted: Partial<Events> = {};
16
+
17
+ public emit<Key extends keyof Events>(
18
+ event: Key,
19
+ ...parameters: Events[Key]
20
+ ) {
21
+ super.emit(event, ...parameters);
22
+ this.emitted[event] = parameters;
23
+ this.listeners[event] = [];
24
+ }
25
+
26
+ public onAll(listener: (event: keyof Events, args: unknown[]) => void) {
27
+ Object.entries(this.emitted).forEach(([key, params]) => {
28
+ if (params !== undefined) listener(key, params);
29
+ });
30
+ super.onAll(listener);
31
+ }
32
+
33
+ public on<Key extends keyof Events>(
34
+ event: Key,
35
+ listener: (...args: Events[Key]) => void
36
+ ) {
37
+ if (this.emitted[event] !== undefined) {
38
+ listener(...this.emitted[event]!);
39
+ }
40
+ super.on(event, listener);
41
+ }
42
+ }
package/src/index.ts CHANGED
@@ -1,9 +1,31 @@
1
1
  export * from "./config/ModuleContainer";
2
2
  export * from "./config/ConfigurableModule";
3
+ export * from "./config/ChildContainerProvider";
4
+ export * from "./config/ChildContainerCreatable";
5
+ export * from "./config/injectAlias";
6
+ export * from "./config/Startable";
3
7
  export * from "./types";
4
8
  export * from "./zkProgrammable/ZkProgrammable";
5
9
  export * from "./zkProgrammable/ProvableMethodExecutionContext";
6
10
  export * from "./zkProgrammable/provableMethod";
7
11
  export * from "./utils";
8
- // eslint-disable-next-line import/no-unused-modules
9
- export { default as log } from "loglevel";
12
+ export * from "./dependencyFactory/DependencyFactory";
13
+ export * from "./log";
14
+ export * from "./events/EventEmittingComponent";
15
+ export * from "./events/EventEmitter";
16
+ export * from "./trees/sparse/MerkleTreeStore";
17
+ export * from "./trees/sparse/InMemoryMerkleTreeStorage";
18
+ export * from "./trees/sparse/RollupMerkleTree";
19
+ export * from "./trees/lmt/LinkedLeafStore";
20
+ export * from "./trees/lmt/LinkedMerkleTree";
21
+ export * from "./trees/lmt/InMemoryLinkedLeafStore";
22
+ export * from "./trees/lmt/LinkedMerkleTreeCircuitOps";
23
+ export * from "./trees/lmt/AbstractLinkedMerkleTree";
24
+ export * from "./trees/lmt/LinkedMerkleTreeTypes";
25
+ export * from "./events/EventEmitterProxy";
26
+ export * from "./events/ReplayingSingleUseEventEmitter";
27
+ export * from "./trees/sparse/MockAsyncMerkleStore";
28
+ export * from "./compiling/AtomicCompileHelper";
29
+ export * from "./compiling/CompileRegistry";
30
+ export * from "./compiling/CompilableModule";
31
+ export * from "./compiling/services/ChildVerificationKeyService";
package/src/log.ts ADDED
@@ -0,0 +1,143 @@
1
+ import loglevel, { LogLevelDesc, LogLevelNames } from "loglevel";
2
+ import { Provable } from "o1js";
3
+
4
+ /* eslint-disable @typescript-eslint/no-unsafe-argument */
5
+ function logProvable(
6
+ logFunction: (...args: unknown[]) => void,
7
+ ...args: any[]
8
+ ) {
9
+ Provable.asProver(() => {
10
+ const prettyArguments: string[] = [];
11
+
12
+ args.forEach((argument) => {
13
+ if (argument?.toPretty !== undefined) {
14
+ prettyArguments.push(argument.toPretty());
15
+ } else {
16
+ try {
17
+ prettyArguments.push(JSON.parse(JSON.stringify(argument)));
18
+ } catch {
19
+ prettyArguments.push(argument);
20
+ }
21
+ }
22
+ });
23
+ logFunction(...prettyArguments);
24
+ });
25
+ }
26
+ /* eslint-enable */
27
+
28
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
29
+ if (process.env?.IN_CI ?? false) {
30
+ loglevel.setLevel("ERROR");
31
+ }
32
+
33
+ const timeMap: Record<string, number> = {};
34
+
35
+ function time(label = "time") {
36
+ timeMap[label] = Date.now();
37
+ }
38
+
39
+ function timeLog(label = "time"): string {
40
+ const prev = timeMap[label];
41
+ if (prev === undefined) {
42
+ return "Label not found";
43
+ }
44
+ return `${label} took ${Date.now() - prev}ms`;
45
+ }
46
+
47
+ function timeEnd(label = "time"): string {
48
+ const str = timeLog(label);
49
+ delete timeMap[label];
50
+ return str;
51
+ }
52
+
53
+ export const log = {
54
+ provable: {
55
+ info: (...args: unknown[]) => {
56
+ logProvable(loglevel.info, ...args);
57
+ },
58
+
59
+ debug: (...args: unknown[]) => {
60
+ logProvable(loglevel.debug, ...args);
61
+ },
62
+
63
+ error: (...args: unknown[]) => {
64
+ logProvable(loglevel.error, ...args);
65
+ },
66
+
67
+ trace: (...args: unknown[]) => {
68
+ logProvable(log.trace, ...args);
69
+ },
70
+
71
+ warn: (...args: unknown[]) => {
72
+ logProvable(loglevel.warn, ...args);
73
+ },
74
+ },
75
+
76
+ time,
77
+
78
+ timeLog: {
79
+ info: (label?: string) => loglevel.info(timeLog(label)),
80
+ debug: (label?: string) => loglevel.debug(timeLog(label)),
81
+ error: (label?: string) => loglevel.error(timeLog(label)),
82
+ trace: (label?: string) => loglevel.trace(timeLog(label)),
83
+ warn: (label?: string) => loglevel.warn(timeLog(label)),
84
+ },
85
+
86
+ timeEnd: {
87
+ info: (label?: string) => loglevel.info(timeEnd(label)),
88
+ debug: (label?: string) => loglevel.debug(timeEnd(label)),
89
+ error: (label?: string) => loglevel.error(timeEnd(label)),
90
+ trace: (label?: string) => loglevel.trace(timeEnd(label)),
91
+ warn: (label?: string) => loglevel.warn(timeEnd(label)),
92
+ },
93
+
94
+ info: (...args: unknown[]) => {
95
+ loglevel.info(...args);
96
+ },
97
+
98
+ debug: (...args: unknown[]) => {
99
+ loglevel.debug(...args);
100
+ },
101
+
102
+ error: (...args: unknown[]) => {
103
+ loglevel.error(...args);
104
+ },
105
+
106
+ trace: (...args: unknown[]) => {
107
+ // Loglevel prints the stack trace by default. To still be able to use trace
108
+ // inside out application, we use the level, but call debug() under the hood
109
+ if (loglevel.getLevel() <= loglevel.levels.TRACE) {
110
+ loglevel.debug(...args);
111
+ }
112
+ },
113
+
114
+ warn: (...args: unknown[]) => {
115
+ loglevel.warn(...args);
116
+ },
117
+
118
+ setLevel: (level: LogLevelDesc) => {
119
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
120
+ if (!(process.env?.IN_CI ?? false)) {
121
+ loglevel.setLevel(level);
122
+ }
123
+ },
124
+
125
+ get levels() {
126
+ return loglevel.levels;
127
+ },
128
+
129
+ getLevel: () => loglevel.getLevel(),
130
+ };
131
+
132
+ const validLogLevels = ["TRACE", "DEBUG", "INFO", "WARN", "ERROR", "SILENT"];
133
+
134
+ export function assertValidTextLogLevel(
135
+ level: string | number
136
+ ): asserts level is LogLevelNames {
137
+ if (
138
+ typeof level === "number" ||
139
+ !validLogLevels.includes(level.toUpperCase())
140
+ ) {
141
+ throw new Error(`${level} is not a valid loglevel`);
142
+ }
143
+ }
@@ -0,0 +1,102 @@
1
+ import { Bool, Field, Struct } from "o1js";
2
+
3
+ import { createMerkleTree, RollupMerkleTree } from "../sparse/RollupMerkleTree";
4
+ import { TypedClass } from "../../types";
5
+ import { MerkleTreeStore } from "../sparse/MerkleTreeStore";
6
+
7
+ import { LinkedLeafStore } from "./LinkedLeafStore";
8
+ import { LinkedLeafStruct } from "./LinkedMerkleTreeTypes";
9
+
10
+ class RollupMerkleTreeWitness extends createMerkleTree(40).WITNESS {}
11
+
12
+ type LinkedMerkleWitnessValue = {
13
+ leaf: LinkedLeafStruct;
14
+ merkleWitness: RollupMerkleTreeWitness;
15
+ checkMembership(root: Field, path: Field, value: Field): Bool;
16
+ };
17
+
18
+ // We use the RollupMerkleTreeWitness here, although we will actually implement
19
+ // the RollupMerkleTreeWitnessV2 defined below when instantiating the class.
20
+ class LinkedMerkleWitnessTemplate extends Struct({
21
+ leaf: LinkedLeafStruct,
22
+ merkleWitness: RollupMerkleTreeWitness,
23
+ }) {
24
+ public checkMembership(root: Field, path: Field, value: Field): Bool {
25
+ // Mock implementation for typing
26
+ return Bool(true);
27
+ }
28
+ }
29
+
30
+ type LinkedOperationWitnessValue = {
31
+ leafPrevious: LinkedMerkleWitnessValue;
32
+ leafCurrent: LinkedMerkleWitnessValue;
33
+ };
34
+
35
+ class LinkedOperationWitnessTemplate extends Struct({
36
+ leafPrevious: LinkedMerkleWitnessTemplate,
37
+ leafCurrent: LinkedMerkleWitnessTemplate,
38
+ }) {}
39
+
40
+ export interface AbstractLinkedMerkleTree {
41
+ leafStore: LinkedLeafStore;
42
+
43
+ tree: RollupMerkleTree;
44
+
45
+ /**
46
+ * Returns the root of the [Merkle Tree](https://en.wikipedia.org/wiki/Merkle_tree).
47
+ * @returns The root of the Merkle Tree.
48
+ */
49
+ getRoot(): Field;
50
+
51
+ /**
52
+ * Sets the value of a leaf node at a given index to a given value.
53
+ * @param path of the leaf node.
54
+ * @param value New value.
55
+ */
56
+ setLeaf(path: bigint, value?: bigint): LinkedOperationWitnessValue;
57
+
58
+ setLeaves(batch: { path: bigint; value: bigint }[]): void;
59
+
60
+ /**
61
+ * Returns a leaf which lives at a given path.
62
+ * Errors otherwise.
63
+ * @param path Index of the node.
64
+ * @returns The data of the leaf.
65
+ */
66
+ getLeaf(path: bigint): LinkedLeafStruct | undefined;
67
+
68
+ /**
69
+ * Returns the witness (also known as
70
+ * [Merkle Proof or Merkle Witness](https://computersciencewiki.org/index.php/Merkle_proof))
71
+ * for the leaf at the given path.
72
+ * @param path Position of the leaf node.
73
+ * @returns The witness that belongs to the leaf.
74
+ */
75
+ getReadWitness(path: bigint): LinkedMerkleWitnessValue;
76
+ }
77
+
78
+ export interface AbstractLinkedMerkleTreeClass {
79
+ new (
80
+ store: MerkleTreeStore,
81
+ leafStore: LinkedLeafStore
82
+ ): AbstractLinkedMerkleTree;
83
+
84
+ WITNESS: typeof LinkedOperationWitnessTemplate & {
85
+ fromReadWitness(
86
+ readWitness: LinkedMerkleWitnessTemplate
87
+ ): LinkedOperationWitnessTemplate;
88
+ };
89
+
90
+ READ_WITNESS: typeof LinkedMerkleWitnessTemplate &
91
+ TypedClass<{
92
+ checkMembership(root: Field, path: Field, value: Field): Bool;
93
+ }>;
94
+
95
+ HEIGHT: number;
96
+
97
+ EMPTY_ROOT: Field;
98
+
99
+ dummyWitness(): LinkedOperationWitnessValue;
100
+
101
+ dummyReadWitness(): LinkedMerkleWitnessValue;
102
+ }
@@ -0,0 +1,42 @@
1
+ import { LinkedLeafStore, LinkedLeaf } from "./LinkedLeafStore";
2
+
3
+ export class InMemoryLinkedLeafStore implements LinkedLeafStore {
4
+ public leaves: {
5
+ [key: string]: { leaf: LinkedLeaf; index: bigint };
6
+ } = {};
7
+
8
+ public maximumIndex?: bigint;
9
+
10
+ public getLeaf(
11
+ path: bigint
12
+ ): { leaf: LinkedLeaf; index: bigint } | undefined {
13
+ return this.leaves[path.toString()];
14
+ }
15
+
16
+ public setLeaf(index: bigint, value: LinkedLeaf): void {
17
+ const leaf = this.getLeaf(value.path);
18
+
19
+ if (leaf !== undefined && leaf?.index !== index) {
20
+ throw new Error("Cannot change index of existing leaf");
21
+ }
22
+
23
+ this.leaves[value.path.toString()] = { leaf: value, index: index };
24
+ if (index > (this.maximumIndex ?? -1)) {
25
+ this.maximumIndex = index;
26
+ }
27
+ }
28
+
29
+ public getMaximumIndex(): bigint | undefined {
30
+ return this.maximumIndex;
31
+ }
32
+
33
+ // This gets the leaf with the closest path.
34
+ public getPreviousLeaf(
35
+ path: bigint
36
+ ): { leaf: LinkedLeaf; index: bigint } | undefined {
37
+ return Object.values(this.leaves).find(
38
+ (storedLeaf) =>
39
+ storedLeaf.leaf.nextPath > path && storedLeaf.leaf.path < path
40
+ );
41
+ }
42
+ }
@@ -0,0 +1,13 @@
1
+ export type LinkedLeaf = { value: bigint; path: bigint; nextPath: bigint };
2
+
3
+ export type StoredLeaf = { leaf: LinkedLeaf; index: bigint };
4
+
5
+ export interface LinkedLeafStore {
6
+ setLeaf: (index: bigint, value: LinkedLeaf) => void;
7
+
8
+ getLeaf: (path: bigint) => StoredLeaf | undefined;
9
+
10
+ getPreviousLeaf: (path: bigint) => StoredLeaf | undefined;
11
+
12
+ getMaximumIndex: () => bigint | undefined;
13
+ }