@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,1253 @@
1
+ //! Test endpoint lz_receive
2
+
3
+ use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
4
+ use layerzero::common::structs::packet::Origin;
5
+ use layerzero::endpoint::endpoint::Endpoint;
6
+ use layerzero::endpoint::errors::{err_lz_receive_value_exceeds_allowance, err_unauthorized};
7
+ use layerzero::endpoint::events::PacketDelivered;
8
+ use layerzero::endpoint::interfaces::endpoint::{
9
+ IEndpointSafeDispatcher, IEndpointSafeDispatcherTrait,
10
+ };
11
+ use layerzero::endpoint::message_lib_manager::interface::{
12
+ IMessageLibManagerDispatcher, IMessageLibManagerDispatcherTrait,
13
+ };
14
+ use layerzero::endpoint::messaging_channel::errors::{err_invalid_nonce, err_payload_hash_not_found};
15
+ use layerzero::message_lib::structs::MessageLibType;
16
+ use lz_utils::bytes::{Bytes32, ContractAddressIntoBytes32};
17
+ use lz_utils::keccak::keccak256;
18
+ use openzeppelin::token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait};
19
+ use snforge_std::{
20
+ ContractClassTrait, DeclareResultTrait, EventSpyAssertionsTrait, declare, spy_events,
21
+ start_cheat_caller_address, start_mock_call, stop_cheat_caller_address,
22
+ };
23
+ use starknet::ContractAddress;
24
+ use starkware_utils_testing::test_utils::assert_panic_with_error;
25
+ use crate::e2e::utils::deploy_blocked_message_lib;
26
+ use crate::endpoint::utils::deploy_simple_message_lib;
27
+ use crate::mocks::receiver::MockReceiver::{
28
+ IMockReceiverHelpersDispatcher, IMockReceiverHelpersDispatcherTrait,
29
+ };
30
+
31
+ // Test constants
32
+ pub const OWNER: ContractAddress = 'owner'.try_into().unwrap();
33
+ pub const SENDER: ContractAddress = 'sender'.try_into().unwrap();
34
+ pub const ANOTHER_SENDER: ContractAddress = 'another_sender'.try_into().unwrap();
35
+ pub const LIBRARY_ADDRESS: ContractAddress = 'library'.try_into().unwrap();
36
+ pub const NON_OWNER: ContractAddress = 'non_owner'.try_into().unwrap();
37
+ pub const MESSAGE_LIB: ContractAddress = 'msglib'.try_into().unwrap();
38
+ pub const EXECUTOR: ContractAddress = 'executor'.try_into().unwrap();
39
+ pub const DELEGATE: ContractAddress = 'delegate'.try_into().unwrap();
40
+ pub const EID: u32 = 1;
41
+ pub const SRC_EID: u32 = 2;
42
+
43
+ // Token amounts
44
+ pub const INITIAL_SUPPLY: u256 = 1000000_u256; // 1M tokens
45
+ pub const EXECUTOR_INITIAL_BALANCE: u256 = 10000_u256; // 10K tokens
46
+
47
+ // Test assert message constants
48
+ pub const REGISTER_LIBRARY_FAILED: felt252 = 'registerLibrary failed';
49
+ pub const SET_RECEIVE_LIBRARY_FAILED: felt252 = 'setReceiveLibrary failed';
50
+ pub const COMMIT_SHOULD_SUCCEED: felt252 = 'Commit should succeed';
51
+ pub const LZ_RECEIVE_SHOULD_SUCCEED: felt252 = 'lz_receive should succeed';
52
+ pub const LZ_RECEIVE_SHOULD_FAIL: felt252 = 'lz_receive should fail';
53
+
54
+ fn deploy_mock_erc20() -> (IERC20Dispatcher, ContractAddress) {
55
+ let contract = declare("MockERC20").unwrap().contract_class();
56
+ let constructor_calldata = array![
57
+ INITIAL_SUPPLY.low.into(), INITIAL_SUPPLY.high.into(), OWNER.into(),
58
+ ];
59
+ let (contract_address, _) = contract.deploy(@constructor_calldata).unwrap();
60
+ (IERC20Dispatcher { contract_address }, contract_address)
61
+ }
62
+
63
+ fn deploy_endpoint() -> (IEndpointSafeDispatcher, ContractAddress) {
64
+ let (_, token_address) = deploy_mock_erc20();
65
+ let blocked_library = deploy_blocked_message_lib();
66
+ let contract = declare("Endpoint").unwrap().contract_class();
67
+ let constructor_calldata = array![
68
+ OWNER.into(), EID.into(), token_address.into(), blocked_library.into(),
69
+ ];
70
+ let (contract_address, _) = contract.deploy(@constructor_calldata).unwrap();
71
+ (IEndpointSafeDispatcher { contract_address }, contract_address)
72
+ }
73
+
74
+ fn deploy_endpoint_with_token() -> (
75
+ IEndpointSafeDispatcher, ContractAddress, IERC20Dispatcher, ContractAddress,
76
+ ) {
77
+ let (token, token_address) = deploy_mock_erc20();
78
+ let blocked_library = deploy_blocked_message_lib();
79
+ let contract = declare("Endpoint").unwrap().contract_class();
80
+ let constructor_calldata = array![
81
+ OWNER.into(), EID.into(), token_address.into(), blocked_library.into(),
82
+ ];
83
+ let (contract_address, _) = contract.deploy(@constructor_calldata).unwrap();
84
+ (IEndpointSafeDispatcher { contract_address }, contract_address, token, token_address)
85
+ }
86
+
87
+ fn deploy_mock_receiver() -> (IMockReceiverHelpersDispatcher, ContractAddress) {
88
+ let contract = declare("MockReceiver").unwrap().contract_class();
89
+ let (receiver_address, _) = contract.deploy(@array![]).unwrap();
90
+ let mock_dispatcher = IMockReceiverHelpersDispatcher { contract_address: receiver_address };
91
+ mock_dispatcher.set_allow_initialize(true);
92
+ (mock_dispatcher, receiver_address)
93
+ }
94
+
95
+ fn setup_tokens_and_balances(token: IERC20Dispatcher, endpoint_address: ContractAddress) {
96
+ // Give tokens to EXECUTOR
97
+ start_cheat_caller_address(token.contract_address, OWNER);
98
+ token.transfer(EXECUTOR, EXECUTOR_INITIAL_BALANCE);
99
+ stop_cheat_caller_address(token.contract_address);
100
+ }
101
+
102
+ fn register_library(
103
+ endpoint: IEndpointSafeDispatcher,
104
+ message_lib_manager_dispatcher: IMessageLibManagerDispatcher,
105
+ endpoint_address: ContractAddress,
106
+ sml_address: ContractAddress,
107
+ ) {
108
+ start_cheat_caller_address(endpoint_address, OWNER);
109
+ // Satisfy registration-time type check
110
+ start_mock_call(sml_address, selector!("message_lib_type"), MessageLibType::SendAndReceive);
111
+ message_lib_manager_dispatcher.register_library(sml_address);
112
+ stop_cheat_caller_address(endpoint_address);
113
+ }
114
+
115
+ struct SetupResult {
116
+ endpoint: IEndpointSafeDispatcher,
117
+ endpoint_address: ContractAddress,
118
+ sml_address: ContractAddress,
119
+ receiver: IMockReceiverHelpersDispatcher,
120
+ receiver_address: ContractAddress,
121
+ message_lib_manager_dispatcher: IMessageLibManagerDispatcher,
122
+ token: IERC20Dispatcher,
123
+ token_address: ContractAddress,
124
+ }
125
+
126
+ #[feature("safe_dispatcher")]
127
+ fn setup() -> SetupResult {
128
+ let (endpoint, endpoint_address) = deploy_endpoint();
129
+ let sml_address = deploy_simple_message_lib(endpoint_address);
130
+ let message_lib_manager_dispatcher = IMessageLibManagerDispatcher {
131
+ contract_address: endpoint_address,
132
+ };
133
+ register_library(endpoint, message_lib_manager_dispatcher, endpoint_address, sml_address);
134
+ let (receiver, receiver_address) = deploy_mock_receiver();
135
+ let fake_token_address = 'fake_token'.try_into().unwrap();
136
+ let fake_token = IERC20Dispatcher { contract_address: fake_token_address };
137
+
138
+ SetupResult {
139
+ endpoint,
140
+ endpoint_address,
141
+ sml_address,
142
+ receiver,
143
+ receiver_address,
144
+ message_lib_manager_dispatcher,
145
+ token: fake_token,
146
+ token_address: fake_token_address,
147
+ }
148
+ }
149
+
150
+ #[feature("safe_dispatcher")]
151
+ fn setup_with_token() -> SetupResult {
152
+ let (endpoint, endpoint_address, token, token_address) = deploy_endpoint_with_token();
153
+ let sml_address = deploy_simple_message_lib(endpoint_address);
154
+ let message_lib_manager_dispatcher = IMessageLibManagerDispatcher {
155
+ contract_address: endpoint_address,
156
+ };
157
+ register_library(endpoint, message_lib_manager_dispatcher, endpoint_address, sml_address);
158
+ let (receiver, receiver_address) = deploy_mock_receiver();
159
+
160
+ // Setup token balances
161
+ setup_tokens_and_balances(token, endpoint_address);
162
+
163
+ SetupResult {
164
+ endpoint,
165
+ endpoint_address,
166
+ sml_address,
167
+ receiver,
168
+ receiver_address,
169
+ token,
170
+ token_address,
171
+ message_lib_manager_dispatcher,
172
+ }
173
+ }
174
+
175
+ #[feature("safe_dispatcher")]
176
+ fn set_receive_library(
177
+ endpoint_address: ContractAddress,
178
+ receiver: ContractAddress,
179
+ lib_address: ContractAddress,
180
+ src_eid: u32,
181
+ message_lib_manager_dispatcher: IMessageLibManagerDispatcher,
182
+ ) {
183
+ start_cheat_caller_address(endpoint_address, receiver);
184
+ message_lib_manager_dispatcher.set_receive_library(receiver, src_eid, lib_address, 0);
185
+ stop_cheat_caller_address(endpoint_address);
186
+ }
187
+
188
+ fn create_test_prefix() -> Origin {
189
+ Origin { src_eid: SRC_EID, sender: SENDER.into(), nonce: 1 }
190
+ }
191
+
192
+ fn create_test_origin_with_nonce(nonce: u64) -> Origin {
193
+ Origin { src_eid: SRC_EID, sender: SENDER.into(), nonce }
194
+ }
195
+
196
+ fn create_test_origin_with_clone() -> (Origin, Origin) {
197
+ return (create_test_prefix(), create_test_prefix());
198
+ }
199
+
200
+ fn create_test_payload_hash() -> Bytes32 {
201
+ Bytes32 { value: 0x123456789abcdef_u256 }
202
+ }
203
+
204
+ fn create_test_message() -> ByteArray {
205
+ "Hello LayerZero!"
206
+ }
207
+
208
+ fn create_test_guid() -> Bytes32 {
209
+ Bytes32 { value: 0x987654321_u256 }
210
+ }
211
+
212
+ /// Helper function to create payload hash from guid + message (like Solidity's abi.encodePacked)
213
+ /// This matches the payload creation in the endpoint's _create_payload function
214
+ fn create_payload_hash(guid: Bytes32, message: @ByteArray) -> Bytes32 {
215
+ let mut payload: ByteArray = "";
216
+
217
+ // Append the 32-byte guid value
218
+ payload.append_u256(guid.value);
219
+
220
+ // Append the message
221
+ payload.append(message);
222
+
223
+ // Return the hash of the concatenated payload
224
+ keccak256(@payload)
225
+ }
226
+
227
+ #[feature("safe_dispatcher")]
228
+ fn commit_message(
229
+ endpoint: IEndpointSafeDispatcher,
230
+ endpoint_address: ContractAddress,
231
+ lib_address: ContractAddress,
232
+ origin: Origin,
233
+ receiver: ContractAddress,
234
+ payload_hash: Bytes32,
235
+ ) {
236
+ start_cheat_caller_address(endpoint_address, lib_address);
237
+ let _result = endpoint.commit(origin, receiver, payload_hash);
238
+ stop_cheat_caller_address(endpoint_address);
239
+ }
240
+
241
+ #[test]
242
+ #[feature("safe_dispatcher")]
243
+ fn test_lz_receive_success_single_message() {
244
+ let SetupResult {
245
+ endpoint,
246
+ endpoint_address,
247
+ sml_address: lib_address,
248
+ receiver_address,
249
+ message_lib_manager_dispatcher,
250
+ ..,
251
+ } = setup();
252
+ set_receive_library(
253
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
254
+ );
255
+
256
+ let origin = create_test_prefix();
257
+ let message = create_test_message();
258
+ let guid = create_test_guid();
259
+ let payload_hash = create_payload_hash(guid, @message);
260
+
261
+ // First commit the message
262
+ commit_message(
263
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
264
+ );
265
+
266
+ // Now call lz_receive
267
+ let mut spy = spy_events();
268
+ let result = endpoint.lz_receive(origin.clone(), receiver_address, guid, message, 0, "");
269
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
270
+
271
+ // Check that PacketDelivered event was emitted
272
+ spy
273
+ .assert_emitted(
274
+ @array![
275
+ (
276
+ endpoint_address,
277
+ Endpoint::Event::PacketDelivered(
278
+ PacketDelivered { origin, receiver: receiver_address },
279
+ ),
280
+ ),
281
+ ],
282
+ );
283
+ }
284
+
285
+ #[test]
286
+ #[feature("safe_dispatcher")]
287
+ fn test_lz_receive_invalid_payload_hash() {
288
+ let SetupResult {
289
+ endpoint,
290
+ endpoint_address,
291
+ sml_address: lib_address,
292
+ receiver_address,
293
+ message_lib_manager_dispatcher,
294
+ ..,
295
+ } = setup();
296
+ set_receive_library(
297
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
298
+ );
299
+
300
+ let origin = create_test_prefix();
301
+ let message = create_test_message();
302
+ let guid = create_test_guid();
303
+ let payload_hash = create_payload_hash(guid, @message);
304
+
305
+ // Commit the message with one payload hash
306
+ commit_message(
307
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
308
+ );
309
+
310
+ // Try to receive with a different message (different hash)
311
+ let wrong_message = "Wrong message!";
312
+ let wrong_hash = create_payload_hash(guid, @wrong_message);
313
+ let result = endpoint.lz_receive(origin, receiver_address, guid, wrong_message, 0, "");
314
+
315
+ // Should fail with payload hash not found error
316
+ assert_panic_with_error(result, err_payload_hash_not_found(payload_hash, wrong_hash));
317
+ }
318
+
319
+ #[test]
320
+ #[feature("safe_dispatcher")]
321
+ fn test_lz_receive_invalid_nonce_gap() {
322
+ let SetupResult {
323
+ endpoint,
324
+ endpoint_address,
325
+ sml_address: lib_address,
326
+ receiver_address,
327
+ message_lib_manager_dispatcher,
328
+ ..,
329
+ } = setup();
330
+ set_receive_library(
331
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
332
+ );
333
+
334
+ let message = create_test_message();
335
+ let guid = create_test_guid();
336
+ let payload_hash = create_payload_hash(guid, @message);
337
+
338
+ // Commit message with nonce 1
339
+ let origin1 = create_test_origin_with_nonce(1);
340
+ commit_message(
341
+ endpoint, endpoint_address, lib_address, origin1, receiver_address, payload_hash,
342
+ );
343
+
344
+ // Commit message with nonce 3 (skipping nonce 2)
345
+ let origin3 = create_test_origin_with_nonce(3);
346
+ commit_message(
347
+ endpoint, endpoint_address, lib_address, origin3.clone(), receiver_address, payload_hash,
348
+ );
349
+
350
+ // Try to receive message with nonce 3 (should fail because nonce 2 is missing)
351
+ let result = endpoint.lz_receive(origin3, receiver_address, guid, message, 0, "");
352
+ assert_panic_with_error(result, err_invalid_nonce());
353
+ }
354
+
355
+ #[test]
356
+ #[feature("safe_dispatcher")]
357
+ fn test_lz_receive_sequential_messages() {
358
+ let SetupResult {
359
+ endpoint,
360
+ endpoint_address,
361
+ sml_address: lib_address,
362
+ receiver_address,
363
+ message_lib_manager_dispatcher,
364
+ ..,
365
+ } = setup();
366
+ set_receive_library(
367
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
368
+ );
369
+
370
+ let message = create_test_message();
371
+ let guid = create_test_guid();
372
+ let payload_hash = create_payload_hash(guid, @message);
373
+
374
+ let mut spy = spy_events();
375
+
376
+ // Commit and receive messages with nonces 1, 2, 3 in order
377
+ for nonce in 1_u64..4 {
378
+ let origin = create_test_origin_with_nonce(nonce);
379
+
380
+ // Commit the message
381
+ commit_message(
382
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
383
+ );
384
+
385
+ // Receive the message
386
+ let result = endpoint
387
+ .lz_receive(origin.clone(), receiver_address, guid, message.clone(), 0, "");
388
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
389
+ }
390
+
391
+ // Check that all PacketDelivered events were emitted
392
+ let mut expected_events = array![];
393
+ for nonce in 1_u64..4 {
394
+ let origin = create_test_origin_with_nonce(nonce);
395
+ expected_events
396
+ .append(
397
+ (
398
+ endpoint_address,
399
+ Endpoint::Event::PacketDelivered(
400
+ PacketDelivered { origin, receiver: receiver_address },
401
+ ),
402
+ ),
403
+ );
404
+ }
405
+
406
+ spy.assert_emitted(@expected_events);
407
+ }
408
+
409
+ #[test]
410
+ #[feature("safe_dispatcher")]
411
+ fn test_lz_receive_out_of_order_commit_in_order_receive() {
412
+ let SetupResult {
413
+ endpoint,
414
+ endpoint_address,
415
+ sml_address: lib_address,
416
+ receiver_address,
417
+ message_lib_manager_dispatcher,
418
+ ..,
419
+ } = setup();
420
+ set_receive_library(
421
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
422
+ );
423
+
424
+ let message = create_test_message();
425
+ let guid = create_test_guid();
426
+ let payload_hash = create_payload_hash(guid, @message);
427
+
428
+ // Commit messages out of order: 3, 1, 2
429
+ let origin1 = create_test_origin_with_nonce(1);
430
+ let origin2 = create_test_origin_with_nonce(2);
431
+ let origin3 = create_test_origin_with_nonce(3);
432
+
433
+ commit_message(
434
+ endpoint, endpoint_address, lib_address, origin3.clone(), receiver_address, payload_hash,
435
+ );
436
+ commit_message(
437
+ endpoint, endpoint_address, lib_address, origin1.clone(), receiver_address, payload_hash,
438
+ );
439
+ commit_message(
440
+ endpoint, endpoint_address, lib_address, origin2.clone(), receiver_address, payload_hash,
441
+ );
442
+
443
+ let mut spy = spy_events();
444
+
445
+ // Now receive in order: 1, 2, 3
446
+ let result1 = endpoint
447
+ .lz_receive(origin1.clone(), receiver_address, guid, message.clone(), 0, "");
448
+ assert(result1.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
449
+ let result2 = endpoint
450
+ .lz_receive(origin2.clone(), receiver_address, guid, message.clone(), 0, "");
451
+ assert(result2.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
452
+ let result3 = endpoint.lz_receive(origin3.clone(), receiver_address, guid, message, 0, "");
453
+ assert(result3.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
454
+
455
+ // Check that all PacketDelivered events were emitted in order
456
+ spy
457
+ .assert_emitted(
458
+ @array![
459
+ (
460
+ endpoint_address,
461
+ Endpoint::Event::PacketDelivered(
462
+ PacketDelivered { origin: origin1, receiver: receiver_address },
463
+ ),
464
+ ),
465
+ (
466
+ endpoint_address,
467
+ Endpoint::Event::PacketDelivered(
468
+ PacketDelivered { origin: origin2, receiver: receiver_address },
469
+ ),
470
+ ),
471
+ (
472
+ endpoint_address,
473
+ Endpoint::Event::PacketDelivered(
474
+ PacketDelivered { origin: origin3, receiver: receiver_address },
475
+ ),
476
+ ),
477
+ ],
478
+ );
479
+ }
480
+
481
+ #[test]
482
+ #[feature("safe_dispatcher")]
483
+ fn test_lz_receive_batch_execution_random_order() {
484
+ let SetupResult {
485
+ endpoint,
486
+ endpoint_address,
487
+ sml_address: lib_address,
488
+ receiver_address,
489
+ message_lib_manager_dispatcher,
490
+ ..,
491
+ } = setup();
492
+ set_receive_library(
493
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
494
+ );
495
+
496
+ let message = create_test_message();
497
+ let guid = create_test_guid();
498
+ let payload_hash = create_payload_hash(guid, @message);
499
+
500
+ // Commit messages 1-5
501
+ for nonce in 1_u64..6_u64 {
502
+ let origin = create_test_origin_with_nonce(nonce);
503
+ commit_message(
504
+ endpoint, endpoint_address, lib_address, origin, receiver_address, payload_hash,
505
+ );
506
+ }
507
+
508
+ let mut spy = spy_events();
509
+
510
+ // Define a random execution order
511
+ let random_order = array![3_u64, 1_u64, 5_u64, 2_u64, 4_u64];
512
+ let mut expected_events = array![];
513
+
514
+ // Execute in random order
515
+ for i in 0..random_order.len() {
516
+ let nonce = *random_order.at(i);
517
+ let origin = create_test_origin_with_nonce(nonce);
518
+
519
+ let result = endpoint
520
+ .lz_receive(origin.clone(), receiver_address, guid, message.clone(), 0, "");
521
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
522
+
523
+ // Add to expected events in execution order
524
+ expected_events
525
+ .append(
526
+ (
527
+ endpoint_address,
528
+ Endpoint::Event::PacketDelivered(
529
+ PacketDelivered { origin, receiver: receiver_address },
530
+ ),
531
+ ),
532
+ );
533
+ }
534
+
535
+ // Check that PacketDelivered events were emitted in the random execution order
536
+ spy.assert_emitted(@expected_events);
537
+ }
538
+
539
+ #[test]
540
+ #[feature("safe_dispatcher")]
541
+ fn test_lz_receive_different_senders() {
542
+ let SetupResult {
543
+ endpoint,
544
+ endpoint_address,
545
+ sml_address: lib_address,
546
+ receiver_address,
547
+ message_lib_manager_dispatcher,
548
+ ..,
549
+ } = setup();
550
+ set_receive_library(
551
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
552
+ );
553
+
554
+ let message = create_test_message();
555
+ let guid = create_test_guid();
556
+ let payload_hash = create_payload_hash(guid, @message);
557
+
558
+ let sender1: ContractAddress = 'sender1'.try_into().unwrap();
559
+ let sender2: ContractAddress = 'sender2'.try_into().unwrap();
560
+
561
+ // Create origins with different senders
562
+ let origin1 = Origin { src_eid: SRC_EID, sender: sender1.into(), nonce: 1 };
563
+ let origin2 = Origin { src_eid: SRC_EID, sender: sender2.into(), nonce: 1 };
564
+
565
+ // Commit messages from both senders
566
+ commit_message(
567
+ endpoint, endpoint_address, lib_address, origin1.clone(), receiver_address, payload_hash,
568
+ );
569
+ commit_message(
570
+ endpoint, endpoint_address, lib_address, origin2.clone(), receiver_address, payload_hash,
571
+ );
572
+
573
+ let mut spy = spy_events();
574
+
575
+ // Receive messages from both senders
576
+ let result1 = endpoint
577
+ .lz_receive(origin1.clone(), receiver_address, guid, message.clone(), 0, "");
578
+ assert(result1.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
579
+ let result2 = endpoint.lz_receive(origin2.clone(), receiver_address, guid, message, 0, "");
580
+ assert(result2.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
581
+
582
+ // Check that both PacketDelivered events were emitted
583
+ spy
584
+ .assert_emitted(
585
+ @array![
586
+ (
587
+ endpoint_address,
588
+ Endpoint::Event::PacketDelivered(
589
+ PacketDelivered { origin: origin1, receiver: receiver_address },
590
+ ),
591
+ ),
592
+ (
593
+ endpoint_address,
594
+ Endpoint::Event::PacketDelivered(
595
+ PacketDelivered { origin: origin2, receiver: receiver_address },
596
+ ),
597
+ ),
598
+ ],
599
+ );
600
+ }
601
+
602
+ #[test]
603
+ #[feature("safe_dispatcher")]
604
+ fn test_lz_receive_different_source_eids() {
605
+ let SetupResult {
606
+ endpoint,
607
+ endpoint_address,
608
+ sml_address: lib_address,
609
+ receiver_address,
610
+ message_lib_manager_dispatcher,
611
+ ..,
612
+ } = setup();
613
+
614
+ let message = create_test_message();
615
+ let guid = create_test_guid();
616
+ let payload_hash = create_payload_hash(guid, @message);
617
+
618
+ let src_eid1 = 101_u32;
619
+ let src_eid2 = 102_u32;
620
+
621
+ // Set receive library for both source EIDs
622
+ set_receive_library(
623
+ endpoint_address, receiver_address, lib_address, src_eid1, message_lib_manager_dispatcher,
624
+ );
625
+ set_receive_library(
626
+ endpoint_address, receiver_address, lib_address, src_eid2, message_lib_manager_dispatcher,
627
+ );
628
+
629
+ // Create origins with different source EIDs
630
+ let origin1 = Origin { src_eid: src_eid1, sender: SENDER.into(), nonce: 1 };
631
+ let origin2 = Origin { src_eid: src_eid2, sender: SENDER.into(), nonce: 1 };
632
+
633
+ // Commit messages from both source EIDs
634
+ commit_message(
635
+ endpoint, endpoint_address, lib_address, origin1.clone(), receiver_address, payload_hash,
636
+ );
637
+ commit_message(
638
+ endpoint, endpoint_address, lib_address, origin2.clone(), receiver_address, payload_hash,
639
+ );
640
+
641
+ let mut spy = spy_events();
642
+
643
+ // Receive messages from both source EIDs
644
+ let result1 = endpoint
645
+ .lz_receive(origin1.clone(), receiver_address, guid, message.clone(), 0, "");
646
+ assert(result1.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
647
+ let result2 = endpoint.lz_receive(origin2.clone(), receiver_address, guid, message, 0, "");
648
+ assert(result2.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
649
+
650
+ // Check that both PacketDelivered events were emitted
651
+ spy
652
+ .assert_emitted(
653
+ @array![
654
+ (
655
+ endpoint_address,
656
+ Endpoint::Event::PacketDelivered(
657
+ PacketDelivered { origin: origin1, receiver: receiver_address },
658
+ ),
659
+ ),
660
+ (
661
+ endpoint_address,
662
+ Endpoint::Event::PacketDelivered(
663
+ PacketDelivered { origin: origin2, receiver: receiver_address },
664
+ ),
665
+ ),
666
+ ],
667
+ );
668
+ }
669
+
670
+ #[test]
671
+ #[feature("safe_dispatcher")]
672
+ fn test_lz_receive_different_receivers() {
673
+ let SetupResult {
674
+ endpoint, endpoint_address, sml_address: lib_address, message_lib_manager_dispatcher, ..,
675
+ } = setup();
676
+
677
+ let message = create_test_message();
678
+ let guid = create_test_guid();
679
+ let payload_hash = create_payload_hash(guid, @message);
680
+ let origin = create_test_prefix();
681
+
682
+ // Deploy multiple receivers
683
+ let (_, receiver1) = deploy_mock_receiver();
684
+ let (_, receiver2) = deploy_mock_receiver();
685
+
686
+ // Set receive library for both receivers
687
+ set_receive_library(
688
+ endpoint_address, receiver1, lib_address, SRC_EID, message_lib_manager_dispatcher,
689
+ );
690
+ set_receive_library(
691
+ endpoint_address, receiver2, lib_address, SRC_EID, message_lib_manager_dispatcher,
692
+ );
693
+
694
+ // Commit messages to both receivers
695
+ commit_message(
696
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver1, payload_hash,
697
+ );
698
+ commit_message(
699
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver2, payload_hash,
700
+ );
701
+
702
+ let mut spy = spy_events();
703
+
704
+ // Receive messages at both receivers
705
+ let result1 = endpoint.lz_receive(origin.clone(), receiver1, guid, message.clone(), 0, "");
706
+ assert(result1.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
707
+ let result2 = endpoint.lz_receive(origin.clone(), receiver2, guid, message, 0, "");
708
+ assert(result2.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
709
+
710
+ // Check that both PacketDelivered events were emitted
711
+ spy
712
+ .assert_emitted(
713
+ @array![
714
+ (
715
+ endpoint_address,
716
+ Endpoint::Event::PacketDelivered(
717
+ PacketDelivered { origin: origin.clone(), receiver: receiver1 },
718
+ ),
719
+ ),
720
+ (
721
+ endpoint_address,
722
+ Endpoint::Event::PacketDelivered(
723
+ PacketDelivered { origin, receiver: receiver2 },
724
+ ),
725
+ ),
726
+ ],
727
+ );
728
+ }
729
+
730
+ #[test]
731
+ #[feature("safe_dispatcher")]
732
+ fn test_lz_receive_clears_payload_hash() {
733
+ let SetupResult {
734
+ endpoint,
735
+ endpoint_address,
736
+ sml_address: lib_address,
737
+ receiver_address,
738
+ message_lib_manager_dispatcher,
739
+ ..,
740
+ } = setup();
741
+ set_receive_library(
742
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
743
+ );
744
+
745
+ let origin = create_test_prefix();
746
+ let message = create_test_message();
747
+ let guid = create_test_guid();
748
+ let payload_hash = create_payload_hash(guid, @message);
749
+
750
+ // Commit the message
751
+ commit_message(
752
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
753
+ );
754
+
755
+ // Receive the message (should clear the payload hash)
756
+ let result = endpoint
757
+ .lz_receive(origin.clone(), receiver_address, guid, message.clone(), 0, "");
758
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
759
+
760
+ // Try to receive the same message again (should fail because payload hash was cleared)
761
+ let result = endpoint.lz_receive(origin, receiver_address, guid, message.clone(), 0, "");
762
+
763
+ // Should fail because the payload hash was cleared (now default/zero)
764
+ let expected_hash = Default::default(); // Zero hash after clearing
765
+ assert_panic_with_error(result, err_payload_hash_not_found(expected_hash, payload_hash));
766
+ }
767
+
768
+ #[test]
769
+ #[feature("safe_dispatcher")]
770
+ fn test_lz_receive_with_no_value() {
771
+ let SetupResult {
772
+ endpoint,
773
+ endpoint_address,
774
+ sml_address: lib_address,
775
+ receiver_address,
776
+ message_lib_manager_dispatcher,
777
+ ..,
778
+ } = setup();
779
+ set_receive_library(
780
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
781
+ );
782
+
783
+ let origin = create_test_prefix();
784
+ let message = create_test_message();
785
+ let guid = create_test_guid();
786
+ let payload_hash = create_payload_hash(guid, @message);
787
+
788
+ // Commit the message
789
+ commit_message(
790
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
791
+ );
792
+
793
+ let mut spy = spy_events();
794
+
795
+ // Receive the message with value
796
+ let result = endpoint.lz_receive(origin.clone(), receiver_address, guid, message, 0, "");
797
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
798
+
799
+ // Check that PacketDelivered event was emitted
800
+ spy
801
+ .assert_emitted(
802
+ @array![
803
+ (
804
+ endpoint_address,
805
+ Endpoint::Event::PacketDelivered(
806
+ PacketDelivered { origin, receiver: receiver_address },
807
+ ),
808
+ ),
809
+ ],
810
+ );
811
+ }
812
+
813
+ #[test]
814
+ #[feature("safe_dispatcher")]
815
+ fn test_lz_receive_token_transfer_success() {
816
+ let SetupResult {
817
+ endpoint,
818
+ endpoint_address,
819
+ sml_address: lib_address,
820
+ receiver_address,
821
+ token,
822
+ message_lib_manager_dispatcher,
823
+ ..,
824
+ } = setup_with_token();
825
+ set_receive_library(
826
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
827
+ );
828
+
829
+ let origin = create_test_prefix();
830
+ let message = create_test_message();
831
+ let guid = create_test_guid();
832
+ let payload_hash = create_payload_hash(guid, @message);
833
+ let value = 1000_u256;
834
+
835
+ // Commit the message
836
+ commit_message(
837
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
838
+ );
839
+
840
+ // Give executor allowance to spend tokens
841
+ start_cheat_caller_address(token.contract_address, EXECUTOR);
842
+ token.approve(endpoint_address, value);
843
+ stop_cheat_caller_address(token.contract_address);
844
+
845
+ // Record initial balances
846
+ let executor_balance_before = token.balance_of(EXECUTOR);
847
+ let receiver_balance_before = token.balance_of(receiver_address);
848
+
849
+ // Call lz_receive as executor
850
+ start_cheat_caller_address(endpoint_address, EXECUTOR);
851
+ let result = endpoint.lz_receive(origin.clone(), receiver_address, guid, message, value, "");
852
+ stop_cheat_caller_address(endpoint_address);
853
+
854
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
855
+
856
+ // Check balances after transfer
857
+ let executor_balance_after = token.balance_of(EXECUTOR);
858
+ let receiver_balance_after = token.balance_of(receiver_address);
859
+
860
+ assert(executor_balance_after == executor_balance_before - value, 'Executor no decrease');
861
+ assert(receiver_balance_after == receiver_balance_before + value, 'Receiver no increase');
862
+ }
863
+
864
+ #[test]
865
+ #[feature("safe_dispatcher")]
866
+ fn test_lz_receive_zero_value() {
867
+ let SetupResult {
868
+ endpoint,
869
+ endpoint_address,
870
+ sml_address: lib_address,
871
+ receiver_address,
872
+ token,
873
+ message_lib_manager_dispatcher,
874
+ ..,
875
+ } = setup_with_token();
876
+ set_receive_library(
877
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
878
+ );
879
+
880
+ let origin = create_test_prefix();
881
+ let message = create_test_message();
882
+ let guid = create_test_guid();
883
+ let payload_hash = create_payload_hash(guid, @message);
884
+ let value = 0_u256;
885
+
886
+ // Commit the message
887
+ commit_message(
888
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
889
+ );
890
+
891
+ // Record initial balances
892
+ let executor_balance_before = token.balance_of(EXECUTOR);
893
+ let receiver_balance_before = token.balance_of(receiver_address);
894
+
895
+ // Call lz_receive as executor with zero value
896
+ start_cheat_caller_address(endpoint_address, EXECUTOR);
897
+ let result = endpoint.lz_receive(origin.clone(), receiver_address, guid, message, value, "");
898
+ stop_cheat_caller_address(endpoint_address);
899
+
900
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
901
+
902
+ // Check balances remain unchanged
903
+ let executor_balance_after = token.balance_of(EXECUTOR);
904
+ let receiver_balance_after = token.balance_of(receiver_address);
905
+
906
+ assert(executor_balance_after == executor_balance_before, 'Executor no change');
907
+ assert(receiver_balance_after == receiver_balance_before, 'Receiver no change');
908
+ }
909
+
910
+ #[test]
911
+ #[feature("safe_dispatcher")]
912
+ fn test_lz_receive_value_exceeds_allowance() {
913
+ let SetupResult {
914
+ endpoint,
915
+ endpoint_address,
916
+ sml_address: lib_address,
917
+ receiver_address,
918
+ token,
919
+ message_lib_manager_dispatcher,
920
+ ..,
921
+ } = setup_with_token();
922
+ set_receive_library(
923
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
924
+ );
925
+
926
+ let origin = create_test_prefix();
927
+ let message = create_test_message();
928
+ let guid = create_test_guid();
929
+ let payload_hash = create_payload_hash(guid, @message);
930
+ let value = 2000_u256;
931
+ let allowance = 1000_u256;
932
+
933
+ // Commit the message
934
+ commit_message(
935
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
936
+ );
937
+
938
+ // Give executor insufficient allowance
939
+ start_cheat_caller_address(token.contract_address, EXECUTOR);
940
+ token.approve(endpoint_address, allowance);
941
+ stop_cheat_caller_address(token.contract_address);
942
+
943
+ // Call lz_receive as executor
944
+ start_cheat_caller_address(endpoint_address, EXECUTOR);
945
+ let result = endpoint.lz_receive(origin, receiver_address, guid, message, value, "");
946
+ stop_cheat_caller_address(endpoint_address);
947
+
948
+ // Should fail with value exceeds allowance error
949
+ assert_panic_with_error(result, err_lz_receive_value_exceeds_allowance(value, allowance));
950
+ }
951
+
952
+ #[test]
953
+ #[feature("safe_dispatcher")]
954
+ fn test_lz_receive_exact_allowance_equals_value() {
955
+ let SetupResult {
956
+ endpoint,
957
+ endpoint_address,
958
+ sml_address: lib_address,
959
+ receiver_address,
960
+ token,
961
+ message_lib_manager_dispatcher,
962
+ ..,
963
+ } = setup_with_token();
964
+ set_receive_library(
965
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
966
+ );
967
+
968
+ let origin = create_test_prefix();
969
+ let message = create_test_message();
970
+ let guid = create_test_guid();
971
+ let payload_hash = create_payload_hash(guid, @message);
972
+ let value = 1000_u256;
973
+
974
+ // Commit the message
975
+ commit_message(
976
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
977
+ );
978
+
979
+ // Give executor exact allowance
980
+ start_cheat_caller_address(token.contract_address, EXECUTOR);
981
+ token.approve(endpoint_address, value);
982
+ stop_cheat_caller_address(token.contract_address);
983
+
984
+ // Record initial balances
985
+ let executor_balance_before = token.balance_of(EXECUTOR);
986
+ let receiver_balance_before = token.balance_of(receiver_address);
987
+
988
+ // Call lz_receive as executor
989
+ start_cheat_caller_address(endpoint_address, EXECUTOR);
990
+ let result = endpoint.lz_receive(origin.clone(), receiver_address, guid, message, value, "");
991
+ stop_cheat_caller_address(endpoint_address);
992
+
993
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
994
+
995
+ // Check balances after transfer
996
+ let executor_balance_after = token.balance_of(EXECUTOR);
997
+ let receiver_balance_after = token.balance_of(receiver_address);
998
+
999
+ assert(executor_balance_after == executor_balance_before - value, 'Executor no decrease');
1000
+ assert(receiver_balance_after == receiver_balance_before + value, 'Receiver no increase');
1001
+
1002
+ // Check allowance is consumed
1003
+ let allowance_after = token.allowance(EXECUTOR, endpoint_address);
1004
+ assert(allowance_after == 0, 'Allowance should be consumed');
1005
+ }
1006
+
1007
+ #[test]
1008
+ #[feature("safe_dispatcher")]
1009
+ fn test_lz_receive_large_value_transfer() {
1010
+ let SetupResult {
1011
+ endpoint,
1012
+ endpoint_address,
1013
+ sml_address: lib_address,
1014
+ receiver_address,
1015
+ token,
1016
+ message_lib_manager_dispatcher,
1017
+ ..,
1018
+ } = setup_with_token();
1019
+ set_receive_library(
1020
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
1021
+ );
1022
+
1023
+ let origin = create_test_prefix();
1024
+ let message = create_test_message();
1025
+ let guid = create_test_guid();
1026
+ let payload_hash = create_payload_hash(guid, @message);
1027
+ let value = 5000_u256; // Large value
1028
+
1029
+ // Commit the message
1030
+ commit_message(
1031
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
1032
+ );
1033
+
1034
+ // Give executor sufficient allowance
1035
+ start_cheat_caller_address(token.contract_address, EXECUTOR);
1036
+ token.approve(endpoint_address, value);
1037
+ stop_cheat_caller_address(token.contract_address);
1038
+
1039
+ // Record initial balances
1040
+ let executor_balance_before = token.balance_of(EXECUTOR);
1041
+ let receiver_balance_before = token.balance_of(receiver_address);
1042
+
1043
+ // Call lz_receive as executor
1044
+ start_cheat_caller_address(endpoint_address, EXECUTOR);
1045
+ let result = endpoint.lz_receive(origin.clone(), receiver_address, guid, message, value, "");
1046
+ stop_cheat_caller_address(endpoint_address);
1047
+
1048
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
1049
+
1050
+ // Check balances after transfer
1051
+ let executor_balance_after = token.balance_of(EXECUTOR);
1052
+ let receiver_balance_after = token.balance_of(receiver_address);
1053
+
1054
+ assert(executor_balance_after == executor_balance_before - value, 'Executor no decrease');
1055
+ assert(receiver_balance_after == receiver_balance_before + value, 'Receiver no increase');
1056
+ }
1057
+
1058
+ #[test]
1059
+ #[feature("safe_dispatcher")]
1060
+ fn test_lz_receive_multiple_transfers_different_values() {
1061
+ let SetupResult {
1062
+ endpoint,
1063
+ endpoint_address,
1064
+ sml_address: lib_address,
1065
+ receiver_address,
1066
+ token,
1067
+ message_lib_manager_dispatcher,
1068
+ ..,
1069
+ } = setup_with_token();
1070
+ set_receive_library(
1071
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
1072
+ );
1073
+
1074
+ let message = create_test_message();
1075
+ let guid = create_test_guid();
1076
+ let payload_hash = create_payload_hash(guid, @message);
1077
+
1078
+ // Test with different values
1079
+ let values = array![100_u256, 500_u256, 1000_u256];
1080
+ let mut total_transferred = 0_u256;
1081
+
1082
+ let receiver_balance_initial = token.balance_of(receiver_address);
1083
+
1084
+ for i in 0..values.len() {
1085
+ let value = *values.at(i);
1086
+ let nonce = (i + 1).into();
1087
+ let origin = create_test_origin_with_nonce(nonce);
1088
+
1089
+ // Commit the message
1090
+ commit_message(
1091
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
1092
+ );
1093
+
1094
+ // Give executor allowance for this transfer
1095
+ start_cheat_caller_address(token.contract_address, EXECUTOR);
1096
+ token.approve(endpoint_address, value);
1097
+ stop_cheat_caller_address(token.contract_address);
1098
+
1099
+ // Call lz_receive as executor
1100
+ start_cheat_caller_address(endpoint_address, EXECUTOR);
1101
+ let result = endpoint
1102
+ .lz_receive(origin, receiver_address, guid, message.clone(), value, "");
1103
+ stop_cheat_caller_address(endpoint_address);
1104
+
1105
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
1106
+ total_transferred += value;
1107
+ }
1108
+
1109
+ // Check final receiver balance
1110
+ let receiver_balance_final = token.balance_of(receiver_address);
1111
+ assert(
1112
+ receiver_balance_final == receiver_balance_initial + total_transferred,
1113
+ 'Total transfer amount incorrect',
1114
+ );
1115
+ }
1116
+
1117
+ #[test]
1118
+ #[feature("safe_dispatcher")]
1119
+ fn test_lz_receive_allowance_remains_after_smaller_transfer() {
1120
+ let SetupResult {
1121
+ endpoint,
1122
+ endpoint_address,
1123
+ sml_address: lib_address,
1124
+ receiver_address,
1125
+ token,
1126
+ message_lib_manager_dispatcher,
1127
+ ..,
1128
+ } = setup_with_token();
1129
+ set_receive_library(
1130
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
1131
+ );
1132
+
1133
+ let origin = create_test_prefix();
1134
+ let message = create_test_message();
1135
+ let guid = create_test_guid();
1136
+ let payload_hash = create_payload_hash(guid, @message);
1137
+ let value = 500_u256;
1138
+ let allowance = 1000_u256;
1139
+
1140
+ // Commit the message
1141
+ commit_message(
1142
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
1143
+ );
1144
+
1145
+ // Give executor more allowance than needed
1146
+ start_cheat_caller_address(token.contract_address, EXECUTOR);
1147
+ token.approve(endpoint_address, allowance);
1148
+ stop_cheat_caller_address(token.contract_address);
1149
+
1150
+ // Call lz_receive as executor
1151
+ start_cheat_caller_address(endpoint_address, EXECUTOR);
1152
+ let result = endpoint.lz_receive(origin.clone(), receiver_address, guid, message, value, "");
1153
+ stop_cheat_caller_address(endpoint_address);
1154
+
1155
+ assert(result.is_ok(), LZ_RECEIVE_SHOULD_SUCCEED);
1156
+
1157
+ // Check remaining allowance
1158
+ let allowance_after = token.allowance(EXECUTOR, endpoint_address);
1159
+ assert(allowance_after == allowance - value, 'Allowance not reduced');
1160
+ }
1161
+
1162
+
1163
+ #[test]
1164
+ #[feature("safe_dispatcher")]
1165
+ fn test_clear_as_oapp() {
1166
+ let SetupResult {
1167
+ endpoint,
1168
+ endpoint_address,
1169
+ sml_address: lib_address,
1170
+ receiver_address,
1171
+ message_lib_manager_dispatcher,
1172
+ ..,
1173
+ } = setup_with_token();
1174
+ set_receive_library(
1175
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
1176
+ );
1177
+
1178
+ let origin = create_test_prefix();
1179
+ let message = create_test_message();
1180
+ let guid = create_test_guid();
1181
+ let payload_hash = create_payload_hash(guid, @message);
1182
+
1183
+ commit_message(
1184
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
1185
+ );
1186
+
1187
+ let mut spy = spy_events();
1188
+
1189
+ start_cheat_caller_address(endpoint_address, receiver_address);
1190
+ let _ = endpoint.clear(origin.clone(), receiver_address, guid, message);
1191
+ stop_cheat_caller_address(endpoint_address);
1192
+
1193
+ let delivered_event = Endpoint::Event::PacketDelivered(
1194
+ PacketDelivered { origin, receiver: receiver_address },
1195
+ );
1196
+ spy.assert_emitted(@array![(endpoint_address, delivered_event)]);
1197
+ }
1198
+
1199
+ #[test]
1200
+ #[feature("safe_dispatcher")]
1201
+ fn test_clear_as_delegate() {
1202
+ let SetupResult {
1203
+ endpoint,
1204
+ endpoint_address,
1205
+ sml_address: lib_address,
1206
+ receiver_address,
1207
+ message_lib_manager_dispatcher,
1208
+ ..,
1209
+ } = setup_with_token();
1210
+ set_receive_library(
1211
+ endpoint_address, receiver_address, lib_address, SRC_EID, message_lib_manager_dispatcher,
1212
+ );
1213
+
1214
+ let origin = create_test_prefix();
1215
+ let message = create_test_message();
1216
+ let guid = create_test_guid();
1217
+ let payload_hash = create_payload_hash(guid, @message);
1218
+
1219
+ commit_message(
1220
+ endpoint, endpoint_address, lib_address, origin.clone(), receiver_address, payload_hash,
1221
+ );
1222
+
1223
+ let mut spy = spy_events();
1224
+
1225
+ start_cheat_caller_address(endpoint_address, receiver_address);
1226
+ let _ = endpoint.set_delegate(DELEGATE);
1227
+ stop_cheat_caller_address(endpoint_address);
1228
+
1229
+ start_cheat_caller_address(endpoint_address, DELEGATE);
1230
+ let _ = endpoint.clear(origin.clone(), receiver_address, guid, message);
1231
+ stop_cheat_caller_address(endpoint_address);
1232
+
1233
+ let delivered_event = Endpoint::Event::PacketDelivered(
1234
+ PacketDelivered { origin, receiver: receiver_address },
1235
+ );
1236
+ spy.assert_emitted(@array![(endpoint_address, delivered_event)]);
1237
+ }
1238
+
1239
+ #[test]
1240
+ #[feature("safe_dispatcher")]
1241
+ fn test_clear_fail_as_unauthorized() {
1242
+ let SetupResult { endpoint, endpoint_address, receiver_address, .. } = setup_with_token();
1243
+
1244
+ let origin = create_test_prefix();
1245
+ let message = create_test_message();
1246
+ let guid = create_test_guid();
1247
+
1248
+ start_cheat_caller_address(endpoint_address, DELEGATE);
1249
+ let result = endpoint.clear(origin.clone(), receiver_address, guid, message);
1250
+ stop_cheat_caller_address(endpoint_address);
1251
+
1252
+ assert_panic_with_error(result, err_unauthorized());
1253
+ }