@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,264 @@
1
+ //! Price feed worker interface
2
+
3
+ use starknet::{ClassHash, ContractAddress};
4
+ use crate::workers::price_feed::structs::{
5
+ ArbitrumPriceExt, GetFeeResponse, ModelType, Price, SetEidToModelTypeParam, SetPriceParam,
6
+ UpdatePriceExt,
7
+ };
8
+
9
+ /// Interface for the price feed worker
10
+ #[starknet::interface]
11
+ pub trait IPriceFeed<TContractState> {
12
+ // ===================================== Only Owner =====================================
13
+
14
+ /// Set the price updater
15
+ ///
16
+ /// # Arguments
17
+ ///
18
+ /// * `address`: The address of the price updater
19
+ /// * `active`: Whether the price updater is active
20
+ ///
21
+ /// @dev This function is only callable by the owner
22
+ fn set_price_updater(ref self: TContractState, address: ContractAddress, active: bool);
23
+
24
+ /// Set EIDs to model types
25
+ ///
26
+ /// # Arguments
27
+ ///
28
+ /// * `params`: The parameters to set the EIDs to model types
29
+ ///
30
+ /// @dev This function is only callable by the owner
31
+ fn set_eid_to_model_type(ref self: TContractState, params: Array<SetEidToModelTypeParam>);
32
+
33
+ /// Upgrade the contract
34
+ ///
35
+ /// # Arguments
36
+ ///
37
+ /// * `new_class_hash`: The class hash of the new contract
38
+ ///
39
+ /// @dev This function is only callable by the owner
40
+ fn upgrade(ref self: TContractState, new_class_hash: ClassHash);
41
+
42
+ /// Upgrade the contract and call a function
43
+ ///
44
+ /// # Arguments
45
+ ///
46
+ /// * `new_class_hash` - The new class hash to upgrade to
47
+ /// * `selector` - The selector to call
48
+ /// * `data` - The data to pass to the function
49
+ ///
50
+ /// # Returns
51
+ ///
52
+ /// * `Span<felt252>` - The response data from the function call
53
+ ///
54
+ /// # Events
55
+ ///
56
+ /// * `Upgraded` - Emitted when the contract is upgraded (from OpenZeppelin's
57
+ /// [`UpgradeableComponent`])
58
+ ///
59
+ /// @dev This function is only callable by the owner
60
+ fn upgrade_and_call(
61
+ ref self: TContractState,
62
+ new_class_hash: ClassHash,
63
+ selector: felt252,
64
+ calldata: Span<felt252>,
65
+ ) -> Span<felt252>;
66
+
67
+ /// Set the price ratio denominator
68
+ ///
69
+ /// # Arguments
70
+ ///
71
+ /// * `denominator`: The price ratio denominator
72
+ ///
73
+ /// @dev This function is only callable by the owner
74
+ fn set_price_ratio_denominator(ref self: TContractState, denominator: u128);
75
+
76
+ /// Set the arbitrum compression percent
77
+ ///
78
+ /// # Arguments
79
+ ///
80
+ /// * `compression_percent`: The arbitrum compression percent
81
+ ///
82
+ /// @dev This function is only callable by the owner
83
+ fn set_arbitrum_compression_percent(ref self: TContractState, compression_percent: u32);
84
+
85
+ /// Set the endpoint address
86
+ ///
87
+ /// # Arguments
88
+ ///
89
+ /// * `endpoint`: The endpoint address
90
+ ///
91
+ /// @dev This function is only callable by the owner
92
+ fn set_endpoint(ref self: TContractState, endpoint: ContractAddress);
93
+
94
+ /// Withdraw collected fees
95
+ ///
96
+ /// # Arguments
97
+ ///
98
+ /// * `token_address`: The address of the token to withdraw
99
+ /// * `to`: The address to withdraw the fees to
100
+ /// * `amount`: The amount of fees to withdraw
101
+ ///
102
+ /// @dev This function is only callable by the owner
103
+ fn withdraw_fee(
104
+ ref self: TContractState, token_address: ContractAddress, to: ContractAddress, amount: u256,
105
+ );
106
+
107
+ // ========================= Only Price Updater or Owner ==================================
108
+
109
+ /// Set the price for a given EID
110
+ ///
111
+ /// # Arguments
112
+ ///
113
+ /// * `params`: The parameters to set the price
114
+ ///
115
+ /// @dev This function is only callable by the price updater or owner
116
+ fn set_price(ref self: TContractState, params: Array<SetPriceParam>);
117
+
118
+ /// Set the arbitrum price for a given EID
119
+ ///
120
+ /// # Arguments
121
+ ///
122
+ /// * `update`: The parameters to set the arbitrum price
123
+ ///
124
+ /// @dev This function is only callable by the price updater or owner
125
+ fn set_price_for_arbitrum(ref self: TContractState, update: UpdatePriceExt);
126
+
127
+ /// Set the native price in USD
128
+ ///
129
+ /// # Arguments
130
+ ///
131
+ /// * `price`: The native price in USD
132
+ ///
133
+ /// @dev This function is only callable by the price updater or owner
134
+ fn set_native_price_usd(ref self: TContractState, price: u128);
135
+
136
+ // ======================================= View ========================================
137
+
138
+ /// Get the arbitrum price ext for a given endpoint ID
139
+ ///
140
+ /// # Arguments
141
+ ///
142
+ /// * `eid`: The endpoint ID of the destination chain
143
+ ///
144
+ /// # Returns
145
+ ///
146
+ /// `ArbitrumPriceExt` - The arbitrum price ext for the given EID
147
+ fn get_price_arbitrum_ext(self: @TContractState, eid: u32) -> ArbitrumPriceExt;
148
+
149
+ /// Get the price updater for a given address
150
+ ///
151
+ /// # Arguments
152
+ ///
153
+ /// * `address`: The address of the price updater
154
+ ///
155
+ /// # Returns
156
+ ///
157
+ /// `bool` - Whether the price updater is active
158
+ fn get_price_updater(self: @TContractState, address: ContractAddress) -> bool;
159
+
160
+ /// Get the model type for a given endpoint ID
161
+ ///
162
+ /// # Arguments
163
+ ///
164
+ /// * `eid`: The endpoint ID of the destination chain
165
+ ///
166
+ /// # Returns
167
+ ///
168
+ /// `ModelType` - The model type
169
+ fn get_eid_to_model_type(self: @TContractState, eid: u32) -> ModelType;
170
+
171
+ /// Get the arbitrum compression percent
172
+ ///
173
+ /// # Returns
174
+ ///
175
+ /// `u32` - The arbitrum compression percent
176
+ fn get_arbitrum_compression_percent(self: @TContractState) -> u32;
177
+
178
+ /// Get the endpoint address
179
+ ///
180
+ /// # Returns
181
+ ///
182
+ /// `ContractAddress` - The endpoint address
183
+ fn get_endpoint(self: @TContractState) -> ContractAddress;
184
+ }
185
+
186
+ /// Interface for the LayerZero price feed
187
+ #[starknet::interface]
188
+ pub trait ILayerZeroPriceFeed<TContractState> {
189
+ // ============================ View =====================================
190
+
191
+ /// Get the native price in USD
192
+ ///
193
+ /// # Returns
194
+ ///
195
+ /// `u128` - The native price in USD
196
+ fn native_price_usd(self: @TContractState) -> u128;
197
+
198
+ /// Get the fee to be paid to the price feed
199
+ ///
200
+ /// # Arguments
201
+ ///
202
+ /// * `dst_eid`: The endpoint ID of the destination chain
203
+ /// * `calldata_size`: The size of the call data
204
+ /// * `gas`: The gas used
205
+ ///
206
+ /// # Returns
207
+ ///
208
+ /// `u256` - The fee to be paid to the price feed
209
+ fn get_fee(self: @TContractState, dst_eid: u32, calldata_size: u256, gas: u256) -> u256;
210
+
211
+ /// Get the price for a given EID
212
+ ///
213
+ /// # Arguments
214
+ ///
215
+ /// * `eid`: The endpoint ID of the destination chain
216
+ ///
217
+ /// # Returns
218
+ ///
219
+ /// `Price` - The price for the given EID
220
+ fn get_price(self: @TContractState, eid: u32) -> Price;
221
+
222
+ /// Get the price ratio denominator
223
+ ///
224
+ /// # Returns
225
+ ///
226
+ /// `u128` - The price ratio denominator
227
+ fn get_price_ratio_denominator(self: @TContractState) -> u128;
228
+
229
+ /// Estimate the fee for a given EID, call data size, and gas
230
+ ///
231
+ /// # Arguments
232
+ ///
233
+ /// * `dst_eid`: The endpoint ID of the destination chain
234
+ /// * `calldata_size`: The size of the call data
235
+ /// * `gas`: The gas used
236
+ ///
237
+ /// # Returns
238
+ ///
239
+ /// * `GetFeeResponse` - The fee estimate for the given EID, call data size, and gas
240
+ fn estimate_fee_by_eid(
241
+ self: @TContractState, dst_eid: u32, calldata_size: u32, gas: u256,
242
+ ) -> GetFeeResponse;
243
+
244
+ // ============================ External =====================================
245
+
246
+ /// Estimate the fee on send for a given EID, call data size, and gas
247
+ ///
248
+ /// # Arguments
249
+ ///
250
+ /// * `dst_eid`: The endpoint ID of the destination chain
251
+ /// * `calldata_size`: The size of the call data
252
+ /// * `gas`: The gas used
253
+ ///
254
+ /// # Returns
255
+ ///
256
+ /// * `GetFeeResponse` - The fee estimate for the given EID, call data size, and gas
257
+ ///
258
+ /// # Panics
259
+ ///
260
+ /// * If the fee is 0
261
+ fn estimate_fee_on_send(
262
+ ref self: TContractState, dst_eid: u32, calldata_size: u32, gas: u256,
263
+ ) -> GetFeeResponse;
264
+ }
@@ -0,0 +1,392 @@
1
+ //! Price feed component implementation
2
+
3
+ #[starknet::contract]
4
+ pub mod PriceFeed {
5
+ use openzeppelin::access::ownable::OwnableComponent;
6
+ use openzeppelin::token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait};
7
+ use openzeppelin::upgrades::upgradeable::UpgradeableComponent;
8
+ use starknet::storage::{
9
+ Map, StorageMapReadAccess, StorageMapWriteAccess, StoragePointerReadAccess,
10
+ StoragePointerWriteAccess,
11
+ };
12
+ use starknet::{ClassHash, ContractAddress, get_caller_address};
13
+ use starkware_utils::errors::assert_with_byte_array;
14
+ use crate::common::constants::MAX_V1_EID;
15
+ use crate::workers::price_feed::constants::{
16
+ ARBITRUM_COMPRESSION_PERCENT, PRICE_RATIO_DENOMINATOR,
17
+ };
18
+ use crate::workers::price_feed::errors::{
19
+ err_lz_price_feed_only_price_updater, err_lz_pricefeed_not_an_op_stack,
20
+ };
21
+ use crate::workers::price_feed::events::FeeWithdrawn;
22
+ use crate::workers::price_feed::interface::{ILayerZeroPriceFeed, IPriceFeed};
23
+ use crate::workers::price_feed::structs::{
24
+ ArbitrumPriceExt, FeeEstimate, GetFeeResponse, ModelType, Price, SetEidToModelTypeParam,
25
+ SetPriceParam, UpdatePriceExt,
26
+ };
27
+
28
+ // ================================ Constants =============================================
29
+
30
+ /// Ethereum Mainnet EID
31
+ pub const ETHEREUM_MAINNET_EID: u32 = 101;
32
+
33
+ /// Ethereum Goerli V1 EID
34
+ pub const ETHEREUM_GOERLI_V1_EID: u32 = 10121;
35
+
36
+ /// Ethereum Goerli V2 EID
37
+ pub const ETHEREUM_GOERLI_V2_EID: u32 = 20121;
38
+
39
+ /// Ethereum Sepolia EID
40
+ pub const ETHEREUM_SEPOLIA_EID: u32 = 10161;
41
+
42
+ /// Optimism L1 overhead
43
+ pub const OP_L1_OVERHEAD: u32 = 3188;
44
+
45
+ // ================================ Components =============================================
46
+
47
+ // Ownable component
48
+ component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
49
+
50
+ // Upgradeable component
51
+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);
52
+
53
+ // Ownable Mixin
54
+ #[abi(embed_v0)]
55
+ impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
56
+ impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;
57
+
58
+ /// Upgradeable component internal implementation
59
+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;
60
+
61
+ // =============================== Storage =================================
62
+
63
+ #[storage]
64
+ struct Storage {
65
+ #[substorage(v0)]
66
+ ownable: OwnableComponent::Storage,
67
+ #[substorage(v0)]
68
+ upgradeable: UpgradeableComponent::Storage,
69
+ // Native Price in USD
70
+ native_price_usd: u128,
71
+ // Price Updater => Active
72
+ price_updater: Map<ContractAddress, bool>,
73
+ // Eid => Price
74
+ default_model_price: Map<u32, Price>,
75
+ // Eid => ModelType
76
+ eid_to_model_type: Map<u32, ModelType>,
77
+ // Arbitrum Price Ext
78
+ arbitrum_price_ext: ArbitrumPriceExt,
79
+ // Price Ratio Denominator
80
+ price_ratio_denominator: u128,
81
+ // Arbitrum Compression Percent
82
+ arbitrum_compression_percent: u32,
83
+ // Endpoint address
84
+ endpoint: ContractAddress,
85
+ }
86
+
87
+ // =============================== Events =================================
88
+
89
+ #[event]
90
+ #[derive(Drop, starknet::Event)]
91
+ pub enum Event {
92
+ #[flat]
93
+ OwnableEvent: OwnableComponent::Event,
94
+ #[flat]
95
+ UpgradeableEvent: UpgradeableComponent::Event,
96
+ FeeWithdrawn: FeeWithdrawn,
97
+ }
98
+
99
+ #[constructor]
100
+ fn constructor(
101
+ ref self: ContractState, owner: ContractAddress, price_updater: ContractAddress,
102
+ ) {
103
+ // Initialize Ownable
104
+ self.ownable.initializer(owner);
105
+
106
+ // Initialize Price Updater
107
+ self.price_updater.write(price_updater, true);
108
+
109
+ // Set price ratio denominator
110
+ self.price_ratio_denominator.write(PRICE_RATIO_DENOMINATOR);
111
+
112
+ // Set arbitrum compression percent
113
+ self.arbitrum_compression_percent.write(ARBITRUM_COMPRESSION_PERCENT);
114
+ }
115
+
116
+ #[abi(embed_v0)]
117
+ impl PriceFeedImpl of IPriceFeed<ContractState> {
118
+ // ===================================== Only Owner =====================================
119
+
120
+ fn set_price_updater(ref self: ContractState, address: ContractAddress, active: bool) {
121
+ self.ownable.assert_only_owner();
122
+ self.price_updater.write(address, active);
123
+ }
124
+
125
+ fn set_eid_to_model_type(ref self: ContractState, params: Array<SetEidToModelTypeParam>) {
126
+ self.ownable.assert_only_owner();
127
+ for param in params {
128
+ self.eid_to_model_type.write(param.eid, param.model_type);
129
+ }
130
+ }
131
+
132
+ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {
133
+ self.ownable.assert_only_owner();
134
+ self.upgradeable.upgrade(new_class_hash);
135
+ }
136
+
137
+ fn upgrade_and_call(
138
+ ref self: ContractState,
139
+ new_class_hash: ClassHash,
140
+ selector: felt252,
141
+ calldata: Span<felt252>,
142
+ ) -> Span<felt252> {
143
+ self.ownable.assert_only_owner();
144
+ self.upgradeable.upgrade_and_call(new_class_hash, selector, calldata)
145
+ }
146
+
147
+ fn set_price_ratio_denominator(ref self: ContractState, denominator: u128) {
148
+ self.ownable.assert_only_owner();
149
+ self.price_ratio_denominator.write(denominator);
150
+ }
151
+
152
+ fn set_arbitrum_compression_percent(ref self: ContractState, compression_percent: u32) {
153
+ self.ownable.assert_only_owner();
154
+ self.arbitrum_compression_percent.write(compression_percent);
155
+ }
156
+
157
+ fn set_endpoint(ref self: ContractState, endpoint: ContractAddress) {
158
+ self.ownable.assert_only_owner();
159
+ self.endpoint.write(endpoint);
160
+ }
161
+
162
+ fn withdraw_fee(
163
+ ref self: ContractState,
164
+ token_address: ContractAddress,
165
+ to: ContractAddress,
166
+ amount: u256,
167
+ ) {
168
+ self.ownable.assert_only_owner();
169
+ IERC20Dispatcher { contract_address: token_address }.transfer(to, amount);
170
+ self.emit(FeeWithdrawn { token_address, to, amount });
171
+ }
172
+
173
+ // ========================= Only Price Updater or Owner ==================================
174
+
175
+ fn set_price(ref self: ContractState, params: Array<SetPriceParam>) {
176
+ self._only_price_updater_or_owner();
177
+ for param in params.into_iter() {
178
+ self.default_model_price.write(param.eid, param.price);
179
+ }
180
+ }
181
+
182
+ fn set_price_for_arbitrum(ref self: ContractState, update: UpdatePriceExt) {
183
+ self._only_price_updater_or_owner();
184
+ self.default_model_price.write(update.eid, update.price);
185
+ self.arbitrum_price_ext.write(update.extend);
186
+ }
187
+
188
+ fn set_native_price_usd(ref self: ContractState, price: u128) {
189
+ self._only_price_updater_or_owner();
190
+ self.native_price_usd.write(price);
191
+ }
192
+
193
+ // ===================================== View =================================
194
+
195
+ fn get_price_arbitrum_ext(self: @ContractState, eid: u32) -> ArbitrumPriceExt {
196
+ self.arbitrum_price_ext.read()
197
+ }
198
+
199
+ fn get_price_updater(self: @ContractState, address: ContractAddress) -> bool {
200
+ self.price_updater.read(address)
201
+ }
202
+
203
+ fn get_eid_to_model_type(self: @ContractState, eid: u32) -> ModelType {
204
+ self.eid_to_model_type.read(eid)
205
+ }
206
+
207
+ fn get_arbitrum_compression_percent(self: @ContractState) -> u32 {
208
+ self.arbitrum_compression_percent.read()
209
+ }
210
+
211
+ fn get_endpoint(self: @ContractState) -> ContractAddress {
212
+ self.endpoint.read()
213
+ }
214
+ }
215
+
216
+ #[abi(embed_v0)]
217
+ impl LayerZeroPriceFeedImpl of ILayerZeroPriceFeed<ContractState> {
218
+ fn native_price_usd(self: @ContractState) -> u128 {
219
+ self.native_price_usd.read()
220
+ }
221
+
222
+ fn get_fee(self: @ContractState, dst_eid: u32, calldata_size: u256, gas: u256) -> u256 {
223
+ 0
224
+ }
225
+
226
+ fn get_price(self: @ContractState, eid: u32) -> Price {
227
+ self.default_model_price.read(eid)
228
+ }
229
+
230
+ fn get_price_ratio_denominator(self: @ContractState) -> u128 {
231
+ self.price_ratio_denominator.read()
232
+ }
233
+
234
+ fn estimate_fee_by_eid(
235
+ self: @ContractState, dst_eid: u32, calldata_size: u32, gas: u256,
236
+ ) -> GetFeeResponse {
237
+ self._estimate_fee_by_eid(dst_eid, calldata_size, gas)
238
+ }
239
+
240
+ // ============================ External =====================================
241
+
242
+ fn estimate_fee_on_send(
243
+ ref self: ContractState, dst_eid: u32, calldata_size: u32, gas: u256,
244
+ ) -> GetFeeResponse {
245
+ self._estimate_fee_by_eid(dst_eid, calldata_size, gas)
246
+ }
247
+ }
248
+
249
+ // internal
250
+ #[generate_trait]
251
+ impl InternalImpl of InternalTrait {
252
+ fn _only_price_updater_or_owner(self: @ContractState) {
253
+ let caller = get_caller_address();
254
+ let is_owner_or_price_updater = caller == self.ownable.owner()
255
+ || self.price_updater.read(caller);
256
+
257
+ assert_with_byte_array(
258
+ is_owner_or_price_updater, err_lz_price_feed_only_price_updater(),
259
+ );
260
+ }
261
+
262
+ /// Estimates fee with default model
263
+ ///
264
+ /// @param _dst_eid The destination EID
265
+ /// @param calldata_size The size of the call data
266
+ /// @param gas The gas used
267
+ /// @return The gas fee and the price ratio
268
+ fn _estimate_fee_with_default_model(
269
+ self: @ContractState, _dst_eid: u32, calldata_size: u32, gas: u256,
270
+ ) -> FeeEstimate {
271
+ let remote_price = self.default_model_price.read(_dst_eid);
272
+
273
+ // Calculate fee on the destination chain and convert it to the source chain's token.
274
+ // 1. `gas_for_call_data`: Gas cost for the message payload on the destination chain.
275
+ // 2. `remote_fee`: Total fee in the destination chain's native token (e.g., wei).
276
+ // It's `(calldata_gas + execution_gas) * gas_price`.
277
+ // 3. `gas_fee`: The `remote_fee` converted to the source chain's native token.
278
+ let gas_for_call_data: u256 = calldata_size.into() * remote_price.gas_per_byte.into();
279
+ let remote_fee: u256 = (gas_for_call_data + gas)
280
+ * remote_price.gas_price_in_unit.into();
281
+ let gas_fee = (remote_fee * remote_price.price_ratio.into())
282
+ / self.price_ratio_denominator.read().into();
283
+
284
+ FeeEstimate { gas_fee, price_ratio: remote_price.price_ratio }
285
+ }
286
+
287
+ fn _estimate_fee_with_arbitrum_model(
288
+ self: @ContractState, _dst_eid: u32, calldata_size: u32, gas: u256,
289
+ ) -> FeeEstimate {
290
+ let arbitrum_price = self.default_model_price.read(_dst_eid);
291
+ let arbitrum_price_ext = self.arbitrum_price_ext.read();
292
+
293
+ // L1 fee
294
+ let gas_for_l1_call_data: u256 = ((calldata_size.into()
295
+ * self.arbitrum_compression_percent.read().into())
296
+ / 100)
297
+ * arbitrum_price_ext.gas_per_l1_call_data_byte.into();
298
+
299
+ // L2 Fee
300
+ let gas_for_l2_call_data: u256 = calldata_size.into()
301
+ * arbitrum_price.gas_per_byte.into();
302
+ let total_gas = gas
303
+ + arbitrum_price_ext.gas_per_l2_tx.into()
304
+ + gas_for_l1_call_data
305
+ + gas_for_l2_call_data;
306
+ let gas_fee = total_gas * arbitrum_price.gas_price_in_unit.into();
307
+ let gas_fee = (gas_fee * arbitrum_price.price_ratio.into())
308
+ / self.price_ratio_denominator.read().into();
309
+
310
+ FeeEstimate { gas_fee, price_ratio: arbitrum_price.price_ratio }
311
+ }
312
+
313
+ fn _estimate_fee_with_optimism_model(
314
+ self: @ContractState, _dst_eid: u32, calldata_size: u32, gas: u256,
315
+ ) -> FeeEstimate {
316
+ let ethereum_id = self._get_l1_lookup_id_for_optimism_model(_dst_eid);
317
+
318
+ // L1 fee
319
+ let ethereum_price = self.default_model_price.read(ethereum_id);
320
+ let gas_for_l1_call_data: u256 = (calldata_size.into()
321
+ * ethereum_price.gas_per_byte.into())
322
+ + OP_L1_OVERHEAD.into();
323
+ let l1_fee: u256 = gas_for_l1_call_data.into()
324
+ * ethereum_price.gas_price_in_unit.into();
325
+
326
+ // L2 fee
327
+ let optimism_price = self.default_model_price.read(_dst_eid);
328
+ let gas_for_l2_call_data: u256 = calldata_size.into()
329
+ * optimism_price.gas_per_byte.into();
330
+ let total_gas = gas_for_l2_call_data + gas;
331
+ let l2_fee = total_gas * optimism_price.gas_price_in_unit.into();
332
+
333
+ let l1_fee_in_src_price = (l1_fee * ethereum_price.price_ratio.into())
334
+ / self.price_ratio_denominator.read().into();
335
+ let l2_fee_in_src_price = (l2_fee * optimism_price.price_ratio.into())
336
+ / self.price_ratio_denominator.read().into();
337
+ let gas_fee = l1_fee_in_src_price + l2_fee_in_src_price;
338
+
339
+ FeeEstimate { gas_fee, price_ratio: optimism_price.price_ratio }
340
+ }
341
+
342
+ fn _get_l1_lookup_id_for_optimism_model(self: @ContractState, l2_eid: u32) -> u32 {
343
+ let l2_eid = l2_eid % MAX_V1_EID;
344
+ if l2_eid == 111 {
345
+ return ETHEREUM_MAINNET_EID;
346
+ } else if l2_eid == 10132 {
347
+ return ETHEREUM_GOERLI_V1_EID;
348
+ } else if l2_eid == 20132 {
349
+ return ETHEREUM_GOERLI_V2_EID;
350
+ }
351
+
352
+ assert_with_byte_array(
353
+ self.eid_to_model_type.read(l2_eid) == ModelType::OP_STACK,
354
+ err_lz_pricefeed_not_an_op_stack(),
355
+ );
356
+
357
+ if l2_eid < 10000 {
358
+ ETHEREUM_MAINNET_EID
359
+ } else if l2_eid < 20000 {
360
+ ETHEREUM_SEPOLIA_EID
361
+ } else {
362
+ ETHEREUM_GOERLI_V2_EID
363
+ }
364
+ }
365
+
366
+ fn _estimate_fee_by_eid(
367
+ self: @ContractState, dst_eid: u32, calldata_size: u32, gas: u256,
368
+ ) -> GetFeeResponse {
369
+ let dst_eid = dst_eid % MAX_V1_EID;
370
+
371
+ let model_type = self.eid_to_model_type.read(dst_eid);
372
+ let FeeEstimate {
373
+ gas_fee, price_ratio,
374
+ } =
375
+ match model_type {
376
+ ModelType::ARB_STACK => self
377
+ ._estimate_fee_with_arbitrum_model(dst_eid, calldata_size, gas),
378
+ ModelType::OP_STACK => self
379
+ ._estimate_fee_with_optimism_model(dst_eid, calldata_size, gas),
380
+ ModelType::DEFAULT => self
381
+ ._estimate_fee_with_default_model(dst_eid, calldata_size, gas),
382
+ };
383
+
384
+ GetFeeResponse {
385
+ gas_fee,
386
+ price_ratio,
387
+ price_ratio_denominator: self.price_ratio_denominator.read(),
388
+ native_price_usd: self.native_price_usd.read(),
389
+ }
390
+ }
391
+ }
392
+ }