@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,74 @@
1
+ //! Price feed structs
2
+
3
+ /// Fee estimate
4
+ #[derive(Drop, Serde, Default, PartialEq, Debug)]
5
+ pub struct FeeEstimate {
6
+ pub gas_fee: u256,
7
+ pub price_ratio: u128,
8
+ }
9
+
10
+ /// Response for a fee estimation
11
+ #[derive(Drop, Serde, Default, PartialEq, Debug)]
12
+ pub struct GetFeeResponse {
13
+ pub gas_fee: u256,
14
+ pub price_ratio: u128,
15
+ pub price_ratio_denominator: u128,
16
+ pub native_price_usd: u128,
17
+ }
18
+
19
+ /// Price for a given EID
20
+ #[derive(Drop, Serde, starknet::Store, Default, PartialEq, Clone, Debug)]
21
+ pub struct Price {
22
+ /// Conversion multiplier used to translate the destination chain's native token value
23
+ /// into the source chain's native token units.
24
+ ///
25
+ /// This is a fixed-point number encoded as a `u128`, where the float value is scaled
26
+ /// by 10^20 for precision (i.e., 1.0 = 10^20).
27
+ ///
28
+ /// The `price_ratio` incorporates two factors:
29
+ /// 1. Decimal normalization between destination and source tokens.
30
+ /// 2. The actual relative price (exchange rate) between the two tokens.
31
+ ///
32
+ /// For example, if the source is an EVM chain (18 decimals) and the destination is Aptos (8
33
+ /// decimals), with a 1:1 token price, the base multiplier would be (10^18 / 10^8) = 10^10.
34
+ /// To represent this in fixed-point form, you multiply by 10^20, giving a `price_ratio` of
35
+ /// 10^30.
36
+ ///
37
+ /// In real usage, `price_ratio` reflects both decimal scaling and fluctuating market prices.
38
+ pub price_ratio: u128,
39
+ pub gas_price_in_unit: u64, // for evm, it is in wei, for aptos, it is in octas.
40
+ pub gas_per_byte: u32,
41
+ }
42
+
43
+ #[derive(Drop, Serde, Default, PartialEq)]
44
+ pub struct SetEidToModelTypeParam {
45
+ pub eid: u32,
46
+ pub model_type: ModelType,
47
+ }
48
+
49
+ #[derive(Drop, Serde, Default, PartialEq)]
50
+ pub struct SetPriceParam {
51
+ pub eid: u32,
52
+ pub price: Price,
53
+ }
54
+
55
+ #[derive(Drop, Serde, starknet::Store, Default, PartialEq, Clone, Debug)]
56
+ pub struct ArbitrumPriceExt {
57
+ pub gas_per_l2_tx: u64,
58
+ pub gas_per_l1_call_data_byte: u32,
59
+ }
60
+
61
+ #[derive(Drop, Serde, Default, PartialEq, Clone)]
62
+ pub struct UpdatePriceExt {
63
+ pub eid: u32,
64
+ pub price: Price,
65
+ pub extend: ArbitrumPriceExt,
66
+ }
67
+
68
+ #[derive(Drop, Serde, starknet::Store, Default, PartialEq, Debug)]
69
+ pub enum ModelType {
70
+ #[default]
71
+ DEFAULT,
72
+ OP_STACK,
73
+ ARB_STACK,
74
+ }
@@ -0,0 +1,21 @@
1
+ use layerzero::endpoint::constants::{EMPTY_PAYLOAD_HASH, NIL_PAYLOAD_HASH};
2
+ use layerzero::message_lib::uln::ultra_light_node::UltraLightNode::EMPTY_VERIFICATION;
3
+ use lz_utils::bytes::Bytes32;
4
+
5
+ #[test]
6
+ fn empty_payload_hash_should_be_default() {
7
+ assert(EMPTY_PAYLOAD_HASH == Default::default(), 'Empty payload hash should be 0');
8
+ }
9
+
10
+ #[test]
11
+ fn nil_payload_hash_should_be_max_u256() {
12
+ assert(
13
+ NIL_PAYLOAD_HASH == Bytes32 { value: core::num::traits::Bounded::<u256>::MAX },
14
+ 'Nil payload hash != max u256',
15
+ );
16
+ }
17
+
18
+ #[test]
19
+ fn empty_verification_should_be_default() {
20
+ assert(EMPTY_VERIFICATION == Default::default(), 'Empty verification should be 0');
21
+ }
@@ -0,0 +1,232 @@
1
+ //! GUID generation tests
2
+
3
+ use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
4
+ use core::num::traits::Bounded;
5
+ use layerzero::common::guid::GUID;
6
+ use lz_utils::bytes::Bytes32;
7
+ use lz_utils::keccak::keccak256;
8
+
9
+ // Test constants
10
+ pub const MAX_U64: u64 = Bounded::MAX;
11
+ pub const MAX_U32: u32 = Bounded::MAX;
12
+ pub const MAX_U256: u256 = Bounded::MAX;
13
+
14
+ #[test]
15
+ #[fuzzer(runs: 10)]
16
+ fn should_generate_deterministic_guid(
17
+ nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_value: u256,
18
+ ) {
19
+ let sender = Bytes32 { value: sender_value };
20
+ let receiver = Bytes32 { value: receiver_value };
21
+
22
+ let guid1 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver);
23
+ let guid2 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver);
24
+
25
+ // Same inputs should produce same GUID
26
+ assert(guid1.value == guid2.value, 'GUID should be deterministic');
27
+ // GUID should not be zero (extremely unlikely with keccak256)
28
+ assert(guid1.value != 0, 'GUID should not be zero');
29
+ }
30
+
31
+ #[test]
32
+ #[fuzzer(runs: 10)]
33
+ fn should_generate_different_guid_for_different_nonces(
34
+ nonce_1: u64,
35
+ nonce_2: u64,
36
+ src_eid: u32,
37
+ sender_value: u256,
38
+ dst_eid: u32,
39
+ receiver_value: u256,
40
+ ) {
41
+ // Ensure the nonces are different
42
+ // Same nonces are tested in should_generate_deterministic_guid
43
+ if nonce_1 == nonce_2 {
44
+ return;
45
+ }
46
+
47
+ let sender = Bytes32 { value: sender_value };
48
+ let receiver = Bytes32 { value: receiver_value };
49
+
50
+ let guid_1 = GUID::generate(nonce_1, src_eid, sender, dst_eid, receiver);
51
+ let guid_2 = GUID::generate(nonce_2, src_eid, sender, dst_eid, receiver);
52
+
53
+ assert(guid_1.value != guid_2.value, 'Different nonces should change');
54
+ }
55
+
56
+ #[test]
57
+ #[fuzzer(runs: 10)]
58
+ fn should_generate_different_guid_for_different_src_eid(
59
+ nonce: u64,
60
+ src_eid_1: u32,
61
+ src_eid_2: u32,
62
+ sender_value: u256,
63
+ dst_eid: u32,
64
+ receiver_value: u256,
65
+ ) {
66
+ // Ensure the src_eids are different
67
+ // Same src_eid are tested in should_generate_deterministic_guid
68
+ if src_eid_1 == src_eid_2 {
69
+ return;
70
+ }
71
+
72
+ let sender = Bytes32 { value: sender_value };
73
+ let receiver = Bytes32 { value: receiver_value };
74
+
75
+ let guid_1 = GUID::generate(nonce, src_eid_1, sender, dst_eid, receiver);
76
+ let guid_2 = GUID::generate(nonce, src_eid_2, sender, dst_eid, receiver);
77
+
78
+ assert(guid_1.value != guid_2.value, 'Different src_eid should change');
79
+ }
80
+
81
+ #[test]
82
+ #[fuzzer(runs: 10)]
83
+ fn should_generate_different_guid_for_different_sender(
84
+ nonce: u64, src_eid: u32, sender_1: u256, sender_2: u256, dst_eid: u32, receiver_value: u256,
85
+ ) {
86
+ // Ensure the senders are different
87
+ // Same sender are tested in should_generate_deterministic_guid
88
+ if sender_1 == sender_2 {
89
+ return;
90
+ }
91
+
92
+ let sender_1 = Bytes32 { value: sender_1 };
93
+ let sender_2 = Bytes32 { value: sender_2 };
94
+ let receiver = Bytes32 { value: receiver_value };
95
+
96
+ let guid_1 = GUID::generate(nonce, src_eid, sender_1, dst_eid, receiver);
97
+ let guid_2 = GUID::generate(nonce, src_eid, sender_2, dst_eid, receiver);
98
+
99
+ assert(guid_1.value != guid_2.value, 'Different sender should change');
100
+ }
101
+
102
+ #[test]
103
+ #[fuzzer(runs: 10)]
104
+ fn should_generate_different_guid_for_different_dst_eid(
105
+ nonce: u64,
106
+ src_eid: u32,
107
+ sender_value: u256,
108
+ dst_eid_1: u32,
109
+ dst_eid_2: u32,
110
+ receiver_value: u256,
111
+ ) {
112
+ // Ensure the dst_eids are different
113
+ // Same dst_eid are tested in should_generate_deterministic_guid
114
+ if dst_eid_1 == dst_eid_2 {
115
+ return;
116
+ }
117
+
118
+ let sender = Bytes32 { value: sender_value };
119
+ let receiver = Bytes32 { value: receiver_value };
120
+
121
+ let guid_1 = GUID::generate(nonce, src_eid, sender, dst_eid_1, receiver);
122
+ let guid_2 = GUID::generate(nonce, src_eid, sender, dst_eid_2, receiver);
123
+
124
+ assert(guid_1.value != guid_2.value, 'Different dst_eid should change');
125
+ }
126
+
127
+ #[test]
128
+ #[fuzzer(runs: 10)]
129
+ fn should_generate_different_guid_for_different_receiver(
130
+ nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_1: u256, receiver_2: u256,
131
+ ) {
132
+ // Ensure the receivers are different
133
+ // Same receiver are tested in should_generate_deterministic_guid
134
+ if receiver_1 == receiver_2 {
135
+ return;
136
+ }
137
+
138
+ let sender = Bytes32 { value: sender_value };
139
+ let receiver_1 = Bytes32 { value: receiver_1 };
140
+ let receiver_2 = Bytes32 { value: receiver_2 };
141
+
142
+ let guid_1 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver_1);
143
+ let guid_2 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver_2);
144
+
145
+ assert_ne!(guid_1.value, guid_2.value, "Different receivers should change");
146
+ }
147
+
148
+ #[test]
149
+ #[fuzzer(runs: 10)]
150
+ fn should_match_manual_hash_calculation(
151
+ nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_value: u256,
152
+ ) {
153
+ let sender = Bytes32 { value: sender_value };
154
+ let receiver = Bytes32 { value: receiver_value };
155
+
156
+ let guid = GUID::generate(nonce, src_eid, sender, dst_eid, receiver);
157
+
158
+ // Manually construct the expected ByteArray and hash it
159
+ let mut expected_bytes: ByteArray = Default::default();
160
+ expected_bytes.append_u64(nonce);
161
+ expected_bytes.append_u32(src_eid);
162
+ expected_bytes.append_u256(sender.value);
163
+ expected_bytes.append_u32(dst_eid);
164
+ expected_bytes.append_u256(receiver.value);
165
+
166
+ let expected_guid = keccak256(@expected_bytes);
167
+
168
+ assert(guid.value == expected_guid.value, 'GUID should match manual');
169
+ }
170
+
171
+ #[test]
172
+ #[fuzzer(runs: 10)]
173
+ fn should_have_collision_resistance(
174
+ nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_value: u256,
175
+ ) {
176
+ let sender = Bytes32 { value: sender_value };
177
+ let receiver1 = Bytes32 { value: receiver_value };
178
+ let receiver2 = Bytes32 { value: receiver_value + 1 };
179
+
180
+ let guid1 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver1);
181
+ let guid2 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver2);
182
+
183
+ // Verify the GUIDs are different (collision resistance)
184
+ assert(guid1.value != guid2.value, 'Should be different');
185
+
186
+ // Verify the difference is significant (not just a small bit flip)
187
+ let xor_diff = guid1.value ^ guid2.value;
188
+ assert(xor_diff != 0, 'Should be different');
189
+ }
190
+
191
+ #[test]
192
+ fn should_generate_guid_with_zero_values() {
193
+ let guid = GUID::generate(0, 0, Bytes32 { value: 0 }, 0, Bytes32 { value: 0 });
194
+ // Even zero inputs should produce non-zero GUID due to keccak256 properties
195
+ assert(guid.value != 0, 'Should be different');
196
+ }
197
+
198
+ #[test]
199
+ fn should_generate_guid_with_max_values() {
200
+ let max_bytes = Bytes32 { value: MAX_U256 };
201
+
202
+ let guid = GUID::generate(MAX_U64, MAX_U32, max_bytes, MAX_U32, max_bytes);
203
+ assert(guid.value != 0, 'Should be different');
204
+ }
205
+
206
+ #[test]
207
+ fn should_generate_realistic_layerzero_guid() {
208
+ const REALISTIC_NONCE: u64 = 987654321;
209
+ const ETHEREUM_EID: u32 = 30101;
210
+ const ARBITRUM_EID: u32 = 30110;
211
+ const MOCK_SENDER_ADDRESS: u256 = 0x742d35Cc6634C0532925a3b8D8E3C9b6b32a1E5A;
212
+ const MOCK_RECEIVER_ADDRESS: u256 = 0x8ba1f109551bD432803012645bac136c22afBa93;
213
+
214
+ // Test with realistic LayerZero values
215
+ let sender = Bytes32 { value: MOCK_SENDER_ADDRESS };
216
+ let receiver = Bytes32 { value: MOCK_RECEIVER_ADDRESS };
217
+
218
+ let guid = GUID::generate(REALISTIC_NONCE, ETHEREUM_EID, sender, ARBITRUM_EID, receiver);
219
+
220
+ // Verify GUID properties
221
+ assert(guid.value != 0, 'Should be different');
222
+
223
+ // Test deterministic behavior
224
+ let guid_repeat = GUID::generate(REALISTIC_NONCE, ETHEREUM_EID, sender, ARBITRUM_EID, receiver);
225
+ assert(guid.value == guid_repeat.value, 'Should be the same');
226
+
227
+ // Test that incrementing nonce changes GUID
228
+ let guid_next_nonce = GUID::generate(
229
+ REALISTIC_NONCE + 1, ETHEREUM_EID, sender, ARBITRUM_EID, receiver,
230
+ );
231
+ assert(guid.value != guid_next_nonce.value, 'Should be different');
232
+ }
@@ -0,0 +1,372 @@
1
+ //! Test packet v1 codec
2
+
3
+ use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
4
+ use layerzero::common::packet_v1_codec::PacketV1Codec;
5
+ use layerzero::common::packet_v1_codec::PacketV1Codec::{PacketPayload, PacketSenderBytes};
6
+ use layerzero::common::structs::packet::Packet;
7
+ use lz_utils::bytes::{Bytes32, ContractAddressIntoBytes32};
8
+ use snforge_std::fuzzable::{FuzzableU32, FuzzableU64, FuzzableU8};
9
+ use starknet::ContractAddress;
10
+ use starkware_utils::constants::MAX_U256;
11
+ use crate::fuzzable::bytes32::FuzzableBytes32;
12
+ use crate::fuzzable::contract_address::FuzzableContractAddress;
13
+ use crate::fuzzable::eid::{Eid, FuzzableEid};
14
+ use crate::fuzzable::small_byte_array::FuzzableByteArray;
15
+
16
+ #[test]
17
+ #[fuzzer(runs: 10)]
18
+ fn test_encode_decode_packet(
19
+ sender: ContractAddress,
20
+ receiver: ContractAddress,
21
+ nonce: u64,
22
+ guid: Bytes32,
23
+ src_eid: Eid,
24
+ dst_eid: Eid,
25
+ message: ByteArray,
26
+ ) {
27
+ let src_eid = src_eid.eid;
28
+ let dst_eid = dst_eid.eid;
29
+ let receiver = receiver.into();
30
+ let packet = Packet {
31
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
32
+ };
33
+ let encoded = PacketV1Codec::encode(@packet);
34
+
35
+ // Verify decoding individual fields
36
+ assert(PacketV1Codec::version(@encoded) == PacketV1Codec::PACKET_VERSION, 'version mismatch');
37
+ assert(PacketV1Codec::nonce(@encoded) == nonce, 'nonce mismatch');
38
+ assert(PacketV1Codec::src_eid(@encoded) == src_eid, 'src_eid mismatch');
39
+ assert(PacketV1Codec::dst_eid(@encoded) == dst_eid, 'dst_eid mismatch');
40
+ assert(PacketV1Codec::receiver(@encoded) == receiver, 'receiver mismatch');
41
+ assert(PacketV1Codec::guid(@encoded) == guid, 'guid mismatch');
42
+ assert(PacketV1Codec::message(@encoded) == message, 'message mismatch');
43
+ }
44
+
45
+ #[test]
46
+ #[fuzzer(runs: 10)]
47
+ fn test_encode_packet_header(
48
+ sender: ContractAddress,
49
+ receiver: ContractAddress,
50
+ nonce: u64,
51
+ guid: Bytes32,
52
+ src_eid: Eid,
53
+ dst_eid: Eid,
54
+ message: ByteArray,
55
+ ) {
56
+ let src_eid = src_eid.eid;
57
+ let dst_eid = dst_eid.eid;
58
+ let receiver = receiver.into();
59
+ let packet = Packet { nonce, src_eid, sender, dst_eid, receiver, guid, message };
60
+
61
+ // Header should be exactly 81 bytes (up to GUID_OFFSET)
62
+ let header = PacketV1Codec::encode_header(@packet);
63
+ assert(header.len() == PacketV1Codec::GUID_OFFSET, 'header length mismatch');
64
+
65
+ // Verify header extraction from full packet
66
+ let encoded = PacketV1Codec::encode(@packet);
67
+ assert(PacketV1Codec::header(@encoded) == header, 'header extraction mismatch');
68
+ }
69
+
70
+ #[test]
71
+ #[fuzzer(runs: 10)]
72
+ fn test_encode_payload(
73
+ sender: ContractAddress,
74
+ receiver: ContractAddress,
75
+ nonce: u64,
76
+ guid: Bytes32,
77
+ src_eid: Eid,
78
+ dst_eid: Eid,
79
+ message: ByteArray,
80
+ ) {
81
+ let src_eid = src_eid.eid;
82
+ let dst_eid = dst_eid.eid;
83
+ let receiver = receiver.into();
84
+ let packet = Packet {
85
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
86
+ };
87
+
88
+ // Verify payload extraction from full packet
89
+ let encoded = PacketV1Codec::encode(@packet);
90
+ let payload = PacketV1Codec::payload(@encoded);
91
+ assert(PacketV1Codec::encode_payload(@packet) == payload, 'payload extraction mismatch');
92
+ }
93
+
94
+ #[test]
95
+ #[fuzzer(runs: 10)]
96
+ fn test_payload_hash(
97
+ sender: ContractAddress,
98
+ receiver: ContractAddress,
99
+ nonce: u64,
100
+ guid: Bytes32,
101
+ src_eid: Eid,
102
+ dst_eid: Eid,
103
+ message: ByteArray,
104
+ ) {
105
+ let src_eid = src_eid.eid;
106
+ let dst_eid = dst_eid.eid;
107
+ let receiver = receiver.into();
108
+ let packet = Packet {
109
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
110
+ };
111
+
112
+ // Payload hash should not be zero
113
+ let encoded = PacketV1Codec::encode(@packet);
114
+ let payload_hash = PacketV1Codec::payload_hash(@encoded);
115
+ assert(payload_hash.value != 0, 'payload hash is zero');
116
+ }
117
+
118
+ #[test]
119
+ #[fuzzer(runs: 10)]
120
+ fn test_sender_address_conversion(
121
+ sender: ContractAddress,
122
+ receiver: ContractAddress,
123
+ nonce: u64,
124
+ guid: Bytes32,
125
+ src_eid: Eid,
126
+ dst_eid: Eid,
127
+ message: ByteArray,
128
+ ) {
129
+ let src_eid = src_eid.eid;
130
+ let dst_eid = dst_eid.eid;
131
+ let receiver = receiver.into();
132
+ let packet = Packet {
133
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
134
+ };
135
+
136
+ // Should be able to decode the sender address
137
+ let encoded = PacketV1Codec::encode(@packet);
138
+ let decoded_sender = PacketV1Codec::sender_address(@encoded);
139
+ assert(decoded_sender == sender, 'Decoded sender should match');
140
+ }
141
+
142
+ #[test]
143
+ #[fuzzer(runs: 10)]
144
+ #[should_panic(expected: "LZ_PACKET_V1_CODEC_INVALID_SENDER_ADDRESS")]
145
+ fn test_invalid_sender_address(random_8_bytes: u64, random_4_bytes: u32, random_byte: u8) {
146
+ // This will fail since its not a valid felt252, so its not a valid contract address
147
+ let mut encoded: ByteArray = Default::default();
148
+ // adding 13 bytes since its the sender offset
149
+ encoded.append_u64(random_8_bytes);
150
+ encoded.append_u32(random_4_bytes);
151
+ encoded.append_u8(random_byte);
152
+ encoded.append_u256(MAX_U256);
153
+ // this should return the expected error
154
+ PacketV1Codec::sender_address(@encoded);
155
+ }
156
+
157
+
158
+ #[test]
159
+ #[fuzzer(runs: 10)]
160
+ fn test_receiver_address_conversion(
161
+ sender: ContractAddress,
162
+ receiver: ContractAddress,
163
+ nonce: u64,
164
+ guid: Bytes32,
165
+ src_eid: Eid,
166
+ dst_eid: Eid,
167
+ message: ByteArray,
168
+ ) {
169
+ let src_eid = src_eid.eid;
170
+ let dst_eid = dst_eid.eid;
171
+ let receiver_bytes = receiver.into();
172
+ let packet = Packet {
173
+ nonce, src_eid, sender, dst_eid, receiver: receiver_bytes, guid, message: message.clone(),
174
+ };
175
+
176
+ // Should be able to decode the receiver address
177
+ let encoded = PacketV1Codec::encode(@packet);
178
+ let decoded_receiver = PacketV1Codec::receiver_address(@encoded);
179
+ assert(decoded_receiver == receiver, 'Decoded receiver should match');
180
+ }
181
+
182
+ #[test]
183
+ #[fuzzer(runs: 10)]
184
+ #[should_panic(expected: "LZ_PACKET_V1_CODEC_INVALID_RECEIVER_ADDRESS")]
185
+ fn test_invalid_receiver_address(
186
+ sender: ContractAddress,
187
+ nonce: u64,
188
+ guid: Bytes32,
189
+ src_eid: Eid,
190
+ dst_eid: Eid,
191
+ message: ByteArray,
192
+ ) {
193
+ let receiver_max = Bytes32 { value: MAX_U256 };
194
+ let src_eid = src_eid.eid;
195
+ let dst_eid = dst_eid.eid;
196
+ let packet = Packet {
197
+ nonce, src_eid, sender, dst_eid, receiver: receiver_max, guid, message: message.clone(),
198
+ };
199
+
200
+ // Should be able to decode the receiver address
201
+ let encoded = PacketV1Codec::encode(@packet);
202
+ PacketV1Codec::receiver_address(@encoded);
203
+ }
204
+
205
+
206
+ #[test]
207
+ #[fuzzer(runs: 10)]
208
+ fn test_decode_payload(
209
+ sender: ContractAddress,
210
+ receiver: ContractAddress,
211
+ nonce: u64,
212
+ guid: Bytes32,
213
+ src_eid: Eid,
214
+ dst_eid: Eid,
215
+ message: ByteArray,
216
+ ) {
217
+ let src_eid = src_eid.eid;
218
+ let dst_eid = dst_eid.eid;
219
+ let receiver = receiver.into();
220
+ let packet = Packet {
221
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
222
+ };
223
+
224
+ let encoded = PacketV1Codec::encode(@packet);
225
+ let PacketPayload {
226
+ guid: decoded_guid, message: decoded_message,
227
+ } = PacketV1Codec::decode_payload(@encoded);
228
+
229
+ // Verify payload fields match
230
+ assert(decoded_guid == packet.guid, 'guid mismatch');
231
+ assert(decoded_message == message, 'message mismatch');
232
+ }
233
+
234
+ #[test]
235
+ #[fuzzer(runs: 10)]
236
+ fn test_decode_full_packet(
237
+ sender: ContractAddress,
238
+ receiver: ContractAddress,
239
+ nonce: u64,
240
+ guid: Bytes32,
241
+ src_eid: Eid,
242
+ dst_eid: Eid,
243
+ message: ByteArray,
244
+ ) {
245
+ let src_eid = src_eid.eid;
246
+ let dst_eid = dst_eid.eid;
247
+ let receiver = receiver.into();
248
+ let packet = Packet {
249
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
250
+ };
251
+
252
+ // Roundtrip
253
+ let encoded = PacketV1Codec::encode(@packet);
254
+ let decoded = PacketV1Codec::decode(@encoded);
255
+
256
+ // Verify all fields match exactly
257
+ assert(decoded.nonce == packet.nonce, 'nonce mismatch');
258
+ assert(decoded.src_eid == packet.src_eid, 'src_eid mismatch');
259
+ assert(decoded.sender == packet.sender, 'sender mismatch');
260
+ assert(decoded.dst_eid == packet.dst_eid, 'dst_eid mismatch');
261
+ assert(decoded.receiver == packet.receiver, 'receiver mismatch');
262
+ assert(decoded.guid == packet.guid, 'guid mismatch');
263
+ assert(decoded.message == packet.message, 'message mismatch');
264
+ }
265
+
266
+ #[test]
267
+ #[fuzzer(runs: 10)]
268
+ fn test_decode_with_bytes32_sender(
269
+ sender: ContractAddress,
270
+ receiver: ContractAddress,
271
+ nonce: u64,
272
+ guid: Bytes32,
273
+ src_eid: Eid,
274
+ dst_eid: Eid,
275
+ message: ByteArray,
276
+ ) {
277
+ let src_eid = src_eid.eid;
278
+ let dst_eid = dst_eid.eid;
279
+ let receiver = receiver.into();
280
+ let packet = Packet {
281
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
282
+ };
283
+
284
+ let encoded = PacketV1Codec::encode(@packet);
285
+ let PacketSenderBytes {
286
+ nonce,
287
+ src_eid,
288
+ sender: sender_bytes,
289
+ dst_eid,
290
+ receiver: receiver_bytes,
291
+ guid: guid_bytes,
292
+ message: decoded_message,
293
+ } = PacketV1Codec::decode_with_bytes32_sender(@encoded);
294
+
295
+ // Verify all fields match
296
+ assert(nonce == packet.nonce, 'nonce mismatch');
297
+ assert(src_eid == packet.src_eid, 'src_eid mismatch');
298
+ assert(dst_eid == packet.dst_eid, 'dst_eid mismatch');
299
+ assert(receiver_bytes == packet.receiver, 'receiver mismatch');
300
+ assert(guid_bytes == packet.guid, 'guid mismatch');
301
+ assert(decoded_message == message, 'message mismatch');
302
+
303
+ // Verify sender can be converted back
304
+ assert(sender_bytes.try_into().unwrap() == packet.sender, 'sender mismatch');
305
+ }
306
+
307
+ #[test]
308
+ #[fuzzer(runs: 10)]
309
+ fn test_encode_decode_roundtrip(
310
+ sender: ContractAddress,
311
+ receiver: ContractAddress,
312
+ nonce: u64,
313
+ guid: Bytes32,
314
+ src_eid: Eid,
315
+ dst_eid: Eid,
316
+ message: ByteArray,
317
+ ) {
318
+ let src_eid = src_eid.eid;
319
+ let dst_eid = dst_eid.eid;
320
+ let receiver = receiver.into();
321
+ let packet = Packet {
322
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
323
+ };
324
+
325
+ // Roundtrip
326
+ let encoded = PacketV1Codec::encode(@packet);
327
+ let decoded = PacketV1Codec::decode(@encoded);
328
+
329
+ // Verify perfect roundtrip
330
+ assert(decoded.nonce == packet.nonce, 'roundtrip nonce fail');
331
+ assert(decoded.src_eid == packet.src_eid, 'roundtrip src_eid fail');
332
+ assert(decoded.sender == packet.sender, 'roundtrip sender fail');
333
+ assert(decoded.dst_eid == packet.dst_eid, 'roundtrip dst_eid fail');
334
+ assert(decoded.receiver == packet.receiver, 'roundtrip receiver fail');
335
+ assert(decoded.guid == packet.guid, 'roundtrip guid fail');
336
+ assert(decoded.message == packet.message, 'roundtrip message fail');
337
+ }
338
+
339
+ #[test]
340
+ #[should_panic(expected: "LZ_PACKET_V1_CODEC_INVALID_PACKET_VERSION")]
341
+ #[fuzzer(runs: 10)]
342
+ fn test_decode_invalid_version(
343
+ sender: ContractAddress,
344
+ receiver: ContractAddress,
345
+ nonce: u64,
346
+ guid: Bytes32,
347
+ src_eid: Eid,
348
+ dst_eid: Eid,
349
+ message: ByteArray,
350
+ ) {
351
+ let src_eid = src_eid.eid;
352
+ let dst_eid = dst_eid.eid;
353
+ let receiver = receiver.into();
354
+ let packet = Packet {
355
+ nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
356
+ };
357
+
358
+ let mut encoded = PacketV1Codec::encode(@packet);
359
+
360
+ // Corrupt the version byte (first byte should be 1, change it to 2)
361
+ // We need to manually modify the first byte
362
+ let mut corrupted_encoded: ByteArray = Default::default();
363
+ corrupted_encoded.append_u8(2); // Invalid version
364
+
365
+ // Append the rest of the packet (skip the first byte)
366
+ for i in 1..encoded.len() {
367
+ corrupted_encoded.append_u8(encoded.at(i).unwrap());
368
+ }
369
+
370
+ // This should panic with "Invalid packet version"
371
+ PacketV1Codec::decode(@corrupted_encoded);
372
+ }