@proto-kit/protocol 0.1.1-develop.164 → 0.1.1-develop.1661

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 (453) 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/messages/Withdrawal.d.ts +2 -0
  212. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  213. package/dist/settlement/messages/Withdrawal.js +3 -0
  214. package/dist/settlement/messages/Withdrawal.js.map +1 -0
  215. package/dist/settlement/modularity/OutgoingMessageProcessor.d.ts +25 -0
  216. package/dist/settlement/modularity/OutgoingMessageProcessor.d.ts.map +1 -0
  217. package/dist/settlement/modularity/OutgoingMessageProcessor.js +30 -0
  218. package/dist/settlement/modularity/OutgoingMessageProcessor.js.map +1 -0
  219. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +26 -0
  220. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  221. package/dist/settlement/modularity/ProvableSettlementHook.js +4 -0
  222. package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
  223. package/dist/settlement/modularity/types.d.ts +8 -0
  224. package/dist/settlement/modularity/types.d.ts.map +1 -0
  225. package/dist/settlement/modularity/types.js +2 -0
  226. package/dist/settlement/modularity/types.js.map +1 -0
  227. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  228. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  229. package/dist/settlement/modules/NetworkStateSettlementModule.js +15 -0
  230. package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
  231. package/dist/state/SimpleAsyncStateService.d.ts +6 -0
  232. package/dist/state/SimpleAsyncStateService.d.ts.map +1 -0
  233. package/dist/state/SimpleAsyncStateService.js +2 -0
  234. package/dist/state/SimpleAsyncStateService.js.map +1 -0
  235. package/dist/state/State.d.ts +68 -0
  236. package/dist/state/State.d.ts.map +1 -0
  237. package/dist/state/State.js +131 -0
  238. package/dist/state/State.js.map +1 -0
  239. package/dist/state/StateMap.d.ts +37 -0
  240. package/dist/state/StateMap.d.ts.map +1 -0
  241. package/dist/state/StateMap.js +56 -0
  242. package/dist/state/StateMap.js.map +1 -0
  243. package/dist/state/StateService.d.ts +6 -0
  244. package/dist/state/StateService.d.ts.map +1 -0
  245. package/dist/state/StateService.js +2 -0
  246. package/dist/state/StateService.js.map +1 -0
  247. package/dist/state/StateServiceProvider.d.ts +8 -0
  248. package/dist/state/StateServiceProvider.d.ts.map +1 -0
  249. package/dist/state/StateServiceProvider.js +37 -0
  250. package/dist/state/StateServiceProvider.js.map +1 -0
  251. package/dist/state/assert/assert.d.ts +12 -0
  252. package/dist/state/assert/assert.d.ts.map +1 -0
  253. package/dist/state/assert/assert.js +33 -0
  254. package/dist/state/assert/assert.js.map +1 -0
  255. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
  256. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
  257. package/dist/state/context/RuntimeMethodExecutionContext.js +138 -0
  258. package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
  259. package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
  260. package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
  261. package/dist/state/context/TransitionMethodExecutionContext.js +6 -0
  262. package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
  263. package/dist/state/protocol/ProtocolState.d.ts +13 -0
  264. package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
  265. package/dist/state/protocol/ProtocolState.js +58 -0
  266. package/dist/state/protocol/ProtocolState.js.map +1 -0
  267. package/dist/utils/FieldOptions.d.ts +62 -0
  268. package/dist/utils/FieldOptions.d.ts.map +1 -0
  269. package/dist/utils/FieldOptions.js +13 -0
  270. package/dist/utils/FieldOptions.js.map +1 -0
  271. package/dist/utils/MinaPrefixedProvableHashList.d.ts +19 -0
  272. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  273. package/dist/utils/MinaPrefixedProvableHashList.js +46 -0
  274. package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
  275. package/dist/utils/PrefixedProvableHashList.d.ts +2 -2
  276. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -1
  277. package/dist/utils/PrefixedProvableHashList.js +2 -1
  278. package/dist/utils/PrefixedProvableHashList.js.map +1 -0
  279. package/dist/utils/ProvableHashList.d.ts +23 -4
  280. package/dist/utils/ProvableHashList.d.ts.map +1 -1
  281. package/dist/utils/ProvableHashList.js +38 -2
  282. package/dist/utils/ProvableHashList.js.map +1 -0
  283. package/dist/utils/ProvableReductionHashList.d.ts +18 -0
  284. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  285. package/dist/utils/ProvableReductionHashList.js +54 -0
  286. package/dist/utils/ProvableReductionHashList.js.map +1 -0
  287. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  288. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  289. package/dist/utils/StateTransitionReductionList.js +61 -0
  290. package/dist/utils/StateTransitionReductionList.js.map +1 -0
  291. package/dist/utils/utils.d.ts +20 -0
  292. package/dist/utils/utils.d.ts.map +1 -0
  293. package/dist/utils/utils.js +51 -0
  294. package/dist/utils/utils.js.map +1 -0
  295. package/jest.config.cjs +12 -1
  296. package/package.json +10 -9
  297. package/src/hashing/mina-prefixes.ts +10 -0
  298. package/src/hashing/protokit-prefixes.ts +37 -0
  299. package/src/hooks/AccountStateHook.ts +57 -0
  300. package/src/hooks/BlockHeightHook.ts +17 -0
  301. package/src/hooks/LastStateRootBlockHook.ts +25 -0
  302. package/src/hooks/NoopBlockHook.ts +24 -0
  303. package/src/hooks/NoopSettlementHook.ts +20 -0
  304. package/src/hooks/NoopTransactionHook.ts +13 -0
  305. package/src/index.ts +51 -9
  306. package/src/model/AppliedStateTransitionBatch.ts +16 -0
  307. package/src/model/MethodPublicOutput.ts +3 -1
  308. package/src/model/Option.ts +99 -60
  309. package/src/model/Path.ts +9 -5
  310. package/src/model/RuntimeLike.ts +12 -0
  311. package/src/model/StateTransition.ts +25 -3
  312. package/src/model/StateTransitionProvableBatch.ts +117 -14
  313. package/src/model/Transaction.ts +3 -1
  314. package/src/model/network/NetworkState.ts +21 -3
  315. package/src/model/transaction/RuntimeTransaction.ts +90 -15
  316. package/src/model/transaction/SignedTransaction.ts +47 -0
  317. package/src/model/transaction/ValueOption.ts +28 -0
  318. package/src/protocol/Protocol.ts +166 -74
  319. package/src/protocol/ProtocolEnvironment.ts +10 -0
  320. package/src/protocol/ProtocolModule.ts +16 -16
  321. package/src/protocol/ProvableBlockHook.ts +68 -0
  322. package/src/protocol/ProvableTransactionHook.ts +77 -0
  323. package/src/protocol/TransitioningProtocolModule.ts +12 -0
  324. package/src/prover/accumulators/AppliedBatchHashList.ts +32 -0
  325. package/src/prover/accumulators/StateTransitionReductionList.ts +92 -0
  326. package/src/prover/accumulators/TransactionHashList.ts +9 -0
  327. package/src/prover/accumulators/WitnessedRootHashList.ts +61 -0
  328. package/src/prover/block/BlockProvable.ts +188 -15
  329. package/src/prover/block/BlockProver.ts +979 -143
  330. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +24 -0
  331. package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
  332. package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
  333. package/src/prover/statetransition/StateTransitionProvable.ts +26 -19
  334. package/src/prover/statetransition/StateTransitionProver.ts +338 -130
  335. package/src/settlement/ContractModule.ts +31 -0
  336. package/src/settlement/SettlementContractModule.ts +145 -0
  337. package/src/settlement/contracts/BridgeContract.ts +366 -0
  338. package/src/settlement/contracts/BridgeContractProtocolModule.ts +48 -0
  339. package/src/settlement/contracts/DispatchContractProtocolModule.ts +75 -0
  340. package/src/settlement/contracts/DispatchSmartContract.ts +325 -0
  341. package/src/settlement/contracts/SettlementContractProtocolModule.ts +113 -0
  342. package/src/settlement/contracts/SettlementSmartContract.ts +502 -0
  343. package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
  344. package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
  345. package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
  346. package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
  347. package/src/settlement/messages/Deposit.ts +7 -0
  348. package/src/settlement/messages/OutgoingMessage.ts +17 -0
  349. package/src/settlement/messages/OutgoingMessageArgument.ts +53 -0
  350. package/src/settlement/modularity/OutgoingMessageProcessor.ts +65 -0
  351. package/src/settlement/modularity/ProvableSettlementHook.ts +36 -0
  352. package/src/settlement/modularity/types.ts +22 -0
  353. package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
  354. package/src/state/State.ts +177 -0
  355. package/src/state/StateMap.ts +73 -0
  356. package/src/state/StateService.ts +6 -0
  357. package/src/state/StateServiceProvider.ts +37 -0
  358. package/src/state/assert/assert.ts +38 -0
  359. package/src/state/context/RuntimeMethodExecutionContext.ts +181 -0
  360. package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
  361. package/src/state/protocol/ProtocolState.ts +98 -0
  362. package/src/utils/FieldOptions.ts +13 -0
  363. package/src/utils/MinaPrefixedProvableHashList.ts +66 -0
  364. package/src/utils/PrefixedProvableHashList.ts +2 -2
  365. package/src/utils/ProvableHashList.ts +78 -3
  366. package/src/utils/ProvableReductionHashList.ts +77 -0
  367. package/src/utils/utils.ts +44 -55
  368. package/test/BlockProver.test.ts +161 -74
  369. package/test/Protocol.test.ts +20 -10
  370. package/test/State.test.ts +45 -0
  371. package/test/StateTransition.test.ts +57 -65
  372. package/test/TestingProtocol.ts +56 -0
  373. package/test/compiling/types.ts +28 -0
  374. package/test/model/Option.test.ts +72 -0
  375. package/test/model/StateTransitionProvableBatch.test.ts +137 -0
  376. package/test/modularity/types.ts +35 -0
  377. package/test/prover/block/BlockProver.test.ts +18 -0
  378. package/test/prover/statetransition/StateTransitionProver.test.ts +261 -0
  379. package/test/state/assert/assert.test.ts +56 -0
  380. package/test/tsconfig.json +7 -0
  381. package/test/utils/ProvableHashList.test.ts +44 -0
  382. package/test/utils/ProvableReductionHashList.test.ts +117 -0
  383. package/test/utils.test.ts +27 -0
  384. package/dist/config/ConfigurableModule.d.ts +0 -18
  385. package/dist/config/ConfigurableModule.d.ts.map +0 -1
  386. package/dist/config/ConfigurableModule.js +0 -20
  387. package/dist/config/ConfigurationAggregator.d.ts +0 -10
  388. package/dist/config/ConfigurationAggregator.d.ts.map +0 -1
  389. package/dist/config/ConfigurationAggregator.js +0 -35
  390. package/dist/config/ConfigurationReceiver.d.ts +0 -25
  391. package/dist/config/ConfigurationReceiver.d.ts.map +0 -1
  392. package/dist/config/ConfigurationReceiver.js +0 -36
  393. package/dist/config/ModuleContainer.d.ts +0 -44
  394. package/dist/config/ModuleContainer.d.ts.map +0 -1
  395. package/dist/config/ModuleContainer.js +0 -89
  396. package/dist/config/types.d.ts +0 -2
  397. package/dist/config/types.d.ts.map +0 -1
  398. package/dist/config/types.js +0 -1
  399. package/dist/model/MethodPublicInput.d.ts +0 -51
  400. package/dist/model/MethodPublicInput.d.ts.map +0 -1
  401. package/dist/model/MethodPublicInput.js +0 -11
  402. package/dist/model/transaction/ProtocolTransaction.d.ts +0 -70
  403. package/dist/model/transaction/ProtocolTransaction.d.ts.map +0 -1
  404. package/dist/model/transaction/ProtocolTransaction.js +0 -18
  405. package/dist/prover/block/BlockScopedModule.d.ts +0 -3
  406. package/dist/prover/block/BlockScopedModule.d.ts.map +0 -1
  407. package/dist/prover/block/BlockScopedModule.js +0 -6
  408. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts +0 -16
  409. package/dist/prover/statetransition/StateTransitionWitnessProvider.d.ts.map +0 -1
  410. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts +0 -7
  411. package/dist/prover/statetransition/StateTransitionWitnessProviderReference.d.ts.map +0 -1
  412. package/dist/src/model/Option.d.ts +0 -158
  413. package/dist/src/model/Option.d.ts.map +0 -1
  414. package/dist/src/model/Option.js +0 -53
  415. package/dist/src/model/Path.d.ts +0 -35
  416. package/dist/src/model/Path.d.ts.map +0 -1
  417. package/dist/src/model/Path.js +0 -51
  418. package/dist/src/model/StateTransition.d.ts +0 -201
  419. package/dist/src/model/StateTransition.d.ts.map +0 -1
  420. package/dist/src/model/StateTransition.js +0 -43
  421. package/dist/src/utils/PrefixedHashList.d.ts +0 -15
  422. package/dist/src/utils/PrefixedHashList.d.ts.map +0 -1
  423. package/dist/src/utils/PrefixedHashList.js +0 -28
  424. package/dist/src/utils/ProvableHashList.d.ts +0 -30
  425. package/dist/src/utils/ProvableHashList.d.ts.map +0 -1
  426. package/dist/src/utils/ProvableHashList.js +0 -43
  427. package/dist/utils/PrefixedHashList.d.ts +0 -14
  428. package/dist/utils/PrefixedHashList.d.ts.map +0 -1
  429. package/dist/utils/PrefixedHashList.js +0 -12
  430. package/dist/utils/Utils.d.ts +0 -17
  431. package/dist/utils/Utils.d.ts.map +0 -1
  432. package/dist/utils/Utils.js +0 -64
  433. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts +0 -25
  434. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.d.ts.map +0 -1
  435. package/dist/utils/merkletree/InMemoryMerkleTreeStorage.js +0 -77
  436. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts +0 -26
  437. package/dist/utils/merkletree/MemoryMerkleTreeStorage.d.ts.map +0 -1
  438. package/dist/utils/merkletree/MemoryMerkleTreeStorage.js +0 -79
  439. package/dist/utils/merkletree/MerkleTreeStore.d.ts +0 -11
  440. package/dist/utils/merkletree/MerkleTreeStore.d.ts.map +0 -1
  441. package/dist/utils/merkletree/MerkleTreeStore.js +0 -1
  442. package/dist/utils/merkletree/RollupMerkleTree.d.ts +0 -130
  443. package/dist/utils/merkletree/RollupMerkleTree.d.ts.map +0 -1
  444. package/dist/utils/merkletree/RollupMerkleTree.js +0 -244
  445. package/src/model/Option.test.ts +0 -21
  446. package/src/model/transaction/ProtocolTransaction.ts +0 -25
  447. package/src/prover/statetransition/StateTransitionWitnessProvider.ts +0 -24
  448. package/src/prover/statetransition/StateTransitionWitnessProviderReference.ts +0 -17
  449. package/src/utils/merkletree/InMemoryMerkleTreeStorage.ts +0 -106
  450. package/src/utils/merkletree/MerkleTreeStore.ts +0 -15
  451. package/src/utils/merkletree/RollupMerkleTree.ts +0 -250
  452. package/src/utils/merkletree/VirtualMerkleTreeStore.ts +0 -21
  453. package/tsconfig.test.json +0 -9
@@ -0,0 +1,502 @@
1
+ import {
2
+ prefixToField,
3
+ TypedClass,
4
+ mapSequential,
5
+ ChildVerificationKeyService,
6
+ LinkedMerkleTree,
7
+ } from "@proto-kit/common";
8
+ import {
9
+ AccountUpdate,
10
+ Bool,
11
+ Field,
12
+ method,
13
+ PublicKey,
14
+ Signature,
15
+ SmartContract,
16
+ State,
17
+ state,
18
+ UInt32,
19
+ AccountUpdateForest,
20
+ TokenContractV2,
21
+ PrivateKey,
22
+ VerificationKey,
23
+ Permissions,
24
+ Struct,
25
+ Provable,
26
+ TokenId,
27
+ DynamicProof,
28
+ } from "o1js";
29
+
30
+ import { NetworkState } from "../../model/network/NetworkState";
31
+ import { BlockHashMerkleTree } from "../../prover/block/accummulators/BlockHashMerkleTree";
32
+ import {
33
+ BlockProverPublicInput,
34
+ BlockProverPublicOutput,
35
+ } from "../../prover/block/BlockProvable";
36
+ import {
37
+ ProvableSettlementHook,
38
+ SettlementHookInputs,
39
+ SettlementStateRecord,
40
+ } from "../modularity/ProvableSettlementHook";
41
+
42
+ import { DispatchContractType } from "./DispatchSmartContract";
43
+ import { BridgeContractType } from "./BridgeContract";
44
+ import { TokenBridgeDeploymentAuth } from "./authorizations/TokenBridgeDeploymentAuth";
45
+ import { UpdateMessagesHashAuth } from "./authorizations/UpdateMessagesHashAuth";
46
+
47
+ /* eslint-disable @typescript-eslint/lines-between-class-members */
48
+
49
+ export class DynamicBlockProof extends DynamicProof<
50
+ BlockProverPublicInput,
51
+ BlockProverPublicOutput
52
+ > {
53
+ public static publicInputType = BlockProverPublicInput;
54
+
55
+ public static publicOutputType = BlockProverPublicOutput;
56
+
57
+ public static maxProofsVerified = 2 as const;
58
+ }
59
+
60
+ export class TokenMapping extends Struct({
61
+ tokenId: Field,
62
+ publicKey: PublicKey,
63
+ }) {}
64
+
65
+ export interface SettlementContractType {
66
+ authorizationField: State<Field>;
67
+
68
+ initialize: (
69
+ sequencer: PublicKey,
70
+ dispatchContract: PublicKey,
71
+ bridgeContract: PublicKey,
72
+ contractKey: PrivateKey
73
+ ) => Promise<void>;
74
+ assertStateRoot: (root: Field) => AccountUpdate;
75
+ settle: (
76
+ blockProof: DynamicBlockProof,
77
+ signature: Signature,
78
+ dispatchContractAddress: PublicKey,
79
+ publicKey: PublicKey,
80
+ inputNetworkState: NetworkState,
81
+ outputNetworkState: NetworkState,
82
+ newPromisedMessagesHash: Field
83
+ ) => Promise<void>;
84
+ addTokenBridge: (
85
+ tokenId: Field,
86
+ address: PublicKey,
87
+ dispatchContract: PublicKey
88
+ ) => Promise<void>;
89
+ }
90
+
91
+ // Some random prefix for the sequencer signature
92
+ export const BATCH_SIGNATURE_PREFIX = prefixToField("pk-batchSignature");
93
+
94
+ // @singleton()
95
+ // export class SettlementSmartContractStaticArgs {
96
+ // public args?: {
97
+ // DispatchContract: TypedClass<DispatchContractType & SmartContract>;
98
+ // hooks: ProvableSettlementHook<unknown>[];
99
+ // escapeHatchSlotsInterval: number;
100
+ // BridgeContract: TypedClass<BridgeContractType> & typeof SmartContract;
101
+ // // Lazily initialized
102
+ // BridgeContractVerificationKey: VerificationKey | undefined;
103
+ // BridgeContractPermissions: Permissions | undefined;
104
+ // signedSettlements: boolean | undefined;
105
+ // };
106
+ // }
107
+
108
+ export abstract class SettlementSmartContractBase extends TokenContractV2 {
109
+ // This pattern of injecting args into a smartcontract is currently the only
110
+ // viable solution that works given the inheritance issues of o1js
111
+ // public static args = container.resolve(SettlementSmartContractStaticArgs);
112
+ public static args: {
113
+ DispatchContract: TypedClass<DispatchContractType & SmartContract>;
114
+ hooks: ProvableSettlementHook<unknown>[];
115
+ escapeHatchSlotsInterval: number;
116
+ BridgeContract: TypedClass<BridgeContractType> & typeof SmartContract;
117
+ // Lazily initialized
118
+ BridgeContractVerificationKey: VerificationKey | undefined;
119
+ BridgeContractPermissions: Permissions | undefined;
120
+ signedSettlements: boolean | undefined;
121
+ ChildVerificationKeyService: ChildVerificationKeyService;
122
+ };
123
+
124
+ events = {
125
+ "token-bridge-deployed": TokenMapping,
126
+ };
127
+
128
+ abstract sequencerKey: State<Field>;
129
+ abstract lastSettlementL1BlockHeight: State<UInt32>;
130
+ abstract stateRoot: State<Field>;
131
+ abstract networkStateHash: State<Field>;
132
+ abstract blockHashRoot: State<Field>;
133
+ abstract dispatchContractAddressX: State<Field>;
134
+
135
+ abstract authorizationField: State<Field>;
136
+
137
+ // Not @state
138
+ // abstract offchainStateCommitmentsHash: State<Field>;
139
+
140
+ public assertStateRoot(root: Field): AccountUpdate {
141
+ this.stateRoot.requireEquals(root);
142
+ return this.self;
143
+ }
144
+
145
+ // TODO Like these properties, I am too lazy to properly infer the types here
146
+ private assertLazyConfigsInitialized() {
147
+ const uninitializedProperties: string[] = [];
148
+ const { args } = SettlementSmartContractBase;
149
+ if (args.BridgeContractPermissions === undefined) {
150
+ uninitializedProperties.push("BridgeContractPermissions");
151
+ }
152
+ if (args.signedSettlements === undefined) {
153
+ uninitializedProperties.push("signedSettlements");
154
+ }
155
+ if (uninitializedProperties.length > 0) {
156
+ throw new Error(
157
+ `Lazy configs of SettlementSmartContract haven't been initialized ${uninitializedProperties.reduce(
158
+ (a, b) => `${a},${b}`
159
+ )}`
160
+ );
161
+ }
162
+ }
163
+
164
+ protected async deployTokenBridge(
165
+ tokenId: Field,
166
+ address: PublicKey,
167
+ dispatchContractAddress: PublicKey,
168
+ dispatchContractPreconditionEnforced = false
169
+ ) {
170
+ Provable.asProver(() => {
171
+ this.assertLazyConfigsInitialized();
172
+ });
173
+
174
+ const { args } = SettlementSmartContractBase;
175
+ const BridgeContractClass = args.BridgeContract;
176
+ const bridgeContract = new BridgeContractClass(address, tokenId);
177
+
178
+ const {
179
+ BridgeContractVerificationKey,
180
+ signedSettlements,
181
+ BridgeContractPermissions,
182
+ } = args;
183
+
184
+ if (
185
+ signedSettlements === undefined ||
186
+ BridgeContractPermissions === undefined
187
+ ) {
188
+ throw new Error(
189
+ "Static arguments for SettlementSmartContract not initialized"
190
+ );
191
+ }
192
+
193
+ if (
194
+ BridgeContractVerificationKey !== undefined &&
195
+ !BridgeContractVerificationKey.hash.isConstant()
196
+ ) {
197
+ throw new Error("Bridge contract verification key has to be constants");
198
+ }
199
+
200
+ // This function is not a zkapps method, therefore it will be part of this methods execution
201
+ // The returning account update (owner.self) is therefore part of this circuit and is assertable
202
+ const deploymentAccountUpdate = await bridgeContract.deployProvable(
203
+ args.BridgeContractVerificationKey,
204
+ args.signedSettlements!,
205
+ args.BridgeContractPermissions!,
206
+ this.address
207
+ );
208
+
209
+ this.approve(deploymentAccountUpdate);
210
+
211
+ this.self.body.mayUseToken = {
212
+ // Only set this if we deploy a custom token
213
+ parentsOwnToken: tokenId.equals(TokenId.default).not(),
214
+ inheritFromParent: Bool(false),
215
+ };
216
+
217
+ this.emitEvent(
218
+ "token-bridge-deployed",
219
+ new TokenMapping({
220
+ tokenId: tokenId,
221
+ publicKey: address,
222
+ })
223
+ );
224
+
225
+ // We can't set a precondition twice, for the $mina bridge deployment that
226
+ // would be the case, so we disable it in this case
227
+ if (!dispatchContractPreconditionEnforced) {
228
+ this.dispatchContractAddressX.requireEquals(dispatchContractAddress.x);
229
+ }
230
+
231
+ // Set authorization for the auth callback, that we need
232
+ this.authorizationField.set(
233
+ new TokenBridgeDeploymentAuth({
234
+ target: dispatchContractAddress,
235
+ tokenId,
236
+ address,
237
+ }).hash()
238
+ );
239
+ const dispatchContract =
240
+ new SettlementSmartContractBase.args.DispatchContract(
241
+ dispatchContractAddress
242
+ );
243
+ await dispatchContract.enableTokenDeposits(tokenId, address, this.address);
244
+ }
245
+
246
+ protected async initializeBase(
247
+ sequencer: PublicKey,
248
+ dispatchContract: PublicKey,
249
+ bridgeContract: PublicKey,
250
+ contractKey: PrivateKey
251
+ ) {
252
+ this.sequencerKey.getAndRequireEquals().assertEquals(Field(0));
253
+ this.stateRoot.getAndRequireEquals().assertEquals(Field(0));
254
+ this.blockHashRoot.getAndRequireEquals().assertEquals(Field(0));
255
+ this.networkStateHash.getAndRequireEquals().assertEquals(Field(0));
256
+ this.dispatchContractAddressX.getAndRequireEquals().assertEquals(Field(0));
257
+
258
+ this.sequencerKey.set(sequencer.x);
259
+ this.stateRoot.set(LinkedMerkleTree.EMPTY_ROOT);
260
+ this.blockHashRoot.set(Field(BlockHashMerkleTree.EMPTY_ROOT));
261
+ this.networkStateHash.set(NetworkState.empty().hash());
262
+ this.dispatchContractAddressX.set(dispatchContract.x);
263
+
264
+ const { DispatchContract } = SettlementSmartContractBase.args;
265
+ const contractInstance = new DispatchContract(dispatchContract);
266
+ await contractInstance.initialize(this.address);
267
+
268
+ // Deploy bridge contract for $Mina
269
+ await this.deployTokenBridge(
270
+ this.tokenId,
271
+ bridgeContract,
272
+ dispatchContract,
273
+ true
274
+ );
275
+
276
+ contractKey.toPublicKey().assertEquals(this.address);
277
+ }
278
+
279
+ protected async settleBase(
280
+ blockProof: DynamicBlockProof,
281
+ signature: Signature,
282
+ dispatchContractAddress: PublicKey,
283
+ publicKey: PublicKey,
284
+ inputNetworkState: NetworkState,
285
+ outputNetworkState: NetworkState,
286
+ newPromisedMessagesHash: Field
287
+ ) {
288
+ // Brought in as a constant
289
+ const blockProofVk =
290
+ SettlementSmartContractBase.args.ChildVerificationKeyService.getVerificationKey(
291
+ "BlockProver"
292
+ );
293
+ if (!blockProofVk.hash.isConstant()) {
294
+ throw new Error("Sanity check - vk hash has to be constant");
295
+ }
296
+
297
+ // Verify the blockproof
298
+ blockProof.verify(blockProofVk);
299
+
300
+ // Get and assert on-chain values
301
+ const stateRoot = this.stateRoot.getAndRequireEquals();
302
+ const networkStateHash = this.networkStateHash.getAndRequireEquals();
303
+ const blockHashRoot = this.blockHashRoot.getAndRequireEquals();
304
+ const sequencerKey = this.sequencerKey.getAndRequireEquals();
305
+ const lastSettlementL1BlockHeight =
306
+ this.lastSettlementL1BlockHeight.getAndRequireEquals();
307
+ const onChainDispatchContractAddressX =
308
+ this.dispatchContractAddressX.getAndRequireEquals();
309
+
310
+ onChainDispatchContractAddressX.assertEquals(
311
+ dispatchContractAddress.x,
312
+ "DispatchContract address not provided correctly"
313
+ );
314
+
315
+ const { DispatchContract, escapeHatchSlotsInterval, hooks } =
316
+ SettlementSmartContractBase.args;
317
+
318
+ // Get dispatch contract values
319
+ // These values are witnesses but will be checked later on the AU
320
+ // call to the dispatch contract via .updateMessagesHash()
321
+ const dispatchContract = new DispatchContract(dispatchContractAddress);
322
+ const promisedMessagesHash = dispatchContract.promisedMessagesHash.get();
323
+
324
+ // Get block height and use the lower bound for all ops
325
+ const minBlockHeightIncluded = this.network.blockchainLength.get();
326
+ this.network.blockchainLength.requireBetween(
327
+ minBlockHeightIncluded,
328
+ // 5 because that is the length the newPromisedMessagesHash will be valid
329
+ minBlockHeightIncluded.add(4)
330
+ );
331
+
332
+ // Check signature/escape catch
333
+ publicKey.x.assertEquals(
334
+ sequencerKey,
335
+ "Sequencer public key witness not matching"
336
+ );
337
+ const signatureValid = signature.verify(publicKey, [
338
+ BATCH_SIGNATURE_PREFIX,
339
+ lastSettlementL1BlockHeight.value,
340
+ ]);
341
+ const escapeHatchActivated = lastSettlementL1BlockHeight
342
+ .add(UInt32.from(escapeHatchSlotsInterval))
343
+ .lessThan(minBlockHeightIncluded);
344
+ signatureValid
345
+ .or(escapeHatchActivated)
346
+ .assertTrue(
347
+ "Sequencer signature not valid and escape hatch not activated"
348
+ );
349
+
350
+ // Assert correctness of networkState witness
351
+ inputNetworkState
352
+ .hash()
353
+ .assertEquals(networkStateHash, "InputNetworkState witness not valid");
354
+ outputNetworkState
355
+ .hash()
356
+ .assertEquals(
357
+ blockProof.publicOutput.networkStateHash,
358
+ "OutputNetworkState witness not valid"
359
+ );
360
+
361
+ blockProof.publicOutput.closed.assertEquals(
362
+ Bool(true),
363
+ "Supplied proof is not a closed BlockProof"
364
+ );
365
+ blockProof.publicOutput.pendingSTBatchesHash.assertEquals(
366
+ Field(0),
367
+ "Supplied proof is has outstanding STs to be proven"
368
+ );
369
+
370
+ // Execute onSettlementHooks for additional checks
371
+ const stateRecord: SettlementStateRecord = {
372
+ blockHashRoot,
373
+ stateRoot,
374
+ networkStateHash,
375
+ lastSettlementL1BlockHeight,
376
+ sequencerKey: publicKey,
377
+ };
378
+ const inputs: SettlementHookInputs = {
379
+ blockProof,
380
+ contractState: stateRecord,
381
+ newPromisedMessagesHash,
382
+ fromNetworkState: inputNetworkState,
383
+ toNetworkState: outputNetworkState,
384
+ currentL1BlockHeight: minBlockHeightIncluded,
385
+ };
386
+ await mapSequential(hooks, async (hook) => {
387
+ await hook.beforeSettlement(this, inputs);
388
+ });
389
+
390
+ // Apply blockProof
391
+ stateRoot.assertEquals(
392
+ blockProof.publicInput.stateRoot,
393
+ "Input state root not matching"
394
+ );
395
+
396
+ networkStateHash.assertEquals(
397
+ blockProof.publicInput.networkStateHash,
398
+ "Input networkStateHash not matching"
399
+ );
400
+ blockHashRoot.assertEquals(
401
+ blockProof.publicInput.blockHashRoot,
402
+ "Input blockHashRoot not matching"
403
+ );
404
+ this.stateRoot.set(blockProof.publicOutput.stateRoot);
405
+ this.networkStateHash.set(blockProof.publicOutput.networkStateHash);
406
+ this.blockHashRoot.set(blockProof.publicOutput.blockHashRoot);
407
+
408
+ // Assert and apply deposit commitments
409
+ promisedMessagesHash.assertEquals(
410
+ blockProof.publicOutput.incomingMessagesHash,
411
+ "Promised messages not honored"
412
+ );
413
+
414
+ // Set authorization for the dispatchContract to verify the messages hash update
415
+ this.authorizationField.set(
416
+ new UpdateMessagesHashAuth({
417
+ target: dispatchContract.address,
418
+ executedMessagesHash: promisedMessagesHash,
419
+ newPromisedMessagesHash,
420
+ }).hash()
421
+ );
422
+
423
+ // Call DispatchContract
424
+ // This call checks that the promisedMessagesHash, which is already proven
425
+ // to be the blockProofs publicoutput, is actually the current on-chain
426
+ // promisedMessageHash. It also checks the newPromisedMessagesHash to be
427
+ // a current sequencestate value
428
+ await dispatchContract.updateMessagesHash(
429
+ promisedMessagesHash,
430
+ newPromisedMessagesHash
431
+ );
432
+
433
+ this.lastSettlementL1BlockHeight.set(minBlockHeightIncluded);
434
+ }
435
+ }
436
+
437
+ export class SettlementSmartContract
438
+ extends SettlementSmartContractBase
439
+ implements SettlementContractType
440
+ {
441
+ @state(Field) public sequencerKey = State<Field>();
442
+ @state(UInt32) public lastSettlementL1BlockHeight = State<UInt32>();
443
+
444
+ @state(Field) public stateRoot = State<Field>();
445
+ @state(Field) public networkStateHash = State<Field>();
446
+ @state(Field) public blockHashRoot = State<Field>();
447
+
448
+ @state(Field) public dispatchContractAddressX = State<Field>();
449
+
450
+ @state(Field) public authorizationField = State<Field>();
451
+
452
+ @method async approveBase(forest: AccountUpdateForest) {
453
+ this.checkZeroBalanceChange(forest);
454
+ }
455
+
456
+ @method
457
+ public async initialize(
458
+ sequencer: PublicKey,
459
+ dispatchContract: PublicKey,
460
+ bridgeContract: PublicKey,
461
+ contractKey: PrivateKey
462
+ ) {
463
+ await this.initializeBase(
464
+ sequencer,
465
+ dispatchContract,
466
+ bridgeContract,
467
+ contractKey
468
+ );
469
+ }
470
+
471
+ @method
472
+ public async addTokenBridge(
473
+ tokenId: Field,
474
+ address: PublicKey,
475
+ dispatchContract: PublicKey
476
+ ) {
477
+ await this.deployTokenBridge(tokenId, address, dispatchContract);
478
+ }
479
+
480
+ @method
481
+ public async settle(
482
+ blockProof: DynamicBlockProof,
483
+ signature: Signature,
484
+ dispatchContractAddress: PublicKey,
485
+ publicKey: PublicKey,
486
+ inputNetworkState: NetworkState,
487
+ outputNetworkState: NetworkState,
488
+ newPromisedMessagesHash: Field
489
+ ) {
490
+ return await this.settleBase(
491
+ blockProof,
492
+ signature,
493
+ dispatchContractAddress,
494
+ publicKey,
495
+ inputNetworkState,
496
+ outputNetworkState,
497
+ newPromisedMessagesHash
498
+ );
499
+ }
500
+ }
501
+
502
+ /* eslint-enable @typescript-eslint/lines-between-class-members */
@@ -0,0 +1,73 @@
1
+ import {
2
+ createMerkleTree,
3
+ InMemoryMerkleTreeStorage,
4
+ log,
5
+ } from "@proto-kit/common";
6
+ import { Field, Poseidon, PublicKey, SmartContract, Struct } from "o1js";
7
+
8
+ /**
9
+ * Merkle tree that contains all the deployed token bridges as a mapping of
10
+ * tokenId => PublicKey
11
+ *
12
+ * It should be used as an append-only tree with incremental indizes - this allows
13
+ * us to reduce the height of it
14
+ */
15
+ export class TokenBridgeTree extends createMerkleTree(256) {
16
+ public indizes: Record<string, bigint> = {};
17
+
18
+ /**
19
+ * Initializes and fills the tree based on all on-chain events that have been
20
+ * emitted by every emit
21
+ */
22
+ public static async buildTreeFromEvents(
23
+ contract: SmartContract & {
24
+ events: { "token-bridge-added": typeof TokenBridgeTreeAddition };
25
+ }
26
+ ) {
27
+ const events = await contract.fetchEvents();
28
+
29
+ log.debug(`Found ${events.length} token bridge add events`);
30
+
31
+ const tree = new TokenBridgeTree(new InMemoryMerkleTreeStorage());
32
+ const indizes: Record<string, bigint> = {};
33
+
34
+ events.forEach(({ type, event }) => {
35
+ if (type === "token-bridge-added") {
36
+ const addition =
37
+ // eslint-disable-next-line @typescript-eslint/consistent-type-assertions
38
+ event.data as unknown as TokenBridgeTreeAddition;
39
+
40
+ tree.setLeaf(addition.index.toBigInt(), addition.value.hash());
41
+
42
+ indizes[addition.value.tokenId.toString()] = addition.index.toBigInt();
43
+ }
44
+ });
45
+ tree.indizes = indizes;
46
+ return tree;
47
+ }
48
+
49
+ public getIndex(tokenId: Field): bigint {
50
+ return this.indizes[tokenId.toString()];
51
+ }
52
+ }
53
+
54
+ export class TokenBridgeTreeWitness extends TokenBridgeTree.WITNESS {}
55
+
56
+ export class TokenBridgeEntry extends Struct({
57
+ address: PublicKey,
58
+ tokenId: Field,
59
+ }) {
60
+ public hash() {
61
+ return Poseidon.hash(TokenBridgeEntry.toFields(this));
62
+ }
63
+ }
64
+
65
+ export class TokenBridgeAttestation extends Struct({
66
+ witness: TokenBridgeTreeWitness,
67
+ index: Field,
68
+ }) {}
69
+
70
+ export class TokenBridgeTreeAddition extends Struct({
71
+ index: Field,
72
+ value: TokenBridgeEntry,
73
+ }) {}
@@ -0,0 +1,11 @@
1
+ import { Field, PublicKey } from "o1js";
2
+
3
+ /**
4
+ * Interface for cross-contract call authorization
5
+ * See https://github.com/proto-kit/framework/issues/202#issuecomment-2407263173
6
+ */
7
+ export interface ContractAuthorization {
8
+ target: PublicKey;
9
+
10
+ hash: () => Field;
11
+ }
@@ -0,0 +1,16 @@
1
+ import { Field, Poseidon, PublicKey, Struct } from "o1js";
2
+
3
+ import { ContractAuthorization } from "./ContractAuthorization";
4
+
5
+ export class TokenBridgeDeploymentAuth
6
+ extends Struct({
7
+ target: PublicKey,
8
+ tokenId: Field,
9
+ address: PublicKey,
10
+ })
11
+ implements ContractAuthorization
12
+ {
13
+ public hash() {
14
+ return Poseidon.hash(TokenBridgeDeploymentAuth.toFields(this));
15
+ }
16
+ }
@@ -0,0 +1,16 @@
1
+ import { Field, Poseidon, PublicKey, Struct } from "o1js";
2
+
3
+ import { ContractAuthorization } from "./ContractAuthorization";
4
+
5
+ export class UpdateMessagesHashAuth
6
+ extends Struct({
7
+ target: PublicKey,
8
+ executedMessagesHash: Field,
9
+ newPromisedMessagesHash: Field,
10
+ })
11
+ implements ContractAuthorization
12
+ {
13
+ public hash() {
14
+ return Poseidon.hash(UpdateMessagesHashAuth.toFields(this));
15
+ }
16
+ }
@@ -0,0 +1,7 @@
1
+ import { Field, PublicKey, Struct, UInt64 } from "o1js";
2
+
3
+ export class Deposit extends Struct({
4
+ tokenId: Field,
5
+ address: PublicKey,
6
+ amount: UInt64,
7
+ }) {}
@@ -0,0 +1,17 @@
1
+ import { Field, Struct } from "o1js";
2
+
3
+ export class OutgoingMessageKeyStruct extends Struct({
4
+ index: Field,
5
+ tokenId: Field,
6
+ }) {}
7
+
8
+ export type OutgoingMessageEvent<T> = {
9
+ key: OutgoingMessageKeyStruct;
10
+ value: T;
11
+ messageType: Field;
12
+ };
13
+
14
+ export type OutgoingMessage<T> = {
15
+ value: T;
16
+ messageType: Field;
17
+ };
@@ -0,0 +1,53 @@
1
+ import { Bool, Field, FlexibleProvablePure, Provable, Struct } from "o1js";
2
+ import {
3
+ LinkedMerkleTree,
4
+ LinkedMerkleTreeReadWitness,
5
+ } from "@proto-kit/common";
6
+
7
+ import { OutgoingMessage } from "./OutgoingMessage";
8
+
9
+ // TODO Make that dynamic based on processors configured
10
+ export const OUTGOING_MESSAGE_BATCH_SIZE = 1;
11
+
12
+ export function createMessageStruct<T>(type: FlexibleProvablePure<T>) {
13
+ return class MessageStruct extends Struct({
14
+ value: type,
15
+ messageType: Field,
16
+ }) {} satisfies FlexibleProvablePure<OutgoingMessage<T>>;
17
+ }
18
+
19
+ export class OutgoingMessageArgument extends Struct({
20
+ witness: LinkedMerkleTreeReadWitness,
21
+ messageType: Field,
22
+ }) {
23
+ public static dummy(): OutgoingMessageArgument {
24
+ return new OutgoingMessageArgument({
25
+ witness: LinkedMerkleTree.dummyReadWitness(),
26
+ messageType: Field(0),
27
+ });
28
+ }
29
+ }
30
+
31
+ export class OutgoingMessageArgumentBatch extends Struct({
32
+ arguments: Provable.Array(
33
+ OutgoingMessageArgument,
34
+ OUTGOING_MESSAGE_BATCH_SIZE
35
+ ),
36
+
37
+ isDummys: Provable.Array(Bool, OUTGOING_MESSAGE_BATCH_SIZE),
38
+ }) {
39
+ public static fromMessages(providedArguments: OutgoingMessageArgument[]) {
40
+ const batch = providedArguments.slice();
41
+ const isDummys = batch.map(() => Bool(false));
42
+
43
+ while (batch.length < OUTGOING_MESSAGE_BATCH_SIZE) {
44
+ batch.push(OutgoingMessageArgument.dummy());
45
+ isDummys.push(Bool(true));
46
+ }
47
+
48
+ return new OutgoingMessageArgumentBatch({
49
+ arguments: batch,
50
+ isDummys,
51
+ });
52
+ }
53
+ }