@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,43 @@
1
+ //! Base worker events
2
+
3
+ use starknet::ContractAddress;
4
+
5
+ /// Event emitted when the price feed address is updated
6
+ #[derive(Drop, starknet::Event)]
7
+ pub struct PriceFeedSet {
8
+ #[key]
9
+ pub old_price_feed: ContractAddress,
10
+ #[key]
11
+ pub new_price_feed: ContractAddress,
12
+ }
13
+
14
+ /// Event emitted when fees are withdrawn
15
+ #[derive(Drop, starknet::Event)]
16
+ pub struct FeeWithdrawn {
17
+ #[key]
18
+ pub to: ContractAddress,
19
+ pub amount: u256,
20
+ }
21
+
22
+ /// Event emitted when the supported option type for an EID is set
23
+ #[derive(Drop, starknet::Event)]
24
+ pub struct SupportedOptionTypeSet {
25
+ #[key]
26
+ pub eid: u32,
27
+ pub option_type: ByteArray,
28
+ }
29
+
30
+ /// Event emitted when the default multiplier basis points is set
31
+ #[derive(Drop, starknet::Event)]
32
+ pub struct DefaultMultiplierBpsSet {
33
+ pub default_multiplier_bps: u16,
34
+ }
35
+
36
+ /// Event emitted when the worker fee lib address is updated
37
+ #[derive(Drop, starknet::Event)]
38
+ pub struct WorkerFeeLibSet {
39
+ #[key]
40
+ pub old_worker_fee_lib: ContractAddress,
41
+ #[key]
42
+ pub new_worker_fee_lib: ContractAddress,
43
+ }
@@ -0,0 +1,93 @@
1
+ //! Base worker interface
2
+
3
+ use starknet::ContractAddress;
4
+
5
+ /// Interface for the base worker component
6
+ #[starknet::interface]
7
+ pub trait IWorkerBase<TContractState> {
8
+ // ================================== Only Default Admin ===============================
9
+
10
+ /// Pause the contract (only default admin)
11
+ fn pause(ref self: TContractState);
12
+
13
+ /// Unpause the contract (only default admin)
14
+ fn unpause(ref self: TContractState);
15
+
16
+ // ===================================== Only Admin =====================================
17
+
18
+ /// Sets the price feed worker address
19
+ ///
20
+ /// # Arguments
21
+ ///
22
+ /// * `price_feed`: The address of the price feed worker
23
+ ///
24
+ /// @dev This function is only callable by the admin role.
25
+ fn set_price_feed(ref self: TContractState, price_feed: ContractAddress);
26
+
27
+ /// Sets the supported option type for an endpointID
28
+ ///
29
+ /// # Arguments
30
+ ///
31
+ /// * `eid`: The EID to set the supported option type for
32
+ /// * `option_type`: The option type to set for the EID
33
+ ///
34
+ /// @dev This function is only callable by the admin role.
35
+ fn set_supported_option_type(ref self: TContractState, eid: u32, option_type: ByteArray);
36
+
37
+ /// Sets the default multiplier basis points
38
+ ///
39
+ /// # Arguments
40
+ ///
41
+ /// * `default_multiplier_bps`: The default multiplier basis points to set
42
+ ///
43
+ /// @dev This function is only callable by the admin role.
44
+ fn set_default_multiplier_bps(ref self: TContractState, default_multiplier_bps: u16);
45
+
46
+ /// Withdraw collected fees (only admin)
47
+ fn withdraw_fee(
48
+ ref self: TContractState, token_address: ContractAddress, to: ContractAddress, amount: u256,
49
+ );
50
+
51
+ /// Sets the worker fee lib address
52
+ ///
53
+ /// # Arguments
54
+ ///
55
+ /// * `worker_fee_lib`: The address of the worker fee lib
56
+ ///
57
+ /// @dev This function is only callable by the admin role.
58
+ fn set_worker_fee_lib(ref self: TContractState, worker_fee_lib: ContractAddress);
59
+
60
+ // ======================================= View ========================================
61
+
62
+ /// Gets the current price feed address
63
+ ///
64
+ /// # Returns
65
+ ///
66
+ /// The current price feed worker's address
67
+ fn get_price_feed(self: @TContractState) -> ContractAddress;
68
+
69
+ /// Gets the supported option type for a given EID
70
+ ///
71
+ /// # Arguments
72
+ ///
73
+ /// * `eid`: The EID to get the supported option type for
74
+ ///
75
+ /// # Returns
76
+ ///
77
+ /// The supported option type for the EID
78
+ fn get_supported_option_type(self: @TContractState, eid: u32) -> ByteArray;
79
+
80
+ /// Gets the default multiplier basis points
81
+ ///
82
+ /// # Returns
83
+ ///
84
+ /// The default multiplier basis points
85
+ fn get_default_multiplier_bps(self: @TContractState) -> u16;
86
+
87
+ /// Gets the current worker fee lib address
88
+ ///
89
+ /// # Returns
90
+ ///
91
+ /// The current worker fee lib address
92
+ fn get_worker_fee_lib(self: @TContractState) -> ContractAddress;
93
+ }
@@ -0,0 +1,10 @@
1
+ use starknet::ContractAddress;
2
+
3
+ #[derive(Drop, Serde, Clone)]
4
+ pub struct QuoteParams {
5
+ pub dst_eid: u32,
6
+ pub sender: ContractAddress,
7
+ pub confirmations: u64,
8
+ pub calldata_size: u32,
9
+ pub options: ByteArray,
10
+ }
@@ -0,0 +1,59 @@
1
+ use crate::common::constants::{DEFAULT_BPS, NATIVE_DECIMALS_RATE};
2
+
3
+ /// Apply premium and floor margin to the fee
4
+ ///
5
+ /// Returns the maximum between the fee with a multiplier and fee with the floor margin.
6
+ ///
7
+ /// # Arguments
8
+ ///
9
+ /// * `fee` - fee to apply premium to
10
+ /// * `bps` - base points to apply premium to, where 10000 = 100%
11
+ /// * `default_bps` - default bps to apply premium to
12
+ /// * `margin_usd` - margin in usd
13
+ /// * `native_price_usd` - native price in usd
14
+ ///
15
+ /// # Returns
16
+ ///
17
+ /// * `fee_with_premium` - fee with premium applied
18
+ pub fn apply_premium_and_floor_margin(
19
+ fee: u256, bps: u16, default_bps: u16, margin_usd: u128, native_price_usd: u128,
20
+ ) -> u256 {
21
+ let multiplier_bps = if bps == 0 {
22
+ default_bps
23
+ } else {
24
+ bps
25
+ };
26
+
27
+ // fee with multiplier, divides by DEFAULT_BPS to get the percentage
28
+ let fee_with_multiplier = (fee * multiplier_bps.into()) / DEFAULT_BPS;
29
+ if native_price_usd == 0 || margin_usd == 0 {
30
+ return fee_with_multiplier;
31
+ }
32
+
33
+ // fee with floor margin, divides by native_price_usd to get the amount of native tokens
34
+ let fee_with_floor_margin = fee
35
+ + (margin_usd.into() * NATIVE_DECIMALS_RATE) / native_price_usd.into();
36
+
37
+ // return the max
38
+ if fee_with_floor_margin > fee_with_multiplier {
39
+ fee_with_floor_margin
40
+ } else {
41
+ fee_with_multiplier
42
+ }
43
+ }
44
+
45
+ pub fn convert_and_apply_premium_to_value(
46
+ value: u256, ratio: u128, denom: u128, bps: u16, default_bps: u16,
47
+ ) -> u256 {
48
+ let multiplier_bps = if bps == 0 {
49
+ default_bps
50
+ } else {
51
+ bps
52
+ };
53
+
54
+ if value > 0 {
55
+ (((value * ratio.into()) / denom.into()) * multiplier_bps.into()) / DEFAULT_BPS
56
+ } else {
57
+ 0
58
+ }
59
+ }
@@ -0,0 +1,11 @@
1
+ //! DVN constants
2
+
3
+ /// The raw bytes of the signature are 65 bytes long, the first 64 bytes are the signature, and the
4
+ /// last byte is the recovery ID.
5
+ pub const SIGNATURE_RAW_BYTES: usize = 65;
6
+
7
+ /// encoded: funcSigHash + params -> 4 + (32 * 2)
8
+ pub const EXECUTE_FIXED_BYTES: u32 = 68;
9
+
10
+ /// callData(verify) = 228 (4 + 64 + 81 + 15 + 32 + 32), padded to 32 = 256 + 64 = 320
11
+ pub const VERIFY_BYTES: u32 = 320;
@@ -0,0 +1,338 @@
1
+ //! DVN contract implementation
2
+
3
+ /// DVN contract
4
+ ///
5
+ /// The DVN contract is a key component of LayerZero's security and validation model, acting as an
6
+ /// on-chain representation of an off-chain verification network. Its primary responsibility is to
7
+ /// attest to the validity of cross-chain messages. When a message is sent from another chain to
8
+ /// Starknet, a DVN is tasked with verifying that message. This contract manages the on-chain part
9
+ /// of that process: quoting the price for verification, and providing the mechanism for a trusted
10
+ /// party (the DVN's agent) to submit the verified message for execution.
11
+ #[starknet::contract]
12
+ pub mod Dvn {
13
+ use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
14
+ use core::num::traits::Zero;
15
+ use lz_utils::bytes::Bytes32;
16
+ use lz_utils::keccak::keccak256;
17
+ use multisig::MultisigComponent;
18
+ use openzeppelin::access::accesscontrol::AccessControlComponent;
19
+ use openzeppelin::introspection::src5::SRC5Component;
20
+ use openzeppelin::security::pausable::PausableComponent;
21
+ use openzeppelin::security::reentrancyguard::ReentrancyGuardComponent;
22
+ use openzeppelin::upgrades::upgradeable::UpgradeableComponent;
23
+ use openzeppelin::upgrades::upgradeable::UpgradeableComponent::InternalTrait as UpgradeableInternalTrait;
24
+ use starknet::account::Call;
25
+ use starknet::storage::{
26
+ Map, StorageMapReadAccess, StorageMapWriteAccess, StoragePointerReadAccess,
27
+ StoragePointerWriteAccess,
28
+ };
29
+ use starknet::syscalls::call_contract_syscall;
30
+ use starknet::{
31
+ ClassHash, ContractAddress, EthAddress, get_block_timestamp, get_contract_address,
32
+ };
33
+ use starkware_utils::errors::assert_with_byte_array;
34
+ use crate::workers::access_control::ADMIN_ROLE;
35
+ use crate::workers::base::base::WorkerBaseComponent;
36
+ use crate::workers::base::structs::QuoteParams;
37
+ use crate::workers::dvn::events::DstConfigSet;
38
+ use crate::workers::dvn::fee_lib::interface::{
39
+ FeeParams, IDvnFeeLibDispatcher, IDvnFeeLibDispatcherTrait,
40
+ };
41
+ use crate::workers::dvn::interface::IDvn;
42
+ use crate::workers::dvn::structs::{DstConfig, ExecuteParam, SetDstConfigParams};
43
+ use crate::workers::dvn::{errors, events};
44
+ use crate::workers::interface::ILayerZeroWorker;
45
+
46
+ ////////////////
47
+ // Components //
48
+ ////////////////
49
+
50
+ // Base worker component
51
+ component!(path: WorkerBaseComponent, storage: worker_base, event: WorkerBaseEvent);
52
+
53
+ // Access control components
54
+ component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);
55
+ component!(path: SRC5Component, storage: src5, event: SRC5Event);
56
+
57
+ // Upgradeable component
58
+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);
59
+
60
+ // Multisig component
61
+ component!(path: MultisigComponent, storage: multisig, event: MultisigEvent);
62
+
63
+ // Pausable component
64
+ component!(path: PausableComponent, storage: pausable, event: PausableEvent);
65
+
66
+ ////////////////
67
+ // Embeddings //
68
+ ////////////////
69
+
70
+ #[abi(embed_v0)]
71
+ impl WorkerBaseImpl = WorkerBaseComponent::WorkerBaseImpl<ContractState>;
72
+ impl WorkerBaseInternalImpl = WorkerBaseComponent::InternalImpl<ContractState>;
73
+
74
+ #[abi(embed_v0)]
75
+ impl MultisigImpl = MultisigComponent::Multisig<ContractState>;
76
+ impl MultisigInternalImpl = MultisigComponent::MultisigInternalImpl<ContractState>;
77
+
78
+ // Multisig immutable configuration
79
+ impl MultisigImmutableConfig of MultisigComponent::ImmutableConfig {
80
+ // TODO: this value should be set testing the gas limit on testnet
81
+ // with a value where you can re-set the threshold without hitting the gas limit
82
+ const MAX_THRESHOLD: u32 = 11;
83
+ }
84
+
85
+ #[abi(embed_v0)]
86
+ impl AccessControlImpl = WorkerBaseComponent::AccessControlImpl<ContractState>;
87
+ impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;
88
+
89
+ #[abi(embed_v0)]
90
+ impl PausableImpl = PausableComponent::PausableImpl<ContractState>;
91
+
92
+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;
93
+
94
+ #[storage]
95
+ struct Storage {
96
+ #[substorage(v0)]
97
+ worker_base: WorkerBaseComponent::Storage,
98
+ #[substorage(v0)]
99
+ access_control: AccessControlComponent::Storage,
100
+ #[substorage(v0)]
101
+ src5: SRC5Component::Storage,
102
+ #[substorage(v0)]
103
+ upgradeable: UpgradeableComponent::Storage,
104
+ #[substorage(v0)]
105
+ multisig: MultisigComponent::Storage,
106
+ #[substorage(v0)]
107
+ pausable: PausableComponent::Storage,
108
+ /// Eid => DstConfig
109
+ dst_configs: Map<u32, DstConfig>,
110
+ /// Verifier ID
111
+ vid: u32,
112
+ /// Record used hashes to prevent reentry and replay attack
113
+ used_hashes: Map<Bytes32, bool>,
114
+ }
115
+
116
+ #[event]
117
+ #[derive(Drop, starknet::Event)]
118
+ pub enum Event {
119
+ #[flat]
120
+ WorkerBaseEvent: WorkerBaseComponent::Event,
121
+ #[flat]
122
+ ReentrancyGuardEvent: ReentrancyGuardComponent::Event,
123
+ #[flat]
124
+ AccessControlEvent: AccessControlComponent::Event,
125
+ #[flat]
126
+ SRC5Event: SRC5Component::Event,
127
+ #[flat]
128
+ UpgradeableEvent: UpgradeableComponent::Event,
129
+ #[flat]
130
+ MultisigEvent: MultisigComponent::Event,
131
+ #[flat]
132
+ PausableEvent: PausableComponent::Event,
133
+ // DVN-specific events
134
+ DstConfigSet: DstConfigSet,
135
+ VerifySignaturesFailed: events::VerifySignaturesFailed,
136
+ HashAlreadyUsed: events::HashAlreadyUsed,
137
+ ExecuteFailed: events::ExecuteFailed,
138
+ }
139
+
140
+ #[constructor]
141
+ fn constructor(
142
+ ref self: ContractState,
143
+ vid: u32,
144
+ message_libs: Array<ContractAddress>,
145
+ price_feed: ContractAddress,
146
+ default_multiplier_bps: u16,
147
+ multisig_signers: Span<EthAddress>,
148
+ multisig_threshold: u32,
149
+ role_admin: ContractAddress,
150
+ admins: Array<ContractAddress>,
151
+ ) {
152
+ // Initialize access control component
153
+ self.access_control.initializer();
154
+
155
+ // Initialize base worker & multisig components
156
+ self
157
+ .worker_base
158
+ .initializer(message_libs, price_feed, default_multiplier_bps, role_admin, admins);
159
+ self.multisig._init(multisig_signers, multisig_threshold);
160
+
161
+ // Set ID
162
+ self.vid.write(vid);
163
+ }
164
+
165
+ #[abi(embed_v0)]
166
+ impl DvnImpl of IDvn<ContractState> {
167
+ // ================================== Only Admin =====================================
168
+
169
+ fn set_dst_config(ref self: ContractState, params: Array<SetDstConfigParams>) {
170
+ self.worker_base._assert_only_admin();
171
+
172
+ let dst_config_set = params.span();
173
+ for param in params.into_iter() {
174
+ self.dst_configs.write(param.dst_eid, param.config);
175
+ }
176
+
177
+ self.emit(DstConfigSet { dst_config_set });
178
+ }
179
+
180
+ fn execute(ref self: ContractState, params: Array<ExecuteParam>) {
181
+ self.worker_base._assert_only_admin();
182
+
183
+ for (index, param) in params.into_iter().enumerate() {
184
+ let ExecuteParam { vid, call_data, expiration, signatures } = param.clone();
185
+
186
+ // Skip if invalid or expired
187
+ if vid != self.vid.read() || expiration <= get_block_timestamp().into() {
188
+ continue;
189
+ }
190
+
191
+ // Verify signatures
192
+ let hash = self.hash_call_data(vid, call_data, expiration);
193
+ if let Err(error) = self
194
+ .multisig
195
+ ._verify_n_signatures(hash.into(), signatures, self.multisig.get_threshold()) {
196
+ self.emit(events::VerifySignaturesFailed { error });
197
+ continue;
198
+ }
199
+
200
+ // Skip if hash already used, register hash if not
201
+ if self.used_hashes.read(hash) {
202
+ self.emit(events::HashAlreadyUsed { execute_param: param, hash });
203
+ continue;
204
+ }
205
+ self.used_hashes.write(hash, true);
206
+
207
+ // Record used hash and execute syscall
208
+ let result = call_contract_syscall(
209
+ call_data.to, call_data.selector, call_data.calldata,
210
+ );
211
+
212
+ if let Err(data) = result {
213
+ // Un-use hash if syscall fails
214
+ self.used_hashes.write(hash, false);
215
+ self.emit(events::ExecuteFailed { index, data });
216
+ }
217
+ }
218
+ }
219
+
220
+ // ================================== Only Quorum =====================================
221
+
222
+ fn quorum_change_admin(ref self: ContractState, param: ExecuteParam) {
223
+ let ExecuteParam { vid, call_data, expiration, signatures } = param;
224
+
225
+ // Panic if expired
226
+ assert_with_byte_array(
227
+ expiration > get_block_timestamp().into(), errors::err_instruction_expired(),
228
+ );
229
+
230
+ // Panic if target is not the DVN
231
+ assert_with_byte_array(
232
+ call_data.to == get_contract_address(), errors::err_invalid_target(call_data.to),
233
+ );
234
+
235
+ // Panic if invalid VID
236
+ assert_with_byte_array(vid == self.vid.read(), errors::err_invalid_vid(vid));
237
+
238
+ // Verify signatures
239
+ let hash = self.hash_call_data(vid, call_data, expiration);
240
+ self.multisig.verify_signatures(hash.into(), signatures);
241
+
242
+ // Panic if hash already used
243
+ assert_with_byte_array(!self.used_hashes.read(hash), errors::err_duplicated_hash(hash));
244
+
245
+ // Record used hash
246
+ self.used_hashes.write(hash, true);
247
+
248
+ // Deserialize the new admin address from calldata & grant admin role or panic
249
+ let mut calldata = call_data.calldata;
250
+ let new_admin = Serde::deserialize(ref calldata);
251
+ assert_with_byte_array(new_admin.is_some(), errors::err_invalid_quorum_admin());
252
+ self.access_control._grant_role(ADMIN_ROLE, new_admin.unwrap());
253
+ }
254
+
255
+ // ================================== Only Self =====================================
256
+
257
+ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {
258
+ self.multisig._only_multisig();
259
+ self.upgradeable.upgrade(new_class_hash);
260
+ }
261
+
262
+ fn upgrade_and_call(
263
+ ref self: ContractState,
264
+ new_class_hash: ClassHash,
265
+ selector: felt252,
266
+ calldata: Span<felt252>,
267
+ ) -> Span<felt252> {
268
+ self.multisig._only_multisig();
269
+ self.upgradeable.upgrade_and_call(new_class_hash, selector, calldata)
270
+ }
271
+
272
+ // ================================== View ==========================================
273
+
274
+ fn get_dst_config(self: @ContractState, dst_eid: u32) -> DstConfig {
275
+ self.dst_configs.read(dst_eid)
276
+ }
277
+
278
+ fn hash_call_data(
279
+ self: @ContractState, vid: u32, call_data: Call, expiration: u256,
280
+ ) -> Bytes32 {
281
+ // encode and keccak: vid, to, selector, expiration, call_data
282
+ let mut payload: ByteArray = Default::default();
283
+
284
+ payload.append_u32(vid);
285
+ payload.append_address(call_data.to);
286
+ payload.append_u256(expiration);
287
+ payload.append_felt252(call_data.selector);
288
+
289
+ for i in call_data.calldata {
290
+ payload.append_felt252(*i);
291
+ }
292
+
293
+ keccak256(@payload)
294
+ }
295
+ }
296
+
297
+ #[abi(embed_v0)]
298
+ impl LayerZeroWorkerImpl of ILayerZeroWorker<ContractState> {
299
+ // ================================== Only Message Lib =====================================
300
+
301
+ fn assign_job(ref self: ContractState, params: QuoteParams) -> u256 {
302
+ self.worker_base._assert_not_paused();
303
+ self.worker_base._assert_only_message_lib();
304
+ self.quote(params)
305
+ }
306
+
307
+ // ================================== View =====================================
308
+
309
+ fn quote(self: @ContractState, params: QuoteParams) -> u256 {
310
+ self.worker_base._assert_not_paused();
311
+
312
+ // Assert price feed is set
313
+ let price_feed = self.worker_base.get_price_feed();
314
+ assert_with_byte_array(price_feed.is_non_zero(), errors::err_price_feed_not_set());
315
+
316
+ // Assert worker fee lib is set
317
+ let worker_fee_lib_addr = self.worker_base.get_worker_fee_lib();
318
+ assert_with_byte_array(
319
+ worker_fee_lib_addr.is_non_zero(), errors::err_worker_fee_lib_not_set(),
320
+ );
321
+
322
+ let QuoteParams { dst_eid, confirmations, sender, options, .. } = params;
323
+
324
+ let fee_params = FeeParams {
325
+ price_feed,
326
+ dst_eid,
327
+ confirmations,
328
+ sender,
329
+ quorum: self.multisig.get_threshold(),
330
+ default_multiplier_bps: self.worker_base.get_default_multiplier_bps(),
331
+ };
332
+
333
+ // Call fee lib to get the quote
334
+ let fee_lib = IDvnFeeLibDispatcher { contract_address: worker_fee_lib_addr };
335
+ fee_lib.get_fee(fee_params, self.get_dst_config(dst_eid), options)
336
+ }
337
+ }
338
+ }
@@ -0,0 +1,80 @@
1
+ //! DVN errors
2
+
3
+ use lz_utils::bytes::Bytes32;
4
+ use lz_utils::error::{Error, format_error};
5
+ use starknet::ContractAddress;
6
+
7
+ #[derive(Drop, Clone, Debug, PartialEq)]
8
+ pub enum DvnError {
9
+ InvalidDvnIdx,
10
+ InvalidDVNOptions,
11
+ EidNotSupported,
12
+ PriceFeedNotSet,
13
+ WorkerFeeLibNotSet,
14
+ InstructionExpired,
15
+ InvalidVid,
16
+ InvalidTarget,
17
+ InvalidQuorumAdmin,
18
+ DuplicatedHash,
19
+ }
20
+
21
+ impl DvnErrorImpl of Error<DvnError> {
22
+ fn prefix() -> ByteArray {
23
+ "LZ_DVN"
24
+ }
25
+
26
+ fn name(self: DvnError) -> ByteArray {
27
+ match self {
28
+ DvnError::InvalidDvnIdx => "INVALID_DVN_IDX",
29
+ DvnError::InvalidDVNOptions => "INVALID_DVN_OPTIONS",
30
+ DvnError::EidNotSupported => "EID_NOT_SUPPORTED",
31
+ DvnError::PriceFeedNotSet => "PRICE_FEED_NOT_SET",
32
+ DvnError::WorkerFeeLibNotSet => "WORKER_FEELIB_NOT_SET",
33
+ DvnError::InstructionExpired => "INSTRUCTION_EXPIRED",
34
+ DvnError::InvalidVid => "INVALID_VID",
35
+ DvnError::InvalidTarget => "INVALID_TARGET",
36
+ DvnError::InvalidQuorumAdmin => "INVALID_QUORUM_ADMIN",
37
+ DvnError::DuplicatedHash => "DUPLICATED_HASH",
38
+ }
39
+ }
40
+ }
41
+
42
+ pub fn err_invalid_dvn_idx() -> ByteArray {
43
+ format_error(DvnError::InvalidDvnIdx, "")
44
+ }
45
+
46
+ pub fn err_invalid_dvn_options(cursor: usize) -> ByteArray {
47
+ format_error(DvnError::InvalidDVNOptions, format!("cursor: {}", cursor))
48
+ }
49
+
50
+ pub fn err_eid_not_supported(eid: u32) -> ByteArray {
51
+ format_error(DvnError::EidNotSupported, format!("eid: {}", eid))
52
+ }
53
+
54
+ pub fn err_price_feed_not_set() -> ByteArray {
55
+ format_error(DvnError::PriceFeedNotSet, "")
56
+ }
57
+
58
+ pub fn err_worker_fee_lib_not_set() -> ByteArray {
59
+ format_error(DvnError::WorkerFeeLibNotSet, "")
60
+ }
61
+
62
+ pub fn err_instruction_expired() -> ByteArray {
63
+ format_error(DvnError::InstructionExpired, "")
64
+ }
65
+
66
+ pub fn err_invalid_vid(vid: u32) -> ByteArray {
67
+ format_error(DvnError::InvalidVid, format!("vid: {}", vid))
68
+ }
69
+
70
+ pub fn err_invalid_target(target: ContractAddress) -> ByteArray {
71
+ format_error(DvnError::InvalidTarget, format!("target: {:?}", target))
72
+ }
73
+
74
+ pub fn err_invalid_quorum_admin() -> ByteArray {
75
+ format_error(DvnError::InvalidQuorumAdmin, "")
76
+ }
77
+
78
+ pub fn err_duplicated_hash(hash: Bytes32) -> ByteArray {
79
+ format_error(DvnError::DuplicatedHash, format!("hash: {:?}", hash))
80
+ }
@@ -0,0 +1,30 @@
1
+ //! DVN events
2
+
3
+ use lz_utils::bytes::Bytes32;
4
+ use crate::workers::dvn::structs::{ExecuteParam, SetDstConfigParams};
5
+
6
+ /// Event emitted when the destination config is set
7
+ #[derive(Drop, starknet::Event)]
8
+ pub struct DstConfigSet {
9
+ pub dst_config_set: Span<SetDstConfigParams>,
10
+ }
11
+
12
+ /// Event emitted when the signatures are not valid
13
+ #[derive(Drop, starknet::Event)]
14
+ pub struct VerifySignaturesFailed {
15
+ pub error: ByteArray,
16
+ }
17
+
18
+ /// Event emitted when the hash is already used
19
+ #[derive(Drop, starknet::Event)]
20
+ pub struct HashAlreadyUsed {
21
+ pub execute_param: ExecuteParam,
22
+ pub hash: Bytes32,
23
+ }
24
+
25
+ /// Event emitted when the execute call fails
26
+ #[derive(Drop, starknet::Event)]
27
+ pub struct ExecuteFailed {
28
+ pub index: u32,
29
+ pub data: Array<felt252>,
30
+ }