@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
@@ -3,10 +3,10 @@ import "reflect-metadata";
3
3
  import { Bool } from "o1js";
4
4
  import { container } from "tsyringe";
5
5
 
6
- import { assert } from "./assert";
7
- import { RuntimeMethodExecutionContext } from "../context/RuntimeMethodExecutionContext";
8
- import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
9
- import { NetworkState } from "../../model/network/NetworkState";
6
+ import { assert } from "../../../src/state/assert/assert";
7
+ import { RuntimeMethodExecutionContext } from "../../../src/state/context/RuntimeMethodExecutionContext";
8
+ import { RuntimeTransaction } from "../../../src/model/transaction/RuntimeTransaction";
9
+ import { NetworkState } from "../../../src/model/network/NetworkState";
10
10
 
11
11
  describe("assert", () => {
12
12
  const defaultStatusMessage = "something went wrong";
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "./../../../tsconfig.json",
3
+ "compilerOptions": {
4
+ "experimentalDecorators": true
5
+ },
6
+ "include": ["../src/**/*.test.ts", "./**/*.ts", "./*.ts", "../src/**/*.ts"]
7
+ }
@@ -0,0 +1,117 @@
1
+ import "reflect-metadata";
2
+ import { Bool, Field, Poseidon } from "o1js";
3
+
4
+ import {
5
+ StateTransitionReductionList,
6
+ reduceStateTransitions,
7
+ } from "../../src/utils/StateTransitionReductionList";
8
+ import {
9
+ DefaultProvableHashList,
10
+ ProvableStateTransition,
11
+ StateTransition,
12
+ Option,
13
+ } from "../../src";
14
+
15
+ interface UnprovableStateTransition {
16
+ path: number;
17
+ from: number;
18
+ to: { isSome: boolean; value: number };
19
+ }
20
+
21
+ describe("provableReductionHashList", () => {
22
+ function mapToProvable(
23
+ sts: UnprovableStateTransition[]
24
+ ): StateTransition<unknown>[] {
25
+ return sts.map(
26
+ (st) =>
27
+ new StateTransition(
28
+ Field(st.path),
29
+ new Option(Bool(true), Field(st.from), Field, Bool(false)),
30
+ new Option(Bool(st.to.isSome), Field(st.to.value), Field, Bool(false))
31
+ ) as StateTransition<unknown>
32
+ );
33
+ }
34
+
35
+ describe.each<[UnprovableStateTransition[], number]>([
36
+ [
37
+ [
38
+ { path: 1, from: 5, to: { isSome: true, value: 10 } },
39
+ { path: 1, from: 10, to: { isSome: true, value: 15 } },
40
+ ],
41
+ 1,
42
+ ],
43
+ [
44
+ [
45
+ { path: 1, from: 5, to: { isSome: true, value: 10 } },
46
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
47
+ ],
48
+ 1,
49
+ ],
50
+ [
51
+ [
52
+ { path: 1, from: 5, to: { isSome: true, value: 10 } },
53
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
54
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
55
+ { path: 5, from: 15, to: { isSome: false, value: 0 } },
56
+ { path: 5, from: 15, to: { isSome: true, value: 20 } },
57
+ { path: 1, from: 10, to: { isSome: false, value: 0 } },
58
+ { path: 5, from: 20, to: { isSome: true, value: 25 } },
59
+ { path: 5, from: 25, to: { isSome: true, value: 30 } },
60
+ ],
61
+ 4,
62
+ ],
63
+ ])("should reduce and append correctly", (sts, reducedLength) => {
64
+ it("start from empty list", () => {
65
+ const reductionList = new StateTransitionReductionList(
66
+ ProvableStateTransition
67
+ );
68
+ const normalList = new DefaultProvableHashList(ProvableStateTransition);
69
+
70
+ const provableSTs = mapToProvable(sts);
71
+
72
+ provableSTs.forEach((st) => {
73
+ reductionList.push(st.toProvable());
74
+ });
75
+
76
+ const reduced = reduceStateTransitions(provableSTs);
77
+ reduced.forEach((st) => {
78
+ normalList.push(st.toProvable());
79
+ });
80
+
81
+ expect(reduced).toHaveLength(reducedLength);
82
+ expect(normalList.commitment.toBigInt()).toStrictEqual(
83
+ reductionList.commitment.toBigInt()
84
+ );
85
+ expect(reductionList.unconstrainedList).toHaveLength(reduced.length);
86
+ });
87
+
88
+ it("start from non-zero commitment - skip first reduction", () => {
89
+ const commitment = Poseidon.hash([Field(123_456)]);
90
+ const reductionList = new StateTransitionReductionList(
91
+ ProvableStateTransition,
92
+ commitment
93
+ );
94
+ const normalList = new DefaultProvableHashList(
95
+ ProvableStateTransition,
96
+ commitment
97
+ );
98
+
99
+ const provableSTs = mapToProvable(sts);
100
+
101
+ provableSTs.forEach((st) => {
102
+ reductionList.push(st.toProvable());
103
+ });
104
+
105
+ const reduced = reduceStateTransitions(provableSTs);
106
+ reduced.forEach((st) => {
107
+ normalList.push(st.toProvable());
108
+ });
109
+
110
+ expect(reduced).toHaveLength(reducedLength);
111
+ expect(normalList.commitment.toBigInt()).toStrictEqual(
112
+ reductionList.commitment.toBigInt()
113
+ );
114
+ expect(reductionList.unconstrainedList).toHaveLength(reduced.length);
115
+ });
116
+ });
117
+ });
@@ -1,15 +1,12 @@
1
1
  import "reflect-metadata";
2
- import { Field } from "o1js";
3
2
 
4
3
  import { stringToField } from "../src";
5
4
 
6
5
  describe("stringToField", () => {
7
6
  const stringToFieldInputs: string[] = [];
8
7
 
9
- // eslint-disable-next-line jest/require-hook
10
8
  [31, 32, 33, 63, 64, 65, 1000].forEach((length) => {
11
9
  stringToFieldInputs.push(
12
- // eslint-disable-next-line array-func/from-map
13
10
  Array.from({ length })
14
11
  .map(() => "A")
15
12
  .reduce((a, b) => a + b)
@@ -1,16 +0,0 @@
1
- import { Runtime, RuntimeModulesRecord } from "@proto-kit/module";
2
- import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
3
- import { BlockProverExecutionData } from "../prover/block/BlockProvable";
4
- export declare const treeFeeHeight = 10;
5
- declare const FeeTree_base: import("@proto-kit/common").AbstractMerkleTreeClass;
6
- export declare class FeeTree extends FeeTree_base {
7
- }
8
- export declare class TransactionFeeHook extends ProvableTransactionHook {
9
- runtime: Runtime<RuntimeModulesRecord>;
10
- constructor(runtime: Runtime<RuntimeModulesRecord>);
11
- feeTree: FeeTree;
12
- createFeeTree(): FeeTree;
13
- onTransaction(executionData: BlockProverExecutionData): void;
14
- }
15
- export {};
16
- //# sourceMappingURL=TransactionFeeHook.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TransactionFeeHook.d.ts","sourceRoot":"","sources":["../../src/hooks/TransactionFeeHook.ts"],"names":[],"mappings":"AAEA,OAAO,EAEL,OAAO,EACP,oBAAoB,EACrB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qCAAqC,CAAC;AAC9E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AAEzE,eAAO,MAAM,aAAa,KAAK,CAAC;;AAChC,qBAAa,OAAQ,SAAQ,YAA+B;CAAG;AAE/D,qBAAa,kBAAmB,SAAQ,uBAAuB;IAEjC,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC;gBAAtC,OAAO,EAAE,OAAO,CAAC,oBAAoB,CAAC;IAK3D,OAAO,EAAE,OAAO,CAAwB;IAExC,aAAa;IASb,aAAa,CAAC,aAAa,EAAE,wBAAwB,GAAG,IAAI;CACpE"}
@@ -1,25 +0,0 @@
1
- import { Field } from "o1js";
2
-
3
- import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
4
- import { BlockProverExecutionData } from "../prover/block/BlockProvable";
5
- import { protocolState } from "../state/protocol/ProtocolState";
6
- import { State } from "../state/State";
7
- import { DefaultProvableHashList } from "../utils/ProvableHashList";
8
- import { SignedTransaction } from "../model/transaction/SignedTransaction";
9
-
10
- // Future idea to add this functionality as a module
11
- // This is currently hardcoded in tracing however
12
- class SequenceStateTransactionModule extends ProvableTransactionHook {
13
- @protocolState() sequenceStateTransactionsList = State.from(Field);
14
-
15
- public onTransaction(executionData: BlockProverExecutionData): void {
16
- const hashList = new DefaultProvableHashList(
17
- SignedTransaction,
18
- this.sequenceStateTransactionsList.get().orElse(Field(0))
19
- );
20
-
21
- hashList.push(executionData.transaction);
22
-
23
- this.sequenceStateTransactionsList.set(hashList.commitment);
24
- }
25
- }
@@ -1,21 +0,0 @@
1
- import { Bool, Field, Poseidon } from "o1js";
2
-
3
- import { Option } from "./Option";
4
-
5
- describe("option", () => {
6
- it.each([
7
- [Bool(true), Field(0), Field, true],
8
- [Bool(false), Field(0), Field, false],
9
- ])(
10
- "should serialize to the correct tree value",
11
- (isSome, value, valueType, shouldHash) => {
12
- expect.assertions(1);
13
-
14
- const option = Option.from(isSome, value, valueType);
15
- // eslint-disable-next-line jest/no-conditional-in-test
16
- const treeValue = shouldHash ? Poseidon.hash(value.toFields()) : Field(0);
17
-
18
- expect(option.treeValue.toString()).toStrictEqual(treeValue.toString());
19
- }
20
- );
21
- });
@@ -1,444 +0,0 @@
1
- import {
2
- AccountUpdate,
3
- Bool,
4
- Field,
5
- method,
6
- Mina,
7
- Poseidon,
8
- Proof,
9
- Provable,
10
- ProvableExtended,
11
- PublicKey,
12
- Reducer,
13
- Signature,
14
- SmartContract,
15
- State,
16
- state,
17
- Struct,
18
- TokenId,
19
- UInt32,
20
- UInt64,
21
- } from "o1js";
22
- import {
23
- EMPTY_PUBLICKEY,
24
- prefixToField,
25
- RollupMerkleTree,
26
- RollupMerkleTreeWitness,
27
- } from "@proto-kit/common";
28
- import { inject, injectable, injectAll } from "tsyringe";
29
-
30
- import { ProtocolModule } from "../protocol/ProtocolModule";
31
- import { BlockProver } from "../prover/block/BlockProver";
32
- import {
33
- BlockProvable,
34
- BlockProverPublicInput,
35
- BlockProverPublicOutput,
36
- } from "../prover/block/BlockProvable";
37
- import { NetworkState } from "../model/network/NetworkState";
38
- import { BlockHashMerkleTree } from "../prover/block/accummulators/BlockHashMerkleTree";
39
- import { RuntimeTransaction } from "../model/transaction/RuntimeTransaction";
40
- import { Path } from "../model/Path";
41
- import { MinaActions, MinaEvents } from "../utils/MinaPrefixedProvableHashList";
42
-
43
- import {
44
- ProvableSettlementHook,
45
- SettlementHookInputs,
46
- SettlementStateRecord,
47
- } from "./ProvableSettlementHook";
48
-
49
- class LazyBlockProof extends Proof<
50
- BlockProverPublicInput,
51
- BlockProverPublicOutput
52
- > {
53
- public static publicInputType = BlockProverPublicInput;
54
-
55
- public static publicOutputType = BlockProverPublicOutput;
56
-
57
- public static tag: () => { name: string } = () => {
58
- throw new Error("Tag not initialized yet");
59
- };
60
- }
61
-
62
- export type SettlementMethodIdMapping = Record<`${string}.${string}`, bigint>;
63
-
64
- export class Deposit extends Struct({
65
- address: PublicKey,
66
- amount: UInt64,
67
- }) {}
68
-
69
- export class Withdrawal extends Struct({
70
- address: PublicKey,
71
- amount: UInt64,
72
- }) {
73
- static dummy() {
74
- return new Withdrawal({
75
- address: EMPTY_PUBLICKEY,
76
- amount: UInt64.from(0),
77
- });
78
- }
79
- }
80
-
81
- export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
82
-
83
- export class OutgoingMessageArgument extends Struct({
84
- witness: RollupMerkleTreeWitness,
85
- value: Withdrawal,
86
- }) {
87
- public static dummy(): OutgoingMessageArgument {
88
- return new OutgoingMessageArgument({
89
- witness: RollupMerkleTreeWitness.dummy(),
90
- value: Withdrawal.dummy(),
91
- });
92
- }
93
- }
94
-
95
- export class OutgoingMessageArgumentBatch extends Struct({
96
- arguments: Provable.Array(
97
- OutgoingMessageArgument,
98
- OUTGOING_MESSAGE_BATCH_SIZE
99
- ),
100
-
101
- isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
102
- }) {
103
- public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
104
- const batch = providedArguments.slice();
105
- const isDummys = batch.map(() => Bool(false));
106
-
107
- while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
108
- batch.push(OutgoingMessageArgument.dummy());
109
- isDummys.push(Bool(true));
110
- }
111
-
112
- return new OutgoingMessageArgumentBatch({
113
- arguments: batch,
114
- isDummys,
115
- });
116
- }
117
- }
118
-
119
- // Some random prefix for the sequencer signature
120
- export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
121
-
122
- export const ACTIONS_EMPTY_HASH = Reducer.initialActionState;
123
-
124
- export class SettlementContract extends SmartContract {
125
- @state(Field) public sequencerKey = State<Field>();
126
- @state(UInt32) public lastSettlementL1Block = State<UInt32>();
127
-
128
- @state(Field) public stateRoot = State<Field>();
129
- @state(Field) public networkStateHash = State<Field>();
130
- @state(Field) public blockHashRoot = State<Field>();
131
-
132
- @state(Field) public promisedMessagesHash = State<Field>();
133
- @state(Field) public honoredMessagesHash = State<Field>();
134
-
135
- @state(Field) public outgoingMessageCursor = State<Field>();
136
-
137
- public constructor(
138
- address: PublicKey,
139
- private readonly methodIdMappings: Record<string, bigint>,
140
- private readonly hooks: ProvableSettlementHook<unknown>[],
141
- private readonly withdrawalStatePath: [string, string],
142
- private readonly incomingMessagesPaths: Record<
143
- string,
144
- `${string}.${string}`
145
- >,
146
- // 24 hours
147
- private readonly escapeHatchSlotsInterval = (60 / 3) * 24
148
- ) {
149
- super(address);
150
- }
151
-
152
- @method
153
- public initialize(sequencer: PublicKey) {
154
- this.sequencerKey.getAndAssertEquals().assertEquals(Field(0));
155
- this.stateRoot.getAndAssertEquals().assertEquals(Field(0));
156
- this.blockHashRoot.getAndAssertEquals().assertEquals(Field(0));
157
- this.networkStateHash.getAndAssertEquals().assertEquals(Field(0));
158
- this.promisedMessagesHash.getAndAssertEquals().assertEquals(Field(0));
159
- this.honoredMessagesHash.getAndAssertEquals().assertEquals(Field(0));
160
-
161
- this.sequencerKey.set(sequencer.x);
162
- this.stateRoot.set(Field(RollupMerkleTree.EMPTY_ROOT));
163
- this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
164
- this.networkStateHash.set(NetworkState.empty().hash());
165
- this.promisedMessagesHash.set(ACTIONS_EMPTY_HASH);
166
- this.honoredMessagesHash.set(ACTIONS_EMPTY_HASH);
167
- }
168
-
169
- @method
170
- public settle(
171
- blockProof: LazyBlockProof,
172
- signature: Signature,
173
- publicKey: PublicKey,
174
- inputNetworkState: NetworkState,
175
- outputNetworkState: NetworkState,
176
- newPromisedMessagesHash: Field
177
- ) {
178
- // Verify the blockproof
179
- blockProof.verify();
180
-
181
- // Get and assert on-chain values
182
- const stateRoot = this.stateRoot.getAndAssertEquals();
183
- const networkStateHash = this.networkStateHash.getAndAssertEquals();
184
- const blockHashRoot = this.blockHashRoot.getAndAssertEquals();
185
- const sequencerKey = this.sequencerKey.getAndAssertEquals();
186
- const promisedMessagesHash = this.promisedMessagesHash.getAndAssertEquals();
187
- const honoredMessagesHash = this.honoredMessagesHash.getAndAssertEquals();
188
- const lastSettlementL1Block =
189
- this.lastSettlementL1Block.getAndAssertEquals();
190
-
191
- // Get block height and use the lower bound for all ops
192
- const minBlockIncluded = this.network.globalSlotSinceGenesis.get();
193
- this.network.globalSlotSinceGenesis.assertBetween(
194
- minBlockIncluded,
195
- minBlockIncluded.add(20)
196
- );
197
-
198
- // Check signature/escape catch
199
- publicKey.x.assertEquals(
200
- sequencerKey,
201
- "Sequencer public key witness not matching"
202
- );
203
- const signatureValid = signature.verify(publicKey, [
204
- BATCH_SIGNATURE_PREFIX,
205
- lastSettlementL1Block.value,
206
- ]);
207
- const escapeHatchActivated = lastSettlementL1Block
208
- .add(UInt32.from(this.escapeHatchSlotsInterval))
209
- .lessThan(minBlockIncluded);
210
- signatureValid
211
- .or(escapeHatchActivated)
212
- .assertTrue(
213
- "Sequencer signature not valid and escape hatch not activated"
214
- );
215
-
216
- // Assert correctness of networkState witness
217
- inputNetworkState
218
- .hash()
219
- .assertEquals(networkStateHash, "InputNetworkState witness not valid");
220
- outputNetworkState
221
- .hash()
222
- .assertEquals(
223
- blockProof.publicOutput.networkStateHash,
224
- "OutputNetworkState witness not valid"
225
- );
226
-
227
- blockProof.publicOutput.closed.assertEquals(
228
- Bool(true),
229
- "Supplied proof is not a closed BlockProof"
230
- );
231
-
232
- // Execute onSettlementHooks for additional checks
233
- const stateRecord: SettlementStateRecord = {
234
- blockHashRoot,
235
- stateRoot,
236
- networkStateHash,
237
- honoredMessagesHash,
238
- lastSettlementL1Block,
239
- promisedMessagesHash,
240
- sequencerKey,
241
- };
242
- const inputs: SettlementHookInputs = {
243
- blockProof,
244
- contractState: stateRecord,
245
- newPromisedMessagesHash,
246
- fromNetworkState: inputNetworkState,
247
- toNetworkState: outputNetworkState,
248
- currentL1Block: minBlockIncluded,
249
- };
250
- this.hooks.forEach((hook) => {
251
- hook.beforeSettlement(this, inputs);
252
- });
253
-
254
- // Apply blockProof
255
- stateRoot.assertEquals(
256
- blockProof.publicInput.stateRoot,
257
- "Input state root not matching"
258
- );
259
- networkStateHash.assertEquals(
260
- blockProof.publicInput.networkStateHash,
261
- "Input networkStateHash not matching"
262
- );
263
- blockHashRoot.assertEquals(
264
- blockProof.publicInput.blockHashRoot,
265
- "Input blockHashRoot not matching"
266
- );
267
- this.stateRoot.set(blockProof.publicOutput.stateRoot);
268
- this.networkStateHash.set(blockProof.publicOutput.networkStateHash);
269
- this.blockHashRoot.set(blockProof.publicOutput.blockHashRoot);
270
-
271
- // Assert and apply deposit commitments
272
- promisedMessagesHash.assertEquals(
273
- blockProof.publicOutput.incomingMessagesHash,
274
- "Promised messages not honored"
275
- );
276
- this.honoredMessagesHash.set(promisedMessagesHash);
277
-
278
- // Assert and apply new promisedMessagesHash
279
- this.self.account.actionState.assertEquals(newPromisedMessagesHash);
280
- this.promisedMessagesHash.set(newPromisedMessagesHash);
281
-
282
- this.lastSettlementL1Block.set(minBlockIncluded);
283
- }
284
-
285
- private dispatchMessage<Type>(
286
- methodId: Field,
287
- value: Type,
288
- valueType: ProvableExtended<Type>
289
- ) {
290
- const args = valueType.toFields(value);
291
- // Should be the same as RuntimeTransaction.hash
292
- const argsHash = Poseidon.hash(args);
293
- const runtimeTransaction = RuntimeTransaction.fromMessage({
294
- methodId,
295
- argsHash,
296
- });
297
-
298
- // Append tx to incomingMessagesHash
299
- const actionData = runtimeTransaction.hashData();
300
- const actionHash = MinaActions.actionHash(actionData);
301
-
302
- this.self.body.actions = {
303
- hash: actionHash,
304
- data: [actionData],
305
- };
306
-
307
- const eventHash = MinaEvents.eventHash(args);
308
- this.self.body.events = {
309
- hash: eventHash,
310
- data: [args],
311
- };
312
- }
313
-
314
- @method
315
- public deposit(amount: UInt64) {
316
- // Save this, since otherwise it would be a second witness later,
317
- // which could be a different values than the first
318
- const sender = this.sender;
319
-
320
- // Credit the amount to the bridge contract
321
- this.self.balance.addInPlace(amount);
322
-
323
- const action = new Deposit({
324
- address: sender,
325
- amount,
326
- });
327
- const methodId = Field(
328
- this.methodIdMappings[this.incomingMessagesPaths["deposit"]]
329
- );
330
- this.dispatchMessage(methodId.toConstant(), action, Deposit);
331
- }
332
-
333
- @method
334
- public rollupOutgoingMessages(batch: OutgoingMessageArgumentBatch) {
335
- let counter = this.outgoingMessageCursor.getAndAssertEquals();
336
- const stateRoot = this.stateRoot.getAndAssertEquals();
337
-
338
- const [withdrawalModule, withdrawalStateName] = this.withdrawalStatePath;
339
- const mapPath = Path.fromProperty(withdrawalModule, withdrawalStateName);
340
-
341
- let accountCreationFeePaid = Field(0);
342
-
343
- for (let i = 0; i < OUTGOING_MESSAGE_BATCH_SIZE; i++) {
344
- const args = batch.arguments[i];
345
-
346
- // Check witness
347
- const path = Path.fromKey(mapPath, Field, counter);
348
-
349
- args.witness
350
- .checkMembership(
351
- stateRoot,
352
- path,
353
- Poseidon.hash(Withdrawal.toFields(args.value))
354
- )
355
- .assertTrue("Provided Withdrawal witness not valid");
356
-
357
- // Process message
358
- const { address, amount } = args.value;
359
- const isDummy = address.equals(this.address);
360
-
361
- const tokenAu = this.token.mint({ address, amount });
362
- const isNewAccount = tokenAu.account.isNew.getAndAssertEquals();
363
- tokenAu.body.balanceChange.magnitude =
364
- tokenAu.body.balanceChange.magnitude.sub(
365
- Provable.if(
366
- isNewAccount,
367
- Mina.accountCreationFee().toConstant(),
368
- UInt64.zero
369
- )
370
- );
371
-
372
- accountCreationFeePaid = accountCreationFeePaid.add(
373
- Provable.if(isNewAccount, Field(1e9), Field(0))
374
- );
375
-
376
- counter = counter.add(Provable.if(isDummy, Field(0), Field(1)));
377
- }
378
-
379
- this.balance.subInPlace(UInt64.from(accountCreationFeePaid));
380
-
381
- this.outgoingMessageCursor.set(counter);
382
- }
383
-
384
- @method
385
- public redeem(additionUpdate: AccountUpdate) {
386
- additionUpdate.body.tokenId.assertEquals(
387
- TokenId.default,
388
- "Tokenid not default token"
389
- );
390
- additionUpdate.body.balanceChange.sgn
391
- .isPositive()
392
- .assertTrue("Sign not correct");
393
- const amount = additionUpdate.body.balanceChange.magnitude;
394
-
395
- // Burn tokens
396
- this.token.burn({
397
- address: additionUpdate.publicKey,
398
- amount,
399
- });
400
-
401
- // Send mina
402
- this.approve(additionUpdate);
403
- this.balance.subInPlace(amount);
404
- }
405
- }
406
-
407
- export interface SettlementContractModuleConfig {
408
- withdrawalStatePath: `${string}.${string}`;
409
- withdrawalMethodPath: `${string}.${string}`;
410
- incomingMessagesMethods: Record<string, `${string}.${string}`>;
411
- }
412
-
413
- @injectable()
414
- export class SettlementContractModule extends ProtocolModule<SettlementContractModuleConfig> {
415
- public constructor(
416
- @injectAll("ProvableSettlementHook")
417
- private readonly hooks: ProvableSettlementHook<unknown>[],
418
- @inject("BlockProver")
419
- private readonly blockProver: BlockProvable
420
- ) {
421
- super();
422
- LazyBlockProof.tag = blockProver.zkProgrammable.zkProgram.Proof.tag;
423
- }
424
-
425
- public getContractClass(): typeof SettlementContract {
426
- return SettlementContract;
427
- }
428
-
429
- public createContract(
430
- address: PublicKey,
431
- methodIdMappings: SettlementMethodIdMapping
432
- ): SettlementContract {
433
- // We know that this returns [string, string], but TS can't infer that
434
- const withdrawalPath = this.config.withdrawalStatePath.split(".");
435
-
436
- return new SettlementContract(
437
- address,
438
- methodIdMappings,
439
- this.hooks,
440
- [withdrawalPath[0], withdrawalPath[1]],
441
- this.config.incomingMessagesMethods
442
- );
443
- }
444
- }