@proto-kit/module 0.1.1-develop.190 → 0.1.1-develop.2024
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.
- package/dist/factories/MethodIdFactory.d.ts +6 -6
- package/dist/factories/MethodIdFactory.d.ts.map +1 -1
- package/dist/factories/MethodIdFactory.js +10 -34
- package/dist/factories/MethodIdFactory.js.map +1 -0
- package/dist/index.d.ts +4 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -7
- package/dist/index.js.map +1 -0
- package/dist/messages/OutgoingMessage.d.ts +96 -0
- package/dist/messages/OutgoingMessage.d.ts.map +1 -0
- package/dist/messages/OutgoingMessage.js +68 -0
- package/dist/messages/OutgoingMessage.js.map +1 -0
- package/dist/messages/OutgoingMessages.d.ts +231 -0
- package/dist/messages/OutgoingMessages.d.ts.map +1 -0
- package/dist/messages/OutgoingMessages.js +66 -0
- package/dist/messages/OutgoingMessages.js.map +1 -0
- package/dist/method/MethodParameterEncoder.d.ts +26 -0
- package/dist/method/MethodParameterEncoder.d.ts.map +1 -0
- package/dist/method/MethodParameterEncoder.js +169 -0
- package/dist/method/MethodParameterEncoder.js.map +1 -0
- package/dist/method/runtimeMethod.d.ts +21 -5
- package/dist/method/runtimeMethod.d.ts.map +1 -1
- package/dist/method/runtimeMethod.js +69 -25
- package/dist/method/runtimeMethod.js.map +1 -0
- package/dist/module/decorator.js +1 -0
- package/dist/module/decorator.js.map +1 -0
- package/dist/runtime/MethodIdResolver.d.ts +10 -8
- package/dist/runtime/MethodIdResolver.d.ts.map +1 -1
- package/dist/runtime/MethodIdResolver.js +74 -33
- package/dist/runtime/MethodIdResolver.js.map +1 -0
- package/dist/runtime/Runtime.d.ts +20 -26
- package/dist/runtime/Runtime.d.ts.map +1 -1
- package/dist/runtime/Runtime.js +117 -62
- package/dist/runtime/Runtime.js.map +1 -0
- package/dist/runtime/RuntimeEnvironment.d.ts +10 -0
- package/dist/runtime/RuntimeEnvironment.d.ts.map +1 -0
- package/dist/runtime/RuntimeEnvironment.js +2 -0
- package/dist/runtime/RuntimeEnvironment.js.map +1 -0
- package/dist/runtime/RuntimeModule.d.ts +18 -15
- package/dist/runtime/RuntimeModule.d.ts.map +1 -1
- package/dist/runtime/RuntimeModule.js +33 -8
- package/dist/runtime/RuntimeModule.js.map +1 -0
- package/dist/state/InMemoryStateService.d.ts +11 -10
- package/dist/state/InMemoryStateService.d.ts.map +1 -1
- package/dist/state/InMemoryStateService.js +11 -8
- package/dist/state/InMemoryStateService.js.map +1 -0
- package/dist/state/decorator.d.ts.map +1 -1
- package/dist/state/decorator.js +2 -4
- package/dist/state/decorator.js.map +1 -0
- package/dist/testing/TestingRuntime.d.ts +8 -0
- package/dist/testing/TestingRuntime.d.ts.map +1 -0
- package/dist/testing/TestingRuntime.js +31 -0
- package/dist/testing/TestingRuntime.js.map +1 -0
- package/jest.config.cjs +12 -1
- package/package.json +10 -11
- package/src/factories/MethodIdFactory.ts +10 -17
- package/src/index.ts +4 -7
- package/src/messages/OutgoingMessages.ts +122 -0
- package/src/method/MethodParameterEncoder.ts +262 -0
- package/src/method/runtimeMethod.ts +130 -33
- package/src/runtime/MethodIdResolver.ts +83 -46
- package/src/runtime/Runtime.ts +193 -100
- package/src/runtime/RuntimeEnvironment.ts +16 -0
- package/src/runtime/RuntimeModule.ts +62 -30
- package/src/state/InMemoryStateService.ts +14 -18
- package/test/Runtime.test.ts +68 -42
- package/test/TestingRuntime.ts +43 -0
- package/test/messages/message.test.ts +42 -0
- package/test/method/MethodParameterEncoder.test.ts +124 -0
- package/test/method/runtimeMethod-fail.test.ts +53 -0
- package/{src/method/decorator.test.ts → test/method/runtimeMethod.test.ts} +3 -3
- package/test/modules/Admin.ts +4 -4
- package/test/modules/Balances.test.ts +92 -78
- package/test/modules/Balances.ts +15 -17
- package/test/modules/{methodId.test.ts → MethodIdResolver.test.ts} +24 -36
- package/test/modules/State.test.ts +81 -0
- package/test/runtimeMethod.test.ts +192 -20
- package/test/tsconfig.json +7 -0
- package/tsconfig.json +2 -2
- package/LICENSE.md +0 -201
- package/dist/method/MethodParameterDecoder.d.ts +0 -22
- package/dist/method/MethodParameterDecoder.d.ts.map +0 -1
- package/dist/method/MethodParameterDecoder.js +0 -33
- package/dist/method/RuntimeMethodExecutionContext.d.ts +0 -57
- package/dist/method/RuntimeMethodExecutionContext.d.ts.map +0 -1
- package/dist/method/RuntimeMethodExecutionContext.js +0 -92
- package/dist/method/assert.d.ts +0 -12
- package/dist/method/assert.d.ts.map +0 -1
- package/dist/method/assert.js +0 -23
- package/dist/state/State.d.ts +0 -65
- package/dist/state/State.d.ts.map +0 -1
- package/dist/state/State.js +0 -114
- package/dist/state/StateMap.d.ts +0 -37
- package/dist/state/StateMap.d.ts.map +0 -1
- package/dist/state/StateMap.js +0 -56
- package/dist/state/StateServiceProvider.d.ts +0 -10
- package/dist/state/StateServiceProvider.d.ts.map +0 -1
- package/dist/state/StateServiceProvider.js +0 -34
- package/src/method/MethodParameterDecoder.ts +0 -68
- package/src/method/RuntimeMethodExecutionContext.ts +0 -111
- package/src/method/assert.test.ts +0 -49
- package/src/method/assert.ts +0 -27
- package/src/state/State.ts +0 -154
- package/src/state/StateMap.ts +0 -69
- package/src/state/StateServiceProvider.ts +0 -24
- package/src/state/decorator.ts +0 -65
- package/test/state/MerkleTree.test.ts +0 -95
- package/test/state/MockAsyncMerkleStore.ts +0 -28
- package/test/transaction.test.ts +0 -82
- package/tsconfig.test.json +0 -9
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"assert.d.ts","sourceRoot":"","sources":["../../src/method/assert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAY,MAAM,UAAU,CAAC;AAM1C;;;;;;;;GAQG;AACH,wBAAgB,MAAM,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,QAWvD"}
|
package/dist/method/assert.js
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { Bool, Provable } from "snarkyjs";
|
|
2
|
-
import { container } from "tsyringe";
|
|
3
|
-
import { RuntimeMethodExecutionContext } from "./RuntimeMethodExecutionContext";
|
|
4
|
-
import { log } from "@proto-kit/common";
|
|
5
|
-
/**
|
|
6
|
-
* Maintains an execution status of the current runtime module method,
|
|
7
|
-
* while prioritizing one-time failures. The assertion won't change the
|
|
8
|
-
* execution status if it has previously failed at least once within the
|
|
9
|
-
* same method execution context.
|
|
10
|
-
*
|
|
11
|
-
* @param condition - Result of the assertion made about the execution status
|
|
12
|
-
* @param message - Optional message describing the prior status
|
|
13
|
-
*/
|
|
14
|
-
export function assert(condition, message) {
|
|
15
|
-
const executionContext = container.resolve(RuntimeMethodExecutionContext);
|
|
16
|
-
const previousStatus = executionContext.current().result.status;
|
|
17
|
-
const status = Provable.if(previousStatus, Bool, condition, previousStatus);
|
|
18
|
-
if (!condition.toBoolean()) {
|
|
19
|
-
log.debug("Assertion failed: ", message);
|
|
20
|
-
executionContext.setStatusMessage(message);
|
|
21
|
-
}
|
|
22
|
-
executionContext.setStatus(status);
|
|
23
|
-
}
|
package/dist/state/State.d.ts
DELETED
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { Field, type FlexibleProvablePure } from "snarkyjs";
|
|
2
|
-
import { Option, type Path } from "@proto-kit/protocol";
|
|
3
|
-
import { PartialRuntime } from "../runtime/RuntimeModule.js";
|
|
4
|
-
export declare class WithPath {
|
|
5
|
-
path?: Field;
|
|
6
|
-
hasPathOrFail(): asserts this is {
|
|
7
|
-
path: Path;
|
|
8
|
-
};
|
|
9
|
-
}
|
|
10
|
-
export declare class WithRuntime {
|
|
11
|
-
runtime?: PartialRuntime;
|
|
12
|
-
hasRuntimeOrFail(): asserts this is {
|
|
13
|
-
runtime: PartialRuntime;
|
|
14
|
-
};
|
|
15
|
-
}
|
|
16
|
-
declare const State_base: import("ts-mixer/dist/types/types.js").Class<any[], WithPath & WithRuntime, typeof WithPath & typeof WithRuntime, false>;
|
|
17
|
-
/**
|
|
18
|
-
* Utilities for runtime module state, such as get/set
|
|
19
|
-
*/
|
|
20
|
-
export declare class State<Value> extends State_base {
|
|
21
|
-
valueType: FlexibleProvablePure<Value>;
|
|
22
|
-
/**
|
|
23
|
-
* Creates a new state wrapper for the provided value type.
|
|
24
|
-
*
|
|
25
|
-
* @param valueType - Type of value to be stored (e.g. UInt64, Struct, ...)
|
|
26
|
-
* @returns New state for the given value type.
|
|
27
|
-
*/
|
|
28
|
-
static from<Value>(valueType: FlexibleProvablePure<Value>): State<Value>;
|
|
29
|
-
/**
|
|
30
|
-
* Computes a dummy value for the given value type.
|
|
31
|
-
*
|
|
32
|
-
* @param valueType - Value type to generate the dummy value for
|
|
33
|
-
* @returns Dummy value for the given value type
|
|
34
|
-
*/
|
|
35
|
-
static dummyValue<Value>(valueType: FlexibleProvablePure<Value>): Value;
|
|
36
|
-
constructor(valueType: FlexibleProvablePure<Value>);
|
|
37
|
-
/**
|
|
38
|
-
* Provides an in-circuit witness for the current state representation,
|
|
39
|
-
* and constructs an Option out of it.
|
|
40
|
-
*
|
|
41
|
-
* @returns Optional value of the current state
|
|
42
|
-
*/
|
|
43
|
-
private witnessState;
|
|
44
|
-
/**
|
|
45
|
-
* Retrieves the current state and creates a state transition
|
|
46
|
-
* anchoring the use of the current state value in the circuit.
|
|
47
|
-
*
|
|
48
|
-
* @returns Option representation of the current state.
|
|
49
|
-
*/
|
|
50
|
-
get(): Option<Value>;
|
|
51
|
-
/**
|
|
52
|
-
* Sets a new state value by creating a state transition from
|
|
53
|
-
* the current value to the newly set value.
|
|
54
|
-
*
|
|
55
|
-
* The newly set value isn't available via state.get(), since the
|
|
56
|
-
* state transitions are not applied within the same circuit.
|
|
57
|
-
* You can however store and access your new value in
|
|
58
|
-
* a separate circuit variable.
|
|
59
|
-
*
|
|
60
|
-
* @param value - Value to be set as the current state
|
|
61
|
-
*/
|
|
62
|
-
set(value: Value): void;
|
|
63
|
-
}
|
|
64
|
-
export {};
|
|
65
|
-
//# sourceMappingURL=State.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"State.d.ts","sourceRoot":"","sources":["../../src/state/State.ts"],"names":[],"mappings":"AAGA,OAAO,EAAQ,KAAK,EAAY,KAAK,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAE5E,OAAO,EAAE,MAAM,EAAmB,KAAK,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAEzE,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAG7D,qBAAa,QAAQ;IACZ,IAAI,CAAC,EAAE,KAAK,CAAC;IAEb,aAAa,IAAI,OAAO,CAAC,IAAI,IAAI;QAAE,IAAI,EAAE,IAAI,CAAA;KAAE;CAOvD;AAED,qBAAa,WAAW;IACf,OAAO,CAAC,EAAE,cAAc,CAAC;IAEzB,gBAAgB,IAAI,OAAO,CAAC,IAAI,IAAI;QACzC,OAAO,EAAE,cAAc,CAAC;KACzB;CAOF;;AAED;;GAEG;AACH,qBAAa,KAAK,CAAC,KAAK,CAAE,SAAQ,UAA4B;IA2BlC,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;IA1BhE;;;;;OAKG;WACW,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;IAIhE;;;;;OAKG;WACW,UAAU,CAAC,KAAK,EAC5B,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC,GACrC,KAAK;gBAQkB,SAAS,EAAE,oBAAoB,CAAC,KAAK,CAAC;IAIhE;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IA6BpB;;;;;OAKG;IACI,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC;IAc3B;;;;;;;;;;OAUG;IACI,GAAG,CAAC,KAAK,EAAE,KAAK;CAiBxB"}
|
package/dist/state/State.js
DELETED
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
/* eslint-disable new-cap */
|
|
2
|
-
import { Mixin } from "ts-mixer";
|
|
3
|
-
import { Bool, Field, Provable } from "snarkyjs";
|
|
4
|
-
import { container } from "tsyringe";
|
|
5
|
-
import { Option, StateTransition } from "@proto-kit/protocol";
|
|
6
|
-
import { RuntimeMethodExecutionContext } from "../method/RuntimeMethodExecutionContext.js";
|
|
7
|
-
export class WithPath {
|
|
8
|
-
hasPathOrFail() {
|
|
9
|
-
if (!this.path) {
|
|
10
|
-
throw new Error("Could not find 'path', did you forget to add '@state' to your state property?");
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
export class WithRuntime {
|
|
15
|
-
hasRuntimeOrFail() {
|
|
16
|
-
if (!this.runtime) {
|
|
17
|
-
throw new Error("Could not find 'runtime', did you forget to add '@state' to your state property?");
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
/**
|
|
22
|
-
* Utilities for runtime module state, such as get/set
|
|
23
|
-
*/
|
|
24
|
-
export class State extends Mixin(WithPath, WithRuntime) {
|
|
25
|
-
/**
|
|
26
|
-
* Creates a new state wrapper for the provided value type.
|
|
27
|
-
*
|
|
28
|
-
* @param valueType - Type of value to be stored (e.g. UInt64, Struct, ...)
|
|
29
|
-
* @returns New state for the given value type.
|
|
30
|
-
*/
|
|
31
|
-
static from(valueType) {
|
|
32
|
-
return new State(valueType);
|
|
33
|
-
}
|
|
34
|
-
/**
|
|
35
|
-
* Computes a dummy value for the given value type.
|
|
36
|
-
*
|
|
37
|
-
* @param valueType - Value type to generate the dummy value for
|
|
38
|
-
* @returns Dummy value for the given value type
|
|
39
|
-
*/
|
|
40
|
-
static dummyValue(valueType) {
|
|
41
|
-
const length = valueType.sizeInFields();
|
|
42
|
-
const fields = Array.from({ length }, () => Field(0));
|
|
43
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
44
|
-
return valueType.fromFields(fields);
|
|
45
|
-
}
|
|
46
|
-
constructor(valueType) {
|
|
47
|
-
super();
|
|
48
|
-
this.valueType = valueType;
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Provides an in-circuit witness for the current state representation,
|
|
52
|
-
* and constructs an Option out of it.
|
|
53
|
-
*
|
|
54
|
-
* @returns Optional value of the current state
|
|
55
|
-
*/
|
|
56
|
-
witnessState() {
|
|
57
|
-
// get the value from storage, or return a dummy value instead
|
|
58
|
-
const value = Provable.witness(this.valueType, () => {
|
|
59
|
-
this.hasRuntimeOrFail();
|
|
60
|
-
this.hasPathOrFail();
|
|
61
|
-
const fields = this.runtime.stateService.get(this.path);
|
|
62
|
-
if (fields) {
|
|
63
|
-
// eslint-disable-next-line max-len
|
|
64
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
|
65
|
-
return this.valueType.fromFields(fields);
|
|
66
|
-
}
|
|
67
|
-
return State.dummyValue(this.valueType);
|
|
68
|
-
});
|
|
69
|
-
// check if the value exists in the storage or not
|
|
70
|
-
const isSome = Provable.witness(Bool, () => {
|
|
71
|
-
this.hasRuntimeOrFail();
|
|
72
|
-
this.hasPathOrFail();
|
|
73
|
-
const fields = this.runtime.stateService.get(this.path);
|
|
74
|
-
return Bool(fields !== undefined);
|
|
75
|
-
});
|
|
76
|
-
return Option.from(isSome, value, this.valueType);
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Retrieves the current state and creates a state transition
|
|
80
|
-
* anchoring the use of the current state value in the circuit.
|
|
81
|
-
*
|
|
82
|
-
* @returns Option representation of the current state.
|
|
83
|
-
*/
|
|
84
|
-
get() {
|
|
85
|
-
const option = this.witnessState();
|
|
86
|
-
this.hasPathOrFail();
|
|
87
|
-
const stateTransition = StateTransition.from(this.path, option);
|
|
88
|
-
container
|
|
89
|
-
.resolve(RuntimeMethodExecutionContext)
|
|
90
|
-
.addStateTransition(stateTransition);
|
|
91
|
-
return option;
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Sets a new state value by creating a state transition from
|
|
95
|
-
* the current value to the newly set value.
|
|
96
|
-
*
|
|
97
|
-
* The newly set value isn't available via state.get(), since the
|
|
98
|
-
* state transitions are not applied within the same circuit.
|
|
99
|
-
* You can however store and access your new value in
|
|
100
|
-
* a separate circuit variable.
|
|
101
|
-
*
|
|
102
|
-
* @param value - Value to be set as the current state
|
|
103
|
-
*/
|
|
104
|
-
set(value) {
|
|
105
|
-
// link the transition to the current state
|
|
106
|
-
const fromOption = this.witnessState();
|
|
107
|
-
const toOption = Option.from(Bool(true), value, this.valueType);
|
|
108
|
-
this.hasPathOrFail();
|
|
109
|
-
const stateTransition = StateTransition.fromTo(this.path, fromOption, toOption);
|
|
110
|
-
container
|
|
111
|
-
.resolve(RuntimeMethodExecutionContext)
|
|
112
|
-
.addStateTransition(stateTransition);
|
|
113
|
-
}
|
|
114
|
-
}
|
package/dist/state/StateMap.d.ts
DELETED
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
import type { Field, FlexibleProvablePure } from "snarkyjs";
|
|
2
|
-
import { type Option } from "@proto-kit/protocol";
|
|
3
|
-
import { WithRuntime, WithPath } from "./State.js";
|
|
4
|
-
declare const StateMap_base: import("ts-mixer/dist/types/types.js").Class<any[], WithPath & WithRuntime, typeof WithPath & typeof WithRuntime, false>;
|
|
5
|
-
/**
|
|
6
|
-
* Map-like wrapper for state
|
|
7
|
-
*/
|
|
8
|
-
export declare class StateMap<KeyType, ValueType> extends StateMap_base {
|
|
9
|
-
keyType: FlexibleProvablePure<KeyType>;
|
|
10
|
-
valueType: FlexibleProvablePure<ValueType>;
|
|
11
|
-
/**
|
|
12
|
-
* Create a new state map with the given key and value types
|
|
13
|
-
*
|
|
14
|
-
* @param keyType - Type to be used as a key
|
|
15
|
-
* @param valueType - Type to be stored as a value
|
|
16
|
-
* @returns State map with provided key and value types.
|
|
17
|
-
*/
|
|
18
|
-
static from<KeyType, ValueType>(keyType: FlexibleProvablePure<KeyType>, valueType: FlexibleProvablePure<ValueType>): StateMap<KeyType, ValueType>;
|
|
19
|
-
constructor(keyType: FlexibleProvablePure<KeyType>, valueType: FlexibleProvablePure<ValueType>);
|
|
20
|
-
getPath(key: KeyType): Field;
|
|
21
|
-
/**
|
|
22
|
-
* Obtains a value for the provided key in the current state map.
|
|
23
|
-
*
|
|
24
|
-
* @param key - Key to obtain the state for
|
|
25
|
-
* @returns Value for the provided key.
|
|
26
|
-
*/
|
|
27
|
-
get(key: KeyType): Option<ValueType>;
|
|
28
|
-
/**
|
|
29
|
-
* Sets a value for the given key in the current state map.
|
|
30
|
-
*
|
|
31
|
-
* @param key - Key to store the value under
|
|
32
|
-
* @param value - Value to be stored under the given key
|
|
33
|
-
*/
|
|
34
|
-
set(key: KeyType, value: ValueType): void;
|
|
35
|
-
}
|
|
36
|
-
export {};
|
|
37
|
-
//# sourceMappingURL=StateMap.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StateMap.d.ts","sourceRoot":"","sources":["../../src/state/StateMap.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAC5D,OAAO,EAAQ,KAAK,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGxD,OAAO,EAAS,WAAW,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;;AAE1D;;GAEG;AAEH,qBAAa,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAE,SAAQ,aAA4B;IAgBnE,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC;IACtC,SAAS,EAAE,oBAAoB,CAAC,SAAS,CAAC;IAhBnD;;;;;;OAMG;WACW,IAAI,CAAC,OAAO,EAAE,SAAS,EACnC,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,EACtC,SAAS,EAAE,oBAAoB,CAAC,SAAS,CAAC;gBAMnC,OAAO,EAAE,oBAAoB,CAAC,OAAO,CAAC,EACtC,SAAS,EAAE,oBAAoB,CAAC,SAAS,CAAC;IAK5C,OAAO,CAAC,GAAG,EAAE,OAAO,GAAG,KAAK;IAKnC;;;;;OAKG;IACI,GAAG,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC;IAU3C;;;;;OAKG;IACI,GAAG,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS;CAS1C"}
|
package/dist/state/StateMap.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { Path } from "@proto-kit/protocol";
|
|
2
|
-
import { Mixin } from "ts-mixer";
|
|
3
|
-
import { State, WithRuntime, WithPath } from "./State.js";
|
|
4
|
-
/**
|
|
5
|
-
* Map-like wrapper for state
|
|
6
|
-
*/
|
|
7
|
-
// eslint-disable-next-line new-cap
|
|
8
|
-
export class StateMap extends Mixin(WithPath, WithRuntime) {
|
|
9
|
-
/**
|
|
10
|
-
* Create a new state map with the given key and value types
|
|
11
|
-
*
|
|
12
|
-
* @param keyType - Type to be used as a key
|
|
13
|
-
* @param valueType - Type to be stored as a value
|
|
14
|
-
* @returns State map with provided key and value types.
|
|
15
|
-
*/
|
|
16
|
-
static from(keyType, valueType) {
|
|
17
|
-
return new StateMap(keyType, valueType);
|
|
18
|
-
}
|
|
19
|
-
constructor(keyType, valueType) {
|
|
20
|
-
super();
|
|
21
|
-
this.keyType = keyType;
|
|
22
|
-
this.valueType = valueType;
|
|
23
|
-
}
|
|
24
|
-
getPath(key) {
|
|
25
|
-
this.hasPathOrFail();
|
|
26
|
-
return Path.fromKey(this.path, this.keyType, key);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Obtains a value for the provided key in the current state map.
|
|
30
|
-
*
|
|
31
|
-
* @param key - Key to obtain the state for
|
|
32
|
-
* @returns Value for the provided key.
|
|
33
|
-
*/
|
|
34
|
-
get(key) {
|
|
35
|
-
const state = State.from(this.valueType);
|
|
36
|
-
this.hasPathOrFail();
|
|
37
|
-
this.hasRuntimeOrFail();
|
|
38
|
-
state.path = this.getPath(key);
|
|
39
|
-
state.runtime = this.runtime;
|
|
40
|
-
return state.get();
|
|
41
|
-
}
|
|
42
|
-
/**
|
|
43
|
-
* Sets a value for the given key in the current state map.
|
|
44
|
-
*
|
|
45
|
-
* @param key - Key to store the value under
|
|
46
|
-
* @param value - Value to be stored under the given key
|
|
47
|
-
*/
|
|
48
|
-
set(key, value) {
|
|
49
|
-
const state = State.from(this.valueType);
|
|
50
|
-
this.hasPathOrFail();
|
|
51
|
-
this.hasRuntimeOrFail();
|
|
52
|
-
state.path = Path.fromKey(this.path, this.keyType, key);
|
|
53
|
-
state.runtime = this.runtime;
|
|
54
|
-
state.set(value);
|
|
55
|
-
}
|
|
56
|
-
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { StateService } from "./InMemoryStateService";
|
|
2
|
-
export declare class StateServiceProvider {
|
|
3
|
-
private currentStateService;
|
|
4
|
-
private readonly defaultStateService;
|
|
5
|
-
constructor(currentStateService: StateService);
|
|
6
|
-
get stateService(): StateService;
|
|
7
|
-
setCurrentStateService(service: StateService): void;
|
|
8
|
-
resetToDefault(): void;
|
|
9
|
-
}
|
|
10
|
-
//# sourceMappingURL=StateServiceProvider.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"StateServiceProvider.d.ts","sourceRoot":"","sources":["../../src/state/StateServiceProvider.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAEtD,qBACa,oBAAoB;IAIL,OAAO,CAAC,mBAAmB;IAHrD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAA0C;gBAG5C,mBAAmB,EAAE,YAAY;IAGnE,IAAW,YAAY,IAAI,YAAY,CAEtC;IAEM,sBAAsB,CAAC,OAAO,EAAE,YAAY;IAI5C,cAAc;CAGtB"}
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
11
|
-
return function (target, key) { decorator(target, key, paramIndex); }
|
|
12
|
-
};
|
|
13
|
-
import { inject, injectable } from "tsyringe";
|
|
14
|
-
let StateServiceProvider = class StateServiceProvider {
|
|
15
|
-
constructor(currentStateService) {
|
|
16
|
-
this.currentStateService = currentStateService;
|
|
17
|
-
this.defaultStateService = this.currentStateService;
|
|
18
|
-
}
|
|
19
|
-
get stateService() {
|
|
20
|
-
return this.currentStateService;
|
|
21
|
-
}
|
|
22
|
-
setCurrentStateService(service) {
|
|
23
|
-
this.currentStateService = service;
|
|
24
|
-
}
|
|
25
|
-
resetToDefault() {
|
|
26
|
-
this.currentStateService = this.defaultStateService;
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
StateServiceProvider = __decorate([
|
|
30
|
-
injectable(),
|
|
31
|
-
__param(0, inject("StateService")),
|
|
32
|
-
__metadata("design:paramtypes", [Object])
|
|
33
|
-
], StateServiceProvider);
|
|
34
|
-
export { StateServiceProvider };
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
/* eslint-disable no-underscore-dangle */
|
|
2
|
-
import { Field } from "snarkyjs";
|
|
3
|
-
|
|
4
|
-
import { RuntimeModule } from "../runtime/RuntimeModule";
|
|
5
|
-
|
|
6
|
-
export interface Fieldable {
|
|
7
|
-
toFields: () => Field[];
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
export interface FromFieldClass {
|
|
11
|
-
new: (...args: any[]) => any;
|
|
12
|
-
fromFields: (fields: Field[]) => Fieldable;
|
|
13
|
-
name: string;
|
|
14
|
-
// Maybe this is wrong IDK
|
|
15
|
-
prototype: {
|
|
16
|
-
_fields?: any[];
|
|
17
|
-
};
|
|
18
|
-
sizeInFields?: () => number;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const errors = {
|
|
22
|
-
fieldLengthNotMatching: (expected: number, actual: number) =>
|
|
23
|
-
new Error(`Expected ${expected} field elements, got ${actual}`),
|
|
24
|
-
|
|
25
|
-
typeNotCompatible: (name: string) =>
|
|
26
|
-
new Error(
|
|
27
|
-
`Cannot decode type ${name}, it has to be either a Struct, CircuitValue or built-in snarkyjs type`
|
|
28
|
-
),
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export class MethodParameterDecoder {
|
|
32
|
-
public static fromMethod(target: RuntimeModule<unknown>, methodName: string) {
|
|
33
|
-
const paramtypes = Reflect.getMetadata(
|
|
34
|
-
"design:paramtypes",
|
|
35
|
-
target,
|
|
36
|
-
methodName
|
|
37
|
-
);
|
|
38
|
-
|
|
39
|
-
return new MethodParameterDecoder(paramtypes);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
private constructor(private readonly types: FromFieldClass[]) {}
|
|
43
|
-
|
|
44
|
-
public fromFields(fields: Field[]): Fieldable[] {
|
|
45
|
-
if (fields.length < this.fieldSize) {
|
|
46
|
-
throw errors.fieldLengthNotMatching(this.fieldSize, fields.length);
|
|
47
|
-
}
|
|
48
|
-
let stack = fields.slice();
|
|
49
|
-
return this.types.map((type) => {
|
|
50
|
-
const numberFieldsNeeded =
|
|
51
|
-
type.prototype._fields?.length ?? type.sizeInFields?.() ?? -1;
|
|
52
|
-
if (numberFieldsNeeded === -1) {
|
|
53
|
-
throw errors.typeNotCompatible(type.name);
|
|
54
|
-
}
|
|
55
|
-
const structFields = stack.slice(0, numberFieldsNeeded);
|
|
56
|
-
stack = stack.slice(numberFieldsNeeded);
|
|
57
|
-
return type.fromFields(structFields);
|
|
58
|
-
});
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
public get fieldSize(): number {
|
|
62
|
-
return this.types
|
|
63
|
-
.map(
|
|
64
|
-
(type) => type.prototype._fields?.length ?? type.sizeInFields?.() ?? 0
|
|
65
|
-
)
|
|
66
|
-
.reduce((a, b) => a + b);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import { Bool } from "snarkyjs";
|
|
2
|
-
import { singleton } from "tsyringe";
|
|
3
|
-
import type { StateTransition, NetworkState } from "@proto-kit/protocol";
|
|
4
|
-
import {
|
|
5
|
-
ProvableMethodExecutionContext,
|
|
6
|
-
ProvableMethodExecutionResult,
|
|
7
|
-
} from "@proto-kit/common";
|
|
8
|
-
import { RuntimeTransaction } from "@proto-kit/protocol/src/model/transaction/RuntimeTransaction";
|
|
9
|
-
|
|
10
|
-
const errors = {
|
|
11
|
-
setupNotCalled: () =>
|
|
12
|
-
new Error(
|
|
13
|
-
"Setup has not been called prior to executing a runtime method. Be sure to do that so that the Runtime is setup property for execution"
|
|
14
|
-
),
|
|
15
|
-
};
|
|
16
|
-
|
|
17
|
-
export class RuntimeProvableMethodExecutionResult extends ProvableMethodExecutionResult {
|
|
18
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
19
|
-
public stateTransitions: StateTransition<any>[] = [];
|
|
20
|
-
|
|
21
|
-
public status: Bool = Bool(true);
|
|
22
|
-
|
|
23
|
-
public statusMessage?: string;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export interface RuntimeMethodExecutionData {
|
|
27
|
-
transaction: RuntimeTransaction;
|
|
28
|
-
networkState: NetworkState;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
/**
|
|
32
|
-
* Execution context used to wrap runtime module methods,
|
|
33
|
-
* allowing them to post relevant information (such as execution status)
|
|
34
|
-
* into the context without any unnecessary 'prop drilling'.
|
|
35
|
-
*/
|
|
36
|
-
@singleton()
|
|
37
|
-
export class RuntimeMethodExecutionContext extends ProvableMethodExecutionContext {
|
|
38
|
-
public methods: string[] = [];
|
|
39
|
-
|
|
40
|
-
public input: RuntimeMethodExecutionData | undefined;
|
|
41
|
-
|
|
42
|
-
// The input corresponding to the current result
|
|
43
|
-
private lastInput: RuntimeMethodExecutionData | undefined;
|
|
44
|
-
|
|
45
|
-
public override result = new RuntimeProvableMethodExecutionResult();
|
|
46
|
-
|
|
47
|
-
private assertSetupCalled(): asserts this is {
|
|
48
|
-
input: RuntimeMethodExecutionData;
|
|
49
|
-
} {
|
|
50
|
-
if (this.input === undefined) {
|
|
51
|
-
throw errors.setupNotCalled();
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Adds an in-method generated state transition to the current context
|
|
57
|
-
* @param stateTransition - State transition to add to the context
|
|
58
|
-
*/
|
|
59
|
-
public addStateTransition<Value>(stateTransition: StateTransition<Value>) {
|
|
60
|
-
this.assertSetupCalled();
|
|
61
|
-
this.result.stateTransitions.push(stateTransition);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* @param message - Status message to acompany the current status
|
|
66
|
-
*/
|
|
67
|
-
public setStatusMessage(message?: string) {
|
|
68
|
-
this.assertSetupCalled();
|
|
69
|
-
this.result.statusMessage ??= message;
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
/**
|
|
73
|
-
* @param status - Execution status of the current method
|
|
74
|
-
*/
|
|
75
|
-
public setStatus(status: Bool) {
|
|
76
|
-
this.assertSetupCalled();
|
|
77
|
-
this.result.status = status;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* @param input Input witness data required for a runtime execution
|
|
82
|
-
*/
|
|
83
|
-
public setup(input: RuntimeMethodExecutionData) {
|
|
84
|
-
this.input = input;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
/**
|
|
88
|
-
* Manually clears/resets the execution context
|
|
89
|
-
*/
|
|
90
|
-
public clear() {
|
|
91
|
-
this.result = new RuntimeProvableMethodExecutionResult();
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
public afterMethod() {
|
|
95
|
-
super.afterMethod();
|
|
96
|
-
this.lastInput = this.input;
|
|
97
|
-
this.input = undefined;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
/**
|
|
101
|
-
* Had to override current() otherwise it would not infer
|
|
102
|
-
* the type of result correctly (parent type would be reused)
|
|
103
|
-
*/
|
|
104
|
-
public current() {
|
|
105
|
-
return {
|
|
106
|
-
isFinished: this.isFinished,
|
|
107
|
-
result: this.result,
|
|
108
|
-
input: this.lastInput,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
}
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import "reflect-metadata";
|
|
2
|
-
|
|
3
|
-
import { Bool } from "snarkyjs";
|
|
4
|
-
import { container } from "tsyringe";
|
|
5
|
-
|
|
6
|
-
import { assert } from "./assert.js";
|
|
7
|
-
import { RuntimeMethodExecutionContext } from "./RuntimeMethodExecutionContext.js";
|
|
8
|
-
|
|
9
|
-
describe("assert", () => {
|
|
10
|
-
const defaultStatusMessage = "something went wrong";
|
|
11
|
-
const executionContext = container.resolve(RuntimeMethodExecutionContext);
|
|
12
|
-
|
|
13
|
-
beforeEach(() => {
|
|
14
|
-
executionContext.beforeMethod("testConstructor", "test");
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
afterEach(() => {
|
|
18
|
-
executionContext.afterMethod();
|
|
19
|
-
});
|
|
20
|
-
|
|
21
|
-
describe.each([
|
|
22
|
-
[true, undefined],
|
|
23
|
-
[false, undefined],
|
|
24
|
-
[false, defaultStatusMessage],
|
|
25
|
-
])("status and message propagation", (status, statusMessage) => {
|
|
26
|
-
it("should propagate the assertion status and message", () => {
|
|
27
|
-
expect.assertions(2);
|
|
28
|
-
|
|
29
|
-
assert(Bool(status), statusMessage);
|
|
30
|
-
|
|
31
|
-
const { status: resultStatus, statusMessage: resultStatusMessage } =
|
|
32
|
-
executionContext.current().result;
|
|
33
|
-
|
|
34
|
-
expect(status).toBe(resultStatus.toBoolean());
|
|
35
|
-
expect(statusMessage).toBe(resultStatusMessage);
|
|
36
|
-
});
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
it("should keep a false status, once it was already set", () => {
|
|
40
|
-
expect.assertions(1);
|
|
41
|
-
|
|
42
|
-
assert(Bool(false));
|
|
43
|
-
assert(Bool(true));
|
|
44
|
-
|
|
45
|
-
const { status } = executionContext.current().result;
|
|
46
|
-
|
|
47
|
-
expect(status.toBoolean()).toBe(false);
|
|
48
|
-
});
|
|
49
|
-
});
|
package/src/method/assert.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Bool, Provable } from "snarkyjs";
|
|
2
|
-
import { container } from "tsyringe";
|
|
3
|
-
|
|
4
|
-
import { RuntimeMethodExecutionContext } from "./RuntimeMethodExecutionContext";
|
|
5
|
-
import { log } from "@proto-kit/common";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Maintains an execution status of the current runtime module method,
|
|
9
|
-
* while prioritizing one-time failures. The assertion won't change the
|
|
10
|
-
* execution status if it has previously failed at least once within the
|
|
11
|
-
* same method execution context.
|
|
12
|
-
*
|
|
13
|
-
* @param condition - Result of the assertion made about the execution status
|
|
14
|
-
* @param message - Optional message describing the prior status
|
|
15
|
-
*/
|
|
16
|
-
export function assert(condition: Bool, message?: string) {
|
|
17
|
-
const executionContext = container.resolve(RuntimeMethodExecutionContext);
|
|
18
|
-
const previousStatus = executionContext.current().result.status;
|
|
19
|
-
const status = Provable.if(previousStatus, Bool, condition, previousStatus);
|
|
20
|
-
|
|
21
|
-
if (!condition.toBoolean()) {
|
|
22
|
-
log.debug("Assertion failed: ", message);
|
|
23
|
-
executionContext.setStatusMessage(message);
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
executionContext.setStatus(status);
|
|
27
|
-
}
|