@layerzerolabs/protocol-starknet-v2 0.0.34

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 (504) hide show
  1. package/.turbo/turbo-build.log +186 -0
  2. package/.turbo/turbo-lint.log +71 -0
  3. package/.turbo/turbo-test.log +937 -0
  4. package/README.md +41 -0
  5. package/Scarb.lock +211 -0
  6. package/Scarb.toml +2 -0
  7. package/dist/4XD3ZRZ4.cjs +301 -0
  8. package/dist/4XD3ZRZ4.cjs.map +1 -0
  9. package/dist/4Z5IPBC3.js +299 -0
  10. package/dist/4Z5IPBC3.js.map +1 -0
  11. package/dist/5NEZDLVQ.cjs +474 -0
  12. package/dist/5NEZDLVQ.cjs.map +1 -0
  13. package/dist/6JYCOKDE.js +472 -0
  14. package/dist/6JYCOKDE.js.map +1 -0
  15. package/dist/7C4PFMIZ.cjs +1288 -0
  16. package/dist/7C4PFMIZ.cjs.map +1 -0
  17. package/dist/7ZSGGZUE.js +1229 -0
  18. package/dist/7ZSGGZUE.js.map +1 -0
  19. package/dist/ARHOGUYH.cjs +2136 -0
  20. package/dist/ARHOGUYH.cjs.map +1 -0
  21. package/dist/CRCRIUFX.js +1264 -0
  22. package/dist/CRCRIUFX.js.map +1 -0
  23. package/dist/DB7CQSED.cjs +430 -0
  24. package/dist/DB7CQSED.cjs.map +1 -0
  25. package/dist/DFXLWHYP.cjs +1266 -0
  26. package/dist/DFXLWHYP.cjs.map +1 -0
  27. package/dist/EOLZCMCK.js +988 -0
  28. package/dist/EOLZCMCK.js.map +1 -0
  29. package/dist/FFDPTOWG.cjs +331 -0
  30. package/dist/FFDPTOWG.cjs.map +1 -0
  31. package/dist/FOJGEAIO.js +2134 -0
  32. package/dist/FOJGEAIO.js.map +1 -0
  33. package/dist/IWIUMVGB.js +629 -0
  34. package/dist/IWIUMVGB.js.map +1 -0
  35. package/dist/MUEN6AWV.cjs +697 -0
  36. package/dist/MUEN6AWV.cjs.map +1 -0
  37. package/dist/ORE6VBZ4.cjs +990 -0
  38. package/dist/ORE6VBZ4.cjs.map +1 -0
  39. package/dist/OUFKWPZ7.js +732 -0
  40. package/dist/OUFKWPZ7.js.map +1 -0
  41. package/dist/T2QTYQXJ.js +1229 -0
  42. package/dist/T2QTYQXJ.js.map +1 -0
  43. package/dist/UPJTM7BR.cjs +631 -0
  44. package/dist/UPJTM7BR.cjs.map +1 -0
  45. package/dist/VNVNX2P3.cjs +1231 -0
  46. package/dist/VNVNX2P3.cjs.map +1 -0
  47. package/dist/VUOMXK5T.js +6 -0
  48. package/dist/VUOMXK5T.js.map +1 -0
  49. package/dist/WISWRTDG.js +1286 -0
  50. package/dist/WISWRTDG.js.map +1 -0
  51. package/dist/WU5L7YIQ.cjs +1231 -0
  52. package/dist/WU5L7YIQ.cjs.map +1 -0
  53. package/dist/X3B5JDMZ.js +695 -0
  54. package/dist/X3B5JDMZ.js.map +1 -0
  55. package/dist/XYNBDBBV.cjs +297 -0
  56. package/dist/XYNBDBBV.cjs.map +1 -0
  57. package/dist/Y5JFPCYJ.cjs +734 -0
  58. package/dist/Y5JFPCYJ.cjs.map +1 -0
  59. package/dist/YEHL7IYO.js +295 -0
  60. package/dist/YEHL7IYO.js.map +1 -0
  61. package/dist/YJF4D23A.cjs +8 -0
  62. package/dist/YJF4D23A.cjs.map +1 -0
  63. package/dist/YTS44OEA.js +428 -0
  64. package/dist/YTS44OEA.js.map +1 -0
  65. package/dist/Z2NIUZMW.js +329 -0
  66. package/dist/Z2NIUZMW.js.map +1 -0
  67. package/dist/abis/blocked-message-lib.cjs +13 -0
  68. package/dist/abis/blocked-message-lib.cjs.map +1 -0
  69. package/dist/abis/blocked-message-lib.d.ts +338 -0
  70. package/dist/abis/blocked-message-lib.d.ts.map +1 -0
  71. package/dist/abis/blocked-message-lib.js +4 -0
  72. package/dist/abis/blocked-message-lib.js.map +1 -0
  73. package/dist/abis/dvn-fee-lib.cjs +13 -0
  74. package/dist/abis/dvn-fee-lib.cjs.map +1 -0
  75. package/dist/abis/dvn-fee-lib.d.ts +214 -0
  76. package/dist/abis/dvn-fee-lib.d.ts.map +1 -0
  77. package/dist/abis/dvn-fee-lib.js +4 -0
  78. package/dist/abis/dvn-fee-lib.js.map +1 -0
  79. package/dist/abis/dvn.cjs +13 -0
  80. package/dist/abis/dvn.cjs.map +1 -0
  81. package/dist/abis/dvn.d.ts +952 -0
  82. package/dist/abis/dvn.d.ts.map +1 -0
  83. package/dist/abis/dvn.js +4 -0
  84. package/dist/abis/dvn.js.map +1 -0
  85. package/dist/abis/endpoint-v2.cjs +13 -0
  86. package/dist/abis/endpoint-v2.cjs.map +1 -0
  87. package/dist/abis/endpoint-v2.d.ts +1580 -0
  88. package/dist/abis/endpoint-v2.d.ts.map +1 -0
  89. package/dist/abis/endpoint-v2.js +4 -0
  90. package/dist/abis/endpoint-v2.js.map +1 -0
  91. package/dist/abis/executor-fee-lib.cjs +13 -0
  92. package/dist/abis/executor-fee-lib.cjs.map +1 -0
  93. package/dist/abis/executor-fee-lib.d.ts +217 -0
  94. package/dist/abis/executor-fee-lib.d.ts.map +1 -0
  95. package/dist/abis/executor-fee-lib.js +4 -0
  96. package/dist/abis/executor-fee-lib.js.map +1 -0
  97. package/dist/abis/executor.cjs +13 -0
  98. package/dist/abis/executor.cjs.map +1 -0
  99. package/dist/abis/executor.d.ts +914 -0
  100. package/dist/abis/executor.d.ts.map +1 -0
  101. package/dist/abis/executor.js +4 -0
  102. package/dist/abis/executor.js.map +1 -0
  103. package/dist/abis/o-app.cjs +13 -0
  104. package/dist/abis/o-app.cjs.map +1 -0
  105. package/dist/abis/o-app.d.ts +311 -0
  106. package/dist/abis/o-app.d.ts.map +1 -0
  107. package/dist/abis/o-app.js +4 -0
  108. package/dist/abis/o-app.js.map +1 -0
  109. package/dist/abis/oft-adapter.cjs +13 -0
  110. package/dist/abis/oft-adapter.cjs.map +1 -0
  111. package/dist/abis/oft-adapter.d.ts +722 -0
  112. package/dist/abis/oft-adapter.d.ts.map +1 -0
  113. package/dist/abis/oft-adapter.js +4 -0
  114. package/dist/abis/oft-adapter.js.map +1 -0
  115. package/dist/abis/oft.cjs +13 -0
  116. package/dist/abis/oft.cjs.map +1 -0
  117. package/dist/abis/oft.d.ts +922 -0
  118. package/dist/abis/oft.d.ts.map +1 -0
  119. package/dist/abis/oft.js +4 -0
  120. package/dist/abis/oft.js.map +1 -0
  121. package/dist/abis/omni-counter.cjs +13 -0
  122. package/dist/abis/omni-counter.cjs.map +1 -0
  123. package/dist/abis/omni-counter.d.ts +459 -0
  124. package/dist/abis/omni-counter.d.ts.map +1 -0
  125. package/dist/abis/omni-counter.js +4 -0
  126. package/dist/abis/omni-counter.js.map +1 -0
  127. package/dist/abis/price-feed.cjs +13 -0
  128. package/dist/abis/price-feed.cjs.map +1 -0
  129. package/dist/abis/price-feed.d.ts +505 -0
  130. package/dist/abis/price-feed.d.ts.map +1 -0
  131. package/dist/abis/price-feed.js +4 -0
  132. package/dist/abis/price-feed.js.map +1 -0
  133. package/dist/abis/simple-message-lib.cjs +13 -0
  134. package/dist/abis/simple-message-lib.cjs.map +1 -0
  135. package/dist/abis/simple-message-lib.d.ts +535 -0
  136. package/dist/abis/simple-message-lib.d.ts.map +1 -0
  137. package/dist/abis/simple-message-lib.js +4 -0
  138. package/dist/abis/simple-message-lib.js.map +1 -0
  139. package/dist/abis/treasury.cjs +13 -0
  140. package/dist/abis/treasury.cjs.map +1 -0
  141. package/dist/abis/treasury.d.ts +240 -0
  142. package/dist/abis/treasury.d.ts.map +1 -0
  143. package/dist/abis/treasury.js +4 -0
  144. package/dist/abis/treasury.js.map +1 -0
  145. package/dist/abis/ultra-light-node.cjs +13 -0
  146. package/dist/abis/ultra-light-node.cjs.map +1 -0
  147. package/dist/abis/ultra-light-node.d.ts +900 -0
  148. package/dist/abis/ultra-light-node.d.ts.map +1 -0
  149. package/dist/abis/ultra-light-node.js +4 -0
  150. package/dist/abis/ultra-light-node.js.map +1 -0
  151. package/dist/index.cjs +78 -0
  152. package/dist/index.cjs.map +1 -0
  153. package/dist/index.d.ts +15 -0
  154. package/dist/index.d.ts.map +1 -0
  155. package/dist/index.js +17 -0
  156. package/dist/index.js.map +1 -0
  157. package/dist/scripts/build-abi.cjs +28 -0
  158. package/dist/scripts/build-abi.cjs.map +1 -0
  159. package/dist/scripts/build-abi.d.ts +2 -0
  160. package/dist/scripts/build-abi.d.ts.map +1 -0
  161. package/dist/scripts/build-abi.js +26 -0
  162. package/dist/scripts/build-abi.js.map +1 -0
  163. package/layerzero/README.md +244 -0
  164. package/layerzero/Scarb.lock +203 -0
  165. package/layerzero/Scarb.toml +30 -0
  166. package/layerzero/snfoundry.toml +11 -0
  167. package/layerzero/src/common/constants.cairo +26 -0
  168. package/layerzero/src/common/conversions.cairo +16 -0
  169. package/layerzero/src/common/guid.cairo +20 -0
  170. package/layerzero/src/common/packet_v1_codec.cairo +307 -0
  171. package/layerzero/src/common/structs/messaging.cairo +40 -0
  172. package/layerzero/src/common/structs/packet.cairo +31 -0
  173. package/layerzero/src/endpoint/constants.cairo +14 -0
  174. package/layerzero/src/endpoint/endpoint.cairo +688 -0
  175. package/layerzero/src/endpoint/errors.cairo +108 -0
  176. package/layerzero/src/endpoint/events.cairo +124 -0
  177. package/layerzero/src/endpoint/interfaces/endpoint.cairo +286 -0
  178. package/layerzero/src/endpoint/interfaces/layerzero_composer.cairo +62 -0
  179. package/layerzero/src/endpoint/interfaces/layerzero_receiver.cairo +63 -0
  180. package/layerzero/src/endpoint/message_lib_manager/errors.cairo +95 -0
  181. package/layerzero/src/endpoint/message_lib_manager/events.cairo +90 -0
  182. package/layerzero/src/endpoint/message_lib_manager/interface.cairo +449 -0
  183. package/layerzero/src/endpoint/message_lib_manager/message_lib_manager.cairo +720 -0
  184. package/layerzero/src/endpoint/message_lib_manager/structs.cairo +33 -0
  185. package/layerzero/src/endpoint/messaging_channel/errors.cairo +37 -0
  186. package/layerzero/src/endpoint/messaging_channel/events.cairo +58 -0
  187. package/layerzero/src/endpoint/messaging_channel/interface.cairo +171 -0
  188. package/layerzero/src/endpoint/messaging_channel/messaging_channel.cairo +453 -0
  189. package/layerzero/src/endpoint/messaging_composer/errors.cairo +46 -0
  190. package/layerzero/src/endpoint/messaging_composer/events.cairo +67 -0
  191. package/layerzero/src/endpoint/messaging_composer/interface.cairo +132 -0
  192. package/layerzero/src/endpoint/messaging_composer/messaging_composer.cairo +223 -0
  193. package/layerzero/src/lib.cairo +189 -0
  194. package/layerzero/src/message_lib/blocked_message_lib.cairo +114 -0
  195. package/layerzero/src/message_lib/interface.cairo +63 -0
  196. package/layerzero/src/message_lib/sml/errors.cairo +23 -0
  197. package/layerzero/src/message_lib/sml/events.cairo +32 -0
  198. package/layerzero/src/message_lib/sml/simple_message_lib.cairo +312 -0
  199. package/layerzero/src/message_lib/structs.cairo +22 -0
  200. package/layerzero/src/message_lib/uln/errors.cairo +128 -0
  201. package/layerzero/src/message_lib/uln/events.cairo +97 -0
  202. package/layerzero/src/message_lib/uln/interface.cairo +83 -0
  203. package/layerzero/src/message_lib/uln/options.cairo +64 -0
  204. package/layerzero/src/message_lib/uln/structs/executor_config.cairo +35 -0
  205. package/layerzero/src/message_lib/uln/structs/payment_info.cairo +7 -0
  206. package/layerzero/src/message_lib/uln/structs/uln_config.cairo +155 -0
  207. package/layerzero/src/message_lib/uln/structs/uln_config_storage_node.cairo +91 -0
  208. package/layerzero/src/message_lib/uln/structs/verification.cairo +7 -0
  209. package/layerzero/src/message_lib/uln/ultra_light_node.cairo +965 -0
  210. package/layerzero/src/oapps/common/oapp_options_type_3/errors.cairo +22 -0
  211. package/layerzero/src/oapps/common/oapp_options_type_3/events.cairo +6 -0
  212. package/layerzero/src/oapps/common/oapp_options_type_3/interface.cairo +34 -0
  213. package/layerzero/src/oapps/common/oapp_options_type_3/oapp_options_type_3.cairo +120 -0
  214. package/layerzero/src/oapps/common/oapp_options_type_3/structs.cairo +6 -0
  215. package/layerzero/src/oapps/counter/constants.cairo +3 -0
  216. package/layerzero/src/oapps/counter/counter.cairo +170 -0
  217. package/layerzero/src/oapps/counter/interface.cairo +27 -0
  218. package/layerzero/src/oapps/counter/structs.cairo +20 -0
  219. package/layerzero/src/oapps/message_inspector/interface.cairo +21 -0
  220. package/layerzero/src/oapps/oapp/errors.cairo +72 -0
  221. package/layerzero/src/oapps/oapp/events.cairo +9 -0
  222. package/layerzero/src/oapps/oapp/interface.cairo +67 -0
  223. package/layerzero/src/oapps/oapp/oapp.cairo +70 -0
  224. package/layerzero/src/oapps/oapp/oapp_core.cairo +448 -0
  225. package/layerzero/src/oapps/oft/errors.cairo +42 -0
  226. package/layerzero/src/oapps/oft/events.cairo +33 -0
  227. package/layerzero/src/oapps/oft/interface.cairo +87 -0
  228. package/layerzero/src/oapps/oft/oft.cairo +188 -0
  229. package/layerzero/src/oapps/oft/oft_adapter.cairo +175 -0
  230. package/layerzero/src/oapps/oft/oft_compose_msg_codec.cairo +128 -0
  231. package/layerzero/src/oapps/oft/oft_core.cairo +542 -0
  232. package/layerzero/src/oapps/oft/oft_msg_codec.cairo +131 -0
  233. package/layerzero/src/oapps/oft/structs.cairo +72 -0
  234. package/layerzero/src/treasury/errors.cairo +22 -0
  235. package/layerzero/src/treasury/events.cairo +5 -0
  236. package/layerzero/src/treasury/interfaces/layerzero_treasury.cairo +54 -0
  237. package/layerzero/src/treasury/interfaces/lz_token_fee_lib.cairo +45 -0
  238. package/layerzero/src/treasury/interfaces/treasury_admin.cairo +39 -0
  239. package/layerzero/src/treasury/treasury.cairo +140 -0
  240. package/layerzero/src/workers/access_control.cairo +11 -0
  241. package/layerzero/src/workers/base/base.cairo +238 -0
  242. package/layerzero/src/workers/base/errors.cairo +24 -0
  243. package/layerzero/src/workers/base/events.cairo +43 -0
  244. package/layerzero/src/workers/base/interface.cairo +93 -0
  245. package/layerzero/src/workers/base/structs.cairo +10 -0
  246. package/layerzero/src/workers/common.cairo +59 -0
  247. package/layerzero/src/workers/dvn/constants.cairo +11 -0
  248. package/layerzero/src/workers/dvn/dvn.cairo +338 -0
  249. package/layerzero/src/workers/dvn/errors.cairo +80 -0
  250. package/layerzero/src/workers/dvn/events.cairo +30 -0
  251. package/layerzero/src/workers/dvn/fee_lib/dvn_fee_lib.cairo +152 -0
  252. package/layerzero/src/workers/dvn/fee_lib/interface.cairo +45 -0
  253. package/layerzero/src/workers/dvn/interface.cairo +131 -0
  254. package/layerzero/src/workers/dvn/options.cairo +125 -0
  255. package/layerzero/src/workers/dvn/structs.cairo +51 -0
  256. package/layerzero/src/workers/executor/errors.cairo +159 -0
  257. package/layerzero/src/workers/executor/events.cairo +32 -0
  258. package/layerzero/src/workers/executor/executor.cairo +392 -0
  259. package/layerzero/src/workers/executor/fee_lib/executor_fee_lib.cairo +160 -0
  260. package/layerzero/src/workers/executor/fee_lib/interface.cairo +87 -0
  261. package/layerzero/src/workers/executor/interface.cairo +131 -0
  262. package/layerzero/src/workers/executor/options.cairo +244 -0
  263. package/layerzero/src/workers/executor/structs.cairo +119 -0
  264. package/layerzero/src/workers/interface.cairo +32 -0
  265. package/layerzero/src/workers/price_feed/constants.cairo +7 -0
  266. package/layerzero/src/workers/price_feed/errors.cairo +28 -0
  267. package/layerzero/src/workers/price_feed/events.cairo +13 -0
  268. package/layerzero/src/workers/price_feed/interface.cairo +264 -0
  269. package/layerzero/src/workers/price_feed/price_feed.cairo +392 -0
  270. package/layerzero/src/workers/price_feed/structs.cairo +74 -0
  271. package/layerzero/tests/common/test_constants.cairo +21 -0
  272. package/layerzero/tests/common/test_guid.cairo +232 -0
  273. package/layerzero/tests/common/test_packet_v1_codec.cairo +372 -0
  274. package/layerzero/tests/common/utils.cairo +23 -0
  275. package/layerzero/tests/e2e/oft_utils.cairo +121 -0
  276. package/layerzero/tests/e2e/test_counter_with_sml.cairo +194 -0
  277. package/layerzero/tests/e2e/test_counter_with_uln.cairo +352 -0
  278. package/layerzero/tests/e2e/test_dvn.cairo +406 -0
  279. package/layerzero/tests/e2e/test_lz_token.cairo +354 -0
  280. package/layerzero/tests/e2e/test_oft_compose_with_uln.cairo +364 -0
  281. package/layerzero/tests/e2e/test_oft_with_sml.cairo +240 -0
  282. package/layerzero/tests/e2e/test_oft_with_uln.cairo +299 -0
  283. package/layerzero/tests/e2e/utils.cairo +490 -0
  284. package/layerzero/tests/endpoint/message_lib_manager/test_message_lib_manager.cairo +2051 -0
  285. package/layerzero/tests/endpoint/message_lib_manager/utils.cairo +45 -0
  286. package/layerzero/tests/endpoint/messaging_channel/test_messaging_channel.cairo +621 -0
  287. package/layerzero/tests/endpoint/messaging_channel/utils.cairo +96 -0
  288. package/layerzero/tests/endpoint/messaging_composer/test_messaging_composer.cairo +456 -0
  289. package/layerzero/tests/endpoint/messaging_composer/utils.cairo +75 -0
  290. package/layerzero/tests/endpoint/test_endpoint_commit.cairo +763 -0
  291. package/layerzero/tests/endpoint/test_endpoint_lzreceive.cairo +1253 -0
  292. package/layerzero/tests/endpoint/test_endpoint_quote.cairo +71 -0
  293. package/layerzero/tests/endpoint/test_endpoint_send.cairo +1327 -0
  294. package/layerzero/tests/endpoint/utils.cairo +129 -0
  295. package/layerzero/tests/fuzzable/blockchain_config.cairo +89 -0
  296. package/layerzero/tests/fuzzable/bytes32.cairo +16 -0
  297. package/layerzero/tests/fuzzable/contract_address.cairo +67 -0
  298. package/layerzero/tests/fuzzable/dst_config.cairo +37 -0
  299. package/layerzero/tests/fuzzable/eid.cairo +23 -0
  300. package/layerzero/tests/fuzzable/eth_address.cairo +17 -0
  301. package/layerzero/tests/fuzzable/expiry.cairo +27 -0
  302. package/layerzero/tests/fuzzable/felt_array.cairo +38 -0
  303. package/layerzero/tests/fuzzable/inbound_params.cairo +21 -0
  304. package/layerzero/tests/fuzzable/keys.cairo +16 -0
  305. package/layerzero/tests/fuzzable/model_type.cairo +27 -0
  306. package/layerzero/tests/fuzzable/origin.cairo +21 -0
  307. package/layerzero/tests/fuzzable/price.cairo +32 -0
  308. package/layerzero/tests/fuzzable/role_admin.cairo +29 -0
  309. package/layerzero/tests/fuzzable/small_byte_array.cairo +61 -0
  310. package/layerzero/tests/lib.cairo +177 -0
  311. package/layerzero/tests/message_lib/sml/test_simple_message_lib.cairo +224 -0
  312. package/layerzero/tests/message_lib/uln/test_uln_admin.cairo +2150 -0
  313. package/layerzero/tests/message_lib/uln/test_uln_config.cairo +527 -0
  314. package/layerzero/tests/message_lib/uln/test_uln_config_storage_node.cairo +69 -0
  315. package/layerzero/tests/message_lib/uln/test_uln_executor_config.cairo +173 -0
  316. package/layerzero/tests/message_lib/uln/test_uln_options.cairo +329 -0
  317. package/layerzero/tests/message_lib/uln/test_uln_quote.cairo +1038 -0
  318. package/layerzero/tests/message_lib/uln/test_uln_receive.cairo +715 -0
  319. package/layerzero/tests/message_lib/uln/test_uln_send.cairo +1155 -0
  320. package/layerzero/tests/message_lib/uln/utils.cairo +59 -0
  321. package/layerzero/tests/mocks/composer_target.cairo +76 -0
  322. package/layerzero/tests/mocks/endpoint.cairo +199 -0
  323. package/layerzero/tests/mocks/erc20/erc20.cairo +50 -0
  324. package/layerzero/tests/mocks/erc20/interface.cairo +8 -0
  325. package/layerzero/tests/mocks/message_inspector/message_inspector.cairo +17 -0
  326. package/layerzero/tests/mocks/message_lib_manager.cairo +98 -0
  327. package/layerzero/tests/mocks/messaging_channel/interface.cairo +23 -0
  328. package/layerzero/tests/mocks/messaging_channel/messaging_channel.cairo +138 -0
  329. package/layerzero/tests/mocks/messaging_composer.cairo +171 -0
  330. package/layerzero/tests/mocks/oapp_core/interface.cairo +53 -0
  331. package/layerzero/tests/mocks/oapp_core/oapp_core.cairo +142 -0
  332. package/layerzero/tests/mocks/oapp_options_type3.cairo +42 -0
  333. package/layerzero/tests/mocks/oft_core/interface.cairo +28 -0
  334. package/layerzero/tests/mocks/oft_core/oft_core.cairo +242 -0
  335. package/layerzero/tests/mocks/receiver.cairo +54 -0
  336. package/layerzero/tests/mocks/treasury/lz_token_fee_lib.cairo +57 -0
  337. package/layerzero/tests/mocks/treasury/treasury.cairo +74 -0
  338. package/layerzero/tests/mocks/uln_config/interface.cairo +12 -0
  339. package/layerzero/tests/mocks/uln_config/uln_config.cairo +35 -0
  340. package/layerzero/tests/mocks/workers/base.cairo +80 -0
  341. package/layerzero/tests/mocks/workers/dvn.cairo +115 -0
  342. package/layerzero/tests/mocks/workers/executor/decode/decode.cairo +97 -0
  343. package/layerzero/tests/mocks/workers/executor/decode/interface.cairo +59 -0
  344. package/layerzero/tests/mocks/workers/executor/executor.cairo +176 -0
  345. package/layerzero/tests/oapps/common/test_oapp_options_type_3.cairo +279 -0
  346. package/layerzero/tests/oapps/oft/test_oft_adapter.cairo +441 -0
  347. package/layerzero/tests/oapps/oft/test_oft_compose_msg_codec.cairo +139 -0
  348. package/layerzero/tests/oapps/oft/test_oft_core.cairo +751 -0
  349. package/layerzero/tests/oapps/oft/test_oft_msg_codec.cairo +268 -0
  350. package/layerzero/tests/oapps/test_counter.cairo +470 -0
  351. package/layerzero/tests/oapps/test_oapp_core.cairo +750 -0
  352. package/layerzero/tests/treasury/test_lz_token_fee_lib.cairo +63 -0
  353. package/layerzero/tests/treasury/test_treasury.cairo +458 -0
  354. package/layerzero/tests/treasury/utils.cairo +8 -0
  355. package/layerzero/tests/utils.cairo +48 -0
  356. package/layerzero/tests/workers/base/test_worker_base.cairo +1097 -0
  357. package/layerzero/tests/workers/base/utils.cairo +76 -0
  358. package/layerzero/tests/workers/dvn/fee_lib/test_dvn_fee_lib.cairo +361 -0
  359. package/layerzero/tests/workers/dvn/test_dvn.cairo +1101 -0
  360. package/layerzero/tests/workers/dvn/test_dvn_options.cairo +312 -0
  361. package/layerzero/tests/workers/dvn/utils.cairo +236 -0
  362. package/layerzero/tests/workers/executor/fee_lib/test_executor_fee_lib.cairo +223 -0
  363. package/layerzero/tests/workers/executor/test_decode.cairo +612 -0
  364. package/layerzero/tests/workers/executor/test_executor.cairo +1472 -0
  365. package/layerzero/tests/workers/executor/utils.cairo +296 -0
  366. package/layerzero/tests/workers/price_feed/test_price_feed.cairo +879 -0
  367. package/layerzero/tests/workers/price_feed/utils.cairo +37 -0
  368. package/libs/enumerable_set/Scarb.lock +24 -0
  369. package/libs/enumerable_set/Scarb.toml +17 -0
  370. package/libs/enumerable_set/src/enumerable_set.cairo +118 -0
  371. package/libs/enumerable_set/src/lib.cairo +4 -0
  372. package/libs/enumerable_set/tests/lib.cairo +5 -0
  373. package/libs/enumerable_set/tests/mocks/mock_enumerable_set.cairo +61 -0
  374. package/libs/enumerable_set/tests/test_enumerable_set.cairo +379 -0
  375. package/libs/lz_utils/Scarb.lock +24 -0
  376. package/libs/lz_utils/Scarb.toml +17 -0
  377. package/libs/lz_utils/src/bytes.cairo +33 -0
  378. package/libs/lz_utils/src/error.cairo +12 -0
  379. package/libs/lz_utils/src/keccak.cairo +28 -0
  380. package/libs/lz_utils/src/lib.cairo +3 -0
  381. package/libs/multisig/Scarb.lock +172 -0
  382. package/libs/multisig/Scarb.toml +23 -0
  383. package/libs/multisig/src/errors.cairo +84 -0
  384. package/libs/multisig/src/events.cairo +13 -0
  385. package/libs/multisig/src/interface.cairo +73 -0
  386. package/libs/multisig/src/lib.cairo +7 -0
  387. package/libs/multisig/src/multisig.cairo +241 -0
  388. package/libs/multisig/tests/lib.cairo +4 -0
  389. package/libs/multisig/tests/mocks/mock_multisig.cairo +57 -0
  390. package/libs/multisig/tests/test_multisig.cairo +452 -0
  391. package/package.json +41 -0
  392. package/src/scripts/build-abi.ts +51 -0
  393. package/target/CACHEDIR.TAG +3 -0
  394. package/target/dev/.fingerprint/alexandria_bytes-5ea6u5t70d7qi/alexandria_bytes +1 -0
  395. package/target/dev/.fingerprint/alexandria_data_structures-0aue3g6q80gs0/alexandria_data_structures +1 -0
  396. package/target/dev/.fingerprint/alexandria_math-h2fi7jdq4isuu/alexandria_math +1 -0
  397. package/target/dev/.fingerprint/core-lq3u730l5p1ag/core +1 -0
  398. package/target/dev/.fingerprint/core-vf7fc6rvic5vi/core +1 -0
  399. package/target/dev/.fingerprint/enumerable_set-eaerkg8njl85o/enumerable_set +1 -0
  400. package/target/dev/.fingerprint/enumerable_set-r54oje7t06ku8/enumerable_set +1 -0
  401. package/target/dev/.fingerprint/layerzero-oqgdqsaddpi2k/layerzero +1 -0
  402. package/target/dev/.fingerprint/lz_utils-kfkkeueiqg0pa/lz_utils +1 -0
  403. package/target/dev/.fingerprint/lz_utils-u4v1os6e7gkng/lz_utils +1 -0
  404. package/target/dev/.fingerprint/multisig-0fjetugejecge/multisig +1 -0
  405. package/target/dev/.fingerprint/multisig-6j5kqs436hm54/multisig +1 -0
  406. package/target/dev/.fingerprint/openzeppelin-ei1id1hu088lo/openzeppelin +1 -0
  407. package/target/dev/.fingerprint/openzeppelin-j9d5nd1qhfnu6/openzeppelin +1 -0
  408. package/target/dev/.fingerprint/openzeppelin_access-3oa41aikpaek0/openzeppelin_access +1 -0
  409. package/target/dev/.fingerprint/openzeppelin_access-p5h849v8so76q/openzeppelin_access +1 -0
  410. package/target/dev/.fingerprint/openzeppelin_account-4qhv5fks84g9u/openzeppelin_account +1 -0
  411. package/target/dev/.fingerprint/openzeppelin_account-hgbm8ln9ah7rm/openzeppelin_account +1 -0
  412. package/target/dev/.fingerprint/openzeppelin_finance-n70q9al0cps8i/openzeppelin_finance +1 -0
  413. package/target/dev/.fingerprint/openzeppelin_finance-nnd4f8703t3ak/openzeppelin_finance +1 -0
  414. package/target/dev/.fingerprint/openzeppelin_governance-3gnk21ubp5lis/openzeppelin_governance +1 -0
  415. package/target/dev/.fingerprint/openzeppelin_governance-rj1bfont4fij4/openzeppelin_governance +1 -0
  416. package/target/dev/.fingerprint/openzeppelin_introspection-3fja9hd1gvbcq/openzeppelin_introspection +1 -0
  417. package/target/dev/.fingerprint/openzeppelin_introspection-jc3nf5525eet6/openzeppelin_introspection +1 -0
  418. package/target/dev/.fingerprint/openzeppelin_merkle_tree-4en77ogr2r2l2/openzeppelin_merkle_tree +1 -0
  419. package/target/dev/.fingerprint/openzeppelin_merkle_tree-4t190frqs4db8/openzeppelin_merkle_tree +1 -0
  420. package/target/dev/.fingerprint/openzeppelin_presets-aqb0f6p9c0bp6/openzeppelin_presets +1 -0
  421. package/target/dev/.fingerprint/openzeppelin_presets-nseg8korhin8e/openzeppelin_presets +1 -0
  422. package/target/dev/.fingerprint/openzeppelin_security-g7p73ji1ih1qg/openzeppelin_security +1 -0
  423. package/target/dev/.fingerprint/openzeppelin_security-qp5328v80452u/openzeppelin_security +1 -0
  424. package/target/dev/.fingerprint/openzeppelin_token-jjf7tl9rphc6k/openzeppelin_token +1 -0
  425. package/target/dev/.fingerprint/openzeppelin_token-r6s43vlpj6rqk/openzeppelin_token +1 -0
  426. package/target/dev/.fingerprint/openzeppelin_upgrades-0dpbnre7engca/openzeppelin_upgrades +1 -0
  427. package/target/dev/.fingerprint/openzeppelin_upgrades-2sqgvbuv9s800/openzeppelin_upgrades +1 -0
  428. package/target/dev/.fingerprint/openzeppelin_utils-mj395ivff1ffo/openzeppelin_utils +1 -0
  429. package/target/dev/.fingerprint/openzeppelin_utils-oh1hse8sjumgm/openzeppelin_utils +1 -0
  430. package/target/dev/.fingerprint/starkware_utils-1qnnjnq0pf9u0/starkware_utils +1 -0
  431. package/target/dev/.fingerprint/starkware_utils-mh8e3te65lju4/starkware_utils +1 -0
  432. package/target/dev/enumerable_set.sierra.json +1 -0
  433. package/target/dev/incremental/alexandria_bytes-5ea6u5t70d7qi.bin +0 -0
  434. package/target/dev/incremental/alexandria_data_structures-0aue3g6q80gs0.bin +0 -0
  435. package/target/dev/incremental/alexandria_math-h2fi7jdq4isuu.bin +0 -0
  436. package/target/dev/incremental/core-lq3u730l5p1ag.bin +0 -0
  437. package/target/dev/incremental/core-vf7fc6rvic5vi.bin +0 -0
  438. package/target/dev/incremental/enumerable_set-eaerkg8njl85o.bin +0 -0
  439. package/target/dev/incremental/enumerable_set-r54oje7t06ku8.bin +0 -0
  440. package/target/dev/incremental/layerzero-oqgdqsaddpi2k.bin +0 -0
  441. package/target/dev/incremental/lz_utils-kfkkeueiqg0pa.bin +0 -0
  442. package/target/dev/incremental/lz_utils-u4v1os6e7gkng.bin +0 -0
  443. package/target/dev/incremental/multisig-0fjetugejecge.bin +0 -0
  444. package/target/dev/incremental/multisig-6j5kqs436hm54.bin +0 -0
  445. package/target/dev/incremental/openzeppelin-ei1id1hu088lo.bin +0 -0
  446. package/target/dev/incremental/openzeppelin-j9d5nd1qhfnu6.bin +0 -0
  447. package/target/dev/incremental/openzeppelin_access-3oa41aikpaek0.bin +0 -0
  448. package/target/dev/incremental/openzeppelin_access-p5h849v8so76q.bin +0 -0
  449. package/target/dev/incremental/openzeppelin_account-4qhv5fks84g9u.bin +0 -0
  450. package/target/dev/incremental/openzeppelin_account-hgbm8ln9ah7rm.bin +0 -0
  451. package/target/dev/incremental/openzeppelin_finance-n70q9al0cps8i.bin +0 -0
  452. package/target/dev/incremental/openzeppelin_finance-nnd4f8703t3ak.bin +0 -0
  453. package/target/dev/incremental/openzeppelin_governance-3gnk21ubp5lis.bin +0 -0
  454. package/target/dev/incremental/openzeppelin_governance-rj1bfont4fij4.bin +0 -0
  455. package/target/dev/incremental/openzeppelin_introspection-3fja9hd1gvbcq.bin +0 -0
  456. package/target/dev/incremental/openzeppelin_introspection-jc3nf5525eet6.bin +0 -0
  457. package/target/dev/incremental/openzeppelin_merkle_tree-4en77ogr2r2l2.bin +0 -0
  458. package/target/dev/incremental/openzeppelin_merkle_tree-4t190frqs4db8.bin +0 -0
  459. package/target/dev/incremental/openzeppelin_presets-aqb0f6p9c0bp6.bin +0 -0
  460. package/target/dev/incremental/openzeppelin_presets-nseg8korhin8e.bin +0 -0
  461. package/target/dev/incremental/openzeppelin_security-g7p73ji1ih1qg.bin +0 -0
  462. package/target/dev/incremental/openzeppelin_security-qp5328v80452u.bin +0 -0
  463. package/target/dev/incremental/openzeppelin_token-jjf7tl9rphc6k.bin +0 -0
  464. package/target/dev/incremental/openzeppelin_token-r6s43vlpj6rqk.bin +0 -0
  465. package/target/dev/incremental/openzeppelin_upgrades-0dpbnre7engca.bin +0 -0
  466. package/target/dev/incremental/openzeppelin_upgrades-2sqgvbuv9s800.bin +0 -0
  467. package/target/dev/incremental/openzeppelin_utils-mj395ivff1ffo.bin +0 -0
  468. package/target/dev/incremental/openzeppelin_utils-oh1hse8sjumgm.bin +0 -0
  469. package/target/dev/incremental/starkware_utils-1qnnjnq0pf9u0.bin +0 -0
  470. package/target/dev/incremental/starkware_utils-mh8e3te65lju4.bin +0 -0
  471. package/target/dev/layerzero.starknet_artifacts.json +1 -0
  472. package/target/dev/layerzero_BlockedMessageLib.compiled_contract_class.json +1 -0
  473. package/target/dev/layerzero_BlockedMessageLib.contract_class.json +1 -0
  474. package/target/dev/layerzero_Dvn.compiled_contract_class.json +1 -0
  475. package/target/dev/layerzero_Dvn.contract_class.json +1 -0
  476. package/target/dev/layerzero_DvnFeeLib.compiled_contract_class.json +1 -0
  477. package/target/dev/layerzero_DvnFeeLib.contract_class.json +1 -0
  478. package/target/dev/layerzero_Endpoint.compiled_contract_class.json +1 -0
  479. package/target/dev/layerzero_Endpoint.contract_class.json +1 -0
  480. package/target/dev/layerzero_Executor.compiled_contract_class.json +1 -0
  481. package/target/dev/layerzero_Executor.contract_class.json +1 -0
  482. package/target/dev/layerzero_ExecutorFeeLib.compiled_contract_class.json +1 -0
  483. package/target/dev/layerzero_ExecutorFeeLib.contract_class.json +1 -0
  484. package/target/dev/layerzero_OApp.compiled_contract_class.json +1 -0
  485. package/target/dev/layerzero_OApp.contract_class.json +1 -0
  486. package/target/dev/layerzero_OFT.compiled_contract_class.json +1 -0
  487. package/target/dev/layerzero_OFT.contract_class.json +1 -0
  488. package/target/dev/layerzero_OFTAdapter.compiled_contract_class.json +1 -0
  489. package/target/dev/layerzero_OFTAdapter.contract_class.json +1 -0
  490. package/target/dev/layerzero_OmniCounter.compiled_contract_class.json +1 -0
  491. package/target/dev/layerzero_OmniCounter.contract_class.json +1 -0
  492. package/target/dev/layerzero_PriceFeed.compiled_contract_class.json +1 -0
  493. package/target/dev/layerzero_PriceFeed.contract_class.json +1 -0
  494. package/target/dev/layerzero_SimpleMessageLib.compiled_contract_class.json +1 -0
  495. package/target/dev/layerzero_SimpleMessageLib.contract_class.json +1 -0
  496. package/target/dev/layerzero_Treasury.compiled_contract_class.json +1 -0
  497. package/target/dev/layerzero_Treasury.contract_class.json +1 -0
  498. package/target/dev/layerzero_UltraLightNode.compiled_contract_class.json +1 -0
  499. package/target/dev/layerzero_UltraLightNode.contract_class.json +1 -0
  500. package/target/dev/lz_utils.sierra.json +1 -0
  501. package/target/dev/multisig.sierra.json +1 -0
  502. package/tools/update_contracts.sh +19 -0
  503. package/tsconfig.json +20 -0
  504. package/tsup.config.ts +7 -0
@@ -0,0 +1,453 @@
1
+ //! Messaging channel component
2
+
3
+ /// # `MessagingChannelComponent`
4
+ ///
5
+ /// This component handles the critical messaging infrastructure for LayerZero cross-chain
6
+ /// communication.
7
+ /// It manages inbound and outbound nonces, payload hash verification, and provides mechanisms for
8
+ /// message lifecycle management including skipping, nilifying, and burning messages.
9
+ ///
10
+ /// ## Key features
11
+ /// - Ordered message execution with nonce management
12
+ /// - Payload hash verification for message integrity
13
+ /// - Lazy nonce updates for gas optimization
14
+ /// - Message lifecycle management (skip, nilify, burn)
15
+ /// - GUID generation for unique message identification
16
+ #[starknet::component]
17
+ pub mod MessagingChannelComponent {
18
+ use lz_utils::bytes::{Bytes32, ContractAddressIntoBytes32};
19
+ use lz_utils::keccak::keccak256;
20
+ use starknet::ContractAddress;
21
+ use starknet::storage::{
22
+ Map, Mutable, StoragePath, StoragePathEntry, StoragePointerReadAccess,
23
+ StoragePointerWriteAccess,
24
+ };
25
+ use starkware_utils::errors::assert_with_byte_array;
26
+ use crate::common::guid::GUID;
27
+ use crate::common::structs::packet::Origin;
28
+ use crate::endpoint::constants::{EMPTY_PAYLOAD_HASH, NIL_PAYLOAD_HASH};
29
+ use crate::endpoint::messaging_channel::errors::{err_invalid_nonce, err_payload_hash_not_found};
30
+ use crate::endpoint::messaging_channel::events::{
31
+ InboundNonceSkipped, PacketBurnt, PacketNilified,
32
+ };
33
+ use crate::endpoint::messaging_channel::interface::IMessagingChannel;
34
+
35
+ /// =============================== Storage =================================
36
+
37
+ #[storage]
38
+ pub struct Storage {
39
+ /// The universally unique endpoint identifier for this deployed instance
40
+ pub eid: u32,
41
+ /// Outbound nonce tracking: sender => [dstEid => [receiver => nonce]]
42
+ ///
43
+ /// Tracks the number of messages sent from each sender to each destination.
44
+ /// Incremented atomically when messages are sent.
45
+ pub outbound_nonce: Map<ContractAddress, Map<u32, Map<Bytes32, u64>>>,
46
+ /// Lazy inbound nonce tracking: receiver => [srcEid => [sender => nonce]]
47
+ ///
48
+ /// Represents the last processed nonce (checkpoint) for each path.
49
+ /// Updated lazily when messages are executed or explicitly skipped.
50
+ /// Used as starting point for calculating effective inbound nonce.
51
+ pub lazy_inbound_nonce: Map<ContractAddress, Map<u32, Map<Bytes32, u64>>>,
52
+ /// Inbound payload hash storage: receiver => [srcEid => [sender => [nonce => payloadHash]]]
53
+ ///
54
+ /// Stores payload hashes for verified but not yet executed messages.
55
+ /// EMPTY_PAYLOAD_HASH (0) indicates message has been executed.
56
+ /// NIL_PAYLOAD_HASH (max) indicates message has been nilified.
57
+ /// Actual hash indicates message is verified and ready for execution.
58
+ pub inbound_payload_hash: Map<ContractAddress, Map<u32, Map<Bytes32, Map<u64, Bytes32>>>>,
59
+ }
60
+
61
+ /// =============================== Events =================================
62
+ #[event]
63
+ #[derive(Drop, starknet::Event)]
64
+ pub enum Event {
65
+ InboundNonceSkipped: InboundNonceSkipped,
66
+ PacketNilified: PacketNilified,
67
+ PacketBurnt: PacketBurnt,
68
+ }
69
+
70
+ // =============================== Hooks =================================
71
+ pub trait IMessagingChannelHooks<TContractState> {
72
+ fn _assert_authorized(self: @ComponentState<TContractState>, receiver: ContractAddress);
73
+ }
74
+
75
+ /// =============================== Public Interface =================================
76
+
77
+ #[embeddable_as(MessagingChannel)]
78
+ impl MessagingChannelImpl<
79
+ TContractState,
80
+ +HasComponent<TContractState>,
81
+ impl IMessagingChannelHooks: IMessagingChannelHooks<TContractState>,
82
+ > of IMessagingChannel<ComponentState<TContractState>> {
83
+ fn inbound_nonce(
84
+ self: @ComponentState<TContractState>,
85
+ receiver: ContractAddress,
86
+ src_eid: u32,
87
+ sender: Bytes32,
88
+ ) -> u64 {
89
+ // Start from the last lazy checkpoint
90
+ let mut nonce_cursor = self.lazy_inbound_nonce(receiver, src_eid, sender);
91
+
92
+ // Find the effective inbound nonce by checking consecutive verified nonces
93
+ while self._has_payload_hash(receiver, src_eid, sender, nonce_cursor + 1) {
94
+ nonce_cursor += 1;
95
+ }
96
+ nonce_cursor
97
+ }
98
+
99
+ fn outbound_nonce(
100
+ self: @ComponentState<TContractState>,
101
+ sender: ContractAddress,
102
+ dst_eid: u32,
103
+ receiver: Bytes32,
104
+ ) -> u64 {
105
+ self.outbound_nonce.entry(sender).entry(dst_eid).entry(receiver).read()
106
+ }
107
+
108
+ fn inbound_payload_hash(
109
+ self: @ComponentState<TContractState>,
110
+ receiver: ContractAddress,
111
+ src_eid: u32,
112
+ sender: Bytes32,
113
+ nonce: u64,
114
+ ) -> Bytes32 {
115
+ self._inbound_payload_hash(receiver, src_eid, sender, nonce)
116
+ }
117
+
118
+ fn lazy_inbound_nonce(
119
+ self: @ComponentState<TContractState>,
120
+ receiver: ContractAddress,
121
+ src_eid: u32,
122
+ sender: Bytes32,
123
+ ) -> u64 {
124
+ // Using helper function for consistent storage access
125
+ self.lazy_inbound_nonce.entry(receiver).entry(src_eid).entry(sender).read()
126
+ }
127
+
128
+ fn skip(
129
+ ref self: ComponentState<TContractState>, receiver: ContractAddress, origin: Origin,
130
+ ) {
131
+ self._assert_authorized(receiver);
132
+
133
+ let Origin { src_eid, sender, nonce } = origin;
134
+
135
+ // Ensure the provided nonce is exactly the next expected nonce
136
+ assert_with_byte_array(
137
+ nonce == self.inbound_nonce(receiver, src_eid, sender) + 1, err_invalid_nonce(),
138
+ );
139
+
140
+ // Update the lazy inbound nonce to the skipped nonce (using helper function)
141
+ self._lazy_inbound_nonce_entry(receiver, src_eid, sender).write(nonce);
142
+
143
+ self.emit(InboundNonceSkipped { receiver, src_eid, sender, nonce });
144
+ }
145
+
146
+ fn nilify(
147
+ ref self: ComponentState<TContractState>,
148
+ receiver: ContractAddress,
149
+ origin: Origin,
150
+ payload_hash: Bytes32,
151
+ ) {
152
+ self._assert_authorized(receiver);
153
+
154
+ // Validate and get current payload hash (using consolidated validation helper)
155
+ let current_payload_hash = self
156
+ ._validate_and_get_payload_hash(receiver, @origin, payload_hash);
157
+
158
+ let Origin { src_eid, sender, nonce } = origin;
159
+
160
+ // Get the current lazy nonce for validation (using helper function)
161
+ let lazy_nonce = self._lazy_inbound_nonce_entry(receiver, src_eid, sender).read();
162
+
163
+ // If nonce is smaller or equal to the lazy nonce, ensure it's not already executed
164
+ assert_with_byte_array(
165
+ nonce > lazy_nonce || current_payload_hash != EMPTY_PAYLOAD_HASH,
166
+ err_invalid_nonce(),
167
+ );
168
+
169
+ // Set the payload hash to NIL to prevent execution (using helper function)
170
+ self
171
+ ._inbound_payload_hash_entry(receiver, src_eid, sender, nonce)
172
+ .write(NIL_PAYLOAD_HASH);
173
+
174
+ self.emit(PacketNilified { receiver, src_eid, sender, nonce, payload_hash });
175
+ }
176
+
177
+ fn burn(
178
+ ref self: ComponentState<TContractState>,
179
+ receiver: ContractAddress,
180
+ origin: Origin,
181
+ payload_hash: Bytes32,
182
+ ) {
183
+ self._assert_authorized(receiver);
184
+
185
+ let current_payload_hash = self
186
+ ._validate_and_get_payload_hash(receiver, @origin, payload_hash);
187
+
188
+ let Origin { src_eid, sender, nonce } = origin;
189
+
190
+ let lazy_nonce = self._lazy_inbound_nonce_entry(receiver, src_eid, sender).read();
191
+
192
+ // Ensure the message hasn't been executed and nonce is smaller or equal to the lazy
193
+ // nonce
194
+ assert_with_byte_array(
195
+ current_payload_hash != EMPTY_PAYLOAD_HASH && nonce <= lazy_nonce,
196
+ err_invalid_nonce(),
197
+ );
198
+
199
+ // Permanently remove the payload hash (using helper function)
200
+ self
201
+ ._inbound_payload_hash_entry(receiver, src_eid, sender, nonce)
202
+ .write(EMPTY_PAYLOAD_HASH);
203
+
204
+ self.emit(PacketBurnt { receiver, src_eid, sender, nonce, payload_hash });
205
+ }
206
+
207
+ fn next_guid(
208
+ self: @ComponentState<TContractState>,
209
+ sender: ContractAddress,
210
+ dst_eid: u32,
211
+ receiver: Bytes32,
212
+ ) -> Bytes32 {
213
+ let next_nonce = self.outbound_nonce(sender, dst_eid, receiver) + 1;
214
+
215
+ GUID::generate(next_nonce, self.eid.read(), sender.into(), dst_eid, receiver.into())
216
+ }
217
+ }
218
+
219
+ /// =============================== Internal Interface =================================
220
+
221
+ /// Internal interface for component functions used by the endpoint and other components
222
+ #[generate_trait]
223
+ pub impl InternalImpl<
224
+ TContractState, +HasComponent<TContractState>,
225
+ > of InternalTrait<TContractState> {
226
+ /// Initialize the MessagingChannel component with the endpoint ID
227
+ ///
228
+ /// Should be called during contract deployment/initialization.
229
+ /// The endpoint ID is immutable once set.
230
+ ///
231
+ /// # Arguments
232
+ ///
233
+ /// * `eid`: The universally unique endpoint identifier
234
+ fn initializer(ref self: ComponentState<TContractState>, eid: u32) {
235
+ self.eid.write(eid);
236
+ }
237
+
238
+ /// Returns a mutable storage path for the outbound nonce
239
+ ///
240
+ /// Used internally by the endpoint to increment nonces when sending messages.
241
+ ///
242
+ /// # Arguments
243
+ ///
244
+ /// * `sender`: The sender contract address
245
+ /// * `dst_eid`: The destination endpoint ID
246
+ /// * `receiver`: The receiver address on the destination chain
247
+ ///
248
+ /// # Returns
249
+ ///
250
+ /// * `StoragePath<Mutable<u64>>`: Mutable storage path for the outbound nonce
251
+ fn _outbound_nonce_entry(
252
+ ref self: ComponentState<TContractState>,
253
+ sender: ContractAddress,
254
+ dst_eid: u32,
255
+ receiver: Bytes32,
256
+ ) -> StoragePath<Mutable<u64>> {
257
+ self.outbound_nonce.entry(sender).entry(dst_eid).entry(receiver)
258
+ }
259
+
260
+ /// Returns a mutable storage path for the lazy inbound nonce
261
+ ///
262
+ /// Used internally to update checkpoint nonces during message execution.
263
+ ///
264
+ /// # Arguments
265
+ ///
266
+ /// * `receiver`: The receiver contract address
267
+ /// * `src_eid`: The source endpoint ID
268
+ /// * `sender`: The sender address on the source chain
269
+ ///
270
+ /// # Returns
271
+ ///
272
+ /// * `StoragePath<Mutable<u64>>`: Mutable storage path for the lazy inbound nonce
273
+ fn _lazy_inbound_nonce_entry(
274
+ ref self: ComponentState<TContractState>,
275
+ receiver: ContractAddress,
276
+ src_eid: u32,
277
+ sender: Bytes32,
278
+ ) -> StoragePath<Mutable<u64>> {
279
+ self.lazy_inbound_nonce.entry(receiver).entry(src_eid).entry(sender)
280
+ }
281
+
282
+ /// Returns a mutable storage path for the inbound payload hash
283
+ ///
284
+ /// Used internally to store and clear payload hashes during verification and execution.
285
+ ///
286
+ /// # Arguments
287
+ ///
288
+ /// * `receiver`: The receiver contract address
289
+ /// * `src_eid`: The source endpoint ID
290
+ /// * `sender`: The sender address on the source chain
291
+ /// * `nonce`: The message nonce
292
+ ///
293
+ /// # Returns
294
+ ///
295
+ /// * `StoragePath<Mutable<Bytes32>>`: Mutable storage path for the payload hash
296
+ fn _inbound_payload_hash_entry(
297
+ ref self: ComponentState<TContractState>,
298
+ receiver: ContractAddress,
299
+ src_eid: u32,
300
+ sender: Bytes32,
301
+ nonce: u64,
302
+ ) -> StoragePath<Mutable<Bytes32>> {
303
+ self.inbound_payload_hash.entry(receiver).entry(src_eid).entry(sender).entry(nonce)
304
+ }
305
+
306
+ /// Returns the inbound payload hash
307
+ ///
308
+ /// # Arguments
309
+ ///
310
+ /// * `receiver`: The receiver contract address
311
+ /// * `src_eid`: The source endpoint ID
312
+ /// * `sender`: The sender address on the source chain
313
+ /// * `nonce`: The message nonce
314
+ ///
315
+ /// # Returns
316
+ ///
317
+ /// * `Bytes32`: The payload hash
318
+ fn _inbound_payload_hash(
319
+ self: @ComponentState<TContractState>,
320
+ receiver: ContractAddress,
321
+ src_eid: u32,
322
+ sender: Bytes32,
323
+ nonce: u64,
324
+ ) -> Bytes32 {
325
+ self
326
+ .inbound_payload_hash
327
+ .entry(receiver)
328
+ .entry(src_eid)
329
+ .entry(sender)
330
+ .entry(nonce)
331
+ .read()
332
+ }
333
+
334
+ /// Checks if a payload hash exists for a specific message
335
+ ///
336
+ /// Checks if the storage slot is not initialized.
337
+ /// Assumes computationally infeasible that payload can hash to 0.
338
+ /// Returns false for EMPTY_PAYLOAD_HASH (executed messages).
339
+ /// Returns true for both actual hashes and NIL_PAYLOAD_HASH (nilified messages).
340
+ ///
341
+ /// # Arguments
342
+ ///
343
+ /// * `receiver`: The receiver contract address
344
+ /// * `src_eid`: The source endpoint ID
345
+ /// * `sender`: The sender address on the source chain
346
+ /// * `nonce`: The message nonce to check
347
+ ///
348
+ /// # Returns
349
+ ///
350
+ /// * `bool`: True if a payload hash exists (message is verified), false otherwise
351
+ fn _has_payload_hash(
352
+ self: @ComponentState<TContractState>,
353
+ receiver: ContractAddress,
354
+ src_eid: u32,
355
+ sender: Bytes32,
356
+ nonce: u64,
357
+ ) -> bool {
358
+ self._inbound_payload_hash(receiver, src_eid, sender, nonce) != EMPTY_PAYLOAD_HASH
359
+ }
360
+
361
+ /// Validates that the provided payload hash matches the stored hash and returns it
362
+ ///
363
+ /// Consolidates repetitive payload hash validation logic used in nilify() and burn().
364
+ ///
365
+ /// # Arguments
366
+ ///
367
+ /// * `receiver`: The receiver contract address
368
+ /// * `origin`: The origin information containing source endpoint, sender, and nonce
369
+ /// * `expected_payload_hash`: The payload hash to validate against stored hash
370
+ ///
371
+ /// # Returns
372
+ ///
373
+ /// * `Bytes32`: The validated current payload hash from storage
374
+ ///
375
+ /// # Panics
376
+ ///
377
+ /// * `err_payload_hash_not_found`: If the stored hash doesn't match the expected hash
378
+ fn _validate_and_get_payload_hash(
379
+ ref self: ComponentState<TContractState>,
380
+ receiver: ContractAddress,
381
+ origin: @Origin,
382
+ expected_payload_hash: Bytes32,
383
+ ) -> Bytes32 {
384
+ let current_payload_hash = self
385
+ ._inbound_payload_hash_entry(
386
+ receiver, *origin.src_eid, *origin.sender, *origin.nonce,
387
+ )
388
+ .read();
389
+ assert_with_byte_array(
390
+ current_payload_hash == expected_payload_hash,
391
+ err_payload_hash_not_found(expected_payload_hash, current_payload_hash),
392
+ );
393
+ current_payload_hash
394
+ }
395
+
396
+ /// Clears a payload after successful execution and updates lazy nonce
397
+ ///
398
+ /// This function is called during message execution to clear verified payloads.
399
+ /// Updates the lazy_inbound_nonce to the provided nonce if it's greater than current.
400
+ /// Verifies that all nonces between current and target have payload hashes (ordered
401
+ /// execution).
402
+ /// Validates the payload hash matches the stored hash before clearing.
403
+ /// Sets the payload hash to EMPTY_PAYLOAD_HASH to mark as executed.
404
+ ///
405
+ /// # Arguments
406
+ ///
407
+ /// * `receiver`: The receiver contract address
408
+ /// * `origin`: The origin information containing source endpoint, sender, and nonce
409
+ /// * `payload`: The payload bytes to verify and clear
410
+ fn _clear_payload(
411
+ ref self: ComponentState<TContractState>,
412
+ receiver: ContractAddress,
413
+ origin: @Origin,
414
+ payload: @ByteArray,
415
+ ) {
416
+ // Get the current lazy nonce checkpoint
417
+ let lazy_nonce_entry = self
418
+ ._lazy_inbound_nonce_entry(receiver, *origin.src_eid, *origin.sender);
419
+ let current_nonce = lazy_nonce_entry.read();
420
+
421
+ // If this nonce is beyond the current checkpoint, validate ordered execution
422
+ if *origin.nonce > current_nonce {
423
+ // Ensure that no nonce between current_nonce and origin.nonce is missing a payload
424
+ // hash. Because if it is, it means we have an unverified nonce in between
425
+ // and we can't execute the packet until everything before it is committed
426
+ for nonce in current_nonce + 1..*origin.nonce {
427
+ assert_with_byte_array(
428
+ self._has_payload_hash(receiver, *origin.src_eid, *origin.sender, nonce),
429
+ err_invalid_nonce(),
430
+ );
431
+ }
432
+ // Update the lazy nonce to the current execution point
433
+ lazy_nonce_entry.write(*origin.nonce);
434
+ }
435
+
436
+ // Verify the payload hash matches what was stored during verification
437
+ let actual_payload_hash = keccak256(payload);
438
+ let hash_entry = self
439
+ ._inbound_payload_hash_entry(
440
+ receiver, *origin.src_eid, *origin.sender, *origin.nonce,
441
+ );
442
+ let expected_payload_hash = hash_entry.read();
443
+
444
+ assert_with_byte_array(
445
+ actual_payload_hash == expected_payload_hash,
446
+ err_payload_hash_not_found(expected_payload_hash, actual_payload_hash),
447
+ );
448
+
449
+ // Clear the payload hash to mark as executed
450
+ hash_entry.write(EMPTY_PAYLOAD_HASH);
451
+ }
452
+ }
453
+ }
@@ -0,0 +1,46 @@
1
+ //! Messaging composer errors
2
+
3
+ use lz_utils::bytes::Bytes32;
4
+ use lz_utils::error::{Error, format_error};
5
+
6
+ #[derive(Drop)]
7
+ pub enum MessagingChannelError {
8
+ /// Triggered when a compose message already exists and cannot be overwritten.
9
+ LzComposeAlreadyExists,
10
+ /// Triggered when a compose message is not found.
11
+ LzComposeNotFound,
12
+ /// Triggered when the value sent with a compose message exceeds the token allowance.
13
+ LzComposeValueExceedsAllowance,
14
+ }
15
+
16
+ impl ErrorNameImpl of Error<MessagingChannelError> {
17
+ fn prefix() -> ByteArray {
18
+ "LZ_MESSAGING_COMPOSER"
19
+ }
20
+
21
+ fn name(self: MessagingChannelError) -> ByteArray {
22
+ match self {
23
+ MessagingChannelError::LzComposeAlreadyExists => "LZ_COMPOSE_ALREADY_EXISTS",
24
+ MessagingChannelError::LzComposeNotFound => "LZ_COMPOSE_NOT_FOUND",
25
+ MessagingChannelError::LzComposeValueExceedsAllowance => "LZ_COMPOSE_VALUE_EXCEEDS_ALLOWANCE",
26
+ }
27
+ }
28
+ }
29
+
30
+ pub fn err_lz_compose_not_found(expected_hash: Bytes32, actual_hash: Bytes32) -> ByteArray {
31
+ format_error(
32
+ MessagingChannelError::LzComposeNotFound,
33
+ format!("Expected hash: {}, Actual hash: {}", expected_hash.value, actual_hash.value),
34
+ )
35
+ }
36
+
37
+ pub fn err_lz_compose_value_exceeds_allowance(value: u256, allowance: u256) -> ByteArray {
38
+ format_error(
39
+ MessagingChannelError::LzComposeValueExceedsAllowance,
40
+ format!("Value: {}, Allowance: {}", value, allowance),
41
+ )
42
+ }
43
+
44
+ pub fn err_lz_compose_already_exists() -> ByteArray {
45
+ format_error(MessagingChannelError::LzComposeAlreadyExists, "")
46
+ }
@@ -0,0 +1,67 @@
1
+ //! Messaging composer events
2
+
3
+ use lz_utils::bytes::Bytes32;
4
+ use starknet::ContractAddress;
5
+
6
+ /// Emitted when a compose message is sent.
7
+ #[derive(Drop, starknet::Event)]
8
+ pub struct ComposeSent {
9
+ /// The sender of the compose message.
10
+ #[key]
11
+ pub from: ContractAddress,
12
+ /// The recipient of the compose message.
13
+ #[key]
14
+ pub to: ContractAddress,
15
+ /// The GUID of the original message.
16
+ #[key]
17
+ pub guid: Bytes32,
18
+ /// The index of the compose message.
19
+ pub index: u16,
20
+ /// The message payload.
21
+ pub message: ByteArray,
22
+ }
23
+
24
+ /// Emitted when a compose message is delivered.
25
+ #[derive(Drop, starknet::Event)]
26
+ pub struct ComposeDelivered {
27
+ /// The sender of the compose message.
28
+ #[key]
29
+ pub from: ContractAddress,
30
+ /// The recipient of the compose message.
31
+ #[key]
32
+ pub to: ContractAddress,
33
+ /// The GUID of the original message.
34
+ #[key]
35
+ pub guid: Bytes32,
36
+ /// The index of the compose message.
37
+ pub index: u16,
38
+ }
39
+
40
+ /// Emitted when a compose message fails.
41
+ #[derive(Drop, starknet::Event)]
42
+ pub struct LzComposeAlert {
43
+ /// The sender of the compose message.
44
+ #[key]
45
+ pub from: ContractAddress,
46
+ /// The recipient of the compose message.
47
+ #[key]
48
+ pub to: ContractAddress,
49
+ /// The address of the executor that triggered the alert.
50
+ #[key]
51
+ pub executor: ContractAddress,
52
+ /// The GUID of the original message.
53
+ #[key]
54
+ pub guid: Bytes32,
55
+ /// The index of the compose message.
56
+ pub index: u16,
57
+ /// The gas amount related to the alert.
58
+ pub gas: u256,
59
+ /// The value sent with the message.
60
+ pub value: u256,
61
+ /// The message payload.
62
+ pub message: ByteArray,
63
+ /// Extra data provided with the alert.
64
+ pub extra_data: ByteArray,
65
+ /// The reason for the alert.
66
+ pub reason: Array<felt252>,
67
+ }