@proto-kit/protocol 0.1.1-develop.1086
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/LICENSE.md +201 -0
- package/README.md +45 -0
- package/dist/Constants.d.ts +4 -0
- package/dist/Constants.d.ts.map +1 -0
- package/dist/Constants.js +3 -0
- package/dist/hooks/AccountStateHook.d.ts +52 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -0
- package/dist/hooks/AccountStateHook.js +47 -0
- package/dist/hooks/BlockHeightHook.d.ts +7 -0
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
- package/dist/hooks/BlockHeightHook.js +15 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
- package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/hooks/LastStateRootBlockHook.js +15 -0
- package/dist/hooks/NoopBlockHook.d.ts +9 -0
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
- package/dist/hooks/NoopBlockHook.js +9 -0
- package/dist/hooks/NoopSettlementHook.d.ts +6 -0
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
- package/dist/hooks/NoopSettlementHook.js +17 -0
- package/dist/hooks/NoopTransactionHook.d.ts +6 -0
- package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
- package/dist/hooks/NoopTransactionHook.js +7 -0
- package/dist/index.d.ts +54 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/model/MethodPublicOutput.d.ts +113 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -0
- package/dist/model/MethodPublicOutput.js +14 -0
- package/dist/model/Option.d.ts +122 -0
- package/dist/model/Option.d.ts.map +1 -0
- package/dist/model/Option.js +110 -0
- package/dist/model/Path.d.ts +31 -0
- package/dist/model/Path.d.ts.map +1 -0
- package/dist/model/Path.js +42 -0
- package/dist/model/RuntimeLike.d.ts +11 -0
- package/dist/model/RuntimeLike.d.ts.map +1 -0
- package/dist/model/RuntimeLike.js +1 -0
- package/dist/model/StateTransition.d.ts +135 -0
- package/dist/model/StateTransition.d.ts.map +1 -0
- package/dist/model/StateTransition.js +68 -0
- package/dist/model/StateTransitionProvableBatch.d.ts +172 -0
- package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
- package/dist/model/StateTransitionProvableBatch.js +85 -0
- package/dist/model/network/NetworkState.d.ts +160 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -0
- package/dist/model/network/NetworkState.js +31 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts +122 -0
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
- package/dist/model/transaction/RuntimeTransaction.js +86 -0
- package/dist/model/transaction/SignedTransaction.d.ts +107 -0
- package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
- package/dist/model/transaction/SignedTransaction.js +33 -0
- package/dist/model/transaction/ValueOption.d.ts +173 -0
- package/dist/model/transaction/ValueOption.d.ts.map +1 -0
- package/dist/model/transaction/ValueOption.js +24 -0
- package/dist/protocol/Protocol.d.ts +43 -0
- package/dist/protocol/Protocol.d.ts.map +1 -0
- package/dist/protocol/Protocol.js +95 -0
- package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
- package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
- package/dist/protocol/ProtocolEnvironment.js +1 -0
- package/dist/protocol/ProtocolModule.d.ts +9 -0
- package/dist/protocol/ProtocolModule.d.ts.map +1 -0
- package/dist/protocol/ProtocolModule.js +12 -0
- package/dist/protocol/ProvableBlockHook.d.ts +8 -0
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
- package/dist/protocol/ProvableBlockHook.js +4 -0
- package/dist/protocol/ProvableTransactionHook.d.ts +7 -0
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
- package/dist/protocol/ProvableTransactionHook.js +3 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
- package/dist/protocol/TransitioningProtocolModule.js +8 -0
- package/dist/prover/block/BlockProvable.d.ts +395 -0
- package/dist/prover/block/BlockProvable.d.ts.map +1 -0
- package/dist/prover/block/BlockProvable.js +45 -0
- package/dist/prover/block/BlockProver.d.ts +92 -0
- package/dist/prover/block/BlockProver.d.ts.map +1 -0
- package/dist/prover/block/BlockProver.js +472 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +64 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +20 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
- package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +22 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts +174 -0
- package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProvable.js +15 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +51 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionProver.js +188 -0
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +16 -0
- package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionWitnessProvider.js +16 -0
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +7 -0
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +1 -0
- package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +19 -0
- package/dist/settlement/ContractModule.d.ts +15 -0
- package/dist/settlement/ContractModule.d.ts.map +1 -0
- package/dist/settlement/ContractModule.js +11 -0
- package/dist/settlement/SettlementContractModule.d.ts +40 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
- package/dist/settlement/SettlementContractModule.js +71 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchContractProtocolModule.js +35 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
- package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts +42 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.js +241 -0
- package/dist/settlement/messages/Deposit.d.ts +64 -0
- package/dist/settlement/messages/Deposit.d.ts.map +1 -0
- package/dist/settlement/messages/Deposit.js +6 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts +189 -0
- package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
- package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
- package/dist/settlement/messages/Withdrawal.d.ts +65 -0
- package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
- package/dist/settlement/messages/Withdrawal.js +13 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
- package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
- package/dist/settlement/modules/NetworkStateSettlementModule.js +14 -0
- package/dist/state/State.d.ts +68 -0
- package/dist/state/State.d.ts.map +1 -0
- package/dist/state/State.js +129 -0
- package/dist/state/StateMap.d.ts +37 -0
- package/dist/state/StateMap.d.ts.map +1 -0
- package/dist/state/StateMap.js +55 -0
- package/dist/state/StateService.d.ts +6 -0
- package/dist/state/StateService.d.ts.map +1 -0
- package/dist/state/StateService.js +1 -0
- package/dist/state/StateServiceProvider.d.ts +8 -0
- package/dist/state/StateServiceProvider.d.ts.map +1 -0
- package/dist/state/StateServiceProvider.js +36 -0
- package/dist/state/assert/assert.d.ts +12 -0
- package/dist/state/assert/assert.d.ts.map +1 -0
- package/dist/state/assert/assert.js +30 -0
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts +22 -0
- package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/ProtocolMethodExecutionContext.js +28 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/RuntimeMethodExecutionContext.js +135 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
- package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
- package/dist/state/context/TransitionMethodExecutionContext.js +5 -0
- package/dist/state/protocol/ProtocolState.d.ts +7 -0
- package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
- package/dist/state/protocol/ProtocolState.js +39 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +52 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/PrefixedProvableHashList.js +12 -0
- package/dist/utils/ProvableHashList.d.ts +27 -0
- package/dist/utils/ProvableHashList.d.ts.map +1 -0
- package/dist/utils/ProvableHashList.js +43 -0
- package/dist/utils/ProvableReductionHashList.d.ts +14 -0
- package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
- package/dist/utils/ProvableReductionHashList.js +50 -0
- package/dist/utils/StateTransitionReductionList.d.ts +11 -0
- package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
- package/dist/utils/StateTransitionReductionList.js +60 -0
- package/dist/utils/utils.d.ts +11 -0
- package/dist/utils/utils.d.ts.map +1 -0
- package/dist/utils/utils.js +44 -0
- package/jest.config.cjs +1 -0
- package/package.json +36 -0
- package/src/Constants.ts +3 -0
- package/src/hooks/AccountStateHook.ts +48 -0
- package/src/hooks/BlockHeightHook.ts +17 -0
- package/src/hooks/LastStateRootBlockHook.ts +26 -0
- package/src/hooks/NoopBlockHook.ts +21 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/NoopTransactionHook.ts +10 -0
- package/src/index.ts +53 -0
- package/src/model/MethodPublicOutput.ts +14 -0
- package/src/model/Option.ts +172 -0
- package/src/model/Path.ts +50 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +88 -0
- package/src/model/StateTransitionProvableBatch.ts +125 -0
- package/src/model/Transaction.ts +31 -0
- package/src/model/network/NetworkState.ts +33 -0
- package/src/model/transaction/RuntimeTransaction.ts +105 -0
- package/src/model/transaction/SignedTransaction.ts +47 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +197 -0
- package/src/protocol/ProtocolEnvironment.ts +10 -0
- package/src/protocol/ProtocolModule.ts +27 -0
- package/src/protocol/ProvableBlockHook.ts +19 -0
- package/src/protocol/ProvableTransactionHook.ts +13 -0
- package/src/protocol/TransitioningProtocolModule.ts +12 -0
- package/src/prover/block/BlockProvable.ts +99 -0
- package/src/prover/block/BlockProver.ts +954 -0
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
- package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
- package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
- package/src/prover/statetransition/StateTransitionProvable.ts +44 -0
- package/src/prover/statetransition/StateTransitionProver.ts +371 -0
- package/src/prover/statetransition/StateTransitionWitnessProvider.ts +23 -0
- package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +17 -0
- package/src/settlement/ContractModule.ts +24 -0
- package/src/settlement/SettlementContractModule.ts +132 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +136 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +67 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +344 -0
- package/src/settlement/messages/Deposit.ts +6 -0
- package/src/settlement/messages/OutgoingMessageArgument.ts +42 -0
- package/src/settlement/messages/Withdrawal.ts +14 -0
- package/src/settlement/modularity/ProvableSettlementHook.ts +33 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
- package/src/state/State.ts +175 -0
- package/src/state/StateMap.ts +73 -0
- package/src/state/StateService.ts +6 -0
- package/src/state/StateServiceProvider.ts +37 -0
- package/src/state/assert/assert.ts +35 -0
- package/src/state/context/RuntimeMethodExecutionContext.ts +174 -0
- package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
- package/src/state/protocol/ProtocolState.ts +61 -0
- package/src/utils/MinaPrefixedProvableHashList.ts +73 -0
- package/src/utils/PrefixedProvableHashList.ts +21 -0
- package/src/utils/ProvableHashList.ts +50 -0
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +89 -0
- package/src/utils/utils.ts +75 -0
- package/test/BlockProver.test.ts +211 -0
- package/test/Protocol.test.ts +37 -0
- package/test/State.test.ts +45 -0
- package/test/StateTransition.test.ts +174 -0
- package/test/TestingProtocol.ts +47 -0
- package/test/model/Option.test.ts +72 -0
- package/test/state/assert/assert.test.ts +56 -0
- package/test/tsconfig.json +7 -0
- package/test/utils/ProvableReductionHashList.test.ts +117 -0
- package/test/utils.test.ts +27 -0
- package/tsconfig.json +8 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type RuntimeMethodInvocationType = "INCOMING_MESSAGE" | "SIGNATURE";
|
|
2
|
+
|
|
3
|
+
export type RuntimeMethodIdMapping = Record<
|
|
4
|
+
`${string}.${string}`,
|
|
5
|
+
{ methodId: bigint; type: RuntimeMethodInvocationType }
|
|
6
|
+
>;
|
|
7
|
+
|
|
8
|
+
export interface RuntimeLike {
|
|
9
|
+
get methodIdResolver(): {
|
|
10
|
+
methodIdMap: () => RuntimeMethodIdMapping;
|
|
11
|
+
};
|
|
12
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { Field, Struct } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { Option, ProvableOption } from "./Option";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Provable representation of a State Transition, used to
|
|
7
|
+
* normalize state transitions of various value types for
|
|
8
|
+
* the state transition circuit.
|
|
9
|
+
*/
|
|
10
|
+
export class ProvableStateTransition extends Struct({
|
|
11
|
+
path: Field,
|
|
12
|
+
|
|
13
|
+
// must be applied even if `None`
|
|
14
|
+
from: ProvableOption,
|
|
15
|
+
|
|
16
|
+
// must be ignored if `None`
|
|
17
|
+
to: ProvableOption,
|
|
18
|
+
}) {
|
|
19
|
+
public static dummy(): ProvableStateTransition {
|
|
20
|
+
return new ProvableStateTransition({
|
|
21
|
+
path: Field(0),
|
|
22
|
+
from: Option.none().toProvable(),
|
|
23
|
+
to: Option.none().toProvable(),
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Generic state transition that constraints the current method circuit
|
|
30
|
+
* to external state, by providing a state anchor.
|
|
31
|
+
*/
|
|
32
|
+
export class StateTransition<Value> {
|
|
33
|
+
public static from<Value>(path: Field, fromValue: Option<Value>) {
|
|
34
|
+
return new StateTransition(path, fromValue, Option.none());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public static fromTo<Value>(
|
|
38
|
+
path: Field,
|
|
39
|
+
fromValue: Option<Value>,
|
|
40
|
+
toValue: Option<Value>
|
|
41
|
+
) {
|
|
42
|
+
return new StateTransition(path, fromValue, toValue);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
public constructor(
|
|
46
|
+
public path: Field,
|
|
47
|
+
public fromValue: Option<Value>,
|
|
48
|
+
public toValue: Option<Field> | Option<Value>
|
|
49
|
+
) {}
|
|
50
|
+
|
|
51
|
+
public get from() {
|
|
52
|
+
const from = this.fromValue.clone();
|
|
53
|
+
from.forceSome();
|
|
54
|
+
return from;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public get to() {
|
|
58
|
+
return this.toValue.clone();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Converts a StateTransition to a ProvableStateTransition,
|
|
63
|
+
* while enforcing the 'from' property to be 'Some' in all cases.
|
|
64
|
+
*/
|
|
65
|
+
public toProvable(): ProvableStateTransition {
|
|
66
|
+
return new ProvableStateTransition({
|
|
67
|
+
path: this.path,
|
|
68
|
+
from: this.from.toProvable(),
|
|
69
|
+
to: this.to.toProvable(),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public toJSON() {
|
|
74
|
+
return {
|
|
75
|
+
path: this.path.toString(),
|
|
76
|
+
from: this.fromValue.toJSON(),
|
|
77
|
+
to: this.toValue.toJSON(),
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
public toConstant(): StateTransition<Value> {
|
|
82
|
+
return new StateTransition<Value>(
|
|
83
|
+
this.path.toConstant(),
|
|
84
|
+
this.fromValue.toConstant(),
|
|
85
|
+
this.toValue.toConstant()
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Bool, Provable, Struct } from "o1js";
|
|
2
|
+
import { range } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { constants } from "../Constants";
|
|
5
|
+
|
|
6
|
+
import { ProvableStateTransition } from "./StateTransition.js";
|
|
7
|
+
|
|
8
|
+
export class StateTransitionType {
|
|
9
|
+
public static readonly normal = true;
|
|
10
|
+
|
|
11
|
+
public static readonly protocol = false;
|
|
12
|
+
|
|
13
|
+
public static isNormal(type: boolean) {
|
|
14
|
+
return type === StateTransitionType.normal;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public static isProtocol(type: boolean) {
|
|
18
|
+
return type === StateTransitionType.protocol;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class ProvableStateTransitionType extends Struct({
|
|
23
|
+
type: Bool,
|
|
24
|
+
}) {
|
|
25
|
+
public static get normal(): ProvableStateTransitionType {
|
|
26
|
+
return new ProvableStateTransitionType({
|
|
27
|
+
type: Bool(StateTransitionType.normal),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public static get protocol(): ProvableStateTransitionType {
|
|
32
|
+
return new ProvableStateTransitionType({
|
|
33
|
+
type: Bool(StateTransitionType.protocol),
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
public isNormal(): Bool {
|
|
38
|
+
return this.type;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public isProtocol(): Bool {
|
|
42
|
+
return this.type.not();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* A Batch of StateTransitions to be consumed by the StateTransitionProver
|
|
48
|
+
* to prove multiple STs at once
|
|
49
|
+
*
|
|
50
|
+
* transitionType:
|
|
51
|
+
* true == normal ST, false == protocol ST
|
|
52
|
+
*/
|
|
53
|
+
export class StateTransitionProvableBatch extends Struct({
|
|
54
|
+
batch: Provable.Array(
|
|
55
|
+
ProvableStateTransition,
|
|
56
|
+
constants.stateTransitionProverBatchSize
|
|
57
|
+
),
|
|
58
|
+
|
|
59
|
+
transitionTypes: Provable.Array(
|
|
60
|
+
ProvableStateTransitionType,
|
|
61
|
+
constants.stateTransitionProverBatchSize
|
|
62
|
+
),
|
|
63
|
+
}) {
|
|
64
|
+
public static fromMappings(
|
|
65
|
+
transitions: {
|
|
66
|
+
transition: ProvableStateTransition;
|
|
67
|
+
type: ProvableStateTransitionType;
|
|
68
|
+
}[]
|
|
69
|
+
): StateTransitionProvableBatch {
|
|
70
|
+
const batch = transitions.map((entry) => entry.transition);
|
|
71
|
+
const transitionTypes = transitions.map((entry) => entry.type);
|
|
72
|
+
|
|
73
|
+
// Check that order is correct
|
|
74
|
+
let normalSTsStarted = false;
|
|
75
|
+
transitionTypes.forEach((x) => {
|
|
76
|
+
if (!normalSTsStarted && x.isNormal().toBoolean()) {
|
|
77
|
+
normalSTsStarted = true;
|
|
78
|
+
}
|
|
79
|
+
if (normalSTsStarted && x.isProtocol().toBoolean()) {
|
|
80
|
+
throw new Error("Order in initializing STBatch not correct");
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
while (batch.length < constants.stateTransitionProverBatchSize) {
|
|
85
|
+
batch.push(ProvableStateTransition.dummy());
|
|
86
|
+
transitionTypes.push(ProvableStateTransitionType.normal);
|
|
87
|
+
}
|
|
88
|
+
return new StateTransitionProvableBatch({
|
|
89
|
+
batch,
|
|
90
|
+
transitionTypes,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
public static fromTransitions(
|
|
95
|
+
transitions: ProvableStateTransition[],
|
|
96
|
+
protocolTransitions: ProvableStateTransition[]
|
|
97
|
+
): StateTransitionProvableBatch {
|
|
98
|
+
const array = transitions.slice().concat(protocolTransitions);
|
|
99
|
+
|
|
100
|
+
const transitionTypes = range(0, transitions.length)
|
|
101
|
+
.map(() => ProvableStateTransitionType.normal)
|
|
102
|
+
.concat(
|
|
103
|
+
range(0, protocolTransitions.length).map(
|
|
104
|
+
() => ProvableStateTransitionType.protocol
|
|
105
|
+
)
|
|
106
|
+
);
|
|
107
|
+
|
|
108
|
+
while (array.length < constants.stateTransitionProverBatchSize) {
|
|
109
|
+
array.push(ProvableStateTransition.dummy());
|
|
110
|
+
transitionTypes.push(ProvableStateTransitionType.normal);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return new StateTransitionProvableBatch({
|
|
114
|
+
batch: array,
|
|
115
|
+
transitionTypes,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
private constructor(object: {
|
|
120
|
+
batch: ProvableStateTransition[];
|
|
121
|
+
transitionTypes: ProvableStateTransitionType[];
|
|
122
|
+
}) {
|
|
123
|
+
super(object);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Field,
|
|
3
|
+
FlexibleProvable,
|
|
4
|
+
Poseidon,
|
|
5
|
+
PublicKey,
|
|
6
|
+
Signature,
|
|
7
|
+
Struct,
|
|
8
|
+
UInt64,
|
|
9
|
+
} from "o1js";
|
|
10
|
+
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
12
|
+
function argsToHash(...args: FlexibleProvable<any>[]): Field {
|
|
13
|
+
const fields = args.flatMap((argument) => argument.toFields(argument));
|
|
14
|
+
return Poseidon.hash(fields);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
+
class Transaction extends Struct({
|
|
19
|
+
// must be checked inside @runtimeMethod
|
|
20
|
+
methodId: Field,
|
|
21
|
+
// constructed by hashing args + appending all used proof input/output hashes at the end
|
|
22
|
+
argsHash: Field,
|
|
23
|
+
// must (due to nonce) be checked during applyTransaction
|
|
24
|
+
nonce: UInt64,
|
|
25
|
+
sender: PublicKey,
|
|
26
|
+
signature: Signature,
|
|
27
|
+
}) {
|
|
28
|
+
public toHash(): Field {
|
|
29
|
+
return Poseidon.hash(Transaction.toFields(this));
|
|
30
|
+
}
|
|
31
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { Field, Poseidon, Struct, UInt64 } from "o1js";
|
|
2
|
+
import { RollupMerkleTree } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
export class CurrentBlock extends Struct({
|
|
5
|
+
height: UInt64,
|
|
6
|
+
}) {}
|
|
7
|
+
|
|
8
|
+
export class PreviousBlock extends Struct({
|
|
9
|
+
rootHash: Field,
|
|
10
|
+
}) {}
|
|
11
|
+
|
|
12
|
+
export class NetworkState extends Struct({
|
|
13
|
+
block: CurrentBlock,
|
|
14
|
+
previous: PreviousBlock,
|
|
15
|
+
}) {
|
|
16
|
+
public hash(): Field {
|
|
17
|
+
return Poseidon.hash([
|
|
18
|
+
...CurrentBlock.toFields(this.block),
|
|
19
|
+
...PreviousBlock.toFields(this.previous),
|
|
20
|
+
]);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public static empty() {
|
|
24
|
+
return new NetworkState({
|
|
25
|
+
block: {
|
|
26
|
+
height: UInt64.zero,
|
|
27
|
+
},
|
|
28
|
+
previous: {
|
|
29
|
+
rootHash: Field(RollupMerkleTree.EMPTY_ROOT),
|
|
30
|
+
},
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { Bool, Field, Poseidon, PublicKey, Struct, UInt64 } from "o1js";
|
|
2
|
+
import { EMPTY_PUBLICKEY, EMPTY_PUBLICKEY_X } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { PublicKeyOption, UInt64Option } from "./ValueOption";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* This struct is used to expose transaction information to the runtime method
|
|
8
|
+
* execution. This class has not all data included in transactions on purpose.
|
|
9
|
+
* For example, we don't want to expose the signature or args as fields.
|
|
10
|
+
*/
|
|
11
|
+
export class RuntimeTransaction extends Struct({
|
|
12
|
+
methodId: Field,
|
|
13
|
+
argsHash: Field,
|
|
14
|
+
nonce: UInt64Option,
|
|
15
|
+
sender: PublicKeyOption,
|
|
16
|
+
}) {
|
|
17
|
+
public static fromTransaction(input: {
|
|
18
|
+
methodId: Field;
|
|
19
|
+
argsHash: Field;
|
|
20
|
+
nonce: UInt64;
|
|
21
|
+
sender: PublicKey;
|
|
22
|
+
}) {
|
|
23
|
+
return new RuntimeTransaction({
|
|
24
|
+
methodId: input.methodId,
|
|
25
|
+
argsHash: input.argsHash,
|
|
26
|
+
nonce: UInt64Option.fromSome(input.nonce),
|
|
27
|
+
sender: PublicKeyOption.fromSome(input.sender),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
public static fromMessage({
|
|
32
|
+
methodId,
|
|
33
|
+
argsHash,
|
|
34
|
+
}: {
|
|
35
|
+
methodId: Field;
|
|
36
|
+
argsHash: Field;
|
|
37
|
+
}) {
|
|
38
|
+
return new RuntimeTransaction({
|
|
39
|
+
methodId,
|
|
40
|
+
argsHash,
|
|
41
|
+
nonce: UInt64Option.none(UInt64.zero),
|
|
42
|
+
sender: PublicKeyOption.none(EMPTY_PUBLICKEY),
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public static dummyTransaction(): RuntimeTransaction {
|
|
47
|
+
return new RuntimeTransaction({
|
|
48
|
+
methodId: Field(0),
|
|
49
|
+
nonce: new UInt64Option({
|
|
50
|
+
isSome: Bool(true),
|
|
51
|
+
value: UInt64.zero,
|
|
52
|
+
}),
|
|
53
|
+
sender: new PublicKeyOption({
|
|
54
|
+
isSome: Bool(true),
|
|
55
|
+
value: EMPTY_PUBLICKEY,
|
|
56
|
+
}),
|
|
57
|
+
argsHash: Field(0),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public assertTransactionType(isMessage: Bool) {
|
|
62
|
+
const isTransaction = isMessage.not();
|
|
63
|
+
// isSome has to be true when it is a transaction, otherwise false
|
|
64
|
+
this.nonce.isSome
|
|
65
|
+
.equals(isTransaction)
|
|
66
|
+
.assertTrue("Nonce is not right option isSome for type");
|
|
67
|
+
this.sender.isSome
|
|
68
|
+
.equals(isTransaction)
|
|
69
|
+
.assertTrue("Sender is not right option isSome for type");
|
|
70
|
+
this.sender.value.x
|
|
71
|
+
.equals(EMPTY_PUBLICKEY_X)
|
|
72
|
+
.equals(isMessage)
|
|
73
|
+
.assertTrue("Transaction sender is not set to dummy");
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
public hashData(): Field[] {
|
|
77
|
+
return [
|
|
78
|
+
this.methodId,
|
|
79
|
+
...this.sender.value.toFields(),
|
|
80
|
+
...this.nonce.value.toFields(),
|
|
81
|
+
this.argsHash,
|
|
82
|
+
];
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
public static fromHashData(fields: Field[]) {
|
|
86
|
+
// sender is 2nd and the first element is x (2nd isOdd)
|
|
87
|
+
const isMessage = fields[1].equals(EMPTY_PUBLICKEY_X);
|
|
88
|
+
return new RuntimeTransaction({
|
|
89
|
+
methodId: fields[0],
|
|
90
|
+
sender: new PublicKeyOption({
|
|
91
|
+
isSome: isMessage.not(),
|
|
92
|
+
value: PublicKey.fromFields([fields[1], fields[2]]),
|
|
93
|
+
}),
|
|
94
|
+
nonce: new UInt64Option({
|
|
95
|
+
isSome: isMessage.not(),
|
|
96
|
+
value: UInt64.fromFields([fields[3]]),
|
|
97
|
+
}),
|
|
98
|
+
argsHash: fields[4],
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
public hash(): Field {
|
|
103
|
+
return Poseidon.hash(this.hashData());
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { Bool, Field, Scalar, Signature, Struct, UInt64 } from "o1js";
|
|
2
|
+
|
|
3
|
+
import { RuntimeTransaction } from "./RuntimeTransaction";
|
|
4
|
+
|
|
5
|
+
export class SignedTransaction extends Struct({
|
|
6
|
+
transaction: RuntimeTransaction,
|
|
7
|
+
signature: Signature,
|
|
8
|
+
}) {
|
|
9
|
+
public static getSignatureData(args: {
|
|
10
|
+
methodId: Field;
|
|
11
|
+
nonce: UInt64;
|
|
12
|
+
argsHash: Field;
|
|
13
|
+
}): Field[] {
|
|
14
|
+
return [args.methodId, ...args.nonce.value.toFields(), args.argsHash];
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
public static dummy(): SignedTransaction {
|
|
18
|
+
return new SignedTransaction({
|
|
19
|
+
transaction: RuntimeTransaction.dummyTransaction(),
|
|
20
|
+
|
|
21
|
+
signature: Signature.fromObject({
|
|
22
|
+
s: Scalar.from(0),
|
|
23
|
+
r: Field(0),
|
|
24
|
+
}),
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public hash(): Field {
|
|
29
|
+
return this.transaction.hash();
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
public getSignatureData(): Field[] {
|
|
33
|
+
const { methodId, argsHash, nonce } = this.transaction;
|
|
34
|
+
return SignedTransaction.getSignatureData({
|
|
35
|
+
nonce: nonce.value,
|
|
36
|
+
methodId,
|
|
37
|
+
argsHash,
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
public validateSignature(): Bool {
|
|
42
|
+
return this.signature.verify(
|
|
43
|
+
this.transaction.sender.value,
|
|
44
|
+
this.getSignatureData()
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Bool, ProvableExtended, PublicKey, Struct, UInt64 } from "o1js";
|
|
2
|
+
|
|
3
|
+
function genericOptionFactory<Type>(valueType: ProvableExtended<Type>) {
|
|
4
|
+
return class Generic extends Struct({
|
|
5
|
+
isSome: Bool,
|
|
6
|
+
value: valueType,
|
|
7
|
+
}) {
|
|
8
|
+
public static fromSome(value: Type) {
|
|
9
|
+
return new Generic({
|
|
10
|
+
isSome: Bool(true),
|
|
11
|
+
value,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public static none(value: Type) {
|
|
16
|
+
return new Generic({
|
|
17
|
+
isSome: Bool(false),
|
|
18
|
+
value,
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class UInt64Option extends genericOptionFactory<UInt64>(UInt64) {}
|
|
25
|
+
|
|
26
|
+
export class PublicKeyOption extends genericOptionFactory<PublicKey>(
|
|
27
|
+
PublicKey
|
|
28
|
+
) {}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AreProofsEnabled,
|
|
3
|
+
ChildContainerProvider,
|
|
4
|
+
log,
|
|
5
|
+
ModuleContainer,
|
|
6
|
+
ModulesConfig,
|
|
7
|
+
ModulesRecord,
|
|
8
|
+
StringKeyOf,
|
|
9
|
+
TypedClass,
|
|
10
|
+
} from "@proto-kit/common";
|
|
11
|
+
import { DependencyContainer, Lifecycle } from "tsyringe";
|
|
12
|
+
|
|
13
|
+
import { BlockProvable } from "../prover/block/BlockProvable";
|
|
14
|
+
import { StateTransitionProvable } from "../prover/statetransition/StateTransitionProvable";
|
|
15
|
+
import { StateServiceProvider } from "../state/StateServiceProvider";
|
|
16
|
+
import { SimpleAsyncStateService } from "../state/StateService";
|
|
17
|
+
import { NoopBlockHook } from "../hooks/NoopBlockHook";
|
|
18
|
+
import { BlockHeightHook } from "../hooks/BlockHeightHook";
|
|
19
|
+
import { LastStateRootBlockHook } from "../hooks/LastStateRootBlockHook";
|
|
20
|
+
import { ProvableSettlementHook } from "../settlement/modularity/ProvableSettlementHook";
|
|
21
|
+
import { NoopSettlementHook } from "../hooks/NoopSettlementHook";
|
|
22
|
+
import { AccountStateHook } from "../hooks/AccountStateHook";
|
|
23
|
+
import { NoopTransactionHook } from "../hooks/NoopTransactionHook";
|
|
24
|
+
|
|
25
|
+
import { ProtocolModule } from "./ProtocolModule";
|
|
26
|
+
import { ProvableTransactionHook } from "./ProvableTransactionHook";
|
|
27
|
+
import { ProtocolEnvironment } from "./ProtocolEnvironment";
|
|
28
|
+
import { ProvableBlockHook } from "./ProvableBlockHook";
|
|
29
|
+
|
|
30
|
+
const PROTOCOL_INJECTION_TOKENS: Record<string, string> = {
|
|
31
|
+
ProvableTransactionHook: "ProvableTransactionHook",
|
|
32
|
+
ProvableBlockHook: "ProvableBlockHook",
|
|
33
|
+
ProvableSettlementHook: "ProvableSettlementHook",
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export type ProtocolModulesRecord = ModulesRecord<
|
|
37
|
+
TypedClass<ProtocolModule<unknown>>
|
|
38
|
+
>;
|
|
39
|
+
|
|
40
|
+
export interface BlockProverType extends ProtocolModule, BlockProvable {}
|
|
41
|
+
|
|
42
|
+
export interface StateTransitionProverType
|
|
43
|
+
extends ProtocolModule,
|
|
44
|
+
StateTransitionProvable {}
|
|
45
|
+
|
|
46
|
+
export type MandatoryProtocolModulesRecord = {
|
|
47
|
+
BlockProver: TypedClass<BlockProverType>;
|
|
48
|
+
StateTransitionProver: TypedClass<StateTransitionProverType>;
|
|
49
|
+
AccountState: TypedClass<AccountStateHook>;
|
|
50
|
+
BlockHeight: TypedClass<BlockHeightHook>;
|
|
51
|
+
LastStateRoot: TypedClass<LastStateRootBlockHook>;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export interface ProtocolDefinition<Modules extends ProtocolModulesRecord> {
|
|
55
|
+
modules: Modules;
|
|
56
|
+
config?: ModulesConfig<Modules>;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export class Protocol<
|
|
60
|
+
Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord,
|
|
61
|
+
>
|
|
62
|
+
extends ModuleContainer<Modules>
|
|
63
|
+
implements ProtocolEnvironment
|
|
64
|
+
{
|
|
65
|
+
public static from<
|
|
66
|
+
Modules extends ProtocolModulesRecord & MandatoryProtocolModulesRecord,
|
|
67
|
+
>(modules: ProtocolDefinition<Modules>): TypedClass<Protocol<Modules>> {
|
|
68
|
+
return class ScopedProtocol extends Protocol<Modules> {
|
|
69
|
+
public constructor() {
|
|
70
|
+
super(modules);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
public definition: ProtocolDefinition<Modules>;
|
|
76
|
+
|
|
77
|
+
public constructor(definition: ProtocolDefinition<Modules>) {
|
|
78
|
+
super(definition);
|
|
79
|
+
this.definition = definition;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
public get stateService(): SimpleAsyncStateService {
|
|
83
|
+
return this.stateServiceProvider.stateService;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public get stateServiceProvider(): StateServiceProvider {
|
|
87
|
+
return this.container.resolve<StateServiceProvider>("StateServiceProvider");
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
public decorateModule(
|
|
91
|
+
moduleName: StringKeyOf<Modules>,
|
|
92
|
+
containedModule: InstanceType<Modules[StringKeyOf<Modules>]>
|
|
93
|
+
) {
|
|
94
|
+
log.debug(`Decorated ${moduleName}`);
|
|
95
|
+
containedModule.protocol = this;
|
|
96
|
+
|
|
97
|
+
if (containedModule instanceof ProvableTransactionHook) {
|
|
98
|
+
containedModule.name = moduleName;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
super.decorateModule(moduleName, containedModule);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public get dependencyContainer(): DependencyContainer {
|
|
105
|
+
return this.container;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
private isModule(
|
|
109
|
+
moduleName: keyof Modules
|
|
110
|
+
): moduleName is StringKeyOf<Modules> {
|
|
111
|
+
return this.definition.modules[moduleName] !== undefined;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
public get blockProver(): BlockProvable {
|
|
115
|
+
// Why do I resolve directly here?
|
|
116
|
+
// I don't know exactly but generics don't let me use .resolve()
|
|
117
|
+
return this.container.resolve<InstanceType<Modules["BlockProver"]>>(
|
|
118
|
+
"BlockProver"
|
|
119
|
+
);
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
public get stateTransitionProver(): StateTransitionProvable {
|
|
123
|
+
return this.container.resolve<
|
|
124
|
+
InstanceType<Modules["StateTransitionProver"]>
|
|
125
|
+
>("StateTransitionProver");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public getAreProofsEnabled(): AreProofsEnabled {
|
|
129
|
+
return this.container.resolve<AreProofsEnabled>("AreProofsEnabled");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
public create(childContainerProvider: ChildContainerProvider) {
|
|
133
|
+
super.create(childContainerProvider);
|
|
134
|
+
|
|
135
|
+
// Register the BlockModules seperately since we need to
|
|
136
|
+
// inject them differently later
|
|
137
|
+
const ABSTRACT_MODULE_TYPES = [
|
|
138
|
+
{ type: ProvableTransactionHook, defaultType: NoopTransactionHook },
|
|
139
|
+
{ type: ProvableBlockHook, defaultType: NoopBlockHook },
|
|
140
|
+
{ type: ProvableSettlementHook, defaultType: NoopSettlementHook },
|
|
141
|
+
] as const;
|
|
142
|
+
|
|
143
|
+
ABSTRACT_MODULE_TYPES.forEach((moduleTypeRegistration) => {
|
|
144
|
+
const abstractType = moduleTypeRegistration.type;
|
|
145
|
+
|
|
146
|
+
const implementingModules = Object.entries(
|
|
147
|
+
this.definition.modules
|
|
148
|
+
).filter(([, value]) =>
|
|
149
|
+
Object.prototype.isPrototypeOf.call(abstractType, value)
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
const newInjectionToken: string | undefined =
|
|
153
|
+
PROTOCOL_INJECTION_TOKENS[abstractType.name];
|
|
154
|
+
|
|
155
|
+
if (newInjectionToken === undefined) {
|
|
156
|
+
log.error(
|
|
157
|
+
"Can't inject hook under the underlying hook token: Alias not found in mapping"
|
|
158
|
+
);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
implementingModules.forEach(([key]) => {
|
|
163
|
+
this.container.register(
|
|
164
|
+
abstractType.name,
|
|
165
|
+
{ useToken: key },
|
|
166
|
+
{ lifecycle: Lifecycle.ContainerScoped }
|
|
167
|
+
);
|
|
168
|
+
});
|
|
169
|
+
if (implementingModules.length === 0) {
|
|
170
|
+
// This type annotation shouldn't change anything but is necessary
|
|
171
|
+
// bcs tsyringe complains
|
|
172
|
+
const { defaultType }: { defaultType: TypedClass<unknown> } =
|
|
173
|
+
moduleTypeRegistration;
|
|
174
|
+
|
|
175
|
+
// Register default (noop) version
|
|
176
|
+
this.container.register(
|
|
177
|
+
abstractType.name,
|
|
178
|
+
{ useClass: defaultType },
|
|
179
|
+
{ lifecycle: Lifecycle.ContainerScoped }
|
|
180
|
+
);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
public async start() {
|
|
186
|
+
// eslint-disable-next-line guard-for-in
|
|
187
|
+
for (const moduleName in this.definition.modules) {
|
|
188
|
+
const protocolModule = this.resolve(moduleName);
|
|
189
|
+
|
|
190
|
+
log.info(
|
|
191
|
+
`Starting protocol module ${moduleName} (${protocolModule.constructor.name})`
|
|
192
|
+
);
|
|
193
|
+
// eslint-disable-next-line no-await-in-loop
|
|
194
|
+
await protocolModule.start();
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AreProofsEnabled } from "@proto-kit/common";
|
|
2
|
+
|
|
3
|
+
import { SimpleAsyncStateService } from "../state/StateService";
|
|
4
|
+
import { StateServiceProvider } from "../state/StateServiceProvider";
|
|
5
|
+
|
|
6
|
+
export interface ProtocolEnvironment {
|
|
7
|
+
get stateService(): SimpleAsyncStateService;
|
|
8
|
+
get stateServiceProvider(): StateServiceProvider;
|
|
9
|
+
getAreProofsEnabled(): AreProofsEnabled;
|
|
10
|
+
}
|