@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,26 @@
1
+ import { StateTransition } from "../../model/StateTransition";
2
+
3
+ export class TransitionMethodExecutionResult {
4
+ public stateTransitions: StateTransition<any>[] = [];
5
+ }
6
+
7
+ export interface TransitionMethodExecutionContext {
8
+ /**
9
+ * Adds an in-method generated state transition to the current context
10
+ * @param stateTransition - State transition to add to the context
11
+ */
12
+ addStateTransition: <Value>(stateTransition: StateTransition<Value>) => void;
13
+
14
+ /**
15
+ * Manually clears/resets the execution context
16
+ */
17
+ clear: () => void;
18
+
19
+ /**
20
+ * Had to override current() otherwise it would not infer
21
+ * the type of result correctly (parent type would be reused)
22
+ */
23
+ current: () => {
24
+ result: TransitionMethodExecutionResult;
25
+ };
26
+ }
@@ -0,0 +1,61 @@
1
+ import { State } from "../State";
2
+ import { Path } from "../../model/Path";
3
+ import { TransitioningProtocolModule } from "../../protocol/TransitioningProtocolModule";
4
+
5
+ const errors = {
6
+ missingName: (className: string) =>
7
+ new Error(
8
+ `Unable to provide a unique identifier for state, ${className} is missing a name.
9
+ Did you forget to extend your block module with 'extends ...Hook'?`
10
+ ),
11
+
12
+ missingProtocol: (className: string) =>
13
+ new Error(
14
+ `Unable to provide 'procotol' for state, ${className} is missing a name.
15
+ Did you forget to extend your block module with 'extends ...Hook'?`
16
+ ),
17
+ };
18
+
19
+ /**
20
+ * Decorates a runtime module property as state, passing down some
21
+ * underlying values to improve developer experience.
22
+ */
23
+ export function protocolState() {
24
+ return <
25
+ TargetTransitioningModule extends TransitioningProtocolModule<unknown>,
26
+ >(
27
+ target: TargetTransitioningModule,
28
+ propertyKey: string
29
+ ) => {
30
+ let value: State<unknown> | undefined;
31
+
32
+ Object.defineProperty(target, propertyKey, {
33
+ enumerable: true,
34
+
35
+ get: function get() {
36
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
37
+ const self = this as TargetTransitioningModule;
38
+
39
+ if (self.name === undefined) {
40
+ throw errors.missingName(self.constructor.name);
41
+ }
42
+
43
+ if (!self.protocol) {
44
+ throw errors.missingProtocol(self.constructor.name);
45
+ }
46
+
47
+ // TODO Add Prefix?
48
+ const path = Path.fromProperty(self.name, propertyKey);
49
+ if (value) {
50
+ value.path = path;
51
+ value.stateServiceProvider = self.protocol.stateServiceProvider;
52
+ }
53
+ return value;
54
+ },
55
+
56
+ set: (newValue: State<unknown>) => {
57
+ value = newValue;
58
+ },
59
+ });
60
+ };
61
+ }
@@ -0,0 +1,73 @@
1
+ import { Field, Poseidon, ProvablePure } from "o1js";
2
+ import { hashWithPrefix, prefixToField } from "@proto-kit/common";
3
+
4
+ import { ProvableHashList } from "./ProvableHashList";
5
+
6
+ function salt(prefix: string) {
7
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
8
+ return Poseidon.update(
9
+ [Field(0), Field(0), Field(0)],
10
+ [prefixToField(prefix)]
11
+ ) as [Field, Field, Field];
12
+ }
13
+
14
+ export const MINA_EVENT_PREFIXES = {
15
+ event: "MinaZkappEvent******",
16
+ events: "MinaZkappEvents*****",
17
+ sequenceEvents: "MinaZkappSeqEvents**",
18
+ } as const;
19
+
20
+ export function emptyActions(): Field {
21
+ return salt("MinaZkappActionsEmpty")[0];
22
+ }
23
+
24
+ export function emptyEvents(): Field {
25
+ return salt("MinaZkappEventsEmpty")[0];
26
+ }
27
+
28
+ export class MinaActions {
29
+ static actionHash(
30
+ action: Field[],
31
+ previousHash: Field = emptyActions()
32
+ ): Field {
33
+ const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, action);
34
+ return hashWithPrefix(MINA_EVENT_PREFIXES.sequenceEvents, [
35
+ previousHash,
36
+ actionDataHash,
37
+ ]);
38
+ }
39
+ }
40
+
41
+ export class MinaEvents {
42
+ static eventHash(event: Field[], previousHash: Field = emptyEvents()): Field {
43
+ const actionDataHash = hashWithPrefix(MINA_EVENT_PREFIXES.event, event);
44
+ return hashWithPrefix(MINA_EVENT_PREFIXES.events, [
45
+ previousHash,
46
+ actionDataHash,
47
+ ]);
48
+ }
49
+ }
50
+
51
+ export class MinaPrefixedProvableHashList<
52
+ Value,
53
+ > extends ProvableHashList<Value> {
54
+ public constructor(
55
+ valueType: ProvablePure<Value>,
56
+ public readonly prefix: string,
57
+ internalCommitment: Field = Field(0)
58
+ ) {
59
+ super(valueType, internalCommitment);
60
+ }
61
+
62
+ protected hash(elements: Field[]): Field {
63
+ const init = salt(this.prefix);
64
+ const digest = Poseidon.update(init, elements);
65
+ return digest[0];
66
+ }
67
+ }
68
+
69
+ export class MinaActionsHashList extends MinaPrefixedProvableHashList<Field> {
70
+ public constructor(internalCommitment: Field = Field(0)) {
71
+ super(Field, MINA_EVENT_PREFIXES.sequenceEvents, internalCommitment);
72
+ }
73
+ }
@@ -0,0 +1,21 @@
1
+ import { Field, ProvablePure, Poseidon } from "o1js";
2
+
3
+ import { ProvableHashList } from "./ProvableHashList.js";
4
+ import { stringToField } from "./utils";
5
+
6
+ export class PrefixedProvableHashList<Value> extends ProvableHashList<Value> {
7
+ private readonly prefix: Field;
8
+
9
+ public constructor(
10
+ valueType: ProvablePure<Value>,
11
+ prefix: string,
12
+ internalCommitment: Field = Field(0)
13
+ ) {
14
+ super(valueType, internalCommitment);
15
+ this.prefix = stringToField(prefix);
16
+ }
17
+
18
+ protected hash(elements: Field[]): Field {
19
+ return Poseidon.hash([this.prefix, ...elements]);
20
+ }
21
+ }
@@ -0,0 +1,50 @@
1
+ import { Field, Poseidon, Bool, Provable, ProvablePure } from "o1js";
2
+
3
+ /**
4
+ * Utilities for creating a hash list from a given value type.
5
+ */
6
+ export abstract class ProvableHashList<Value> {
7
+ public constructor(
8
+ protected readonly valueType: ProvablePure<Value>,
9
+ public commitment: Field = Field(0)
10
+ ) {}
11
+
12
+ protected abstract hash(elements: Field[]): Field;
13
+
14
+ /**
15
+ * Converts the provided value to Field[] and appends it to
16
+ * the current hashlist.
17
+ *
18
+ * @param value - Value to be appended to the hash list
19
+ * @returns Current hash list.
20
+ */
21
+ public push(value: Value) {
22
+ this.commitment = this.hash([
23
+ this.commitment,
24
+ ...this.valueType.toFields(value),
25
+ ]);
26
+ return this;
27
+ }
28
+
29
+ public pushIf(value: Value, condition: Bool) {
30
+ const newCommitment = this.hash([
31
+ this.commitment,
32
+ ...this.valueType.toFields(value),
33
+ ]);
34
+ this.commitment = Provable.if(condition, newCommitment, this.commitment);
35
+ return this;
36
+ }
37
+
38
+ /**
39
+ * @returns Traling hash of the current hashlist.
40
+ */
41
+ public toField() {
42
+ return this.commitment;
43
+ }
44
+ }
45
+
46
+ export class DefaultProvableHashList<Value> extends ProvableHashList<Value> {
47
+ public hash(elements: Field[]): Field {
48
+ return Poseidon.hash(elements);
49
+ }
50
+ }
@@ -0,0 +1,68 @@
1
+ import { Bool, Field, Poseidon, Provable } from "o1js";
2
+
3
+ import { ProvableHashList } from "./ProvableHashList";
4
+
5
+ export class ProvableReductionHashList<Value> extends ProvableHashList<Value> {
6
+ public unconstrainedList: Value[] = [];
7
+
8
+ private constrainedLastValue: Value | undefined = undefined;
9
+
10
+ private preimage: Field = this.commitment;
11
+
12
+ public pushAndReduce(
13
+ value: Value,
14
+ reduce: (previous: Value) => [Value, Bool]
15
+ ): { popLast: Bool; value: Value } {
16
+ let valueToPush = value;
17
+ let popLast = Bool(false);
18
+
19
+ // Theoretically, we can feed the preimage + last value as a witness
20
+ // for non-zero commitment starts (like used in the BlockProver), because
21
+ // currently it won't reduce across chunks. But this is okay for now I think
22
+ if (this.constrainedLastValue !== undefined) {
23
+ [valueToPush, popLast] = reduce(this.constrainedLastValue);
24
+ }
25
+
26
+ Provable.asProver(() => {
27
+ if (popLast.toBoolean()) {
28
+ this.unconstrainedList.pop();
29
+ }
30
+
31
+ const valueAsConstant = this.valueType.fromFields(
32
+ this.valueType.toFields(valueToPush).map((field) => field.toConstant())
33
+ );
34
+ this.unconstrainedList.push(valueAsConstant);
35
+ });
36
+
37
+ const currentCommitment = this.commitment;
38
+ const noPopCommitment = this.hash([
39
+ currentCommitment,
40
+ ...this.valueType.toFields(valueToPush),
41
+ ]);
42
+
43
+ const popCommitment = this.hash([
44
+ this.preimage,
45
+ ...this.valueType.toFields(valueToPush),
46
+ ]);
47
+
48
+ this.commitment = Provable.if(popLast, popCommitment, noPopCommitment);
49
+
50
+ this.constrainedLastValue = valueToPush;
51
+ this.preimage = Provable.if(popLast, this.preimage, currentCommitment);
52
+
53
+ return {
54
+ popLast,
55
+ value: valueToPush,
56
+ };
57
+ }
58
+
59
+ public pushIf(value: Value, condition: Bool) {
60
+ throw new Error("pushIf is not implemented for ReducedHashList");
61
+
62
+ return this;
63
+ }
64
+
65
+ public hash(elements: Field[]): Field {
66
+ return Poseidon.hash(elements);
67
+ }
68
+ }
@@ -0,0 +1,89 @@
1
+ import { Provable } from "o1js";
2
+
3
+ import { ProvableOption } from "../model/Option";
4
+ import {
5
+ ProvableStateTransition,
6
+ StateTransition,
7
+ } from "../model/StateTransition";
8
+
9
+ import { ProvableReductionHashList } from "./ProvableReductionHashList";
10
+
11
+ export class StateTransitionReductionList extends ProvableReductionHashList<ProvableStateTransition> {
12
+ public push(value: ProvableStateTransition) {
13
+ this.pushWithMetadata(value);
14
+
15
+ return this;
16
+ }
17
+
18
+ public pushWithMetadata(value: ProvableStateTransition) {
19
+ return this.pushAndReduce(value, (previous: ProvableStateTransition) => {
20
+ const pathsMatch = previous.path.equals(value.path);
21
+
22
+ // Take the previous.from if the paths match, otherwise leave ST as is
23
+ const from = Provable.if(
24
+ pathsMatch,
25
+ ProvableOption,
26
+ previous.from,
27
+ value.from
28
+ );
29
+ // In case we have a layout like
30
+ // { from: 5, to: 10 }, { from: 10, to: none }
31
+ // we just take the first and discard the second
32
+ const to = Provable.if(
33
+ value.to.isSome.or(pathsMatch.not()),
34
+ ProvableOption,
35
+ value.to,
36
+ previous.to
37
+ );
38
+
39
+ const transition = new ProvableStateTransition({
40
+ path: value.path,
41
+ from: new ProvableOption(from),
42
+ to: new ProvableOption(to),
43
+ });
44
+
45
+ // Assert that connection is correct
46
+ previous.to.value
47
+ .equals(value.from.value)
48
+ .or(
49
+ previous.to.isSome
50
+ .not()
51
+ .and(previous.from.value.equals(value.from.value))
52
+ )
53
+ .or(pathsMatch.not())
54
+ .assertTrue();
55
+
56
+ return [transition, pathsMatch];
57
+ });
58
+ }
59
+ }
60
+
61
+ export function reduceStateTransitions(
62
+ transitions: StateTransition<unknown>[]
63
+ ): StateTransition<unknown>[] {
64
+ const reduced: StateTransition<unknown>[] = [];
65
+
66
+ transitions.forEach((st) => {
67
+ if (reduced.length === 0) {
68
+ reduced.push(st);
69
+ return;
70
+ }
71
+
72
+ const last = reduced.at(-1)!;
73
+ if (last.path.equals(st.path).toBoolean()) {
74
+ if (st.toValue.isSome.toBoolean()) {
75
+ reduced.pop();
76
+ reduced.push(
77
+ new StateTransition<unknown>(st.path, last.fromValue, st.toValue)
78
+ );
79
+ } else {
80
+ // Do nothing, because we discard that ST
81
+ // { from: 5, to: 10 }, { from: 10, to: none }
82
+ // cancel the 2nd
83
+ }
84
+ } else {
85
+ reduced.push(st);
86
+ }
87
+ });
88
+ return reduced;
89
+ }
@@ -0,0 +1,75 @@
1
+ import { Field, Poseidon, Provable } from "o1js";
2
+ import floor from "lodash/floor";
3
+
4
+ export type ReturnType<FunctionType extends Function> = FunctionType extends (
5
+ ...args: any[]
6
+ ) => infer Return
7
+ ? Return
8
+ : any;
9
+
10
+ export type Subclass<Class extends new (...args: any) => any> = (new (
11
+ ...args: any
12
+ ) => InstanceType<Class>) & {
13
+ [Key in keyof Class]: Class[Key];
14
+ } & { prototype: InstanceType<Class> };
15
+
16
+ export function notInCircuit(): MethodDecorator {
17
+ return function ReplacedFunction(
18
+ target: any,
19
+ propertyKey: string | symbol,
20
+ descriptor: PropertyDescriptor
21
+ ) {
22
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
23
+ const childFunction = descriptor.value;
24
+ descriptor.value = function value(this: any, ...args: any[]) {
25
+ if (Provable.inCheckedComputation() || Provable.inProver()) {
26
+ throw new Error(
27
+ `Method ${propertyKey.toString()} is supposed to be only called outside of the circuit`
28
+ );
29
+ }
30
+ return childFunction.apply(this, args);
31
+ };
32
+ return descriptor;
33
+ };
34
+ }
35
+
36
+ export function stringToField(value: string) {
37
+ const fieldSize = Field.sizeInBytes - 1;
38
+
39
+ // Encode string as byte[]
40
+ const encoder = new TextEncoder();
41
+ const stringBytes = Array.from(encoder.encode(value));
42
+
43
+ // Add padding in case the string is not a multiple of Field.sizeInBytes
44
+ const padding = Array.from<number>({
45
+ length: fieldSize - (stringBytes.length % fieldSize),
46
+ }).fill(0);
47
+ const data = stringBytes.concat(padding).reverse();
48
+
49
+ // Hash the result Field[] to reduce it to
50
+ const chunks = data.reduce<number[][]>(
51
+ (a, b, index) => {
52
+ const arrayIndex = floor(index / fieldSize);
53
+ a[arrayIndex].push(b);
54
+ return a;
55
+ },
56
+
57
+ Array.from<number[]>({ length: floor(data.length / fieldSize) }).map(
58
+ () => []
59
+ )
60
+ );
61
+ const fields = chunks.map((x) =>
62
+ // We have to add a zero at the highest byte here, because a Field is
63
+ // a bit smaller than 2^256
64
+ Field.fromBytes(x.concat([0]))
65
+ );
66
+ return Poseidon.hash(fields);
67
+ }
68
+
69
+ export function singleFieldToString(value: Field | bigint): string {
70
+ let fieldValue = value;
71
+ if (typeof value === "bigint") {
72
+ fieldValue = Field(value);
73
+ }
74
+ return fieldValue.toString();
75
+ }
@@ -0,0 +1,212 @@
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ import {
3
+ AreProofsEnabled,
4
+ PlainZkProgram,
5
+ ZkProgrammable,
6
+ } from "@proto-kit/common";
7
+ import { Bool, Field, Proof, UInt64, ZkProgram } from "o1js";
8
+ import "reflect-metadata";
9
+
10
+ import {
11
+ MethodPublicOutput,
12
+ NetworkState,
13
+ SignedTransaction,
14
+ StateTransitionProverPublicInput,
15
+ StateTransitionProverPublicOutput,
16
+ } from "../src";
17
+
18
+ import { createAndInitTestingProtocol } from "./TestingProtocol";
19
+
20
+ type BlockProverProofPair = [
21
+ Proof<void, MethodPublicOutput>,
22
+ Proof<StateTransitionProverPublicInput, StateTransitionProverPublicOutput>,
23
+ ];
24
+
25
+ class MockAppChain implements AreProofsEnabled {
26
+ public areProofsEnabled: boolean = false;
27
+
28
+ setProofsEnabled(areProofsEnabled: boolean): void {
29
+ this.areProofsEnabled = areProofsEnabled;
30
+ }
31
+ }
32
+
33
+ class RuntimeZkProgrammable extends ZkProgrammable<
34
+ undefined,
35
+ MethodPublicOutput
36
+ > {
37
+ get areProofsEnabled(): AreProofsEnabled | undefined {
38
+ return new MockAppChain();
39
+ }
40
+
41
+ zkProgramFactory(): PlainZkProgram<undefined, MethodPublicOutput>[] {
42
+ const program = ZkProgram({
43
+ name: "BlockProverTestProgram",
44
+ publicOutput: MethodPublicOutput,
45
+ methods: {},
46
+ });
47
+
48
+ return [
49
+ {
50
+ name: program.name,
51
+ compile: program.compile.bind(program),
52
+ verify: program.verify.bind(program),
53
+ analyzeMethods: program.analyzeMethods.bind(program),
54
+ methods: {},
55
+ Proof: ZkProgram.Proof(program),
56
+ },
57
+ ];
58
+ }
59
+ }
60
+
61
+ describe("blockProver", () => {
62
+ const networkState = new NetworkState({
63
+ block: {
64
+ height: UInt64.zero,
65
+ },
66
+ previous: {
67
+ rootHash: Field(0),
68
+ },
69
+ });
70
+
71
+ const protocol = createAndInitTestingProtocol();
72
+
73
+ function generateTestProofs(
74
+ fromStateRoot: Field,
75
+ toStateRoot: Field,
76
+ toProtocolRoot: Field,
77
+ protocolHash: Field,
78
+ tx: SignedTransaction,
79
+ // eslint-disable-next-line @typescript-eslint/no-shadow
80
+ networkState: NetworkState
81
+ ): BlockProverProofPair {
82
+ const transactionHash = tx.transaction.hash();
83
+ const sthash = Field(123);
84
+
85
+ const appProof = new Proof<undefined, MethodPublicOutput>({
86
+ publicInput: undefined,
87
+ publicOutput: new MethodPublicOutput({
88
+ transactionHash,
89
+ stateTransitionsHash: sthash,
90
+ status: Bool(true),
91
+ networkStateHash: networkState.hash(),
92
+ isMessage: Bool(false),
93
+ eventsHash: Field(0),
94
+ }),
95
+
96
+ proof: "",
97
+ maxProofsVerified: 2,
98
+ });
99
+
100
+ const stProof = new Proof<
101
+ StateTransitionProverPublicInput,
102
+ StateTransitionProverPublicOutput
103
+ >({
104
+ publicInput: new StateTransitionProverPublicInput({
105
+ stateTransitionsHash: Field(0),
106
+ protocolTransitionsHash: Field(0),
107
+ stateRoot: fromStateRoot,
108
+ protocolStateRoot: fromStateRoot,
109
+ }),
110
+ publicOutput: new StateTransitionProverPublicOutput({
111
+ stateTransitionsHash: sthash,
112
+ protocolTransitionsHash: protocolHash,
113
+ stateRoot: toStateRoot,
114
+ protocolStateRoot: toProtocolRoot,
115
+ }),
116
+
117
+ proof: "",
118
+ maxProofsVerified: 2,
119
+ });
120
+
121
+ return [appProof, stProof];
122
+ }
123
+
124
+ it("dummy", () => {
125
+ expect(1).toBe(1);
126
+ });
127
+
128
+ // TODO
129
+ // it("previously applied transaction should also pass with derived publicInputs", () => {
130
+ // expect.assertions(2);
131
+ //
132
+ // const priv = PrivateKey.random();
133
+ //
134
+ // const tx = new UnsignedTransaction({
135
+ // methodId: Field(0),
136
+ // args: [Field(0)],
137
+ // nonce: UInt64.zero,
138
+ // sender: priv.toPublicKey(),
139
+ // })
140
+ // .sign(priv)
141
+ // .toProtocolTransaction();
142
+ //
143
+ // const executionData = {
144
+ // networkState,
145
+ // transaction: tx,
146
+ // };
147
+ //
148
+ // // const asmodule = protocol.resolve()
149
+ //
150
+ // protocol.dependencyContainer
151
+ // .resolveAll<ProvableBlockHook<unknown>>("ProvableBlockHook")
152
+ // .forEach((module) => {
153
+ // module.beforeBlock(executionData);
154
+ // });
155
+ //
156
+ // const hashList = new DefaultProvableHashList(ProvableStateTransition);
157
+ //
158
+ // container
159
+ // .resolve(ProtocolMethodExecutionContext)
160
+ // .current()
161
+ // .result.stateTransitions.map((x) => x.toProvable())
162
+ // .forEach((st) => {
163
+ // hashList.push(st);
164
+ // });
165
+ //
166
+ // const blockProver = protocol.resolve("BlockProver");
167
+ //
168
+ // const fromState = Field(1);
169
+ // const toState = Field(2);
170
+ //
171
+ // const [appProof, stProof] = generateTestProofs(
172
+ // fromState,
173
+ // toState,
174
+ // hashList.commitment,
175
+ // tx,
176
+ // networkState
177
+ // );
178
+ //
179
+ // const fromProverState: BlockProverState = {
180
+ // stateRoot: fromState,
181
+ // transactionsHash: Field(0),
182
+ // networkStateHash: networkState.hash(),
183
+ // };
184
+ //
185
+ // const toProverState = blockProver.applyTransaction(
186
+ // fromProverState,
187
+ // stProof,
188
+ // appProof,
189
+ // executionData
190
+ // );
191
+ //
192
+ // const publicInput = new BlockProverPublicInput({
193
+ // stateRoot: fromProverState.stateRoot,
194
+ // transactionsHash: fromProverState.transactionsHash,
195
+ // networkStateHash: networkState.hash(),
196
+ // });
197
+ //
198
+ // const publicOutput = blockProver.proveTransaction(
199
+ // publicInput,
200
+ // stProof,
201
+ // appProof,
202
+ // { networkState, transaction: tx }
203
+ // );
204
+ //
205
+ // expect(publicOutput.stateRoot).toStrictEqual(toProverState.stateRoot);
206
+ // expect(publicOutput.transactionsHash).toStrictEqual(
207
+ // toProverState.transactionsHash
208
+ // );
209
+ // });
210
+ });
211
+
212
+ /* eslint-enable */