@proto-kit/protocol 0.1.1-develop.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (333) hide show
  1. package/LICENSE.md +201 -0
  2. package/README.md +45 -0
  3. package/dist/Constants.d.ts +4 -0
  4. package/dist/Constants.d.ts.map +1 -0
  5. package/dist/Constants.js +4 -0
  6. package/dist/Constants.js.map +1 -0
  7. package/dist/hooks/AccountStateHook.d.ts +52 -0
  8. package/dist/hooks/AccountStateHook.d.ts.map +1 -0
  9. package/dist/hooks/AccountStateHook.js +48 -0
  10. package/dist/hooks/AccountStateHook.js.map +1 -0
  11. package/dist/hooks/BlockHeightHook.d.ts +7 -0
  12. package/dist/hooks/BlockHeightHook.d.ts.map +1 -0
  13. package/dist/hooks/BlockHeightHook.js +16 -0
  14. package/dist/hooks/BlockHeightHook.js.map +1 -0
  15. package/dist/hooks/LastStateRootBlockHook.d.ts +8 -0
  16. package/dist/hooks/LastStateRootBlockHook.d.ts.map +1 -0
  17. package/dist/hooks/LastStateRootBlockHook.js +16 -0
  18. package/dist/hooks/LastStateRootBlockHook.js.map +1 -0
  19. package/dist/hooks/NoopBlockHook.d.ts +9 -0
  20. package/dist/hooks/NoopBlockHook.d.ts.map +1 -0
  21. package/dist/hooks/NoopBlockHook.js +10 -0
  22. package/dist/hooks/NoopBlockHook.js.map +1 -0
  23. package/dist/hooks/NoopSettlementHook.d.ts +6 -0
  24. package/dist/hooks/NoopSettlementHook.d.ts.map +1 -0
  25. package/dist/hooks/NoopSettlementHook.js +18 -0
  26. package/dist/hooks/NoopSettlementHook.js.map +1 -0
  27. package/dist/hooks/NoopTransactionHook.d.ts +6 -0
  28. package/dist/hooks/NoopTransactionHook.d.ts.map +1 -0
  29. package/dist/hooks/NoopTransactionHook.js +8 -0
  30. package/dist/hooks/NoopTransactionHook.js.map +1 -0
  31. package/dist/index.d.ts +58 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +58 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/model/MethodPublicOutput.d.ts +113 -0
  36. package/dist/model/MethodPublicOutput.d.ts.map +1 -0
  37. package/dist/model/MethodPublicOutput.js +15 -0
  38. package/dist/model/MethodPublicOutput.js.map +1 -0
  39. package/dist/model/Option.d.ts +122 -0
  40. package/dist/model/Option.d.ts.map +1 -0
  41. package/dist/model/Option.js +111 -0
  42. package/dist/model/Option.js.map +1 -0
  43. package/dist/model/Path.d.ts +31 -0
  44. package/dist/model/Path.d.ts.map +1 -0
  45. package/dist/model/Path.js +43 -0
  46. package/dist/model/Path.js.map +1 -0
  47. package/dist/model/RuntimeLike.d.ts +11 -0
  48. package/dist/model/RuntimeLike.d.ts.map +1 -0
  49. package/dist/model/RuntimeLike.js +2 -0
  50. package/dist/model/RuntimeLike.js.map +1 -0
  51. package/dist/model/StateTransition.d.ts +135 -0
  52. package/dist/model/StateTransition.d.ts.map +1 -0
  53. package/dist/model/StateTransition.js +69 -0
  54. package/dist/model/StateTransition.js.map +1 -0
  55. package/dist/model/StateTransitionProvableBatch.d.ts +198 -0
  56. package/dist/model/StateTransitionProvableBatch.d.ts.map +1 -0
  57. package/dist/model/StateTransitionProvableBatch.js +91 -0
  58. package/dist/model/StateTransitionProvableBatch.js.map +1 -0
  59. package/dist/model/network/NetworkState.d.ts +160 -0
  60. package/dist/model/network/NetworkState.d.ts.map +1 -0
  61. package/dist/model/network/NetworkState.js +32 -0
  62. package/dist/model/network/NetworkState.js.map +1 -0
  63. package/dist/model/transaction/RuntimeTransaction.d.ts +122 -0
  64. package/dist/model/transaction/RuntimeTransaction.d.ts.map +1 -0
  65. package/dist/model/transaction/RuntimeTransaction.js +87 -0
  66. package/dist/model/transaction/RuntimeTransaction.js.map +1 -0
  67. package/dist/model/transaction/SignedTransaction.d.ts +107 -0
  68. package/dist/model/transaction/SignedTransaction.d.ts.map +1 -0
  69. package/dist/model/transaction/SignedTransaction.js +34 -0
  70. package/dist/model/transaction/SignedTransaction.js.map +1 -0
  71. package/dist/model/transaction/ValueOption.d.ts +173 -0
  72. package/dist/model/transaction/ValueOption.d.ts.map +1 -0
  73. package/dist/model/transaction/ValueOption.js +25 -0
  74. package/dist/model/transaction/ValueOption.js.map +1 -0
  75. package/dist/protocol/Protocol.d.ts +43 -0
  76. package/dist/protocol/Protocol.d.ts.map +1 -0
  77. package/dist/protocol/Protocol.js +120 -0
  78. package/dist/protocol/Protocol.js.map +1 -0
  79. package/dist/protocol/ProtocolEnvironment.d.ts +9 -0
  80. package/dist/protocol/ProtocolEnvironment.d.ts.map +1 -0
  81. package/dist/protocol/ProtocolEnvironment.js +2 -0
  82. package/dist/protocol/ProtocolEnvironment.js.map +1 -0
  83. package/dist/protocol/ProtocolModule.d.ts +9 -0
  84. package/dist/protocol/ProtocolModule.d.ts.map +1 -0
  85. package/dist/protocol/ProtocolModule.js +13 -0
  86. package/dist/protocol/ProtocolModule.js.map +1 -0
  87. package/dist/protocol/ProvableBlockHook.d.ts +8 -0
  88. package/dist/protocol/ProvableBlockHook.d.ts.map +1 -0
  89. package/dist/protocol/ProvableBlockHook.js +5 -0
  90. package/dist/protocol/ProvableBlockHook.js.map +1 -0
  91. package/dist/protocol/ProvableTransactionHook.d.ts +7 -0
  92. package/dist/protocol/ProvableTransactionHook.d.ts.map +1 -0
  93. package/dist/protocol/ProvableTransactionHook.js +4 -0
  94. package/dist/protocol/ProvableTransactionHook.js.map +1 -0
  95. package/dist/protocol/TransitioningProtocolModule.d.ts +10 -0
  96. package/dist/protocol/TransitioningProtocolModule.d.ts.map +1 -0
  97. package/dist/protocol/TransitioningProtocolModule.js +9 -0
  98. package/dist/protocol/TransitioningProtocolModule.js.map +1 -0
  99. package/dist/prover/block/BlockProvable.d.ts +409 -0
  100. package/dist/prover/block/BlockProvable.d.ts.map +1 -0
  101. package/dist/prover/block/BlockProvable.js +48 -0
  102. package/dist/prover/block/BlockProvable.js.map +1 -0
  103. package/dist/prover/block/BlockProver.d.ts +94 -0
  104. package/dist/prover/block/BlockProver.d.ts.map +1 -0
  105. package/dist/prover/block/BlockProver.js +510 -0
  106. package/dist/prover/block/BlockProver.js.map +1 -0
  107. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts +64 -0
  108. package/dist/prover/block/accummulators/BlockHashMerkleTree.d.ts.map +1 -0
  109. package/dist/prover/block/accummulators/BlockHashMerkleTree.js +17 -0
  110. package/dist/prover/block/accummulators/BlockHashMerkleTree.js.map +1 -0
  111. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts +139 -0
  112. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.d.ts.map +1 -0
  113. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js +21 -0
  114. package/dist/prover/block/accummulators/RuntimeVerificationKeyTree.js.map +1 -0
  115. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts +7 -0
  116. package/dist/prover/block/services/RuntimeVerificationKeyRootService.d.ts.map +1 -0
  117. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js +23 -0
  118. package/dist/prover/block/services/RuntimeVerificationKeyRootService.js.map +1 -0
  119. package/dist/prover/statetransition/StateTransitionProvable.d.ts +172 -0
  120. package/dist/prover/statetransition/StateTransitionProvable.d.ts.map +1 -0
  121. package/dist/prover/statetransition/StateTransitionProvable.js +16 -0
  122. package/dist/prover/statetransition/StateTransitionProvable.js.map +1 -0
  123. package/dist/prover/statetransition/StateTransitionProver.d.ts +48 -0
  124. package/dist/prover/statetransition/StateTransitionProver.d.ts.map +1 -0
  125. package/dist/prover/statetransition/StateTransitionProver.js +187 -0
  126. package/dist/prover/statetransition/StateTransitionProver.js.map +1 -0
  127. package/dist/settlement/ContractModule.d.ts +16 -0
  128. package/dist/settlement/ContractModule.d.ts.map +1 -0
  129. package/dist/settlement/ContractModule.js +12 -0
  130. package/dist/settlement/ContractModule.js.map +1 -0
  131. package/dist/settlement/SettlementContractModule.d.ts +53 -0
  132. package/dist/settlement/SettlementContractModule.d.ts.map +1 -0
  133. package/dist/settlement/SettlementContractModule.js +80 -0
  134. package/dist/settlement/SettlementContractModule.js.map +1 -0
  135. package/dist/settlement/contracts/BridgeContract.d.ts +97 -0
  136. package/dist/settlement/contracts/BridgeContract.d.ts.map +1 -0
  137. package/dist/settlement/contracts/BridgeContract.js +164 -0
  138. package/dist/settlement/contracts/BridgeContract.js.map +1 -0
  139. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts +14 -0
  140. package/dist/settlement/contracts/BridgeContractProtocolModule.d.ts.map +1 -0
  141. package/dist/settlement/contracts/BridgeContractProtocolModule.js +30 -0
  142. package/dist/settlement/contracts/BridgeContractProtocolModule.js.map +1 -0
  143. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts +21 -0
  144. package/dist/settlement/contracts/DispatchContractProtocolModule.d.ts.map +1 -0
  145. package/dist/settlement/contracts/DispatchContractProtocolModule.js +57 -0
  146. package/dist/settlement/contracts/DispatchContractProtocolModule.js.map +1 -0
  147. package/dist/settlement/contracts/DispatchSmartContract.d.ts +44 -0
  148. package/dist/settlement/contracts/DispatchSmartContract.d.ts.map +1 -0
  149. package/dist/settlement/contracts/DispatchSmartContract.js +230 -0
  150. package/dist/settlement/contracts/DispatchSmartContract.js.map +1 -0
  151. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts +21 -0
  152. package/dist/settlement/contracts/SettlementContractProtocolModule.d.ts.map +1 -0
  153. package/dist/settlement/contracts/SettlementContractProtocolModule.js +82 -0
  154. package/dist/settlement/contracts/SettlementContractProtocolModule.js.map +1 -0
  155. package/dist/settlement/contracts/SettlementSmartContract.d.ts +123 -0
  156. package/dist/settlement/contracts/SettlementSmartContract.d.ts.map +1 -0
  157. package/dist/settlement/contracts/SettlementSmartContract.js +309 -0
  158. package/dist/settlement/contracts/SettlementSmartContract.js.map +1 -0
  159. package/dist/settlement/contracts/TokenBridgeTree.d.ts +228 -0
  160. package/dist/settlement/contracts/TokenBridgeTree.d.ts.map +1 -0
  161. package/dist/settlement/contracts/TokenBridgeTree.js +60 -0
  162. package/dist/settlement/contracts/TokenBridgeTree.js.map +1 -0
  163. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts +10 -0
  164. package/dist/settlement/contracts/authorizations/ContractAuthorization.d.ts.map +1 -0
  165. package/dist/settlement/contracts/authorizations/ContractAuthorization.js +2 -0
  166. package/dist/settlement/contracts/authorizations/ContractAuthorization.js.map +1 -0
  167. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts +85 -0
  168. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.d.ts.map +1 -0
  169. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js +11 -0
  170. package/dist/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.js.map +1 -0
  171. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts +79 -0
  172. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.d.ts.map +1 -0
  173. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js +11 -0
  174. package/dist/settlement/contracts/authorizations/UpdateMessagesHashAuth.js.map +1 -0
  175. package/dist/settlement/messages/Deposit.d.ts +77 -0
  176. package/dist/settlement/messages/Deposit.d.ts.map +1 -0
  177. package/dist/settlement/messages/Deposit.js +8 -0
  178. package/dist/settlement/messages/Deposit.js.map +1 -0
  179. package/dist/settlement/messages/OutgoingMessageArgument.d.ts +197 -0
  180. package/dist/settlement/messages/OutgoingMessageArgument.d.ts.map +1 -0
  181. package/dist/settlement/messages/OutgoingMessageArgument.js +33 -0
  182. package/dist/settlement/messages/OutgoingMessageArgument.js.map +1 -0
  183. package/dist/settlement/messages/Withdrawal.d.ts +78 -0
  184. package/dist/settlement/messages/Withdrawal.d.ts.map +1 -0
  185. package/dist/settlement/messages/Withdrawal.js +16 -0
  186. package/dist/settlement/messages/Withdrawal.js.map +1 -0
  187. package/dist/settlement/modularity/ProvableSettlementHook.d.ts +26 -0
  188. package/dist/settlement/modularity/ProvableSettlementHook.d.ts.map +1 -0
  189. package/dist/settlement/modularity/ProvableSettlementHook.js +4 -0
  190. package/dist/settlement/modularity/ProvableSettlementHook.js.map +1 -0
  191. package/dist/settlement/modularity/types.d.ts +8 -0
  192. package/dist/settlement/modularity/types.d.ts.map +1 -0
  193. package/dist/settlement/modularity/types.js +2 -0
  194. package/dist/settlement/modularity/types.js.map +1 -0
  195. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts +11 -0
  196. package/dist/settlement/modules/NetworkStateSettlementModule.d.ts.map +1 -0
  197. package/dist/settlement/modules/NetworkStateSettlementModule.js +15 -0
  198. package/dist/settlement/modules/NetworkStateSettlementModule.js.map +1 -0
  199. package/dist/state/State.d.ts +68 -0
  200. package/dist/state/State.d.ts.map +1 -0
  201. package/dist/state/State.js +130 -0
  202. package/dist/state/State.js.map +1 -0
  203. package/dist/state/StateMap.d.ts +37 -0
  204. package/dist/state/StateMap.d.ts.map +1 -0
  205. package/dist/state/StateMap.js +56 -0
  206. package/dist/state/StateMap.js.map +1 -0
  207. package/dist/state/StateService.d.ts +6 -0
  208. package/dist/state/StateService.d.ts.map +1 -0
  209. package/dist/state/StateService.js +2 -0
  210. package/dist/state/StateService.js.map +1 -0
  211. package/dist/state/StateServiceProvider.d.ts +8 -0
  212. package/dist/state/StateServiceProvider.d.ts.map +1 -0
  213. package/dist/state/StateServiceProvider.js +37 -0
  214. package/dist/state/StateServiceProvider.js.map +1 -0
  215. package/dist/state/assert/assert.d.ts +12 -0
  216. package/dist/state/assert/assert.d.ts.map +1 -0
  217. package/dist/state/assert/assert.js +31 -0
  218. package/dist/state/assert/assert.js.map +1 -0
  219. package/dist/state/context/RuntimeMethodExecutionContext.d.ts +193 -0
  220. package/dist/state/context/RuntimeMethodExecutionContext.d.ts.map +1 -0
  221. package/dist/state/context/RuntimeMethodExecutionContext.js +136 -0
  222. package/dist/state/context/RuntimeMethodExecutionContext.js.map +1 -0
  223. package/dist/state/context/TransitionMethodExecutionContext.d.ts +23 -0
  224. package/dist/state/context/TransitionMethodExecutionContext.d.ts.map +1 -0
  225. package/dist/state/context/TransitionMethodExecutionContext.js +6 -0
  226. package/dist/state/context/TransitionMethodExecutionContext.js.map +1 -0
  227. package/dist/state/protocol/ProtocolState.d.ts +7 -0
  228. package/dist/state/protocol/ProtocolState.d.ts.map +1 -0
  229. package/dist/state/protocol/ProtocolState.js +40 -0
  230. package/dist/state/protocol/ProtocolState.js.map +1 -0
  231. package/dist/utils/MinaPrefixedProvableHashList.d.ts +24 -0
  232. package/dist/utils/MinaPrefixedProvableHashList.d.ts.map +1 -0
  233. package/dist/utils/MinaPrefixedProvableHashList.js +53 -0
  234. package/dist/utils/MinaPrefixedProvableHashList.js.map +1 -0
  235. package/dist/utils/PrefixedProvableHashList.d.ts +8 -0
  236. package/dist/utils/PrefixedProvableHashList.d.ts.map +1 -0
  237. package/dist/utils/PrefixedProvableHashList.js +13 -0
  238. package/dist/utils/PrefixedProvableHashList.js.map +1 -0
  239. package/dist/utils/ProvableHashList.d.ts +27 -0
  240. package/dist/utils/ProvableHashList.d.ts.map +1 -0
  241. package/dist/utils/ProvableHashList.js +44 -0
  242. package/dist/utils/ProvableHashList.js.map +1 -0
  243. package/dist/utils/ProvableReductionHashList.d.ts +14 -0
  244. package/dist/utils/ProvableReductionHashList.d.ts.map +1 -0
  245. package/dist/utils/ProvableReductionHashList.js +51 -0
  246. package/dist/utils/ProvableReductionHashList.js.map +1 -0
  247. package/dist/utils/StateTransitionReductionList.d.ts +11 -0
  248. package/dist/utils/StateTransitionReductionList.d.ts.map +1 -0
  249. package/dist/utils/StateTransitionReductionList.js +61 -0
  250. package/dist/utils/StateTransitionReductionList.js.map +1 -0
  251. package/dist/utils/utils.d.ts +11 -0
  252. package/dist/utils/utils.d.ts.map +1 -0
  253. package/dist/utils/utils.js +45 -0
  254. package/dist/utils/utils.js.map +1 -0
  255. package/jest.config.cjs +12 -0
  256. package/package.json +36 -0
  257. package/src/Constants.ts +3 -0
  258. package/src/hooks/AccountStateHook.ts +48 -0
  259. package/src/hooks/BlockHeightHook.ts +17 -0
  260. package/src/hooks/LastStateRootBlockHook.ts +26 -0
  261. package/src/hooks/NoopBlockHook.ts +21 -0
  262. package/src/hooks/NoopSettlementHook.ts +20 -0
  263. package/src/hooks/NoopTransactionHook.ts +10 -0
  264. package/src/index.ts +57 -0
  265. package/src/model/MethodPublicOutput.ts +14 -0
  266. package/src/model/Option.ts +172 -0
  267. package/src/model/Path.ts +50 -0
  268. package/src/model/RuntimeLike.ts +12 -0
  269. package/src/model/StateTransition.ts +88 -0
  270. package/src/model/StateTransitionProvableBatch.ts +145 -0
  271. package/src/model/Transaction.ts +31 -0
  272. package/src/model/network/NetworkState.ts +33 -0
  273. package/src/model/transaction/RuntimeTransaction.ts +105 -0
  274. package/src/model/transaction/SignedTransaction.ts +47 -0
  275. package/src/model/transaction/ValueOption.ts +28 -0
  276. package/src/protocol/Protocol.ts +226 -0
  277. package/src/protocol/ProtocolEnvironment.ts +10 -0
  278. package/src/protocol/ProtocolModule.ts +27 -0
  279. package/src/protocol/ProvableBlockHook.ts +19 -0
  280. package/src/protocol/ProvableTransactionHook.ts +13 -0
  281. package/src/protocol/TransitioningProtocolModule.ts +12 -0
  282. package/src/prover/block/BlockProvable.ts +99 -0
  283. package/src/prover/block/BlockProver.ts +990 -0
  284. package/src/prover/block/accummulators/BlockHashMerkleTree.ts +16 -0
  285. package/src/prover/block/accummulators/RuntimeVerificationKeyTree.ts +24 -0
  286. package/src/prover/block/services/RuntimeVerificationKeyRootService.ts +20 -0
  287. package/src/prover/statetransition/StateTransitionProvable.ts +41 -0
  288. package/src/prover/statetransition/StateTransitionProver.ts +377 -0
  289. package/src/settlement/ContractModule.ts +31 -0
  290. package/src/settlement/SettlementContractModule.ts +145 -0
  291. package/src/settlement/contracts/BridgeContract.ts +237 -0
  292. package/src/settlement/contracts/BridgeContractProtocolModule.ts +43 -0
  293. package/src/settlement/contracts/DispatchContractProtocolModule.ts +73 -0
  294. package/src/settlement/contracts/DispatchSmartContract.ts +326 -0
  295. package/src/settlement/contracts/SettlementContractProtocolModule.ts +108 -0
  296. package/src/settlement/contracts/SettlementSmartContract.ts +498 -0
  297. package/src/settlement/contracts/TokenBridgeTree.ts +73 -0
  298. package/src/settlement/contracts/authorizations/ContractAuthorization.ts +11 -0
  299. package/src/settlement/contracts/authorizations/TokenBridgeDeploymentAuth.ts +16 -0
  300. package/src/settlement/contracts/authorizations/UpdateMessagesHashAuth.ts +16 -0
  301. package/src/settlement/messages/Deposit.ts +7 -0
  302. package/src/settlement/messages/OutgoingMessageArgument.ts +42 -0
  303. package/src/settlement/messages/Withdrawal.ts +16 -0
  304. package/src/settlement/modularity/ProvableSettlementHook.ts +36 -0
  305. package/src/settlement/modularity/types.ts +22 -0
  306. package/src/settlement/modules/NetworkStateSettlementModule.ts +42 -0
  307. package/src/state/State.ts +175 -0
  308. package/src/state/StateMap.ts +73 -0
  309. package/src/state/StateService.ts +6 -0
  310. package/src/state/StateServiceProvider.ts +37 -0
  311. package/src/state/assert/assert.ts +35 -0
  312. package/src/state/context/RuntimeMethodExecutionContext.ts +174 -0
  313. package/src/state/context/TransitionMethodExecutionContext.ts +26 -0
  314. package/src/state/protocol/ProtocolState.ts +61 -0
  315. package/src/utils/MinaPrefixedProvableHashList.ts +73 -0
  316. package/src/utils/PrefixedProvableHashList.ts +21 -0
  317. package/src/utils/ProvableHashList.ts +50 -0
  318. package/src/utils/ProvableReductionHashList.ts +68 -0
  319. package/src/utils/StateTransitionReductionList.ts +89 -0
  320. package/src/utils/utils.ts +75 -0
  321. package/test/BlockProver.test.ts +212 -0
  322. package/test/Protocol.test.ts +37 -0
  323. package/test/State.test.ts +45 -0
  324. package/test/StateTransition.test.ts +174 -0
  325. package/test/TestingProtocol.ts +52 -0
  326. package/test/compiling/types.ts +28 -0
  327. package/test/model/Option.test.ts +72 -0
  328. package/test/modularity/types.ts +35 -0
  329. package/test/state/assert/assert.test.ts +56 -0
  330. package/test/tsconfig.json +7 -0
  331. package/test/utils/ProvableReductionHashList.test.ts +117 -0
  332. package/test/utils.test.ts +27 -0
  333. package/tsconfig.json +8 -0
@@ -0,0 +1,108 @@
1
+ import { inject, injectable, injectAll } from "tsyringe";
2
+ import {
3
+ ArtifactRecord,
4
+ ChildVerificationKeyService,
5
+ CompileRegistry,
6
+ log,
7
+ } from "@proto-kit/common";
8
+
9
+ import { BlockProvable } from "../../prover/block/BlockProvable";
10
+ import {
11
+ ContractModule,
12
+ SmartContractClassFromInterface,
13
+ } from "../ContractModule";
14
+ import { ProvableSettlementHook } from "../modularity/ProvableSettlementHook";
15
+
16
+ import { DispatchSmartContractBase } from "./DispatchSmartContract";
17
+ import {
18
+ SettlementContractType,
19
+ SettlementSmartContract,
20
+ SettlementSmartContractBase,
21
+ } from "./SettlementSmartContract";
22
+ import { BridgeContractBase } from "./BridgeContract";
23
+ import { DispatchContractProtocolModule } from "./DispatchContractProtocolModule";
24
+ import { BridgeContractProtocolModule } from "./BridgeContractProtocolModule";
25
+
26
+ export type SettlementContractConfig = {
27
+ escapeHatchSlotsInterval?: number;
28
+ };
29
+
30
+ // 24 hours
31
+ const DEFAULT_ESCAPE_HATCH = (60 / 3) * 24;
32
+
33
+ @injectable()
34
+ export class SettlementContractProtocolModule extends ContractModule<
35
+ SettlementContractType,
36
+ SettlementContractConfig
37
+ > {
38
+ public constructor(
39
+ @injectAll("ProvableSettlementHook")
40
+ private readonly hooks: ProvableSettlementHook<unknown>[],
41
+ @inject("BlockProver")
42
+ private readonly blockProver: BlockProvable,
43
+ @inject("DispatchContract")
44
+ private readonly dispatchContractModule: DispatchContractProtocolModule,
45
+ @inject("BridgeContract")
46
+ private readonly bridgeContractModule: BridgeContractProtocolModule,
47
+ private readonly childVerificationKeyService: ChildVerificationKeyService
48
+ ) {
49
+ super();
50
+ }
51
+
52
+ public contractFactory(): SmartContractClassFromInterface<SettlementContractType> {
53
+ const { hooks, config } = this;
54
+ const dispatchContract = this.dispatchContractModule.contractFactory();
55
+ const bridgeContract = this.bridgeContractModule.contractFactory();
56
+
57
+ const escapeHatchSlotsInterval =
58
+ config.escapeHatchSlotsInterval ?? DEFAULT_ESCAPE_HATCH;
59
+
60
+ const { args } = SettlementSmartContractBase;
61
+ SettlementSmartContractBase.args = {
62
+ DispatchContract: dispatchContract,
63
+ hooks,
64
+ escapeHatchSlotsInterval,
65
+ BridgeContract: bridgeContract,
66
+ BridgeContractVerificationKey: args?.BridgeContractVerificationKey,
67
+ BridgeContractPermissions: args?.BridgeContractPermissions,
68
+ signedSettlements: args?.signedSettlements,
69
+ ChildVerificationKeyService: this.childVerificationKeyService,
70
+ };
71
+
72
+ // Ideally we don't want to have this cyclic dependency, but we have it in the protocol,
73
+ // So its logical that we can't avoid that here
74
+ BridgeContractBase.args.SettlementContract = SettlementSmartContract;
75
+
76
+ DispatchSmartContractBase.args.settlementContractClass =
77
+ SettlementSmartContract;
78
+
79
+ return SettlementSmartContract;
80
+ }
81
+
82
+ public async compile(
83
+ registry: CompileRegistry
84
+ ): Promise<ArtifactRecord | undefined> {
85
+ // Dependencies
86
+ const bridgeArtifact = await this.bridgeContractModule.compile(registry);
87
+
88
+ await this.blockProver.compile(registry);
89
+
90
+ // Init params
91
+ SettlementSmartContractBase.args.BridgeContractVerificationKey =
92
+ bridgeArtifact.BridgeContract.verificationKey;
93
+
94
+ if (SettlementSmartContractBase.args.signedSettlements === undefined) {
95
+ throw new Error(
96
+ "Args not fully initialized - make sure to also include the SettlementModule in the sequencer"
97
+ );
98
+ }
99
+
100
+ log.debug("Compiling Settlement Contract");
101
+
102
+ const artifact = await registry.compile(SettlementSmartContract);
103
+
104
+ return {
105
+ SettlementSmartContract: artifact,
106
+ };
107
+ }
108
+ }
@@ -0,0 +1,498 @@
1
+ import {
2
+ prefixToField,
3
+ RollupMerkleTree,
4
+ TypedClass,
5
+ mapSequential,
6
+ ChildVerificationKeyService,
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(Field(RollupMerkleTree.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
+
366
+ // Execute onSettlementHooks for additional checks
367
+ const stateRecord: SettlementStateRecord = {
368
+ blockHashRoot,
369
+ stateRoot,
370
+ networkStateHash,
371
+ lastSettlementL1BlockHeight,
372
+ sequencerKey: publicKey,
373
+ };
374
+ const inputs: SettlementHookInputs = {
375
+ blockProof,
376
+ contractState: stateRecord,
377
+ newPromisedMessagesHash,
378
+ fromNetworkState: inputNetworkState,
379
+ toNetworkState: outputNetworkState,
380
+ currentL1BlockHeight: minBlockHeightIncluded,
381
+ };
382
+ await mapSequential(hooks, async (hook) => {
383
+ await hook.beforeSettlement(this, inputs);
384
+ });
385
+
386
+ // Apply blockProof
387
+ stateRoot.assertEquals(
388
+ blockProof.publicInput.stateRoot,
389
+ "Input state root not matching"
390
+ );
391
+
392
+ networkStateHash.assertEquals(
393
+ blockProof.publicInput.networkStateHash,
394
+ "Input networkStateHash not matching"
395
+ );
396
+ blockHashRoot.assertEquals(
397
+ blockProof.publicInput.blockHashRoot,
398
+ "Input blockHashRoot not matching"
399
+ );
400
+ this.stateRoot.set(blockProof.publicOutput.stateRoot);
401
+ this.networkStateHash.set(blockProof.publicOutput.networkStateHash);
402
+ this.blockHashRoot.set(blockProof.publicOutput.blockHashRoot);
403
+
404
+ // Assert and apply deposit commitments
405
+ promisedMessagesHash.assertEquals(
406
+ blockProof.publicOutput.incomingMessagesHash,
407
+ "Promised messages not honored"
408
+ );
409
+
410
+ // Set authorization for the dispatchContract to verify the messages hash update
411
+ this.authorizationField.set(
412
+ new UpdateMessagesHashAuth({
413
+ target: dispatchContract.address,
414
+ executedMessagesHash: promisedMessagesHash,
415
+ newPromisedMessagesHash,
416
+ }).hash()
417
+ );
418
+
419
+ // Call DispatchContract
420
+ // This call checks that the promisedMessagesHash, which is already proven
421
+ // to be the blockProofs publicoutput, is actually the current on-chain
422
+ // promisedMessageHash. It also checks the newPromisedMessagesHash to be
423
+ // a current sequencestate value
424
+ await dispatchContract.updateMessagesHash(
425
+ promisedMessagesHash,
426
+ newPromisedMessagesHash
427
+ );
428
+
429
+ this.lastSettlementL1BlockHeight.set(minBlockHeightIncluded);
430
+ }
431
+ }
432
+
433
+ export class SettlementSmartContract
434
+ extends SettlementSmartContractBase
435
+ implements SettlementContractType
436
+ {
437
+ @state(Field) public sequencerKey = State<Field>();
438
+ @state(UInt32) public lastSettlementL1BlockHeight = State<UInt32>();
439
+
440
+ @state(Field) public stateRoot = State<Field>();
441
+ @state(Field) public networkStateHash = State<Field>();
442
+ @state(Field) public blockHashRoot = State<Field>();
443
+
444
+ @state(Field) public dispatchContractAddressX = State<Field>();
445
+
446
+ @state(Field) public authorizationField = State<Field>();
447
+
448
+ @method async approveBase(forest: AccountUpdateForest) {
449
+ this.checkZeroBalanceChange(forest);
450
+ }
451
+
452
+ @method
453
+ public async initialize(
454
+ sequencer: PublicKey,
455
+ dispatchContract: PublicKey,
456
+ bridgeContract: PublicKey,
457
+ contractKey: PrivateKey
458
+ ) {
459
+ await this.initializeBase(
460
+ sequencer,
461
+ dispatchContract,
462
+ bridgeContract,
463
+ contractKey
464
+ );
465
+ }
466
+
467
+ @method
468
+ public async addTokenBridge(
469
+ tokenId: Field,
470
+ address: PublicKey,
471
+ dispatchContract: PublicKey
472
+ ) {
473
+ await this.deployTokenBridge(tokenId, address, dispatchContract);
474
+ }
475
+
476
+ @method
477
+ public async settle(
478
+ blockProof: DynamicBlockProof,
479
+ signature: Signature,
480
+ dispatchContractAddress: PublicKey,
481
+ publicKey: PublicKey,
482
+ inputNetworkState: NetworkState,
483
+ outputNetworkState: NetworkState,
484
+ newPromisedMessagesHash: Field
485
+ ) {
486
+ return await this.settleBase(
487
+ blockProof,
488
+ signature,
489
+ dispatchContractAddress,
490
+ publicKey,
491
+ inputNetworkState,
492
+ outputNetworkState,
493
+ newPromisedMessagesHash
494
+ );
495
+ }
496
+ }
497
+
498
+ /* 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
+ }