@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,32 @@
1
+ //! Executor events
2
+
3
+ use starknet::ContractAddress;
4
+ use crate::Origin;
5
+ use crate::workers::executor::structs::{NativeDropParams, SetDstConfigParams};
6
+
7
+ /// Emitted when a destination configuration is set or updated.
8
+ /// @dev Triggered by the `set_dst_config` function.
9
+ #[derive(Drop, starknet::Event)]
10
+ pub struct DstConfigSet {
11
+ /// The destination configurations that were set.
12
+ pub dst_config_set: Span<SetDstConfigParams>,
13
+ }
14
+
15
+ /// Emitted when a native token drop is applied.
16
+ /// @dev Triggered by the `_apply_native_drop` internal function.
17
+ #[derive(Drop, starknet::Event)]
18
+ pub struct NativeDropApplied {
19
+ /// The origin information of the message.
20
+ #[key]
21
+ pub origin: Origin,
22
+ /// The destination endpoint ID.
23
+ #[key]
24
+ pub dst_eid: u32,
25
+ /// The OApp that received the native drop.
26
+ #[key]
27
+ pub oapp: ContractAddress,
28
+ /// The parameters for the native drop.
29
+ pub native_drop_params: Array<NativeDropParams>,
30
+ /// An array indicating the success of each native drop.
31
+ pub success: Array<bool>,
32
+ }
@@ -0,0 +1,392 @@
1
+ //! Executor contract
2
+
3
+ /// # Executor contract
4
+ ///
5
+ /// This contract is responsible for executing LayerZero messages and native token drops.
6
+ /// It also provides a quote function for the worker to use when assigning a job.
7
+ #[starknet::contract]
8
+ pub mod Executor {
9
+ use core::num::traits::Zero;
10
+ use openzeppelin::access::accesscontrol::AccessControlComponent;
11
+ use openzeppelin::access::ownable::OwnableComponent;
12
+ use openzeppelin::introspection::src5::SRC5Component;
13
+ use openzeppelin::security::ReentrancyGuardComponent;
14
+ use openzeppelin::security::pausable::PausableComponent;
15
+ use openzeppelin::token::erc20::interface::{
16
+ IERC20Dispatcher, IERC20DispatcherTrait, IERC20SafeDispatcher, IERC20SafeDispatcherTrait,
17
+ };
18
+ use openzeppelin::upgrades::upgradeable::UpgradeableComponent;
19
+ use starknet::storage::{
20
+ Map, StorageMapReadAccess, StorageMapWriteAccess, StoragePointerReadAccess,
21
+ StoragePointerWriteAccess,
22
+ };
23
+ use starknet::{ClassHash, ContractAddress};
24
+ use starkware_utils::errors::assert_with_byte_array;
25
+ use crate::Origin;
26
+ use crate::common::conversions::FeltArrayIntoByteArrayImpl;
27
+ use crate::endpoint::interfaces::endpoint::{
28
+ IEndpointDispatcher, IEndpointDispatcherTrait, IEndpointSafeDispatcher,
29
+ IEndpointSafeDispatcherTrait,
30
+ };
31
+ use crate::endpoint::messaging_composer::interface::{
32
+ IMessagingComposerSafeDispatcher, IMessagingComposerSafeDispatcherTrait,
33
+ };
34
+ use crate::workers::base::base::WorkerBaseComponent;
35
+ use crate::workers::base::structs::QuoteParams;
36
+ use crate::workers::executor::errors;
37
+ use crate::workers::executor::events::{DstConfigSet, NativeDropApplied};
38
+ use crate::workers::executor::fee_lib::interface::{
39
+ FeeParams, IExecutorFeeLibDispatcher, IExecutorFeeLibDispatcherTrait,
40
+ };
41
+ use crate::workers::executor::interface::IExecutor;
42
+ use crate::workers::executor::structs::{
43
+ ComposeParams, DstConfig, ExecuteParams, NativeDropParams, SetDstConfigParams,
44
+ };
45
+ use crate::workers::interface::ILayerZeroWorker;
46
+
47
+ ////////////////
48
+ // Components //
49
+ ////////////////
50
+
51
+ // Base worker component
52
+ component!(path: WorkerBaseComponent, storage: worker_base, event: WorkerBaseEvent);
53
+
54
+ // Access control components
55
+ component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);
56
+ component!(path: SRC5Component, storage: src5, event: SRC5Event);
57
+
58
+ // Upgradeable component
59
+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);
60
+
61
+ /// Declares the reentrancy guard component which provides:
62
+ /// - Reentrancy guard to prevent reentrancy attacks during transaction execution,
63
+ /// similar to the nonReentrant modifier in EVM implementations
64
+ component!(
65
+ path: ReentrancyGuardComponent, storage: reentrancy_guard, event: ReentrancyGuardEvent,
66
+ );
67
+
68
+ // Pausable component
69
+ component!(path: PausableComponent, storage: pausable, event: PausableEvent);
70
+
71
+ // Ownable component
72
+ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
73
+
74
+ ////////////////
75
+ // Embeddings //
76
+ ////////////////
77
+
78
+ #[abi(embed_v0)]
79
+ impl WorkerBaseImpl = WorkerBaseComponent::WorkerBaseImpl<ContractState>;
80
+ impl WorkerBaseInternalImpl = WorkerBaseComponent::InternalImpl<ContractState>;
81
+
82
+ #[abi(embed_v0)]
83
+ impl AccessControlImpl = WorkerBaseComponent::AccessControlImpl<ContractState>;
84
+ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;
85
+
86
+ #[abi(embed_v0)]
87
+ impl PausableImpl = PausableComponent::PausableImpl<ContractState>;
88
+
89
+ /// Upgradeable component internal implementation
90
+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;
91
+
92
+ /// Implements the reentrancy guard component which provides:
93
+ /// - Reentrancy guard to prevent reentrancy attacks during transaction execution,
94
+ /// similar to the nonReentrant modifier in EVM implementations
95
+ impl ReentrancyGuardInternalImpl = ReentrancyGuardComponent::InternalImpl<ContractState>;
96
+
97
+ #[abi(embed_v0)]
98
+ impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
99
+ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;
100
+
101
+ #[storage]
102
+ struct Storage {
103
+ #[substorage(v0)]
104
+ worker_base: WorkerBaseComponent::Storage,
105
+ #[substorage(v0)]
106
+ reentrancy_guard: ReentrancyGuardComponent::Storage,
107
+ #[substorage(v0)]
108
+ access_control: AccessControlComponent::Storage,
109
+ #[substorage(v0)]
110
+ src5: SRC5Component::Storage,
111
+ #[substorage(v0)]
112
+ pausable: PausableComponent::Storage,
113
+ #[substorage(v0)]
114
+ upgradeable: UpgradeableComponent::Storage,
115
+ #[substorage(v0)]
116
+ ownable: OwnableComponent::Storage,
117
+ /// A map of destination endpoint IDs to their configurations.
118
+ dst_configs: Map<u32, DstConfig>,
119
+ /// The address of the LayerZero Endpoint contract.
120
+ endpoint: ContractAddress,
121
+ /// The address of the native token contract.
122
+ native_token_address: ContractAddress,
123
+ /// The endpoint ID of the current chain.
124
+ eid: u32,
125
+ }
126
+
127
+ #[event]
128
+ #[derive(Drop, starknet::Event)]
129
+ pub enum Event {
130
+ #[flat]
131
+ WorkerBaseEvent: WorkerBaseComponent::Event,
132
+ #[flat]
133
+ ReentrancyGuardEvent: ReentrancyGuardComponent::Event,
134
+ #[flat]
135
+ AccessControlEvent: AccessControlComponent::Event,
136
+ #[flat]
137
+ SRC5Event: SRC5Component::Event,
138
+ #[flat]
139
+ UpgradeableEvent: UpgradeableComponent::Event,
140
+ #[flat]
141
+ PausableEvent: PausableComponent::Event,
142
+ #[flat]
143
+ OwnableEvent: OwnableComponent::Event,
144
+ /// Executor-specific events
145
+ DstConfigSet: DstConfigSet,
146
+ NativeDropApplied: NativeDropApplied,
147
+ }
148
+
149
+ #[constructor]
150
+ fn constructor(
151
+ ref self: ContractState,
152
+ endpoint: ContractAddress,
153
+ message_libs: Array<ContractAddress>,
154
+ price_feed: ContractAddress,
155
+ default_multiplier_bps: u16,
156
+ role_admin: ContractAddress,
157
+ admins: Array<ContractAddress>,
158
+ native_token_address: ContractAddress,
159
+ owner: ContractAddress,
160
+ ) {
161
+ self.eid.write(IEndpointDispatcher { contract_address: endpoint }.get_eid());
162
+
163
+ // Initialize access control and ownable components
164
+ self.ownable.initializer(owner);
165
+ self.access_control.initializer();
166
+
167
+ // Initialize base worker
168
+ self
169
+ .worker_base
170
+ .initializer(message_libs, price_feed, default_multiplier_bps, role_admin, admins);
171
+
172
+ // Initialize addresses
173
+ self.endpoint.write(endpoint);
174
+ self.native_token_address.write(native_token_address);
175
+ }
176
+
177
+ #[abi(embed_v0)]
178
+ impl ExecutorImpl of IExecutor<ContractState> {
179
+ // ================================== Only Owner =====================================
180
+
181
+ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {
182
+ self.ownable.assert_only_owner();
183
+ self.upgradeable.upgrade(new_class_hash);
184
+ }
185
+
186
+ fn upgrade_and_call(
187
+ ref self: ContractState,
188
+ new_class_hash: ClassHash,
189
+ selector: felt252,
190
+ calldata: Span<felt252>,
191
+ ) -> Span<felt252> {
192
+ self.ownable.assert_only_owner();
193
+ self.upgradeable.upgrade_and_call(new_class_hash, selector, calldata)
194
+ }
195
+
196
+ // ================================== Only Admin =====================================
197
+
198
+ fn set_dst_config(ref self: ContractState, params: Array<SetDstConfigParams>) {
199
+ self.worker_base._assert_only_admin();
200
+
201
+ let dst_config_set = params.span();
202
+ for param in params.into_iter() {
203
+ self.dst_configs.write(param.dst_eid, param.config);
204
+ }
205
+
206
+ self.emit(DstConfigSet { dst_config_set });
207
+ }
208
+
209
+ fn execute(ref self: ContractState, params: ExecuteParams) {
210
+ self.worker_base._assert_only_admin();
211
+ self.reentrancy_guard.start();
212
+ self._execute(params);
213
+ self.reentrancy_guard.end();
214
+ }
215
+
216
+ fn compose(ref self: ContractState, params: ComposeParams) {
217
+ self.worker_base._assert_only_admin();
218
+ self.reentrancy_guard.start();
219
+ self._compose(params);
220
+ self.reentrancy_guard.end();
221
+ }
222
+
223
+ fn native_drop(
224
+ ref self: ContractState,
225
+ origin: Origin,
226
+ oapp: ContractAddress,
227
+ native_drop_params: Array<NativeDropParams>,
228
+ ) {
229
+ self.worker_base._assert_only_admin();
230
+ self._native_drop(origin, oapp, native_drop_params);
231
+ }
232
+
233
+ fn native_drop_and_execute(
234
+ ref self: ContractState,
235
+ native_drop_params: Array<NativeDropParams>,
236
+ execute_params: ExecuteParams,
237
+ ) {
238
+ self.worker_base._assert_only_admin();
239
+ self.reentrancy_guard.start();
240
+ self
241
+ ._native_drop(
242
+ execute_params.origin.clone(), execute_params.receiver, native_drop_params,
243
+ );
244
+ self._execute(execute_params);
245
+ self.reentrancy_guard.end();
246
+ }
247
+
248
+ // ================================== View ==========================================
249
+
250
+ fn get_dst_config(self: @ContractState, dst_eid: u32) -> DstConfig {
251
+ self.dst_configs.read(dst_eid)
252
+ }
253
+ }
254
+
255
+ #[abi(embed_v0)]
256
+ impl LayerZeroWorkerImpl of ILayerZeroWorker<ContractState> {
257
+ // ================================== Only Message Lib =====================================
258
+
259
+ /// This executor implementation does not require any additional steps beyond providing
260
+ /// the quote when assigning a job
261
+ fn assign_job(ref self: ContractState, params: QuoteParams) -> u256 {
262
+ self.worker_base._assert_not_paused();
263
+ self.worker_base._assert_only_message_lib();
264
+ self.quote(params)
265
+ }
266
+
267
+ // ================================== View =====================================
268
+
269
+ fn quote(self: @ContractState, params: QuoteParams) -> u256 {
270
+ self.worker_base._assert_not_paused();
271
+
272
+ let QuoteParams { dst_eid, sender, calldata_size, options, .. } = params;
273
+
274
+ // Assert price feed is set
275
+ let price_feed = self.worker_base.get_price_feed();
276
+ assert_with_byte_array(price_feed.is_non_zero(), errors::err_price_feed_not_set());
277
+
278
+ // Assert worker fee lib is set
279
+ let worker_fee_lib_addr = self.worker_base.get_worker_fee_lib();
280
+ assert_with_byte_array(
281
+ worker_fee_lib_addr.is_non_zero(), errors::err_worker_fee_lib_not_set(),
282
+ );
283
+
284
+ let fee_params = FeeParams {
285
+ price_feed,
286
+ dst_eid,
287
+ sender,
288
+ calldata_size,
289
+ default_multiplier_bps: self.worker_base.get_default_multiplier_bps(),
290
+ };
291
+
292
+ // Call fee lib to get the quote
293
+ let fee_lib = IExecutorFeeLibDispatcher { contract_address: worker_fee_lib_addr };
294
+ fee_lib.get_fee(fee_params, self.dst_configs.read(dst_eid), options)
295
+ }
296
+ }
297
+
298
+ #[generate_trait]
299
+ impl InternalImpl of InternalTrait {
300
+ #[feature("safe_dispatcher")]
301
+ fn _execute(ref self: ContractState, params: ExecuteParams) {
302
+ let ExecuteParams {
303
+ origin, receiver, guid, message, value, extra_data, gas_limit, ..,
304
+ } = params;
305
+
306
+ let endpoint_address = self.endpoint.read();
307
+
308
+ // Sender gives approval to the endpoint for the specified amount
309
+ if value > 0 {
310
+ let token = IERC20Dispatcher { contract_address: self.native_token_address.read() };
311
+ token.approve(endpoint_address, value);
312
+ }
313
+
314
+ let endpoint = IEndpointSafeDispatcher { contract_address: endpoint_address };
315
+ if let Err(reason) = endpoint
316
+ .lz_receive(
317
+ origin.clone(), receiver, guid, message.clone(), value, extra_data.clone(),
318
+ ) {
319
+ endpoint
320
+ .lz_receive_alert(
321
+ origin, receiver, guid, gas_limit, value, message, extra_data, reason,
322
+ )
323
+ .expect('Alert event emitted');
324
+ }
325
+ }
326
+
327
+ #[feature("safe_dispatcher")]
328
+ fn _native_drop(
329
+ ref self: ContractState,
330
+ origin: Origin,
331
+ oapp: ContractAddress,
332
+ native_drop_params: Array<NativeDropParams>,
333
+ ) {
334
+ let mut success = array![];
335
+
336
+ for params in @native_drop_params {
337
+ // Because the OpenZeppelin implementation of ERC-20 reverts with an error or
338
+ // returns `true` always on the `transfer` function call, we need to use the safe
339
+ // dispatcher and check the `Result` values.
340
+ // https://docs.openzeppelin.com/contracts-cairo/1.0.0/erc20#erc20_compatibility
341
+ let result = IERC20SafeDispatcher {
342
+ contract_address: self.native_token_address.read(),
343
+ }
344
+ .transfer(*params.receiver, *params.amount);
345
+
346
+ success.append(result.is_ok());
347
+ }
348
+
349
+ self
350
+ .emit(
351
+ NativeDropApplied {
352
+ origin, dst_eid: self.eid.read(), oapp, native_drop_params, success,
353
+ },
354
+ );
355
+ }
356
+
357
+ #[feature("safe_dispatcher")]
358
+ fn _compose(ref self: ContractState, params: ComposeParams) {
359
+ let ComposeParams {
360
+ sender, receiver, guid, index, message, gas_limit, extra_data, value,
361
+ } = params;
362
+
363
+ let endpoint_address = self.endpoint.read();
364
+
365
+ // Sender gives approval to the endpoint for the specified amount
366
+ if value > 0 {
367
+ let token = IERC20Dispatcher { contract_address: self.native_token_address.read() };
368
+ token.approve(endpoint_address, value);
369
+ }
370
+
371
+ let composer = IMessagingComposerSafeDispatcher { contract_address: endpoint_address };
372
+ if let Err(reason) = composer
373
+ .lz_compose(
374
+ sender, receiver, guid, index, message.clone(), extra_data.clone(), value,
375
+ ) {
376
+ composer
377
+ .lz_compose_alert(
378
+ sender,
379
+ receiver,
380
+ guid,
381
+ index,
382
+ gas_limit,
383
+ value,
384
+ message,
385
+ extra_data,
386
+ reason,
387
+ )
388
+ .expect('Alert event emitted');
389
+ }
390
+ }
391
+ }
392
+ }
@@ -0,0 +1,160 @@
1
+ //! Executor Fee Library contract implementation
2
+
3
+ /// # Executor Fee Library contract
4
+ ///
5
+ /// This contract handles fee calculations for executor operations, separated from the main executor
6
+ /// logic to provide modularity and easier maintenance of fee-related functionality.
7
+ #[starknet::contract]
8
+ pub mod ExecutorFeeLib {
9
+ use openzeppelin::access::ownable::OwnableComponent;
10
+ use openzeppelin::token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait};
11
+ use starknet::ContractAddress;
12
+ use starknet::storage::StoragePointerWriteAccess;
13
+ use starkware_utils::errors::assert_with_byte_array;
14
+ use crate::common::constants::MAX_V1_EID;
15
+ use crate::workers::common::{
16
+ apply_premium_and_floor_margin, convert_and_apply_premium_to_value,
17
+ };
18
+ use crate::workers::executor::errors;
19
+ use crate::workers::executor::fee_lib::interface::{FeeParams, IExecutorFeeLib};
20
+ use crate::workers::executor::options::_decode_executor_options;
21
+ use crate::workers::executor::structs::DstConfig;
22
+ use crate::workers::price_feed::interface::{
23
+ ILayerZeroPriceFeedDispatcher, ILayerZeroPriceFeedDispatcherTrait,
24
+ };
25
+
26
+ ////////////////
27
+ // Components //
28
+ ////////////////
29
+
30
+ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
31
+
32
+ ////////////////
33
+ // Embeddings //
34
+ ////////////////
35
+
36
+ #[abi(embed_v0)]
37
+ impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
38
+ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;
39
+
40
+ #[storage]
41
+ struct Storage {
42
+ #[substorage(v0)]
43
+ ownable: OwnableComponent::Storage,
44
+ /// Local endpoint ID v2
45
+ local_eid_v2: u32,
46
+ }
47
+
48
+ #[event]
49
+ #[derive(Drop, starknet::Event)]
50
+ pub enum Event {
51
+ #[flat]
52
+ OwnableEvent: OwnableComponent::Event,
53
+ }
54
+
55
+ #[constructor]
56
+ fn constructor(ref self: ContractState, local_eid_v2: u32, owner: ContractAddress) {
57
+ // Initialize ownable component
58
+ self.ownable.initializer(owner);
59
+
60
+ // Set immutable values
61
+ self.local_eid_v2.write(local_eid_v2);
62
+ }
63
+
64
+ #[abi(embed_v0)]
65
+ impl ExecutorFeeLibImpl of IExecutorFeeLib<ContractState> {
66
+ // ================================== Only Owner =====================================
67
+
68
+ fn withdraw_token(
69
+ ref self: ContractState,
70
+ token_address: ContractAddress,
71
+ to: ContractAddress,
72
+ amount: u256,
73
+ ) {
74
+ self.ownable.assert_only_owner();
75
+ let token_dispatcher = IERC20Dispatcher { contract_address: token_address };
76
+
77
+ // NOTE: (from https://docs.openzeppelin.com/contracts-cairo/1.0.0/erc20)
78
+ // transfer, transfer_from and approve will never return anything different from true
79
+ // because they will revert on any error.
80
+ token_dispatcher.transfer(to, amount);
81
+ }
82
+
83
+ // ================================== External =====================================
84
+
85
+ fn get_fee_on_send(
86
+ ref self: ContractState, params: FeeParams, dst_config: DstConfig, options: ByteArray,
87
+ ) -> u256 {
88
+ self.get_fee(params, dst_config, options)
89
+ }
90
+
91
+ // ================================== View =====================================
92
+
93
+ fn get_fee(
94
+ self: @ContractState, params: FeeParams, dst_config: DstConfig, options: ByteArray,
95
+ ) -> u256 {
96
+ // Check if destination is supported
97
+ assert_with_byte_array(
98
+ dst_config.lz_receive_base_gas != 0, errors::err_eid_not_supported(),
99
+ );
100
+
101
+ // Decode executor options
102
+ let price_feed_params = _decode_executor_options(
103
+ false,
104
+ self._is_v1_eid(params.dst_eid),
105
+ dst_config.lz_receive_base_gas.into(),
106
+ dst_config.lz_compose_base_gas.into(),
107
+ dst_config.native_cap,
108
+ @options,
109
+ );
110
+
111
+ // Get price feed estimate
112
+ let price_feed = ILayerZeroPriceFeedDispatcher { contract_address: params.price_feed };
113
+ let estimated_fee = price_feed
114
+ .estimate_fee_on_send(
115
+ params.dst_eid, params.calldata_size, price_feed_params.total_gas,
116
+ );
117
+
118
+ // Apply premium to gas fee
119
+ let mut fee = apply_premium_and_floor_margin(
120
+ estimated_fee.gas_fee,
121
+ dst_config.multiplier_bps,
122
+ params.default_multiplier_bps,
123
+ dst_config.floor_margin_usd,
124
+ estimated_fee.native_price_usd,
125
+ );
126
+
127
+ // Apply premium to value
128
+ fee +=
129
+ convert_and_apply_premium_to_value(
130
+ price_feed_params.total_value,
131
+ estimated_fee.price_ratio,
132
+ estimated_fee.price_ratio_denominator,
133
+ dst_config.multiplier_bps,
134
+ params.default_multiplier_bps,
135
+ );
136
+
137
+ fee
138
+ }
139
+
140
+ fn version(self: @ContractState) -> (u64, u8) {
141
+ (1, 1)
142
+ }
143
+ }
144
+
145
+ #[generate_trait]
146
+ impl InternalImpl of InternalTrait {
147
+ /// Check if EID is v1 (endpoint v1)
148
+ ///
149
+ /// # Arguments
150
+ ///
151
+ /// * `eid` - The endpoint ID to check
152
+ ///
153
+ /// # Returns
154
+ ///
155
+ /// * `bool` - True if the EID is of an endpoint v1, false otherwise
156
+ fn _is_v1_eid(self: @ContractState, eid: u32) -> bool {
157
+ eid < MAX_V1_EID
158
+ }
159
+ }
160
+ }
@@ -0,0 +1,87 @@
1
+ //! Executor Fee Lib interface
2
+
3
+ use starknet::ContractAddress;
4
+ use crate::workers::executor::structs::DstConfig;
5
+
6
+ /// Fee parameters for executor fee calculation
7
+ #[derive(Drop, Clone, Serde)]
8
+ pub struct FeeParams {
9
+ /// The address of the price feed contract
10
+ pub price_feed: ContractAddress,
11
+ /// The destination endpoint ID
12
+ pub dst_eid: u32,
13
+ /// The address of the sender
14
+ pub sender: ContractAddress,
15
+ /// The size of the calldata
16
+ pub calldata_size: u32,
17
+ /// The default multiplier basis points
18
+ pub default_multiplier_bps: u16,
19
+ }
20
+
21
+ /// # Executor Fee Library Interface
22
+ ///
23
+ /// This interface defines the standard functions for a LayerZero Executor Fee Library.
24
+ ///
25
+ /// ## Key Responsibilities
26
+ /// 1. **Fee Calculation:** Calculating the cost of message execution on a destination chain.
27
+ /// The fee is determined by factors such as the destination endpoint ID (EID), the size of the
28
+ /// message payload, and the gas price on the destination chain, which is obtained from a price
29
+ /// feed.
30
+ /// 2. **Versioning:** Exposing its version number to allow for upgrades and compatibility checks.
31
+ ///
32
+ /// The fee calculation can be performed in two ways:
33
+ /// - `get_fee`: A view function that returns the fee without any state changes. This is useful for
34
+ /// quoting.
35
+ /// - `get_fee_on_send`: An external function that calculates the fee and may perform state changes,
36
+ /// for example, to record fee-related data.
37
+ #[starknet::interface]
38
+ pub trait IExecutorFeeLib<TContractState> {
39
+ // ================================== Only Owner =====================================
40
+
41
+ /// Withdraws tokens from the fee library.
42
+ /// Enables recovery of funds accidentally sent
43
+ ///
44
+ /// # Arguments
45
+ /// * `token_address` - The address of the token to withdraw
46
+ /// * `to` - The address to send the withdrawn tokens to
47
+ /// * `amount` - The amount of tokens to withdraw
48
+ fn withdraw_token(
49
+ ref self: TContractState, token_address: ContractAddress, to: ContractAddress, amount: u256,
50
+ );
51
+
52
+ // ================================== External =====================================
53
+
54
+ /// Gets the fee for sending a message, potentially changing state.
55
+ ///
56
+ /// # Arguments
57
+ /// * `params` - The fee parameters
58
+ /// * `dst_config` - The destination configuration
59
+ /// * `options` - The message options
60
+ ///
61
+ /// # Returns
62
+ /// * `u256` - The calculated fee
63
+ fn get_fee_on_send(
64
+ ref self: TContractState, params: FeeParams, dst_config: DstConfig, options: ByteArray,
65
+ ) -> u256;
66
+
67
+ // ================================== View =====================================
68
+
69
+ /// Gets the fee for a message without changing state.
70
+ ///
71
+ /// # Arguments
72
+ /// * `params` - The fee parameters
73
+ /// * `dst_config` - The destination configuration
74
+ /// * `options` - The message options
75
+ ///
76
+ /// # Returns
77
+ /// * `u256` - The calculated fee
78
+ fn get_fee(
79
+ self: @TContractState, params: FeeParams, dst_config: DstConfig, options: ByteArray,
80
+ ) -> u256;
81
+
82
+ /// Gets the version of the fee library.
83
+ ///
84
+ /// # Returns
85
+ /// * `(u64, u8)` - The major and minor version numbers
86
+ fn version(self: @TContractState) -> (u64, u8);
87
+ }