@proto-kit/protocol 0.1.1-develop.600 → 0.1.1-develop.833

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 (285) hide show
  1. package/LICENSE.md +201 -201
  2. package/dist/blockmodules/AccountStateModule.d.ts +37 -37
  3. package/dist/blockmodules/AccountStateModule.js +43 -43
  4. package/dist/blockmodules/BlockHeightHook.d.ts +6 -6
  5. package/dist/blockmodules/BlockHeightHook.js +15 -15
  6. package/dist/blockmodules/LastStateRootBlockHook.d.ts +7 -7
  7. package/dist/blockmodules/LastStateRootBlockHook.js +15 -15
  8. package/dist/blockmodules/NoopBlockHook.d.ts +8 -8
  9. package/dist/blockmodules/NoopBlockHook.js +9 -9
  10. package/dist/blockmodules/NoopSettlementHook.d.ts +5 -5
  11. package/dist/blockmodules/NoopSettlementHook.d.ts.map +1 -1
  12. package/dist/blockmodules/NoopSettlementHook.js +18 -18
  13. package/dist/blockmodules/NoopTransactionHook.d.ts +5 -5
  14. package/dist/blockmodules/NoopTransactionHook.js +4 -4
  15. package/dist/hooks/AccountStateHook.d.ts +19 -5
  16. package/dist/hooks/AccountStateHook.d.ts.map +1 -1
  17. package/dist/hooks/AccountStateHook.js +15 -9
  18. package/dist/hooks/BlockHeightHook.d.ts +3 -3
  19. package/dist/hooks/BlockHeightHook.d.ts.map +1 -1
  20. package/dist/hooks/BlockHeightHook.js +5 -4
  21. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  22. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  23. package/dist/hooks/LastStateRootBlockHook.js +15 -0
  24. package/dist/hooks/NoopBlockHook.d.ts +6 -4
  25. package/dist/hooks/NoopBlockHook.d.ts.map +1 -1
  26. package/dist/hooks/NoopBlockHook.js +4 -4
  27. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  28. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  29. package/dist/hooks/NoopSettlementHook.js +17 -0
  30. package/dist/hooks/NoopTransactionHook.d.ts +1 -1
  31. package/dist/hooks/NoopTransactionHook.d.ts.map +1 -1
  32. package/dist/hooks/NoopTransactionHook.js +4 -1
  33. package/dist/index.d.ts +18 -8
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +18 -8
  36. package/dist/model/MethodPublicOutput.d.ts +68 -34
  37. package/dist/model/MethodPublicOutput.d.ts.map +1 -1
  38. package/dist/model/Option.d.ts +39 -19
  39. package/dist/model/Option.d.ts.map +1 -1
  40. package/dist/model/Option.js +6 -0
  41. package/dist/model/Path.d.ts +1 -1
  42. package/dist/model/Path.d.ts.map +1 -1
  43. package/dist/model/Path.js +0 -2
  44. package/dist/model/RuntimeLike.d.ts +11 -0
  45. package/dist/model/RuntimeLike.d.ts.map +1 -0
  46. package/dist/model/RuntimeLike.js +1 -0
  47. package/dist/model/StateTransition.d.ts +51 -14
  48. package/dist/model/StateTransition.d.ts.map +1 -1
  49. package/dist/model/StateTransition.js +3 -0
  50. package/dist/model/StateTransitionProvableBatch.d.ts +71 -14
  51. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
  52. package/dist/model/StateTransitionReduction.d.ts +3 -0
  53. package/dist/model/StateTransitionReduction.d.ts.map +1 -0
  54. package/dist/model/StateTransitionReduction.js +26 -0
  55. package/dist/model/network/NetworkState.d.ts +73 -18
  56. package/dist/model/network/NetworkState.d.ts.map +1 -1
  57. package/dist/model/network/NetworkState.js +2 -2
  58. package/dist/model/transaction/ProtocolTransaction.d.ts +69 -69
  59. package/dist/model/transaction/ProtocolTransaction.js +18 -18
  60. package/dist/model/transaction/RuntimeTransaction.d.ts +50 -16
  61. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
  62. package/dist/model/transaction/RuntimeTransaction.js +4 -4
  63. package/dist/model/transaction/SignedTransaction.d.ts +39 -3
  64. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -1
  65. package/dist/model/transaction/SignedTransaction.js +1 -1
  66. package/dist/model/transaction/ValueOption.d.ts +86 -32
  67. package/dist/model/transaction/ValueOption.d.ts.map +1 -1
  68. package/dist/model/transaction/ValueOption.js +1 -1
  69. package/dist/protocol/Protocol.d.ts +14 -20
  70. package/dist/protocol/Protocol.d.ts.map +1 -1
  71. package/dist/protocol/Protocol.js +13 -27
  72. package/dist/protocol/ProtocolEnvironment.d.ts +3 -3
  73. package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -1
  74. package/dist/protocol/ProtocolModule.d.ts +1 -0
  75. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  76. package/dist/protocol/ProtocolModule.js +4 -2
  77. package/dist/protocol/ProvableBlockHook.d.ts +2 -2
  78. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -1
  79. package/dist/protocol/ProvableTransactionHook.d.ts +1 -1
  80. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -1
  81. package/dist/prover/block/BlockProvable.d.ts +240 -98
  82. package/dist/prover/block/BlockProvable.d.ts.map +1 -1
  83. package/dist/prover/block/BlockProver.d.ts +8 -8
  84. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  85. package/dist/prover/block/BlockProver.js +55 -45
  86. package/dist/prover/block/BlockTransactionPosition.d.ts +35 -35
  87. package/dist/prover/block/BlockTransactionPosition.js +25 -25
  88. package/dist/prover/block/BundleTransactionPosition.d.ts +36 -0
  89. package/dist/prover/block/BundleTransactionPosition.d.ts.map +1 -0
  90. package/dist/prover/block/BundleTransactionPosition.js +25 -0
  91. package/dist/prover/block/SplitPrefilledStateService.d.ts +11 -0
  92. package/dist/prover/block/SplitPrefilledStateService.d.ts.map +1 -0
  93. package/dist/prover/block/SplitPrefilledStateService.js +1 -0
  94. package/dist/prover/block/SplitStateService.d.ts +11 -0
  95. package/dist/prover/block/SplitStateService.d.ts.map +1 -0
  96. package/dist/prover/block/SplitStateService.js +1 -0
  97. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +35 -16
  98. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -1
  99. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +1 -1
  100. package/dist/prover/block/acummulators/BlockHashMerkleTree.d.ts +45 -0
  101. package/dist/prover/block/acummulators/BlockHashMerkleTree.d.ts.map +1 -0
  102. package/dist/prover/block/acummulators/BlockHashMerkleTree.js +16 -0
  103. package/dist/prover/statetransition/StateTransitionProvable.d.ts +116 -58
  104. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
  105. package/dist/prover/statetransition/StateTransitionProver.d.ts +10 -9
  106. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  107. package/dist/prover/statetransition/StateTransitionProver.js +18 -22
  108. package/dist/prover/statetransition/StateTransitionWitnessProvider.js +1 -2
  109. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.js +1 -2
  110. package/dist/settlement/ContractModule.d.ts +15 -0
  111. package/dist/settlement/ContractModule.d.ts.map +1 -0
  112. package/dist/settlement/ContractModule.js +11 -0
  113. package/dist/settlement/DispatchContract.d.ts +20 -0
  114. package/dist/settlement/DispatchContract.d.ts.map +1 -0
  115. package/dist/settlement/DispatchContract.js +112 -0
  116. package/dist/settlement/OutgoingMessageArgument.d.ts +109 -0
  117. package/dist/settlement/OutgoingMessageArgument.d.ts.map +1 -0
  118. package/dist/settlement/OutgoingMessageArgument.js +32 -0
  119. package/dist/settlement/ProvableSettlementHook.d.ts +25 -25
  120. package/dist/settlement/ProvableSettlementHook.js +3 -3
  121. package/dist/settlement/SettlementContract.d.ts +229 -229
  122. package/dist/settlement/SettlementContract.js +346 -346
  123. package/dist/settlement/SettlementContractModule.d.ts +40 -0
  124. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  125. package/dist/settlement/SettlementContractModule.js +71 -0
  126. package/dist/settlement/contracts/DispatchContract.d.ts +21 -0
  127. package/dist/settlement/contracts/DispatchContract.d.ts.map +1 -0
  128. package/dist/settlement/contracts/DispatchContract.js +111 -0
  129. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +12 -0
  130. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  131. package/dist/{hooks/TransactionFeeHook.js → settlement/contracts/DispatchContractProtocolModule.js} +17 -21
  132. package/dist/settlement/contracts/DispatchSmartContract.d.ts +22 -0
  133. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  134. package/dist/settlement/contracts/DispatchSmartContract.js +110 -0
  135. package/dist/settlement/contracts/SettlementContract.d.ts +19 -0
  136. package/dist/settlement/contracts/SettlementContract.d.ts.map +1 -0
  137. package/dist/settlement/contracts/SettlementContract.js +43 -0
  138. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +19 -0
  139. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  140. package/dist/settlement/contracts/SettlementContractProtocolModule.js +44 -0
  141. package/dist/settlement/contracts/SettlementSmartContract.d.ts +42 -0
  142. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  143. package/dist/settlement/contracts/SettlementSmartContract.js +246 -0
  144. package/dist/settlement/messages/Deposit.d.ts +64 -0
  145. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  146. package/dist/settlement/messages/Deposit.js +6 -0
  147. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +189 -0
  148. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  149. package/dist/settlement/messages/OutgoingMessageArgument.js +32 -0
  150. package/dist/settlement/messages/Withdrawal.d.ts +65 -0
  151. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  152. package/dist/settlement/messages/Withdrawal.js +13 -0
  153. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +24 -0
  154. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  155. package/dist/settlement/modularity/ProvableSettlementHook.js +3 -0
  156. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +3 -3
  157. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -1
  158. package/dist/settlement/modules/NetworkStateSettlementModule.js +4 -2
  159. package/dist/state/State.d.ts +4 -3
  160. package/dist/state/State.d.ts.map +1 -1
  161. package/dist/state/State.js +18 -12
  162. package/dist/state/StateMap.d.ts +3 -3
  163. package/dist/state/StateMap.d.ts.map +1 -1
  164. package/dist/state/StateMap.js +4 -5
  165. package/dist/state/StateService.d.ts +3 -3
  166. package/dist/state/StateService.d.ts.map +1 -1
  167. package/dist/state/StateServiceProvider.d.ts +3 -3
  168. package/dist/state/StateServiceProvider.d.ts.map +1 -1
  169. package/dist/state/StateServiceProvider.js +1 -3
  170. package/dist/state/assert/assert.d.ts +1 -1
  171. package/dist/state/assert/assert.d.ts.map +1 -1
  172. package/dist/state/assert/assert.js +11 -5
  173. package/dist/state/context/ProtocolMethodExecutionContext.d.ts +1 -1
  174. package/dist/state/context/ProtocolMethodExecutionContext.d.ts.map +1 -1
  175. package/dist/state/context/ProtocolMethodExecutionContext.js +1 -1
  176. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +55 -4
  177. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -1
  178. package/dist/state/context/RuntimeMethodExecutionContext.js +6 -6
  179. package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -1
  180. package/dist/state/context/TransitionMethodExecutionContext.js +0 -1
  181. package/dist/state/context/contextExecution.d.ts +14 -0
  182. package/dist/state/context/contextExecution.d.ts.map +1 -0
  183. package/dist/state/context/contextExecution.js +30 -0
  184. package/dist/state/protocol/ProtocolState.d.ts.map +1 -1
  185. package/dist/state/protocol/ProtocolState.js +0 -3
  186. package/dist/utils/AppliedBatchHashList.d.ts +17 -0
  187. package/dist/utils/AppliedBatchHashList.d.ts.map +1 -0
  188. package/dist/utils/AppliedBatchHashList.js +24 -0
  189. package/dist/utils/MinaPrefixedProvableHashList.d.ts +2 -2
  190. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -1
  191. package/dist/utils/MinaPrefixedProvableHashList.js +1 -0
  192. package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
  193. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
  194. package/dist/utils/ProvableHashList.d.ts +4 -4
  195. package/dist/utils/ProvableHashList.d.ts.map +1 -1
  196. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  197. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  198. package/dist/utils/ProvableReductionHashList.js +50 -0
  199. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  200. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  201. package/dist/utils/StateTransitionReductionList.js +60 -0
  202. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +11 -0
  203. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +1 -0
  204. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +12 -0
  205. package/dist/utils/merkletree/MerkleTreeStore.d.ts +5 -0
  206. package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +1 -0
  207. package/dist/utils/merkletree/MerkleTreeStore.js +1 -0
  208. package/dist/utils/merkletree/RollupMerkleTree.d.ts +133 -0
  209. package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +1 -0
  210. package/dist/utils/merkletree/RollupMerkleTree.js +255 -0
  211. package/dist/utils/utils.d.ts +1 -1
  212. package/dist/utils/utils.d.ts.map +1 -1
  213. package/dist/utils/utils.js +5 -10
  214. package/package.json +5 -5
  215. package/src/{blockmodules/AccountStateModule.ts → hooks/AccountStateHook.ts} +13 -9
  216. package/src/{blockmodules → hooks}/BlockHeightHook.ts +3 -4
  217. package/src/{blockmodules → hooks}/LastStateRootBlockHook.ts +4 -4
  218. package/src/{blockmodules → hooks}/NoopBlockHook.ts +6 -5
  219. package/src/{blockmodules → hooks}/NoopSettlementHook.ts +3 -4
  220. package/src/{blockmodules → hooks}/NoopTransactionHook.ts +5 -1
  221. package/src/index.ts +18 -8
  222. package/src/model/MethodPublicOutput.ts +2 -2
  223. package/src/model/Option.ts +21 -1
  224. package/src/model/Path.ts +1 -3
  225. package/src/model/RuntimeLike.ts +12 -0
  226. package/src/model/StateTransition.ts +9 -1
  227. package/src/model/Transaction.ts +2 -0
  228. package/src/model/network/NetworkState.ts +2 -2
  229. package/src/model/transaction/RuntimeTransaction.ts +5 -12
  230. package/src/model/transaction/SignedTransaction.ts +1 -8
  231. package/src/model/transaction/ValueOption.ts +1 -1
  232. package/src/protocol/Protocol.ts +34 -48
  233. package/src/protocol/ProtocolEnvironment.ts +7 -6
  234. package/src/protocol/ProtocolModule.ts +8 -4
  235. package/src/protocol/ProvableBlockHook.ts +3 -3
  236. package/src/protocol/ProvableTransactionHook.ts +4 -2
  237. package/src/protocol/TransitioningProtocolModule.ts +1 -1
  238. package/src/prover/block/BlockProvable.ts +3 -3
  239. package/src/prover/block/BlockProver.ts +98 -63
  240. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +2 -2
  241. package/src/prover/statetransition/StateTransitionProvable.ts +3 -3
  242. package/src/prover/statetransition/StateTransitionProver.ts +26 -28
  243. package/src/settlement/ContractModule.ts +24 -0
  244. package/src/settlement/SettlementContractModule.ts +132 -0
  245. package/src/settlement/contracts/DispatchContractProtocolModule.ts +39 -0
  246. package/src/settlement/contracts/DispatchSmartContract.ts +136 -0
  247. package/src/settlement/contracts/SettlementContractProtocolModule.ts +67 -0
  248. package/src/settlement/contracts/SettlementSmartContract.ts +350 -0
  249. package/src/settlement/messages/Deposit.ts +6 -0
  250. package/src/settlement/messages/OutgoingMessageArgument.ts +42 -0
  251. package/src/settlement/messages/Withdrawal.ts +14 -0
  252. package/src/settlement/{ProvableSettlementHook.ts → modularity/ProvableSettlementHook.ts} +9 -13
  253. package/src/settlement/modules/NetworkStateSettlementModule.ts +8 -5
  254. package/src/state/State.ts +21 -13
  255. package/src/state/StateMap.ts +4 -5
  256. package/src/state/StateService.ts +3 -3
  257. package/src/state/StateServiceProvider.ts +6 -7
  258. package/src/state/assert/assert.ts +13 -7
  259. package/src/state/context/RuntimeMethodExecutionContext.ts +13 -7
  260. package/src/state/context/TransitionMethodExecutionContext.ts +0 -1
  261. package/src/state/protocol/ProtocolState.ts +1 -4
  262. package/src/utils/MinaPrefixedProvableHashList.ts +4 -3
  263. package/src/utils/PrefixedProvableHashList.ts +2 -2
  264. package/src/utils/ProvableHashList.ts +2 -2
  265. package/src/utils/ProvableReductionHashList.ts +68 -0
  266. package/src/utils/StateTransitionReductionList.ts +89 -0
  267. package/src/utils/utils.ts +4 -9
  268. package/test/BlockProver.test.ts +110 -128
  269. package/test/Protocol.test.ts +14 -21
  270. package/test/State.test.ts +8 -8
  271. package/test/StateTransition.test.ts +56 -66
  272. package/test/TestingProtocol.ts +48 -0
  273. package/test/model/Option.test.ts +72 -0
  274. package/{src → test}/state/assert/assert.test.ts +4 -4
  275. package/test/tsconfig.json +7 -0
  276. package/test/utils/ProvableReductionHashList.test.ts +117 -0
  277. package/test/utils.test.ts +0 -3
  278. package/dist/hooks/TransactionFeeHook.d.ts +0 -16
  279. package/dist/hooks/TransactionFeeHook.d.ts.map +0 -1
  280. package/src/blockmodules/SequenceStateTransactionModule.ts +0 -25
  281. package/src/model/Option.test.ts +0 -21
  282. package/src/settlement/SettlementContract.ts +0 -444
  283. package/src/state/context/ProtocolMethodExecutionContext.ts +0 -36
  284. package/test/Option.test.ts +0 -64
  285. package/tsconfig.test.json +0 -9
@@ -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
+ }
@@ -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,136 @@
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
+ ) => Promise<void>;
30
+ initialize: (settlementContract: PublicKey) => Promise<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 async updateMessagesHash(
52
+ executedMessagesHash: Field,
53
+ newPromisedMessagesHash: Field
54
+ ) {
55
+ const promisedMessagesHash =
56
+ this.promisedMessagesHash.getAndRequireEquals();
57
+ this.honoredMessagesHash.getAndRequireEquals();
58
+
59
+ executedMessagesHash.assertEquals(promisedMessagesHash);
60
+
61
+ this.honoredMessagesHash.set(executedMessagesHash);
62
+
63
+ // Assert and apply new promisedMessagesHash
64
+ this.self.account.actionState.requireEquals(newPromisedMessagesHash);
65
+ this.promisedMessagesHash.set(newPromisedMessagesHash);
66
+ }
67
+
68
+ @method
69
+ public async initialize(settlementContract: PublicKey) {
70
+ this.promisedMessagesHash.getAndRequireEquals().assertEquals(Field(0));
71
+ this.honoredMessagesHash.getAndRequireEquals().assertEquals(Field(0));
72
+ this.settlementContract
73
+ .getAndRequireEquals()
74
+ .assertEquals(PublicKey.empty<typeof PublicKey>());
75
+
76
+ this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
77
+ this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
78
+ this.settlementContract.set(settlementContract);
79
+ }
80
+
81
+ private dispatchMessage<Type>(
82
+ methodId: Field,
83
+ value: Type,
84
+ valueType: ProvableExtended<Type>
85
+ ) {
86
+ const args = valueType.toFields(value);
87
+ // Should be the same as RuntimeTransaction.hash
88
+ const argsHash = Poseidon.hash(args);
89
+ const runtimeTransaction = RuntimeTransaction.fromMessage({
90
+ methodId,
91
+ argsHash,
92
+ });
93
+
94
+ // Append tx to incomingMessagesHash
95
+ const actionData = runtimeTransaction.hashData();
96
+ const actionHash = MinaActions.actionHash(actionData);
97
+
98
+ this.self.body.actions = {
99
+ hash: actionHash,
100
+ data: [actionData],
101
+ };
102
+
103
+ const eventHash = MinaEvents.eventHash(args);
104
+ this.self.body.events = {
105
+ hash: eventHash,
106
+ data: [args],
107
+ };
108
+ }
109
+
110
+ @method
111
+ public async deposit(amount: UInt64) {
112
+ // Save this, since otherwise it would be a second witness later,
113
+ // which could be a different values than the first
114
+ const sender = this.sender.getUnconstrained();
115
+
116
+ const settlementContract = this.settlementContract.getAndRequireEquals();
117
+
118
+ // Credit the amount to the settlement contract
119
+ const balanceAU = AccountUpdate.create(settlementContract);
120
+ balanceAU.balance.addInPlace(amount);
121
+ this.self.approve(balanceAU);
122
+
123
+ const action = new Deposit({
124
+ address: sender,
125
+ amount,
126
+ });
127
+
128
+ const { methodIdMappings, incomingMessagesPaths } =
129
+ DispatchSmartContract.args;
130
+
131
+ const methodId = Field(
132
+ methodIdMappings[incomingMessagesPaths.deposit].methodId
133
+ ).toConstant();
134
+ this.dispatchMessage(methodId.toConstant(), action, Deposit);
135
+ }
136
+ }
@@ -0,0 +1,67 @@
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
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
50
+ const withdrawalStatePathSplit = config.withdrawalStatePath.split(".") as [
51
+ string,
52
+ string,
53
+ ];
54
+
55
+ const escapeHatchSlotsInterval =
56
+ config.escapeHatchSlotsInterval ?? DEFAULT_ESCAPE_HATCH;
57
+
58
+ SettlementSmartContract.args = {
59
+ DispatchContract: dispatchContract,
60
+ hooks,
61
+ withdrawalStatePath: withdrawalStatePathSplit,
62
+ escapeHatchSlotsInterval,
63
+ };
64
+
65
+ return SettlementSmartContract;
66
+ }
67
+ }