@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.
- package/.turbo/turbo-build.log +186 -0
- package/.turbo/turbo-lint.log +71 -0
- package/.turbo/turbo-test.log +937 -0
- package/README.md +41 -0
- package/Scarb.lock +211 -0
- package/Scarb.toml +2 -0
- package/dist/4XD3ZRZ4.cjs +301 -0
- package/dist/4XD3ZRZ4.cjs.map +1 -0
- package/dist/4Z5IPBC3.js +299 -0
- package/dist/4Z5IPBC3.js.map +1 -0
- package/dist/5NEZDLVQ.cjs +474 -0
- package/dist/5NEZDLVQ.cjs.map +1 -0
- package/dist/6JYCOKDE.js +472 -0
- package/dist/6JYCOKDE.js.map +1 -0
- package/dist/7C4PFMIZ.cjs +1288 -0
- package/dist/7C4PFMIZ.cjs.map +1 -0
- package/dist/7ZSGGZUE.js +1229 -0
- package/dist/7ZSGGZUE.js.map +1 -0
- package/dist/ARHOGUYH.cjs +2136 -0
- package/dist/ARHOGUYH.cjs.map +1 -0
- package/dist/CRCRIUFX.js +1264 -0
- package/dist/CRCRIUFX.js.map +1 -0
- package/dist/DB7CQSED.cjs +430 -0
- package/dist/DB7CQSED.cjs.map +1 -0
- package/dist/DFXLWHYP.cjs +1266 -0
- package/dist/DFXLWHYP.cjs.map +1 -0
- package/dist/EOLZCMCK.js +988 -0
- package/dist/EOLZCMCK.js.map +1 -0
- package/dist/FFDPTOWG.cjs +331 -0
- package/dist/FFDPTOWG.cjs.map +1 -0
- package/dist/FOJGEAIO.js +2134 -0
- package/dist/FOJGEAIO.js.map +1 -0
- package/dist/IWIUMVGB.js +629 -0
- package/dist/IWIUMVGB.js.map +1 -0
- package/dist/MUEN6AWV.cjs +697 -0
- package/dist/MUEN6AWV.cjs.map +1 -0
- package/dist/ORE6VBZ4.cjs +990 -0
- package/dist/ORE6VBZ4.cjs.map +1 -0
- package/dist/OUFKWPZ7.js +732 -0
- package/dist/OUFKWPZ7.js.map +1 -0
- package/dist/T2QTYQXJ.js +1229 -0
- package/dist/T2QTYQXJ.js.map +1 -0
- package/dist/UPJTM7BR.cjs +631 -0
- package/dist/UPJTM7BR.cjs.map +1 -0
- package/dist/VNVNX2P3.cjs +1231 -0
- package/dist/VNVNX2P3.cjs.map +1 -0
- package/dist/VUOMXK5T.js +6 -0
- package/dist/VUOMXK5T.js.map +1 -0
- package/dist/WISWRTDG.js +1286 -0
- package/dist/WISWRTDG.js.map +1 -0
- package/dist/WU5L7YIQ.cjs +1231 -0
- package/dist/WU5L7YIQ.cjs.map +1 -0
- package/dist/X3B5JDMZ.js +695 -0
- package/dist/X3B5JDMZ.js.map +1 -0
- package/dist/XYNBDBBV.cjs +297 -0
- package/dist/XYNBDBBV.cjs.map +1 -0
- package/dist/Y5JFPCYJ.cjs +734 -0
- package/dist/Y5JFPCYJ.cjs.map +1 -0
- package/dist/YEHL7IYO.js +295 -0
- package/dist/YEHL7IYO.js.map +1 -0
- package/dist/YJF4D23A.cjs +8 -0
- package/dist/YJF4D23A.cjs.map +1 -0
- package/dist/YTS44OEA.js +428 -0
- package/dist/YTS44OEA.js.map +1 -0
- package/dist/Z2NIUZMW.js +329 -0
- package/dist/Z2NIUZMW.js.map +1 -0
- package/dist/abis/blocked-message-lib.cjs +13 -0
- package/dist/abis/blocked-message-lib.cjs.map +1 -0
- package/dist/abis/blocked-message-lib.d.ts +338 -0
- package/dist/abis/blocked-message-lib.d.ts.map +1 -0
- package/dist/abis/blocked-message-lib.js +4 -0
- package/dist/abis/blocked-message-lib.js.map +1 -0
- package/dist/abis/dvn-fee-lib.cjs +13 -0
- package/dist/abis/dvn-fee-lib.cjs.map +1 -0
- package/dist/abis/dvn-fee-lib.d.ts +214 -0
- package/dist/abis/dvn-fee-lib.d.ts.map +1 -0
- package/dist/abis/dvn-fee-lib.js +4 -0
- package/dist/abis/dvn-fee-lib.js.map +1 -0
- package/dist/abis/dvn.cjs +13 -0
- package/dist/abis/dvn.cjs.map +1 -0
- package/dist/abis/dvn.d.ts +952 -0
- package/dist/abis/dvn.d.ts.map +1 -0
- package/dist/abis/dvn.js +4 -0
- package/dist/abis/dvn.js.map +1 -0
- package/dist/abis/endpoint-v2.cjs +13 -0
- package/dist/abis/endpoint-v2.cjs.map +1 -0
- package/dist/abis/endpoint-v2.d.ts +1580 -0
- package/dist/abis/endpoint-v2.d.ts.map +1 -0
- package/dist/abis/endpoint-v2.js +4 -0
- package/dist/abis/endpoint-v2.js.map +1 -0
- package/dist/abis/executor-fee-lib.cjs +13 -0
- package/dist/abis/executor-fee-lib.cjs.map +1 -0
- package/dist/abis/executor-fee-lib.d.ts +217 -0
- package/dist/abis/executor-fee-lib.d.ts.map +1 -0
- package/dist/abis/executor-fee-lib.js +4 -0
- package/dist/abis/executor-fee-lib.js.map +1 -0
- package/dist/abis/executor.cjs +13 -0
- package/dist/abis/executor.cjs.map +1 -0
- package/dist/abis/executor.d.ts +914 -0
- package/dist/abis/executor.d.ts.map +1 -0
- package/dist/abis/executor.js +4 -0
- package/dist/abis/executor.js.map +1 -0
- package/dist/abis/o-app.cjs +13 -0
- package/dist/abis/o-app.cjs.map +1 -0
- package/dist/abis/o-app.d.ts +311 -0
- package/dist/abis/o-app.d.ts.map +1 -0
- package/dist/abis/o-app.js +4 -0
- package/dist/abis/o-app.js.map +1 -0
- package/dist/abis/oft-adapter.cjs +13 -0
- package/dist/abis/oft-adapter.cjs.map +1 -0
- package/dist/abis/oft-adapter.d.ts +722 -0
- package/dist/abis/oft-adapter.d.ts.map +1 -0
- package/dist/abis/oft-adapter.js +4 -0
- package/dist/abis/oft-adapter.js.map +1 -0
- package/dist/abis/oft.cjs +13 -0
- package/dist/abis/oft.cjs.map +1 -0
- package/dist/abis/oft.d.ts +922 -0
- package/dist/abis/oft.d.ts.map +1 -0
- package/dist/abis/oft.js +4 -0
- package/dist/abis/oft.js.map +1 -0
- package/dist/abis/omni-counter.cjs +13 -0
- package/dist/abis/omni-counter.cjs.map +1 -0
- package/dist/abis/omni-counter.d.ts +459 -0
- package/dist/abis/omni-counter.d.ts.map +1 -0
- package/dist/abis/omni-counter.js +4 -0
- package/dist/abis/omni-counter.js.map +1 -0
- package/dist/abis/price-feed.cjs +13 -0
- package/dist/abis/price-feed.cjs.map +1 -0
- package/dist/abis/price-feed.d.ts +505 -0
- package/dist/abis/price-feed.d.ts.map +1 -0
- package/dist/abis/price-feed.js +4 -0
- package/dist/abis/price-feed.js.map +1 -0
- package/dist/abis/simple-message-lib.cjs +13 -0
- package/dist/abis/simple-message-lib.cjs.map +1 -0
- package/dist/abis/simple-message-lib.d.ts +535 -0
- package/dist/abis/simple-message-lib.d.ts.map +1 -0
- package/dist/abis/simple-message-lib.js +4 -0
- package/dist/abis/simple-message-lib.js.map +1 -0
- package/dist/abis/treasury.cjs +13 -0
- package/dist/abis/treasury.cjs.map +1 -0
- package/dist/abis/treasury.d.ts +240 -0
- package/dist/abis/treasury.d.ts.map +1 -0
- package/dist/abis/treasury.js +4 -0
- package/dist/abis/treasury.js.map +1 -0
- package/dist/abis/ultra-light-node.cjs +13 -0
- package/dist/abis/ultra-light-node.cjs.map +1 -0
- package/dist/abis/ultra-light-node.d.ts +900 -0
- package/dist/abis/ultra-light-node.d.ts.map +1 -0
- package/dist/abis/ultra-light-node.js +4 -0
- package/dist/abis/ultra-light-node.js.map +1 -0
- package/dist/index.cjs +78 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +17 -0
- package/dist/index.js.map +1 -0
- package/dist/scripts/build-abi.cjs +28 -0
- package/dist/scripts/build-abi.cjs.map +1 -0
- package/dist/scripts/build-abi.d.ts +2 -0
- package/dist/scripts/build-abi.d.ts.map +1 -0
- package/dist/scripts/build-abi.js +26 -0
- package/dist/scripts/build-abi.js.map +1 -0
- package/layerzero/README.md +244 -0
- package/layerzero/Scarb.lock +203 -0
- package/layerzero/Scarb.toml +30 -0
- package/layerzero/snfoundry.toml +11 -0
- package/layerzero/src/common/constants.cairo +26 -0
- package/layerzero/src/common/conversions.cairo +16 -0
- package/layerzero/src/common/guid.cairo +20 -0
- package/layerzero/src/common/packet_v1_codec.cairo +307 -0
- package/layerzero/src/common/structs/messaging.cairo +40 -0
- package/layerzero/src/common/structs/packet.cairo +31 -0
- package/layerzero/src/endpoint/constants.cairo +14 -0
- package/layerzero/src/endpoint/endpoint.cairo +688 -0
- package/layerzero/src/endpoint/errors.cairo +108 -0
- package/layerzero/src/endpoint/events.cairo +124 -0
- package/layerzero/src/endpoint/interfaces/endpoint.cairo +286 -0
- package/layerzero/src/endpoint/interfaces/layerzero_composer.cairo +62 -0
- package/layerzero/src/endpoint/interfaces/layerzero_receiver.cairo +63 -0
- package/layerzero/src/endpoint/message_lib_manager/errors.cairo +95 -0
- package/layerzero/src/endpoint/message_lib_manager/events.cairo +90 -0
- package/layerzero/src/endpoint/message_lib_manager/interface.cairo +449 -0
- package/layerzero/src/endpoint/message_lib_manager/message_lib_manager.cairo +720 -0
- package/layerzero/src/endpoint/message_lib_manager/structs.cairo +33 -0
- package/layerzero/src/endpoint/messaging_channel/errors.cairo +37 -0
- package/layerzero/src/endpoint/messaging_channel/events.cairo +58 -0
- package/layerzero/src/endpoint/messaging_channel/interface.cairo +171 -0
- package/layerzero/src/endpoint/messaging_channel/messaging_channel.cairo +453 -0
- package/layerzero/src/endpoint/messaging_composer/errors.cairo +46 -0
- package/layerzero/src/endpoint/messaging_composer/events.cairo +67 -0
- package/layerzero/src/endpoint/messaging_composer/interface.cairo +132 -0
- package/layerzero/src/endpoint/messaging_composer/messaging_composer.cairo +223 -0
- package/layerzero/src/lib.cairo +189 -0
- package/layerzero/src/message_lib/blocked_message_lib.cairo +114 -0
- package/layerzero/src/message_lib/interface.cairo +63 -0
- package/layerzero/src/message_lib/sml/errors.cairo +23 -0
- package/layerzero/src/message_lib/sml/events.cairo +32 -0
- package/layerzero/src/message_lib/sml/simple_message_lib.cairo +312 -0
- package/layerzero/src/message_lib/structs.cairo +22 -0
- package/layerzero/src/message_lib/uln/errors.cairo +128 -0
- package/layerzero/src/message_lib/uln/events.cairo +97 -0
- package/layerzero/src/message_lib/uln/interface.cairo +83 -0
- package/layerzero/src/message_lib/uln/options.cairo +64 -0
- package/layerzero/src/message_lib/uln/structs/executor_config.cairo +35 -0
- package/layerzero/src/message_lib/uln/structs/payment_info.cairo +7 -0
- package/layerzero/src/message_lib/uln/structs/uln_config.cairo +155 -0
- package/layerzero/src/message_lib/uln/structs/uln_config_storage_node.cairo +91 -0
- package/layerzero/src/message_lib/uln/structs/verification.cairo +7 -0
- package/layerzero/src/message_lib/uln/ultra_light_node.cairo +965 -0
- package/layerzero/src/oapps/common/oapp_options_type_3/errors.cairo +22 -0
- package/layerzero/src/oapps/common/oapp_options_type_3/events.cairo +6 -0
- package/layerzero/src/oapps/common/oapp_options_type_3/interface.cairo +34 -0
- package/layerzero/src/oapps/common/oapp_options_type_3/oapp_options_type_3.cairo +120 -0
- package/layerzero/src/oapps/common/oapp_options_type_3/structs.cairo +6 -0
- package/layerzero/src/oapps/counter/constants.cairo +3 -0
- package/layerzero/src/oapps/counter/counter.cairo +170 -0
- package/layerzero/src/oapps/counter/interface.cairo +27 -0
- package/layerzero/src/oapps/counter/structs.cairo +20 -0
- package/layerzero/src/oapps/message_inspector/interface.cairo +21 -0
- package/layerzero/src/oapps/oapp/errors.cairo +72 -0
- package/layerzero/src/oapps/oapp/events.cairo +9 -0
- package/layerzero/src/oapps/oapp/interface.cairo +67 -0
- package/layerzero/src/oapps/oapp/oapp.cairo +70 -0
- package/layerzero/src/oapps/oapp/oapp_core.cairo +448 -0
- package/layerzero/src/oapps/oft/errors.cairo +42 -0
- package/layerzero/src/oapps/oft/events.cairo +33 -0
- package/layerzero/src/oapps/oft/interface.cairo +87 -0
- package/layerzero/src/oapps/oft/oft.cairo +188 -0
- package/layerzero/src/oapps/oft/oft_adapter.cairo +175 -0
- package/layerzero/src/oapps/oft/oft_compose_msg_codec.cairo +128 -0
- package/layerzero/src/oapps/oft/oft_core.cairo +542 -0
- package/layerzero/src/oapps/oft/oft_msg_codec.cairo +131 -0
- package/layerzero/src/oapps/oft/structs.cairo +72 -0
- package/layerzero/src/treasury/errors.cairo +22 -0
- package/layerzero/src/treasury/events.cairo +5 -0
- package/layerzero/src/treasury/interfaces/layerzero_treasury.cairo +54 -0
- package/layerzero/src/treasury/interfaces/lz_token_fee_lib.cairo +45 -0
- package/layerzero/src/treasury/interfaces/treasury_admin.cairo +39 -0
- package/layerzero/src/treasury/treasury.cairo +140 -0
- package/layerzero/src/workers/access_control.cairo +11 -0
- package/layerzero/src/workers/base/base.cairo +238 -0
- package/layerzero/src/workers/base/errors.cairo +24 -0
- package/layerzero/src/workers/base/events.cairo +43 -0
- package/layerzero/src/workers/base/interface.cairo +93 -0
- package/layerzero/src/workers/base/structs.cairo +10 -0
- package/layerzero/src/workers/common.cairo +59 -0
- package/layerzero/src/workers/dvn/constants.cairo +11 -0
- package/layerzero/src/workers/dvn/dvn.cairo +338 -0
- package/layerzero/src/workers/dvn/errors.cairo +80 -0
- package/layerzero/src/workers/dvn/events.cairo +30 -0
- package/layerzero/src/workers/dvn/fee_lib/dvn_fee_lib.cairo +152 -0
- package/layerzero/src/workers/dvn/fee_lib/interface.cairo +45 -0
- package/layerzero/src/workers/dvn/interface.cairo +131 -0
- package/layerzero/src/workers/dvn/options.cairo +125 -0
- package/layerzero/src/workers/dvn/structs.cairo +51 -0
- package/layerzero/src/workers/executor/errors.cairo +159 -0
- package/layerzero/src/workers/executor/events.cairo +32 -0
- package/layerzero/src/workers/executor/executor.cairo +392 -0
- package/layerzero/src/workers/executor/fee_lib/executor_fee_lib.cairo +160 -0
- package/layerzero/src/workers/executor/fee_lib/interface.cairo +87 -0
- package/layerzero/src/workers/executor/interface.cairo +131 -0
- package/layerzero/src/workers/executor/options.cairo +244 -0
- package/layerzero/src/workers/executor/structs.cairo +119 -0
- package/layerzero/src/workers/interface.cairo +32 -0
- package/layerzero/src/workers/price_feed/constants.cairo +7 -0
- package/layerzero/src/workers/price_feed/errors.cairo +28 -0
- package/layerzero/src/workers/price_feed/events.cairo +13 -0
- package/layerzero/src/workers/price_feed/interface.cairo +264 -0
- package/layerzero/src/workers/price_feed/price_feed.cairo +392 -0
- package/layerzero/src/workers/price_feed/structs.cairo +74 -0
- package/layerzero/tests/common/test_constants.cairo +21 -0
- package/layerzero/tests/common/test_guid.cairo +232 -0
- package/layerzero/tests/common/test_packet_v1_codec.cairo +372 -0
- package/layerzero/tests/common/utils.cairo +23 -0
- package/layerzero/tests/e2e/oft_utils.cairo +121 -0
- package/layerzero/tests/e2e/test_counter_with_sml.cairo +194 -0
- package/layerzero/tests/e2e/test_counter_with_uln.cairo +352 -0
- package/layerzero/tests/e2e/test_dvn.cairo +406 -0
- package/layerzero/tests/e2e/test_lz_token.cairo +354 -0
- package/layerzero/tests/e2e/test_oft_compose_with_uln.cairo +364 -0
- package/layerzero/tests/e2e/test_oft_with_sml.cairo +240 -0
- package/layerzero/tests/e2e/test_oft_with_uln.cairo +299 -0
- package/layerzero/tests/e2e/utils.cairo +490 -0
- package/layerzero/tests/endpoint/message_lib_manager/test_message_lib_manager.cairo +2051 -0
- package/layerzero/tests/endpoint/message_lib_manager/utils.cairo +45 -0
- package/layerzero/tests/endpoint/messaging_channel/test_messaging_channel.cairo +621 -0
- package/layerzero/tests/endpoint/messaging_channel/utils.cairo +96 -0
- package/layerzero/tests/endpoint/messaging_composer/test_messaging_composer.cairo +456 -0
- package/layerzero/tests/endpoint/messaging_composer/utils.cairo +75 -0
- package/layerzero/tests/endpoint/test_endpoint_commit.cairo +763 -0
- package/layerzero/tests/endpoint/test_endpoint_lzreceive.cairo +1253 -0
- package/layerzero/tests/endpoint/test_endpoint_quote.cairo +71 -0
- package/layerzero/tests/endpoint/test_endpoint_send.cairo +1327 -0
- package/layerzero/tests/endpoint/utils.cairo +129 -0
- package/layerzero/tests/fuzzable/blockchain_config.cairo +89 -0
- package/layerzero/tests/fuzzable/bytes32.cairo +16 -0
- package/layerzero/tests/fuzzable/contract_address.cairo +67 -0
- package/layerzero/tests/fuzzable/dst_config.cairo +37 -0
- package/layerzero/tests/fuzzable/eid.cairo +23 -0
- package/layerzero/tests/fuzzable/eth_address.cairo +17 -0
- package/layerzero/tests/fuzzable/expiry.cairo +27 -0
- package/layerzero/tests/fuzzable/felt_array.cairo +38 -0
- package/layerzero/tests/fuzzable/inbound_params.cairo +21 -0
- package/layerzero/tests/fuzzable/keys.cairo +16 -0
- package/layerzero/tests/fuzzable/model_type.cairo +27 -0
- package/layerzero/tests/fuzzable/origin.cairo +21 -0
- package/layerzero/tests/fuzzable/price.cairo +32 -0
- package/layerzero/tests/fuzzable/role_admin.cairo +29 -0
- package/layerzero/tests/fuzzable/small_byte_array.cairo +61 -0
- package/layerzero/tests/lib.cairo +177 -0
- package/layerzero/tests/message_lib/sml/test_simple_message_lib.cairo +224 -0
- package/layerzero/tests/message_lib/uln/test_uln_admin.cairo +2150 -0
- package/layerzero/tests/message_lib/uln/test_uln_config.cairo +527 -0
- package/layerzero/tests/message_lib/uln/test_uln_config_storage_node.cairo +69 -0
- package/layerzero/tests/message_lib/uln/test_uln_executor_config.cairo +173 -0
- package/layerzero/tests/message_lib/uln/test_uln_options.cairo +329 -0
- package/layerzero/tests/message_lib/uln/test_uln_quote.cairo +1038 -0
- package/layerzero/tests/message_lib/uln/test_uln_receive.cairo +715 -0
- package/layerzero/tests/message_lib/uln/test_uln_send.cairo +1155 -0
- package/layerzero/tests/message_lib/uln/utils.cairo +59 -0
- package/layerzero/tests/mocks/composer_target.cairo +76 -0
- package/layerzero/tests/mocks/endpoint.cairo +199 -0
- package/layerzero/tests/mocks/erc20/erc20.cairo +50 -0
- package/layerzero/tests/mocks/erc20/interface.cairo +8 -0
- package/layerzero/tests/mocks/message_inspector/message_inspector.cairo +17 -0
- package/layerzero/tests/mocks/message_lib_manager.cairo +98 -0
- package/layerzero/tests/mocks/messaging_channel/interface.cairo +23 -0
- package/layerzero/tests/mocks/messaging_channel/messaging_channel.cairo +138 -0
- package/layerzero/tests/mocks/messaging_composer.cairo +171 -0
- package/layerzero/tests/mocks/oapp_core/interface.cairo +53 -0
- package/layerzero/tests/mocks/oapp_core/oapp_core.cairo +142 -0
- package/layerzero/tests/mocks/oapp_options_type3.cairo +42 -0
- package/layerzero/tests/mocks/oft_core/interface.cairo +28 -0
- package/layerzero/tests/mocks/oft_core/oft_core.cairo +242 -0
- package/layerzero/tests/mocks/receiver.cairo +54 -0
- package/layerzero/tests/mocks/treasury/lz_token_fee_lib.cairo +57 -0
- package/layerzero/tests/mocks/treasury/treasury.cairo +74 -0
- package/layerzero/tests/mocks/uln_config/interface.cairo +12 -0
- package/layerzero/tests/mocks/uln_config/uln_config.cairo +35 -0
- package/layerzero/tests/mocks/workers/base.cairo +80 -0
- package/layerzero/tests/mocks/workers/dvn.cairo +115 -0
- package/layerzero/tests/mocks/workers/executor/decode/decode.cairo +97 -0
- package/layerzero/tests/mocks/workers/executor/decode/interface.cairo +59 -0
- package/layerzero/tests/mocks/workers/executor/executor.cairo +176 -0
- package/layerzero/tests/oapps/common/test_oapp_options_type_3.cairo +279 -0
- package/layerzero/tests/oapps/oft/test_oft_adapter.cairo +441 -0
- package/layerzero/tests/oapps/oft/test_oft_compose_msg_codec.cairo +139 -0
- package/layerzero/tests/oapps/oft/test_oft_core.cairo +751 -0
- package/layerzero/tests/oapps/oft/test_oft_msg_codec.cairo +268 -0
- package/layerzero/tests/oapps/test_counter.cairo +470 -0
- package/layerzero/tests/oapps/test_oapp_core.cairo +750 -0
- package/layerzero/tests/treasury/test_lz_token_fee_lib.cairo +63 -0
- package/layerzero/tests/treasury/test_treasury.cairo +458 -0
- package/layerzero/tests/treasury/utils.cairo +8 -0
- package/layerzero/tests/utils.cairo +48 -0
- package/layerzero/tests/workers/base/test_worker_base.cairo +1097 -0
- package/layerzero/tests/workers/base/utils.cairo +76 -0
- package/layerzero/tests/workers/dvn/fee_lib/test_dvn_fee_lib.cairo +361 -0
- package/layerzero/tests/workers/dvn/test_dvn.cairo +1101 -0
- package/layerzero/tests/workers/dvn/test_dvn_options.cairo +312 -0
- package/layerzero/tests/workers/dvn/utils.cairo +236 -0
- package/layerzero/tests/workers/executor/fee_lib/test_executor_fee_lib.cairo +223 -0
- package/layerzero/tests/workers/executor/test_decode.cairo +612 -0
- package/layerzero/tests/workers/executor/test_executor.cairo +1472 -0
- package/layerzero/tests/workers/executor/utils.cairo +296 -0
- package/layerzero/tests/workers/price_feed/test_price_feed.cairo +879 -0
- package/layerzero/tests/workers/price_feed/utils.cairo +37 -0
- package/libs/enumerable_set/Scarb.lock +24 -0
- package/libs/enumerable_set/Scarb.toml +17 -0
- package/libs/enumerable_set/src/enumerable_set.cairo +118 -0
- package/libs/enumerable_set/src/lib.cairo +4 -0
- package/libs/enumerable_set/tests/lib.cairo +5 -0
- package/libs/enumerable_set/tests/mocks/mock_enumerable_set.cairo +61 -0
- package/libs/enumerable_set/tests/test_enumerable_set.cairo +379 -0
- package/libs/lz_utils/Scarb.lock +24 -0
- package/libs/lz_utils/Scarb.toml +17 -0
- package/libs/lz_utils/src/bytes.cairo +33 -0
- package/libs/lz_utils/src/error.cairo +12 -0
- package/libs/lz_utils/src/keccak.cairo +28 -0
- package/libs/lz_utils/src/lib.cairo +3 -0
- package/libs/multisig/Scarb.lock +172 -0
- package/libs/multisig/Scarb.toml +23 -0
- package/libs/multisig/src/errors.cairo +84 -0
- package/libs/multisig/src/events.cairo +13 -0
- package/libs/multisig/src/interface.cairo +73 -0
- package/libs/multisig/src/lib.cairo +7 -0
- package/libs/multisig/src/multisig.cairo +241 -0
- package/libs/multisig/tests/lib.cairo +4 -0
- package/libs/multisig/tests/mocks/mock_multisig.cairo +57 -0
- package/libs/multisig/tests/test_multisig.cairo +452 -0
- package/package.json +41 -0
- package/src/scripts/build-abi.ts +51 -0
- package/target/CACHEDIR.TAG +3 -0
- package/target/dev/.fingerprint/alexandria_bytes-5ea6u5t70d7qi/alexandria_bytes +1 -0
- package/target/dev/.fingerprint/alexandria_data_structures-0aue3g6q80gs0/alexandria_data_structures +1 -0
- package/target/dev/.fingerprint/alexandria_math-h2fi7jdq4isuu/alexandria_math +1 -0
- package/target/dev/.fingerprint/core-lq3u730l5p1ag/core +1 -0
- package/target/dev/.fingerprint/core-vf7fc6rvic5vi/core +1 -0
- package/target/dev/.fingerprint/enumerable_set-eaerkg8njl85o/enumerable_set +1 -0
- package/target/dev/.fingerprint/enumerable_set-r54oje7t06ku8/enumerable_set +1 -0
- package/target/dev/.fingerprint/layerzero-oqgdqsaddpi2k/layerzero +1 -0
- package/target/dev/.fingerprint/lz_utils-kfkkeueiqg0pa/lz_utils +1 -0
- package/target/dev/.fingerprint/lz_utils-u4v1os6e7gkng/lz_utils +1 -0
- package/target/dev/.fingerprint/multisig-0fjetugejecge/multisig +1 -0
- package/target/dev/.fingerprint/multisig-6j5kqs436hm54/multisig +1 -0
- package/target/dev/.fingerprint/openzeppelin-ei1id1hu088lo/openzeppelin +1 -0
- package/target/dev/.fingerprint/openzeppelin-j9d5nd1qhfnu6/openzeppelin +1 -0
- package/target/dev/.fingerprint/openzeppelin_access-3oa41aikpaek0/openzeppelin_access +1 -0
- package/target/dev/.fingerprint/openzeppelin_access-p5h849v8so76q/openzeppelin_access +1 -0
- package/target/dev/.fingerprint/openzeppelin_account-4qhv5fks84g9u/openzeppelin_account +1 -0
- package/target/dev/.fingerprint/openzeppelin_account-hgbm8ln9ah7rm/openzeppelin_account +1 -0
- package/target/dev/.fingerprint/openzeppelin_finance-n70q9al0cps8i/openzeppelin_finance +1 -0
- package/target/dev/.fingerprint/openzeppelin_finance-nnd4f8703t3ak/openzeppelin_finance +1 -0
- package/target/dev/.fingerprint/openzeppelin_governance-3gnk21ubp5lis/openzeppelin_governance +1 -0
- package/target/dev/.fingerprint/openzeppelin_governance-rj1bfont4fij4/openzeppelin_governance +1 -0
- package/target/dev/.fingerprint/openzeppelin_introspection-3fja9hd1gvbcq/openzeppelin_introspection +1 -0
- package/target/dev/.fingerprint/openzeppelin_introspection-jc3nf5525eet6/openzeppelin_introspection +1 -0
- package/target/dev/.fingerprint/openzeppelin_merkle_tree-4en77ogr2r2l2/openzeppelin_merkle_tree +1 -0
- package/target/dev/.fingerprint/openzeppelin_merkle_tree-4t190frqs4db8/openzeppelin_merkle_tree +1 -0
- package/target/dev/.fingerprint/openzeppelin_presets-aqb0f6p9c0bp6/openzeppelin_presets +1 -0
- package/target/dev/.fingerprint/openzeppelin_presets-nseg8korhin8e/openzeppelin_presets +1 -0
- package/target/dev/.fingerprint/openzeppelin_security-g7p73ji1ih1qg/openzeppelin_security +1 -0
- package/target/dev/.fingerprint/openzeppelin_security-qp5328v80452u/openzeppelin_security +1 -0
- package/target/dev/.fingerprint/openzeppelin_token-jjf7tl9rphc6k/openzeppelin_token +1 -0
- package/target/dev/.fingerprint/openzeppelin_token-r6s43vlpj6rqk/openzeppelin_token +1 -0
- package/target/dev/.fingerprint/openzeppelin_upgrades-0dpbnre7engca/openzeppelin_upgrades +1 -0
- package/target/dev/.fingerprint/openzeppelin_upgrades-2sqgvbuv9s800/openzeppelin_upgrades +1 -0
- package/target/dev/.fingerprint/openzeppelin_utils-mj395ivff1ffo/openzeppelin_utils +1 -0
- package/target/dev/.fingerprint/openzeppelin_utils-oh1hse8sjumgm/openzeppelin_utils +1 -0
- package/target/dev/.fingerprint/starkware_utils-1qnnjnq0pf9u0/starkware_utils +1 -0
- package/target/dev/.fingerprint/starkware_utils-mh8e3te65lju4/starkware_utils +1 -0
- package/target/dev/enumerable_set.sierra.json +1 -0
- package/target/dev/incremental/alexandria_bytes-5ea6u5t70d7qi.bin +0 -0
- package/target/dev/incremental/alexandria_data_structures-0aue3g6q80gs0.bin +0 -0
- package/target/dev/incremental/alexandria_math-h2fi7jdq4isuu.bin +0 -0
- package/target/dev/incremental/core-lq3u730l5p1ag.bin +0 -0
- package/target/dev/incremental/core-vf7fc6rvic5vi.bin +0 -0
- package/target/dev/incremental/enumerable_set-eaerkg8njl85o.bin +0 -0
- package/target/dev/incremental/enumerable_set-r54oje7t06ku8.bin +0 -0
- package/target/dev/incremental/layerzero-oqgdqsaddpi2k.bin +0 -0
- package/target/dev/incremental/lz_utils-kfkkeueiqg0pa.bin +0 -0
- package/target/dev/incremental/lz_utils-u4v1os6e7gkng.bin +0 -0
- package/target/dev/incremental/multisig-0fjetugejecge.bin +0 -0
- package/target/dev/incremental/multisig-6j5kqs436hm54.bin +0 -0
- package/target/dev/incremental/openzeppelin-ei1id1hu088lo.bin +0 -0
- package/target/dev/incremental/openzeppelin-j9d5nd1qhfnu6.bin +0 -0
- package/target/dev/incremental/openzeppelin_access-3oa41aikpaek0.bin +0 -0
- package/target/dev/incremental/openzeppelin_access-p5h849v8so76q.bin +0 -0
- package/target/dev/incremental/openzeppelin_account-4qhv5fks84g9u.bin +0 -0
- package/target/dev/incremental/openzeppelin_account-hgbm8ln9ah7rm.bin +0 -0
- package/target/dev/incremental/openzeppelin_finance-n70q9al0cps8i.bin +0 -0
- package/target/dev/incremental/openzeppelin_finance-nnd4f8703t3ak.bin +0 -0
- package/target/dev/incremental/openzeppelin_governance-3gnk21ubp5lis.bin +0 -0
- package/target/dev/incremental/openzeppelin_governance-rj1bfont4fij4.bin +0 -0
- package/target/dev/incremental/openzeppelin_introspection-3fja9hd1gvbcq.bin +0 -0
- package/target/dev/incremental/openzeppelin_introspection-jc3nf5525eet6.bin +0 -0
- package/target/dev/incremental/openzeppelin_merkle_tree-4en77ogr2r2l2.bin +0 -0
- package/target/dev/incremental/openzeppelin_merkle_tree-4t190frqs4db8.bin +0 -0
- package/target/dev/incremental/openzeppelin_presets-aqb0f6p9c0bp6.bin +0 -0
- package/target/dev/incremental/openzeppelin_presets-nseg8korhin8e.bin +0 -0
- package/target/dev/incremental/openzeppelin_security-g7p73ji1ih1qg.bin +0 -0
- package/target/dev/incremental/openzeppelin_security-qp5328v80452u.bin +0 -0
- package/target/dev/incremental/openzeppelin_token-jjf7tl9rphc6k.bin +0 -0
- package/target/dev/incremental/openzeppelin_token-r6s43vlpj6rqk.bin +0 -0
- package/target/dev/incremental/openzeppelin_upgrades-0dpbnre7engca.bin +0 -0
- package/target/dev/incremental/openzeppelin_upgrades-2sqgvbuv9s800.bin +0 -0
- package/target/dev/incremental/openzeppelin_utils-mj395ivff1ffo.bin +0 -0
- package/target/dev/incremental/openzeppelin_utils-oh1hse8sjumgm.bin +0 -0
- package/target/dev/incremental/starkware_utils-1qnnjnq0pf9u0.bin +0 -0
- package/target/dev/incremental/starkware_utils-mh8e3te65lju4.bin +0 -0
- package/target/dev/layerzero.starknet_artifacts.json +1 -0
- package/target/dev/layerzero_BlockedMessageLib.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_BlockedMessageLib.contract_class.json +1 -0
- package/target/dev/layerzero_Dvn.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_Dvn.contract_class.json +1 -0
- package/target/dev/layerzero_DvnFeeLib.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_DvnFeeLib.contract_class.json +1 -0
- package/target/dev/layerzero_Endpoint.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_Endpoint.contract_class.json +1 -0
- package/target/dev/layerzero_Executor.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_Executor.contract_class.json +1 -0
- package/target/dev/layerzero_ExecutorFeeLib.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_ExecutorFeeLib.contract_class.json +1 -0
- package/target/dev/layerzero_OApp.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_OApp.contract_class.json +1 -0
- package/target/dev/layerzero_OFT.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_OFT.contract_class.json +1 -0
- package/target/dev/layerzero_OFTAdapter.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_OFTAdapter.contract_class.json +1 -0
- package/target/dev/layerzero_OmniCounter.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_OmniCounter.contract_class.json +1 -0
- package/target/dev/layerzero_PriceFeed.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_PriceFeed.contract_class.json +1 -0
- package/target/dev/layerzero_SimpleMessageLib.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_SimpleMessageLib.contract_class.json +1 -0
- package/target/dev/layerzero_Treasury.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_Treasury.contract_class.json +1 -0
- package/target/dev/layerzero_UltraLightNode.compiled_contract_class.json +1 -0
- package/target/dev/layerzero_UltraLightNode.contract_class.json +1 -0
- package/target/dev/lz_utils.sierra.json +1 -0
- package/target/dev/multisig.sierra.json +1 -0
- package/tools/update_contracts.sh +19 -0
- package/tsconfig.json +20 -0
- package/tsup.config.ts +7 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
//! Base worker events
|
|
2
|
+
|
|
3
|
+
use starknet::ContractAddress;
|
|
4
|
+
|
|
5
|
+
/// Event emitted when the price feed address is updated
|
|
6
|
+
#[derive(Drop, starknet::Event)]
|
|
7
|
+
pub struct PriceFeedSet {
|
|
8
|
+
#[key]
|
|
9
|
+
pub old_price_feed: ContractAddress,
|
|
10
|
+
#[key]
|
|
11
|
+
pub new_price_feed: ContractAddress,
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/// Event emitted when fees are withdrawn
|
|
15
|
+
#[derive(Drop, starknet::Event)]
|
|
16
|
+
pub struct FeeWithdrawn {
|
|
17
|
+
#[key]
|
|
18
|
+
pub to: ContractAddress,
|
|
19
|
+
pub amount: u256,
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/// Event emitted when the supported option type for an EID is set
|
|
23
|
+
#[derive(Drop, starknet::Event)]
|
|
24
|
+
pub struct SupportedOptionTypeSet {
|
|
25
|
+
#[key]
|
|
26
|
+
pub eid: u32,
|
|
27
|
+
pub option_type: ByteArray,
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/// Event emitted when the default multiplier basis points is set
|
|
31
|
+
#[derive(Drop, starknet::Event)]
|
|
32
|
+
pub struct DefaultMultiplierBpsSet {
|
|
33
|
+
pub default_multiplier_bps: u16,
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/// Event emitted when the worker fee lib address is updated
|
|
37
|
+
#[derive(Drop, starknet::Event)]
|
|
38
|
+
pub struct WorkerFeeLibSet {
|
|
39
|
+
#[key]
|
|
40
|
+
pub old_worker_fee_lib: ContractAddress,
|
|
41
|
+
#[key]
|
|
42
|
+
pub new_worker_fee_lib: ContractAddress,
|
|
43
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
//! Base worker interface
|
|
2
|
+
|
|
3
|
+
use starknet::ContractAddress;
|
|
4
|
+
|
|
5
|
+
/// Interface for the base worker component
|
|
6
|
+
#[starknet::interface]
|
|
7
|
+
pub trait IWorkerBase<TContractState> {
|
|
8
|
+
// ================================== Only Default Admin ===============================
|
|
9
|
+
|
|
10
|
+
/// Pause the contract (only default admin)
|
|
11
|
+
fn pause(ref self: TContractState);
|
|
12
|
+
|
|
13
|
+
/// Unpause the contract (only default admin)
|
|
14
|
+
fn unpause(ref self: TContractState);
|
|
15
|
+
|
|
16
|
+
// ===================================== Only Admin =====================================
|
|
17
|
+
|
|
18
|
+
/// Sets the price feed worker address
|
|
19
|
+
///
|
|
20
|
+
/// # Arguments
|
|
21
|
+
///
|
|
22
|
+
/// * `price_feed`: The address of the price feed worker
|
|
23
|
+
///
|
|
24
|
+
/// @dev This function is only callable by the admin role.
|
|
25
|
+
fn set_price_feed(ref self: TContractState, price_feed: ContractAddress);
|
|
26
|
+
|
|
27
|
+
/// Sets the supported option type for an endpointID
|
|
28
|
+
///
|
|
29
|
+
/// # Arguments
|
|
30
|
+
///
|
|
31
|
+
/// * `eid`: The EID to set the supported option type for
|
|
32
|
+
/// * `option_type`: The option type to set for the EID
|
|
33
|
+
///
|
|
34
|
+
/// @dev This function is only callable by the admin role.
|
|
35
|
+
fn set_supported_option_type(ref self: TContractState, eid: u32, option_type: ByteArray);
|
|
36
|
+
|
|
37
|
+
/// Sets the default multiplier basis points
|
|
38
|
+
///
|
|
39
|
+
/// # Arguments
|
|
40
|
+
///
|
|
41
|
+
/// * `default_multiplier_bps`: The default multiplier basis points to set
|
|
42
|
+
///
|
|
43
|
+
/// @dev This function is only callable by the admin role.
|
|
44
|
+
fn set_default_multiplier_bps(ref self: TContractState, default_multiplier_bps: u16);
|
|
45
|
+
|
|
46
|
+
/// Withdraw collected fees (only admin)
|
|
47
|
+
fn withdraw_fee(
|
|
48
|
+
ref self: TContractState, token_address: ContractAddress, to: ContractAddress, amount: u256,
|
|
49
|
+
);
|
|
50
|
+
|
|
51
|
+
/// Sets the worker fee lib address
|
|
52
|
+
///
|
|
53
|
+
/// # Arguments
|
|
54
|
+
///
|
|
55
|
+
/// * `worker_fee_lib`: The address of the worker fee lib
|
|
56
|
+
///
|
|
57
|
+
/// @dev This function is only callable by the admin role.
|
|
58
|
+
fn set_worker_fee_lib(ref self: TContractState, worker_fee_lib: ContractAddress);
|
|
59
|
+
|
|
60
|
+
// ======================================= View ========================================
|
|
61
|
+
|
|
62
|
+
/// Gets the current price feed address
|
|
63
|
+
///
|
|
64
|
+
/// # Returns
|
|
65
|
+
///
|
|
66
|
+
/// The current price feed worker's address
|
|
67
|
+
fn get_price_feed(self: @TContractState) -> ContractAddress;
|
|
68
|
+
|
|
69
|
+
/// Gets the supported option type for a given EID
|
|
70
|
+
///
|
|
71
|
+
/// # Arguments
|
|
72
|
+
///
|
|
73
|
+
/// * `eid`: The EID to get the supported option type for
|
|
74
|
+
///
|
|
75
|
+
/// # Returns
|
|
76
|
+
///
|
|
77
|
+
/// The supported option type for the EID
|
|
78
|
+
fn get_supported_option_type(self: @TContractState, eid: u32) -> ByteArray;
|
|
79
|
+
|
|
80
|
+
/// Gets the default multiplier basis points
|
|
81
|
+
///
|
|
82
|
+
/// # Returns
|
|
83
|
+
///
|
|
84
|
+
/// The default multiplier basis points
|
|
85
|
+
fn get_default_multiplier_bps(self: @TContractState) -> u16;
|
|
86
|
+
|
|
87
|
+
/// Gets the current worker fee lib address
|
|
88
|
+
///
|
|
89
|
+
/// # Returns
|
|
90
|
+
///
|
|
91
|
+
/// The current worker fee lib address
|
|
92
|
+
fn get_worker_fee_lib(self: @TContractState) -> ContractAddress;
|
|
93
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
use crate::common::constants::{DEFAULT_BPS, NATIVE_DECIMALS_RATE};
|
|
2
|
+
|
|
3
|
+
/// Apply premium and floor margin to the fee
|
|
4
|
+
///
|
|
5
|
+
/// Returns the maximum between the fee with a multiplier and fee with the floor margin.
|
|
6
|
+
///
|
|
7
|
+
/// # Arguments
|
|
8
|
+
///
|
|
9
|
+
/// * `fee` - fee to apply premium to
|
|
10
|
+
/// * `bps` - base points to apply premium to, where 10000 = 100%
|
|
11
|
+
/// * `default_bps` - default bps to apply premium to
|
|
12
|
+
/// * `margin_usd` - margin in usd
|
|
13
|
+
/// * `native_price_usd` - native price in usd
|
|
14
|
+
///
|
|
15
|
+
/// # Returns
|
|
16
|
+
///
|
|
17
|
+
/// * `fee_with_premium` - fee with premium applied
|
|
18
|
+
pub fn apply_premium_and_floor_margin(
|
|
19
|
+
fee: u256, bps: u16, default_bps: u16, margin_usd: u128, native_price_usd: u128,
|
|
20
|
+
) -> u256 {
|
|
21
|
+
let multiplier_bps = if bps == 0 {
|
|
22
|
+
default_bps
|
|
23
|
+
} else {
|
|
24
|
+
bps
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// fee with multiplier, divides by DEFAULT_BPS to get the percentage
|
|
28
|
+
let fee_with_multiplier = (fee * multiplier_bps.into()) / DEFAULT_BPS;
|
|
29
|
+
if native_price_usd == 0 || margin_usd == 0 {
|
|
30
|
+
return fee_with_multiplier;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
// fee with floor margin, divides by native_price_usd to get the amount of native tokens
|
|
34
|
+
let fee_with_floor_margin = fee
|
|
35
|
+
+ (margin_usd.into() * NATIVE_DECIMALS_RATE) / native_price_usd.into();
|
|
36
|
+
|
|
37
|
+
// return the max
|
|
38
|
+
if fee_with_floor_margin > fee_with_multiplier {
|
|
39
|
+
fee_with_floor_margin
|
|
40
|
+
} else {
|
|
41
|
+
fee_with_multiplier
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
pub fn convert_and_apply_premium_to_value(
|
|
46
|
+
value: u256, ratio: u128, denom: u128, bps: u16, default_bps: u16,
|
|
47
|
+
) -> u256 {
|
|
48
|
+
let multiplier_bps = if bps == 0 {
|
|
49
|
+
default_bps
|
|
50
|
+
} else {
|
|
51
|
+
bps
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
if value > 0 {
|
|
55
|
+
(((value * ratio.into()) / denom.into()) * multiplier_bps.into()) / DEFAULT_BPS
|
|
56
|
+
} else {
|
|
57
|
+
0
|
|
58
|
+
}
|
|
59
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
//! DVN constants
|
|
2
|
+
|
|
3
|
+
/// The raw bytes of the signature are 65 bytes long, the first 64 bytes are the signature, and the
|
|
4
|
+
/// last byte is the recovery ID.
|
|
5
|
+
pub const SIGNATURE_RAW_BYTES: usize = 65;
|
|
6
|
+
|
|
7
|
+
/// encoded: funcSigHash + params -> 4 + (32 * 2)
|
|
8
|
+
pub const EXECUTE_FIXED_BYTES: u32 = 68;
|
|
9
|
+
|
|
10
|
+
/// callData(verify) = 228 (4 + 64 + 81 + 15 + 32 + 32), padded to 32 = 256 + 64 = 320
|
|
11
|
+
pub const VERIFY_BYTES: u32 = 320;
|
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
//! DVN contract implementation
|
|
2
|
+
|
|
3
|
+
/// DVN contract
|
|
4
|
+
///
|
|
5
|
+
/// The DVN contract is a key component of LayerZero's security and validation model, acting as an
|
|
6
|
+
/// on-chain representation of an off-chain verification network. Its primary responsibility is to
|
|
7
|
+
/// attest to the validity of cross-chain messages. When a message is sent from another chain to
|
|
8
|
+
/// Starknet, a DVN is tasked with verifying that message. This contract manages the on-chain part
|
|
9
|
+
/// of that process: quoting the price for verification, and providing the mechanism for a trusted
|
|
10
|
+
/// party (the DVN's agent) to submit the verified message for execution.
|
|
11
|
+
#[starknet::contract]
|
|
12
|
+
pub mod Dvn {
|
|
13
|
+
use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
|
|
14
|
+
use core::num::traits::Zero;
|
|
15
|
+
use lz_utils::bytes::Bytes32;
|
|
16
|
+
use lz_utils::keccak::keccak256;
|
|
17
|
+
use multisig::MultisigComponent;
|
|
18
|
+
use openzeppelin::access::accesscontrol::AccessControlComponent;
|
|
19
|
+
use openzeppelin::introspection::src5::SRC5Component;
|
|
20
|
+
use openzeppelin::security::pausable::PausableComponent;
|
|
21
|
+
use openzeppelin::security::reentrancyguard::ReentrancyGuardComponent;
|
|
22
|
+
use openzeppelin::upgrades::upgradeable::UpgradeableComponent;
|
|
23
|
+
use openzeppelin::upgrades::upgradeable::UpgradeableComponent::InternalTrait as UpgradeableInternalTrait;
|
|
24
|
+
use starknet::account::Call;
|
|
25
|
+
use starknet::storage::{
|
|
26
|
+
Map, StorageMapReadAccess, StorageMapWriteAccess, StoragePointerReadAccess,
|
|
27
|
+
StoragePointerWriteAccess,
|
|
28
|
+
};
|
|
29
|
+
use starknet::syscalls::call_contract_syscall;
|
|
30
|
+
use starknet::{
|
|
31
|
+
ClassHash, ContractAddress, EthAddress, get_block_timestamp, get_contract_address,
|
|
32
|
+
};
|
|
33
|
+
use starkware_utils::errors::assert_with_byte_array;
|
|
34
|
+
use crate::workers::access_control::ADMIN_ROLE;
|
|
35
|
+
use crate::workers::base::base::WorkerBaseComponent;
|
|
36
|
+
use crate::workers::base::structs::QuoteParams;
|
|
37
|
+
use crate::workers::dvn::events::DstConfigSet;
|
|
38
|
+
use crate::workers::dvn::fee_lib::interface::{
|
|
39
|
+
FeeParams, IDvnFeeLibDispatcher, IDvnFeeLibDispatcherTrait,
|
|
40
|
+
};
|
|
41
|
+
use crate::workers::dvn::interface::IDvn;
|
|
42
|
+
use crate::workers::dvn::structs::{DstConfig, ExecuteParam, SetDstConfigParams};
|
|
43
|
+
use crate::workers::dvn::{errors, events};
|
|
44
|
+
use crate::workers::interface::ILayerZeroWorker;
|
|
45
|
+
|
|
46
|
+
////////////////
|
|
47
|
+
// Components //
|
|
48
|
+
////////////////
|
|
49
|
+
|
|
50
|
+
// Base worker component
|
|
51
|
+
component!(path: WorkerBaseComponent, storage: worker_base, event: WorkerBaseEvent);
|
|
52
|
+
|
|
53
|
+
// Access control components
|
|
54
|
+
component!(path: AccessControlComponent, storage: access_control, event: AccessControlEvent);
|
|
55
|
+
component!(path: SRC5Component, storage: src5, event: SRC5Event);
|
|
56
|
+
|
|
57
|
+
// Upgradeable component
|
|
58
|
+
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);
|
|
59
|
+
|
|
60
|
+
// Multisig component
|
|
61
|
+
component!(path: MultisigComponent, storage: multisig, event: MultisigEvent);
|
|
62
|
+
|
|
63
|
+
// Pausable component
|
|
64
|
+
component!(path: PausableComponent, storage: pausable, event: PausableEvent);
|
|
65
|
+
|
|
66
|
+
////////////////
|
|
67
|
+
// Embeddings //
|
|
68
|
+
////////////////
|
|
69
|
+
|
|
70
|
+
#[abi(embed_v0)]
|
|
71
|
+
impl WorkerBaseImpl = WorkerBaseComponent::WorkerBaseImpl<ContractState>;
|
|
72
|
+
impl WorkerBaseInternalImpl = WorkerBaseComponent::InternalImpl<ContractState>;
|
|
73
|
+
|
|
74
|
+
#[abi(embed_v0)]
|
|
75
|
+
impl MultisigImpl = MultisigComponent::Multisig<ContractState>;
|
|
76
|
+
impl MultisigInternalImpl = MultisigComponent::MultisigInternalImpl<ContractState>;
|
|
77
|
+
|
|
78
|
+
// Multisig immutable configuration
|
|
79
|
+
impl MultisigImmutableConfig of MultisigComponent::ImmutableConfig {
|
|
80
|
+
// TODO: this value should be set testing the gas limit on testnet
|
|
81
|
+
// with a value where you can re-set the threshold without hitting the gas limit
|
|
82
|
+
const MAX_THRESHOLD: u32 = 11;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
#[abi(embed_v0)]
|
|
86
|
+
impl AccessControlImpl = WorkerBaseComponent::AccessControlImpl<ContractState>;
|
|
87
|
+
impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;
|
|
88
|
+
|
|
89
|
+
#[abi(embed_v0)]
|
|
90
|
+
impl PausableImpl = PausableComponent::PausableImpl<ContractState>;
|
|
91
|
+
|
|
92
|
+
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;
|
|
93
|
+
|
|
94
|
+
#[storage]
|
|
95
|
+
struct Storage {
|
|
96
|
+
#[substorage(v0)]
|
|
97
|
+
worker_base: WorkerBaseComponent::Storage,
|
|
98
|
+
#[substorage(v0)]
|
|
99
|
+
access_control: AccessControlComponent::Storage,
|
|
100
|
+
#[substorage(v0)]
|
|
101
|
+
src5: SRC5Component::Storage,
|
|
102
|
+
#[substorage(v0)]
|
|
103
|
+
upgradeable: UpgradeableComponent::Storage,
|
|
104
|
+
#[substorage(v0)]
|
|
105
|
+
multisig: MultisigComponent::Storage,
|
|
106
|
+
#[substorage(v0)]
|
|
107
|
+
pausable: PausableComponent::Storage,
|
|
108
|
+
/// Eid => DstConfig
|
|
109
|
+
dst_configs: Map<u32, DstConfig>,
|
|
110
|
+
/// Verifier ID
|
|
111
|
+
vid: u32,
|
|
112
|
+
/// Record used hashes to prevent reentry and replay attack
|
|
113
|
+
used_hashes: Map<Bytes32, bool>,
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
#[event]
|
|
117
|
+
#[derive(Drop, starknet::Event)]
|
|
118
|
+
pub enum Event {
|
|
119
|
+
#[flat]
|
|
120
|
+
WorkerBaseEvent: WorkerBaseComponent::Event,
|
|
121
|
+
#[flat]
|
|
122
|
+
ReentrancyGuardEvent: ReentrancyGuardComponent::Event,
|
|
123
|
+
#[flat]
|
|
124
|
+
AccessControlEvent: AccessControlComponent::Event,
|
|
125
|
+
#[flat]
|
|
126
|
+
SRC5Event: SRC5Component::Event,
|
|
127
|
+
#[flat]
|
|
128
|
+
UpgradeableEvent: UpgradeableComponent::Event,
|
|
129
|
+
#[flat]
|
|
130
|
+
MultisigEvent: MultisigComponent::Event,
|
|
131
|
+
#[flat]
|
|
132
|
+
PausableEvent: PausableComponent::Event,
|
|
133
|
+
// DVN-specific events
|
|
134
|
+
DstConfigSet: DstConfigSet,
|
|
135
|
+
VerifySignaturesFailed: events::VerifySignaturesFailed,
|
|
136
|
+
HashAlreadyUsed: events::HashAlreadyUsed,
|
|
137
|
+
ExecuteFailed: events::ExecuteFailed,
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
#[constructor]
|
|
141
|
+
fn constructor(
|
|
142
|
+
ref self: ContractState,
|
|
143
|
+
vid: u32,
|
|
144
|
+
message_libs: Array<ContractAddress>,
|
|
145
|
+
price_feed: ContractAddress,
|
|
146
|
+
default_multiplier_bps: u16,
|
|
147
|
+
multisig_signers: Span<EthAddress>,
|
|
148
|
+
multisig_threshold: u32,
|
|
149
|
+
role_admin: ContractAddress,
|
|
150
|
+
admins: Array<ContractAddress>,
|
|
151
|
+
) {
|
|
152
|
+
// Initialize access control component
|
|
153
|
+
self.access_control.initializer();
|
|
154
|
+
|
|
155
|
+
// Initialize base worker & multisig components
|
|
156
|
+
self
|
|
157
|
+
.worker_base
|
|
158
|
+
.initializer(message_libs, price_feed, default_multiplier_bps, role_admin, admins);
|
|
159
|
+
self.multisig._init(multisig_signers, multisig_threshold);
|
|
160
|
+
|
|
161
|
+
// Set ID
|
|
162
|
+
self.vid.write(vid);
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
#[abi(embed_v0)]
|
|
166
|
+
impl DvnImpl of IDvn<ContractState> {
|
|
167
|
+
// ================================== Only Admin =====================================
|
|
168
|
+
|
|
169
|
+
fn set_dst_config(ref self: ContractState, params: Array<SetDstConfigParams>) {
|
|
170
|
+
self.worker_base._assert_only_admin();
|
|
171
|
+
|
|
172
|
+
let dst_config_set = params.span();
|
|
173
|
+
for param in params.into_iter() {
|
|
174
|
+
self.dst_configs.write(param.dst_eid, param.config);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
self.emit(DstConfigSet { dst_config_set });
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
fn execute(ref self: ContractState, params: Array<ExecuteParam>) {
|
|
181
|
+
self.worker_base._assert_only_admin();
|
|
182
|
+
|
|
183
|
+
for (index, param) in params.into_iter().enumerate() {
|
|
184
|
+
let ExecuteParam { vid, call_data, expiration, signatures } = param.clone();
|
|
185
|
+
|
|
186
|
+
// Skip if invalid or expired
|
|
187
|
+
if vid != self.vid.read() || expiration <= get_block_timestamp().into() {
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// Verify signatures
|
|
192
|
+
let hash = self.hash_call_data(vid, call_data, expiration);
|
|
193
|
+
if let Err(error) = self
|
|
194
|
+
.multisig
|
|
195
|
+
._verify_n_signatures(hash.into(), signatures, self.multisig.get_threshold()) {
|
|
196
|
+
self.emit(events::VerifySignaturesFailed { error });
|
|
197
|
+
continue;
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Skip if hash already used, register hash if not
|
|
201
|
+
if self.used_hashes.read(hash) {
|
|
202
|
+
self.emit(events::HashAlreadyUsed { execute_param: param, hash });
|
|
203
|
+
continue;
|
|
204
|
+
}
|
|
205
|
+
self.used_hashes.write(hash, true);
|
|
206
|
+
|
|
207
|
+
// Record used hash and execute syscall
|
|
208
|
+
let result = call_contract_syscall(
|
|
209
|
+
call_data.to, call_data.selector, call_data.calldata,
|
|
210
|
+
);
|
|
211
|
+
|
|
212
|
+
if let Err(data) = result {
|
|
213
|
+
// Un-use hash if syscall fails
|
|
214
|
+
self.used_hashes.write(hash, false);
|
|
215
|
+
self.emit(events::ExecuteFailed { index, data });
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// ================================== Only Quorum =====================================
|
|
221
|
+
|
|
222
|
+
fn quorum_change_admin(ref self: ContractState, param: ExecuteParam) {
|
|
223
|
+
let ExecuteParam { vid, call_data, expiration, signatures } = param;
|
|
224
|
+
|
|
225
|
+
// Panic if expired
|
|
226
|
+
assert_with_byte_array(
|
|
227
|
+
expiration > get_block_timestamp().into(), errors::err_instruction_expired(),
|
|
228
|
+
);
|
|
229
|
+
|
|
230
|
+
// Panic if target is not the DVN
|
|
231
|
+
assert_with_byte_array(
|
|
232
|
+
call_data.to == get_contract_address(), errors::err_invalid_target(call_data.to),
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
// Panic if invalid VID
|
|
236
|
+
assert_with_byte_array(vid == self.vid.read(), errors::err_invalid_vid(vid));
|
|
237
|
+
|
|
238
|
+
// Verify signatures
|
|
239
|
+
let hash = self.hash_call_data(vid, call_data, expiration);
|
|
240
|
+
self.multisig.verify_signatures(hash.into(), signatures);
|
|
241
|
+
|
|
242
|
+
// Panic if hash already used
|
|
243
|
+
assert_with_byte_array(!self.used_hashes.read(hash), errors::err_duplicated_hash(hash));
|
|
244
|
+
|
|
245
|
+
// Record used hash
|
|
246
|
+
self.used_hashes.write(hash, true);
|
|
247
|
+
|
|
248
|
+
// Deserialize the new admin address from calldata & grant admin role or panic
|
|
249
|
+
let mut calldata = call_data.calldata;
|
|
250
|
+
let new_admin = Serde::deserialize(ref calldata);
|
|
251
|
+
assert_with_byte_array(new_admin.is_some(), errors::err_invalid_quorum_admin());
|
|
252
|
+
self.access_control._grant_role(ADMIN_ROLE, new_admin.unwrap());
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
// ================================== Only Self =====================================
|
|
256
|
+
|
|
257
|
+
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {
|
|
258
|
+
self.multisig._only_multisig();
|
|
259
|
+
self.upgradeable.upgrade(new_class_hash);
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
fn upgrade_and_call(
|
|
263
|
+
ref self: ContractState,
|
|
264
|
+
new_class_hash: ClassHash,
|
|
265
|
+
selector: felt252,
|
|
266
|
+
calldata: Span<felt252>,
|
|
267
|
+
) -> Span<felt252> {
|
|
268
|
+
self.multisig._only_multisig();
|
|
269
|
+
self.upgradeable.upgrade_and_call(new_class_hash, selector, calldata)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// ================================== View ==========================================
|
|
273
|
+
|
|
274
|
+
fn get_dst_config(self: @ContractState, dst_eid: u32) -> DstConfig {
|
|
275
|
+
self.dst_configs.read(dst_eid)
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
fn hash_call_data(
|
|
279
|
+
self: @ContractState, vid: u32, call_data: Call, expiration: u256,
|
|
280
|
+
) -> Bytes32 {
|
|
281
|
+
// encode and keccak: vid, to, selector, expiration, call_data
|
|
282
|
+
let mut payload: ByteArray = Default::default();
|
|
283
|
+
|
|
284
|
+
payload.append_u32(vid);
|
|
285
|
+
payload.append_address(call_data.to);
|
|
286
|
+
payload.append_u256(expiration);
|
|
287
|
+
payload.append_felt252(call_data.selector);
|
|
288
|
+
|
|
289
|
+
for i in call_data.calldata {
|
|
290
|
+
payload.append_felt252(*i);
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
keccak256(@payload)
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
#[abi(embed_v0)]
|
|
298
|
+
impl LayerZeroWorkerImpl of ILayerZeroWorker<ContractState> {
|
|
299
|
+
// ================================== Only Message Lib =====================================
|
|
300
|
+
|
|
301
|
+
fn assign_job(ref self: ContractState, params: QuoteParams) -> u256 {
|
|
302
|
+
self.worker_base._assert_not_paused();
|
|
303
|
+
self.worker_base._assert_only_message_lib();
|
|
304
|
+
self.quote(params)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// ================================== View =====================================
|
|
308
|
+
|
|
309
|
+
fn quote(self: @ContractState, params: QuoteParams) -> u256 {
|
|
310
|
+
self.worker_base._assert_not_paused();
|
|
311
|
+
|
|
312
|
+
// Assert price feed is set
|
|
313
|
+
let price_feed = self.worker_base.get_price_feed();
|
|
314
|
+
assert_with_byte_array(price_feed.is_non_zero(), errors::err_price_feed_not_set());
|
|
315
|
+
|
|
316
|
+
// Assert worker fee lib is set
|
|
317
|
+
let worker_fee_lib_addr = self.worker_base.get_worker_fee_lib();
|
|
318
|
+
assert_with_byte_array(
|
|
319
|
+
worker_fee_lib_addr.is_non_zero(), errors::err_worker_fee_lib_not_set(),
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
let QuoteParams { dst_eid, confirmations, sender, options, .. } = params;
|
|
323
|
+
|
|
324
|
+
let fee_params = FeeParams {
|
|
325
|
+
price_feed,
|
|
326
|
+
dst_eid,
|
|
327
|
+
confirmations,
|
|
328
|
+
sender,
|
|
329
|
+
quorum: self.multisig.get_threshold(),
|
|
330
|
+
default_multiplier_bps: self.worker_base.get_default_multiplier_bps(),
|
|
331
|
+
};
|
|
332
|
+
|
|
333
|
+
// Call fee lib to get the quote
|
|
334
|
+
let fee_lib = IDvnFeeLibDispatcher { contract_address: worker_fee_lib_addr };
|
|
335
|
+
fee_lib.get_fee(fee_params, self.get_dst_config(dst_eid), options)
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
//! DVN errors
|
|
2
|
+
|
|
3
|
+
use lz_utils::bytes::Bytes32;
|
|
4
|
+
use lz_utils::error::{Error, format_error};
|
|
5
|
+
use starknet::ContractAddress;
|
|
6
|
+
|
|
7
|
+
#[derive(Drop, Clone, Debug, PartialEq)]
|
|
8
|
+
pub enum DvnError {
|
|
9
|
+
InvalidDvnIdx,
|
|
10
|
+
InvalidDVNOptions,
|
|
11
|
+
EidNotSupported,
|
|
12
|
+
PriceFeedNotSet,
|
|
13
|
+
WorkerFeeLibNotSet,
|
|
14
|
+
InstructionExpired,
|
|
15
|
+
InvalidVid,
|
|
16
|
+
InvalidTarget,
|
|
17
|
+
InvalidQuorumAdmin,
|
|
18
|
+
DuplicatedHash,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
impl DvnErrorImpl of Error<DvnError> {
|
|
22
|
+
fn prefix() -> ByteArray {
|
|
23
|
+
"LZ_DVN"
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
fn name(self: DvnError) -> ByteArray {
|
|
27
|
+
match self {
|
|
28
|
+
DvnError::InvalidDvnIdx => "INVALID_DVN_IDX",
|
|
29
|
+
DvnError::InvalidDVNOptions => "INVALID_DVN_OPTIONS",
|
|
30
|
+
DvnError::EidNotSupported => "EID_NOT_SUPPORTED",
|
|
31
|
+
DvnError::PriceFeedNotSet => "PRICE_FEED_NOT_SET",
|
|
32
|
+
DvnError::WorkerFeeLibNotSet => "WORKER_FEELIB_NOT_SET",
|
|
33
|
+
DvnError::InstructionExpired => "INSTRUCTION_EXPIRED",
|
|
34
|
+
DvnError::InvalidVid => "INVALID_VID",
|
|
35
|
+
DvnError::InvalidTarget => "INVALID_TARGET",
|
|
36
|
+
DvnError::InvalidQuorumAdmin => "INVALID_QUORUM_ADMIN",
|
|
37
|
+
DvnError::DuplicatedHash => "DUPLICATED_HASH",
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
pub fn err_invalid_dvn_idx() -> ByteArray {
|
|
43
|
+
format_error(DvnError::InvalidDvnIdx, "")
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
pub fn err_invalid_dvn_options(cursor: usize) -> ByteArray {
|
|
47
|
+
format_error(DvnError::InvalidDVNOptions, format!("cursor: {}", cursor))
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
pub fn err_eid_not_supported(eid: u32) -> ByteArray {
|
|
51
|
+
format_error(DvnError::EidNotSupported, format!("eid: {}", eid))
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
pub fn err_price_feed_not_set() -> ByteArray {
|
|
55
|
+
format_error(DvnError::PriceFeedNotSet, "")
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
pub fn err_worker_fee_lib_not_set() -> ByteArray {
|
|
59
|
+
format_error(DvnError::WorkerFeeLibNotSet, "")
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
pub fn err_instruction_expired() -> ByteArray {
|
|
63
|
+
format_error(DvnError::InstructionExpired, "")
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
pub fn err_invalid_vid(vid: u32) -> ByteArray {
|
|
67
|
+
format_error(DvnError::InvalidVid, format!("vid: {}", vid))
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
pub fn err_invalid_target(target: ContractAddress) -> ByteArray {
|
|
71
|
+
format_error(DvnError::InvalidTarget, format!("target: {:?}", target))
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
pub fn err_invalid_quorum_admin() -> ByteArray {
|
|
75
|
+
format_error(DvnError::InvalidQuorumAdmin, "")
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
pub fn err_duplicated_hash(hash: Bytes32) -> ByteArray {
|
|
79
|
+
format_error(DvnError::DuplicatedHash, format!("hash: {:?}", hash))
|
|
80
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
//! DVN events
|
|
2
|
+
|
|
3
|
+
use lz_utils::bytes::Bytes32;
|
|
4
|
+
use crate::workers::dvn::structs::{ExecuteParam, SetDstConfigParams};
|
|
5
|
+
|
|
6
|
+
/// Event emitted when the destination config is set
|
|
7
|
+
#[derive(Drop, starknet::Event)]
|
|
8
|
+
pub struct DstConfigSet {
|
|
9
|
+
pub dst_config_set: Span<SetDstConfigParams>,
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/// Event emitted when the signatures are not valid
|
|
13
|
+
#[derive(Drop, starknet::Event)]
|
|
14
|
+
pub struct VerifySignaturesFailed {
|
|
15
|
+
pub error: ByteArray,
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/// Event emitted when the hash is already used
|
|
19
|
+
#[derive(Drop, starknet::Event)]
|
|
20
|
+
pub struct HashAlreadyUsed {
|
|
21
|
+
pub execute_param: ExecuteParam,
|
|
22
|
+
pub hash: Bytes32,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/// Event emitted when the execute call fails
|
|
26
|
+
#[derive(Drop, starknet::Event)]
|
|
27
|
+
pub struct ExecuteFailed {
|
|
28
|
+
pub index: u32,
|
|
29
|
+
pub data: Array<felt252>,
|
|
30
|
+
}
|