@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,688 @@
1
+ /// # Endpoint Contract
2
+ ///
3
+ /// The Endpoint contract is the core component of the LayerZero protocol, responsible for
4
+ /// managing the lifecycle of messages between different OApps. It provides a comprehensive set of
5
+ /// functionalities that enable developers to build sophisticated omnichain applications (OApps)
6
+ /// with ease.
7
+ ///
8
+ /// ## Key Features
9
+ /// - **Message Sending and Receiving**: Core functions for sending and receiving messages across
10
+ /// different blockchains, abstracting away the complexities of cross-chain communication.
11
+ /// - **Configurable Security**: OApps can define their own security requirements by specifying a
12
+ /// set of Data Verification Networks (DVNs) and a threshold of required verifications,
13
+ /// ensuring that each message meets the application's security standards.
14
+ /// - **Fee Quotation**: Provides a mechanism to quote the cost of sending a message, allowing
15
+ /// applications to estimate and manage transaction fees transparently.
16
+ /// - **Message Verification and Execution**: Verifies the authenticity of incoming messages
17
+ /// through the configured DVNs and ensures that only valid messages are executed.
18
+ /// - **Commit-Store-Execute Pattern**: Implements a secure message handling pattern where message
19
+ /// commitments are stored on-chain and executed only after successful verification,
20
+ /// preventing race conditions and other security vulnerabilities.
21
+ /// - **Alerts and Error Handling**: Includes a system for receiving alerts about failed
22
+ /// messages, enabling robust error handling and recovery mechanisms.
23
+ /// - **Delegate and Token Management**: Supports delegation of OApp configuration management and
24
+ /// allows for the use of the ZRO token for paying fees.
25
+ #[starknet::contract]
26
+ pub mod Endpoint {
27
+ use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
28
+ use core::num::traits::Zero;
29
+ use lz_utils::bytes::{Bytes32, ContractAddressIntoBytes32};
30
+ use openzeppelin::access::ownable::OwnableComponent;
31
+ use openzeppelin::security::ReentrancyGuardComponent;
32
+ use openzeppelin::token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait};
33
+ use starknet::storage::{
34
+ Map, StoragePathEntry, StoragePointerReadAccess, StoragePointerWriteAccess,
35
+ };
36
+ use starknet::{ContractAddress, get_caller_address, get_contract_address};
37
+ use starkware_utils::errors::assert_with_byte_array;
38
+ use crate::MessagingFee;
39
+ use crate::common::guid::GUID;
40
+ use crate::common::structs::messaging::{MessageLibSendResult, MessageReceipt, MessagingParams};
41
+ use crate::common::structs::packet::{Origin, Packet};
42
+ use crate::endpoint::constants::{EMPTY_PAYLOAD_HASH, NIL_PAYLOAD_HASH};
43
+ use crate::endpoint::errors;
44
+ use crate::endpoint::events::{
45
+ DelegateSet, LzReceiveAlert, LzTokenSet, PacketCommitted, PacketDelivered, PacketSent,
46
+ };
47
+ use crate::endpoint::interfaces::endpoint::{ExecutionState, IEndpoint};
48
+ use crate::endpoint::interfaces::layerzero_receiver::{
49
+ ILayerZeroReceiverDispatcher, ILayerZeroReceiverDispatcherTrait,
50
+ };
51
+ use crate::endpoint::message_lib_manager::message_lib_manager::MessageLibManagerComponent;
52
+ use crate::endpoint::message_lib_manager::structs::GetLibraryResponse;
53
+ use crate::endpoint::messaging_channel::interface::IMessagingChannel;
54
+ use crate::endpoint::messaging_channel::messaging_channel::MessagingChannelComponent;
55
+ use crate::endpoint::messaging_composer::messaging_composer::MessagingComposerComponent;
56
+ use crate::message_lib::interface::{IMessageLibDispatcher, IMessageLibDispatcherTrait};
57
+
58
+ ////////////////
59
+ // Components //
60
+ ////////////////
61
+
62
+ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
63
+ component!(
64
+ path: MessageLibManagerComponent,
65
+ storage: message_lib_manager,
66
+ event: MessageLibManagerEvent,
67
+ );
68
+ component!(
69
+ path: ReentrancyGuardComponent, storage: reentrancy_guard, event: ReentrancyGuardEvent,
70
+ );
71
+ component!(
72
+ path: MessagingChannelComponent, storage: messaging_channel, event: MessagingChannelEvent,
73
+ );
74
+ component!(
75
+ path: MessagingComposerComponent,
76
+ storage: messaging_composer,
77
+ event: MessagingComposerEvent,
78
+ );
79
+
80
+ // Ownable
81
+ #[abi(embed_v0)]
82
+ impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
83
+ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;
84
+
85
+ #[abi(embed_v0)]
86
+ impl MessageLibManagerImpl =
87
+ MessageLibManagerComponent::MessageLibManagerImpl<ContractState>;
88
+ impl MessageLibManagerInternalImpl = MessageLibManagerComponent::InternalImpl<ContractState>;
89
+
90
+ // ReentrancyGuard
91
+ impl ReentrancyGuardInternalImpl = ReentrancyGuardComponent::InternalImpl<ContractState>;
92
+
93
+ // MessagingChannel
94
+ #[abi(embed_v0)]
95
+ impl MessagingChannelImpl =
96
+ MessagingChannelComponent::MessagingChannel<ContractState>;
97
+ impl MessagingChannelInternalImpl = MessagingChannelComponent::InternalImpl<ContractState>;
98
+
99
+ // MessagingComposer
100
+ #[abi(embed_v0)]
101
+ impl MessagingComposerImpl =
102
+ MessagingComposerComponent::MessagingComposerImpl<ContractState>;
103
+ impl MessagingComposerInternalImpl = MessagingComposerComponent::InternalImpl<ContractState>;
104
+
105
+ #[storage]
106
+ struct Storage {
107
+ // Native token address
108
+ native_token_address: ContractAddress,
109
+ lz_token_address: ContractAddress,
110
+ // Delegates
111
+ // Used to authorize OApps to set their own libraries
112
+ // oapp => delegate
113
+ delegates: Map<ContractAddress, ContractAddress>,
114
+ // Component substorages:
115
+ #[substorage(v0)]
116
+ ownable: OwnableComponent::Storage,
117
+ #[substorage(v0)]
118
+ message_lib_manager: MessageLibManagerComponent::Storage,
119
+ #[substorage(v0)]
120
+ reentrancy_guard: ReentrancyGuardComponent::Storage,
121
+ #[substorage(v0)]
122
+ messaging_channel: MessagingChannelComponent::Storage,
123
+ #[substorage(v0)]
124
+ messaging_composer: MessagingComposerComponent::Storage,
125
+ }
126
+
127
+ #[event]
128
+ #[derive(Drop, starknet::Event)]
129
+ pub enum Event {
130
+ PacketSent: PacketSent,
131
+ // Library-config events are now exclusively emitted by the MessageLibManager component
132
+ PacketCommitted: PacketCommitted,
133
+ PacketDelivered: PacketDelivered,
134
+ LzTokenSet: LzTokenSet,
135
+ LzReceiveAlert: LzReceiveAlert,
136
+ DelegateSet: DelegateSet,
137
+ // Component events:
138
+ #[flat]
139
+ OwnableEvent: OwnableComponent::Event,
140
+ #[flat]
141
+ ReentrancyGuardEvent: ReentrancyGuardComponent::Event,
142
+ #[flat]
143
+ MessagingChannelEvent: MessagingChannelComponent::Event,
144
+ #[flat]
145
+ MessageLibManagerEvent: MessageLibManagerComponent::Event,
146
+ #[flat]
147
+ MessagingComposerEvent: MessagingComposerComponent::Event,
148
+ }
149
+
150
+ #[constructor]
151
+ fn constructor(
152
+ ref self: ContractState,
153
+ owner: ContractAddress,
154
+ eid: u32,
155
+ native_token_address: ContractAddress,
156
+ blocked_library: ContractAddress,
157
+ ) {
158
+ self.ownable.initializer(owner);
159
+ // Initialize MessagingChannel with EID
160
+ self.messaging_channel.initializer(eid);
161
+ // Initialize Native token
162
+ self.native_token_address.write(native_token_address);
163
+ // Initialize MessagingComposer with native token
164
+ self.messaging_composer.initializer(native_token_address);
165
+ // Initialize MessageLibManager with blocked library
166
+ self.message_lib_manager.initializer(blocked_library);
167
+ }
168
+
169
+ #[abi(embed_v0)]
170
+ impl EndpointImpl of IEndpoint<ContractState> {
171
+ /// Here we're assuming that the OApp takes an allowance from the user,
172
+ /// takes that money from the user, gives that as allowance to the Endpoint
173
+ /// and then the endpoint gives the remainder back to the refund_address provided
174
+ fn send(
175
+ ref self: ContractState, params: MessagingParams, refund_address: ContractAddress,
176
+ ) -> MessageReceipt {
177
+ self.reentrancy_guard.start();
178
+
179
+ let sender = get_caller_address();
180
+
181
+ // Create the packet and find the send message lib
182
+ let (packet, message_lib_dispatcher) = self._send(sender, @params);
183
+
184
+ let MessagingParams { options, pay_in_lz_token, dst_eid, receiver, .. } = params;
185
+
186
+ // Update the nonce
187
+ self
188
+ .messaging_channel
189
+ ._outbound_nonce_entry(sender, dst_eid, receiver)
190
+ .write(packet.nonce);
191
+
192
+ // Call send on the message lib
193
+ let MessageLibSendResult {
194
+ message_receipt, encoded_packet,
195
+ } = message_lib_dispatcher.send(packet, options.clone(), pay_in_lz_token);
196
+
197
+ // Pay the workers based on the quote provided by the message lib
198
+ self._pay_workers(sender, @message_receipt, refund_address, pay_in_lz_token);
199
+
200
+ self
201
+ .emit(
202
+ PacketSent {
203
+ encoded_packet,
204
+ options,
205
+ send_library: message_lib_dispatcher.contract_address,
206
+ },
207
+ );
208
+
209
+ self.reentrancy_guard.end();
210
+ message_receipt
211
+ }
212
+
213
+ fn lz_receive_alert(
214
+ ref self: ContractState,
215
+ origin: Origin,
216
+ receiver: ContractAddress,
217
+ guid: Bytes32,
218
+ gas: u256,
219
+ value: u256,
220
+ message: ByteArray,
221
+ extra_data: ByteArray,
222
+ reason: Array<felt252>,
223
+ ) {
224
+ let executor = get_caller_address();
225
+ self
226
+ .emit(
227
+ LzReceiveAlert {
228
+ origin, receiver, executor, guid, gas, value, message, extra_data, reason,
229
+ },
230
+ );
231
+ }
232
+
233
+
234
+ /// This is the same thing as `verify` in the EVM implementation
235
+ /// and `commitVerification` in the TON implementation
236
+ fn commit(
237
+ ref self: ContractState,
238
+ origin: Origin,
239
+ receiver: ContractAddress,
240
+ payload_hash: Bytes32,
241
+ ) {
242
+ // Assert that the caller is the receive library for this path
243
+ self._assert_only_receive_library(receiver, origin.src_eid);
244
+
245
+ // Get the lazy inbound nonce for this path
246
+ let lazy_nonce = self
247
+ .messaging_channel
248
+ .lazy_inbound_nonce(receiver, origin.src_eid, origin.sender);
249
+
250
+ // Ensure that the path is initializable
251
+ assert_with_byte_array(
252
+ self._initializable(origin.clone(), receiver, lazy_nonce),
253
+ errors::err_path_not_initializable(),
254
+ );
255
+
256
+ // Ensure that the path is verifiable
257
+ assert_with_byte_array(
258
+ self._committable(origin.clone(), receiver, lazy_nonce),
259
+ errors::err_path_not_committable(),
260
+ );
261
+
262
+ // Ensure that the payload hash is valid
263
+ assert_with_byte_array(
264
+ payload_hash != EMPTY_PAYLOAD_HASH, errors::err_invalid_payload_hash(),
265
+ );
266
+
267
+ // Store the payload hash for this inbound message
268
+ self
269
+ .messaging_channel
270
+ ._inbound_payload_hash_entry(receiver, origin.src_eid, origin.sender, origin.nonce)
271
+ .write(payload_hash);
272
+
273
+ self.emit(PacketCommitted { origin, receiver, payload_hash });
274
+ }
275
+
276
+ /// @dev MESSAGING STEP 3 - the last step
277
+ /// @dev execute a verified message to the designated receiver
278
+ /// @dev the execution provides the execution context (caller, extraData) to the receiver.
279
+ /// the receiver can optionally assert the caller and validate the untrusted extraData @dev
280
+ /// cant reentrant because the payload is cleared before execution @param origin the origin
281
+ /// of the message @param receiver the receiver of the message
282
+ /// @param guid the guid of the message
283
+ /// @param message the message
284
+ /// @param _extraData the extra data provided by the executor. This data is untrusted and
285
+ /// should be validated.
286
+ fn lz_receive(
287
+ ref self: ContractState,
288
+ origin: Origin,
289
+ receiver: ContractAddress,
290
+ guid: Bytes32,
291
+ message: ByteArray,
292
+ value: u256,
293
+ extra_data: ByteArray,
294
+ ) {
295
+ // Create payload by concatenating guid and message
296
+ let payload = self._create_payload(guid, @message);
297
+
298
+ // Clear the payload first to prevent reentrancy, then execute the message
299
+ self.messaging_channel._clear_payload(receiver, @origin, @payload);
300
+
301
+ // Check if the LzReceive.value is greater than the allowance
302
+ let executor = get_caller_address();
303
+
304
+ let native_token_dispatcher = IERC20Dispatcher {
305
+ contract_address: self.native_token_address.read(),
306
+ };
307
+ let allowance = native_token_dispatcher.allowance(executor, get_contract_address());
308
+ assert_with_byte_array(
309
+ value <= allowance,
310
+ errors::err_lz_receive_value_exceeds_allowance(value, allowance),
311
+ );
312
+
313
+ // Transfer the LzReceive.value to the receiver
314
+ native_token_dispatcher.transfer_from(executor, receiver, value);
315
+
316
+ // We're calling .lz_receive after giving it the money, so they can have the money
317
+ // available to use it to handle the message
318
+ let receiver_dispatcher = ILayerZeroReceiverDispatcher { contract_address: receiver };
319
+ receiver_dispatcher
320
+ .lz_receive(origin.clone(), guid, message, executor, value, extra_data);
321
+
322
+ self.emit(PacketDelivered { origin, receiver });
323
+ }
324
+
325
+ fn clear(
326
+ ref self: ContractState,
327
+ origin: Origin,
328
+ receiver: ContractAddress,
329
+ guid: Bytes32,
330
+ message: ByteArray,
331
+ ) {
332
+ self._assert_authorized(receiver);
333
+
334
+ /// Create payload by concatenating guid and message
335
+ let payload = self._create_payload(guid, @message);
336
+
337
+ /// Clear the payload first to prevent reentrancy, then execute the message
338
+ self.messaging_channel._clear_payload(receiver, @origin, @payload);
339
+
340
+ self.emit(PacketDelivered { origin, receiver });
341
+ }
342
+
343
+ fn quote(
344
+ self: @ContractState, params: MessagingParams, sender: ContractAddress,
345
+ ) -> MessagingFee {
346
+ let (packet, msg_lib_dispatcher) = self._send(sender, @params);
347
+ msg_lib_dispatcher.quote(packet, params.options, params.pay_in_lz_token)
348
+ }
349
+
350
+ fn get_lz_token(self: @ContractState) -> ContractAddress {
351
+ self.lz_token_address.read()
352
+ }
353
+
354
+ fn get_eid(self: @ContractState) -> u32 {
355
+ self.messaging_channel.eid.read()
356
+ }
357
+
358
+ fn set_lz_token(ref self: ContractState, lz_token_address: ContractAddress) {
359
+ self.ownable.assert_only_owner();
360
+ self.lz_token_address.write(lz_token_address);
361
+ self.emit(LzTokenSet { lz_token_address });
362
+ }
363
+
364
+ fn set_delegate(ref self: ContractState, delegate: ContractAddress) {
365
+ let oapp = get_caller_address();
366
+ self.delegates.entry(oapp).write(delegate);
367
+ self.emit(DelegateSet { oapp, delegate });
368
+ }
369
+
370
+ fn get_delegate(self: @ContractState, oapp: ContractAddress) -> ContractAddress {
371
+ self.delegates.entry(oapp).read()
372
+ }
373
+
374
+ fn initializable(self: @ContractState, origin: Origin, receiver: ContractAddress) -> bool {
375
+ let lazy_nonce = self
376
+ .messaging_channel
377
+ .lazy_inbound_nonce(receiver, origin.src_eid, origin.sender);
378
+ self._initializable(origin, receiver, lazy_nonce)
379
+ }
380
+
381
+ fn committable(self: @ContractState, origin: Origin, receiver: ContractAddress) -> bool {
382
+ let Origin { src_eid, sender, .. } = origin.clone();
383
+ let lazy_nonce = self.messaging_channel.lazy_inbound_nonce(receiver, src_eid, sender);
384
+ self._committable(origin, receiver, lazy_nonce)
385
+ }
386
+
387
+ fn committable_with_receive_lib(
388
+ self: @ContractState,
389
+ origin: Origin,
390
+ receiver: ContractAddress,
391
+ receive_lib: ContractAddress,
392
+ ) -> bool {
393
+ self.committable(origin.clone(), receiver)
394
+ && self
395
+ .message_lib_manager
396
+ .is_valid_receive_library(
397
+ receiver, origin.src_eid, receive_lib.try_into().unwrap(),
398
+ )
399
+ }
400
+
401
+ fn executable(
402
+ self: @ContractState, origin: Origin, receiver: ContractAddress,
403
+ ) -> ExecutionState {
404
+ let Origin { src_eid, sender, nonce } = origin;
405
+
406
+ let payload_hash = self
407
+ .messaging_channel
408
+ .inbound_payload_hash(receiver, src_eid, sender, nonce);
409
+
410
+ // executed if the payload hash has been cleared and the nonce is less than or equal to
411
+ // lazyInboundNonce
412
+ if payload_hash.value == EMPTY_PAYLOAD_HASH.value
413
+ && nonce <= self.messaging_channel.lazy_inbound_nonce(receiver, src_eid, sender) {
414
+ return ExecutionState::Executed;
415
+ }
416
+
417
+ // executable if nonce has not been executed and has not been nilified and nonce is less
418
+ // than or equal to inboundNonce
419
+ if payload_hash.value != NIL_PAYLOAD_HASH.value
420
+ && nonce <= self.messaging_channel.inbound_nonce(receiver, src_eid, sender) {
421
+ return ExecutionState::Executable;
422
+ }
423
+
424
+ // only start active executable polling if payload hash is not empty nor nil
425
+ if payload_hash.value != EMPTY_PAYLOAD_HASH.value
426
+ && payload_hash.value != NIL_PAYLOAD_HASH.value {
427
+ return ExecutionState::VerifiedButNotExecutable;
428
+ }
429
+
430
+ // return NotExecutable as a catch-all
431
+ ExecutionState::NotExecutable
432
+ }
433
+ }
434
+
435
+ // =============================== Internal Functions ===============================
436
+
437
+ #[generate_trait]
438
+ impl InternalImpl of InternalTrait {
439
+ fn _send(
440
+ self: @ContractState, sender: ContractAddress, params: @MessagingParams,
441
+ ) -> (Packet, IMessageLibDispatcher) {
442
+ let MessagingParams { dst_eid, receiver, message, pay_in_lz_token, .. } = params;
443
+ let src_eid = self.messaging_channel.eid.read();
444
+
445
+ assert_with_byte_array(
446
+ !(*pay_in_lz_token && self.lz_token_address.read().is_zero()),
447
+ errors::err_lz_token_unavailable(),
448
+ );
449
+
450
+ let nonce = self.messaging_channel.outbound_nonce(sender, *dst_eid, *receiver) + 1;
451
+
452
+ let packet = Packet {
453
+ nonce,
454
+ src_eid,
455
+ sender,
456
+ dst_eid: *dst_eid,
457
+ receiver: *receiver,
458
+ guid: GUID::generate(nonce, src_eid, sender.into(), *dst_eid, *receiver.into()),
459
+ message: message.clone(),
460
+ };
461
+
462
+ let GetLibraryResponse {
463
+ lib: send_msglib, ..,
464
+ } = self.message_lib_manager.get_send_library(sender, *dst_eid);
465
+
466
+ let message_lib_dispatcher = IMessageLibDispatcher { contract_address: send_msglib };
467
+
468
+ (packet, message_lib_dispatcher)
469
+ }
470
+
471
+ fn _pay_workers(
472
+ ref self: ContractState,
473
+ sender: ContractAddress,
474
+ message_receipt: @MessageReceipt,
475
+ refund_address: ContractAddress,
476
+ pay_in_lz_token: bool,
477
+ ) {
478
+ // In order to satisfy the requirement of throwing a custom error in case the user
479
+ // didn't send enough fees to pay all of the workers,
480
+ // We follow this two step process to make sure none of the ERC20 transfers fail.
481
+ // First, we loop through the payees and make sure we have enough allowance to pay all
482
+ // of them
483
+ // Note that we do this loop twice, because we can't trust the message library to
484
+ // send us a non-consistent receipt (total_native_fee != sum(payees.native_amount))
485
+ // which would result in inaccurate allowance checks and some money remaining in the
486
+ // allowance.
487
+ let mut total_native_fee: u256 = 0;
488
+ let mut total_zro_fee: u256 = 0;
489
+
490
+ for payee in @message_receipt.payees {
491
+ total_native_fee += *payee.native_amount;
492
+ total_zro_fee += *payee.lz_token_amount;
493
+ }
494
+
495
+ // Native token allowance
496
+ let contract_address = get_contract_address();
497
+ let native_dispatcher = IERC20Dispatcher {
498
+ contract_address: self.native_token_address.read(),
499
+ };
500
+ let native_allowance = native_dispatcher.allowance(sender, contract_address);
501
+
502
+ // ZRO token allowance
503
+ let zro_dispatcher = if pay_in_lz_token {
504
+ Some(IERC20Dispatcher { contract_address: self.lz_token_address.read() })
505
+ } else {
506
+ None
507
+ };
508
+ let zro_allowance = zro_dispatcher
509
+ .map(|dispatcher| dispatcher.allowance(sender, contract_address))
510
+ .unwrap_or_default();
511
+
512
+ Self::_assert_messaging_fee(
513
+ total_native_fee, native_allowance, total_zro_fee, zro_allowance,
514
+ );
515
+
516
+ // Pay the workers & refund the remainder of the allowances
517
+ self._pay_native_fees(sender, native_dispatcher, message_receipt, refund_address);
518
+ self
519
+ ._refund_native(
520
+ native_dispatcher, native_allowance, total_native_fee, sender, refund_address,
521
+ );
522
+
523
+ self._pay_zro_fees(sender, zro_dispatcher, message_receipt, refund_address);
524
+ self._refund_zro(zro_dispatcher, zro_allowance, total_zro_fee, sender, refund_address);
525
+ }
526
+
527
+ fn _assert_only_receive_library(
528
+ ref self: ContractState, receiver: ContractAddress, src_eid: u32,
529
+ ) {
530
+ let caller = get_caller_address();
531
+ assert_with_byte_array(
532
+ self.message_lib_manager.is_valid_receive_library(receiver, src_eid, caller),
533
+ errors::err_invalid_receive_library(),
534
+ );
535
+ }
536
+
537
+ // Checkers for packet conditions
538
+ fn _initializable(
539
+ self: @ContractState,
540
+ origin: Origin,
541
+ receiver: ContractAddress,
542
+ lazy_inbound_nonce: u64,
543
+ ) -> bool {
544
+ let receiver_dispatcher = ILayerZeroReceiverDispatcher { contract_address: receiver };
545
+ receiver_dispatcher.allow_initialize_path(origin) || lazy_inbound_nonce > 0
546
+ }
547
+
548
+ fn _committable(
549
+ self: @ContractState,
550
+ origin: Origin,
551
+ receiver: ContractAddress,
552
+ lazy_inbound_nonce: u64,
553
+ ) -> bool {
554
+ origin.nonce > lazy_inbound_nonce
555
+ || self
556
+ .messaging_channel
557
+ ._has_payload_hash(receiver, origin.src_eid, origin.sender, origin.nonce)
558
+ }
559
+
560
+ /// Helper function to create payload by concatenating guid and message
561
+ /// This mimics Solidity's abi.encodePacked(_guid, _message)
562
+ fn _create_payload(
563
+ ref self: ContractState, guid: Bytes32, message: @ByteArray,
564
+ ) -> ByteArray {
565
+ let mut payload: ByteArray = "";
566
+ payload.append_u256(guid.value);
567
+ payload.append(message);
568
+
569
+ payload
570
+ }
571
+
572
+ fn _assert_authorized(self: @ContractState, oapp: ContractAddress) {
573
+ let caller = get_caller_address();
574
+ assert_with_byte_array(
575
+ self.delegates.entry(oapp).read() == caller || oapp == caller,
576
+ errors::err_unauthorized(),
577
+ );
578
+ }
579
+
580
+ /// Checks that the supplied fees are greater than or equal to the required fees or panics
581
+ fn _assert_messaging_fee(
582
+ required_native_fee: u256,
583
+ supplied_native_fee: u256,
584
+ required_lz_token_fee: u256,
585
+ supplied_lz_token_fee: u256,
586
+ ) {
587
+ assert_with_byte_array(
588
+ required_native_fee <= supplied_native_fee
589
+ && required_lz_token_fee <= supplied_lz_token_fee,
590
+ errors::err_insufficient_fee(
591
+ required_native_fee,
592
+ supplied_native_fee,
593
+ required_lz_token_fee,
594
+ supplied_lz_token_fee,
595
+ ),
596
+ );
597
+ }
598
+
599
+ /// Refund the remainder of the native token allowance
600
+ fn _refund_native(
601
+ self: @ContractState,
602
+ native_dispatcher: IERC20Dispatcher,
603
+ allowance: u256,
604
+ fee: u256,
605
+ sender: ContractAddress,
606
+ refund_address: ContractAddress,
607
+ ) {
608
+ if allowance > fee {
609
+ native_dispatcher.transfer_from(sender, refund_address, allowance - fee);
610
+ }
611
+ }
612
+
613
+ /// Refund the remainder of the ZRO token allowance
614
+ fn _refund_zro(
615
+ self: @ContractState,
616
+ zro_dispatcher: Option<IERC20Dispatcher>,
617
+ allowance: u256,
618
+ fee: u256,
619
+ sender: ContractAddress,
620
+ refund_address: ContractAddress,
621
+ ) {
622
+ if let Some(zro_dispatcher) = zro_dispatcher {
623
+ if allowance > fee {
624
+ zro_dispatcher.transfer_from(sender, refund_address, allowance - fee);
625
+ }
626
+ }
627
+ }
628
+
629
+ /// Pay the native token fees
630
+ fn _pay_native_fees(
631
+ self: @ContractState,
632
+ sender: ContractAddress,
633
+ native_dispatcher: IERC20Dispatcher,
634
+ message_receipt: @MessageReceipt,
635
+ refund_address: ContractAddress,
636
+ ) {
637
+ for payee in @message_receipt.payees {
638
+ let native_amount = *payee.native_amount;
639
+ if native_amount > 0 {
640
+ native_dispatcher.transfer_from(sender, *payee.receiver, native_amount);
641
+ }
642
+ }
643
+ }
644
+
645
+ /// Pay the ZRO token fees
646
+ fn _pay_zro_fees(
647
+ ref self: ContractState,
648
+ sender: ContractAddress,
649
+ zro_dispatcher: Option<IERC20Dispatcher>,
650
+ message_receipt: @MessageReceipt,
651
+ refund_address: ContractAddress,
652
+ ) {
653
+ if let Some(zro_dispatcher) = zro_dispatcher {
654
+ for payee in @message_receipt.payees {
655
+ let lz_token_amount = *payee.lz_token_amount;
656
+ if lz_token_amount > 0 {
657
+ zro_dispatcher.transfer_from(sender, *payee.receiver, lz_token_amount);
658
+ }
659
+ }
660
+ }
661
+ }
662
+ }
663
+
664
+ // =============================== Component Hooks =================================
665
+
666
+ impl MessageLibManagerHooksImpl of MessageLibManagerComponent::IMessageLibManagerHooks<
667
+ ContractState,
668
+ > {
669
+ fn _assert_authorized(
670
+ self: @MessageLibManagerComponent::ComponentState<ContractState>, oapp: ContractAddress,
671
+ ) {
672
+ let mut contract_state = unsafe_new_contract_state();
673
+ contract_state._assert_authorized(oapp);
674
+ }
675
+ }
676
+
677
+ impl MessagingChannelHooksImpl of MessagingChannelComponent::IMessagingChannelHooks<
678
+ ContractState,
679
+ > {
680
+ fn _assert_authorized(
681
+ self: @MessagingChannelComponent::ComponentState<ContractState>,
682
+ receiver: ContractAddress,
683
+ ) {
684
+ let mut contract_state = unsafe_new_contract_state();
685
+ contract_state._assert_authorized(receiver);
686
+ }
687
+ }
688
+ }