@proto-kit/protocol 0.1.1-develop.0

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 (333) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +45 -0
  3. package/dist/Constants.d.ts +4 -0
  4. package/dist/Constants.d.ts.map +1 -0
  5. package/dist/Constants.js +4 -0
  6. package/dist/Constants.js.map +1 -0
  7. package/dist/hooks/AccountStateHook.d.ts +52 -0
  8. package/dist/hooks/AccountStateHook.d.ts.map +1 -0
  9. package/dist/hooks/AccountStateHook.js +48 -0
  10. package/dist/hooks/AccountStateHook.js.map +1 -0
  11. package/dist/hooks/BlockHeightHook.d.ts +7 -0
  12. package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
  13. package/dist/hooks/BlockHeightHook.js +16 -0
  14. package/dist/hooks/BlockHeightHook.js.map +1 -0
  15. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  16. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  17. package/dist/hooks/LastStateRootBlockHook.js +16 -0
  18. package/dist/hooks/LastStateRootBlockHook.js.map +1 -0
  19. package/dist/hooks/NoopBlockHook.d.ts +9 -0
  20. package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
  21. package/dist/hooks/NoopBlockHook.js +10 -0
  22. package/dist/hooks/NoopBlockHook.js.map +1 -0
  23. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  24. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  25. package/dist/hooks/NoopSettlementHook.js +18 -0
  26. package/dist/hooks/NoopSettlementHook.js.map +1 -0
  27. package/dist/hooks/NoopTransactionHook.d.ts +6 -0
  28. package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
  29. package/dist/hooks/NoopTransactionHook.js +8 -0
  30. package/dist/hooks/NoopTransactionHook.js.map +1 -0
  31. package/dist/index.d.ts +58 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +58 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/model/MethodPublicOutput.d.ts +113 -0
  36. package/dist/model/MethodPublicOutput.d.ts.map +1 -0
  37. package/dist/model/MethodPublicOutput.js +15 -0
  38. package/dist/model/MethodPublicOutput.js.map +1 -0
  39. package/dist/model/Option.d.ts +122 -0
  40. package/dist/model/Option.d.ts.map +1 -0
  41. package/dist/model/Option.js +111 -0
  42. package/dist/model/Option.js.map +1 -0
  43. package/dist/model/Path.d.ts +31 -0
  44. package/dist/model/Path.d.ts.map +1 -0
  45. package/dist/model/Path.js +43 -0
  46. package/dist/model/Path.js.map +1 -0
  47. package/dist/model/RuntimeLike.d.ts +11 -0
  48. package/dist/model/RuntimeLike.d.ts.map +1 -0
  49. package/dist/model/RuntimeLike.js +2 -0
  50. package/dist/model/RuntimeLike.js.map +1 -0
  51. package/dist/model/StateTransition.d.ts +135 -0
  52. package/dist/model/StateTransition.d.ts.map +1 -0
  53. package/dist/model/StateTransition.js +69 -0
  54. package/dist/model/StateTransition.js.map +1 -0
  55. package/dist/model/StateTransitionProvableBatch.d.ts +198 -0
  56. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
  57. package/dist/model/StateTransitionProvableBatch.js +91 -0
  58. package/dist/model/StateTransitionProvableBatch.js.map +1 -0
  59. package/dist/model/network/NetworkState.d.ts +160 -0
  60. package/dist/model/network/NetworkState.d.ts.map +1 -0
  61. package/dist/model/network/NetworkState.js +32 -0
  62. package/dist/model/network/NetworkState.js.map +1 -0
  63. package/dist/model/transaction/RuntimeTransaction.d.ts +122 -0
  64. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
  65. package/dist/model/transaction/RuntimeTransaction.js +87 -0
  66. package/dist/model/transaction/RuntimeTransaction.js.map +1 -0
  67. package/dist/model/transaction/SignedTransaction.d.ts +107 -0
  68. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
  69. package/dist/model/transaction/SignedTransaction.js +34 -0
  70. package/dist/model/transaction/SignedTransaction.js.map +1 -0
  71. package/dist/model/transaction/ValueOption.d.ts +173 -0
  72. package/dist/model/transaction/ValueOption.d.ts.map +1 -0
  73. package/dist/model/transaction/ValueOption.js +25 -0
  74. package/dist/model/transaction/ValueOption.js.map +1 -0
  75. package/dist/protocol/Protocol.d.ts +43 -0
  76. package/dist/protocol/Protocol.d.ts.map +1 -0
  77. package/dist/protocol/Protocol.js +120 -0
  78. package/dist/protocol/Protocol.js.map +1 -0
  79. package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
  80. package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
  81. package/dist/protocol/ProtocolEnvironment.js +2 -0
  82. package/dist/protocol/ProtocolEnvironment.js.map +1 -0
  83. package/dist/protocol/ProtocolModule.d.ts +9 -0
  84. package/dist/protocol/ProtocolModule.d.ts.map +1 -0
  85. package/dist/protocol/ProtocolModule.js +13 -0
  86. package/dist/protocol/ProtocolModule.js.map +1 -0
  87. package/dist/protocol/ProvableBlockHook.d.ts +8 -0
  88. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
  89. package/dist/protocol/ProvableBlockHook.js +5 -0
  90. package/dist/protocol/ProvableBlockHook.js.map +1 -0
  91. package/dist/protocol/ProvableTransactionHook.d.ts +7 -0
  92. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
  93. package/dist/protocol/ProvableTransactionHook.js +4 -0
  94. package/dist/protocol/ProvableTransactionHook.js.map +1 -0
  95. package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
  96. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
  97. package/dist/protocol/TransitioningProtocolModule.js +9 -0
  98. package/dist/protocol/TransitioningProtocolModule.js.map +1 -0
  99. package/dist/prover/block/BlockProvable.d.ts +409 -0
  100. package/dist/prover/block/BlockProvable.d.ts.map +1 -0
  101. package/dist/prover/block/BlockProvable.js +48 -0
  102. package/dist/prover/block/BlockProvable.js.map +1 -0
  103. package/dist/prover/block/BlockProver.d.ts +94 -0
  104. package/dist/prover/block/BlockProver.d.ts.map +1 -0
  105. package/dist/prover/block/BlockProver.js +510 -0
  106. package/dist/prover/block/BlockProver.js.map +1 -0
  107. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +64 -0
  108. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
  109. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +17 -0
  110. package/dist/prover/block/accummulators/BlockHashMerkleTree.js.map +1 -0
  111. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
  112. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
  113. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +21 -0
  114. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js.map +1 -0
  115. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
  116. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
  117. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +23 -0
  118. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
  119. package/dist/prover/statetransition/StateTransitionProvable.d.ts +172 -0
  120. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
  121. package/dist/prover/statetransition/StateTransitionProvable.js +16 -0
  122. package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
  123. package/dist/prover/statetransition/StateTransitionProver.d.ts +48 -0
  124. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
  125. package/dist/prover/statetransition/StateTransitionProver.js +187 -0
  126. package/dist/prover/statetransition/StateTransitionProver.js.map +1 -0
  127. package/dist/settlement/ContractModule.d.ts +16 -0
  128. package/dist/settlement/ContractModule.d.ts.map +1 -0
  129. package/dist/settlement/ContractModule.js +12 -0
  130. package/dist/settlement/ContractModule.js.map +1 -0
  131. package/dist/settlement/SettlementContractModule.d.ts +53 -0
  132. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  133. package/dist/settlement/SettlementContractModule.js +80 -0
  134. package/dist/settlement/SettlementContractModule.js.map +1 -0
  135. package/dist/settlement/contracts/BridgeContract.d.ts +97 -0
  136. package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
  137. package/dist/settlement/contracts/BridgeContract.js +164 -0
  138. package/dist/settlement/contracts/BridgeContract.js.map +1 -0
  139. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +14 -0
  140. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
  141. package/dist/settlement/contracts/BridgeContractProtocolModule.js +30 -0
  142. package/dist/settlement/contracts/BridgeContractProtocolModule.js.map +1 -0
  143. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +21 -0
  144. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  145. package/dist/settlement/contracts/DispatchContractProtocolModule.js +57 -0
  146. package/dist/settlement/contracts/DispatchContractProtocolModule.js.map +1 -0
  147. package/dist/settlement/contracts/DispatchSmartContract.d.ts +44 -0
  148. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  149. package/dist/settlement/contracts/DispatchSmartContract.js +230 -0
  150. package/dist/settlement/contracts/DispatchSmartContract.js.map +1 -0
  151. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +21 -0
  152. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  153. package/dist/settlement/contracts/SettlementContractProtocolModule.js +82 -0
  154. package/dist/settlement/contracts/SettlementContractProtocolModule.js.map +1 -0
  155. package/dist/settlement/contracts/SettlementSmartContract.d.ts +123 -0
  156. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  157. package/dist/settlement/contracts/SettlementSmartContract.js +309 -0
  158. package/dist/settlement/contracts/SettlementSmartContract.js.map +1 -0
  159. package/dist/settlement/contracts/TokenBridgeTree.d.ts +228 -0
  160. package/dist/settlement/contracts/TokenBridgeTree.d.ts.map +1 -0
  161. package/dist/settlement/contracts/TokenBridgeTree.js +60 -0
  162. package/dist/settlement/contracts/TokenBridgeTree.js.map +1 -0
  163. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts +10 -0
  164. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts.map +1 -0
  165. package/dist/settlement/contracts/authorizations/ContractAuthorization.js +2 -0
  166. package/dist/settlement/contracts/authorizations/ContractAuthorization.js.map +1 -0
  167. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts +85 -0
  168. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts.map +1 -0
  169. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js +11 -0
  170. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js.map +1 -0
  171. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts +79 -0
  172. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts.map +1 -0
  173. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js +11 -0
  174. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js.map +1 -0
  175. package/dist/settlement/messages/Deposit.d.ts +77 -0
  176. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  177. package/dist/settlement/messages/Deposit.js +8 -0
  178. package/dist/settlement/messages/Deposit.js.map +1 -0
  179. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +197 -0
  180. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  181. package/dist/settlement/messages/OutgoingMessageArgument.js +33 -0
  182. package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
  183. package/dist/settlement/messages/Withdrawal.d.ts +78 -0
  184. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  185. package/dist/settlement/messages/Withdrawal.js +16 -0
  186. package/dist/settlement/messages/Withdrawal.js.map +1 -0
  187. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +26 -0
  188. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  189. package/dist/settlement/modularity/ProvableSettlementHook.js +4 -0
  190. package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
  191. package/dist/settlement/modularity/types.d.ts +8 -0
  192. package/dist/settlement/modularity/types.d.ts.map +1 -0
  193. package/dist/settlement/modularity/types.js +2 -0
  194. package/dist/settlement/modularity/types.js.map +1 -0
  195. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  196. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  197. package/dist/settlement/modules/NetworkStateSettlementModule.js +15 -0
  198. package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
  199. package/dist/state/State.d.ts +68 -0
  200. package/dist/state/State.d.ts.map +1 -0
  201. package/dist/state/State.js +130 -0
  202. package/dist/state/State.js.map +1 -0
  203. package/dist/state/StateMap.d.ts +37 -0
  204. package/dist/state/StateMap.d.ts.map +1 -0
  205. package/dist/state/StateMap.js +56 -0
  206. package/dist/state/StateMap.js.map +1 -0
  207. package/dist/state/StateService.d.ts +6 -0
  208. package/dist/state/StateService.d.ts.map +1 -0
  209. package/dist/state/StateService.js +2 -0
  210. package/dist/state/StateService.js.map +1 -0
  211. package/dist/state/StateServiceProvider.d.ts +8 -0
  212. package/dist/state/StateServiceProvider.d.ts.map +1 -0
  213. package/dist/state/StateServiceProvider.js +37 -0
  214. package/dist/state/StateServiceProvider.js.map +1 -0
  215. package/dist/state/assert/assert.d.ts +12 -0
  216. package/dist/state/assert/assert.d.ts.map +1 -0
  217. package/dist/state/assert/assert.js +31 -0
  218. package/dist/state/assert/assert.js.map +1 -0
  219. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
  220. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
  221. package/dist/state/context/RuntimeMethodExecutionContext.js +136 -0
  222. package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
  223. package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
  224. package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
  225. package/dist/state/context/TransitionMethodExecutionContext.js +6 -0
  226. package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
  227. package/dist/state/protocol/ProtocolState.d.ts +7 -0
  228. package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
  229. package/dist/state/protocol/ProtocolState.js +40 -0
  230. package/dist/state/protocol/ProtocolState.js.map +1 -0
  231. package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
  232. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  233. package/dist/utils/MinaPrefixedProvableHashList.js +53 -0
  234. package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
  235. package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
  236. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
  237. package/dist/utils/PrefixedProvableHashList.js +13 -0
  238. package/dist/utils/PrefixedProvableHashList.js.map +1 -0
  239. package/dist/utils/ProvableHashList.d.ts +27 -0
  240. package/dist/utils/ProvableHashList.d.ts.map +1 -0
  241. package/dist/utils/ProvableHashList.js +44 -0
  242. package/dist/utils/ProvableHashList.js.map +1 -0
  243. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  244. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  245. package/dist/utils/ProvableReductionHashList.js +51 -0
  246. package/dist/utils/ProvableReductionHashList.js.map +1 -0
  247. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  248. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  249. package/dist/utils/StateTransitionReductionList.js +61 -0
  250. package/dist/utils/StateTransitionReductionList.js.map +1 -0
  251. package/dist/utils/utils.d.ts +11 -0
  252. package/dist/utils/utils.d.ts.map +1 -0
  253. package/dist/utils/utils.js +45 -0
  254. package/dist/utils/utils.js.map +1 -0
  255. package/jest.config.cjs +12 -0
  256. package/package.json +36 -0
  257. package/src/Constants.ts +3 -0
  258. package/src/hooks/AccountStateHook.ts +48 -0
  259. package/src/hooks/BlockHeightHook.ts +17 -0
  260. package/src/hooks/LastStateRootBlockHook.ts +26 -0
  261. package/src/hooks/NoopBlockHook.ts +21 -0
  262. package/src/hooks/NoopSettlementHook.ts +20 -0
  263. package/src/hooks/NoopTransactionHook.ts +10 -0
  264. package/src/index.ts +57 -0
  265. package/src/model/MethodPublicOutput.ts +14 -0
  266. package/src/model/Option.ts +172 -0
  267. package/src/model/Path.ts +50 -0
  268. package/src/model/RuntimeLike.ts +12 -0
  269. package/src/model/StateTransition.ts +88 -0
  270. package/src/model/StateTransitionProvableBatch.ts +145 -0
  271. package/src/model/Transaction.ts +31 -0
  272. package/src/model/network/NetworkState.ts +33 -0
  273. package/src/model/transaction/RuntimeTransaction.ts +105 -0
  274. package/src/model/transaction/SignedTransaction.ts +47 -0
  275. package/src/model/transaction/ValueOption.ts +28 -0
  276. package/src/protocol/Protocol.ts +226 -0
  277. package/src/protocol/ProtocolEnvironment.ts +10 -0
  278. package/src/protocol/ProtocolModule.ts +27 -0
  279. package/src/protocol/ProvableBlockHook.ts +19 -0
  280. package/src/protocol/ProvableTransactionHook.ts +13 -0
  281. package/src/protocol/TransitioningProtocolModule.ts +12 -0
  282. package/src/prover/block/BlockProvable.ts +99 -0
  283. package/src/prover/block/BlockProver.ts +990 -0
  284. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
  285. package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
  286. package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
  287. package/src/prover/statetransition/StateTransitionProvable.ts +41 -0
  288. package/src/prover/statetransition/StateTransitionProver.ts +377 -0
  289. package/src/settlement/ContractModule.ts +31 -0
  290. package/src/settlement/SettlementContractModule.ts +145 -0
  291. package/src/settlement/contracts/BridgeContract.ts +237 -0
  292. package/src/settlement/contracts/BridgeContractProtocolModule.ts +43 -0
  293. package/src/settlement/contracts/DispatchContractProtocolModule.ts +73 -0
  294. package/src/settlement/contracts/DispatchSmartContract.ts +326 -0
  295. package/src/settlement/contracts/SettlementContractProtocolModule.ts +108 -0
  296. package/src/settlement/contracts/SettlementSmartContract.ts +498 -0
  297. package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
  298. package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
  299. package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
  300. package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
  301. package/src/settlement/messages/Deposit.ts +7 -0
  302. package/src/settlement/messages/OutgoingMessageArgument.ts +42 -0
  303. package/src/settlement/messages/Withdrawal.ts +16 -0
  304. package/src/settlement/modularity/ProvableSettlementHook.ts +36 -0
  305. package/src/settlement/modularity/types.ts +22 -0
  306. package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
  307. package/src/state/State.ts +175 -0
  308. package/src/state/StateMap.ts +73 -0
  309. package/src/state/StateService.ts +6 -0
  310. package/src/state/StateServiceProvider.ts +37 -0
  311. package/src/state/assert/assert.ts +35 -0
  312. package/src/state/context/RuntimeMethodExecutionContext.ts +174 -0
  313. package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
  314. package/src/state/protocol/ProtocolState.ts +61 -0
  315. package/src/utils/MinaPrefixedProvableHashList.ts +73 -0
  316. package/src/utils/PrefixedProvableHashList.ts +21 -0
  317. package/src/utils/ProvableHashList.ts +50 -0
  318. package/src/utils/ProvableReductionHashList.ts +68 -0
  319. package/src/utils/StateTransitionReductionList.ts +89 -0
  320. package/src/utils/utils.ts +75 -0
  321. package/test/BlockProver.test.ts +212 -0
  322. package/test/Protocol.test.ts +37 -0
  323. package/test/State.test.ts +45 -0
  324. package/test/StateTransition.test.ts +174 -0
  325. package/test/TestingProtocol.ts +52 -0
  326. package/test/compiling/types.ts +28 -0
  327. package/test/model/Option.test.ts +72 -0
  328. package/test/modularity/types.ts +35 -0
  329. package/test/state/assert/assert.test.ts +56 -0
  330. package/test/tsconfig.json +7 -0
  331. package/test/utils/ProvableReductionHashList.test.ts +117 -0
  332. package/test/utils.test.ts +27 -0
  333. package/tsconfig.json +8 -0
@@ -0,0 +1,40 @@
1
+ import { Path } from "../../model/Path";
2
+ const errors = {
3
+ missingName: (className) => new Error(`Unable to provide a unique identifier for state, ${className} is missing a name.
4
+ Did you forget to extend your block module with 'extends ...Hook'?`),
5
+ missingProtocol: (className) => new Error(`Unable to provide 'procotol' for state, ${className} is missing a name.
6
+ Did you forget to extend your block module with 'extends ...Hook'?`),
7
+ };
8
+ /**
9
+ * Decorates a runtime module property as state, passing down some
10
+ * underlying values to improve developer experience.
11
+ */
12
+ export function protocolState() {
13
+ return (target, propertyKey) => {
14
+ let value;
15
+ Object.defineProperty(target, propertyKey, {
16
+ enumerable: true,
17
+ get: function get() {
18
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
19
+ const self = this;
20
+ if (self.name === undefined) {
21
+ throw errors.missingName(self.constructor.name);
22
+ }
23
+ if (!self.protocol) {
24
+ throw errors.missingProtocol(self.constructor.name);
25
+ }
26
+ // TODO Add Prefix?
27
+ const path = Path.fromProperty(self.name, propertyKey);
28
+ if (value) {
29
+ value.path = path;
30
+ value.stateServiceProvider = self.protocol.stateServiceProvider;
31
+ }
32
+ return value;
33
+ },
34
+ set: (newValue) => {
35
+ value = newValue;
36
+ },
37
+ });
38
+ };
39
+ }
40
+ //# sourceMappingURL=ProtocolState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProtocolState.js","sourceRoot":"","sources":["../../../src/state/protocol/ProtocolState.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAGxC,MAAM,MAAM,GAAG;IACb,WAAW,EAAE,CAAC,SAAiB,EAAE,EAAE,CACjC,IAAI,KAAK,CACP,oDAAoD,SAAS;yEACM,CACpE;IAEH,eAAe,EAAE,CAAC,SAAiB,EAAE,EAAE,CACrC,IAAI,KAAK,CACP,2CAA2C,SAAS;yEACe,CACpE;CACJ,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,aAAa;IAC3B,OAAO,CAGL,MAAiC,EACjC,WAAmB,EACnB,EAAE;QACF,IAAI,KAAiC,CAAC;QAEtC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE;YACzC,UAAU,EAAE,IAAI;YAEhB,GAAG,EAAE,SAAS,GAAG;gBACf,yEAAyE;gBACzE,MAAM,IAAI,GAAG,IAAiC,CAAC;gBAE/C,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;oBAC3B,MAAM,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;iBACjD;gBAED,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;oBAClB,MAAM,MAAM,CAAC,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;iBACrD;gBAED,mBAAmB;gBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;gBACvD,IAAI,KAAK,EAAE;oBACT,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;oBAClB,KAAK,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC;iBACjE;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YAED,GAAG,EAAE,CAAC,QAAwB,EAAE,EAAE;gBAChC,KAAK,GAAG,QAAQ,CAAC;YACnB,CAAC;SACF,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { Field, ProvablePure } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList";
3
+ export declare const MINA_EVENT_PREFIXES: {
4
+ readonly event: "MinaZkappEvent******";
5
+ readonly events: "MinaZkappEvents*****";
6
+ readonly sequenceEvents: "MinaZkappSeqEvents**";
7
+ };
8
+ export declare function emptyActions(): Field;
9
+ export declare function emptyEvents(): Field;
10
+ export declare class MinaActions {
11
+ static actionHash(action: Field[], previousHash?: Field): Field;
12
+ }
13
+ export declare class MinaEvents {
14
+ static eventHash(event: Field[], previousHash?: Field): Field;
15
+ }
16
+ export declare class MinaPrefixedProvableHashList<Value> extends ProvableHashList<Value> {
17
+ readonly prefix: string;
18
+ constructor(valueType: ProvablePure<Value>, prefix: string, internalCommitment?: Field);
19
+ protected hash(elements: Field[]): Field;
20
+ }
21
+ export declare class MinaActionsHashList extends MinaPrefixedProvableHashList<Field> {
22
+ constructor(internalCommitment?: Field);
23
+ }
24
+ //# sourceMappingURL=MinaPrefixedProvableHashList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MinaPrefixedProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/MinaPrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,YAAY,EAAE,MAAM,MAAM,CAAC;AAGrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAUtD,eAAO,MAAM,mBAAmB;;;;CAItB,CAAC;AAEX,wBAAgB,YAAY,IAAI,KAAK,CAEpC;AAED,wBAAgB,WAAW,IAAI,KAAK,CAEnC;AAED,qBAAa,WAAW;IACtB,MAAM,CAAC,UAAU,CACf,MAAM,EAAE,KAAK,EAAE,EACf,YAAY,GAAE,KAAsB,GACnC,KAAK;CAOT;AAED,qBAAa,UAAU;IACrB,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,YAAY,GAAE,KAAqB,GAAG,KAAK;CAO7E;AAED,qBAAa,4BAA4B,CACvC,KAAK,CACL,SAAQ,gBAAgB,CAAC,KAAK,CAAC;aAGb,MAAM,EAAE,MAAM;gBAD9B,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,EACd,MAAM,EAAE,MAAM,EAC9B,kBAAkB,GAAE,KAAgB;IAKtC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAKzC;AAED,qBAAa,mBAAoB,SAAQ,4BAA4B,CAAC,KAAK,CAAC;gBACvD,kBAAkB,GAAE,KAAgB;CAGxD"}
@@ -0,0 +1,53 @@
1
+ import { Field, Poseidon } from "o1js";
2
+ import { hashWithPrefix, prefixToField } from "@proto-kit/common";
3
+ import { ProvableHashList } from "./ProvableHashList";
4
+ function salt(prefix) {
5
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
6
+ return Poseidon.update([Field(0), Field(0), Field(0)], [prefixToField(prefix)]);
7
+ }
8
+ export const MINA_EVENT_PREFIXES = {
9
+ event: "MinaZkappEvent******",
10
+ events: "MinaZkappEvents*****",
11
+ sequenceEvents: "MinaZkappSeqEvents**",
12
+ };
13
+ export function emptyActions() {
14
+ return salt("MinaZkappActionsEmpty")[0];
15
+ }
16
+ export function emptyEvents() {
17
+ return salt("MinaZkappEventsEmpty")[0];
18
+ }
19
+ export class MinaActions {
20
+ static actionHash(action, previousHash = emptyActions()) {
21
+ const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, action);
22
+ return hashWithPrefix(MINA_EVENT_PREFIXES.sequenceEvents, [
23
+ previousHash,
24
+ actionDataHash,
25
+ ]);
26
+ }
27
+ }
28
+ export class MinaEvents {
29
+ static eventHash(event, previousHash = emptyEvents()) {
30
+ const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, event);
31
+ return hashWithPrefix(MINA_EVENT_PREFIXES.events, [
32
+ previousHash,
33
+ actionDataHash,
34
+ ]);
35
+ }
36
+ }
37
+ export class MinaPrefixedProvableHashList extends ProvableHashList {
38
+ constructor(valueType, prefix, internalCommitment = Field(0)) {
39
+ super(valueType, internalCommitment);
40
+ this.prefix = prefix;
41
+ }
42
+ hash(elements) {
43
+ const init = salt(this.prefix);
44
+ const digest = Poseidon.update(init, elements);
45
+ return digest[0];
46
+ }
47
+ }
48
+ export class MinaActionsHashList extends MinaPrefixedProvableHashList {
49
+ constructor(internalCommitment = Field(0)) {
50
+ super(Field, MINA_EVENT_PREFIXES.sequenceEvents, internalCommitment);
51
+ }
52
+ }
53
+ //# sourceMappingURL=MinaPrefixedProvableHashList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"MinaPrefixedProvableHashList.js","sourceRoot":"","sources":["../../src/utils/MinaPrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAgB,MAAM,MAAM,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElE,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,SAAS,IAAI,CAAC,MAAc;IAC1B,yEAAyE;IACzE,OAAO,QAAQ,CAAC,MAAM,CACpB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAC9B,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CACC,CAAC;AAC7B,CAAC;AAED,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,KAAK,EAAE,sBAAsB;IAC7B,MAAM,EAAE,sBAAsB;IAC9B,cAAc,EAAE,sBAAsB;CAC9B,CAAC;AAEX,MAAM,UAAU,YAAY;IAC1B,OAAO,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,WAAW;IACzB,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,CAAC;AACzC,CAAC;AAED,MAAM,OAAO,WAAW;IACtB,MAAM,CAAC,UAAU,CACf,MAAe,EACf,eAAsB,YAAY,EAAE;QAEpC,MAAM,cAAc,GAAG,cAAc,CAAC,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QACzE,OAAO,cAAc,CAAC,mBAAmB,CAAC,cAAc,EAAE;YACxD,YAAY;YACZ,cAAc;SACf,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,OAAO,UAAU;IACrB,MAAM,CAAC,SAAS,CAAC,KAAc,EAAE,eAAsB,WAAW,EAAE;QAClE,MAAM,cAAc,GAAG,cAAc,CAAC,mBAAmB,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxE,OAAO,cAAc,CAAC,mBAAmB,CAAC,MAAM,EAAE;YAChD,YAAY;YACZ,cAAc;SACf,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,OAAO,4BAEX,SAAQ,gBAAuB;IAC/B,YACE,SAA8B,EACd,MAAc,EAC9B,qBAA4B,KAAK,CAAC,CAAC,CAAC;QAEpC,KAAK,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QAHrB,WAAM,GAAN,MAAM,CAAQ;IAIhC,CAAC;IAES,IAAI,CAAC,QAAiB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC/C,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAO,mBAAoB,SAAQ,4BAAmC;IAC1E,YAAmB,qBAA4B,KAAK,CAAC,CAAC,CAAC;QACrD,KAAK,CAAC,KAAK,EAAE,mBAAmB,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IACvE,CAAC;CACF"}
@@ -0,0 +1,8 @@
1
+ import { Field, ProvablePure } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList.js";
3
+ export declare class PrefixedProvableHashList<Value> extends ProvableHashList<Value> {
4
+ private readonly prefix;
5
+ constructor(valueType: ProvablePure<Value>, prefix: string, internalCommitment?: Field);
6
+ protected hash(elements: Field[]): Field;
7
+ }
8
+ //# sourceMappingURL=PrefixedProvableHashList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrefixedProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/PrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,YAAY,EAAY,MAAM,MAAM,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAGzD,qBAAa,wBAAwB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IAC1E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAG7B,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,EAC9B,MAAM,EAAE,MAAM,EACd,kBAAkB,GAAE,KAAgB;IAMtC,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGzC"}
@@ -0,0 +1,13 @@
1
+ import { Field, Poseidon } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList.js";
3
+ import { stringToField } from "./utils";
4
+ export class PrefixedProvableHashList extends ProvableHashList {
5
+ constructor(valueType, prefix, internalCommitment = Field(0)) {
6
+ super(valueType, internalCommitment);
7
+ this.prefix = stringToField(prefix);
8
+ }
9
+ hash(elements) {
10
+ return Poseidon.hash([this.prefix, ...elements]);
11
+ }
12
+ }
13
+ //# sourceMappingURL=PrefixedProvableHashList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PrefixedProvableHashList.js","sourceRoot":"","sources":["../../src/utils/PrefixedProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAgB,QAAQ,EAAE,MAAM,MAAM,CAAC;AAErD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,MAAM,OAAO,wBAAgC,SAAQ,gBAAuB;IAG1E,YACE,SAA8B,EAC9B,MAAc,EACd,qBAA4B,KAAK,CAAC,CAAC,CAAC;QAEpC,KAAK,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IAES,IAAI,CAAC,QAAiB;QAC9B,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,27 @@
1
+ import { Field, Bool, ProvablePure } from "o1js";
2
+ /**
3
+ * Utilities for creating a hash list from a given value type.
4
+ */
5
+ export declare abstract class ProvableHashList<Value> {
6
+ protected readonly valueType: ProvablePure<Value>;
7
+ commitment: Field;
8
+ constructor(valueType: ProvablePure<Value>, commitment?: Field);
9
+ protected abstract hash(elements: Field[]): Field;
10
+ /**
11
+ * Converts the provided value to Field[] and appends it to
12
+ * the current hashlist.
13
+ *
14
+ * @param value - Value to be appended to the hash list
15
+ * @returns Current hash list.
16
+ */
17
+ push(value: Value): this;
18
+ pushIf(value: Value, condition: Bool): this;
19
+ /**
20
+ * @returns Traling hash of the current hashlist.
21
+ */
22
+ toField(): import("o1js/dist/node/lib/provable/field").Field;
23
+ }
24
+ export declare class DefaultProvableHashList<Value> extends ProvableHashList<Value> {
25
+ hash(elements: Field[]): Field;
26
+ }
27
+ //# sourceMappingURL=ProvableHashList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvableHashList.d.ts","sourceRoot":"","sources":["../../src/utils/ProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAY,IAAI,EAAY,YAAY,EAAE,MAAM,MAAM,CAAC;AAErE;;GAEG;AACH,8BAAsB,gBAAgB,CAAC,KAAK;IAExC,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC;IAC1C,UAAU,EAAE,KAAK;gBADL,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,EAC1C,UAAU,GAAE,KAAgB;IAGrC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;IAEjD;;;;;;OAMG;IACI,IAAI,CAAC,KAAK,EAAE,KAAK;IAQjB,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;IAS3C;;OAEG;IACI,OAAO;CAGf;AAED,qBAAa,uBAAuB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IAClE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGtC"}
@@ -0,0 +1,44 @@
1
+ import { Field, Poseidon, Provable } from "o1js";
2
+ /**
3
+ * Utilities for creating a hash list from a given value type.
4
+ */
5
+ export class ProvableHashList {
6
+ constructor(valueType, commitment = Field(0)) {
7
+ this.valueType = valueType;
8
+ this.commitment = commitment;
9
+ }
10
+ /**
11
+ * Converts the provided value to Field[] and appends it to
12
+ * the current hashlist.
13
+ *
14
+ * @param value - Value to be appended to the hash list
15
+ * @returns Current hash list.
16
+ */
17
+ push(value) {
18
+ this.commitment = this.hash([
19
+ this.commitment,
20
+ ...this.valueType.toFields(value),
21
+ ]);
22
+ return this;
23
+ }
24
+ pushIf(value, condition) {
25
+ const newCommitment = this.hash([
26
+ this.commitment,
27
+ ...this.valueType.toFields(value),
28
+ ]);
29
+ this.commitment = Provable.if(condition, newCommitment, this.commitment);
30
+ return this;
31
+ }
32
+ /**
33
+ * @returns Traling hash of the current hashlist.
34
+ */
35
+ toField() {
36
+ return this.commitment;
37
+ }
38
+ }
39
+ export class DefaultProvableHashList extends ProvableHashList {
40
+ hash(elements) {
41
+ return Poseidon.hash(elements);
42
+ }
43
+ }
44
+ //# sourceMappingURL=ProvableHashList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvableHashList.js","sourceRoot":"","sources":["../../src/utils/ProvableHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAQ,QAAQ,EAAgB,MAAM,MAAM,CAAC;AAErE;;GAEG;AACH,MAAM,OAAgB,gBAAgB;IACpC,YACqB,SAA8B,EAC1C,aAAoB,KAAK,CAAC,CAAC,CAAC;QADhB,cAAS,GAAT,SAAS,CAAqB;QAC1C,eAAU,GAAV,UAAU,CAAkB;IAClC,CAAC;IAIJ;;;;;;OAMG;IACI,IAAI,CAAC,KAAY;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC;YAC1B,IAAI,CAAC,UAAU;YACf,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;SAClC,CAAC,CAAC;QACH,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,MAAM,CAAC,KAAY,EAAE,SAAe;QACzC,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,UAAU;YACf,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC;SAClC,CAAC,CAAC;QACH,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;QACzE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;OAEG;IACI,OAAO;QACZ,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;CACF;AAED,MAAM,OAAO,uBAA+B,SAAQ,gBAAuB;IAClE,IAAI,CAAC,QAAiB;QAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,14 @@
1
+ import { Bool, Field } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList";
3
+ export declare class ProvableReductionHashList<Value> extends ProvableHashList<Value> {
4
+ unconstrainedList: Value[];
5
+ private constrainedLastValue;
6
+ private preimage;
7
+ pushAndReduce(value: Value, reduce: (previous: Value) => [Value, Bool]): {
8
+ popLast: Bool;
9
+ value: Value;
10
+ };
11
+ pushIf(value: Value, condition: Bool): this;
12
+ hash(elements: Field[]): Field;
13
+ }
14
+ //# sourceMappingURL=ProvableReductionHashList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvableReductionHashList.d.ts","sourceRoot":"","sources":["../../src/utils/ProvableReductionHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAsB,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,qBAAa,yBAAyB,CAAC,KAAK,CAAE,SAAQ,gBAAgB,CAAC,KAAK,CAAC;IACpE,iBAAiB,EAAE,KAAK,EAAE,CAAM;IAEvC,OAAO,CAAC,oBAAoB,CAAgC;IAE5D,OAAO,CAAC,QAAQ,CAA0B;IAEnC,aAAa,CAClB,KAAK,EAAE,KAAK,EACZ,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,GACzC;QAAE,OAAO,EAAE,IAAI,CAAC;QAAC,KAAK,EAAE,KAAK,CAAA;KAAE;IA4C3B,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI;IAMpC,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,GAAG,KAAK;CAGtC"}
@@ -0,0 +1,51 @@
1
+ import { Bool, Poseidon, Provable } from "o1js";
2
+ import { ProvableHashList } from "./ProvableHashList";
3
+ export class ProvableReductionHashList extends ProvableHashList {
4
+ constructor() {
5
+ super(...arguments);
6
+ this.unconstrainedList = [];
7
+ this.constrainedLastValue = undefined;
8
+ this.preimage = this.commitment;
9
+ }
10
+ pushAndReduce(value, reduce) {
11
+ let valueToPush = value;
12
+ let popLast = Bool(false);
13
+ // Theoretically, we can feed the preimage + last value as a witness
14
+ // for non-zero commitment starts (like used in the BlockProver), because
15
+ // currently it won't reduce across chunks. But this is okay for now I think
16
+ if (this.constrainedLastValue !== undefined) {
17
+ [valueToPush, popLast] = reduce(this.constrainedLastValue);
18
+ }
19
+ Provable.asProver(() => {
20
+ if (popLast.toBoolean()) {
21
+ this.unconstrainedList.pop();
22
+ }
23
+ const valueAsConstant = this.valueType.fromFields(this.valueType.toFields(valueToPush).map((field) => field.toConstant()));
24
+ this.unconstrainedList.push(valueAsConstant);
25
+ });
26
+ const currentCommitment = this.commitment;
27
+ const noPopCommitment = this.hash([
28
+ currentCommitment,
29
+ ...this.valueType.toFields(valueToPush),
30
+ ]);
31
+ const popCommitment = this.hash([
32
+ this.preimage,
33
+ ...this.valueType.toFields(valueToPush),
34
+ ]);
35
+ this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
36
+ this.constrainedLastValue = valueToPush;
37
+ this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
38
+ return {
39
+ popLast,
40
+ value: valueToPush,
41
+ };
42
+ }
43
+ pushIf(value, condition) {
44
+ throw new Error("pushIf is not implemented for ReducedHashList");
45
+ return this;
46
+ }
47
+ hash(elements) {
48
+ return Poseidon.hash(elements);
49
+ }
50
+ }
51
+ //# sourceMappingURL=ProvableReductionHashList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvableReductionHashList.js","sourceRoot":"","sources":["../../src/utils/ProvableReductionHashList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAS,QAAQ,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,OAAO,yBAAiC,SAAQ,gBAAuB;IAA7E;;QACS,sBAAiB,GAAY,EAAE,CAAC;QAE/B,yBAAoB,GAAsB,SAAS,CAAC;QAEpD,aAAQ,GAAU,IAAI,CAAC,UAAU,CAAC;IA0D5C,CAAC;IAxDQ,aAAa,CAClB,KAAY,EACZ,MAA0C;QAE1C,IAAI,WAAW,GAAG,KAAK,CAAC;QACxB,IAAI,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;QAE1B,oEAAoE;QACpE,yEAAyE;QACzE,4EAA4E;QAC5E,IAAI,IAAI,CAAC,oBAAoB,KAAK,SAAS,EAAE;YAC3C,CAAC,WAAW,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;SAC5D;QAED,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE;YACrB,IAAI,OAAO,CAAC,SAAS,EAAE,EAAE;gBACvB,IAAI,CAAC,iBAAiB,CAAC,GAAG,EAAE,CAAC;aAC9B;YAED,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAC/C,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,CACxE,CAAC;YACF,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;QAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU,CAAC;QAC1C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC;YAChC,iBAAiB;YACjB,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;SACxC,CAAC,CAAC;QAEH,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC;YAC9B,IAAI,CAAC,QAAQ;YACb,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC;SACxC,CAAC,CAAC;QAEH,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,eAAe,CAAC,CAAC;QAEvE,IAAI,CAAC,oBAAoB,GAAG,WAAW,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,EAAE,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;QAEvE,OAAO;YACL,OAAO;YACP,KAAK,EAAE,WAAW;SACnB,CAAC;IACJ,CAAC;IAEM,MAAM,CAAC,KAAY,EAAE,SAAe;QACzC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QAEjE,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,IAAI,CAAC,QAAiB;QAC3B,OAAO,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjC,CAAC;CACF"}
@@ -0,0 +1,11 @@
1
+ import { ProvableStateTransition, StateTransition } from "../model/StateTransition";
2
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
3
+ export declare class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
4
+ push(value: ProvableStateTransition): this;
5
+ pushWithMetadata(value: ProvableStateTransition): {
6
+ popLast: import("o1js/dist/node/lib/provable/bool").Bool;
7
+ value: ProvableStateTransition;
8
+ };
9
+ }
10
+ export declare function reduceStateTransitions(transitions: StateTransition<unknown>[]): StateTransition<unknown>[];
11
+ //# sourceMappingURL=StateTransitionReductionList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionReductionList.d.ts","sourceRoot":"","sources":["../../src/utils/StateTransitionReductionList.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,uBAAuB,EACvB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,qBAAa,4BAA6B,SAAQ,yBAAyB,CAAC,uBAAuB,CAAC;IAC3F,IAAI,CAAC,KAAK,EAAE,uBAAuB;IAMnC,gBAAgB,CAAC,KAAK,EAAE,uBAAuB;;;;CAyCvD;AAED,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,eAAe,CAAC,OAAO,CAAC,EAAE,GACtC,eAAe,CAAC,OAAO,CAAC,EAAE,CA0B5B"}
@@ -0,0 +1,61 @@
1
+ import { Provable } from "o1js";
2
+ import { ProvableOption } from "../model/Option";
3
+ import { ProvableStateTransition, StateTransition, } from "../model/StateTransition";
4
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
5
+ export class StateTransitionReductionList extends ProvableReductionHashList {
6
+ push(value) {
7
+ this.pushWithMetadata(value);
8
+ return this;
9
+ }
10
+ pushWithMetadata(value) {
11
+ return this.pushAndReduce(value, (previous) => {
12
+ const pathsMatch = previous.path.equals(value.path);
13
+ // Take the previous.from if the paths match, otherwise leave ST as is
14
+ const from = Provable.if(pathsMatch, ProvableOption, previous.from, value.from);
15
+ // In case we have a layout like
16
+ // { from: 5, to: 10 }, { from: 10, to: none }
17
+ // we just take the first and discard the second
18
+ const to = Provable.if(value.to.isSome.or(pathsMatch.not()), ProvableOption, value.to, previous.to);
19
+ const transition = new ProvableStateTransition({
20
+ path: value.path,
21
+ from: new ProvableOption(from),
22
+ to: new ProvableOption(to),
23
+ });
24
+ // Assert that connection is correct
25
+ previous.to.value
26
+ .equals(value.from.value)
27
+ .or(previous.to.isSome
28
+ .not()
29
+ .and(previous.from.value.equals(value.from.value)))
30
+ .or(pathsMatch.not())
31
+ .assertTrue();
32
+ return [transition, pathsMatch];
33
+ });
34
+ }
35
+ }
36
+ export function reduceStateTransitions(transitions) {
37
+ const reduced = [];
38
+ transitions.forEach((st) => {
39
+ if (reduced.length === 0) {
40
+ reduced.push(st);
41
+ return;
42
+ }
43
+ const last = reduced.at(-1);
44
+ if (last.path.equals(st.path).toBoolean()) {
45
+ if (st.toValue.isSome.toBoolean()) {
46
+ reduced.pop();
47
+ reduced.push(new StateTransition(st.path, last.fromValue, st.toValue));
48
+ }
49
+ else {
50
+ // Do nothing, because we discard that ST
51
+ // { from: 5, to: 10 }, { from: 10, to: none }
52
+ // cancel the 2nd
53
+ }
54
+ }
55
+ else {
56
+ reduced.push(st);
57
+ }
58
+ });
59
+ return reduced;
60
+ }
61
+ //# sourceMappingURL=StateTransitionReductionList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StateTransitionReductionList.js","sourceRoot":"","sources":["../../src/utils/StateTransitionReductionList.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EACL,uBAAuB,EACvB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,yBAAyB,EAAE,MAAM,6BAA6B,CAAC;AAExE,MAAM,OAAO,4BAA6B,SAAQ,yBAAkD;IAC3F,IAAI,CAAC,KAA8B;QACxC,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QAE7B,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,gBAAgB,CAAC,KAA8B;QACpD,OAAO,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,CAAC,QAAiC,EAAE,EAAE;YACrE,MAAM,UAAU,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAEpD,sEAAsE;YACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,CACtB,UAAU,EACV,cAAc,EACd,QAAQ,CAAC,IAAI,EACb,KAAK,CAAC,IAAI,CACX,CAAC;YACF,gCAAgC;YAChC,8CAA8C;YAC9C,gDAAgD;YAChD,MAAM,EAAE,GAAG,QAAQ,CAAC,EAAE,CACpB,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,EACpC,cAAc,EACd,KAAK,CAAC,EAAE,EACR,QAAQ,CAAC,EAAE,CACZ,CAAC;YAEF,MAAM,UAAU,GAAG,IAAI,uBAAuB,CAAC;gBAC7C,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,IAAI,cAAc,CAAC,IAAI,CAAC;gBAC9B,EAAE,EAAE,IAAI,cAAc,CAAC,EAAE,CAAC;aAC3B,CAAC,CAAC;YAEH,oCAAoC;YACpC,QAAQ,CAAC,EAAE,CAAC,KAAK;iBACd,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC;iBACxB,EAAE,CACD,QAAQ,CAAC,EAAE,CAAC,MAAM;iBACf,GAAG,EAAE;iBACL,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CACrD;iBACA,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;iBACpB,UAAU,EAAE,CAAC;YAEhB,OAAO,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAClC,CAAC,CAAC,CAAC;IACL,CAAC;CACF;AAED,MAAM,UAAU,sBAAsB,CACpC,WAAuC;IAEvC,MAAM,OAAO,GAA+B,EAAE,CAAC;IAE/C,WAAW,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,EAAE;QACzB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE;YACxB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACjB,OAAO;SACR;QAED,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC;QAC7B,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YACzC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE;gBACjC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACd,OAAO,CAAC,IAAI,CACV,IAAI,eAAe,CAAU,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,CAAC,OAAO,CAAC,CAClE,CAAC;aACH;iBAAM;gBACL,yCAAyC;gBACzC,8CAA8C;gBAC9C,iBAAiB;aAClB;SACF;aAAM;YACL,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAClB;IACH,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { Field } from "o1js";
2
+ export type ReturnType<FunctionType extends Function> = FunctionType extends (...args: any[]) => infer Return ? Return : any;
3
+ export type Subclass<Class extends new (...args: any) => any> = (new (...args: any) => InstanceType<Class>) & {
4
+ [Key in keyof Class]: Class[Key];
5
+ } & {
6
+ prototype: InstanceType<Class>;
7
+ };
8
+ export declare function notInCircuit(): MethodDecorator;
9
+ export declare function stringToField(value: string): import("o1js/dist/node/lib/provable/field").Field;
10
+ export declare function singleFieldToString(value: Field | bigint): string;
11
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAsB,MAAM,MAAM,CAAC;AAGjD,MAAM,MAAM,UAAU,CAAC,YAAY,SAAS,QAAQ,IAAI,YAAY,SAAS,CAC3E,GAAG,IAAI,EAAE,GAAG,EAAE,KACX,MAAM,MAAM,GACb,MAAM,GACN,GAAG,CAAC;AAER,MAAM,MAAM,QAAQ,CAAC,KAAK,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,IAAI,CAAC,KAC/D,GAAG,IAAI,EAAE,GAAG,KACT,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG;KACzB,GAAG,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC;CACjC,GAAG;IAAE,SAAS,EAAE,YAAY,CAAC,KAAK,CAAC,CAAA;CAAE,CAAC;AAEvC,wBAAgB,YAAY,IAAI,eAAe,CAkB9C;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,qDA+B1C;AAED,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,MAAM,GAAG,MAAM,CAMjE"}
@@ -0,0 +1,45 @@
1
+ import { Field, Poseidon, Provable } from "o1js";
2
+ import floor from "lodash/floor";
3
+ export function notInCircuit() {
4
+ return function ReplacedFunction(target, propertyKey, descriptor) {
5
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
6
+ const childFunction = descriptor.value;
7
+ descriptor.value = function value(...args) {
8
+ if (Provable.inCheckedComputation() || Provable.inProver()) {
9
+ throw new Error(`Method ${propertyKey.toString()} is supposed to be only called outside of the circuit`);
10
+ }
11
+ return childFunction.apply(this, args);
12
+ };
13
+ return descriptor;
14
+ };
15
+ }
16
+ export function stringToField(value) {
17
+ const fieldSize = Field.sizeInBytes - 1;
18
+ // Encode string as byte[]
19
+ const encoder = new TextEncoder();
20
+ const stringBytes = Array.from(encoder.encode(value));
21
+ // Add padding in case the string is not a multiple of Field.sizeInBytes
22
+ const padding = Array.from({
23
+ length: fieldSize - (stringBytes.length % fieldSize),
24
+ }).fill(0);
25
+ const data = stringBytes.concat(padding).reverse();
26
+ // Hash the result Field[] to reduce it to
27
+ const chunks = data.reduce((a, b, index) => {
28
+ const arrayIndex = floor(index / fieldSize);
29
+ a[arrayIndex].push(b);
30
+ return a;
31
+ }, Array.from({ length: floor(data.length / fieldSize) }).map(() => []));
32
+ const fields = chunks.map((x) =>
33
+ // We have to add a zero at the highest byte here, because a Field is
34
+ // a bit smaller than 2^256
35
+ Field.fromBytes(x.concat([0])));
36
+ return Poseidon.hash(fields);
37
+ }
38
+ export function singleFieldToString(value) {
39
+ let fieldValue = value;
40
+ if (typeof value === "bigint") {
41
+ fieldValue = Field(value);
42
+ }
43
+ return fieldValue.toString();
44
+ }
45
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AACjD,OAAO,KAAK,MAAM,cAAc,CAAC;AAcjC,MAAM,UAAU,YAAY;IAC1B,OAAO,SAAS,gBAAgB,CAC9B,MAAW,EACX,WAA4B,EAC5B,UAA8B;QAE9B,mEAAmE;QACnE,MAAM,aAAa,GAAG,UAAU,CAAC,KAAK,CAAC;QACvC,UAAU,CAAC,KAAK,GAAG,SAAS,KAAK,CAAY,GAAG,IAAW;YACzD,IAAI,QAAQ,CAAC,oBAAoB,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE,EAAE;gBAC1D,MAAM,IAAI,KAAK,CACb,UAAU,WAAW,CAAC,QAAQ,EAAE,uDAAuD,CACxF,CAAC;aACH;YACD,OAAO,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,CAAC,CAAC;QACF,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAa;IACzC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,GAAG,CAAC,CAAC;IAExC,0BAA0B;IAC1B,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtD,wEAAwE;IACxE,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAS;QACjC,MAAM,EAAE,SAAS,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,SAAS,CAAC;KACrD,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACX,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;IAEnD,0CAA0C;IAC1C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CACxB,CAAC,CAAC,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE;QACd,MAAM,UAAU,GAAG,KAAK,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC;QAC5C,CAAC,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,OAAO,CAAC,CAAC;IACX,CAAC,EAED,KAAK,CAAC,IAAI,CAAW,EAAE,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC,GAAG,CAClE,GAAG,EAAE,CAAC,EAAE,CACT,CACF,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;IAC9B,qEAAqE;IACrE,2BAA2B;IAC3B,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC/B,CAAC;IACF,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,KAAqB;IACvD,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC7B,UAAU,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;KAC3B;IACD,OAAO,UAAU,CAAC,QAAQ,EAAE,CAAC;AAC/B,CAAC"}
@@ -0,0 +1,12 @@
1
+ // @ts-ignore
2
+ const config = require("../../jest.config.cjs");
3
+
4
+ module.exports = {
5
+ ...config,
6
+ collectCoverageFrom: [
7
+ "packages/protocol/src/**",
8
+ "!**/node_modules/**",
9
+ "!**/dist/**",
10
+ ],
11
+ coverageDirectory: "coverage/protocol",
12
+ };
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@proto-kit/protocol",
3
+ "license": "MIT",
4
+ "private": false,
5
+ "type": "module",
6
+ "version": "0.1.1-develop.0+19469b2",
7
+ "scripts": {
8
+ "build": "tsc -p tsconfig.json",
9
+ "dev": "tsc -p tsconfig.json --watch",
10
+ "lint": "eslint ./src ./test",
11
+ "test:file": "node --experimental-vm-modules --experimental-wasm-modules ../../node_modules/jest/bin/jest.js",
12
+ "test": "npm run test:file -- ./test/**",
13
+ "test:watch": "npm run test:file -- ./test/** --watch"
14
+ },
15
+ "main": "dist/index.js",
16
+ "publishConfig": {
17
+ "access": "public"
18
+ },
19
+ "dependencies": {
20
+ "lodash": "^4.17.21",
21
+ "loglevel": "^1.8.1",
22
+ "reflect-metadata": "^0.1.13",
23
+ "ts-mixer": "^6.0.3"
24
+ },
25
+ "peerDependencies": {
26
+ "@proto-kit/common": "*",
27
+ "o1js": "^1.6.0",
28
+ "ts-pattern": "^4.3.0",
29
+ "tsyringe": "^4.7.0"
30
+ },
31
+ "devDependencies": {
32
+ "@jest/globals": "^29.5.0",
33
+ "@types/lodash": "^4.14.194"
34
+ },
35
+ "gitHead": "19469b285cd6953e6c621875d789959b521842c3"
36
+ }
@@ -0,0 +1,3 @@
1
+ export const constants = {
2
+ stateTransitionProverBatchSize: 4,
3
+ };
@@ -0,0 +1,48 @@
1
+ import { PublicKey, Struct, UInt64 } from "o1js";
2
+ import { injectable } from "tsyringe";
3
+
4
+ import { BlockProverExecutionData } from "../prover/block/BlockProvable";
5
+ import { StateMap } from "../state/StateMap";
6
+ import { protocolState } from "../state/protocol/ProtocolState";
7
+ import { ProvableTransactionHook } from "../protocol/ProvableTransactionHook";
8
+ import { assert } from "../state/assert/assert";
9
+
10
+ export class AccountState extends Struct({
11
+ nonce: UInt64,
12
+ }) {}
13
+
14
+ @injectable()
15
+ export class AccountStateHook extends ProvableTransactionHook {
16
+ @protocolState() public accountState = StateMap.from<PublicKey, AccountState>(
17
+ PublicKey,
18
+ AccountState
19
+ );
20
+
21
+ public async onTransaction({ transaction }: BlockProverExecutionData) {
22
+ const sender = transaction.sender.value;
23
+
24
+ const aso = await this.accountState.get(sender);
25
+
26
+ const accountState = aso.orElse(new AccountState({ nonce: UInt64.zero }));
27
+
28
+ const currentNonce = accountState.nonce;
29
+
30
+ // Either the nonce matches or the tx is a message, in which case we don't care
31
+ assert(
32
+ currentNonce
33
+ .equals(transaction.nonce.value)
34
+ .or(transaction.sender.isSome.not()),
35
+ () =>
36
+ `Nonce not matching: tx sent ${transaction.nonce.value.toString()}, onchain value is ${currentNonce.toString()}`
37
+ );
38
+
39
+ // Optimized version of transaction.sender.isSome ? currentNonce.add(1) : Field(0)
40
+ // Bcs Bool(true).toField() == 1
41
+ // TODO Think about if we want to rangecheck this. If not, we should store it as Field
42
+ const newNonce = UInt64.Unsafe.fromField(
43
+ currentNonce.value.add(1).mul(transaction.sender.isSome.toField())
44
+ );
45
+
46
+ await this.accountState.set(sender, new AccountState({ nonce: newNonce }));
47
+ }
48
+ }
@@ -0,0 +1,17 @@
1
+ import { NetworkState } from "../model/network/NetworkState";
2
+ import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
3
+
4
+ export class BlockHeightHook extends ProvableBlockHook<Record<string, never>> {
5
+ public async afterBlock(networkState: NetworkState): Promise<NetworkState> {
6
+ return new NetworkState({
7
+ block: {
8
+ height: networkState.block.height.add(1),
9
+ },
10
+ previous: networkState.previous,
11
+ });
12
+ }
13
+
14
+ public async beforeBlock(networkState: NetworkState): Promise<NetworkState> {
15
+ return networkState;
16
+ }
17
+ }
@@ -0,0 +1,26 @@
1
+ import { ProvableBlockHook } from "../protocol/ProvableBlockHook";
2
+ import { NetworkState } from "../model/network/NetworkState";
3
+ import { BlockProverState } from "../prover/block/BlockProver";
4
+
5
+ export class LastStateRootBlockHook extends ProvableBlockHook<
6
+ Record<string, never>
7
+ > {
8
+ public async afterBlock(
9
+ networkState: NetworkState,
10
+ state: BlockProverState
11
+ ): Promise<NetworkState> {
12
+ return new NetworkState({
13
+ block: networkState.block,
14
+ previous: {
15
+ rootHash: state.stateRoot,
16
+ },
17
+ });
18
+ }
19
+
20
+ public async beforeBlock(
21
+ networkState: NetworkState,
22
+ state: BlockProverState
23
+ ): Promise<NetworkState> {
24
+ return networkState;
25
+ }
26
+ }