@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,16 @@
|
|
|
1
|
+
import { createMerkleTree } from "@proto-kit/common";
|
|
2
|
+
import { Bool, Field, Poseidon, Struct } from "o1js";
|
|
3
|
+
|
|
4
|
+
export class BlockHashMerkleTree extends createMerkleTree(40) {}
|
|
5
|
+
export class BlockHashMerkleTreeWitness extends BlockHashMerkleTree.WITNESS {}
|
|
6
|
+
|
|
7
|
+
export class BlockHashTreeEntry extends Struct({
|
|
8
|
+
blockHash: Field,
|
|
9
|
+
closed: Bool,
|
|
10
|
+
// TODO We could add startingEternalTransactionsHash here to offer
|
|
11
|
+
// a more trivial connection to the sequence state
|
|
12
|
+
}) {
|
|
13
|
+
public hash(): Field {
|
|
14
|
+
return Poseidon.hash([this.blockHash, ...this.closed.toFields()]);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createMerkleTree } from "@proto-kit/common";
|
|
2
|
+
import { Field, Poseidon, Struct, VerificationKey } from "o1js";
|
|
3
|
+
|
|
4
|
+
export const treeFeeHeight = 10;
|
|
5
|
+
export class VKTree extends createMerkleTree(treeFeeHeight) {}
|
|
6
|
+
export class VKTreeWitness extends VKTree.WITNESS {}
|
|
7
|
+
|
|
8
|
+
export class RuntimeVerificationKeyAttestation extends Struct({
|
|
9
|
+
verificationKey: VerificationKey,
|
|
10
|
+
witness: VKTreeWitness,
|
|
11
|
+
}) {}
|
|
12
|
+
|
|
13
|
+
export class MethodVKConfigData extends Struct({
|
|
14
|
+
methodId: Field,
|
|
15
|
+
vkHash: Field,
|
|
16
|
+
}) {
|
|
17
|
+
public hash() {
|
|
18
|
+
return Poseidon.hash(MethodVKConfigData.toFields(this));
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface MinimalVKTreeService {
|
|
23
|
+
getRoot: () => bigint;
|
|
24
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
2
|
+
|
|
3
|
+
import { MinimalVKTreeService } from "../accummulators/RuntimeVerificationKeyTree";
|
|
4
|
+
|
|
5
|
+
@injectable()
|
|
6
|
+
@scoped(Lifecycle.ContainerScoped)
|
|
7
|
+
export class RuntimeVerificationKeyRootService implements MinimalVKTreeService {
|
|
8
|
+
private injectedRoot?: bigint;
|
|
9
|
+
|
|
10
|
+
public setRoot(root: bigint) {
|
|
11
|
+
this.injectedRoot = root;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public getRoot() {
|
|
15
|
+
if (this.injectedRoot === undefined) {
|
|
16
|
+
throw new Error("VKTree root not set");
|
|
17
|
+
}
|
|
18
|
+
return this.injectedRoot;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Field, Proof, Struct } from "o1js";
|
|
2
|
+
import { WithZkProgrammable } from "@proto-kit/common";
|
|
3
|
+
|
|
4
|
+
import { StateTransitionProvableBatch } from "../../model/StateTransitionProvableBatch";
|
|
5
|
+
|
|
6
|
+
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
|
|
7
|
+
|
|
8
|
+
export class StateTransitionProverPublicInput extends Struct({
|
|
9
|
+
stateTransitionsHash: Field,
|
|
10
|
+
protocolTransitionsHash: Field,
|
|
11
|
+
stateRoot: Field,
|
|
12
|
+
protocolStateRoot: Field,
|
|
13
|
+
}) {}
|
|
14
|
+
|
|
15
|
+
export class StateTransitionProverPublicOutput extends Struct({
|
|
16
|
+
stateTransitionsHash: Field,
|
|
17
|
+
protocolTransitionsHash: Field,
|
|
18
|
+
stateRoot: Field,
|
|
19
|
+
protocolStateRoot: Field,
|
|
20
|
+
}) {}
|
|
21
|
+
|
|
22
|
+
export type StateTransitionProof = Proof<
|
|
23
|
+
StateTransitionProverPublicInput,
|
|
24
|
+
StateTransitionProverPublicOutput
|
|
25
|
+
>;
|
|
26
|
+
|
|
27
|
+
export interface StateTransitionProvable
|
|
28
|
+
extends WithZkProgrammable<
|
|
29
|
+
StateTransitionProverPublicInput,
|
|
30
|
+
StateTransitionProverPublicOutput
|
|
31
|
+
> {
|
|
32
|
+
witnessProviderReference: StateTransitionWitnessProviderReference;
|
|
33
|
+
|
|
34
|
+
runBatch: (
|
|
35
|
+
publicInput: StateTransitionProverPublicInput,
|
|
36
|
+
batch: StateTransitionProvableBatch
|
|
37
|
+
) => Promise<StateTransitionProverPublicOutput>;
|
|
38
|
+
|
|
39
|
+
merge: (
|
|
40
|
+
publicInput: StateTransitionProverPublicInput,
|
|
41
|
+
proof1: StateTransitionProof,
|
|
42
|
+
proof2: StateTransitionProof
|
|
43
|
+
) => Promise<StateTransitionProverPublicOutput>;
|
|
44
|
+
}
|
|
@@ -0,0 +1,371 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AreProofsEnabled,
|
|
3
|
+
PlainZkProgram,
|
|
4
|
+
provableMethod,
|
|
5
|
+
RollupMerkleTreeWitness,
|
|
6
|
+
ZkProgrammable,
|
|
7
|
+
} from "@proto-kit/common";
|
|
8
|
+
import { Field, Provable, SelfProof, ZkProgram } from "o1js";
|
|
9
|
+
import { injectable } from "tsyringe";
|
|
10
|
+
|
|
11
|
+
import { constants } from "../../Constants";
|
|
12
|
+
import { ProvableStateTransition } from "../../model/StateTransition";
|
|
13
|
+
import {
|
|
14
|
+
ProvableStateTransitionType,
|
|
15
|
+
StateTransitionProvableBatch,
|
|
16
|
+
} from "../../model/StateTransitionProvableBatch";
|
|
17
|
+
import { StateTransitionProverType } from "../../protocol/Protocol";
|
|
18
|
+
import { ProtocolModule } from "../../protocol/ProtocolModule";
|
|
19
|
+
import {
|
|
20
|
+
DefaultProvableHashList,
|
|
21
|
+
ProvableHashList,
|
|
22
|
+
} from "../../utils/ProvableHashList";
|
|
23
|
+
|
|
24
|
+
import {
|
|
25
|
+
StateTransitionProof,
|
|
26
|
+
StateTransitionProvable,
|
|
27
|
+
StateTransitionProverPublicInput,
|
|
28
|
+
StateTransitionProverPublicOutput,
|
|
29
|
+
} from "./StateTransitionProvable";
|
|
30
|
+
import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
|
|
31
|
+
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
|
|
32
|
+
|
|
33
|
+
const errors = {
|
|
34
|
+
propertyNotMatching: (property: string, step: string) =>
|
|
35
|
+
`${property} not matching ${step}`,
|
|
36
|
+
|
|
37
|
+
merkleWitnessNotCorrect: (index: number, type: string) =>
|
|
38
|
+
`MerkleWitness not valid for StateTransition (${index}, type ${type})`,
|
|
39
|
+
|
|
40
|
+
noWitnessProviderSet: () =>
|
|
41
|
+
new Error(
|
|
42
|
+
"WitnessProvider not set, set it before you use StateTransitionProvider"
|
|
43
|
+
),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
interface StateTransitionProverExecutionState {
|
|
47
|
+
stateRoot: Field;
|
|
48
|
+
protocolStateRoot: Field;
|
|
49
|
+
stateTransitionList: ProvableHashList<ProvableStateTransition>;
|
|
50
|
+
protocolTransitionList: ProvableHashList<ProvableStateTransition>;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const StateTransitionSelfProofClass = SelfProof<
|
|
54
|
+
StateTransitionProverPublicInput,
|
|
55
|
+
StateTransitionProverPublicOutput
|
|
56
|
+
>;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* StateTransitionProver is the prover that proves the application of some state
|
|
60
|
+
* transitions and checks and updates their merkle-tree entries
|
|
61
|
+
*/
|
|
62
|
+
export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
63
|
+
StateTransitionProverPublicInput,
|
|
64
|
+
StateTransitionProverPublicOutput
|
|
65
|
+
> {
|
|
66
|
+
public constructor(
|
|
67
|
+
private readonly stateTransitionProver: StateTransitionProver,
|
|
68
|
+
public readonly witnessProviderReference: StateTransitionWitnessProviderReference
|
|
69
|
+
) {
|
|
70
|
+
super();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
public get appChain(): AreProofsEnabled | undefined {
|
|
74
|
+
return this.stateTransitionProver.appChain;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
public zkProgramFactory(): PlainZkProgram<
|
|
78
|
+
StateTransitionProverPublicInput,
|
|
79
|
+
StateTransitionProverPublicOutput
|
|
80
|
+
>[] {
|
|
81
|
+
const instance = this;
|
|
82
|
+
|
|
83
|
+
const program = ZkProgram({
|
|
84
|
+
name: "StateTransitionProver",
|
|
85
|
+
publicInput: StateTransitionProverPublicInput,
|
|
86
|
+
publicOutput: StateTransitionProverPublicOutput,
|
|
87
|
+
|
|
88
|
+
methods: {
|
|
89
|
+
proveBatch: {
|
|
90
|
+
privateInputs: [StateTransitionProvableBatch],
|
|
91
|
+
|
|
92
|
+
async method(
|
|
93
|
+
publicInput: StateTransitionProverPublicInput,
|
|
94
|
+
batch: StateTransitionProvableBatch
|
|
95
|
+
) {
|
|
96
|
+
return await instance.runBatch(publicInput, batch);
|
|
97
|
+
},
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
merge: {
|
|
101
|
+
privateInputs: [
|
|
102
|
+
StateTransitionSelfProofClass,
|
|
103
|
+
StateTransitionSelfProofClass,
|
|
104
|
+
],
|
|
105
|
+
|
|
106
|
+
async method(
|
|
107
|
+
publicInput: StateTransitionProverPublicInput,
|
|
108
|
+
proof1: StateTransitionProof,
|
|
109
|
+
proof2: StateTransitionProof
|
|
110
|
+
) {
|
|
111
|
+
return await instance.merge(publicInput, proof1, proof2);
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const methods = {
|
|
118
|
+
proveBatch: program.proveBatch.bind(program),
|
|
119
|
+
merge: program.merge.bind(program),
|
|
120
|
+
};
|
|
121
|
+
|
|
122
|
+
const SelfProofClass = ZkProgram.Proof(program);
|
|
123
|
+
|
|
124
|
+
return [
|
|
125
|
+
{
|
|
126
|
+
compile: program.compile.bind(program),
|
|
127
|
+
verify: program.verify.bind(program),
|
|
128
|
+
analyzeMethods: program.analyzeMethods.bind(program),
|
|
129
|
+
Proof: SelfProofClass,
|
|
130
|
+
methods,
|
|
131
|
+
},
|
|
132
|
+
];
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
private get witnessProvider(): StateTransitionWitnessProvider {
|
|
136
|
+
const provider = this.witnessProviderReference.getWitnessProvider();
|
|
137
|
+
if (provider === undefined) {
|
|
138
|
+
throw errors.noWitnessProviderSet();
|
|
139
|
+
}
|
|
140
|
+
return provider;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Applies the state transitions to the current stateRoot
|
|
145
|
+
* and returns the new prover state
|
|
146
|
+
*/
|
|
147
|
+
public applyTransitions(
|
|
148
|
+
stateRoot: Field,
|
|
149
|
+
protocolStateRoot: Field,
|
|
150
|
+
stateTransitionCommitmentFrom: Field,
|
|
151
|
+
protocolTransitionCommitmentFrom: Field,
|
|
152
|
+
transitionBatch: StateTransitionProvableBatch
|
|
153
|
+
): StateTransitionProverExecutionState {
|
|
154
|
+
const state: StateTransitionProverExecutionState = {
|
|
155
|
+
stateRoot,
|
|
156
|
+
protocolStateRoot,
|
|
157
|
+
|
|
158
|
+
stateTransitionList: new DefaultProvableHashList(
|
|
159
|
+
ProvableStateTransition,
|
|
160
|
+
stateTransitionCommitmentFrom
|
|
161
|
+
),
|
|
162
|
+
|
|
163
|
+
protocolTransitionList: new DefaultProvableHashList(
|
|
164
|
+
ProvableStateTransition,
|
|
165
|
+
protocolTransitionCommitmentFrom
|
|
166
|
+
),
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
const transitions = transitionBatch.batch;
|
|
170
|
+
const types = transitionBatch.transitionTypes;
|
|
171
|
+
for (
|
|
172
|
+
let index = 0;
|
|
173
|
+
index < constants.stateTransitionProverBatchSize;
|
|
174
|
+
index++
|
|
175
|
+
) {
|
|
176
|
+
this.applyTransition(state, transitions[index], types[index], index);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return state;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Applies a single state transition to the given state
|
|
184
|
+
* and mutates it in place
|
|
185
|
+
*/
|
|
186
|
+
public applyTransition(
|
|
187
|
+
state: StateTransitionProverExecutionState,
|
|
188
|
+
transition: ProvableStateTransition,
|
|
189
|
+
type: ProvableStateTransitionType,
|
|
190
|
+
index = 0
|
|
191
|
+
) {
|
|
192
|
+
const witness = Provable.witness(RollupMerkleTreeWitness, () =>
|
|
193
|
+
this.witnessProvider.getWitness(transition.path)
|
|
194
|
+
);
|
|
195
|
+
|
|
196
|
+
const membershipValid = witness.checkMembership(
|
|
197
|
+
state.stateRoot,
|
|
198
|
+
transition.path,
|
|
199
|
+
transition.from.value
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
membershipValid
|
|
203
|
+
.or(transition.from.isSome.not())
|
|
204
|
+
.assertTrue(
|
|
205
|
+
errors.merkleWitnessNotCorrect(
|
|
206
|
+
index,
|
|
207
|
+
type.isNormal().toBoolean() ? "normal" : "protocol"
|
|
208
|
+
)
|
|
209
|
+
);
|
|
210
|
+
|
|
211
|
+
const newRoot = witness.calculateRoot(transition.to.value);
|
|
212
|
+
|
|
213
|
+
state.stateRoot = Provable.if(
|
|
214
|
+
transition.to.isSome,
|
|
215
|
+
newRoot,
|
|
216
|
+
state.stateRoot
|
|
217
|
+
);
|
|
218
|
+
|
|
219
|
+
// Only update protocol state root if ST is also of type protocol
|
|
220
|
+
// Since protocol STs are all at the start of the batch, this works
|
|
221
|
+
state.protocolStateRoot = Provable.if(
|
|
222
|
+
transition.to.isSome.and(type.isProtocol()),
|
|
223
|
+
newRoot,
|
|
224
|
+
state.protocolStateRoot
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
const isNotDummy = transition.path.equals(Field(0)).not();
|
|
228
|
+
|
|
229
|
+
state.stateTransitionList.pushIf(
|
|
230
|
+
transition,
|
|
231
|
+
isNotDummy.and(type.isNormal())
|
|
232
|
+
);
|
|
233
|
+
state.protocolTransitionList.pushIf(
|
|
234
|
+
transition,
|
|
235
|
+
isNotDummy.and(type.isProtocol())
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Applies a whole batch of StateTransitions at once
|
|
241
|
+
*/
|
|
242
|
+
@provableMethod()
|
|
243
|
+
public async runBatch(
|
|
244
|
+
publicInput: StateTransitionProverPublicInput,
|
|
245
|
+
batch: StateTransitionProvableBatch
|
|
246
|
+
): Promise<StateTransitionProverPublicOutput> {
|
|
247
|
+
const result = this.applyTransitions(
|
|
248
|
+
publicInput.stateRoot,
|
|
249
|
+
publicInput.protocolStateRoot,
|
|
250
|
+
publicInput.stateTransitionsHash,
|
|
251
|
+
publicInput.protocolTransitionsHash,
|
|
252
|
+
batch
|
|
253
|
+
);
|
|
254
|
+
|
|
255
|
+
return new StateTransitionProverPublicOutput({
|
|
256
|
+
stateRoot: result.stateRoot,
|
|
257
|
+
stateTransitionsHash: result.stateTransitionList.commitment,
|
|
258
|
+
protocolTransitionsHash: result.protocolTransitionList.commitment,
|
|
259
|
+
protocolStateRoot: result.protocolStateRoot,
|
|
260
|
+
});
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
@provableMethod()
|
|
264
|
+
public async merge(
|
|
265
|
+
publicInput: StateTransitionProverPublicInput,
|
|
266
|
+
proof1: StateTransitionProof,
|
|
267
|
+
proof2: StateTransitionProof
|
|
268
|
+
): Promise<StateTransitionProverPublicOutput> {
|
|
269
|
+
proof1.verify();
|
|
270
|
+
proof2.verify();
|
|
271
|
+
|
|
272
|
+
// Check state
|
|
273
|
+
publicInput.stateRoot.assertEquals(
|
|
274
|
+
proof1.publicInput.stateRoot,
|
|
275
|
+
errors.propertyNotMatching("stateRoot", "publicInput.from -> proof1.from")
|
|
276
|
+
);
|
|
277
|
+
proof1.publicOutput.stateRoot.assertEquals(
|
|
278
|
+
proof2.publicInput.stateRoot,
|
|
279
|
+
errors.propertyNotMatching("stateRoot", "proof1.to -> proof2.from")
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
// Check ST list
|
|
283
|
+
publicInput.stateTransitionsHash.assertEquals(
|
|
284
|
+
proof1.publicInput.stateTransitionsHash,
|
|
285
|
+
errors.propertyNotMatching(
|
|
286
|
+
"stateTransitionsHash",
|
|
287
|
+
"publicInput.from -> proof1.from"
|
|
288
|
+
)
|
|
289
|
+
);
|
|
290
|
+
proof1.publicOutput.stateTransitionsHash.assertEquals(
|
|
291
|
+
proof2.publicInput.stateTransitionsHash,
|
|
292
|
+
errors.propertyNotMatching(
|
|
293
|
+
"stateTransitionsHash",
|
|
294
|
+
"proof1.to -> proof2.from"
|
|
295
|
+
)
|
|
296
|
+
);
|
|
297
|
+
|
|
298
|
+
// Check Protocol ST list
|
|
299
|
+
publicInput.protocolTransitionsHash.assertEquals(
|
|
300
|
+
proof1.publicInput.protocolTransitionsHash,
|
|
301
|
+
errors.propertyNotMatching(
|
|
302
|
+
"protocolTransitionsHash",
|
|
303
|
+
"publicInput.from -> proof1.from"
|
|
304
|
+
)
|
|
305
|
+
);
|
|
306
|
+
proof1.publicOutput.protocolTransitionsHash.assertEquals(
|
|
307
|
+
proof2.publicInput.protocolTransitionsHash,
|
|
308
|
+
errors.propertyNotMatching(
|
|
309
|
+
"protocolTransitionsHash",
|
|
310
|
+
"proof1.to -> proof2.from"
|
|
311
|
+
)
|
|
312
|
+
);
|
|
313
|
+
|
|
314
|
+
// Check protocol state root
|
|
315
|
+
publicInput.protocolStateRoot.assertEquals(
|
|
316
|
+
proof1.publicInput.protocolStateRoot,
|
|
317
|
+
errors.propertyNotMatching(
|
|
318
|
+
"protocolStateRoot",
|
|
319
|
+
"publicInput.from -> proof1.from"
|
|
320
|
+
)
|
|
321
|
+
);
|
|
322
|
+
proof1.publicOutput.protocolStateRoot.assertEquals(
|
|
323
|
+
proof2.publicInput.protocolStateRoot,
|
|
324
|
+
errors.propertyNotMatching(
|
|
325
|
+
"protocolStateRoot",
|
|
326
|
+
"proof1.to -> proof2.from"
|
|
327
|
+
)
|
|
328
|
+
);
|
|
329
|
+
|
|
330
|
+
return new StateTransitionProverPublicInput({
|
|
331
|
+
stateRoot: proof2.publicOutput.stateRoot,
|
|
332
|
+
stateTransitionsHash: proof2.publicOutput.stateTransitionsHash,
|
|
333
|
+
protocolTransitionsHash: proof2.publicOutput.protocolTransitionsHash,
|
|
334
|
+
protocolStateRoot: proof2.publicOutput.protocolStateRoot,
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
@injectable()
|
|
340
|
+
export class StateTransitionProver
|
|
341
|
+
extends ProtocolModule
|
|
342
|
+
implements StateTransitionProvable, StateTransitionProverType
|
|
343
|
+
{
|
|
344
|
+
public zkProgrammable: StateTransitionProverProgrammable;
|
|
345
|
+
|
|
346
|
+
public constructor(
|
|
347
|
+
// Injected
|
|
348
|
+
public readonly witnessProviderReference: StateTransitionWitnessProviderReference
|
|
349
|
+
) {
|
|
350
|
+
super();
|
|
351
|
+
this.zkProgrammable = new StateTransitionProverProgrammable(
|
|
352
|
+
this,
|
|
353
|
+
witnessProviderReference
|
|
354
|
+
);
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
public runBatch(
|
|
358
|
+
publicInput: StateTransitionProverPublicInput,
|
|
359
|
+
batch: StateTransitionProvableBatch
|
|
360
|
+
): Promise<StateTransitionProverPublicOutput> {
|
|
361
|
+
return this.zkProgrammable.runBatch(publicInput, batch);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
public merge(
|
|
365
|
+
publicInput: StateTransitionProverPublicInput,
|
|
366
|
+
proof1: StateTransitionProof,
|
|
367
|
+
proof2: StateTransitionProof
|
|
368
|
+
): Promise<StateTransitionProverPublicOutput> {
|
|
369
|
+
return this.zkProgrammable.merge(publicInput, proof1, proof2);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { Field } from "o1js";
|
|
2
|
+
import { injectable } from "tsyringe";
|
|
3
|
+
import { RollupMerkleTreeWitness } from "@proto-kit/common";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Interface for providing merkle witnesses to the state-transition prover
|
|
7
|
+
*/
|
|
8
|
+
export interface StateTransitionWitnessProvider {
|
|
9
|
+
/**
|
|
10
|
+
* Provides the merkle witness corresponding to the given key
|
|
11
|
+
* @param key Merkle-tree key
|
|
12
|
+
*/
|
|
13
|
+
getWitness: (key: Field) => RollupMerkleTreeWitness;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
@injectable()
|
|
17
|
+
export class NoOpStateTransitionWitnessProvider
|
|
18
|
+
implements StateTransitionWitnessProvider
|
|
19
|
+
{
|
|
20
|
+
public getWitness(): RollupMerkleTreeWitness {
|
|
21
|
+
return new RollupMerkleTreeWitness({ path: [], isLeft: [] });
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { injectable, Lifecycle, scoped } from "tsyringe";
|
|
2
|
+
|
|
3
|
+
import { StateTransitionWitnessProvider } from "./StateTransitionWitnessProvider";
|
|
4
|
+
|
|
5
|
+
@injectable()
|
|
6
|
+
@scoped(Lifecycle.ContainerScoped)
|
|
7
|
+
export class StateTransitionWitnessProviderReference {
|
|
8
|
+
private witnessProvider?: StateTransitionWitnessProvider;
|
|
9
|
+
|
|
10
|
+
public setWitnessProvider(provider: StateTransitionWitnessProvider) {
|
|
11
|
+
this.witnessProvider = provider;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public getWitnessProvider(): StateTransitionWitnessProvider | undefined {
|
|
15
|
+
return this.witnessProvider;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { ConfigurableModule, NoConfig, TypedClass } from "@proto-kit/common";
|
|
2
|
+
import { SmartContract } from "o1js";
|
|
3
|
+
|
|
4
|
+
export type SmartContractClassFromInterface<Type> = typeof SmartContract &
|
|
5
|
+
TypedClass<Type>;
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* This module type is used to define a contract module that can be used to
|
|
9
|
+
* construct and inject smart contract instances.
|
|
10
|
+
* It defines a method contractFactory, whose arguments can be configured via
|
|
11
|
+
* the Argument generic. It returns a smart contract class that is a subclass
|
|
12
|
+
* of SmartContract and implements a certain interface as specified by the
|
|
13
|
+
* ContractType generic.
|
|
14
|
+
*/
|
|
15
|
+
export abstract class ContractModule<
|
|
16
|
+
ContractType,
|
|
17
|
+
// undefined = no args
|
|
18
|
+
Arguments = undefined,
|
|
19
|
+
Config = NoConfig,
|
|
20
|
+
> extends ConfigurableModule<Config> {
|
|
21
|
+
public abstract contractFactory(
|
|
22
|
+
args: Arguments
|
|
23
|
+
): SmartContractClassFromInterface<ContractType>;
|
|
24
|
+
}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AreProofsEnabled,
|
|
3
|
+
ChildContainerProvider,
|
|
4
|
+
ModuleContainer,
|
|
5
|
+
ModulesRecord,
|
|
6
|
+
TypedClass,
|
|
7
|
+
noop,
|
|
8
|
+
} from "@proto-kit/common";
|
|
9
|
+
import { PublicKey, SmartContract } from "o1js";
|
|
10
|
+
import { injectable } from "tsyringe";
|
|
11
|
+
|
|
12
|
+
import { ProtocolEnvironment } from "../protocol/ProtocolEnvironment";
|
|
13
|
+
import { ProtocolModule } from "../protocol/ProtocolModule";
|
|
14
|
+
|
|
15
|
+
import {
|
|
16
|
+
ContractModule,
|
|
17
|
+
SmartContractClassFromInterface,
|
|
18
|
+
} from "./ContractModule";
|
|
19
|
+
import { DispatchContractProtocolModule } from "./contracts/DispatchContractProtocolModule";
|
|
20
|
+
import { DispatchContractType } from "./contracts/DispatchSmartContract";
|
|
21
|
+
import {
|
|
22
|
+
SettlementContractConfig,
|
|
23
|
+
SettlementContractProtocolModule,
|
|
24
|
+
} from "./contracts/SettlementContractProtocolModule";
|
|
25
|
+
import { SettlementContractType } from "./contracts/SettlementSmartContract";
|
|
26
|
+
|
|
27
|
+
export type SettlementModulesRecord = ModulesRecord<
|
|
28
|
+
TypedClass<ContractModule<unknown, unknown, unknown>>
|
|
29
|
+
>;
|
|
30
|
+
|
|
31
|
+
export type MandatorySettlementModulesRecord = {
|
|
32
|
+
SettlementContract: TypedClass<
|
|
33
|
+
ContractModule<
|
|
34
|
+
SettlementContractType,
|
|
35
|
+
SmartContractClassFromInterface<DispatchContractType>,
|
|
36
|
+
SettlementContractConfig
|
|
37
|
+
>
|
|
38
|
+
>;
|
|
39
|
+
DispatchContract: TypedClass<
|
|
40
|
+
ContractModule<DispatchContractType, unknown, unknown>
|
|
41
|
+
>;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
@injectable()
|
|
45
|
+
export class SettlementContractModule<
|
|
46
|
+
SettlementModules extends SettlementModulesRecord &
|
|
47
|
+
MandatorySettlementModulesRecord,
|
|
48
|
+
>
|
|
49
|
+
extends ModuleContainer<SettlementModules>
|
|
50
|
+
implements ProtocolModule<unknown>
|
|
51
|
+
{
|
|
52
|
+
public constructor(definition: { modules: SettlementModules }) {
|
|
53
|
+
super(definition);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public static from<
|
|
57
|
+
SettlementModules extends SettlementModulesRecord &
|
|
58
|
+
MandatorySettlementModulesRecord,
|
|
59
|
+
>(
|
|
60
|
+
modules: SettlementModules
|
|
61
|
+
): TypedClass<SettlementContractModule<SettlementModules>> {
|
|
62
|
+
return class ScopedSettlementContractModule extends SettlementContractModule<SettlementModules> {
|
|
63
|
+
public constructor() {
|
|
64
|
+
super({ modules });
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
public static fromDefaults() {
|
|
70
|
+
return SettlementContractModule.from({
|
|
71
|
+
SettlementContract: SettlementContractProtocolModule,
|
|
72
|
+
DispatchContract: DispatchContractProtocolModule,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// ** For protocol module
|
|
77
|
+
public protocol?: ProtocolEnvironment;
|
|
78
|
+
|
|
79
|
+
public get appChain(): AreProofsEnabled | undefined {
|
|
80
|
+
return this.protocol?.getAreProofsEnabled();
|
|
81
|
+
}
|
|
82
|
+
// **
|
|
83
|
+
|
|
84
|
+
public create(childContainerProvider: ChildContainerProvider) {
|
|
85
|
+
super.create(childContainerProvider);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
public async start() {
|
|
89
|
+
noop();
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
public getContractClasses(): {
|
|
93
|
+
settlement: SmartContractClassFromInterface<SettlementContractType>;
|
|
94
|
+
dispatch: SmartContractClassFromInterface<DispatchContractType>;
|
|
95
|
+
} {
|
|
96
|
+
const settlementContractKey = "SettlementContract";
|
|
97
|
+
const dispatchContractKey = "DispatchContract";
|
|
98
|
+
this.assertIsValidModuleName(settlementContractKey);
|
|
99
|
+
this.assertIsValidModuleName(dispatchContractKey);
|
|
100
|
+
|
|
101
|
+
const settlementModule = this.resolve(settlementContractKey);
|
|
102
|
+
const dispatchModule = this.resolve(dispatchContractKey);
|
|
103
|
+
|
|
104
|
+
const dispatch = dispatchModule.contractFactory(undefined);
|
|
105
|
+
const settlement = settlementModule.contractFactory(dispatch);
|
|
106
|
+
|
|
107
|
+
return {
|
|
108
|
+
settlement,
|
|
109
|
+
dispatch,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
public createContracts(addresses: {
|
|
114
|
+
settlement: PublicKey;
|
|
115
|
+
dispatch: PublicKey;
|
|
116
|
+
}): {
|
|
117
|
+
settlement: SettlementContractType & SmartContract;
|
|
118
|
+
dispatch: DispatchContractType & SmartContract;
|
|
119
|
+
} {
|
|
120
|
+
const { dispatch, settlement } = this.getContractClasses();
|
|
121
|
+
|
|
122
|
+
// eslint-disable-next-line new-cap
|
|
123
|
+
const dispatchInstance = new dispatch(addresses.dispatch);
|
|
124
|
+
// eslint-disable-next-line new-cap
|
|
125
|
+
const settlementInstance = new settlement(addresses.settlement);
|
|
126
|
+
|
|
127
|
+
return {
|
|
128
|
+
dispatch: dispatchInstance,
|
|
129
|
+
settlement: settlementInstance,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
}
|