@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.
Files changed (196) hide show
  1. package/dist/blockmodules/AccountStateModule.d.ts.map +1 -1
  2. package/dist/blockmodules/AccountStateModule.js +10 -3
  3. package/dist/blockmodules/BlockHeightHook.d.ts +3 -3
  4. package/dist/blockmodules/BlockHeightHook.d.ts.map +1 -1
  5. package/dist/blockmodules/BlockHeightHook.js +5 -4
  6. package/dist/blockmodules/LastStateRootBlockHook.d.ts +8 -0
  7. package/dist/blockmodules/LastStateRootBlockHook.d.ts.map +1 -0
  8. package/dist/blockmodules/LastStateRootBlockHook.js +15 -0
  9. package/dist/blockmodules/NoopBlockHook.d.ts +6 -4
  10. package/dist/blockmodules/NoopBlockHook.d.ts.map +1 -1
  11. package/dist/blockmodules/NoopBlockHook.js +4 -4
  12. package/dist/blockmodules/NoopSettlementHook.d.ts +6 -0
  13. package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -0
  14. package/dist/blockmodules/NoopSettlementHook.js +18 -0
  15. package/dist/hooks/AccountStateHook.d.ts.map +1 -1
  16. package/dist/hooks/AccountStateHook.js +17 -5
  17. package/dist/hooks/BlockHeightHook.d.ts +3 -3
  18. package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
  19. package/dist/hooks/BlockHeightHook.js +5 -4
  20. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  21. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  22. package/dist/hooks/LastStateRootBlockHook.js +15 -0
  23. package/dist/hooks/NoopBlockHook.d.ts +6 -4
  24. package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
  25. package/dist/hooks/NoopBlockHook.js +4 -4
  26. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  27. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  28. package/dist/hooks/NoopSettlementHook.js +18 -0
  29. package/dist/index.d.ts +24 -6
  30. package/dist/index.d.ts.map +1 -1
  31. package/dist/index.js +24 -6
  32. package/dist/model/MethodPublicOutput.d.ts +8 -0
  33. package/dist/model/MethodPublicOutput.d.ts.map +1 -1
  34. package/dist/model/MethodPublicOutput.js +1 -0
  35. package/dist/model/Option.d.ts +3 -2
  36. package/dist/model/Option.d.ts.map +1 -1
  37. package/dist/model/Option.js +5 -0
  38. package/dist/model/RuntimeLike.d.ts +11 -0
  39. package/dist/model/RuntimeLike.d.ts.map +1 -0
  40. package/dist/model/RuntimeLike.js +1 -0
  41. package/dist/model/StateTransition.d.ts +6 -5
  42. package/dist/model/StateTransition.d.ts.map +1 -1
  43. package/dist/model/StateTransition.js +3 -0
  44. package/dist/model/StateTransitionReduction.d.ts +3 -0
  45. package/dist/model/StateTransitionReduction.d.ts.map +1 -0
  46. package/dist/model/StateTransitionReduction.js +26 -0
  47. package/dist/model/network/NetworkState.d.ts +40 -0
  48. package/dist/model/network/NetworkState.d.ts.map +1 -1
  49. package/dist/model/network/NetworkState.js +14 -2
  50. package/dist/model/transaction/RuntimeTransaction.d.ts +45 -20
  51. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
  52. package/dist/model/transaction/RuntimeTransaction.js +68 -11
  53. package/dist/model/transaction/SignedTransaction.d.ts +71 -0
  54. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
  55. package/dist/model/transaction/SignedTransaction.js +33 -0
  56. package/dist/model/transaction/ValueOption.d.ts +119 -0
  57. package/dist/model/transaction/ValueOption.d.ts.map +1 -0
  58. package/dist/model/transaction/ValueOption.js +24 -0
  59. package/dist/protocol/Protocol.d.ts +13 -16
  60. package/dist/protocol/Protocol.d.ts.map +1 -1
  61. package/dist/protocol/Protocol.js +26 -39
  62. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  63. package/dist/protocol/ProtocolModule.js +1 -1
  64. package/dist/protocol/ProvableBlockHook.d.ts +2 -10
  65. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
  66. package/dist/protocol/ProvableBlockHook.js +1 -1
  67. package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
  68. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
  69. package/dist/protocol/TransitioningProtocolModule.d.ts +3 -2
  70. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -1
  71. package/dist/protocol/TransitioningProtocolModule.js +3 -2
  72. package/dist/prover/block/BlockProvable.d.ts +106 -28
  73. package/dist/prover/block/BlockProvable.d.ts.map +1 -1
  74. package/dist/prover/block/BlockProvable.js +23 -5
  75. package/dist/prover/block/BlockProver.d.ts +29 -8
  76. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  77. package/dist/prover/block/BlockProver.js +244 -78
  78. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +45 -0
  79. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
  80. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +16 -0
  81. package/dist/prover/statetransition/StateTransitionProver.d.ts +3 -2
  82. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  83. package/dist/prover/statetransition/StateTransitionProver.js +1 -0
  84. package/dist/settlement/ContractModule.d.ts +15 -0
  85. package/dist/settlement/ContractModule.d.ts.map +1 -0
  86. package/dist/settlement/ContractModule.js +11 -0
  87. package/dist/settlement/ProvableSettlementHook.d.ts +26 -0
  88. package/dist/settlement/ProvableSettlementHook.d.ts.map +1 -0
  89. package/dist/settlement/ProvableSettlementHook.js +3 -0
  90. package/dist/settlement/SettlementContract.d.ts +230 -0
  91. package/dist/settlement/SettlementContract.d.ts.map +1 -0
  92. package/dist/settlement/SettlementContract.js +346 -0
  93. package/dist/settlement/SettlementContractModule.d.ts +39 -0
  94. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  95. package/dist/settlement/SettlementContractModule.js +68 -0
  96. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
  97. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  98. package/dist/settlement/contracts/DispatchContractProtocolModule.js +36 -0
  99. package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
  100. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  101. package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
  102. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
  103. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  104. package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
  105. package/dist/settlement/contracts/SettlementSmartContract.d.ts +41 -0
  106. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  107. package/dist/settlement/contracts/SettlementSmartContract.js +235 -0
  108. package/dist/settlement/messages/Deposit.d.ts +39 -0
  109. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  110. package/dist/settlement/messages/Deposit.js +6 -0
  111. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +109 -0
  112. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  113. package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
  114. package/dist/settlement/messages/Withdrawal.d.ts +40 -0
  115. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  116. package/dist/settlement/messages/Withdrawal.js +13 -0
  117. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
  118. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  119. package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
  120. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  121. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  122. package/dist/settlement/modules/NetworkStateSettlementModule.js +12 -0
  123. package/dist/state/State.d.ts.map +1 -1
  124. package/dist/state/State.js +2 -1
  125. package/dist/state/assert/assert.d.ts.map +1 -1
  126. package/dist/state/assert/assert.js +8 -5
  127. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +75 -1
  128. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
  129. package/dist/state/context/RuntimeMethodExecutionContext.js +21 -2
  130. package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
  131. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  132. package/dist/utils/MinaPrefixedProvableHashList.js +51 -0
  133. package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
  134. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
  135. package/dist/utils/ProvableHashList.d.ts +3 -3
  136. package/dist/utils/ProvableHashList.d.ts.map +1 -1
  137. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  138. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  139. package/dist/utils/ProvableReductionHashList.js +50 -0
  140. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  141. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  142. package/dist/utils/StateTransitionReductionList.js +60 -0
  143. package/package.json +2 -2
  144. package/src/hooks/AccountStateHook.ts +46 -0
  145. package/src/hooks/BlockHeightHook.ts +18 -0
  146. package/src/hooks/LastStateRootBlockHook.ts +26 -0
  147. package/src/hooks/NoopBlockHook.ts +20 -0
  148. package/src/hooks/NoopSettlementHook.ts +20 -0
  149. package/src/hooks/SequenceStateTransactionModule.ts +25 -0
  150. package/src/index.ts +24 -6
  151. package/src/model/MethodPublicOutput.ts +3 -2
  152. package/src/model/Option.ts +16 -0
  153. package/src/model/RuntimeLike.ts +12 -0
  154. package/src/model/StateTransition.ts +10 -2
  155. package/src/model/network/NetworkState.ts +15 -3
  156. package/src/model/transaction/RuntimeTransaction.ts +90 -16
  157. package/src/model/transaction/SignedTransaction.ts +54 -0
  158. package/src/model/transaction/ValueOption.ts +28 -0
  159. package/src/protocol/Protocol.ts +60 -67
  160. package/src/protocol/ProtocolModule.ts +3 -2
  161. package/src/protocol/ProvableBlockHook.ts +10 -13
  162. package/src/protocol/ProvableTransactionHook.ts +2 -1
  163. package/src/protocol/TransitioningProtocolModule.ts +3 -2
  164. package/src/prover/block/BlockProvable.ts +39 -6
  165. package/src/prover/block/BlockProver.ts +484 -142
  166. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
  167. package/src/prover/statetransition/StateTransitionProver.ts +4 -2
  168. package/src/settlement/ContractModule.ts +24 -0
  169. package/src/settlement/SettlementContractModule.ts +127 -0
  170. package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
  171. package/src/settlement/contracts/DispatchSmartContract.ts +135 -0
  172. package/src/settlement/contracts/SettlementContractProtocolModule.ts +65 -0
  173. package/src/settlement/contracts/SettlementSmartContract.ts +329 -0
  174. package/src/settlement/messages/Deposit.ts +6 -0
  175. package/src/settlement/messages/OutgoingMessageArgument.ts +41 -0
  176. package/src/settlement/messages/Withdrawal.ts +14 -0
  177. package/src/settlement/modularity/ProvableSettlementHook.ts +34 -0
  178. package/src/settlement/modules/NetworkStateSettlementModule.ts +39 -0
  179. package/src/state/State.ts +2 -1
  180. package/src/state/assert/assert.ts +8 -6
  181. package/src/state/context/RuntimeMethodExecutionContext.ts +22 -2
  182. package/src/utils/MinaPrefixedProvableHashList.ts +72 -0
  183. package/src/utils/PrefixedProvableHashList.ts +2 -2
  184. package/src/utils/ProvableHashList.ts +3 -3
  185. package/src/utils/ProvableReductionHashList.ts +68 -0
  186. package/src/utils/StateTransitionReductionList.ts +88 -0
  187. package/test/BlockProver.test.ts +4 -5
  188. package/test/Protocol.test.ts +15 -10
  189. package/test/settlement/SettlementContract.test.ts +45 -0
  190. package/test/utils/ProvableReductionHashList.test.ts +114 -0
  191. package/src/blockmodules/AccountStateModule.ts +0 -33
  192. package/src/blockmodules/BlockHeightHook.ts +0 -21
  193. package/src/blockmodules/NoopBlockHook.ts +0 -16
  194. package/src/model/transaction/ProtocolTransaction.ts +0 -25
  195. package/src/prover/block/BlockTransactionPosition.ts +0 -34
  196. /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 readonly zkProgrammable: StateTransitionProverProgrammable;
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
+ }