@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,2051 @@
1
+ //! Message lib manager tests
2
+
3
+ use MockMessageLibManager::{IMockManagerHelpersDispatcher, IMockManagerHelpersDispatcherTrait};
4
+ use layerzero::endpoint::message_lib_manager::errors::{
5
+ err_already_registered, err_default_receive_lib_unavailable, err_default_send_lib_unavailable,
6
+ err_invalid_expiry, err_only_non_default_lib, err_only_receive_lib, err_only_registered_lib,
7
+ err_only_registered_or_default_lib, err_only_send_lib, err_same_value, err_unsupported_eid,
8
+ };
9
+ use layerzero::endpoint::message_lib_manager::events::{
10
+ DefaultReceiveLibrarySet, DefaultReceiveLibraryTimeoutSet, DefaultSendLibrarySet,
11
+ LibraryRegistered, ReceiveLibrarySet, ReceiveLibraryTimeoutSet, SendLibrarySet,
12
+ };
13
+ use layerzero::endpoint::message_lib_manager::interface::{
14
+ IMessageLibManagerDispatcherTrait, IMessageLibManagerSafeDispatcherTrait,
15
+ };
16
+ use layerzero::endpoint::message_lib_manager::message_lib_manager::MessageLibManagerComponent;
17
+ use layerzero::endpoint::message_lib_manager::structs::Timeout;
18
+ use layerzero::message_lib::structs::{MessageLibType, SetConfigParam};
19
+ use layerzero::message_lib::uln::structs::executor_config::ExecutorConfig;
20
+ use layerzero::message_lib::uln::structs::uln_config::UlnConfig;
21
+ use layerzero::message_lib::uln::ultra_light_node::UltraLightNode::{
22
+ CONFIG_TYPE_EXECUTOR, CONFIG_TYPE_ULN,
23
+ };
24
+ use openzeppelin::access::ownable::OwnableComponent::Errors::NOT_OWNER as OZ_NOT_OWNER;
25
+ // import fuzzable types
26
+ use snforge_std::fuzzable::{FuzzableU32, FuzzableU64};
27
+ use snforge_std::{
28
+ EventSpyAssertionsTrait, spy_events, start_cheat_block_number, start_cheat_caller_address,
29
+ start_mock_call, stop_cheat_block_number, stop_cheat_caller_address,
30
+ };
31
+ use starknet::ContractAddress;
32
+ use starkware_utils_testing::test_utils::{assert_panic_with_error, assert_panic_with_felt_error};
33
+ use crate::fuzzable::contract_address::FuzzableContractAddress;
34
+ use crate::mocks::message_lib_manager::MockMessageLibManager;
35
+ use crate::mocks::message_lib_manager::MockMessageLibManager::err_not_authorized;
36
+ use super::utils::{MessageLibManagerMock, deploy_erc20_mock, deploy_message_lib_manager};
37
+
38
+ // =============================== Helper Functions =================================
39
+
40
+ /// Helper function to create a ULN config parameter
41
+ fn create_uln_config_param(eid: u32, oapp: ContractAddress, config: UlnConfig) -> SetConfigParam {
42
+ let mut serialized_config = array![];
43
+ Serde::serialize(@config, ref serialized_config);
44
+ SetConfigParam { eid, oapp, config_type: CONFIG_TYPE_ULN, config: serialized_config }
45
+ }
46
+
47
+ /// Helper function to create an executor config parameter
48
+ fn create_executor_config_param(
49
+ eid: u32, oapp: ContractAddress, config: ExecutorConfig,
50
+ ) -> SetConfigParam {
51
+ let mut serialized_config = array![];
52
+ Serde::serialize(@config, ref serialized_config);
53
+ SetConfigParam { eid, oapp, config_type: CONFIG_TYPE_EXECUTOR, config: serialized_config }
54
+ }
55
+
56
+ /// Helper function to create a simple ULN config for testing
57
+ fn create_test_uln_config() -> UlnConfig {
58
+ UlnConfig {
59
+ confirmations: 10,
60
+ has_confirmations: true,
61
+ required_dvns: array![],
62
+ has_required_dvns: false,
63
+ optional_dvns: array![],
64
+ optional_dvn_threshold: 0,
65
+ has_optional_dvns: false,
66
+ }
67
+ }
68
+
69
+ /// Helper function to create a simple executor config for testing
70
+ fn create_test_executor_config(executor: ContractAddress) -> ExecutorConfig {
71
+ ExecutorConfig { max_message_size: 1000, executor }
72
+ }
73
+
74
+ // =============================== Test Register Library =================================
75
+
76
+ #[test]
77
+ #[fuzzer(runs: 1)]
78
+ fn should_register_library(owner: ContractAddress, new_library: ContractAddress) {
79
+ let MessageLibManagerMock {
80
+ message_lib_manager, dispatcher, ..,
81
+ } = deploy_message_lib_manager(owner);
82
+
83
+ // Check that the library is not registered
84
+ assert(!dispatcher.is_registered_library(new_library), 'should not be registered');
85
+
86
+ let mut spy = spy_events();
87
+ // Caller is the owner
88
+ start_cheat_caller_address(message_lib_manager, owner);
89
+ // Mock message_lib_type to satisfy registration-time type check
90
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::SendAndReceive);
91
+ dispatcher.register_library(new_library);
92
+ stop_cheat_caller_address(message_lib_manager);
93
+
94
+ // Check that the library is registered
95
+ assert(dispatcher.is_registered_library(new_library), 'should be registered');
96
+
97
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
98
+ MessageLibManagerComponent::Event::LibraryRegistered(
99
+ LibraryRegistered { library: new_library },
100
+ ),
101
+ );
102
+
103
+ // Check that the event is emitted
104
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
105
+ }
106
+
107
+ #[test]
108
+ #[fuzzer(runs: 1)]
109
+ #[feature("safe_dispatcher")]
110
+ fn should_fail_to_register_library_when_not_owner(
111
+ owner: ContractAddress, not_owner: ContractAddress, new_library: ContractAddress,
112
+ ) {
113
+ if not_owner == owner {
114
+ return;
115
+ }
116
+
117
+ let MessageLibManagerMock {
118
+ message_lib_manager, safe_dispatcher, ..,
119
+ } = deploy_message_lib_manager(owner);
120
+
121
+ // Check that the library is not registered
122
+ assert(
123
+ !safe_dispatcher.is_registered_library(new_library).unwrap(), 'should not be registered',
124
+ );
125
+
126
+ // Caller is not the owner
127
+ start_cheat_caller_address(message_lib_manager, not_owner);
128
+ let res = safe_dispatcher.register_library(new_library);
129
+ stop_cheat_caller_address(message_lib_manager);
130
+
131
+ // Check that the library is not registered
132
+ assert_panic_with_felt_error(res, OZ_NOT_OWNER);
133
+ }
134
+
135
+ #[test]
136
+ #[fuzzer(runs: 1)]
137
+ #[feature("safe_dispatcher")]
138
+ fn should_fail_to_register_library_when_already_registered(
139
+ owner: ContractAddress, new_library: ContractAddress,
140
+ ) {
141
+ let MessageLibManagerMock {
142
+ message_lib_manager, safe_dispatcher, ..,
143
+ } = deploy_message_lib_manager(owner);
144
+
145
+ // Register the library
146
+ start_cheat_caller_address(message_lib_manager, owner);
147
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::SendAndReceive);
148
+ safe_dispatcher.register_library(new_library).unwrap();
149
+ stop_cheat_caller_address(message_lib_manager);
150
+
151
+ // Check that the library is registered
152
+ assert(safe_dispatcher.is_registered_library(new_library).unwrap(), 'should be registered');
153
+
154
+ // Caller is the owner
155
+ start_cheat_caller_address(message_lib_manager, owner);
156
+ let res = safe_dispatcher.register_library(new_library);
157
+ stop_cheat_caller_address(message_lib_manager);
158
+ assert_panic_with_error(res, err_already_registered());
159
+ }
160
+
161
+ #[test]
162
+ #[should_panic]
163
+ #[fuzzer(runs: 1)]
164
+ fn should_fail_to_register_library_when_not_message_lib(owner: ContractAddress) {
165
+ let MessageLibManagerMock {
166
+ message_lib_manager, dispatcher, ..,
167
+ } = deploy_message_lib_manager(owner);
168
+
169
+ // Using erc20 mock because we have to use a deployed contract
170
+ let erc20_mock = deploy_erc20_mock();
171
+
172
+ // Owner attempts to register, but target does not implement IMessageLib
173
+ start_cheat_caller_address(message_lib_manager, owner);
174
+ dispatcher.register_library(erc20_mock);
175
+ stop_cheat_caller_address(message_lib_manager);
176
+ }
177
+
178
+ // =============================== Test Set Send Library =================================
179
+
180
+ #[test]
181
+ #[fuzzer(runs: 1)]
182
+ fn should_set_send_library(
183
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
184
+ ) {
185
+ let MessageLibManagerMock {
186
+ message_lib_manager, dispatcher, ..,
187
+ } = deploy_message_lib_manager(owner);
188
+
189
+ // Mock call to supported eid
190
+ start_mock_call(new_library, selector!("is_supported_send_eid"), true);
191
+
192
+ // Mock call to message lib type
193
+ let message_lib_type = MessageLibType::Send;
194
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
195
+
196
+ // Register the library
197
+ start_cheat_caller_address(message_lib_manager, owner);
198
+ dispatcher.register_library(new_library);
199
+ stop_cheat_caller_address(message_lib_manager);
200
+
201
+ let mut spy = spy_events();
202
+ // Set the send library
203
+ start_cheat_caller_address(message_lib_manager, oapp);
204
+ dispatcher.set_send_library(oapp, eid, new_library);
205
+ stop_cheat_caller_address(message_lib_manager);
206
+
207
+ // Check that the library is set
208
+ let res = dispatcher.get_send_library(oapp, eid);
209
+ assert(res.lib == new_library, 'should be set');
210
+ assert(!res.is_default, 'should not be default');
211
+ // Check raw send library is there
212
+ let res = dispatcher.get_raw_send_library(oapp, eid);
213
+ assert(res == new_library, 'should be set');
214
+
215
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
216
+ MessageLibManagerComponent::Event::SendLibrarySet(
217
+ SendLibrarySet { sender: oapp, dst_eid: eid, library: new_library },
218
+ ),
219
+ );
220
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
221
+ }
222
+
223
+ #[test]
224
+ #[fuzzer(runs: 1)]
225
+ fn should_set_send_library_when_already_set(
226
+ owner: ContractAddress,
227
+ new_library: ContractAddress,
228
+ second_new_library: ContractAddress,
229
+ eid: u32,
230
+ oapp: ContractAddress,
231
+ ) {
232
+ let MessageLibManagerMock {
233
+ message_lib_manager, dispatcher, ..,
234
+ } = deploy_message_lib_manager(owner);
235
+
236
+ // Mock call to supported eid
237
+ start_mock_call(new_library, selector!("is_supported_send_eid"), true);
238
+ // Mock call to message lib type
239
+ let message_lib_type = MessageLibType::Send;
240
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
241
+
242
+ // Register the library
243
+ start_cheat_caller_address(message_lib_manager, owner);
244
+ dispatcher.register_library(new_library);
245
+ stop_cheat_caller_address(message_lib_manager);
246
+
247
+ // Set the initial send library
248
+ start_cheat_caller_address(message_lib_manager, oapp);
249
+ dispatcher.set_send_library(oapp, eid, new_library);
250
+ stop_cheat_caller_address(message_lib_manager);
251
+
252
+ // Mock call to supported eid
253
+ start_mock_call(second_new_library, selector!("is_supported_send_eid"), true);
254
+ // Mock call to message lib type
255
+ let message_lib_type = MessageLibType::SendAndReceive;
256
+ start_mock_call(second_new_library, selector!("message_lib_type"), message_lib_type);
257
+
258
+ // Register the second library
259
+ start_cheat_caller_address(message_lib_manager, owner);
260
+ dispatcher.register_library(second_new_library);
261
+ stop_cheat_caller_address(message_lib_manager);
262
+
263
+ // Set the second send library
264
+ let mut spy = spy_events();
265
+ start_cheat_caller_address(message_lib_manager, oapp);
266
+ dispatcher.set_send_library(oapp, eid, second_new_library);
267
+ stop_cheat_caller_address(message_lib_manager);
268
+
269
+ // Check that the library is set
270
+ assert(dispatcher.get_send_library(oapp, eid).lib == second_new_library, 'should be set');
271
+ // Check raw send library is there
272
+ assert(dispatcher.get_raw_send_library(oapp, eid) == second_new_library, 'should be set');
273
+
274
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
275
+ MessageLibManagerComponent::Event::SendLibrarySet(
276
+ SendLibrarySet { sender: oapp, dst_eid: eid, library: second_new_library },
277
+ ),
278
+ );
279
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
280
+ }
281
+
282
+ #[test]
283
+ #[fuzzer(runs: 1)]
284
+ #[feature("safe_dispatcher")]
285
+ fn should_fail_to_set_send_library_when_not_registered(
286
+ owner: ContractAddress, unregistered_library: ContractAddress, eid: u32, oapp: ContractAddress,
287
+ ) {
288
+ let MessageLibManagerMock {
289
+ message_lib_manager, safe_dispatcher, ..,
290
+ } = deploy_message_lib_manager(owner);
291
+
292
+ start_cheat_caller_address(message_lib_manager, oapp);
293
+ let res = safe_dispatcher.set_send_library(oapp, eid, unregistered_library);
294
+ stop_cheat_caller_address(message_lib_manager);
295
+ assert_panic_with_error(res, err_only_registered_or_default_lib());
296
+ }
297
+
298
+ #[test]
299
+ #[fuzzer(runs: 1)]
300
+ #[feature("safe_dispatcher")]
301
+ fn should_fail_to_set_send_library_when_not_send(
302
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
303
+ ) {
304
+ let MessageLibManagerMock {
305
+ message_lib_manager, safe_dispatcher, ..,
306
+ } = deploy_message_lib_manager(owner);
307
+
308
+ // Mock call to supported eid
309
+ let message_lib_type = MessageLibType::Receive;
310
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
311
+
312
+ // Register the library
313
+ start_cheat_caller_address(message_lib_manager, owner);
314
+ safe_dispatcher.register_library(new_library).unwrap();
315
+ stop_cheat_caller_address(message_lib_manager);
316
+
317
+ // Caller is the owner
318
+ start_cheat_caller_address(message_lib_manager, oapp);
319
+ let res = safe_dispatcher.set_send_library(oapp, eid, new_library);
320
+ stop_cheat_caller_address(message_lib_manager);
321
+ assert_panic_with_error(res, err_only_send_lib());
322
+ }
323
+
324
+ #[test]
325
+ #[fuzzer(runs: 1)]
326
+ #[feature("safe_dispatcher")]
327
+ fn should_fail_to_set_send_library_when_not_supported_eid(
328
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
329
+ ) {
330
+ let MessageLibManagerMock {
331
+ message_lib_manager, safe_dispatcher, ..,
332
+ } = deploy_message_lib_manager(owner);
333
+
334
+ // Mock call to supported eid
335
+ start_mock_call(new_library, selector!("is_supported_send_eid"), false);
336
+
337
+ // Mock call to message lib type
338
+ let message_lib_type = MessageLibType::Send;
339
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
340
+
341
+ // Register the library
342
+ start_cheat_caller_address(message_lib_manager, owner);
343
+ safe_dispatcher.register_library(new_library).unwrap();
344
+ stop_cheat_caller_address(message_lib_manager);
345
+
346
+ // Caller is the owner
347
+ start_cheat_caller_address(message_lib_manager, oapp);
348
+ let res = safe_dispatcher.set_send_library(oapp, eid, new_library);
349
+ stop_cheat_caller_address(message_lib_manager);
350
+ assert_panic_with_error(res, err_unsupported_eid(eid));
351
+ }
352
+
353
+ #[test]
354
+ #[fuzzer(runs: 1)]
355
+ #[feature("safe_dispatcher")]
356
+ fn should_fail_to_set_send_library_when_same_value(
357
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
358
+ ) {
359
+ let MessageLibManagerMock {
360
+ message_lib_manager, safe_dispatcher, ..,
361
+ } = deploy_message_lib_manager(owner);
362
+
363
+ // Mock call to supported eid
364
+ start_mock_call(new_library, selector!("is_supported_send_eid"), true);
365
+ // Mock call to message lib type
366
+ let message_lib_type = MessageLibType::Send;
367
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
368
+
369
+ // Register the library
370
+ start_cheat_caller_address(message_lib_manager, owner);
371
+ safe_dispatcher.register_library(new_library).unwrap();
372
+ stop_cheat_caller_address(message_lib_manager);
373
+
374
+ start_cheat_caller_address(message_lib_manager, oapp);
375
+ safe_dispatcher.set_send_library(oapp, eid, new_library).unwrap();
376
+ stop_cheat_caller_address(message_lib_manager);
377
+
378
+ // Set the same library again
379
+ start_cheat_caller_address(message_lib_manager, oapp);
380
+ let res = safe_dispatcher.set_send_library(oapp, eid, new_library);
381
+ stop_cheat_caller_address(message_lib_manager);
382
+
383
+ assert_panic_with_error(res, err_same_value());
384
+ }
385
+
386
+ #[test]
387
+ #[fuzzer(runs: 1)]
388
+ #[feature("safe_dispatcher")]
389
+ fn should_fail_get_send_library_when_not_set_and_not_default(
390
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
391
+ ) {
392
+ let MessageLibManagerMock { safe_dispatcher, .. } = deploy_message_lib_manager(owner);
393
+
394
+ let res = safe_dispatcher.get_send_library(oapp, eid);
395
+
396
+ assert_panic_with_error(res, err_default_send_lib_unavailable());
397
+ }
398
+
399
+ // =============================== Test Set Default Send Library =================================
400
+
401
+ #[test]
402
+ #[fuzzer(runs: 1)]
403
+ fn test_set_default_send_library(
404
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
405
+ ) {
406
+ let MessageLibManagerMock {
407
+ message_lib_manager, dispatcher, ..,
408
+ } = deploy_message_lib_manager(owner);
409
+
410
+ // Mock call to supported eid
411
+ start_mock_call(new_library, selector!("is_supported_send_eid"), true);
412
+ // Mock call to message lib type
413
+ let message_lib_type = MessageLibType::Send;
414
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
415
+
416
+ // Register the library
417
+ start_cheat_caller_address(message_lib_manager, owner);
418
+ dispatcher.register_library(new_library);
419
+ stop_cheat_caller_address(message_lib_manager);
420
+
421
+ let mut spy = spy_events();
422
+
423
+ // Set the default send library
424
+ start_cheat_caller_address(message_lib_manager, owner);
425
+ dispatcher.set_default_send_library(eid, new_library);
426
+ stop_cheat_caller_address(message_lib_manager);
427
+
428
+ // Check that the library is set
429
+ assert(dispatcher.get_default_send_library(eid) == new_library, 'should be set');
430
+ // Check if is default send library
431
+ assert(dispatcher.is_default_send_library(oapp, eid), 'should be default send library');
432
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
433
+ MessageLibManagerComponent::Event::DefaultSendLibrarySet(
434
+ DefaultSendLibrarySet { eid, library: new_library },
435
+ ),
436
+ );
437
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
438
+ }
439
+
440
+ #[test]
441
+ #[fuzzer(runs: 1)]
442
+ fn should_set_default_send_library_when_already_set(
443
+ owner: ContractAddress,
444
+ new_library: ContractAddress,
445
+ second_new_library: ContractAddress,
446
+ eid: u32,
447
+ oapp: ContractAddress,
448
+ ) {
449
+ let MessageLibManagerMock {
450
+ message_lib_manager, dispatcher, ..,
451
+ } = deploy_message_lib_manager(owner);
452
+
453
+ // Mock call to supported eid
454
+ start_mock_call(new_library, selector!("is_supported_send_eid"), true);
455
+ // Mock call to message lib type
456
+ let message_lib_type = MessageLibType::Send;
457
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
458
+
459
+ // Register the library
460
+ start_cheat_caller_address(message_lib_manager, owner);
461
+ dispatcher.register_library(new_library);
462
+ stop_cheat_caller_address(message_lib_manager);
463
+
464
+ // Set the default send library
465
+ start_cheat_caller_address(message_lib_manager, owner);
466
+ dispatcher.set_default_send_library(eid, new_library);
467
+ stop_cheat_caller_address(message_lib_manager);
468
+
469
+ // Mock call to supported eid
470
+ start_mock_call(second_new_library, selector!("is_supported_send_eid"), true);
471
+ // Mock call to message lib type
472
+ let message_lib_type = MessageLibType::SendAndReceive;
473
+ start_mock_call(second_new_library, selector!("message_lib_type"), message_lib_type);
474
+
475
+ // Register the second library
476
+ start_cheat_caller_address(message_lib_manager, owner);
477
+ dispatcher.register_library(second_new_library);
478
+ stop_cheat_caller_address(message_lib_manager);
479
+
480
+ // Set the second default send library
481
+ let mut spy = spy_events();
482
+ start_cheat_caller_address(message_lib_manager, owner);
483
+ dispatcher.set_default_send_library(eid, second_new_library);
484
+ stop_cheat_caller_address(message_lib_manager);
485
+
486
+ // Check that the library is set
487
+ assert(dispatcher.get_default_send_library(eid) == second_new_library, 'should be set');
488
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
489
+ MessageLibManagerComponent::Event::DefaultSendLibrarySet(
490
+ DefaultSendLibrarySet { eid, library: second_new_library },
491
+ ),
492
+ );
493
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
494
+ }
495
+
496
+ #[test]
497
+ #[fuzzer(runs: 1)]
498
+ #[feature("safe_dispatcher")]
499
+ fn should_fail_to_set_default_send_library_when_not_owner(
500
+ owner: ContractAddress, not_owner: ContractAddress, new_library: ContractAddress, eid: u32,
501
+ ) {
502
+ if not_owner == owner {
503
+ return;
504
+ }
505
+
506
+ let MessageLibManagerMock {
507
+ message_lib_manager, safe_dispatcher, ..,
508
+ } = deploy_message_lib_manager(owner);
509
+
510
+ // Register the library
511
+ start_cheat_caller_address(message_lib_manager, owner);
512
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::SendAndReceive);
513
+ safe_dispatcher.register_library(new_library).unwrap();
514
+ stop_cheat_caller_address(message_lib_manager);
515
+
516
+ // Caller is not the owner
517
+ start_cheat_caller_address(message_lib_manager, not_owner);
518
+ let res = safe_dispatcher.set_default_send_library(eid, new_library);
519
+ stop_cheat_caller_address(message_lib_manager);
520
+
521
+ assert_panic_with_felt_error(res, OZ_NOT_OWNER);
522
+ }
523
+
524
+ #[test]
525
+ #[fuzzer(runs: 1)]
526
+ #[feature("safe_dispatcher")]
527
+ fn should_fail_to_set_default_send_library_when_not_registered(
528
+ owner: ContractAddress, unregistered_library: ContractAddress, eid: u32,
529
+ ) {
530
+ let MessageLibManagerMock {
531
+ message_lib_manager, safe_dispatcher, ..,
532
+ } = deploy_message_lib_manager(owner);
533
+
534
+ // Caller is the owner but library is not registered
535
+ start_cheat_caller_address(message_lib_manager, owner);
536
+ let res = safe_dispatcher.set_default_send_library(eid, unregistered_library);
537
+ stop_cheat_caller_address(message_lib_manager);
538
+
539
+ assert_panic_with_error(res, err_only_registered_lib());
540
+ }
541
+
542
+ #[test]
543
+ #[fuzzer(runs: 1)]
544
+ #[feature("safe_dispatcher")]
545
+ fn should_fail_to_set_default_send_library_when_not_send(
546
+ owner: ContractAddress, new_library: ContractAddress, eid: u32,
547
+ ) {
548
+ let MessageLibManagerMock {
549
+ message_lib_manager, safe_dispatcher, ..,
550
+ } = deploy_message_lib_manager(owner);
551
+
552
+ // Mock call to message lib type (not a send library)
553
+ let message_lib_type = MessageLibType::Receive;
554
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
555
+
556
+ // Register the library
557
+ start_cheat_caller_address(message_lib_manager, owner);
558
+ safe_dispatcher.register_library(new_library).unwrap();
559
+ stop_cheat_caller_address(message_lib_manager);
560
+
561
+ // Caller is the owner
562
+ start_cheat_caller_address(message_lib_manager, owner);
563
+ let res = safe_dispatcher.set_default_send_library(eid, new_library);
564
+ stop_cheat_caller_address(message_lib_manager);
565
+
566
+ assert_panic_with_error(res, err_only_send_lib());
567
+ }
568
+
569
+ #[test]
570
+ #[fuzzer(runs: 1)]
571
+ #[feature("safe_dispatcher")]
572
+ fn should_fail_to_set_default_send_library_when_not_supported_eid(
573
+ owner: ContractAddress, new_library: ContractAddress, eid: u32,
574
+ ) {
575
+ let MessageLibManagerMock {
576
+ message_lib_manager, safe_dispatcher, ..,
577
+ } = deploy_message_lib_manager(owner);
578
+
579
+ // Mock call to supported eid (not supported)
580
+ start_mock_call(new_library, selector!("is_supported_send_eid"), false);
581
+
582
+ // Mock call to message lib type
583
+ let message_lib_type = MessageLibType::Send;
584
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
585
+
586
+ // Register the library
587
+ start_cheat_caller_address(message_lib_manager, owner);
588
+ safe_dispatcher.register_library(new_library).unwrap();
589
+ stop_cheat_caller_address(message_lib_manager);
590
+
591
+ // Caller is the owner
592
+ start_cheat_caller_address(message_lib_manager, owner);
593
+ let res = safe_dispatcher.set_default_send_library(eid, new_library);
594
+ stop_cheat_caller_address(message_lib_manager);
595
+
596
+ assert_panic_with_error(res, err_unsupported_eid(eid));
597
+ }
598
+
599
+ #[test]
600
+ #[fuzzer(runs: 1)]
601
+ #[feature("safe_dispatcher")]
602
+ fn should_fail_to_set_default_send_library_when_same_value(
603
+ owner: ContractAddress, new_library: ContractAddress, eid: u32,
604
+ ) {
605
+ let MessageLibManagerMock {
606
+ message_lib_manager, safe_dispatcher, ..,
607
+ } = deploy_message_lib_manager(owner);
608
+
609
+ // Mock call to supported eid
610
+ start_mock_call(new_library, selector!("is_supported_send_eid"), true);
611
+ // Mock call to message lib type
612
+ let message_lib_type = MessageLibType::Send;
613
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
614
+
615
+ // Register the library
616
+ start_cheat_caller_address(message_lib_manager, owner);
617
+ safe_dispatcher.register_library(new_library).unwrap();
618
+ stop_cheat_caller_address(message_lib_manager);
619
+
620
+ // Set the default send library first
621
+ start_cheat_caller_address(message_lib_manager, owner);
622
+ safe_dispatcher.set_default_send_library(eid, new_library).unwrap();
623
+ stop_cheat_caller_address(message_lib_manager);
624
+
625
+ // Try to set the same library again
626
+ start_cheat_caller_address(message_lib_manager, owner);
627
+ let res = safe_dispatcher.set_default_send_library(eid, new_library);
628
+ stop_cheat_caller_address(message_lib_manager);
629
+
630
+ assert_panic_with_error(res, err_same_value());
631
+ }
632
+
633
+ // =============================== Test Set Receive Library =================================
634
+
635
+ #[test]
636
+ #[fuzzer(runs: 1)]
637
+ fn should_set_receive_library(
638
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
639
+ ) {
640
+ let MessageLibManagerMock {
641
+ message_lib_manager, dispatcher, ..,
642
+ } = deploy_message_lib_manager(owner);
643
+
644
+ // Mock call to supported eid
645
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
646
+
647
+ // Mock call to message lib type
648
+ let message_lib_type = MessageLibType::Receive;
649
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
650
+
651
+ // Register the library
652
+ start_cheat_caller_address(message_lib_manager, owner);
653
+ dispatcher.register_library(new_library);
654
+ stop_cheat_caller_address(message_lib_manager);
655
+
656
+ let mut spy = spy_events();
657
+ // Set the receive library
658
+ start_cheat_caller_address(message_lib_manager, oapp);
659
+ dispatcher.set_receive_library(oapp, eid, new_library, 0);
660
+ stop_cheat_caller_address(message_lib_manager);
661
+
662
+ // Check that the library is set
663
+ let res = dispatcher.get_receive_library(oapp, eid);
664
+ assert(res.lib == new_library, 'should be set');
665
+ assert(!res.is_default, 'should not be default');
666
+ // Check raw receive library is there
667
+ let res = dispatcher.get_raw_receive_library(oapp, eid);
668
+ assert(res == new_library, 'should be set');
669
+
670
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
671
+ MessageLibManagerComponent::Event::ReceiveLibrarySet(
672
+ ReceiveLibrarySet { receiver: oapp, src_eid: eid, library: new_library },
673
+ ),
674
+ );
675
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
676
+ }
677
+
678
+ #[test]
679
+ #[fuzzer(runs: 1)]
680
+ #[feature("safe_dispatcher")]
681
+ fn should_fail_to_set_receive_library_when_not_registered(
682
+ owner: ContractAddress, unregistered_library: ContractAddress, eid: u32, oapp: ContractAddress,
683
+ ) {
684
+ let MessageLibManagerMock {
685
+ message_lib_manager, safe_dispatcher, ..,
686
+ } = deploy_message_lib_manager(owner);
687
+
688
+ // Caller is oapp
689
+ start_cheat_caller_address(message_lib_manager, oapp);
690
+ let res = safe_dispatcher.set_receive_library(oapp, eid, unregistered_library, 0);
691
+ stop_cheat_caller_address(message_lib_manager);
692
+ assert_panic_with_error(res, err_only_registered_or_default_lib());
693
+ }
694
+
695
+ #[test]
696
+ #[fuzzer(runs: 1)]
697
+ #[feature("safe_dispatcher")]
698
+ fn should_fail_to_set_receive_library_when_not_receive_lib(
699
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
700
+ ) {
701
+ let MessageLibManagerMock {
702
+ message_lib_manager, safe_dispatcher, ..,
703
+ } = deploy_message_lib_manager(owner);
704
+
705
+ // Mock call to message lib type
706
+ let message_lib_type = MessageLibType::Send;
707
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
708
+
709
+ // Register the library
710
+ start_cheat_caller_address(message_lib_manager, owner);
711
+ safe_dispatcher.register_library(new_library).unwrap();
712
+ stop_cheat_caller_address(message_lib_manager);
713
+
714
+ // Caller is oapp
715
+ start_cheat_caller_address(message_lib_manager, oapp);
716
+ let res = safe_dispatcher.set_receive_library(oapp, eid, new_library, 0);
717
+ stop_cheat_caller_address(message_lib_manager);
718
+ assert_panic_with_error(res, err_only_receive_lib());
719
+ }
720
+
721
+ #[test]
722
+ #[fuzzer(runs: 1)]
723
+ #[feature("safe_dispatcher")]
724
+ fn should_fail_get_receive_library_when_not_set_and_not_default(
725
+ owner: ContractAddress, eid: u32, oapp: ContractAddress,
726
+ ) {
727
+ let MessageLibManagerMock {
728
+ message_lib_manager, safe_dispatcher, ..,
729
+ } = deploy_message_lib_manager(owner);
730
+
731
+ // Caller is oapp
732
+ start_cheat_caller_address(message_lib_manager, oapp);
733
+ let res = safe_dispatcher.get_receive_library(oapp, eid);
734
+ stop_cheat_caller_address(message_lib_manager);
735
+
736
+ assert_panic_with_error(res, err_default_receive_lib_unavailable());
737
+ }
738
+
739
+ // =============================== Test Set Default Receive Library
740
+ // =================================
741
+
742
+ #[test]
743
+ #[fuzzer(runs: 1)]
744
+ fn should_set_default_receive_library(
745
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
746
+ ) {
747
+ let MessageLibManagerMock {
748
+ message_lib_manager, dispatcher, ..,
749
+ } = deploy_message_lib_manager(owner);
750
+
751
+ // Mock call to supported eid
752
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
753
+ // Mock call to message lib type
754
+ let message_lib_type = MessageLibType::Receive;
755
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
756
+
757
+ // Register the library
758
+ start_cheat_caller_address(message_lib_manager, owner);
759
+ dispatcher.register_library(new_library);
760
+ stop_cheat_caller_address(message_lib_manager);
761
+
762
+ let mut spy = spy_events();
763
+
764
+ // Set the default receive library
765
+ start_cheat_caller_address(message_lib_manager, owner);
766
+ dispatcher.set_default_receive_library(eid, new_library, 0);
767
+ stop_cheat_caller_address(message_lib_manager);
768
+
769
+ // Check that the library is set
770
+ let lib = dispatcher.get_default_receive_library(eid);
771
+ assert(lib == new_library, 'should be set');
772
+
773
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
774
+ MessageLibManagerComponent::Event::DefaultReceiveLibrarySet(
775
+ DefaultReceiveLibrarySet { eid, library: new_library },
776
+ ),
777
+ );
778
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
779
+ }
780
+
781
+ #[test]
782
+ #[fuzzer(runs: 1)]
783
+ #[feature("safe_dispatcher")]
784
+ fn should_fail_to_set_default_receive_library_when_not_owner(
785
+ owner: ContractAddress, not_owner: ContractAddress, new_library: ContractAddress, eid: u32,
786
+ ) {
787
+ if not_owner == owner {
788
+ return;
789
+ }
790
+
791
+ let MessageLibManagerMock {
792
+ message_lib_manager, safe_dispatcher, ..,
793
+ } = deploy_message_lib_manager(owner);
794
+
795
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
796
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
797
+
798
+ start_cheat_caller_address(message_lib_manager, owner);
799
+ safe_dispatcher.register_library(new_library).unwrap();
800
+ stop_cheat_caller_address(message_lib_manager);
801
+
802
+ start_cheat_caller_address(message_lib_manager, not_owner);
803
+ let res = safe_dispatcher.set_default_receive_library(eid, new_library, 0);
804
+ stop_cheat_caller_address(message_lib_manager);
805
+
806
+ assert_panic_with_felt_error(res, OZ_NOT_OWNER);
807
+ }
808
+
809
+ #[test]
810
+ #[fuzzer(runs: 1)]
811
+ #[feature("safe_dispatcher")]
812
+ fn should_fail_to_set_default_receive_library_when_not_registered(
813
+ owner: ContractAddress, unregistered_library: ContractAddress, eid: u32,
814
+ ) {
815
+ let MessageLibManagerMock {
816
+ message_lib_manager, safe_dispatcher, ..,
817
+ } = deploy_message_lib_manager(owner);
818
+
819
+ // Caller is the owner but library is not registered
820
+ start_cheat_caller_address(message_lib_manager, owner);
821
+ let res = safe_dispatcher.set_default_receive_library(eid, unregistered_library, 0);
822
+ stop_cheat_caller_address(message_lib_manager);
823
+
824
+ assert_panic_with_error(res, err_only_registered_lib());
825
+ }
826
+
827
+ #[test]
828
+ #[fuzzer(runs: 1)]
829
+ #[feature("safe_dispatcher")]
830
+ fn should_fail_to_set_default_receive_library_when_not_receive(
831
+ owner: ContractAddress, new_library: ContractAddress, eid: u32,
832
+ ) {
833
+ let MessageLibManagerMock {
834
+ message_lib_manager, safe_dispatcher, ..,
835
+ } = deploy_message_lib_manager(owner);
836
+
837
+ // Mock call to supported eid
838
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
839
+
840
+ // Mock call to message lib type (not a receive library)
841
+ let message_lib_type = MessageLibType::Send;
842
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
843
+
844
+ // Register the library
845
+ start_cheat_caller_address(message_lib_manager, owner);
846
+ safe_dispatcher.register_library(new_library).unwrap();
847
+ stop_cheat_caller_address(message_lib_manager);
848
+
849
+ // Caller is the owner
850
+ start_cheat_caller_address(message_lib_manager, owner);
851
+ let res = safe_dispatcher.set_default_receive_library(eid, new_library, 0);
852
+ stop_cheat_caller_address(message_lib_manager);
853
+
854
+ assert_panic_with_error(res, err_only_receive_lib());
855
+ }
856
+
857
+ #[test]
858
+ #[fuzzer(runs: 1)]
859
+ #[feature("safe_dispatcher")]
860
+ fn should_fail_to_set_default_receive_library_when_not_supported_eid(
861
+ owner: ContractAddress, new_library: ContractAddress, eid: u32,
862
+ ) {
863
+ let MessageLibManagerMock {
864
+ message_lib_manager, safe_dispatcher, ..,
865
+ } = deploy_message_lib_manager(owner);
866
+
867
+ // Mock call to supported eid (not supported)
868
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), false);
869
+
870
+ // Mock call to message lib type
871
+ let message_lib_type = MessageLibType::Receive;
872
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
873
+
874
+ // Register the library
875
+ start_cheat_caller_address(message_lib_manager, owner);
876
+ safe_dispatcher.register_library(new_library).unwrap();
877
+ stop_cheat_caller_address(message_lib_manager);
878
+
879
+ // Caller is the owner
880
+ start_cheat_caller_address(message_lib_manager, owner);
881
+ let res = safe_dispatcher.set_default_receive_library(eid, new_library, 0);
882
+ stop_cheat_caller_address(message_lib_manager);
883
+
884
+ assert_panic_with_error(res, err_unsupported_eid(eid));
885
+ }
886
+
887
+ #[test]
888
+ #[fuzzer(runs: 1)]
889
+ #[feature("safe_dispatcher")]
890
+ fn should_fail_to_set_default_receive_library_when_same_value(
891
+ owner: ContractAddress, new_library: ContractAddress, eid: u32,
892
+ ) {
893
+ let MessageLibManagerMock {
894
+ message_lib_manager, safe_dispatcher, ..,
895
+ } = deploy_message_lib_manager(owner);
896
+
897
+ // Mock call to supported eid
898
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
899
+ // Mock call to message lib type
900
+ let message_lib_type = MessageLibType::Receive;
901
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
902
+
903
+ // Register the library
904
+ start_cheat_caller_address(message_lib_manager, owner);
905
+ safe_dispatcher.register_library(new_library).unwrap();
906
+ stop_cheat_caller_address(message_lib_manager);
907
+
908
+ // Set the default receive library first
909
+ start_cheat_caller_address(message_lib_manager, owner);
910
+ safe_dispatcher.set_default_receive_library(eid, new_library, 0).unwrap();
911
+ stop_cheat_caller_address(message_lib_manager);
912
+
913
+ // Try to set the same library again
914
+ start_cheat_caller_address(message_lib_manager, owner);
915
+ let res = safe_dispatcher.set_default_receive_library(eid, new_library, 0);
916
+ stop_cheat_caller_address(message_lib_manager);
917
+
918
+ assert_panic_with_error(res, err_same_value());
919
+ }
920
+
921
+ // ========================= Test Set Receive Library Timeout ==============================
922
+
923
+ #[test]
924
+ #[fuzzer(runs: 1)]
925
+ fn should_set_receive_library_timeout(
926
+ owner: ContractAddress,
927
+ new_library: ContractAddress,
928
+ eid: u32,
929
+ oapp: ContractAddress,
930
+ expiry: u64,
931
+ ) {
932
+ // Skip expiry == 0, its special case and is tested under
933
+ if expiry == 0 {
934
+ return;
935
+ }
936
+
937
+ let MessageLibManagerMock {
938
+ message_lib_manager, dispatcher, ..,
939
+ } = deploy_message_lib_manager(owner);
940
+
941
+ // Mock calls
942
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
943
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
944
+
945
+ // Register the library
946
+ start_cheat_caller_address(message_lib_manager, owner);
947
+ dispatcher.register_library(new_library);
948
+ stop_cheat_caller_address(message_lib_manager);
949
+
950
+ // Set the receive library for the oapp
951
+ start_cheat_caller_address(message_lib_manager, oapp);
952
+ dispatcher.set_receive_library(oapp, eid, new_library, 0);
953
+ stop_cheat_caller_address(message_lib_manager);
954
+
955
+ start_cheat_block_number(message_lib_manager, 1);
956
+
957
+ let mut spy = spy_events();
958
+ start_cheat_caller_address(message_lib_manager, oapp);
959
+ dispatcher.set_receive_library_timeout(oapp, eid, new_library, expiry);
960
+ stop_cheat_caller_address(message_lib_manager);
961
+
962
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
963
+ MessageLibManagerComponent::Event::ReceiveLibraryTimeoutSet(
964
+ ReceiveLibraryTimeoutSet { oapp, eid, library: new_library, expiry },
965
+ ),
966
+ );
967
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
968
+ stop_cheat_block_number(message_lib_manager);
969
+
970
+ let timeout = dispatcher.get_receive_library_timeout(oapp, eid, new_library);
971
+ let expected_timeout = Timeout { lib: new_library, expiry };
972
+ assert(timeout == expected_timeout, 'should be set');
973
+ }
974
+
975
+ #[test]
976
+ #[fuzzer(runs: 1)]
977
+ fn should_set_receive_library_timeout_to_0(
978
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
979
+ ) {
980
+ let MessageLibManagerMock {
981
+ message_lib_manager, dispatcher, ..,
982
+ } = deploy_message_lib_manager(owner);
983
+
984
+ // Mock calls
985
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
986
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
987
+
988
+ // Register the library
989
+ start_cheat_caller_address(message_lib_manager, owner);
990
+ dispatcher.register_library(new_library);
991
+ stop_cheat_caller_address(message_lib_manager);
992
+
993
+ // Set the receive library for the oapp
994
+ start_cheat_caller_address(message_lib_manager, oapp);
995
+ dispatcher.set_receive_library(oapp, eid, new_library, 0);
996
+ stop_cheat_caller_address(message_lib_manager);
997
+
998
+ let mut spy = spy_events();
999
+ start_cheat_caller_address(message_lib_manager, oapp);
1000
+ dispatcher.set_receive_library_timeout(oapp, eid, new_library, 0);
1001
+ stop_cheat_caller_address(message_lib_manager);
1002
+
1003
+ let timeout = dispatcher.get_receive_library_timeout(oapp, eid, new_library);
1004
+ let expected_timeout = Default::default();
1005
+ assert(timeout == expected_timeout, 'should be set');
1006
+
1007
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
1008
+ MessageLibManagerComponent::Event::ReceiveLibraryTimeoutSet(
1009
+ ReceiveLibraryTimeoutSet { oapp, eid, library: new_library, expiry: 0 },
1010
+ ),
1011
+ );
1012
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
1013
+ }
1014
+
1015
+ #[test]
1016
+ #[fuzzer(runs: 1)]
1017
+ #[feature("safe_dispatcher")]
1018
+ fn should_fail_to_set_receive_library_timeout_for_default_lib(
1019
+ owner: ContractAddress,
1020
+ new_library: ContractAddress,
1021
+ eid: u32,
1022
+ oapp: ContractAddress,
1023
+ expiry: u64,
1024
+ ) {
1025
+ let MessageLibManagerMock {
1026
+ message_lib_manager, safe_dispatcher, ..,
1027
+ } = deploy_message_lib_manager(owner);
1028
+
1029
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1030
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1031
+
1032
+ // Register and set as default
1033
+ start_cheat_caller_address(message_lib_manager, owner);
1034
+ safe_dispatcher.register_library(new_library).unwrap();
1035
+ stop_cheat_caller_address(message_lib_manager);
1036
+
1037
+ start_cheat_caller_address(message_lib_manager, owner);
1038
+ safe_dispatcher.set_default_receive_library(eid, new_library, 0).unwrap();
1039
+ stop_cheat_caller_address(message_lib_manager);
1040
+
1041
+ // Try to set timeout as oapp (using default)
1042
+ start_cheat_caller_address(message_lib_manager, oapp);
1043
+ let res = safe_dispatcher.set_receive_library_timeout(oapp, eid, new_library, expiry);
1044
+ stop_cheat_caller_address(message_lib_manager);
1045
+
1046
+ assert_panic_with_error(res, err_only_non_default_lib());
1047
+ }
1048
+
1049
+ #[test]
1050
+ #[fuzzer(runs: 1)]
1051
+ #[feature("safe_dispatcher")]
1052
+ fn should_fail_to_set_receive_library_timeout_with_invalid_expiry(
1053
+ owner: ContractAddress,
1054
+ new_library: ContractAddress,
1055
+ eid: u32,
1056
+ oapp: ContractAddress,
1057
+ block_timestamp: u64,
1058
+ timestamp_delta: u64,
1059
+ ) {
1060
+ // Skip if block_timestamp is 0 to prevent division by 0
1061
+ if block_timestamp == 0 {
1062
+ return;
1063
+ }
1064
+ let timestamp_delta =
1065
+ timestamp_delta % block_timestamp; // Ensure timestamp_delta is less than block_timestamp
1066
+ let MessageLibManagerMock {
1067
+ message_lib_manager, safe_dispatcher, ..,
1068
+ } = deploy_message_lib_manager(owner);
1069
+
1070
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1071
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1072
+
1073
+ start_cheat_caller_address(message_lib_manager, owner);
1074
+ safe_dispatcher.register_library(new_library).unwrap();
1075
+ stop_cheat_caller_address(message_lib_manager);
1076
+
1077
+ start_cheat_caller_address(message_lib_manager, oapp);
1078
+ safe_dispatcher.set_receive_library(oapp, eid, new_library, 0).unwrap();
1079
+ stop_cheat_caller_address(message_lib_manager);
1080
+
1081
+ start_cheat_block_number(message_lib_manager, block_timestamp);
1082
+ start_cheat_caller_address(message_lib_manager, oapp);
1083
+ // Expired timestamp
1084
+ let res = safe_dispatcher
1085
+ .set_receive_library_timeout(oapp, eid, new_library, block_timestamp - timestamp_delta);
1086
+ stop_cheat_caller_address(message_lib_manager);
1087
+ stop_cheat_block_number(message_lib_manager);
1088
+
1089
+ assert_panic_with_error(res, err_invalid_expiry());
1090
+ }
1091
+
1092
+ // ====================== Test Set Default Receive Library Timeout ======================
1093
+
1094
+ #[test]
1095
+ #[fuzzer(runs: 1)]
1096
+ fn should_set_default_receive_library_timeout(
1097
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, expiry: u64,
1098
+ ) {
1099
+ // Skip expiry == 0, its special case and is tested elsewhere
1100
+ if expiry == 0 {
1101
+ return;
1102
+ }
1103
+
1104
+ let MessageLibManagerMock {
1105
+ message_lib_manager, dispatcher, ..,
1106
+ } = deploy_message_lib_manager(owner);
1107
+
1108
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1109
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1110
+
1111
+ start_cheat_caller_address(message_lib_manager, owner);
1112
+ dispatcher.register_library(new_library);
1113
+ stop_cheat_caller_address(message_lib_manager);
1114
+
1115
+ start_cheat_block_number(message_lib_manager, 1);
1116
+
1117
+ let mut spy = spy_events();
1118
+ start_cheat_caller_address(message_lib_manager, owner);
1119
+ dispatcher.set_default_receive_library_timeout(eid, new_library, expiry);
1120
+ stop_cheat_caller_address(message_lib_manager);
1121
+
1122
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
1123
+ MessageLibManagerComponent::Event::DefaultReceiveLibraryTimeoutSet(
1124
+ DefaultReceiveLibraryTimeoutSet { eid, library: new_library, expiry },
1125
+ ),
1126
+ );
1127
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
1128
+ stop_cheat_block_number(message_lib_manager);
1129
+
1130
+ let timeout = dispatcher.get_default_receive_library_timeout(eid);
1131
+ let expected_timeout = Timeout { lib: new_library, expiry };
1132
+ assert(timeout == expected_timeout, 'should be set');
1133
+ }
1134
+
1135
+ #[test]
1136
+ #[fuzzer(runs: 1)]
1137
+ fn should_set_default_receive_library_timeout_to_0(
1138
+ owner: ContractAddress, new_library: ContractAddress, eid: u32,
1139
+ ) {
1140
+ let MessageLibManagerMock {
1141
+ message_lib_manager, dispatcher, ..,
1142
+ } = deploy_message_lib_manager(owner);
1143
+
1144
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1145
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1146
+
1147
+ start_cheat_caller_address(message_lib_manager, owner);
1148
+ dispatcher.register_library(new_library);
1149
+ stop_cheat_caller_address(message_lib_manager);
1150
+
1151
+ let mut spy = spy_events();
1152
+ start_cheat_caller_address(message_lib_manager, owner);
1153
+ dispatcher.set_default_receive_library_timeout(eid, new_library, 0);
1154
+ stop_cheat_caller_address(message_lib_manager);
1155
+
1156
+ let timeout = dispatcher.get_default_receive_library_timeout(eid);
1157
+ let expected_timeout = Default::default();
1158
+ assert(timeout == expected_timeout, 'should be set');
1159
+
1160
+ let expected_event = MockMessageLibManager::Event::MessageLibManagerEvent(
1161
+ MessageLibManagerComponent::Event::DefaultReceiveLibraryTimeoutSet(
1162
+ DefaultReceiveLibraryTimeoutSet { eid, library: new_library, expiry: 0 },
1163
+ ),
1164
+ );
1165
+ spy.assert_emitted(@array![(message_lib_manager, expected_event)]);
1166
+ }
1167
+
1168
+ #[test]
1169
+ #[fuzzer(runs: 1)]
1170
+ #[feature("safe_dispatcher")]
1171
+ fn should_fail_to_set_default_receive_library_timeout_when_not_owner(
1172
+ owner: ContractAddress,
1173
+ not_owner: ContractAddress,
1174
+ new_library: ContractAddress,
1175
+ eid: u32,
1176
+ expiry: u64,
1177
+ ) {
1178
+ if not_owner == owner {
1179
+ return;
1180
+ }
1181
+
1182
+ let MessageLibManagerMock {
1183
+ message_lib_manager, safe_dispatcher, ..,
1184
+ } = deploy_message_lib_manager(owner);
1185
+
1186
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1187
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1188
+
1189
+ start_cheat_caller_address(message_lib_manager, owner);
1190
+ safe_dispatcher.register_library(new_library).unwrap();
1191
+ stop_cheat_caller_address(message_lib_manager);
1192
+
1193
+ start_cheat_caller_address(message_lib_manager, not_owner);
1194
+ let res = safe_dispatcher.set_default_receive_library_timeout(eid, new_library, expiry);
1195
+ stop_cheat_caller_address(message_lib_manager);
1196
+
1197
+ assert_panic_with_felt_error(res, OZ_NOT_OWNER);
1198
+ }
1199
+
1200
+ #[test]
1201
+ #[fuzzer(runs: 1)]
1202
+ #[feature("safe_dispatcher")]
1203
+ fn should_fail_to_set_default_receive_library_timeout_with_invalid_expiry(
1204
+ owner: ContractAddress,
1205
+ new_library: ContractAddress,
1206
+ eid: u32,
1207
+ block_timestamp: u64,
1208
+ timestamp_delta: u64,
1209
+ ) {
1210
+ // Skip if block_timestamp is 0 to prevent division by 0
1211
+ if block_timestamp == 0 {
1212
+ return;
1213
+ }
1214
+ let timestamp_delta =
1215
+ timestamp_delta % block_timestamp; // Ensure timestamp_delta is less than block_timestamp
1216
+ let MessageLibManagerMock {
1217
+ message_lib_manager, safe_dispatcher, ..,
1218
+ } = deploy_message_lib_manager(owner);
1219
+
1220
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1221
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1222
+
1223
+ start_cheat_caller_address(message_lib_manager, owner);
1224
+ safe_dispatcher.register_library(new_library).unwrap();
1225
+ stop_cheat_caller_address(message_lib_manager);
1226
+
1227
+ start_cheat_block_number(message_lib_manager, block_timestamp);
1228
+ start_cheat_caller_address(message_lib_manager, owner);
1229
+ let res = safe_dispatcher
1230
+ .set_default_receive_library_timeout(eid, new_library, block_timestamp - timestamp_delta);
1231
+ stop_cheat_caller_address(message_lib_manager);
1232
+ stop_cheat_block_number(message_lib_manager);
1233
+
1234
+ assert_panic_with_error(res, err_invalid_expiry());
1235
+ }
1236
+
1237
+ // =============================== Test Is Valid Receive Library =================================
1238
+
1239
+ #[test]
1240
+ #[fuzzer(runs: 1)]
1241
+ fn should_return_true_for_current_library(
1242
+ owner: ContractAddress, oapp: ContractAddress, new_library: ContractAddress, eid: u32,
1243
+ ) {
1244
+ let MessageLibManagerMock {
1245
+ message_lib_manager, dispatcher, ..,
1246
+ } = deploy_message_lib_manager(owner);
1247
+
1248
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1249
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1250
+
1251
+ start_cheat_caller_address(message_lib_manager, owner);
1252
+ dispatcher.register_library(new_library);
1253
+ stop_cheat_caller_address(message_lib_manager);
1254
+
1255
+ start_cheat_caller_address(message_lib_manager, oapp);
1256
+ dispatcher.set_receive_library(oapp, eid, new_library, 0);
1257
+ stop_cheat_caller_address(message_lib_manager);
1258
+
1259
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, new_library);
1260
+ assert(is_valid, 'should be valid');
1261
+ }
1262
+
1263
+ #[test]
1264
+ #[fuzzer(runs: 1)]
1265
+ fn should_return_true_for_current_default_library(
1266
+ owner: ContractAddress, oapp: ContractAddress, new_library: ContractAddress, eid: u32,
1267
+ ) {
1268
+ let MessageLibManagerMock {
1269
+ message_lib_manager, dispatcher, ..,
1270
+ } = deploy_message_lib_manager(owner);
1271
+
1272
+ // mock calls to supported eid
1273
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1274
+ // mock call to message lib type
1275
+ let message_lib_type = MessageLibType::Receive;
1276
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
1277
+
1278
+ start_cheat_caller_address(message_lib_manager, owner);
1279
+ dispatcher.register_library(new_library);
1280
+ dispatcher.set_default_receive_library(eid, new_library, 0);
1281
+ stop_cheat_caller_address(message_lib_manager);
1282
+
1283
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, new_library);
1284
+ assert(is_valid, 'should be valid');
1285
+ }
1286
+
1287
+ #[test]
1288
+ #[fuzzer(runs: 1)]
1289
+ fn should_return_false_for_wrong_library(
1290
+ owner: ContractAddress,
1291
+ oapp: ContractAddress,
1292
+ supported_library: ContractAddress,
1293
+ unsupported_library: ContractAddress,
1294
+ eid: u32,
1295
+ ) {
1296
+ if supported_library == unsupported_library {
1297
+ return;
1298
+ }
1299
+
1300
+ let MessageLibManagerMock {
1301
+ message_lib_manager, dispatcher, ..,
1302
+ } = deploy_message_lib_manager(owner);
1303
+
1304
+ start_mock_call(supported_library, selector!("is_supported_receive_eid"), true);
1305
+ start_mock_call(supported_library, selector!("message_lib_type"), MessageLibType::Receive);
1306
+ start_mock_call(
1307
+ unsupported_library, selector!("message_lib_type"), MessageLibType::SendAndReceive,
1308
+ );
1309
+
1310
+ start_cheat_caller_address(message_lib_manager, owner);
1311
+ dispatcher.register_library(supported_library);
1312
+ dispatcher.register_library(unsupported_library);
1313
+ stop_cheat_caller_address(message_lib_manager);
1314
+
1315
+ start_cheat_caller_address(message_lib_manager, oapp);
1316
+ dispatcher.set_receive_library(oapp, eid, supported_library, 0);
1317
+ stop_cheat_caller_address(message_lib_manager);
1318
+
1319
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, unsupported_library);
1320
+ assert(!is_valid, 'should not be valid');
1321
+ }
1322
+
1323
+ #[test]
1324
+ #[fuzzer(runs: 1)]
1325
+ fn should_return_true_for_old_library_in_grace_period(
1326
+ owner: ContractAddress,
1327
+ oapp: ContractAddress,
1328
+ old_library: ContractAddress,
1329
+ new_library: ContractAddress,
1330
+ eid: u32,
1331
+ grace_period: u64,
1332
+ ) {
1333
+ // 0 grace period is a case where there won't be a timeout set, so can't be true
1334
+ if grace_period == 0 {
1335
+ return;
1336
+ }
1337
+
1338
+ let MessageLibManagerMock {
1339
+ message_lib_manager, dispatcher, ..,
1340
+ } = deploy_message_lib_manager(owner);
1341
+
1342
+ start_mock_call(old_library, selector!("is_supported_receive_eid"), true);
1343
+ start_mock_call(old_library, selector!("message_lib_type"), MessageLibType::Receive);
1344
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1345
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1346
+
1347
+ start_cheat_caller_address(message_lib_manager, owner);
1348
+ dispatcher.register_library(old_library);
1349
+ dispatcher.register_library(new_library);
1350
+ stop_cheat_caller_address(message_lib_manager);
1351
+
1352
+ start_cheat_caller_address(message_lib_manager, oapp);
1353
+ dispatcher.set_receive_library(oapp, eid, old_library, 0);
1354
+ dispatcher.set_receive_library(oapp, eid, new_library, grace_period);
1355
+ stop_cheat_caller_address(message_lib_manager);
1356
+
1357
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, old_library);
1358
+ assert(is_valid, 'should be valid in grace period');
1359
+ }
1360
+
1361
+
1362
+ #[test]
1363
+ #[fuzzer(runs: 1)]
1364
+ fn should_return_false_for_old_library_after_grace_period(
1365
+ owner: ContractAddress,
1366
+ oapp: ContractAddress,
1367
+ old_library: ContractAddress,
1368
+ new_library: ContractAddress,
1369
+ eid: u32,
1370
+ grace_period: u64,
1371
+ ) {
1372
+ // grace period == 0 is a special case and will become have a different timeout outcome
1373
+ if grace_period == 0 {
1374
+ return;
1375
+ }
1376
+
1377
+ let MessageLibManagerMock {
1378
+ message_lib_manager, dispatcher, ..,
1379
+ } = deploy_message_lib_manager(owner);
1380
+
1381
+ start_mock_call(old_library, selector!("is_supported_receive_eid"), true);
1382
+ start_mock_call(old_library, selector!("message_lib_type"), MessageLibType::Receive);
1383
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1384
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1385
+
1386
+ start_cheat_caller_address(message_lib_manager, owner);
1387
+ dispatcher.register_library(old_library);
1388
+ dispatcher.register_library(new_library);
1389
+ stop_cheat_caller_address(message_lib_manager);
1390
+
1391
+ // set block number to 0 so that grace period will be 0 + grace_period
1392
+ start_cheat_block_number(message_lib_manager, 0);
1393
+ start_cheat_caller_address(message_lib_manager, oapp);
1394
+ dispatcher.set_receive_library(oapp, eid, old_library, 0);
1395
+ dispatcher.set_receive_library(oapp, eid, new_library, grace_period);
1396
+ stop_cheat_caller_address(message_lib_manager);
1397
+ stop_cheat_block_number(message_lib_manager);
1398
+
1399
+ start_cheat_block_number(message_lib_manager, grace_period + 1);
1400
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, old_library);
1401
+ assert(!is_valid, 'should be invalid after grace');
1402
+ stop_cheat_block_number(message_lib_manager);
1403
+
1404
+ let timeout = dispatcher.get_receive_library_timeout(oapp, eid, old_library);
1405
+ let expected_timeout = Timeout { lib: old_library, expiry: grace_period };
1406
+ assert(timeout == expected_timeout, 'should be set');
1407
+ }
1408
+
1409
+ #[test]
1410
+ #[fuzzer(runs: 1)]
1411
+ fn should_return_false_for_old_library_after_grace_period_with_0_grace_period(
1412
+ owner: ContractAddress,
1413
+ oapp: ContractAddress,
1414
+ old_library: ContractAddress,
1415
+ new_library: ContractAddress,
1416
+ eid: u32,
1417
+ ) {
1418
+ let grace_period = 0;
1419
+
1420
+ let MessageLibManagerMock {
1421
+ message_lib_manager, dispatcher, ..,
1422
+ } = deploy_message_lib_manager(owner);
1423
+
1424
+ start_mock_call(old_library, selector!("is_supported_receive_eid"), true);
1425
+ start_mock_call(old_library, selector!("message_lib_type"), MessageLibType::Receive);
1426
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1427
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1428
+
1429
+ start_cheat_caller_address(message_lib_manager, owner);
1430
+ dispatcher.register_library(old_library);
1431
+ dispatcher.register_library(new_library);
1432
+ stop_cheat_caller_address(message_lib_manager);
1433
+
1434
+ // set block number to 0 so that grace period will be 0 + grace_period
1435
+ start_cheat_block_number(message_lib_manager, 0);
1436
+ start_cheat_caller_address(message_lib_manager, oapp);
1437
+ dispatcher.set_receive_library(oapp, eid, old_library, 0);
1438
+ dispatcher.set_receive_library(oapp, eid, new_library, grace_period);
1439
+ stop_cheat_caller_address(message_lib_manager);
1440
+ stop_cheat_block_number(message_lib_manager);
1441
+
1442
+ start_cheat_block_number(message_lib_manager, grace_period + 1);
1443
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, old_library);
1444
+ assert(!is_valid, 'should be invalid after grace');
1445
+ stop_cheat_block_number(message_lib_manager);
1446
+
1447
+ let timeout = dispatcher.get_receive_library_timeout(oapp, eid, old_library);
1448
+ let expected_timeout = Default::default();
1449
+ assert(timeout == expected_timeout, 'should be set');
1450
+ }
1451
+
1452
+ #[test]
1453
+ #[fuzzer(runs: 1)]
1454
+ fn should_return_true_for_old_default_library_in_grace_period(
1455
+ owner: ContractAddress,
1456
+ oapp: ContractAddress,
1457
+ old_library: ContractAddress,
1458
+ new_library: ContractAddress,
1459
+ eid: u32,
1460
+ grace_period: u64,
1461
+ ) {
1462
+ // 0 grace period is a special case and won't return true
1463
+ if grace_period == 0 {
1464
+ return;
1465
+ }
1466
+
1467
+ let MessageLibManagerMock {
1468
+ message_lib_manager, dispatcher, ..,
1469
+ } = deploy_message_lib_manager(owner);
1470
+
1471
+ start_mock_call(old_library, selector!("is_supported_receive_eid"), true);
1472
+ start_mock_call(old_library, selector!("message_lib_type"), MessageLibType::Receive);
1473
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1474
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1475
+
1476
+ start_cheat_caller_address(message_lib_manager, owner);
1477
+ dispatcher.register_library(old_library);
1478
+ dispatcher.register_library(new_library);
1479
+ stop_cheat_caller_address(message_lib_manager);
1480
+
1481
+ start_cheat_caller_address(message_lib_manager, owner);
1482
+ dispatcher.set_default_receive_library(eid, old_library, 0);
1483
+ dispatcher.set_default_receive_library(eid, new_library, grace_period);
1484
+ stop_cheat_caller_address(message_lib_manager);
1485
+
1486
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, old_library);
1487
+ assert(is_valid, 'should be valid in grace period');
1488
+ }
1489
+
1490
+ #[test]
1491
+ #[fuzzer(runs: 1)]
1492
+ fn should_return_false_for_old_default_library_after_grace_period(
1493
+ owner: ContractAddress,
1494
+ oapp: ContractAddress,
1495
+ old_library: ContractAddress,
1496
+ new_library: ContractAddress,
1497
+ eid: u32,
1498
+ grace_period: u64,
1499
+ ) {
1500
+ // 0 grace period is a special case and will have a different timeout outcome
1501
+ if grace_period == 0 {
1502
+ return;
1503
+ }
1504
+
1505
+ let MessageLibManagerMock {
1506
+ message_lib_manager, dispatcher, ..,
1507
+ } = deploy_message_lib_manager(owner);
1508
+
1509
+ start_mock_call(old_library, selector!("is_supported_receive_eid"), true);
1510
+ start_mock_call(old_library, selector!("message_lib_type"), MessageLibType::Receive);
1511
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1512
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1513
+
1514
+ start_cheat_caller_address(message_lib_manager, owner);
1515
+ dispatcher.register_library(old_library);
1516
+ dispatcher.register_library(new_library);
1517
+ stop_cheat_caller_address(message_lib_manager);
1518
+
1519
+ // set block number to 0 so that grace period will be 0 + grace_period
1520
+ start_cheat_block_number(message_lib_manager, 0);
1521
+ start_cheat_caller_address(message_lib_manager, owner);
1522
+ dispatcher.set_default_receive_library(eid, old_library, 0);
1523
+ dispatcher.set_default_receive_library(eid, new_library, grace_period);
1524
+ stop_cheat_caller_address(message_lib_manager);
1525
+
1526
+ start_cheat_block_number(message_lib_manager, grace_period + 1);
1527
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, old_library);
1528
+ assert(!is_valid, 'should be invalid after grace');
1529
+ stop_cheat_block_number(message_lib_manager);
1530
+
1531
+ let timeout = dispatcher.get_default_receive_library_timeout(eid);
1532
+ let expected_timeout = Timeout { lib: old_library, expiry: grace_period };
1533
+ assert(timeout == expected_timeout, 'should be set');
1534
+ }
1535
+
1536
+ #[test]
1537
+ #[fuzzer(runs: 1)]
1538
+ fn should_return_false_for_old_default_library_after_grace_period_with_0_grace_period(
1539
+ owner: ContractAddress,
1540
+ oapp: ContractAddress,
1541
+ old_library: ContractAddress,
1542
+ new_library: ContractAddress,
1543
+ eid: u32,
1544
+ ) {
1545
+ let grace_period = 0;
1546
+
1547
+ let MessageLibManagerMock {
1548
+ message_lib_manager, dispatcher, ..,
1549
+ } = deploy_message_lib_manager(owner);
1550
+
1551
+ start_mock_call(old_library, selector!("is_supported_receive_eid"), true);
1552
+ start_mock_call(old_library, selector!("message_lib_type"), MessageLibType::Receive);
1553
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1554
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1555
+
1556
+ start_cheat_caller_address(message_lib_manager, owner);
1557
+ dispatcher.register_library(old_library);
1558
+ dispatcher.register_library(new_library);
1559
+ stop_cheat_caller_address(message_lib_manager);
1560
+
1561
+ // set block number to 0 so that grace period will be 0 + grace_period
1562
+ start_cheat_block_number(message_lib_manager, 0);
1563
+ start_cheat_caller_address(message_lib_manager, owner);
1564
+ dispatcher.set_default_receive_library(eid, old_library, 0);
1565
+ dispatcher.set_default_receive_library(eid, new_library, grace_period);
1566
+ stop_cheat_caller_address(message_lib_manager);
1567
+
1568
+ start_cheat_block_number(message_lib_manager, grace_period + 1);
1569
+ let is_valid = dispatcher.is_valid_receive_library(oapp, eid, old_library);
1570
+ assert(!is_valid, 'should be invalid after grace');
1571
+ stop_cheat_block_number(message_lib_manager);
1572
+
1573
+ let timeout = dispatcher.get_default_receive_library_timeout(eid);
1574
+ let expected_timeout = Default::default();
1575
+ assert(timeout == expected_timeout, 'should be set');
1576
+ }
1577
+
1578
+ // =============================== Test Authorization Failures =================================
1579
+
1580
+ #[test]
1581
+ #[fuzzer(runs: 1)]
1582
+ #[feature("safe_dispatcher")]
1583
+ fn should_fail_to_set_send_library_when_not_authorized(
1584
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
1585
+ ) {
1586
+ let MessageLibManagerMock {
1587
+ message_lib_manager, safe_dispatcher, ..,
1588
+ } = deploy_message_lib_manager(owner);
1589
+
1590
+ // Mock call to supported eid
1591
+ start_mock_call(new_library, selector!("is_supported_send_eid"), true);
1592
+ // Mock call to message lib type
1593
+ let message_lib_type = MessageLibType::Send;
1594
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
1595
+
1596
+ // Register the library
1597
+ start_cheat_caller_address(message_lib_manager, owner);
1598
+ safe_dispatcher.register_library(new_library).unwrap();
1599
+ stop_cheat_caller_address(message_lib_manager);
1600
+
1601
+ // Enable authorization throwing
1602
+ let mock_helpers = IMockManagerHelpersDispatcher { contract_address: message_lib_manager };
1603
+ mock_helpers.set_throw_on_authorize(true);
1604
+
1605
+ // Try to set the send library - should fail due to authorization
1606
+ start_cheat_caller_address(message_lib_manager, oapp);
1607
+ let res = safe_dispatcher.set_send_library(oapp, eid, new_library);
1608
+ stop_cheat_caller_address(message_lib_manager);
1609
+
1610
+ assert_panic_with_error(res, err_not_authorized());
1611
+ }
1612
+
1613
+ #[test]
1614
+ #[fuzzer(runs: 1)]
1615
+ #[feature("safe_dispatcher")]
1616
+ fn should_fail_to_set_receive_library_when_not_authorized(
1617
+ owner: ContractAddress, new_library: ContractAddress, eid: u32, oapp: ContractAddress,
1618
+ ) {
1619
+ let MessageLibManagerMock {
1620
+ message_lib_manager, safe_dispatcher, ..,
1621
+ } = deploy_message_lib_manager(owner);
1622
+
1623
+ // Mock call to supported eid
1624
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1625
+ // Mock call to message lib type
1626
+ let message_lib_type = MessageLibType::Receive;
1627
+ start_mock_call(new_library, selector!("message_lib_type"), message_lib_type);
1628
+
1629
+ // Register the library
1630
+ start_cheat_caller_address(message_lib_manager, owner);
1631
+ safe_dispatcher.register_library(new_library).unwrap();
1632
+ stop_cheat_caller_address(message_lib_manager);
1633
+
1634
+ // Enable authorization throwing
1635
+ let mock_helpers = IMockManagerHelpersDispatcher { contract_address: message_lib_manager };
1636
+ mock_helpers.set_throw_on_authorize(true);
1637
+
1638
+ // Try to set the receive library - should fail due to authorization
1639
+ start_cheat_caller_address(message_lib_manager, oapp);
1640
+ let res = safe_dispatcher.set_receive_library(oapp, eid, new_library, 0);
1641
+ stop_cheat_caller_address(message_lib_manager);
1642
+
1643
+ assert_panic_with_error(res, err_not_authorized());
1644
+ }
1645
+
1646
+ #[test]
1647
+ #[fuzzer(runs: 1)]
1648
+ #[feature("safe_dispatcher")]
1649
+ fn should_fail_to_set_receive_library_timeout_when_not_authorized(
1650
+ owner: ContractAddress,
1651
+ new_library: ContractAddress,
1652
+ eid: u32,
1653
+ oapp: ContractAddress,
1654
+ expiry: u64,
1655
+ ) {
1656
+ // Skip expiry == 0, its special case and is tested elsewhere
1657
+ if expiry == 0 {
1658
+ return;
1659
+ }
1660
+
1661
+ let MessageLibManagerMock {
1662
+ message_lib_manager, safe_dispatcher, ..,
1663
+ } = deploy_message_lib_manager(owner);
1664
+
1665
+ // Mock calls
1666
+ start_mock_call(new_library, selector!("is_supported_receive_eid"), true);
1667
+ start_mock_call(new_library, selector!("message_lib_type"), MessageLibType::Receive);
1668
+
1669
+ // Register the library
1670
+ start_cheat_caller_address(message_lib_manager, owner);
1671
+ safe_dispatcher.register_library(new_library).unwrap();
1672
+ stop_cheat_caller_address(message_lib_manager);
1673
+
1674
+ // Set the receive library for the oapp first (without authorization throwing)
1675
+ start_cheat_caller_address(message_lib_manager, oapp);
1676
+ safe_dispatcher.set_receive_library(oapp, eid, new_library, 0).unwrap();
1677
+ stop_cheat_caller_address(message_lib_manager);
1678
+
1679
+ // Enable authorization throwing
1680
+ let mock_helpers = IMockManagerHelpersDispatcher { contract_address: message_lib_manager };
1681
+ mock_helpers.set_throw_on_authorize(true);
1682
+
1683
+ start_cheat_block_number(message_lib_manager, 1);
1684
+
1685
+ // Try to set the receive library timeout - should fail due to authorization
1686
+ start_cheat_caller_address(message_lib_manager, oapp);
1687
+ let res = safe_dispatcher.set_receive_library_timeout(oapp, eid, new_library, expiry);
1688
+ stop_cheat_caller_address(message_lib_manager);
1689
+
1690
+ stop_cheat_block_number(message_lib_manager);
1691
+
1692
+ assert_panic_with_error(res, err_not_authorized());
1693
+ }
1694
+
1695
+ // =============================== Test Set Send Config =================================
1696
+
1697
+ #[test]
1698
+ #[fuzzer(runs: 1)]
1699
+ fn should_set_send_config_with_uln_config(
1700
+ owner: ContractAddress, library: ContractAddress, eid: u32, oapp: ContractAddress,
1701
+ ) {
1702
+ let MessageLibManagerMock {
1703
+ message_lib_manager, dispatcher, ..,
1704
+ } = deploy_message_lib_manager(owner);
1705
+
1706
+ // Mock call to message lib type
1707
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Send);
1708
+
1709
+ // Register the library
1710
+ start_cheat_caller_address(message_lib_manager, owner);
1711
+ dispatcher.register_library(library);
1712
+ stop_cheat_caller_address(message_lib_manager);
1713
+
1714
+ // Create ULN config parameter
1715
+ let uln_config = create_test_uln_config();
1716
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
1717
+ let params = array![config_param];
1718
+
1719
+ // Mock the set_send_config call on the library
1720
+ start_mock_call(library, selector!("set_send_config"), ());
1721
+
1722
+ // Set the send config
1723
+ start_cheat_caller_address(message_lib_manager, oapp);
1724
+ dispatcher.set_send_config(oapp, library, params);
1725
+ stop_cheat_caller_address(message_lib_manager);
1726
+ }
1727
+
1728
+ #[test]
1729
+ #[fuzzer(runs: 1)]
1730
+ fn should_set_send_config_with_executor_config(
1731
+ owner: ContractAddress,
1732
+ library: ContractAddress,
1733
+ eid: u32,
1734
+ oapp: ContractAddress,
1735
+ executor: ContractAddress,
1736
+ ) {
1737
+ let MessageLibManagerMock {
1738
+ message_lib_manager, dispatcher, ..,
1739
+ } = deploy_message_lib_manager(owner);
1740
+
1741
+ // Mock call to message lib type
1742
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Send);
1743
+
1744
+ // Register the library
1745
+ start_cheat_caller_address(message_lib_manager, owner);
1746
+ dispatcher.register_library(library);
1747
+ stop_cheat_caller_address(message_lib_manager);
1748
+
1749
+ // Create executor config parameter
1750
+ let executor_config = create_test_executor_config(executor);
1751
+ let config_param = create_executor_config_param(eid, oapp, executor_config);
1752
+ let params = array![config_param];
1753
+
1754
+ // Mock the set_send_config call on the library
1755
+ start_mock_call(library, selector!("set_send_config"), ());
1756
+
1757
+ // Set the send config
1758
+ start_cheat_caller_address(message_lib_manager, oapp);
1759
+ dispatcher.set_send_config(oapp, library, params);
1760
+ stop_cheat_caller_address(message_lib_manager);
1761
+ }
1762
+
1763
+ #[test]
1764
+ #[fuzzer(runs: 1)]
1765
+ fn should_set_send_config_with_multiple_params(
1766
+ owner: ContractAddress,
1767
+ library: ContractAddress,
1768
+ eid1: u32,
1769
+ eid2: u32,
1770
+ oapp: ContractAddress,
1771
+ executor: ContractAddress,
1772
+ ) {
1773
+ let MessageLibManagerMock {
1774
+ message_lib_manager, dispatcher, ..,
1775
+ } = deploy_message_lib_manager(owner);
1776
+
1777
+ // Mock call to message lib type
1778
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Send);
1779
+
1780
+ // Register the library
1781
+ start_cheat_caller_address(message_lib_manager, owner);
1782
+ dispatcher.register_library(library);
1783
+ stop_cheat_caller_address(message_lib_manager);
1784
+
1785
+ // Create multiple config parameters
1786
+ let uln_config = create_test_uln_config();
1787
+ let executor_config = create_test_executor_config(executor);
1788
+ let uln_param = create_uln_config_param(eid1, oapp, uln_config);
1789
+ let executor_param = create_executor_config_param(eid2, oapp, executor_config);
1790
+ let params = array![uln_param, executor_param];
1791
+
1792
+ // Mock the set_send_config call on the library
1793
+ start_mock_call(library, selector!("set_send_config"), ());
1794
+
1795
+ // Set the send config
1796
+ start_cheat_caller_address(message_lib_manager, oapp);
1797
+ dispatcher.set_send_config(oapp, library, params);
1798
+ stop_cheat_caller_address(message_lib_manager);
1799
+ }
1800
+
1801
+ #[test]
1802
+ #[fuzzer(runs: 1)]
1803
+ #[feature("safe_dispatcher")]
1804
+ fn should_fail_to_set_send_config_when_not_registered(
1805
+ owner: ContractAddress, unregistered_library: ContractAddress, eid: u32, oapp: ContractAddress,
1806
+ ) {
1807
+ let MessageLibManagerMock {
1808
+ message_lib_manager, safe_dispatcher, ..,
1809
+ } = deploy_message_lib_manager(owner);
1810
+
1811
+ // Create config parameter
1812
+ let uln_config = create_test_uln_config();
1813
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
1814
+ let params = array![config_param];
1815
+
1816
+ // Try to set config on unregistered library
1817
+ start_cheat_caller_address(message_lib_manager, oapp);
1818
+ let res = safe_dispatcher.set_send_config(oapp, unregistered_library, params);
1819
+ stop_cheat_caller_address(message_lib_manager);
1820
+
1821
+ assert_panic_with_error(res, err_only_registered_lib());
1822
+ }
1823
+
1824
+ #[test]
1825
+ #[fuzzer(runs: 1)]
1826
+ #[feature("safe_dispatcher")]
1827
+ fn should_fail_to_set_send_config_when_not_send_lib(
1828
+ owner: ContractAddress, library: ContractAddress, eid: u32, oapp: ContractAddress,
1829
+ ) {
1830
+ let MessageLibManagerMock {
1831
+ message_lib_manager, safe_dispatcher, ..,
1832
+ } = deploy_message_lib_manager(owner);
1833
+
1834
+ // Mock call to message lib type (not a send library)
1835
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Receive);
1836
+
1837
+ // Register the library
1838
+ start_cheat_caller_address(message_lib_manager, owner);
1839
+ safe_dispatcher.register_library(library).unwrap();
1840
+ stop_cheat_caller_address(message_lib_manager);
1841
+
1842
+ // Create config parameter
1843
+ let uln_config = create_test_uln_config();
1844
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
1845
+ let params = array![config_param];
1846
+
1847
+ // Try to set send config on receive library
1848
+ start_cheat_caller_address(message_lib_manager, oapp);
1849
+ let res = safe_dispatcher.set_send_config(oapp, library, params);
1850
+ stop_cheat_caller_address(message_lib_manager);
1851
+
1852
+ assert_panic_with_error(res, err_only_send_lib());
1853
+ }
1854
+
1855
+ #[test]
1856
+ #[fuzzer(runs: 1)]
1857
+ #[feature("safe_dispatcher")]
1858
+ fn should_fail_to_set_send_config_when_not_authorized(
1859
+ owner: ContractAddress, library: ContractAddress, eid: u32, oapp: ContractAddress,
1860
+ ) {
1861
+ let MessageLibManagerMock {
1862
+ message_lib_manager, safe_dispatcher, ..,
1863
+ } = deploy_message_lib_manager(owner);
1864
+
1865
+ // Mock call to message lib type
1866
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Send);
1867
+
1868
+ // Register the library
1869
+ start_cheat_caller_address(message_lib_manager, owner);
1870
+ safe_dispatcher.register_library(library).unwrap();
1871
+ stop_cheat_caller_address(message_lib_manager);
1872
+
1873
+ // Enable authorization throwing
1874
+ let mock_helpers = IMockManagerHelpersDispatcher { contract_address: message_lib_manager };
1875
+ mock_helpers.set_throw_on_authorize(true);
1876
+
1877
+ // Create config parameter
1878
+ let uln_config = create_test_uln_config();
1879
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
1880
+ let params = array![config_param];
1881
+
1882
+ // Try to set send config - should fail due to authorization
1883
+ start_cheat_caller_address(message_lib_manager, oapp);
1884
+ let res = safe_dispatcher.set_send_config(oapp, library, params);
1885
+ stop_cheat_caller_address(message_lib_manager);
1886
+
1887
+ assert_panic_with_error(res, err_not_authorized());
1888
+ }
1889
+
1890
+ // =============================== Test Set Receive Config =================================
1891
+
1892
+ #[test]
1893
+ #[fuzzer(runs: 1)]
1894
+ fn should_set_receive_config_with_uln_config(
1895
+ owner: ContractAddress, library: ContractAddress, eid: u32, oapp: ContractAddress,
1896
+ ) {
1897
+ let MessageLibManagerMock {
1898
+ message_lib_manager, dispatcher, ..,
1899
+ } = deploy_message_lib_manager(owner);
1900
+
1901
+ // Mock call to message lib type
1902
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Receive);
1903
+
1904
+ // Register the library
1905
+ start_cheat_caller_address(message_lib_manager, owner);
1906
+ dispatcher.register_library(library);
1907
+ stop_cheat_caller_address(message_lib_manager);
1908
+
1909
+ // Create ULN config parameter
1910
+ let uln_config = create_test_uln_config();
1911
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
1912
+ let params = array![config_param];
1913
+
1914
+ // Mock the set_receive_config call on the library
1915
+ start_mock_call(library, selector!("set_receive_config"), ());
1916
+
1917
+ // Set the receive config
1918
+ start_cheat_caller_address(message_lib_manager, oapp);
1919
+ dispatcher.set_receive_config(oapp, library, params);
1920
+ stop_cheat_caller_address(message_lib_manager);
1921
+ }
1922
+
1923
+ #[test]
1924
+ #[fuzzer(runs: 1)]
1925
+ fn should_set_receive_config_with_multiple_params(
1926
+ owner: ContractAddress, library: ContractAddress, eid1: u32, eid2: u32, oapp: ContractAddress,
1927
+ ) {
1928
+ let MessageLibManagerMock {
1929
+ message_lib_manager, dispatcher, ..,
1930
+ } = deploy_message_lib_manager(owner);
1931
+
1932
+ // Mock call to message lib type
1933
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Receive);
1934
+
1935
+ // Register the library
1936
+ start_cheat_caller_address(message_lib_manager, owner);
1937
+ dispatcher.register_library(library);
1938
+ stop_cheat_caller_address(message_lib_manager);
1939
+
1940
+ // Create multiple ULN config parameters
1941
+ let uln_config1 = create_test_uln_config();
1942
+ let uln_config2 = UlnConfig {
1943
+ confirmations: 20,
1944
+ has_confirmations: true,
1945
+ required_dvns: array![],
1946
+ has_required_dvns: false,
1947
+ optional_dvns: array![],
1948
+ optional_dvn_threshold: 0,
1949
+ has_optional_dvns: false,
1950
+ };
1951
+ let param1 = create_uln_config_param(eid1, oapp, uln_config1);
1952
+ let param2 = create_uln_config_param(eid2, oapp, uln_config2);
1953
+ let params = array![param1, param2];
1954
+
1955
+ // Mock the set_receive_config call on the library
1956
+ start_mock_call(library, selector!("set_receive_config"), ());
1957
+
1958
+ // Set the receive config
1959
+ start_cheat_caller_address(message_lib_manager, oapp);
1960
+ dispatcher.set_receive_config(oapp, library, params);
1961
+ stop_cheat_caller_address(message_lib_manager);
1962
+ }
1963
+
1964
+ #[test]
1965
+ #[fuzzer(runs: 1)]
1966
+ #[feature("safe_dispatcher")]
1967
+ fn should_fail_to_set_receive_config_when_not_registered(
1968
+ owner: ContractAddress, unregistered_library: ContractAddress, eid: u32, oapp: ContractAddress,
1969
+ ) {
1970
+ let MessageLibManagerMock {
1971
+ message_lib_manager, safe_dispatcher, ..,
1972
+ } = deploy_message_lib_manager(owner);
1973
+
1974
+ // Create config parameter
1975
+ let uln_config = create_test_uln_config();
1976
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
1977
+ let params = array![config_param];
1978
+
1979
+ // Try to set config on unregistered library
1980
+ start_cheat_caller_address(message_lib_manager, oapp);
1981
+ let res = safe_dispatcher.set_receive_config(oapp, unregistered_library, params);
1982
+ stop_cheat_caller_address(message_lib_manager);
1983
+
1984
+ assert_panic_with_error(res, err_only_registered_lib());
1985
+ }
1986
+
1987
+ #[test]
1988
+ #[fuzzer(runs: 1)]
1989
+ #[feature("safe_dispatcher")]
1990
+ fn should_fail_to_set_receive_config_when_not_receive_lib(
1991
+ owner: ContractAddress, library: ContractAddress, eid: u32, oapp: ContractAddress,
1992
+ ) {
1993
+ let MessageLibManagerMock {
1994
+ message_lib_manager, safe_dispatcher, ..,
1995
+ } = deploy_message_lib_manager(owner);
1996
+
1997
+ // Mock call to message lib type (not a receive library)
1998
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Send);
1999
+
2000
+ // Register the library
2001
+ start_cheat_caller_address(message_lib_manager, owner);
2002
+ safe_dispatcher.register_library(library).unwrap();
2003
+ stop_cheat_caller_address(message_lib_manager);
2004
+
2005
+ // Create config parameter
2006
+ let uln_config = create_test_uln_config();
2007
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
2008
+ let params = array![config_param];
2009
+
2010
+ // Try to set receive config on send library
2011
+ start_cheat_caller_address(message_lib_manager, oapp);
2012
+ let res = safe_dispatcher.set_receive_config(oapp, library, params);
2013
+ stop_cheat_caller_address(message_lib_manager);
2014
+
2015
+ assert_panic_with_error(res, err_only_receive_lib());
2016
+ }
2017
+
2018
+ #[test]
2019
+ #[fuzzer(runs: 1)]
2020
+ #[feature("safe_dispatcher")]
2021
+ fn should_fail_to_set_receive_config_when_not_authorized(
2022
+ owner: ContractAddress, library: ContractAddress, eid: u32, oapp: ContractAddress,
2023
+ ) {
2024
+ let MessageLibManagerMock {
2025
+ message_lib_manager, safe_dispatcher, ..,
2026
+ } = deploy_message_lib_manager(owner);
2027
+
2028
+ // Mock call to message lib type
2029
+ start_mock_call(library, selector!("message_lib_type"), MessageLibType::Receive);
2030
+
2031
+ // Register the library
2032
+ start_cheat_caller_address(message_lib_manager, owner);
2033
+ safe_dispatcher.register_library(library).unwrap();
2034
+ stop_cheat_caller_address(message_lib_manager);
2035
+
2036
+ // Enable authorization throwing
2037
+ let mock_helpers = IMockManagerHelpersDispatcher { contract_address: message_lib_manager };
2038
+ mock_helpers.set_throw_on_authorize(true);
2039
+
2040
+ // Create config parameter
2041
+ let uln_config = create_test_uln_config();
2042
+ let config_param = create_uln_config_param(eid, oapp, uln_config);
2043
+ let params = array![config_param];
2044
+
2045
+ // Try to set receive config - should fail due to authorization
2046
+ start_cheat_caller_address(message_lib_manager, oapp);
2047
+ let res = safe_dispatcher.set_receive_config(oapp, library, params);
2048
+ stop_cheat_caller_address(message_lib_manager);
2049
+
2050
+ assert_panic_with_error(res, err_not_authorized());
2051
+ }