@proto-kit/protocol 0.1.1-develop.165 → 0.1.1-develop.1665

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 (441) hide show
  1. package/dist/Constants.js +1 -0
  2. package/dist/Constants.js.map +1 -0
  3. package/dist/hashing/mina-prefixes.d.ts +10 -0
  4. package/dist/hashing/mina-prefixes.d.ts.map +1 -0
  5. package/dist/hashing/mina-prefixes.js +10 -0
  6. package/dist/hashing/mina-prefixes.js.map +1 -0
  7. package/dist/hashing/protokit-prefixes.d.ts +10 -0
  8. package/dist/hashing/protokit-prefixes.d.ts.map +1 -0
  9. package/dist/hashing/protokit-prefixes.js +24 -0
  10. package/dist/hashing/protokit-prefixes.js.map +1 -0
  11. package/dist/hooks/AccountStateHook.d.ts +52 -0
  12. package/dist/hooks/AccountStateHook.d.ts.map +1 -0
  13. package/dist/hooks/AccountStateHook.js +52 -0
  14. package/dist/hooks/AccountStateHook.js.map +1 -0
  15. package/dist/hooks/BlockHeightHook.d.ts +7 -0
  16. package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
  17. package/dist/hooks/BlockHeightHook.js +16 -0
  18. package/dist/hooks/BlockHeightHook.js.map +1 -0
  19. package/dist/hooks/LastStateRootBlockHook.d.ts +7 -0
  20. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  21. package/dist/hooks/LastStateRootBlockHook.js +16 -0
  22. package/dist/hooks/LastStateRootBlockHook.js.map +1 -0
  23. package/dist/hooks/NoopBlockHook.d.ts +8 -0
  24. package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
  25. package/dist/hooks/NoopBlockHook.js +10 -0
  26. package/dist/hooks/NoopBlockHook.js.map +1 -0
  27. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  28. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  29. package/dist/{prover/statetransition/StateTransitionWitnessProvider.js → hooks/NoopSettlementHook.js} +8 -7
  30. package/dist/hooks/NoopSettlementHook.js.map +1 -0
  31. package/dist/hooks/NoopTransactionHook.d.ts +6 -0
  32. package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
  33. package/dist/hooks/NoopTransactionHook.js +11 -0
  34. package/dist/hooks/NoopTransactionHook.js.map +1 -0
  35. package/dist/index.d.ts +51 -9
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +52 -9
  38. package/dist/index.js.map +1 -0
  39. package/dist/model/AppliedStateTransitionBatch.d.ts +114 -0
  40. package/dist/model/AppliedStateTransitionBatch.d.ts.map +1 -0
  41. package/dist/model/AppliedStateTransitionBatch.js +16 -0
  42. package/dist/model/AppliedStateTransitionBatch.js.map +1 -0
  43. package/dist/model/MethodPublicOutput.d.ts +83 -29
  44. package/dist/model/MethodPublicOutput.d.ts.map +1 -1
  45. package/dist/model/MethodPublicOutput.js +4 -1
  46. package/dist/model/MethodPublicOutput.js.map +1 -0
  47. package/dist/model/Option.d.ts +70 -42
  48. package/dist/model/Option.d.ts.map +1 -1
  49. package/dist/model/Option.js +62 -47
  50. package/dist/model/Option.js.map +1 -0
  51. package/dist/model/Path.d.ts +4 -3
  52. package/dist/model/Path.d.ts.map +1 -1
  53. package/dist/model/Path.js +6 -5
  54. package/dist/model/Path.js.map +1 -0
  55. package/dist/model/RuntimeLike.d.ts +11 -0
  56. package/dist/model/RuntimeLike.d.ts.map +1 -0
  57. package/dist/model/RuntimeLike.js +2 -0
  58. package/dist/model/RuntimeLike.js.map +1 -0
  59. package/dist/model/StateTransition.d.ts +67 -16
  60. package/dist/model/StateTransition.d.ts.map +1 -1
  61. package/dist/model/StateTransition.js +18 -2
  62. package/dist/model/StateTransition.js.map +1 -0
  63. package/dist/model/StateTransitionProvableBatch.d.ts +389 -16
  64. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -1
  65. package/dist/model/StateTransitionProvableBatch.js +88 -11
  66. package/dist/model/StateTransitionProvableBatch.js.map +1 -0
  67. package/dist/model/network/NetworkState.d.ts +105 -9
  68. package/dist/model/network/NetworkState.d.ts.map +1 -1
  69. package/dist/model/network/NetworkState.js +20 -2
  70. package/dist/model/network/NetworkState.js.map +1 -0
  71. package/dist/model/transaction/RuntimeTransaction.d.ts +96 -28
  72. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -1
  73. package/dist/model/transaction/RuntimeTransaction.js +75 -11
  74. package/dist/model/transaction/RuntimeTransaction.js.map +1 -0
  75. package/dist/model/transaction/SignedTransaction.d.ts +107 -0
  76. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
  77. package/dist/model/transaction/SignedTransaction.js +34 -0
  78. package/dist/model/transaction/SignedTransaction.js.map +1 -0
  79. package/dist/model/transaction/ValueOption.d.ts +173 -0
  80. package/dist/model/transaction/ValueOption.d.ts.map +1 -0
  81. package/dist/model/transaction/ValueOption.js +25 -0
  82. package/dist/model/transaction/ValueOption.js.map +1 -0
  83. package/dist/protocol/Protocol.d.ts +27 -25
  84. package/dist/protocol/Protocol.d.ts.map +1 -1
  85. package/dist/protocol/Protocol.js +98 -28
  86. package/dist/protocol/Protocol.js.map +1 -0
  87. package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
  88. package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
  89. package/dist/protocol/ProtocolEnvironment.js +2 -0
  90. package/dist/protocol/ProtocolEnvironment.js.map +1 -0
  91. package/dist/protocol/ProtocolModule.d.ts +7 -7
  92. package/dist/protocol/ProtocolModule.d.ts.map +1 -1
  93. package/dist/protocol/ProtocolModule.js +10 -7
  94. package/dist/protocol/ProtocolModule.js.map +1 -0
  95. package/dist/protocol/ProvableBlockHook.d.ts +19 -0
  96. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
  97. package/dist/protocol/ProvableBlockHook.js +21 -0
  98. package/dist/protocol/ProvableBlockHook.js.map +1 -0
  99. package/dist/protocol/ProvableTransactionHook.d.ts +34 -0
  100. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
  101. package/dist/protocol/ProvableTransactionHook.js +13 -0
  102. package/dist/protocol/ProvableTransactionHook.js.map +1 -0
  103. package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
  104. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
  105. package/dist/protocol/TransitioningProtocolModule.js +9 -0
  106. package/dist/protocol/TransitioningProtocolModule.js.map +1 -0
  107. package/dist/prover/accumulators/AppliedBatchHashList.d.ts +18 -0
  108. package/dist/prover/accumulators/AppliedBatchHashList.d.ts.map +1 -0
  109. package/dist/prover/accumulators/AppliedBatchHashList.js +25 -0
  110. package/dist/prover/accumulators/AppliedBatchHashList.js.map +1 -0
  111. package/dist/prover/accumulators/StateTransitionReductionList.d.ts +12 -0
  112. package/dist/prover/accumulators/StateTransitionReductionList.d.ts.map +1 -0
  113. package/dist/prover/accumulators/StateTransitionReductionList.js +64 -0
  114. package/dist/prover/accumulators/StateTransitionReductionList.js.map +1 -0
  115. package/dist/prover/accumulators/TransactionHashList.d.ts +6 -0
  116. package/dist/prover/accumulators/TransactionHashList.d.ts.map +1 -0
  117. package/dist/prover/accumulators/TransactionHashList.js +8 -0
  118. package/dist/prover/accumulators/TransactionHashList.js.map +1 -0
  119. package/dist/prover/accumulators/WitnessedRootHashList.d.ts +137 -0
  120. package/dist/prover/accumulators/WitnessedRootHashList.d.ts.map +1 -0
  121. package/dist/prover/accumulators/WitnessedRootHashList.js +50 -0
  122. package/dist/prover/accumulators/WitnessedRootHashList.js.map +1 -0
  123. package/dist/prover/block/BlockProvable.d.ts +869 -65
  124. package/dist/prover/block/BlockProvable.d.ts.map +1 -1
  125. package/dist/prover/block/BlockProvable.js +86 -6
  126. package/dist/prover/block/BlockProvable.js.map +1 -0
  127. package/dist/prover/block/BlockProver.d.ts +82 -34
  128. package/dist/prover/block/BlockProver.d.ts.map +1 -1
  129. package/dist/prover/block/BlockProver.js +505 -86
  130. package/dist/prover/block/BlockProver.js.map +1 -0
  131. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +106 -0
  132. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
  133. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +25 -0
  134. package/dist/prover/block/accummulators/BlockHashMerkleTree.js.map +1 -0
  135. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
  136. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
  137. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +21 -0
  138. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js.map +1 -0
  139. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
  140. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
  141. package/dist/prover/{statetransition/StateTransitionWitnessProviderReference.js → block/services/RuntimeVerificationKeyRootService.js} +11 -8
  142. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
  143. package/dist/prover/statetransition/StateTransitionProvable.d.ts +137 -48
  144. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -1
  145. package/dist/prover/statetransition/StateTransitionProvable.js +10 -5
  146. package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
  147. package/dist/prover/statetransition/StateTransitionProver.d.ts +30 -17
  148. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -1
  149. package/dist/prover/statetransition/StateTransitionProver.js +169 -74
  150. package/dist/prover/statetransition/StateTransitionProver.js.map +1 -0
  151. package/dist/settlement/ContractModule.d.ts +16 -0
  152. package/dist/settlement/ContractModule.d.ts.map +1 -0
  153. package/dist/settlement/ContractModule.js +12 -0
  154. package/dist/settlement/ContractModule.js.map +1 -0
  155. package/dist/settlement/SettlementContractModule.d.ts +51 -0
  156. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  157. package/dist/settlement/SettlementContractModule.js +80 -0
  158. package/dist/settlement/SettlementContractModule.js.map +1 -0
  159. package/dist/settlement/contracts/BridgeContract.d.ts +116 -0
  160. package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
  161. package/dist/settlement/contracts/BridgeContract.js +259 -0
  162. package/dist/settlement/contracts/BridgeContract.js.map +1 -0
  163. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +16 -0
  164. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
  165. package/dist/settlement/contracts/BridgeContractProtocolModule.js +41 -0
  166. package/dist/settlement/contracts/BridgeContractProtocolModule.js.map +1 -0
  167. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +21 -0
  168. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  169. package/dist/settlement/contracts/DispatchContractProtocolModule.js +57 -0
  170. package/dist/settlement/contracts/DispatchContractProtocolModule.js.map +1 -0
  171. package/dist/settlement/contracts/DispatchSmartContract.d.ts +44 -0
  172. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  173. package/dist/settlement/contracts/DispatchSmartContract.js +229 -0
  174. package/dist/settlement/contracts/DispatchSmartContract.js.map +1 -0
  175. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +21 -0
  176. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  177. package/dist/settlement/contracts/SettlementContractProtocolModule.js +84 -0
  178. package/dist/settlement/contracts/SettlementContractProtocolModule.js.map +1 -0
  179. package/dist/settlement/contracts/SettlementSmartContract.d.ts +123 -0
  180. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  181. package/dist/settlement/contracts/SettlementSmartContract.js +310 -0
  182. package/dist/settlement/contracts/SettlementSmartContract.js.map +1 -0
  183. package/dist/settlement/contracts/TokenBridgeTree.d.ts +228 -0
  184. package/dist/settlement/contracts/TokenBridgeTree.d.ts.map +1 -0
  185. package/dist/settlement/contracts/TokenBridgeTree.js +60 -0
  186. package/dist/settlement/contracts/TokenBridgeTree.js.map +1 -0
  187. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts +10 -0
  188. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts.map +1 -0
  189. package/dist/settlement/contracts/authorizations/ContractAuthorization.js +2 -0
  190. package/dist/settlement/contracts/authorizations/ContractAuthorization.js.map +1 -0
  191. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts +85 -0
  192. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts.map +1 -0
  193. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js +11 -0
  194. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js.map +1 -0
  195. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts +79 -0
  196. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts.map +1 -0
  197. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js +11 -0
  198. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js.map +1 -0
  199. package/dist/settlement/messages/Deposit.d.ts +77 -0
  200. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  201. package/dist/settlement/messages/Deposit.js +8 -0
  202. package/dist/settlement/messages/Deposit.js.map +1 -0
  203. package/dist/settlement/messages/OutgoingMessage.d.ts +67 -0
  204. package/dist/settlement/messages/OutgoingMessage.d.ts.map +1 -0
  205. package/dist/settlement/messages/OutgoingMessage.js +7 -0
  206. package/dist/settlement/messages/OutgoingMessage.js.map +1 -0
  207. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +462 -0
  208. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  209. package/dist/settlement/messages/OutgoingMessageArgument.js +40 -0
  210. package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
  211. package/dist/settlement/modularity/OutgoingMessageProcessor.d.ts +25 -0
  212. package/dist/settlement/modularity/OutgoingMessageProcessor.d.ts.map +1 -0
  213. package/dist/settlement/modularity/OutgoingMessageProcessor.js +30 -0
  214. package/dist/settlement/modularity/OutgoingMessageProcessor.js.map +1 -0
  215. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +26 -0
  216. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  217. package/dist/settlement/modularity/ProvableSettlementHook.js +4 -0
  218. package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
  219. package/dist/settlement/modularity/types.d.ts +8 -0
  220. package/dist/settlement/modularity/types.d.ts.map +1 -0
  221. package/dist/settlement/modularity/types.js +2 -0
  222. package/dist/settlement/modularity/types.js.map +1 -0
  223. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  224. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  225. package/dist/settlement/modules/NetworkStateSettlementModule.js +15 -0
  226. package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
  227. package/dist/state/State.d.ts +68 -0
  228. package/dist/state/State.d.ts.map +1 -0
  229. package/dist/state/State.js +131 -0
  230. package/dist/state/State.js.map +1 -0
  231. package/dist/state/StateMap.d.ts +37 -0
  232. package/dist/state/StateMap.d.ts.map +1 -0
  233. package/dist/state/StateMap.js +56 -0
  234. package/dist/state/StateMap.js.map +1 -0
  235. package/dist/state/StateService.d.ts +6 -0
  236. package/dist/state/StateService.d.ts.map +1 -0
  237. package/dist/state/StateService.js +2 -0
  238. package/dist/state/StateService.js.map +1 -0
  239. package/dist/state/StateServiceProvider.d.ts +8 -0
  240. package/dist/state/StateServiceProvider.d.ts.map +1 -0
  241. package/dist/state/StateServiceProvider.js +37 -0
  242. package/dist/state/StateServiceProvider.js.map +1 -0
  243. package/dist/state/assert/assert.d.ts +12 -0
  244. package/dist/state/assert/assert.d.ts.map +1 -0
  245. package/dist/state/assert/assert.js +33 -0
  246. package/dist/state/assert/assert.js.map +1 -0
  247. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
  248. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
  249. package/dist/state/context/RuntimeMethodExecutionContext.js +138 -0
  250. package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
  251. package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
  252. package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
  253. package/dist/state/context/TransitionMethodExecutionContext.js +6 -0
  254. package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
  255. package/dist/state/protocol/ProtocolState.d.ts +13 -0
  256. package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
  257. package/dist/state/protocol/ProtocolState.js +58 -0
  258. package/dist/state/protocol/ProtocolState.js.map +1 -0
  259. package/dist/utils/FieldOptions.d.ts +62 -0
  260. package/dist/utils/FieldOptions.d.ts.map +1 -0
  261. package/dist/utils/FieldOptions.js +13 -0
  262. package/dist/utils/FieldOptions.js.map +1 -0
  263. package/dist/utils/MinaPrefixedProvableHashList.d.ts +19 -0
  264. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  265. package/dist/utils/MinaPrefixedProvableHashList.js +46 -0
  266. package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
  267. package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
  268. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
  269. package/dist/utils/PrefixedProvableHashList.js +2 -1
  270. package/dist/utils/PrefixedProvableHashList.js.map +1 -0
  271. package/dist/utils/ProvableHashList.d.ts +23 -4
  272. package/dist/utils/ProvableHashList.d.ts.map +1 -1
  273. package/dist/utils/ProvableHashList.js +38 -2
  274. package/dist/utils/ProvableHashList.js.map +1 -0
  275. package/dist/utils/ProvableReductionHashList.d.ts +18 -0
  276. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  277. package/dist/utils/ProvableReductionHashList.js +54 -0
  278. package/dist/utils/ProvableReductionHashList.js.map +1 -0
  279. package/dist/utils/utils.d.ts +20 -0
  280. package/dist/utils/utils.d.ts.map +1 -0
  281. package/dist/utils/utils.js +51 -0
  282. package/dist/utils/utils.js.map +1 -0
  283. package/jest.config.cjs +12 -1
  284. package/package.json +11 -9
  285. package/src/hashing/mina-prefixes.ts +10 -0
  286. package/src/hashing/protokit-prefixes.ts +37 -0
  287. package/src/hooks/AccountStateHook.ts +57 -0
  288. package/src/hooks/BlockHeightHook.ts +17 -0
  289. package/src/hooks/LastStateRootBlockHook.ts +25 -0
  290. package/src/hooks/NoopBlockHook.ts +24 -0
  291. package/src/hooks/NoopSettlementHook.ts +20 -0
  292. package/src/hooks/NoopTransactionHook.ts +13 -0
  293. package/src/index.ts +51 -9
  294. package/src/model/AppliedStateTransitionBatch.ts +16 -0
  295. package/src/model/MethodPublicOutput.ts +3 -1
  296. package/src/model/Option.ts +99 -60
  297. package/src/model/Path.ts +9 -5
  298. package/src/model/RuntimeLike.ts +12 -0
  299. package/src/model/StateTransition.ts +25 -3
  300. package/src/model/StateTransitionProvableBatch.ts +117 -14
  301. package/src/model/Transaction.ts +3 -1
  302. package/src/model/network/NetworkState.ts +21 -3
  303. package/src/model/transaction/RuntimeTransaction.ts +90 -15
  304. package/src/model/transaction/SignedTransaction.ts +47 -0
  305. package/src/model/transaction/ValueOption.ts +28 -0
  306. package/src/protocol/Protocol.ts +166 -74
  307. package/src/protocol/ProtocolEnvironment.ts +10 -0
  308. package/src/protocol/ProtocolModule.ts +16 -16
  309. package/src/protocol/ProvableBlockHook.ts +68 -0
  310. package/src/protocol/ProvableTransactionHook.ts +77 -0
  311. package/src/protocol/TransitioningProtocolModule.ts +12 -0
  312. package/src/prover/accumulators/AppliedBatchHashList.ts +32 -0
  313. package/src/prover/accumulators/StateTransitionReductionList.ts +92 -0
  314. package/src/prover/accumulators/TransactionHashList.ts +9 -0
  315. package/src/prover/accumulators/WitnessedRootHashList.ts +61 -0
  316. package/src/prover/block/BlockProvable.ts +188 -15
  317. package/src/prover/block/BlockProver.ts +979 -143
  318. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +24 -0
  319. package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
  320. package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
  321. package/src/prover/statetransition/StateTransitionProvable.ts +26 -19
  322. package/src/prover/statetransition/StateTransitionProver.ts +338 -130
  323. package/src/settlement/ContractModule.ts +31 -0
  324. package/src/settlement/SettlementContractModule.ts +145 -0
  325. package/src/settlement/contracts/BridgeContract.ts +366 -0
  326. package/src/settlement/contracts/BridgeContractProtocolModule.ts +48 -0
  327. package/src/settlement/contracts/DispatchContractProtocolModule.ts +75 -0
  328. package/src/settlement/contracts/DispatchSmartContract.ts +325 -0
  329. package/src/settlement/contracts/SettlementContractProtocolModule.ts +113 -0
  330. package/src/settlement/contracts/SettlementSmartContract.ts +502 -0
  331. package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
  332. package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
  333. package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
  334. package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
  335. package/src/settlement/messages/Deposit.ts +7 -0
  336. package/src/settlement/messages/OutgoingMessage.ts +17 -0
  337. package/src/settlement/messages/OutgoingMessageArgument.ts +53 -0
  338. package/src/settlement/modularity/OutgoingMessageProcessor.ts +65 -0
  339. package/src/settlement/modularity/ProvableSettlementHook.ts +36 -0
  340. package/src/settlement/modularity/types.ts +22 -0
  341. package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
  342. package/src/state/State.ts +177 -0
  343. package/src/state/StateMap.ts +73 -0
  344. package/src/state/StateService.ts +6 -0
  345. package/src/state/StateServiceProvider.ts +37 -0
  346. package/src/state/assert/assert.ts +38 -0
  347. package/src/state/context/RuntimeMethodExecutionContext.ts +181 -0
  348. package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
  349. package/src/state/protocol/ProtocolState.ts +98 -0
  350. package/src/utils/FieldOptions.ts +13 -0
  351. package/src/utils/MinaPrefixedProvableHashList.ts +66 -0
  352. package/src/utils/PrefixedProvableHashList.ts +2 -2
  353. package/src/utils/ProvableHashList.ts +78 -3
  354. package/src/utils/ProvableReductionHashList.ts +77 -0
  355. package/src/utils/utils.ts +44 -55
  356. package/test/BlockProver.test.ts +161 -74
  357. package/test/Protocol.test.ts +20 -10
  358. package/test/State.test.ts +45 -0
  359. package/test/StateTransition.test.ts +57 -65
  360. package/test/TestingProtocol.ts +56 -0
  361. package/test/compiling/types.ts +28 -0
  362. package/test/model/Option.test.ts +72 -0
  363. package/test/model/StateTransitionProvableBatch.test.ts +137 -0
  364. package/test/modularity/types.ts +35 -0
  365. package/test/prover/block/BlockProver.test.ts +18 -0
  366. package/test/prover/statetransition/StateTransitionProver.test.ts +261 -0
  367. package/test/state/assert/assert.test.ts +56 -0
  368. package/test/tsconfig.json +7 -0
  369. package/test/utils/ProvableHashList.test.ts +44 -0
  370. package/test/utils/ProvableReductionHashList.test.ts +117 -0
  371. package/test/utils.test.ts +27 -0
  372. package/dist/config/ConfigurableModule.d.ts +0 -18
  373. package/dist/config/ConfigurableModule.d.ts.map +0 -1
  374. package/dist/config/ConfigurableModule.js +0 -20
  375. package/dist/config/ConfigurationAggregator.d.ts +0 -10
  376. package/dist/config/ConfigurationAggregator.d.ts.map +0 -1
  377. package/dist/config/ConfigurationAggregator.js +0 -35
  378. package/dist/config/ConfigurationReceiver.d.ts +0 -25
  379. package/dist/config/ConfigurationReceiver.d.ts.map +0 -1
  380. package/dist/config/ConfigurationReceiver.js +0 -36
  381. package/dist/config/ModuleContainer.d.ts +0 -44
  382. package/dist/config/ModuleContainer.d.ts.map +0 -1
  383. package/dist/config/ModuleContainer.js +0 -89
  384. package/dist/config/types.d.ts +0 -2
  385. package/dist/config/types.d.ts.map +0 -1
  386. package/dist/config/types.js +0 -1
  387. package/dist/model/MethodPublicInput.d.ts +0 -51
  388. package/dist/model/MethodPublicInput.d.ts.map +0 -1
  389. package/dist/model/MethodPublicInput.js +0 -11
  390. package/dist/model/transaction/ProtocolTransaction.d.ts +0 -70
  391. package/dist/model/transaction/ProtocolTransaction.d.ts.map +0 -1
  392. package/dist/model/transaction/ProtocolTransaction.js +0 -18
  393. package/dist/prover/block/BlockScopedModule.d.ts +0 -3
  394. package/dist/prover/block/BlockScopedModule.d.ts.map +0 -1
  395. package/dist/prover/block/BlockScopedModule.js +0 -6
  396. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +0 -16
  397. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +0 -1
  398. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +0 -7
  399. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +0 -1
  400. package/dist/src/model/Option.d.ts +0 -158
  401. package/dist/src/model/Option.d.ts.map +0 -1
  402. package/dist/src/model/Option.js +0 -53
  403. package/dist/src/model/Path.d.ts +0 -35
  404. package/dist/src/model/Path.d.ts.map +0 -1
  405. package/dist/src/model/Path.js +0 -51
  406. package/dist/src/model/StateTransition.d.ts +0 -201
  407. package/dist/src/model/StateTransition.d.ts.map +0 -1
  408. package/dist/src/model/StateTransition.js +0 -43
  409. package/dist/src/utils/PrefixedHashList.d.ts +0 -15
  410. package/dist/src/utils/PrefixedHashList.d.ts.map +0 -1
  411. package/dist/src/utils/PrefixedHashList.js +0 -28
  412. package/dist/src/utils/ProvableHashList.d.ts +0 -30
  413. package/dist/src/utils/ProvableHashList.d.ts.map +0 -1
  414. package/dist/src/utils/ProvableHashList.js +0 -43
  415. package/dist/utils/PrefixedHashList.d.ts +0 -14
  416. package/dist/utils/PrefixedHashList.d.ts.map +0 -1
  417. package/dist/utils/PrefixedHashList.js +0 -12
  418. package/dist/utils/Utils.d.ts +0 -17
  419. package/dist/utils/Utils.d.ts.map +0 -1
  420. package/dist/utils/Utils.js +0 -64
  421. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +0 -25
  422. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +0 -1
  423. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +0 -77
  424. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +0 -26
  425. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +0 -1
  426. package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +0 -79
  427. package/dist/utils/merkletree/MerkleTreeStore.d.ts +0 -11
  428. package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +0 -1
  429. package/dist/utils/merkletree/MerkleTreeStore.js +0 -1
  430. package/dist/utils/merkletree/RollupMerkleTree.d.ts +0 -130
  431. package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +0 -1
  432. package/dist/utils/merkletree/RollupMerkleTree.js +0 -244
  433. package/src/model/Option.test.ts +0 -21
  434. package/src/model/transaction/ProtocolTransaction.ts +0 -25
  435. package/src/prover/statetransition/StateTransitionWitnessProvider.ts +0 -24
  436. package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +0 -17
  437. package/src/utils/merkletree/InMemoryMerkleTreeStorage.ts +0 -106
  438. package/src/utils/merkletree/MerkleTreeStore.ts +0 -15
  439. package/src/utils/merkletree/RollupMerkleTree.ts +0 -250
  440. package/src/utils/merkletree/VirtualMerkleTreeStore.ts +0 -21
  441. package/tsconfig.test.json +0 -9
@@ -0,0 +1,65 @@
1
+ import {
2
+ AccountUpdate,
3
+ Bool,
4
+ Field,
5
+ FlexibleProvablePure,
6
+ PublicKey,
7
+ } from "o1js";
8
+ import { implement, NoConfig } from "@proto-kit/common";
9
+
10
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
11
+
12
+ export function outgoingMessageProcessor() {
13
+ return implement("OutgoingMessageProcessor");
14
+ }
15
+
16
+ export type MessageProcessorArgs = {
17
+ bridgeContract: {
18
+ publicKey: PublicKey;
19
+ tokenId: Field;
20
+ };
21
+ };
22
+
23
+ export abstract class OutgoingMessageProcessor<
24
+ T,
25
+ Config = NoConfig,
26
+ > extends ProtocolModule<Config> {
27
+ private status: Bool = Bool(false);
28
+
29
+ private statusMessage?: string = undefined;
30
+
31
+ public assertTrue(b: Bool, msg?: string) {
32
+ this.status = this.status.and(b);
33
+ if (this.statusMessage === undefined) {
34
+ this.statusMessage = msg;
35
+ }
36
+ }
37
+
38
+ processMessage(
39
+ message: T,
40
+ args: MessageProcessorArgs
41
+ ): {
42
+ accountUpdates: AccountUpdate[];
43
+ status: Bool;
44
+ statusMessage?: string;
45
+ } {
46
+ this.status = Bool(true);
47
+ this.statusMessage = undefined;
48
+
49
+ const accountUpdates = this.process(message, args);
50
+
51
+ return {
52
+ accountUpdates,
53
+ status: this.status,
54
+ statusMessage: this.statusMessage,
55
+ };
56
+ }
57
+
58
+ abstract type: FlexibleProvablePure<T>;
59
+
60
+ abstract messageType: string;
61
+
62
+ abstract dummy(): T;
63
+
64
+ abstract process(message: T, args: MessageProcessorArgs): AccountUpdate[];
65
+ }
@@ -0,0 +1,36 @@
1
+ import { Field, PublicKey, UInt32 } from "o1js";
2
+ import { InferProofBase } from "@proto-kit/common";
3
+
4
+ import { ProtocolModule } from "../../protocol/ProtocolModule";
5
+ import { NetworkState } from "../../model/network/NetworkState";
6
+ import type { BlockProof } from "../../prover/block/BlockProver";
7
+ import type { SettlementSmartContractBase } from "../contracts/SettlementSmartContract";
8
+
9
+ export type InputBlockProof = InferProofBase<BlockProof>;
10
+
11
+ export type SettlementStateRecord = {
12
+ sequencerKey: PublicKey;
13
+ lastSettlementL1BlockHeight: UInt32;
14
+
15
+ stateRoot: Field;
16
+ networkStateHash: Field;
17
+ blockHashRoot: Field;
18
+ };
19
+
20
+ export type SettlementHookInputs = {
21
+ blockProof: InputBlockProof;
22
+ fromNetworkState: NetworkState;
23
+ toNetworkState: NetworkState;
24
+ newPromisedMessagesHash: Field;
25
+ contractState: SettlementStateRecord;
26
+ currentL1BlockHeight: UInt32;
27
+ };
28
+
29
+ export abstract class ProvableSettlementHook<
30
+ Config,
31
+ > extends ProtocolModule<Config> {
32
+ public abstract beforeSettlement(
33
+ smartContract: SettlementSmartContractBase,
34
+ inputs: SettlementHookInputs
35
+ ): Promise<void>;
36
+ }
@@ -0,0 +1,22 @@
1
+ import { TypedClass } from "@proto-kit/common";
2
+
3
+ import {
4
+ ContractModule,
5
+ SmartContractClassFromInterface,
6
+ } from "../ContractModule";
7
+ import type { SettlementModulesRecord } from "../SettlementContractModule";
8
+
9
+ export type InferContractType<
10
+ Module extends TypedClass<ContractModule<any, any>>,
11
+ > =
12
+ Module extends TypedClass<infer ConcreteModule>
13
+ ? ConcreteModule extends ContractModule<infer Contract, any>
14
+ ? Contract
15
+ : never
16
+ : never;
17
+
18
+ export type GetContracts<SettlementModules extends SettlementModulesRecord> = {
19
+ [Key in keyof SettlementModules]: SmartContractClassFromInterface<
20
+ InferContractType<SettlementModules[Key]>
21
+ >;
22
+ };
@@ -0,0 +1,42 @@
1
+ import { UInt64 } from "o1js";
2
+
3
+ import {
4
+ ProvableSettlementHook,
5
+ SettlementHookInputs,
6
+ } from "../modularity/ProvableSettlementHook";
7
+ import { SettlementSmartContract } from "../contracts/SettlementSmartContract";
8
+
9
+ type NetworkStateSettlementModuleConfig = {
10
+ blocksPerL1Block: UInt64;
11
+ };
12
+
13
+ /* eslint-disable @typescript-eslint/no-unused-vars */
14
+ export class NetworkStateSettlementModule extends ProvableSettlementHook<NetworkStateSettlementModuleConfig> {
15
+ public async beforeSettlement(
16
+ smartContract: SettlementSmartContract,
17
+ {
18
+ blockProof,
19
+ fromNetworkState,
20
+ toNetworkState,
21
+ contractState,
22
+ currentL1BlockHeight,
23
+ }: SettlementHookInputs
24
+ ) {
25
+ const { lastSettlementL1BlockHeight } = contractState;
26
+
27
+ const blocksPerL1Block = this.config.blocksPerL1Block.toConstant();
28
+
29
+ const numL1Blocks = currentL1BlockHeight.sub(lastSettlementL1BlockHeight);
30
+ const expectedHeightDiff = numL1Blocks.toUInt64().mul(blocksPerL1Block);
31
+
32
+ const actualHeightDiff = toNetworkState.block.height.sub(
33
+ fromNetworkState.block.height
34
+ );
35
+
36
+ const acceptableDerivation = numL1Blocks.mul(1).div(10);
37
+
38
+ // TODO Check within bounds efficiently
39
+ }
40
+ }
41
+
42
+ /* eslint-enable @typescript-eslint/no-unused-vars */
@@ -0,0 +1,177 @@
1
+ import { Mixin } from "ts-mixer";
2
+ import { Bool, Field, Provable, type FlexibleProvablePure, Struct } from "o1js";
3
+ import { container } from "tsyringe";
4
+ import { dummyValue } from "@proto-kit/common";
5
+
6
+ import { Path } from "../model/Path";
7
+ import { Option } from "../model/Option";
8
+ import { StateTransition } from "../model/StateTransition";
9
+
10
+ import { StateServiceProvider } from "./StateServiceProvider";
11
+ import { RuntimeMethodExecutionContext } from "./context/RuntimeMethodExecutionContext";
12
+
13
+ export class WithPath {
14
+ public path?: Field;
15
+
16
+ public hasPathOrFail(): asserts this is { path: Path } {
17
+ if (!this.path) {
18
+ throw new Error(
19
+ "Could not find 'path', did you forget to add '@state' to your state property?"
20
+ );
21
+ }
22
+ }
23
+ }
24
+
25
+ export class WithStateServiceProvider {
26
+ public stateServiceProvider?: StateServiceProvider;
27
+
28
+ public hasStateServiceOrFail(): asserts this is {
29
+ stateServiceProvider: StateServiceProvider;
30
+ } {
31
+ if (!this.stateServiceProvider) {
32
+ throw new Error(
33
+ "Could not find 'stateServiceProvider', did you forget to add '@state' to your state property?"
34
+ );
35
+ }
36
+ }
37
+ }
38
+
39
+ /**
40
+ * Utilities for runtime module state, such as get/set
41
+ */
42
+ export class State<Value> extends Mixin(WithPath, WithStateServiceProvider) {
43
+ /**
44
+ * Creates a new state wrapper for the provided value type.
45
+ *
46
+ * @param valueType - Type of value to be stored (e.g. UInt64, Struct, ...)
47
+ * @returns New state for the given value type.
48
+ */
49
+ public static from<Value>(valueType: FlexibleProvablePure<Value>) {
50
+ return new State<Value>(valueType);
51
+ }
52
+
53
+ public constructor(public valueType: FlexibleProvablePure<Value>) {
54
+ super();
55
+ }
56
+
57
+ private stateType = class StateType extends Struct({
58
+ value: this.valueType,
59
+ isSome: Bool,
60
+ }) {};
61
+
62
+ /**
63
+ * Returns the state that is currently the current state tree
64
+ * value: The value-fields, or if not state was found, dummy values
65
+ * isSome: Whether the values where found in the state or not
66
+ * (Basically, whether the value-fields are dummy values or actual values
67
+ * @private
68
+ */
69
+ private async getState(): Promise<{ value: Value; isSome: Bool }> {
70
+ this.hasStateServiceOrFail();
71
+ this.hasPathOrFail();
72
+
73
+ const { path, stateServiceProvider, valueType } = this;
74
+
75
+ const { stateTransitions } = container
76
+ .resolve(RuntimeMethodExecutionContext)
77
+ .current().result;
78
+
79
+ // TODO Use Stateservice for this
80
+ // First try to find a match inside already created stateTransitions
81
+ let previousMutatingTransitions: StateTransition<any>[] = [];
82
+ previousMutatingTransitions = stateTransitions.filter(
83
+ (transition) =>
84
+ transition.path.toConstant().toBigInt() ===
85
+ path.toConstant().toBigInt() && transition.to.isSome.toBoolean()
86
+ );
87
+ const pmtLength = previousMutatingTransitions.length;
88
+
89
+ let value =
90
+ pmtLength > 0
91
+ ? // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
92
+ (previousMutatingTransitions[pmtLength - 1].to.value as Value)
93
+ : undefined;
94
+
95
+ if (value !== undefined) {
96
+ return { value, isSome: Bool(true) };
97
+ }
98
+
99
+ // If the value is still undefined, look it up in the stateService
100
+ const fields = await stateServiceProvider.stateService.get(path);
101
+ if (fields) {
102
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
103
+ value = valueType.fromFields(fields) as Value;
104
+ }
105
+
106
+ if (value !== undefined) {
107
+ return { value, isSome: Bool(true) };
108
+ }
109
+ return { value: dummyValue(valueType), isSome: Bool(false) };
110
+ }
111
+
112
+ /**
113
+ * Provides an in-circuit witness for the current state representation,
114
+ * and constructs an Option out of it.
115
+ *
116
+ * @returns Optional value of the current state
117
+ */
118
+ private async witnessFromState() {
119
+ // get the value from storage, or return a dummy value instead
120
+ // also check if the value exists in the storage or not
121
+ const { value, isSome } = await Provable.witnessAsync(
122
+ this.stateType,
123
+ async () => await this.getState()
124
+ );
125
+
126
+ return Option.from(isSome, value, this.valueType);
127
+ }
128
+
129
+ /**
130
+ * Retrieves the current state and creates a state transition
131
+ * anchoring the use of the current state value in the circuit.
132
+ *
133
+ * @returns Option representation of the current state.
134
+ */
135
+ public async get(): Promise<Option<Value>> {
136
+ const option = await this.witnessFromState();
137
+
138
+ this.hasPathOrFail();
139
+
140
+ const stateTransition = StateTransition.from(this.path, option);
141
+
142
+ container
143
+ .resolve(RuntimeMethodExecutionContext)
144
+ .addStateTransition(stateTransition);
145
+
146
+ return option;
147
+ }
148
+
149
+ /**
150
+ * Sets a new state value by creating a state transition from
151
+ * the current value to the newly set value.
152
+ *
153
+ * The newly set value isn't available via state.get(), since the
154
+ * state transitions are not applied within the same circuit.
155
+ * You can however store and access your new value in
156
+ * a separate circuit variable.
157
+ *
158
+ * @param value - Value to be set as the current state
159
+ */
160
+ public async set(value: Value) {
161
+ // link the transition to the current state
162
+ const fromOption = await this.witnessFromState();
163
+ const toOption = Option.fromValue(value, this.valueType);
164
+
165
+ this.hasPathOrFail();
166
+
167
+ const stateTransition = StateTransition.fromTo(
168
+ this.path,
169
+ fromOption,
170
+ toOption
171
+ );
172
+
173
+ container
174
+ .resolve(RuntimeMethodExecutionContext)
175
+ .addStateTransition(stateTransition);
176
+ }
177
+ }
@@ -0,0 +1,73 @@
1
+ import type { Field, FlexibleProvablePure } from "o1js";
2
+ import { Mixin } from "ts-mixer";
3
+
4
+ import { Path } from "../model/Path";
5
+ import { Option } from "../model/Option";
6
+
7
+ import { State, WithStateServiceProvider, WithPath } from "./State";
8
+
9
+ /**
10
+ * Map-like wrapper for state
11
+ */
12
+ export class StateMap<KeyType, ValueType> extends Mixin(
13
+ WithPath,
14
+ WithStateServiceProvider
15
+ ) {
16
+ /**
17
+ * Create a new state map with the given key and value types
18
+ *
19
+ * @param keyType - Type to be used as a key
20
+ * @param valueType - Type to be stored as a value
21
+ * @returns State map with provided key and value types.
22
+ */
23
+ public static from<KeyType, ValueType>(
24
+ keyType: FlexibleProvablePure<KeyType>,
25
+ valueType: FlexibleProvablePure<ValueType>
26
+ ): StateMap<KeyType, ValueType> {
27
+ return new StateMap<KeyType, ValueType>(keyType, valueType);
28
+ }
29
+
30
+ public constructor(
31
+ public keyType: FlexibleProvablePure<KeyType>,
32
+ public valueType: FlexibleProvablePure<ValueType>
33
+ ) {
34
+ super();
35
+ }
36
+
37
+ public getPath(key: KeyType): Field {
38
+ this.hasPathOrFail();
39
+ return Path.fromKey(this.path, this.keyType, key);
40
+ }
41
+
42
+ /**
43
+ * Obtains a value for the provided key in the current state map.
44
+ *
45
+ * @param key - Key to obtain the state for
46
+ * @returns Value for the provided key.
47
+ */
48
+ public async get(key: KeyType): Promise<Option<ValueType>> {
49
+ const state = State.from(this.valueType);
50
+ this.hasPathOrFail();
51
+ this.hasStateServiceOrFail();
52
+
53
+ state.path = this.getPath(key);
54
+ state.stateServiceProvider = this.stateServiceProvider;
55
+ return await state.get();
56
+ }
57
+
58
+ /**
59
+ * Sets a value for the given key in the current state map.
60
+ *
61
+ * @param key - Key to store the value under
62
+ * @param value - Value to be stored under the given key
63
+ */
64
+ public async set(key: KeyType, value: ValueType): Promise<void> {
65
+ const state = State.from(this.valueType);
66
+ this.hasPathOrFail();
67
+ this.hasStateServiceOrFail();
68
+
69
+ state.path = Path.fromKey(this.path, this.keyType, key);
70
+ state.stateServiceProvider = this.stateServiceProvider;
71
+ return await state.set(value);
72
+ }
73
+ }
@@ -0,0 +1,6 @@
1
+ import { Field } from "o1js";
2
+
3
+ export interface SimpleAsyncStateService {
4
+ get: (key: Field) => Promise<Field[] | undefined>;
5
+ set: (key: Field, value: Field[] | undefined) => Promise<void>;
6
+ }
@@ -0,0 +1,37 @@
1
+ import { injectable } from "tsyringe";
2
+ import { log } from "@proto-kit/common";
3
+
4
+ import { SimpleAsyncStateService } from "./StateService";
5
+
6
+ const errors = {
7
+ stateServiceNotSet: () =>
8
+ new Error(
9
+ "StateService has not been set yet. Be sure to either call your runtime or protocol function by creating them with an AppChain or by setting the stateService manually."
10
+ ),
11
+ };
12
+
13
+ @injectable()
14
+ export class StateServiceProvider {
15
+ private readonly stateServiceStack: SimpleAsyncStateService[] = [];
16
+
17
+ public get stateService(): SimpleAsyncStateService {
18
+ if (this.stateServiceStack.length === 0) {
19
+ throw errors.stateServiceNotSet();
20
+ }
21
+
22
+ // Assertion here is ok, because we check that the array is not empty above
23
+ return this.stateServiceStack.at(-1)!;
24
+ }
25
+
26
+ public setCurrentStateService(service: SimpleAsyncStateService) {
27
+ this.stateServiceStack.push(service);
28
+ }
29
+
30
+ public popCurrentStateService() {
31
+ if (this.stateServiceStack.length === 0) {
32
+ log.trace("Trying to pop from empty state-service stack");
33
+ return;
34
+ }
35
+ this.stateServiceStack.pop();
36
+ }
37
+ }
@@ -0,0 +1,38 @@
1
+ import { Bool, Provable } from "o1js";
2
+ import { container } from "tsyringe";
3
+ import { log } from "@proto-kit/common";
4
+
5
+ import { RuntimeMethodExecutionContext } from "../context/RuntimeMethodExecutionContext";
6
+
7
+ /**
8
+ * Maintains an execution status of the current runtime module method,
9
+ * while prioritizing one-time failures. The assertion won't change the
10
+ * execution status if it has previously failed at least once within the
11
+ * same method execution context.
12
+ *
13
+ * @param condition - Result of the assertion made about the execution status
14
+ * @param message - Optional message describing the prior status
15
+ */
16
+ export function assert(condition: Bool, message?: string | (() => string)) {
17
+ const executionContext = container.resolve(RuntimeMethodExecutionContext);
18
+ const previousStatus = executionContext.current().result.status;
19
+ const status = condition.and(previousStatus);
20
+
21
+ Provable.asProver(() => {
22
+ if (!condition.toBoolean()) {
23
+ const messageString =
24
+ message !== undefined && typeof message === "function"
25
+ ? message()
26
+ : message;
27
+
28
+ // If no isSimulated was set, we treat it as not simulated,
29
+ // therefore printing the log
30
+ if (!(executionContext.current().isSimulated ?? false)) {
31
+ log.debug("Assertion failed: ", messageString);
32
+ }
33
+ executionContext.setStatusMessage(messageString, new Error().stack);
34
+ }
35
+ });
36
+
37
+ executionContext.setStatus(status);
38
+ }
@@ -0,0 +1,181 @@
1
+ import { Bool, FlexibleProvablePure, Provable, Struct } from "o1js";
2
+ import { singleton } from "tsyringe";
3
+ import {
4
+ ProvableMethodExecutionContext,
5
+ ProvableMethodExecutionResult,
6
+ } from "@proto-kit/common";
7
+
8
+ import { StateTransition } from "../../model/StateTransition";
9
+ import { RuntimeTransaction } from "../../model/transaction/RuntimeTransaction";
10
+ import { NetworkState } from "../../model/network/NetworkState";
11
+
12
+ const errors = {
13
+ setupNotCalled: () =>
14
+ new Error(
15
+ "Setup has not been called prior to executing a runtime method. Be sure to do that so that the Runtime is setup property for execution"
16
+ ),
17
+ };
18
+
19
+ export class RuntimeProvableMethodExecutionResult extends ProvableMethodExecutionResult {
20
+ public stateTransitions: StateTransition<any>[] = [];
21
+
22
+ public status: Bool = Bool(true);
23
+
24
+ public statusMessage?: string;
25
+
26
+ public stackTrace?: string;
27
+
28
+ public events: {
29
+ eventType: FlexibleProvablePure<any>;
30
+ event: any;
31
+ eventName: string;
32
+ condition: Bool;
33
+ }[] = [];
34
+ }
35
+
36
+ export interface RuntimeMethodExecutionData {
37
+ transaction: RuntimeTransaction;
38
+ networkState: NetworkState;
39
+ }
40
+
41
+ export class RuntimeMethodExecutionDataStruct
42
+ extends Struct({
43
+ transaction: RuntimeTransaction,
44
+ networkState: NetworkState,
45
+ })
46
+ implements RuntimeMethodExecutionData {}
47
+
48
+ /**
49
+ * Execution context used to wrap runtime module methods,
50
+ * allowing them to post relevant information (such as execution status)
51
+ * into the context without any unnecessary 'prop drilling'.
52
+ */
53
+ @singleton()
54
+ export class RuntimeMethodExecutionContext extends ProvableMethodExecutionContext {
55
+ public methods: string[] = [];
56
+
57
+ public input: RuntimeMethodExecutionData | undefined;
58
+
59
+ private isSimulated: boolean = false;
60
+
61
+ // The inputs corresponding to the current result
62
+ private lastInputs:
63
+ | {
64
+ input: RuntimeMethodExecutionData | undefined;
65
+ isSimulated: boolean;
66
+ }
67
+ | undefined;
68
+
69
+ public override result = new RuntimeProvableMethodExecutionResult();
70
+
71
+ private assertSetupCalled(): asserts this is {
72
+ input: RuntimeMethodExecutionData;
73
+ } {
74
+ if (this.input === undefined) {
75
+ throw errors.setupNotCalled();
76
+ }
77
+ }
78
+
79
+ /**
80
+ * Adds an in-method generated state transition to the current context
81
+ * @param stateTransition - State transition to add to the context
82
+ */
83
+ public addStateTransition<Value>(stateTransition: StateTransition<Value>) {
84
+ this.assertSetupCalled();
85
+ this.result.stateTransitions.push(stateTransition);
86
+ }
87
+
88
+ public addEvent<T>(
89
+ eventType: FlexibleProvablePure<T>,
90
+ event: T,
91
+ eventName: string,
92
+ condition: Bool = Bool(true)
93
+ ) {
94
+ this.assertSetupCalled();
95
+ this.result.events.push({
96
+ eventType,
97
+ event,
98
+ eventName,
99
+ condition,
100
+ });
101
+ }
102
+
103
+ /**
104
+ * @param message - Status message to acompany the current status
105
+ */
106
+ public setStatusMessage(message?: string, stackTrace?: string) {
107
+ this.assertSetupCalled();
108
+ if (this.isSimulated) {
109
+ return;
110
+ }
111
+ this.result.statusMessage ??= message;
112
+ this.result.stackTrace ??= stackTrace;
113
+ }
114
+
115
+ /**
116
+ * @param status - Execution status of the current method
117
+ */
118
+ public setStatus(status: Bool) {
119
+ this.assertSetupCalled();
120
+ if (this.isSimulated) {
121
+ return;
122
+ }
123
+ this.result.status = status;
124
+ }
125
+
126
+ /**
127
+ * @param input Input witness data required for a runtime execution
128
+ */
129
+ public setup(input: RuntimeMethodExecutionData) {
130
+ this.input = input;
131
+ }
132
+
133
+ public witnessInput(): RuntimeMethodExecutionDataStruct {
134
+ this.assertSetupCalled();
135
+ return Provable.witness(RuntimeMethodExecutionDataStruct, () => {
136
+ // TODO Is that right? Or this.current().input
137
+ const { transaction, networkState } = this.input!;
138
+ return new RuntimeMethodExecutionDataStruct({
139
+ networkState,
140
+ transaction,
141
+ });
142
+ });
143
+ }
144
+
145
+ public setSimulated(simulated: boolean) {
146
+ this.isSimulated = simulated;
147
+ }
148
+
149
+ /**
150
+ * Manually clears/resets the execution context
151
+ */
152
+ public clear() {
153
+ this.result = new RuntimeProvableMethodExecutionResult();
154
+ }
155
+
156
+ public afterMethod() {
157
+ super.afterMethod();
158
+ if (this.isFinished) {
159
+ this.lastInputs = {
160
+ input: this.input,
161
+ isSimulated: this.isSimulated,
162
+ };
163
+ // TODO: find out why input isnt set in TransactionFeeHook during assert
164
+ // this.input = undefined;
165
+ this.isSimulated = false;
166
+ }
167
+ }
168
+
169
+ /**
170
+ * Had to override current() otherwise it would not infer
171
+ * the type of result correctly (parent type would be reused)
172
+ */
173
+ public current() {
174
+ return {
175
+ isFinished: this.isFinished,
176
+ result: this.result,
177
+ input: this.lastInputs?.input,
178
+ isSimulated: this.lastInputs?.isSimulated,
179
+ };
180
+ }
181
+ }