@proto-kit/protocol 0.1.1-develop.457 → 0.1.1-develop.651
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/blockmodules/AccountStateModule.d.ts.map +1 -1
- package/dist/blockmodules/AccountStateModule.js +10 -3
- package/dist/blockmodules/BlockHeightHook.d.ts +3 -3
- package/dist/blockmodules/BlockHeightHook.d.ts.map +1 -1
- package/dist/blockmodules/BlockHeightHook.js +5 -4
- package/dist/blockmodules/LastStateRootBlockHook.d.ts +8 -0
- package/dist/blockmodules/LastStateRootBlockHook.d.ts.map +1 -0
- package/dist/blockmodules/LastStateRootBlockHook.js +15 -0
- package/dist/blockmodules/NoopBlockHook.d.ts +6 -4
- package/dist/blockmodules/NoopBlockHook.d.ts.map +1 -1
- package/dist/blockmodules/NoopBlockHook.js +4 -4
- package/dist/blockmodules/NoopSettlementHook.d.ts +6 -0
- package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -0
- package/dist/blockmodules/NoopSettlementHook.js +18 -0
- package/dist/hooks/AccountStateHook.d.ts.map +1 -1
- package/dist/hooks/AccountStateHook.js +17 -5
- package/dist/hooks/BlockHeightHook.d.ts +3 -3
- package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
- package/dist/hooks/BlockHeightHook.js +5 -4
- 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 +6 -4
- package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
- package/dist/hooks/NoopBlockHook.js +4 -4
- package/dist/hooks/NoopSettlementHook.d.ts +6 -0
- package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
- package/dist/hooks/NoopSettlementHook.js +18 -0
- package/dist/index.d.ts +24 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -6
- package/dist/model/MethodPublicOutput.d.ts +8 -0
- package/dist/model/MethodPublicOutput.d.ts.map +1 -1
- package/dist/model/MethodPublicOutput.js +1 -0
- package/dist/model/Option.d.ts +3 -2
- package/dist/model/Option.d.ts.map +1 -1
- package/dist/model/Option.js +5 -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 +6 -5
- package/dist/model/StateTransition.d.ts.map +1 -1
- package/dist/model/StateTransition.js +3 -0
- package/dist/model/StateTransitionReduction.d.ts +3 -0
- package/dist/model/StateTransitionReduction.d.ts.map +1 -0
- package/dist/model/StateTransitionReduction.js +26 -0
- package/dist/model/network/NetworkState.d.ts +40 -0
- package/dist/model/network/NetworkState.d.ts.map +1 -1
- package/dist/model/network/NetworkState.js +14 -2
- package/dist/model/transaction/RuntimeTransaction.d.ts +45 -20
- package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
- package/dist/model/transaction/RuntimeTransaction.js +68 -11
- package/dist/model/transaction/SignedTransaction.d.ts +71 -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 +119 -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 +13 -16
- package/dist/protocol/Protocol.d.ts.map +1 -1
- package/dist/protocol/Protocol.js +26 -39
- package/dist/protocol/ProtocolModule.d.ts.map +1 -1
- package/dist/protocol/ProtocolModule.js +1 -1
- package/dist/protocol/ProvableBlockHook.d.ts +2 -10
- package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
- package/dist/protocol/ProvableBlockHook.js +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
- package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.d.ts +3 -2
- package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -1
- package/dist/protocol/TransitioningProtocolModule.js +3 -2
- package/dist/prover/block/BlockProvable.d.ts +106 -28
- package/dist/prover/block/BlockProvable.d.ts.map +1 -1
- package/dist/prover/block/BlockProvable.js +23 -5
- package/dist/prover/block/BlockProver.d.ts +29 -8
- package/dist/prover/block/BlockProver.d.ts.map +1 -1
- package/dist/prover/block/BlockProver.js +244 -78
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +45 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
- package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
- package/dist/prover/statetransition/StateTransitionProver.d.ts +3 -2
- package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
- package/dist/prover/statetransition/StateTransitionProver.js +1 -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/ProvableSettlementHook.d.ts +26 -0
- package/dist/settlement/ProvableSettlementHook.d.ts.map +1 -0
- package/dist/settlement/ProvableSettlementHook.js +3 -0
- package/dist/settlement/SettlementContract.d.ts +230 -0
- package/dist/settlement/SettlementContract.d.ts.map +1 -0
- package/dist/settlement/SettlementContract.js +346 -0
- package/dist/settlement/SettlementContractModule.d.ts +39 -0
- package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
- package/dist/settlement/SettlementContractModule.js +68 -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 +36 -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 +41 -0
- package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
- package/dist/settlement/contracts/SettlementSmartContract.js +235 -0
- package/dist/settlement/messages/Deposit.d.ts +39 -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 +109 -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 +40 -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 +12 -0
- package/dist/state/State.d.ts.map +1 -1
- package/dist/state/State.js +2 -1
- package/dist/state/assert/assert.d.ts.map +1 -1
- package/dist/state/assert/assert.js +8 -5
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts +75 -1
- package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
- package/dist/state/context/RuntimeMethodExecutionContext.js +21 -2
- package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
- package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
- package/dist/utils/MinaPrefixedProvableHashList.js +51 -0
- package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
- package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
- package/dist/utils/ProvableHashList.d.ts +3 -3
- package/dist/utils/ProvableHashList.d.ts.map +1 -1
- 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/package.json +2 -2
- package/src/hooks/AccountStateHook.ts +46 -0
- package/src/hooks/BlockHeightHook.ts +18 -0
- package/src/hooks/LastStateRootBlockHook.ts +26 -0
- package/src/hooks/NoopBlockHook.ts +20 -0
- package/src/hooks/NoopSettlementHook.ts +20 -0
- package/src/hooks/SequenceStateTransactionModule.ts +25 -0
- package/src/index.ts +24 -6
- package/src/model/MethodPublicOutput.ts +3 -2
- package/src/model/Option.ts +16 -0
- package/src/model/RuntimeLike.ts +12 -0
- package/src/model/StateTransition.ts +10 -2
- package/src/model/network/NetworkState.ts +15 -3
- package/src/model/transaction/RuntimeTransaction.ts +90 -16
- package/src/model/transaction/SignedTransaction.ts +54 -0
- package/src/model/transaction/ValueOption.ts +28 -0
- package/src/protocol/Protocol.ts +60 -67
- package/src/protocol/ProtocolModule.ts +3 -2
- package/src/protocol/ProvableBlockHook.ts +10 -13
- package/src/protocol/ProvableTransactionHook.ts +2 -1
- package/src/protocol/TransitioningProtocolModule.ts +3 -2
- package/src/prover/block/BlockProvable.ts +39 -6
- package/src/prover/block/BlockProver.ts +484 -142
- package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
- package/src/prover/statetransition/StateTransitionProver.ts +4 -2
- package/src/settlement/ContractModule.ts +24 -0
- package/src/settlement/SettlementContractModule.ts +127 -0
- package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
- package/src/settlement/contracts/DispatchSmartContract.ts +135 -0
- package/src/settlement/contracts/SettlementContractProtocolModule.ts +65 -0
- package/src/settlement/contracts/SettlementSmartContract.ts +329 -0
- package/src/settlement/messages/Deposit.ts +6 -0
- package/src/settlement/messages/OutgoingMessageArgument.ts +41 -0
- package/src/settlement/messages/Withdrawal.ts +14 -0
- package/src/settlement/modularity/ProvableSettlementHook.ts +34 -0
- package/src/settlement/modules/NetworkStateSettlementModule.ts +39 -0
- package/src/state/State.ts +2 -1
- package/src/state/assert/assert.ts +8 -6
- package/src/state/context/RuntimeMethodExecutionContext.ts +22 -2
- package/src/utils/MinaPrefixedProvableHashList.ts +72 -0
- package/src/utils/PrefixedProvableHashList.ts +2 -2
- package/src/utils/ProvableHashList.ts +3 -3
- package/src/utils/ProvableReductionHashList.ts +68 -0
- package/src/utils/StateTransitionReductionList.ts +88 -0
- package/test/BlockProver.test.ts +4 -5
- package/test/Protocol.test.ts +15 -10
- package/test/settlement/SettlementContract.test.ts +45 -0
- package/test/utils/ProvableReductionHashList.test.ts +114 -0
- package/src/blockmodules/AccountStateModule.ts +0 -33
- package/src/blockmodules/BlockHeightHook.ts +0 -21
- package/src/blockmodules/NoopBlockHook.ts +0 -16
- package/src/model/transaction/ProtocolTransaction.ts +0 -25
- package/src/prover/block/BlockTransactionPosition.ts +0 -34
- /package/src/{blockmodules → hooks}/NoopTransactionHook.ts +0 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { createMerkleTree } from "@proto-kit/common";
|
|
2
|
+
import { Bool, Field, Poseidon, Provable, 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
|
+
}
|
|
@@ -30,6 +30,7 @@ import {
|
|
|
30
30
|
StateTransitionProverPublicOutput,
|
|
31
31
|
} from "./StateTransitionProvable";
|
|
32
32
|
import { StateTransitionWitnessProviderReference } from "./StateTransitionWitnessProviderReference";
|
|
33
|
+
import { StateTransitionProverType } from "../../protocol/Protocol";
|
|
33
34
|
|
|
34
35
|
const errors = {
|
|
35
36
|
propertyNotMatching: (property: string, step: string) =>
|
|
@@ -127,6 +128,7 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
127
128
|
return {
|
|
128
129
|
compile: program.compile.bind(program),
|
|
129
130
|
verify: program.verify.bind(program),
|
|
131
|
+
analyzeMethods: program.analyzeMethods.bind(program),
|
|
130
132
|
Proof: SelfProofClass,
|
|
131
133
|
methods,
|
|
132
134
|
};
|
|
@@ -339,9 +341,9 @@ export class StateTransitionProverProgrammable extends ZkProgrammable<
|
|
|
339
341
|
@injectable()
|
|
340
342
|
export class StateTransitionProver
|
|
341
343
|
extends ProtocolModule
|
|
342
|
-
implements StateTransitionProvable
|
|
344
|
+
implements StateTransitionProvable, StateTransitionProverType
|
|
343
345
|
{
|
|
344
|
-
public
|
|
346
|
+
public zkProgrammable: StateTransitionProverProgrammable;
|
|
345
347
|
|
|
346
348
|
public constructor(
|
|
347
349
|
// Injected
|
|
@@ -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,127 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AreProofsEnabled,
|
|
3
|
+
ChildContainerProvider,
|
|
4
|
+
ModuleContainer,
|
|
5
|
+
ModulesRecord, ResolvableModules, StringKeyOf,
|
|
6
|
+
TypedClass
|
|
7
|
+
} from "@proto-kit/common";
|
|
8
|
+
import { PublicKey, SmartContract } from "o1js";
|
|
9
|
+
import { injectable } from "tsyringe";
|
|
10
|
+
|
|
11
|
+
import { ProtocolEnvironment } from "../protocol/ProtocolEnvironment";
|
|
12
|
+
import { ProtocolModule } from "../protocol/ProtocolModule";
|
|
13
|
+
|
|
14
|
+
import {
|
|
15
|
+
ContractModule,
|
|
16
|
+
SmartContractClassFromInterface,
|
|
17
|
+
} from "./ContractModule";
|
|
18
|
+
import { DispatchContractProtocolModule } from "./contracts/DispatchContractProtocolModule";
|
|
19
|
+
import { DispatchContractType } from "./contracts/DispatchSmartContract";
|
|
20
|
+
import {
|
|
21
|
+
SettlementContractConfig,
|
|
22
|
+
SettlementContractProtocolModule,
|
|
23
|
+
} from "./contracts/SettlementContractProtocolModule";
|
|
24
|
+
import { SettlementContractType } from "./contracts/SettlementSmartContract";
|
|
25
|
+
|
|
26
|
+
export type SettlementModulesRecord = ModulesRecord<
|
|
27
|
+
TypedClass<ContractModule<unknown, unknown, unknown>>
|
|
28
|
+
>;
|
|
29
|
+
|
|
30
|
+
export type MandatorySettlementModulesRecord = {
|
|
31
|
+
SettlementContract: TypedClass<
|
|
32
|
+
ContractModule<
|
|
33
|
+
SettlementContractType,
|
|
34
|
+
SmartContractClassFromInterface<DispatchContractType>,
|
|
35
|
+
SettlementContractConfig
|
|
36
|
+
>
|
|
37
|
+
>;
|
|
38
|
+
DispatchContract: TypedClass<
|
|
39
|
+
ContractModule<DispatchContractType, unknown, unknown>
|
|
40
|
+
>;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
@injectable()
|
|
44
|
+
export class SettlementContractModule<
|
|
45
|
+
SettlementModules extends SettlementModulesRecord &
|
|
46
|
+
MandatorySettlementModulesRecord
|
|
47
|
+
>
|
|
48
|
+
extends ModuleContainer<SettlementModules>
|
|
49
|
+
implements ProtocolModule<unknown>
|
|
50
|
+
{
|
|
51
|
+
public constructor(definition: { modules: SettlementModules }) {
|
|
52
|
+
super(definition);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
public static from<
|
|
56
|
+
SettlementModules extends SettlementModulesRecord &
|
|
57
|
+
MandatorySettlementModulesRecord
|
|
58
|
+
>(
|
|
59
|
+
modules: SettlementModules
|
|
60
|
+
): TypedClass<SettlementContractModule<SettlementModules>> {
|
|
61
|
+
return class ScopedSettlementContractModule extends SettlementContractModule<SettlementModules> {
|
|
62
|
+
public constructor() {
|
|
63
|
+
super({ modules });
|
|
64
|
+
}
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
public static fromDefaults() {
|
|
69
|
+
return SettlementContractModule.from({
|
|
70
|
+
SettlementContract: SettlementContractProtocolModule,
|
|
71
|
+
DispatchContract: DispatchContractProtocolModule,
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// ** For protocol module
|
|
76
|
+
public protocol?: ProtocolEnvironment;
|
|
77
|
+
|
|
78
|
+
public get appChain(): AreProofsEnabled | undefined {
|
|
79
|
+
return this.protocol?.getAreProofsEnabled();
|
|
80
|
+
}
|
|
81
|
+
// **
|
|
82
|
+
|
|
83
|
+
public create(childContainerProvider: ChildContainerProvider) {
|
|
84
|
+
super.create(childContainerProvider);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// private assertIsKeyofModules
|
|
88
|
+
|
|
89
|
+
public getContractClasses(): {
|
|
90
|
+
settlement: SmartContractClassFromInterface<SettlementContractType>;
|
|
91
|
+
dispatch: SmartContractClassFromInterface<DispatchContractType>;
|
|
92
|
+
} {
|
|
93
|
+
const settlementContractKey = "SettlementContract"
|
|
94
|
+
const dispatchContractKey = "DispatchContract"
|
|
95
|
+
this.assertIsValidModuleName(settlementContractKey)
|
|
96
|
+
this.assertIsValidModuleName(dispatchContractKey)
|
|
97
|
+
|
|
98
|
+
const settlementModule = this.resolve(settlementContractKey);
|
|
99
|
+
const dispatchModule = this.resolve(dispatchContractKey);
|
|
100
|
+
|
|
101
|
+
const dispatch = dispatchModule.contractFactory(undefined);
|
|
102
|
+
const settlement = settlementModule.contractFactory(dispatch);
|
|
103
|
+
|
|
104
|
+
return {
|
|
105
|
+
settlement,
|
|
106
|
+
dispatch,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
public createContracts(addresses: {
|
|
111
|
+
settlement: PublicKey;
|
|
112
|
+
dispatch: PublicKey;
|
|
113
|
+
}): {
|
|
114
|
+
settlement: SettlementContractType & SmartContract;
|
|
115
|
+
dispatch: DispatchContractType & SmartContract;
|
|
116
|
+
} {
|
|
117
|
+
const { dispatch, settlement } = this.getContractClasses();
|
|
118
|
+
|
|
119
|
+
const dispatchInstance = new dispatch(addresses.dispatch);
|
|
120
|
+
const settlementInstance = new settlement(addresses.settlement);
|
|
121
|
+
|
|
122
|
+
return {
|
|
123
|
+
dispatch: dispatchInstance,
|
|
124
|
+
settlement: settlementInstance,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { inject, injectable } from "tsyringe";
|
|
2
|
+
|
|
3
|
+
import { RuntimeLike } from "../../model/RuntimeLike";
|
|
4
|
+
import {
|
|
5
|
+
ContractModule,
|
|
6
|
+
SmartContractClassFromInterface,
|
|
7
|
+
} from "../ContractModule";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
DispatchSmartContract,
|
|
11
|
+
DispatchContractType,
|
|
12
|
+
} from "./DispatchSmartContract";
|
|
13
|
+
|
|
14
|
+
export type DispatchContractConfig = {
|
|
15
|
+
incomingMessagesMethods: Record<string, `${string}.${string}`>;
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
@injectable()
|
|
19
|
+
export class DispatchContractProtocolModule extends ContractModule<
|
|
20
|
+
DispatchContractType,
|
|
21
|
+
undefined,
|
|
22
|
+
DispatchContractConfig
|
|
23
|
+
> {
|
|
24
|
+
public constructor(@inject("Runtime") private readonly runtime: RuntimeLike) {
|
|
25
|
+
super();
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
public contractFactory(): SmartContractClassFromInterface<DispatchContractType> {
|
|
29
|
+
const { incomingMessagesMethods } = this.config;
|
|
30
|
+
const methodIdMappings = this.runtime.methodIdResolver.methodIdMap();
|
|
31
|
+
|
|
32
|
+
DispatchSmartContract.args = {
|
|
33
|
+
incomingMessagesPaths: incomingMessagesMethods,
|
|
34
|
+
methodIdMappings,
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
return DispatchSmartContract;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AccountUpdate,
|
|
3
|
+
Field,
|
|
4
|
+
method,
|
|
5
|
+
Poseidon,
|
|
6
|
+
ProvableExtended,
|
|
7
|
+
PublicKey,
|
|
8
|
+
Reducer,
|
|
9
|
+
SmartContract,
|
|
10
|
+
State,
|
|
11
|
+
state,
|
|
12
|
+
UInt64,
|
|
13
|
+
} from "o1js";
|
|
14
|
+
|
|
15
|
+
import { RuntimeMethodIdMapping } from "../../model/RuntimeLike";
|
|
16
|
+
import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
|
|
17
|
+
import {
|
|
18
|
+
MinaActions,
|
|
19
|
+
MinaEvents,
|
|
20
|
+
} from "../../utils/MinaPrefixedProvableHashList";
|
|
21
|
+
import { Deposit } from "../messages/Deposit";
|
|
22
|
+
|
|
23
|
+
export const ACTIONS_EMPTY_HASH = Reducer.initialActionState;
|
|
24
|
+
|
|
25
|
+
export interface DispatchContractType {
|
|
26
|
+
updateMessagesHash: (
|
|
27
|
+
executedMessagesHash: Field,
|
|
28
|
+
newPromisedMessagesHash: Field
|
|
29
|
+
) => void;
|
|
30
|
+
initialize: (settlementContract: PublicKey) => void;
|
|
31
|
+
|
|
32
|
+
promisedMessagesHash: State<Field>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export class DispatchSmartContract
|
|
36
|
+
extends SmartContract
|
|
37
|
+
implements DispatchContractType
|
|
38
|
+
{
|
|
39
|
+
public static args: {
|
|
40
|
+
methodIdMappings: RuntimeMethodIdMapping;
|
|
41
|
+
incomingMessagesPaths: Record<string, `${string}.${string}`>;
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
@state(Field) public promisedMessagesHash = State<Field>();
|
|
45
|
+
|
|
46
|
+
@state(Field) public honoredMessagesHash = State<Field>();
|
|
47
|
+
|
|
48
|
+
@state(PublicKey) public settlementContract = State<PublicKey>();
|
|
49
|
+
|
|
50
|
+
@method
|
|
51
|
+
public updateMessagesHash(
|
|
52
|
+
executedMessagesHash: Field,
|
|
53
|
+
newPromisedMessagesHash: Field
|
|
54
|
+
) {
|
|
55
|
+
const promisedMessagesHash = this.promisedMessagesHash.getAndAssertEquals();
|
|
56
|
+
this.honoredMessagesHash.getAndAssertEquals();
|
|
57
|
+
|
|
58
|
+
executedMessagesHash.assertEquals(promisedMessagesHash);
|
|
59
|
+
|
|
60
|
+
this.honoredMessagesHash.set(executedMessagesHash);
|
|
61
|
+
|
|
62
|
+
// Assert and apply new promisedMessagesHash
|
|
63
|
+
this.self.account.actionState.assertEquals(newPromisedMessagesHash);
|
|
64
|
+
this.promisedMessagesHash.set(newPromisedMessagesHash);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
@method
|
|
68
|
+
public initialize(settlementContract: PublicKey) {
|
|
69
|
+
this.promisedMessagesHash.getAndAssertEquals().assertEquals(Field(0));
|
|
70
|
+
this.honoredMessagesHash.getAndAssertEquals().assertEquals(Field(0));
|
|
71
|
+
this.settlementContract
|
|
72
|
+
.getAndAssertEquals()
|
|
73
|
+
.assertEquals(PublicKey.empty());
|
|
74
|
+
|
|
75
|
+
this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
76
|
+
this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
|
|
77
|
+
this.settlementContract.set(settlementContract);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
private dispatchMessage<Type>(
|
|
81
|
+
methodId: Field,
|
|
82
|
+
value: Type,
|
|
83
|
+
valueType: ProvableExtended<Type>
|
|
84
|
+
) {
|
|
85
|
+
const args = valueType.toFields(value);
|
|
86
|
+
// Should be the same as RuntimeTransaction.hash
|
|
87
|
+
const argsHash = Poseidon.hash(args);
|
|
88
|
+
const runtimeTransaction = RuntimeTransaction.fromMessage({
|
|
89
|
+
methodId,
|
|
90
|
+
argsHash,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
// Append tx to incomingMessagesHash
|
|
94
|
+
const actionData = runtimeTransaction.hashData();
|
|
95
|
+
const actionHash = MinaActions.actionHash(actionData);
|
|
96
|
+
|
|
97
|
+
this.self.body.actions = {
|
|
98
|
+
hash: actionHash,
|
|
99
|
+
data: [actionData],
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const eventHash = MinaEvents.eventHash(args);
|
|
103
|
+
this.self.body.events = {
|
|
104
|
+
hash: eventHash,
|
|
105
|
+
data: [args],
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@method
|
|
110
|
+
public deposit(amount: UInt64) {
|
|
111
|
+
// Save this, since otherwise it would be a second witness later,
|
|
112
|
+
// which could be a different values than the first
|
|
113
|
+
const { sender } = this;
|
|
114
|
+
|
|
115
|
+
const settlementContract = this.settlementContract.getAndAssertEquals();
|
|
116
|
+
|
|
117
|
+
// Credit the amount to the settlement contract
|
|
118
|
+
const balanceAU = AccountUpdate.create(settlementContract);
|
|
119
|
+
balanceAU.balance.addInPlace(amount);
|
|
120
|
+
this.self.approve(balanceAU);
|
|
121
|
+
|
|
122
|
+
const action = new Deposit({
|
|
123
|
+
address: sender,
|
|
124
|
+
amount,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
const { methodIdMappings, incomingMessagesPaths } =
|
|
128
|
+
DispatchSmartContract.args;
|
|
129
|
+
|
|
130
|
+
const methodId = Field(
|
|
131
|
+
methodIdMappings[incomingMessagesPaths.deposit].methodId
|
|
132
|
+
).toConstant();
|
|
133
|
+
this.dispatchMessage(methodId.toConstant(), action, Deposit);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { TypedClass } from "@proto-kit/common";
|
|
2
|
+
import { SmartContract } from "o1js";
|
|
3
|
+
import { inject, injectable, injectAll } from "tsyringe";
|
|
4
|
+
|
|
5
|
+
import { BlockProvable } from "../../prover/block/BlockProvable";
|
|
6
|
+
import {
|
|
7
|
+
ContractModule,
|
|
8
|
+
SmartContractClassFromInterface,
|
|
9
|
+
} from "../ContractModule";
|
|
10
|
+
import { ProvableSettlementHook } from "../modularity/ProvableSettlementHook";
|
|
11
|
+
|
|
12
|
+
import { DispatchContractType } from "./DispatchSmartContract";
|
|
13
|
+
import {
|
|
14
|
+
LazyBlockProof,
|
|
15
|
+
SettlementContractType,
|
|
16
|
+
SettlementSmartContract,
|
|
17
|
+
} from "./SettlementSmartContract";
|
|
18
|
+
|
|
19
|
+
export type SettlementContractConfig = {
|
|
20
|
+
escapeHatchSlotsInterval?: number;
|
|
21
|
+
withdrawalStatePath: `${string}.${string}`;
|
|
22
|
+
withdrawalMethodPath: `${string}.${string}`;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// 24 hours
|
|
26
|
+
const DEFAULT_ESCAPE_HATCH = (60 / 3) * 24;
|
|
27
|
+
|
|
28
|
+
@injectable()
|
|
29
|
+
export class SettlementContractProtocolModule extends ContractModule<
|
|
30
|
+
SettlementContractType,
|
|
31
|
+
TypedClass<DispatchContractType & SmartContract>,
|
|
32
|
+
SettlementContractConfig
|
|
33
|
+
> {
|
|
34
|
+
public constructor(
|
|
35
|
+
@injectAll("ProvableSettlementHook")
|
|
36
|
+
private readonly hooks: ProvableSettlementHook<unknown>[],
|
|
37
|
+
@inject("BlockProver")
|
|
38
|
+
private readonly blockProver: BlockProvable
|
|
39
|
+
) {
|
|
40
|
+
LazyBlockProof.tag = blockProver.zkProgrammable.zkProgram.Proof.tag;
|
|
41
|
+
super();
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
public contractFactory(
|
|
45
|
+
dispatchContract: TypedClass<DispatchContractType & SmartContract>
|
|
46
|
+
): SmartContractClassFromInterface<SettlementContractType> {
|
|
47
|
+
const { hooks, config } = this;
|
|
48
|
+
|
|
49
|
+
const withdrawalStatePathSplit = this.config.withdrawalStatePath.split(
|
|
50
|
+
"."
|
|
51
|
+
) as [string, string];
|
|
52
|
+
|
|
53
|
+
const escapeHatchSlotsInterval =
|
|
54
|
+
this.config.escapeHatchSlotsInterval ?? DEFAULT_ESCAPE_HATCH;
|
|
55
|
+
|
|
56
|
+
SettlementSmartContract.args = {
|
|
57
|
+
DispatchContract: dispatchContract,
|
|
58
|
+
hooks,
|
|
59
|
+
withdrawalStatePath: withdrawalStatePathSplit,
|
|
60
|
+
escapeHatchSlotsInterval,
|
|
61
|
+
};
|
|
62
|
+
|
|
63
|
+
return SettlementSmartContract;
|
|
64
|
+
}
|
|
65
|
+
}
|