@proto-kit/module 0.1.1-develop.600 → 0.1.1-develop.833

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 (108) hide show
  1. package/LICENSE.md +201 -201
  2. package/dist/method/MethodParameterDecoder.d.ts +10 -10
  3. package/dist/method/MethodParameterDecoder.js +40 -40
  4. package/dist/method/MethodParameterEncoder.d.ts +15 -8
  5. package/dist/method/MethodParameterEncoder.d.ts.map +1 -1
  6. package/dist/method/MethodParameterEncoder.js +122 -48
  7. package/dist/method/runtimeMethod.d.ts +6 -5
  8. package/dist/method/runtimeMethod.d.ts.map +1 -1
  9. package/dist/method/runtimeMethod.js +13 -26
  10. package/dist/runtime/MethodIdResolver.d.ts +7 -0
  11. package/dist/runtime/MethodIdResolver.d.ts.map +1 -1
  12. package/dist/runtime/MethodIdResolver.js +35 -2
  13. package/dist/runtime/Runtime.d.ts +6 -5
  14. package/dist/runtime/Runtime.d.ts.map +1 -1
  15. package/dist/runtime/Runtime.js +29 -22
  16. package/dist/runtime/RuntimeEnvironment.d.ts +2 -2
  17. package/dist/runtime/RuntimeEnvironment.d.ts.map +1 -1
  18. package/dist/runtime/RuntimeModule.d.ts +2 -2
  19. package/dist/runtime/RuntimeModule.d.ts.map +1 -1
  20. package/dist/runtime/RuntimeModule.js +10 -8
  21. package/dist/src/factories/MethodIdFactory.d.ts +10 -0
  22. package/dist/src/factories/MethodIdFactory.d.ts.map +1 -0
  23. package/dist/src/factories/MethodIdFactory.js +10 -0
  24. package/dist/src/index.d.ts +11 -0
  25. package/dist/src/index.d.ts.map +1 -0
  26. package/dist/src/index.js +10 -0
  27. package/dist/src/method/MethodParameterEncoder.d.ts +22 -0
  28. package/dist/src/method/MethodParameterEncoder.d.ts.map +1 -0
  29. package/dist/src/method/MethodParameterEncoder.js +103 -0
  30. package/dist/src/method/runtimeMethod.d.ts +26 -0
  31. package/dist/src/method/runtimeMethod.d.ts.map +1 -0
  32. package/dist/src/method/runtimeMethod.js +164 -0
  33. package/dist/src/module/decorator.d.ts +8 -0
  34. package/dist/src/module/decorator.d.ts.map +1 -0
  35. package/dist/src/module/decorator.js +15 -0
  36. package/dist/src/runtime/MethodIdResolver.d.ts +20 -0
  37. package/dist/src/runtime/MethodIdResolver.d.ts.map +1 -0
  38. package/dist/src/runtime/MethodIdResolver.js +100 -0
  39. package/dist/src/runtime/Runtime.d.ts +71 -0
  40. package/dist/src/runtime/Runtime.d.ts.map +1 -0
  41. package/dist/src/runtime/Runtime.js +215 -0
  42. package/dist/src/runtime/RuntimeEnvironment.d.ts +10 -0
  43. package/dist/src/runtime/RuntimeEnvironment.d.ts.map +1 -0
  44. package/dist/src/runtime/RuntimeEnvironment.js +1 -0
  45. package/dist/src/runtime/RuntimeModule.d.ts +26 -0
  46. package/dist/src/runtime/RuntimeModule.d.ts.map +1 -0
  47. package/dist/src/runtime/RuntimeModule.js +85 -0
  48. package/dist/src/state/InMemoryStateService.d.ts +15 -0
  49. package/dist/src/state/InMemoryStateService.d.ts.map +1 -0
  50. package/dist/src/state/InMemoryStateService.js +28 -0
  51. package/dist/src/state/decorator.d.ts +7 -0
  52. package/dist/src/state/decorator.d.ts.map +1 -0
  53. package/dist/src/state/decorator.js +39 -0
  54. package/dist/state/InMemoryStateService.d.ts +10 -6
  55. package/dist/state/InMemoryStateService.d.ts.map +1 -1
  56. package/dist/state/InMemoryStateService.js +10 -8
  57. package/dist/state/decorator.d.ts.map +1 -1
  58. package/dist/state/decorator.js +0 -3
  59. package/dist/test/Runtime.test.d.ts +2 -0
  60. package/dist/test/Runtime.test.d.ts.map +1 -0
  61. package/dist/test/Runtime.test.js +24 -0
  62. package/dist/test/TestingRuntime.d.ts +7 -0
  63. package/dist/test/TestingRuntime.d.ts.map +1 -0
  64. package/dist/test/TestingRuntime.js +29 -0
  65. package/dist/test/method/runtimeMethod.test.d.ts +2 -0
  66. package/dist/test/method/runtimeMethod.test.d.ts.map +1 -0
  67. package/dist/test/method/runtimeMethod.test.js +30 -0
  68. package/dist/test/modules/Admin.d.ts +10 -0
  69. package/dist/test/modules/Admin.d.ts.map +1 -0
  70. package/dist/test/modules/Admin.js +29 -0
  71. package/dist/test/modules/Balances.d.ts +23 -0
  72. package/dist/test/modules/Balances.d.ts.map +1 -0
  73. package/dist/test/modules/Balances.js +98 -0
  74. package/dist/test/modules/Balances.test.d.ts +2 -0
  75. package/dist/test/modules/Balances.test.d.ts.map +1 -0
  76. package/dist/test/modules/Balances.test.js +201 -0
  77. package/dist/test/modules/MethodIdResolver.test.d.ts +2 -0
  78. package/dist/test/modules/MethodIdResolver.test.d.ts.map +1 -0
  79. package/dist/test/modules/MethodIdResolver.test.js +67 -0
  80. package/dist/test/modules/State.test.d.ts +2 -0
  81. package/dist/test/modules/State.test.d.ts.map +1 -0
  82. package/dist/test/modules/State.test.js +42 -0
  83. package/dist/test/runtimeMethod.test.d.ts +2 -0
  84. package/dist/test/runtimeMethod.test.d.ts.map +1 -0
  85. package/dist/test/runtimeMethod.test.js +50 -0
  86. package/package.json +5 -5
  87. package/src/method/MethodParameterEncoder.ts +192 -81
  88. package/src/method/runtimeMethod.ts +29 -44
  89. package/src/runtime/MethodIdResolver.ts +51 -1
  90. package/src/runtime/Runtime.ts +48 -29
  91. package/src/runtime/RuntimeEnvironment.ts +4 -7
  92. package/src/runtime/RuntimeModule.ts +13 -15
  93. package/src/state/InMemoryStateService.ts +13 -13
  94. package/src/state/decorator.ts +1 -3
  95. package/test/Runtime.test.ts +68 -41
  96. package/test/TestingRuntime.ts +45 -0
  97. package/test/method/MethodParameterEncoder.test.ts +152 -0
  98. package/{src/method/decorator.test.ts → test/method/runtimeMethod.test.ts} +2 -2
  99. package/test/modules/Admin.ts +3 -3
  100. package/test/modules/Balances.test.ts +57 -61
  101. package/test/modules/Balances.ts +15 -18
  102. package/test/modules/{methodId.test.ts → MethodIdResolver.test.ts} +14 -23
  103. package/test/modules/State.test.ts +41 -50
  104. package/test/runtimeMethod.test.ts +19 -32
  105. package/test/tsconfig.json +7 -0
  106. package/tsconfig.json +2 -2
  107. package/test/transaction.test.ts +0 -82
  108. package/tsconfig.test.json +0 -9
@@ -1,6 +1,5 @@
1
- // eslint-disable-next-line max-len
2
- /* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unsafe-assignment,max-lines */
3
- import { Experimental } from "o1js";
1
+ /* eslint-disable @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-argument */
2
+ import { ZkProgram } from "o1js";
4
3
  import { DependencyContainer, injectable } from "tsyringe";
5
4
  import {
6
5
  StringKeyOf,
@@ -10,21 +9,21 @@ import {
10
9
  TypedClass,
11
10
  ZkProgrammable,
12
11
  PlainZkProgram,
13
- WithZkProgrammable,
14
12
  AreProofsEnabled,
15
13
  ChildContainerProvider,
16
14
  } from "@proto-kit/common";
17
15
  import {
18
16
  MethodPublicOutput,
19
17
  StateServiceProvider,
20
- StateService,
18
+ SimpleAsyncStateService,
21
19
  } from "@proto-kit/protocol";
22
20
 
23
21
  import {
24
22
  combineMethodName,
25
23
  isRuntimeMethod,
24
+ runtimeMethodTypeMetadataKey,
26
25
  toWrappedMethod,
27
- WrappedMethod,
26
+ AsyncWrappedMethod,
28
27
  } from "../method/runtimeMethod";
29
28
  import { MethodIdFactory } from "../factories/MethodIdFactory";
30
29
 
@@ -32,6 +31,21 @@ import { RuntimeModule } from "./RuntimeModule";
32
31
  import { MethodIdResolver } from "./MethodIdResolver";
33
32
  import { RuntimeEnvironment } from "./RuntimeEnvironment";
34
33
 
34
+ export function getAllPropertyNames(obj: any) {
35
+ let currentPrototype: any | undefined = obj;
36
+ let keys: (string | symbol)[] = [];
37
+ // if primitive (primitives still have keys) skip the first iteration
38
+ if (!(obj instanceof Object)) {
39
+ currentPrototype = Object.getPrototypeOf(obj);
40
+ }
41
+ // eslint-disable-next-line @typescript-eslint/strict-boolean-expressions
42
+ while (currentPrototype) {
43
+ keys = keys.concat(Reflect.ownKeys(currentPrototype));
44
+ currentPrototype = Object.getPrototypeOf(currentPrototype);
45
+ }
46
+ return keys;
47
+ }
48
+
35
49
  /**
36
50
  * Record of modules accepted by the Runtime module container.
37
51
  *
@@ -56,9 +70,8 @@ export interface RuntimeDefinition<Modules extends RuntimeModulesRecord> {
56
70
  }
57
71
 
58
72
  export class RuntimeZkProgrammable<
59
- Modules extends RuntimeModulesRecord
73
+ Modules extends RuntimeModulesRecord,
60
74
  > extends ZkProgrammable<undefined, MethodPublicOutput> {
61
- // eslint-disable-next-line @typescript-eslint/no-use-before-define
62
75
  public constructor(public runtime: Runtime<Modules>) {
63
76
  super();
64
77
  }
@@ -72,13 +85,13 @@ export class RuntimeZkProgrammable<
72
85
  string,
73
86
  {
74
87
  privateInputs: any;
75
- method: WrappedMethod;
88
+ method: AsyncWrappedMethod;
76
89
  }
77
90
  >;
78
91
  // We need to use explicit type annotations here,
79
92
  // therefore we can't use destructuring
80
- // eslint-disable-next-line max-len
81
- // eslint-disable-next-line @typescript-eslint/no-use-before-define,prefer-destructuring,putout/putout
93
+
94
+ // eslint-disable-next-line prefer-destructuring
82
95
  const runtime: Runtime<Modules> = this.runtime;
83
96
 
84
97
  const runtimeMethods = runtime.runtimeModuleNames.reduce<Methods>(
@@ -93,19 +106,20 @@ export class RuntimeZkProgrammable<
93
106
  * regarding resolving only known modules. We assert in the line above
94
107
  * but we cast it to any anyways to satisfy the proof system.
95
108
  */
96
- // eslint-disable-next-line max-len
109
+
97
110
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
98
111
  const runtimeModule = runtime.resolve(runtimeModuleName as any);
99
112
 
100
- // eslint-disable-next-line max-len
101
113
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
102
114
  const modulePrototype = Object.getPrototypeOf(runtimeModule) as Record<
103
115
  string,
104
- (...args: unknown[]) => unknown
116
+ // Technically not all methods have to be async, but for this context it's ok
117
+ (...args: unknown[]) => Promise<unknown>
105
118
  >;
106
119
 
107
- const modulePrototypeMethods =
108
- Object.getOwnPropertyNames(modulePrototype);
120
+ const modulePrototypeMethods = getAllPropertyNames(runtimeModule).map(
121
+ (method) => method.toString()
122
+ );
109
123
 
110
124
  const moduleMethods = modulePrototypeMethods.reduce<Methods>(
111
125
  (allModuleMethods, methodName) => {
@@ -115,13 +129,18 @@ export class RuntimeZkProgrammable<
115
129
  methodName
116
130
  );
117
131
  const method = modulePrototype[methodName];
118
- const wrappedMethod = Reflect.apply(
132
+ const invocationType = Reflect.getMetadata(
133
+ runtimeMethodTypeMetadataKey,
134
+ runtimeModule,
135
+ methodName
136
+ );
137
+
138
+ const wrappedMethod: AsyncWrappedMethod = Reflect.apply(
119
139
  toWrappedMethod,
120
140
  runtimeModule,
121
- [methodName, method]
141
+ [methodName, method, { invocationType }]
122
142
  );
123
143
 
124
- // eslint-disable-next-line no-warning-comments
125
144
  // TODO: find out how to import the Tuple type
126
145
 
127
146
  const privateInputs = Reflect.getMetadata(
@@ -154,16 +173,16 @@ export class RuntimeZkProgrammable<
154
173
  );
155
174
 
156
175
  const sortedRuntimeMethods = Object.fromEntries(
157
- // eslint-disable-next-line @typescript-eslint/require-array-sort-compare
158
176
  Object.entries(runtimeMethods).sort()
159
177
  );
160
178
 
161
- const program = Experimental.ZkProgram({
179
+ const program = ZkProgram({
180
+ name: "RuntimeProgram",
162
181
  publicOutput: MethodPublicOutput,
163
182
  methods: sortedRuntimeMethods,
164
183
  });
165
184
 
166
- const SelfProof = Experimental.ZkProgram.Proof(program);
185
+ const SelfProof = ZkProgram.Proof(program);
167
186
 
168
187
  const methods = Object.keys(sortedRuntimeMethods).reduce<
169
188
  Record<string, any>
@@ -175,6 +194,7 @@ export class RuntimeZkProgrammable<
175
194
  return {
176
195
  compile: program.compile.bind(program),
177
196
  verify: program.verify.bind(program),
197
+ analyzeMethods: program.analyzeMethods.bind(program),
178
198
  Proof: SelfProof,
179
199
  methods,
180
200
  };
@@ -201,7 +221,7 @@ export class Runtime<Modules extends RuntimeModulesRecord>
201
221
  }
202
222
 
203
223
  // runtime modules composed into a ZkProgram
204
- public program?: ReturnType<typeof Experimental.ZkProgram>;
224
+ public program?: ReturnType<typeof ZkProgram>;
205
225
 
206
226
  public definition: RuntimeDefinition<Modules>;
207
227
 
@@ -218,7 +238,6 @@ export class Runtime<Modules extends RuntimeModulesRecord>
218
238
  this.zkProgrammable = new RuntimeZkProgrammable<Modules>(this);
219
239
  }
220
240
 
221
- // eslint-disable-next-line no-warning-comments
222
241
  // TODO Remove after changing DFs to type-based approach
223
242
  public create(childContainerProvider: ChildContainerProvider) {
224
243
  super.create(childContainerProvider);
@@ -236,7 +255,7 @@ export class Runtime<Modules extends RuntimeModulesRecord>
236
255
  );
237
256
  }
238
257
 
239
- public get stateService(): StateService {
258
+ public get stateService(): SimpleAsyncStateService {
240
259
  return this.stateServiceProvider.stateService;
241
260
  }
242
261
 
@@ -257,7 +276,7 @@ export class Runtime<Modules extends RuntimeModulesRecord>
257
276
  */
258
277
  public getMethodById(
259
278
  methodId: bigint
260
- ): ((...args: unknown[]) => unknown) | undefined {
279
+ ): ((...args: unknown[]) => Promise<unknown>) | undefined {
261
280
  const methodDescriptor =
262
281
  this.methodIdResolver.getMethodNameFromId(methodId);
263
282
 
@@ -269,15 +288,14 @@ export class Runtime<Modules extends RuntimeModulesRecord>
269
288
  this.assertIsValidModuleName(moduleName);
270
289
  const module = this.resolve(moduleName);
271
290
 
272
- // eslint-disable-next-line max-len
273
- // eslint-disable-next-line @typescript-eslint/consistent-type-assertions,@typescript-eslint/no-unsafe-member-access
291
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
274
292
  const method = (module as any)[methodName];
275
293
  if (method === undefined) {
276
294
  throw errors.methodNotFound(`${moduleName}.${methodName}`);
277
295
  }
278
296
 
279
297
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
280
- return (method as (...args: unknown[]) => unknown).bind(module);
298
+ return (method as (...args: unknown[]) => Promise<unknown>).bind(module);
281
299
  }
282
300
 
283
301
  /**
@@ -304,3 +322,4 @@ export class Runtime<Modules extends RuntimeModulesRecord>
304
322
  return Object.keys(this.definition.modules);
305
323
  }
306
324
  }
325
+ /* eslint-enable @typescript-eslint/no-unsafe-assignment,@typescript-eslint/no-unsafe-argument */
@@ -1,19 +1,16 @@
1
- import {
2
- AreProofsEnabled,
3
- WithZkProgrammable,
4
- ZkProgrammable,
5
- } from "@proto-kit/common";
1
+ import { AreProofsEnabled, WithZkProgrammable } from "@proto-kit/common";
6
2
  import {
7
3
  MethodPublicOutput,
8
- StateService,
4
+ SimpleAsyncStateService,
9
5
  StateServiceProvider,
10
6
  } from "@proto-kit/protocol";
7
+
11
8
  import { MethodIdResolver } from "./MethodIdResolver";
12
9
 
13
10
  export interface RuntimeEnvironment
14
11
  extends WithZkProgrammable<undefined, MethodPublicOutput> {
15
12
  get appChain(): AreProofsEnabled | undefined;
16
- get stateService(): StateService;
13
+ get stateService(): SimpleAsyncStateService;
17
14
  get stateServiceProvider(): StateServiceProvider;
18
15
  get methodIdResolver(): MethodIdResolver;
19
16
  }
@@ -3,18 +3,14 @@ import { container, injectable } from "tsyringe";
3
3
  import {
4
4
  NetworkState,
5
5
  RuntimeTransaction,
6
- StateService,
7
6
  RuntimeMethodExecutionContext,
8
7
  RuntimeMethodExecutionData,
8
+ RuntimeMethodExecutionDataStruct,
9
9
  } from "@proto-kit/protocol";
10
+ import { Provable } from "o1js";
10
11
 
11
12
  import { runtimeMethodNamesMetadataKey } from "../method/runtimeMethod";
12
13
 
13
- import type {
14
- Runtime,
15
- RuntimeDefinition,
16
- RuntimeModulesRecord,
17
- } from "./Runtime";
18
14
  import { RuntimeEnvironment } from "./RuntimeEnvironment";
19
15
 
20
16
  const errors = {
@@ -26,7 +22,7 @@ const errors = {
26
22
  */
27
23
  @injectable()
28
24
  export class RuntimeModule<
29
- Config = NoConfig
25
+ Config = NoConfig,
30
26
  > extends ConfigurableModule<Config> {
31
27
  public static presets: Presets<unknown> = {};
32
28
 
@@ -56,15 +52,17 @@ export class RuntimeModule<
56
52
  this.runtimeMethodNames = methodNames ?? [];
57
53
  }
58
54
 
59
- private getInputs(): RuntimeMethodExecutionData {
60
- const { input } = container.resolve<RuntimeMethodExecutionContext>(
61
- RuntimeMethodExecutionContext
62
- );
55
+ public getInputs(): RuntimeMethodExecutionData {
56
+ return Provable.witness(RuntimeMethodExecutionDataStruct, () => {
57
+ const { input } = container.resolve<RuntimeMethodExecutionContext>(
58
+ RuntimeMethodExecutionContext
59
+ );
60
+ if (input === undefined) {
61
+ throw errors.inputDataNotSet();
62
+ }
63
63
 
64
- if (input === undefined) {
65
- throw errors.inputDataNotSet();
66
- }
67
- return input;
64
+ return input;
65
+ });
68
66
  }
69
67
 
70
68
  public get transaction(): RuntimeTransaction {
@@ -1,23 +1,23 @@
1
1
  import { Field } from "o1js";
2
- import { StateService } from "@proto-kit/protocol";
2
+ import { SimpleAsyncStateService } from "@proto-kit/protocol";
3
3
 
4
4
  /**
5
- * Naive implementation of a StateService for testing purposes
5
+ * Naive implementation of an in-memory variant of the StateService interface
6
6
  */
7
- export class InMemoryStateService implements StateService {
8
- public values: Record<string, Field[] | undefined> = {};
7
+ export class InMemoryStateService implements SimpleAsyncStateService {
8
+ /**
9
+ * This mapping container null values if the specific entry has been deleted.
10
+ * This is used by the CachedState service to keep track of deletions
11
+ */
12
+ public values: Record<string, Field[] | null> = {};
9
13
 
10
- public get(key: Field): Field[] | undefined {
11
- return this.values[key.toString()];
14
+ public async get(key: Field): Promise<Field[] | undefined> {
15
+ return this.values[key.toString()] ?? undefined;
12
16
  }
13
17
 
14
- public set(key: Field, value: Field[] | undefined) {
15
- if (
16
- value === undefined &&
17
- Object.prototype.hasOwnProperty.call(this.values, key.toString())
18
- ) {
19
- // eslint-disable-next-line @typescript-eslint/no-dynamic-delete
20
- delete this.values[key.toString()];
18
+ public async set(key: Field, value: Field[] | undefined) {
19
+ if (value === undefined) {
20
+ this.values[key.toString()] = null;
21
21
  } else {
22
22
  this.values[key.toString()] = value;
23
23
  }
@@ -25,14 +25,12 @@ export function state() {
25
25
  target: TargetRuntimeModule,
26
26
  propertyKey: string
27
27
  ) => {
28
- // eslint-disable-next-line @typescript-eslint/init-declarations
29
28
  let value: State<unknown> | undefined;
30
29
 
31
30
  Object.defineProperty(target, propertyKey, {
32
31
  enumerable: true,
33
32
 
34
33
  get: function get() {
35
- // eslint-disable-next-line max-len
36
34
  // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
37
35
  const self = this as TargetRuntimeModule;
38
36
 
@@ -47,7 +45,7 @@ export function state() {
47
45
  const path = Path.fromProperty(self.name, propertyKey);
48
46
  if (value) {
49
47
  value.path = path;
50
- // eslint-disable-next-line no-warning-comments
48
+
51
49
  // TODO: why is this complaining about `any`?
52
50
 
53
51
  value.stateServiceProvider = self.runtime.stateServiceProvider;
@@ -1,43 +1,70 @@
1
- import { Bool } from "o1js";
2
-
3
- import { InMemoryStateService, MethodIdResolver, Runtime } from "../src";
4
-
5
- import { Balances } from "./modules/Balances";
6
-
7
- describe("runtime", () => {
8
- it("should encode methodnames correctly", () => {
9
- expect.assertions(2);
10
-
11
- const runtime = Runtime.from({
12
- state: new InMemoryStateService(),
13
-
14
- modules: {
15
- Balances,
16
- },
17
-
18
- config: {
19
- Balances: {
20
- test: Bool(true),
21
- },
22
- },
23
- });
24
-
25
- const balances = runtime.resolve("Balances");
26
-
27
- expect(balances).toBeDefined();
28
-
29
- console.log(Object.keys(balances));
30
- console.log(balances.getTotalSupply);
31
-
32
- const moduleName = "Balances";
33
- const methodName = "getTotalSupply";
34
-
35
- const methodId = runtime.dependencyContainer
36
- .resolve<MethodIdResolver>("MethodIdResolver")
37
- .getMethodId(moduleName, methodName);
38
- const method = runtime.getMethodById(methodId);
39
-
40
- // eslint-disable-next-line jest/no-restricted-matchers
41
- expect(method).toBeDefined();
1
+ describe("noop", () => {
2
+ it("noop", () => {
3
+ expect(1).toBe(1);
42
4
  });
43
5
  });
6
+
7
+ // TODO disabled because of the reflect-metadata error in the CI
8
+ // import "reflect-metadata";
9
+ // import { container } from "tsyringe";
10
+ // import {
11
+ // RuntimeMethodExecutionContext,
12
+ // RuntimeTransaction,
13
+ // NetworkState,
14
+ // } from "@proto-kit/protocol";
15
+ //
16
+ // import { MethodIdResolver } from "../src";
17
+ //
18
+ // import { Balances } from "./modules/Balances";
19
+ // import { createTestingRuntime } from "./TestingRuntime";
20
+ //
21
+ // describe.skip("runtime", () => {
22
+ // it("should encode methodnames correctly", () => {
23
+ // expect.assertions(2);
24
+ //
25
+ // const { runtime } = createTestingRuntime(
26
+ // {
27
+ // Balances,
28
+ // },
29
+ // {
30
+ // Balances: {},
31
+ // }
32
+ // );
33
+ //
34
+ // const balances = runtime.resolve("Balances");
35
+ //
36
+ // expect(balances).toBeDefined();
37
+ //
38
+ // console.log(Object.keys(balances));
39
+ // console.log(balances.getTotalSupply);
40
+ //
41
+ // const moduleName = "Balances";
42
+ // const methodName = "getTotalSupply";
43
+ //
44
+ // const methodId = runtime.dependencyContainer
45
+ // .resolve<MethodIdResolver>("MethodIdResolver")
46
+ // .getMethodId(moduleName, methodName);
47
+ // const method = runtime.getMethodById(methodId);
48
+ //
49
+ // expect(method).toBeDefined();
50
+ // });
51
+ //
52
+ // it("regression - check that analyzeMethods works on runtime", async () => {
53
+ // const { runtime } = createTestingRuntime(
54
+ // {
55
+ // Balances,
56
+ // },
57
+ // {
58
+ // Balances: {},
59
+ // }
60
+ // );
61
+ //
62
+ // const context = container.resolve(RuntimeMethodExecutionContext);
63
+ // context.setup({
64
+ // transaction: RuntimeTransaction.dummyTransaction(),
65
+ // networkState: NetworkState.empty(),
66
+ // });
67
+ //
68
+ // await runtime.zkProgrammable.zkProgram.analyzeMethods();
69
+ // });
70
+ // });
@@ -0,0 +1,45 @@
1
+ import { ModulesConfig } from "@proto-kit/common";
2
+ import { StateServiceProvider } from "@proto-kit/protocol";
3
+ import { container } from "tsyringe";
4
+
5
+ import { InMemoryStateService, Runtime, RuntimeModulesRecord } from "../src";
6
+
7
+ export function createTestingRuntime<Modules extends RuntimeModulesRecord>(
8
+ modules: Modules,
9
+ config: ModulesConfig<Modules>
10
+ ): {
11
+ runtime: Runtime<Modules>;
12
+ state: InMemoryStateService;
13
+ } {
14
+ const state = new InMemoryStateService();
15
+
16
+ const Runtimeclass = Runtime.from({
17
+ modules,
18
+ });
19
+ const runtime = new Runtimeclass();
20
+
21
+ runtime.configure(config);
22
+
23
+ runtime.create(() => container.createChildContainer());
24
+
25
+ runtime.dependencyContainer.register("AreProofsEnabled", {
26
+ useValue: {
27
+ areProofsEnabled: false,
28
+
29
+ setProofsEnabled(areProofsEnabled: boolean) {
30
+ this.areProofsEnabled = areProofsEnabled;
31
+ },
32
+ },
33
+ });
34
+ runtime.registerValue({
35
+ StateServiceProvider: new StateServiceProvider(),
36
+ Runtime: runtime,
37
+ });
38
+
39
+ runtime.stateServiceProvider.setCurrentStateService(state);
40
+
41
+ return {
42
+ runtime,
43
+ state,
44
+ };
45
+ }
@@ -0,0 +1,152 @@
1
+ import {
2
+ Struct,
3
+ Field,
4
+ Bool,
5
+ PublicKey,
6
+ PrivateKey,
7
+ ZkProgram,
8
+ Proof,
9
+ } from "o1js";
10
+ import { NonMethods, noop } from "@proto-kit/common";
11
+
12
+ import {
13
+ MethodParameterEncoder,
14
+ RuntimeModule,
15
+ runtimeModule,
16
+ runtimeMethod,
17
+ } from "../../src";
18
+
19
+ class TestStruct extends Struct({
20
+ a: Field,
21
+ b: Bool,
22
+ }) {}
23
+
24
+ const TestProgram = ZkProgram({
25
+ name: "TestProgram",
26
+ publicInput: PublicKey,
27
+ publicOutput: TestStruct,
28
+ methods: {
29
+ foo: {
30
+ privateInputs: [],
31
+ method: async (input: PublicKey) => {
32
+ return {
33
+ a: Field(input.x),
34
+ b: Bool(input.isOdd),
35
+ };
36
+ },
37
+ },
38
+ },
39
+ });
40
+ class TestProof extends ZkProgram.Proof(TestProgram) {}
41
+
42
+ describe("MethodParameterEncoder", () => {
43
+ it("should en/decode Structs correctly", async () => {
44
+ expect.assertions(7);
45
+
46
+ const encoder = new MethodParameterEncoder([TestStruct]);
47
+ const { fields, auxiliary } = encoder.encode([
48
+ { a: Field(2), b: Bool(true) },
49
+ ]);
50
+
51
+ expect(auxiliary).toHaveLength(0);
52
+ expect(fields).toHaveLength(2);
53
+ expect(fields[0].toString()).toBe("2");
54
+ expect(fields[1].toString()).toStrictEqual(Bool(true).toField().toString());
55
+
56
+ const decoded = await encoder.decode(fields, auxiliary);
57
+ expect(decoded).toHaveLength(1);
58
+ const decoded1 = decoded[0] as unknown as NonMethods<TestStruct>;
59
+ expect(decoded1.a.toString()).toStrictEqual("2");
60
+ expect(decoded1.b.toString()).toStrictEqual("true");
61
+ });
62
+
63
+ it("should en/decode CircuitValues correctly", async () => {
64
+ expect.assertions(6);
65
+
66
+ const encoder = new MethodParameterEncoder([PublicKey]);
67
+ const pk = PrivateKey.random().toPublicKey();
68
+
69
+ const { fields, auxiliary } = encoder.encode([pk]);
70
+
71
+ expect(auxiliary).toHaveLength(0);
72
+ expect(fields).toHaveLength(2);
73
+ expect(fields.map((x) => x.toString())).toStrictEqual(
74
+ pk.toFields().map((x) => x.toString())
75
+ );
76
+
77
+ const decoded = await encoder.decode(fields, auxiliary);
78
+ expect(decoded).toHaveLength(1);
79
+
80
+ const decoded1 = decoded[0] as unknown as PublicKey;
81
+ expect(decoded1.x.toString()).toStrictEqual(pk.x.toString());
82
+ expect(decoded1.isOdd.toString()).toStrictEqual(pk.isOdd.toString());
83
+ });
84
+
85
+ it("should en/decode Proofs correctly", async () => {
86
+ expect.assertions(13);
87
+
88
+ const encoder = new MethodParameterEncoder([TestProof]);
89
+ const input = PrivateKey.random().toPublicKey();
90
+ const output = { a: input.x, b: input.isOdd };
91
+ const dummy = await TestProof.dummy(input, output, 0);
92
+
93
+ const { fields, auxiliary } = encoder.encode([dummy]);
94
+
95
+ expect(auxiliary).toHaveLength(1);
96
+
97
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
98
+ const json = JSON.parse(auxiliary[0]);
99
+
100
+ expect(json).toHaveProperty("maxProofsVerified");
101
+ expect(json).toHaveProperty("proof");
102
+ expect(json.maxProofsVerified).toStrictEqual(0);
103
+ expect(json.proof.length).toBeGreaterThan(20);
104
+
105
+ expect(fields).toHaveLength(4);
106
+ expect(fields.map((x) => x.toString())).toStrictEqual(
107
+ [...input.toFields(), ...TestStruct.toFields(output)].map((x) =>
108
+ x.toString()
109
+ )
110
+ );
111
+
112
+ const decoded = await encoder.decode(fields, auxiliary);
113
+ expect(decoded).toHaveLength(1);
114
+
115
+ const decoded1 = decoded[0] as unknown as Proof<PublicKey, TestStruct>;
116
+ expect(decoded1.maxProofsVerified).toStrictEqual(0);
117
+ expect(decoded1.proof).toBeDefined();
118
+ expect(decoded1.publicInput.equals(input).toBoolean()).toStrictEqual(true);
119
+ expect(decoded1.publicOutput.a.equals(output.a).toBoolean()).toStrictEqual(
120
+ true
121
+ );
122
+ expect(decoded1.publicOutput.b.equals(output.b).toBoolean()).toStrictEqual(
123
+ true
124
+ );
125
+ }, 30000);
126
+ });
127
+
128
+ class TieredStruct extends TestStruct {}
129
+
130
+ @runtimeModule()
131
+ class TestModule extends RuntimeModule {
132
+ @runtimeMethod()
133
+ public async foo(
134
+ a: TieredStruct,
135
+ b: PublicKey,
136
+ c: Field,
137
+ d: TestProof,
138
+ e: string
139
+ ) {
140
+ noop();
141
+ }
142
+ }
143
+
144
+ describe("MethodParameterEncoder construction", () => {
145
+ it("should throw on non-provable method signature", () => {
146
+ const module = new TestModule();
147
+ module.name = "testModule";
148
+ expect(() => MethodParameterEncoder.fromMethod(module, "foo")).toThrowError(
149
+ "'testModule.foo' are provable types or proofs (indizes: [4])"
150
+ );
151
+ });
152
+ });
@@ -3,9 +3,9 @@ import "reflect-metadata";
3
3
  import { Bool, Field } from "o1js";
4
4
  import { Option, StateTransition } from "@proto-kit/protocol";
5
5
 
6
- import { toStateTransitionsHash } from "./runtimeMethod.js";
6
+ import { toStateTransitionsHash } from "../../src/method/runtimeMethod";
7
7
 
8
- describe("toStateTransitionsHash", () => {
8
+ describe.skip("toStateTransitionsHash", () => {
9
9
  const noneStateTransition = StateTransition.from(
10
10
  Field(0),
11
11
  new Option(Bool(false), Field(0), Field)