@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,453 @@
|
|
|
1
|
+
//! Messaging channel component
|
|
2
|
+
|
|
3
|
+
/// # `MessagingChannelComponent`
|
|
4
|
+
///
|
|
5
|
+
/// This component handles the critical messaging infrastructure for LayerZero cross-chain
|
|
6
|
+
/// communication.
|
|
7
|
+
/// It manages inbound and outbound nonces, payload hash verification, and provides mechanisms for
|
|
8
|
+
/// message lifecycle management including skipping, nilifying, and burning messages.
|
|
9
|
+
///
|
|
10
|
+
/// ## Key features
|
|
11
|
+
/// - Ordered message execution with nonce management
|
|
12
|
+
/// - Payload hash verification for message integrity
|
|
13
|
+
/// - Lazy nonce updates for gas optimization
|
|
14
|
+
/// - Message lifecycle management (skip, nilify, burn)
|
|
15
|
+
/// - GUID generation for unique message identification
|
|
16
|
+
#[starknet::component]
|
|
17
|
+
pub mod MessagingChannelComponent {
|
|
18
|
+
use lz_utils::bytes::{Bytes32, ContractAddressIntoBytes32};
|
|
19
|
+
use lz_utils::keccak::keccak256;
|
|
20
|
+
use starknet::ContractAddress;
|
|
21
|
+
use starknet::storage::{
|
|
22
|
+
Map, Mutable, StoragePath, StoragePathEntry, StoragePointerReadAccess,
|
|
23
|
+
StoragePointerWriteAccess,
|
|
24
|
+
};
|
|
25
|
+
use starkware_utils::errors::assert_with_byte_array;
|
|
26
|
+
use crate::common::guid::GUID;
|
|
27
|
+
use crate::common::structs::packet::Origin;
|
|
28
|
+
use crate::endpoint::constants::{EMPTY_PAYLOAD_HASH, NIL_PAYLOAD_HASH};
|
|
29
|
+
use crate::endpoint::messaging_channel::errors::{err_invalid_nonce, err_payload_hash_not_found};
|
|
30
|
+
use crate::endpoint::messaging_channel::events::{
|
|
31
|
+
InboundNonceSkipped, PacketBurnt, PacketNilified,
|
|
32
|
+
};
|
|
33
|
+
use crate::endpoint::messaging_channel::interface::IMessagingChannel;
|
|
34
|
+
|
|
35
|
+
/// =============================== Storage =================================
|
|
36
|
+
|
|
37
|
+
#[storage]
|
|
38
|
+
pub struct Storage {
|
|
39
|
+
/// The universally unique endpoint identifier for this deployed instance
|
|
40
|
+
pub eid: u32,
|
|
41
|
+
/// Outbound nonce tracking: sender => [dstEid => [receiver => nonce]]
|
|
42
|
+
///
|
|
43
|
+
/// Tracks the number of messages sent from each sender to each destination.
|
|
44
|
+
/// Incremented atomically when messages are sent.
|
|
45
|
+
pub outbound_nonce: Map<ContractAddress, Map<u32, Map<Bytes32, u64>>>,
|
|
46
|
+
/// Lazy inbound nonce tracking: receiver => [srcEid => [sender => nonce]]
|
|
47
|
+
///
|
|
48
|
+
/// Represents the last processed nonce (checkpoint) for each path.
|
|
49
|
+
/// Updated lazily when messages are executed or explicitly skipped.
|
|
50
|
+
/// Used as starting point for calculating effective inbound nonce.
|
|
51
|
+
pub lazy_inbound_nonce: Map<ContractAddress, Map<u32, Map<Bytes32, u64>>>,
|
|
52
|
+
/// Inbound payload hash storage: receiver => [srcEid => [sender => [nonce => payloadHash]]]
|
|
53
|
+
///
|
|
54
|
+
/// Stores payload hashes for verified but not yet executed messages.
|
|
55
|
+
/// EMPTY_PAYLOAD_HASH (0) indicates message has been executed.
|
|
56
|
+
/// NIL_PAYLOAD_HASH (max) indicates message has been nilified.
|
|
57
|
+
/// Actual hash indicates message is verified and ready for execution.
|
|
58
|
+
pub inbound_payload_hash: Map<ContractAddress, Map<u32, Map<Bytes32, Map<u64, Bytes32>>>>,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/// =============================== Events =================================
|
|
62
|
+
#[event]
|
|
63
|
+
#[derive(Drop, starknet::Event)]
|
|
64
|
+
pub enum Event {
|
|
65
|
+
InboundNonceSkipped: InboundNonceSkipped,
|
|
66
|
+
PacketNilified: PacketNilified,
|
|
67
|
+
PacketBurnt: PacketBurnt,
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// =============================== Hooks =================================
|
|
71
|
+
pub trait IMessagingChannelHooks<TContractState> {
|
|
72
|
+
fn _assert_authorized(self: @ComponentState<TContractState>, receiver: ContractAddress);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/// =============================== Public Interface =================================
|
|
76
|
+
|
|
77
|
+
#[embeddable_as(MessagingChannel)]
|
|
78
|
+
impl MessagingChannelImpl<
|
|
79
|
+
TContractState,
|
|
80
|
+
+HasComponent<TContractState>,
|
|
81
|
+
impl IMessagingChannelHooks: IMessagingChannelHooks<TContractState>,
|
|
82
|
+
> of IMessagingChannel<ComponentState<TContractState>> {
|
|
83
|
+
fn inbound_nonce(
|
|
84
|
+
self: @ComponentState<TContractState>,
|
|
85
|
+
receiver: ContractAddress,
|
|
86
|
+
src_eid: u32,
|
|
87
|
+
sender: Bytes32,
|
|
88
|
+
) -> u64 {
|
|
89
|
+
// Start from the last lazy checkpoint
|
|
90
|
+
let mut nonce_cursor = self.lazy_inbound_nonce(receiver, src_eid, sender);
|
|
91
|
+
|
|
92
|
+
// Find the effective inbound nonce by checking consecutive verified nonces
|
|
93
|
+
while self._has_payload_hash(receiver, src_eid, sender, nonce_cursor + 1) {
|
|
94
|
+
nonce_cursor += 1;
|
|
95
|
+
}
|
|
96
|
+
nonce_cursor
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
fn outbound_nonce(
|
|
100
|
+
self: @ComponentState<TContractState>,
|
|
101
|
+
sender: ContractAddress,
|
|
102
|
+
dst_eid: u32,
|
|
103
|
+
receiver: Bytes32,
|
|
104
|
+
) -> u64 {
|
|
105
|
+
self.outbound_nonce.entry(sender).entry(dst_eid).entry(receiver).read()
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
fn inbound_payload_hash(
|
|
109
|
+
self: @ComponentState<TContractState>,
|
|
110
|
+
receiver: ContractAddress,
|
|
111
|
+
src_eid: u32,
|
|
112
|
+
sender: Bytes32,
|
|
113
|
+
nonce: u64,
|
|
114
|
+
) -> Bytes32 {
|
|
115
|
+
self._inbound_payload_hash(receiver, src_eid, sender, nonce)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
fn lazy_inbound_nonce(
|
|
119
|
+
self: @ComponentState<TContractState>,
|
|
120
|
+
receiver: ContractAddress,
|
|
121
|
+
src_eid: u32,
|
|
122
|
+
sender: Bytes32,
|
|
123
|
+
) -> u64 {
|
|
124
|
+
// Using helper function for consistent storage access
|
|
125
|
+
self.lazy_inbound_nonce.entry(receiver).entry(src_eid).entry(sender).read()
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
fn skip(
|
|
129
|
+
ref self: ComponentState<TContractState>, receiver: ContractAddress, origin: Origin,
|
|
130
|
+
) {
|
|
131
|
+
self._assert_authorized(receiver);
|
|
132
|
+
|
|
133
|
+
let Origin { src_eid, sender, nonce } = origin;
|
|
134
|
+
|
|
135
|
+
// Ensure the provided nonce is exactly the next expected nonce
|
|
136
|
+
assert_with_byte_array(
|
|
137
|
+
nonce == self.inbound_nonce(receiver, src_eid, sender) + 1, err_invalid_nonce(),
|
|
138
|
+
);
|
|
139
|
+
|
|
140
|
+
// Update the lazy inbound nonce to the skipped nonce (using helper function)
|
|
141
|
+
self._lazy_inbound_nonce_entry(receiver, src_eid, sender).write(nonce);
|
|
142
|
+
|
|
143
|
+
self.emit(InboundNonceSkipped { receiver, src_eid, sender, nonce });
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
fn nilify(
|
|
147
|
+
ref self: ComponentState<TContractState>,
|
|
148
|
+
receiver: ContractAddress,
|
|
149
|
+
origin: Origin,
|
|
150
|
+
payload_hash: Bytes32,
|
|
151
|
+
) {
|
|
152
|
+
self._assert_authorized(receiver);
|
|
153
|
+
|
|
154
|
+
// Validate and get current payload hash (using consolidated validation helper)
|
|
155
|
+
let current_payload_hash = self
|
|
156
|
+
._validate_and_get_payload_hash(receiver, @origin, payload_hash);
|
|
157
|
+
|
|
158
|
+
let Origin { src_eid, sender, nonce } = origin;
|
|
159
|
+
|
|
160
|
+
// Get the current lazy nonce for validation (using helper function)
|
|
161
|
+
let lazy_nonce = self._lazy_inbound_nonce_entry(receiver, src_eid, sender).read();
|
|
162
|
+
|
|
163
|
+
// If nonce is smaller or equal to the lazy nonce, ensure it's not already executed
|
|
164
|
+
assert_with_byte_array(
|
|
165
|
+
nonce > lazy_nonce || current_payload_hash != EMPTY_PAYLOAD_HASH,
|
|
166
|
+
err_invalid_nonce(),
|
|
167
|
+
);
|
|
168
|
+
|
|
169
|
+
// Set the payload hash to NIL to prevent execution (using helper function)
|
|
170
|
+
self
|
|
171
|
+
._inbound_payload_hash_entry(receiver, src_eid, sender, nonce)
|
|
172
|
+
.write(NIL_PAYLOAD_HASH);
|
|
173
|
+
|
|
174
|
+
self.emit(PacketNilified { receiver, src_eid, sender, nonce, payload_hash });
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
fn burn(
|
|
178
|
+
ref self: ComponentState<TContractState>,
|
|
179
|
+
receiver: ContractAddress,
|
|
180
|
+
origin: Origin,
|
|
181
|
+
payload_hash: Bytes32,
|
|
182
|
+
) {
|
|
183
|
+
self._assert_authorized(receiver);
|
|
184
|
+
|
|
185
|
+
let current_payload_hash = self
|
|
186
|
+
._validate_and_get_payload_hash(receiver, @origin, payload_hash);
|
|
187
|
+
|
|
188
|
+
let Origin { src_eid, sender, nonce } = origin;
|
|
189
|
+
|
|
190
|
+
let lazy_nonce = self._lazy_inbound_nonce_entry(receiver, src_eid, sender).read();
|
|
191
|
+
|
|
192
|
+
// Ensure the message hasn't been executed and nonce is smaller or equal to the lazy
|
|
193
|
+
// nonce
|
|
194
|
+
assert_with_byte_array(
|
|
195
|
+
current_payload_hash != EMPTY_PAYLOAD_HASH && nonce <= lazy_nonce,
|
|
196
|
+
err_invalid_nonce(),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
// Permanently remove the payload hash (using helper function)
|
|
200
|
+
self
|
|
201
|
+
._inbound_payload_hash_entry(receiver, src_eid, sender, nonce)
|
|
202
|
+
.write(EMPTY_PAYLOAD_HASH);
|
|
203
|
+
|
|
204
|
+
self.emit(PacketBurnt { receiver, src_eid, sender, nonce, payload_hash });
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
fn next_guid(
|
|
208
|
+
self: @ComponentState<TContractState>,
|
|
209
|
+
sender: ContractAddress,
|
|
210
|
+
dst_eid: u32,
|
|
211
|
+
receiver: Bytes32,
|
|
212
|
+
) -> Bytes32 {
|
|
213
|
+
let next_nonce = self.outbound_nonce(sender, dst_eid, receiver) + 1;
|
|
214
|
+
|
|
215
|
+
GUID::generate(next_nonce, self.eid.read(), sender.into(), dst_eid, receiver.into())
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/// =============================== Internal Interface =================================
|
|
220
|
+
|
|
221
|
+
/// Internal interface for component functions used by the endpoint and other components
|
|
222
|
+
#[generate_trait]
|
|
223
|
+
pub impl InternalImpl<
|
|
224
|
+
TContractState, +HasComponent<TContractState>,
|
|
225
|
+
> of InternalTrait<TContractState> {
|
|
226
|
+
/// Initialize the MessagingChannel component with the endpoint ID
|
|
227
|
+
///
|
|
228
|
+
/// Should be called during contract deployment/initialization.
|
|
229
|
+
/// The endpoint ID is immutable once set.
|
|
230
|
+
///
|
|
231
|
+
/// # Arguments
|
|
232
|
+
///
|
|
233
|
+
/// * `eid`: The universally unique endpoint identifier
|
|
234
|
+
fn initializer(ref self: ComponentState<TContractState>, eid: u32) {
|
|
235
|
+
self.eid.write(eid);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/// Returns a mutable storage path for the outbound nonce
|
|
239
|
+
///
|
|
240
|
+
/// Used internally by the endpoint to increment nonces when sending messages.
|
|
241
|
+
///
|
|
242
|
+
/// # Arguments
|
|
243
|
+
///
|
|
244
|
+
/// * `sender`: The sender contract address
|
|
245
|
+
/// * `dst_eid`: The destination endpoint ID
|
|
246
|
+
/// * `receiver`: The receiver address on the destination chain
|
|
247
|
+
///
|
|
248
|
+
/// # Returns
|
|
249
|
+
///
|
|
250
|
+
/// * `StoragePath<Mutable<u64>>`: Mutable storage path for the outbound nonce
|
|
251
|
+
fn _outbound_nonce_entry(
|
|
252
|
+
ref self: ComponentState<TContractState>,
|
|
253
|
+
sender: ContractAddress,
|
|
254
|
+
dst_eid: u32,
|
|
255
|
+
receiver: Bytes32,
|
|
256
|
+
) -> StoragePath<Mutable<u64>> {
|
|
257
|
+
self.outbound_nonce.entry(sender).entry(dst_eid).entry(receiver)
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/// Returns a mutable storage path for the lazy inbound nonce
|
|
261
|
+
///
|
|
262
|
+
/// Used internally to update checkpoint nonces during message execution.
|
|
263
|
+
///
|
|
264
|
+
/// # Arguments
|
|
265
|
+
///
|
|
266
|
+
/// * `receiver`: The receiver contract address
|
|
267
|
+
/// * `src_eid`: The source endpoint ID
|
|
268
|
+
/// * `sender`: The sender address on the source chain
|
|
269
|
+
///
|
|
270
|
+
/// # Returns
|
|
271
|
+
///
|
|
272
|
+
/// * `StoragePath<Mutable<u64>>`: Mutable storage path for the lazy inbound nonce
|
|
273
|
+
fn _lazy_inbound_nonce_entry(
|
|
274
|
+
ref self: ComponentState<TContractState>,
|
|
275
|
+
receiver: ContractAddress,
|
|
276
|
+
src_eid: u32,
|
|
277
|
+
sender: Bytes32,
|
|
278
|
+
) -> StoragePath<Mutable<u64>> {
|
|
279
|
+
self.lazy_inbound_nonce.entry(receiver).entry(src_eid).entry(sender)
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
/// Returns a mutable storage path for the inbound payload hash
|
|
283
|
+
///
|
|
284
|
+
/// Used internally to store and clear payload hashes during verification and execution.
|
|
285
|
+
///
|
|
286
|
+
/// # Arguments
|
|
287
|
+
///
|
|
288
|
+
/// * `receiver`: The receiver contract address
|
|
289
|
+
/// * `src_eid`: The source endpoint ID
|
|
290
|
+
/// * `sender`: The sender address on the source chain
|
|
291
|
+
/// * `nonce`: The message nonce
|
|
292
|
+
///
|
|
293
|
+
/// # Returns
|
|
294
|
+
///
|
|
295
|
+
/// * `StoragePath<Mutable<Bytes32>>`: Mutable storage path for the payload hash
|
|
296
|
+
fn _inbound_payload_hash_entry(
|
|
297
|
+
ref self: ComponentState<TContractState>,
|
|
298
|
+
receiver: ContractAddress,
|
|
299
|
+
src_eid: u32,
|
|
300
|
+
sender: Bytes32,
|
|
301
|
+
nonce: u64,
|
|
302
|
+
) -> StoragePath<Mutable<Bytes32>> {
|
|
303
|
+
self.inbound_payload_hash.entry(receiver).entry(src_eid).entry(sender).entry(nonce)
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/// Returns the inbound payload hash
|
|
307
|
+
///
|
|
308
|
+
/// # Arguments
|
|
309
|
+
///
|
|
310
|
+
/// * `receiver`: The receiver contract address
|
|
311
|
+
/// * `src_eid`: The source endpoint ID
|
|
312
|
+
/// * `sender`: The sender address on the source chain
|
|
313
|
+
/// * `nonce`: The message nonce
|
|
314
|
+
///
|
|
315
|
+
/// # Returns
|
|
316
|
+
///
|
|
317
|
+
/// * `Bytes32`: The payload hash
|
|
318
|
+
fn _inbound_payload_hash(
|
|
319
|
+
self: @ComponentState<TContractState>,
|
|
320
|
+
receiver: ContractAddress,
|
|
321
|
+
src_eid: u32,
|
|
322
|
+
sender: Bytes32,
|
|
323
|
+
nonce: u64,
|
|
324
|
+
) -> Bytes32 {
|
|
325
|
+
self
|
|
326
|
+
.inbound_payload_hash
|
|
327
|
+
.entry(receiver)
|
|
328
|
+
.entry(src_eid)
|
|
329
|
+
.entry(sender)
|
|
330
|
+
.entry(nonce)
|
|
331
|
+
.read()
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/// Checks if a payload hash exists for a specific message
|
|
335
|
+
///
|
|
336
|
+
/// Checks if the storage slot is not initialized.
|
|
337
|
+
/// Assumes computationally infeasible that payload can hash to 0.
|
|
338
|
+
/// Returns false for EMPTY_PAYLOAD_HASH (executed messages).
|
|
339
|
+
/// Returns true for both actual hashes and NIL_PAYLOAD_HASH (nilified messages).
|
|
340
|
+
///
|
|
341
|
+
/// # Arguments
|
|
342
|
+
///
|
|
343
|
+
/// * `receiver`: The receiver contract address
|
|
344
|
+
/// * `src_eid`: The source endpoint ID
|
|
345
|
+
/// * `sender`: The sender address on the source chain
|
|
346
|
+
/// * `nonce`: The message nonce to check
|
|
347
|
+
///
|
|
348
|
+
/// # Returns
|
|
349
|
+
///
|
|
350
|
+
/// * `bool`: True if a payload hash exists (message is verified), false otherwise
|
|
351
|
+
fn _has_payload_hash(
|
|
352
|
+
self: @ComponentState<TContractState>,
|
|
353
|
+
receiver: ContractAddress,
|
|
354
|
+
src_eid: u32,
|
|
355
|
+
sender: Bytes32,
|
|
356
|
+
nonce: u64,
|
|
357
|
+
) -> bool {
|
|
358
|
+
self._inbound_payload_hash(receiver, src_eid, sender, nonce) != EMPTY_PAYLOAD_HASH
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/// Validates that the provided payload hash matches the stored hash and returns it
|
|
362
|
+
///
|
|
363
|
+
/// Consolidates repetitive payload hash validation logic used in nilify() and burn().
|
|
364
|
+
///
|
|
365
|
+
/// # Arguments
|
|
366
|
+
///
|
|
367
|
+
/// * `receiver`: The receiver contract address
|
|
368
|
+
/// * `origin`: The origin information containing source endpoint, sender, and nonce
|
|
369
|
+
/// * `expected_payload_hash`: The payload hash to validate against stored hash
|
|
370
|
+
///
|
|
371
|
+
/// # Returns
|
|
372
|
+
///
|
|
373
|
+
/// * `Bytes32`: The validated current payload hash from storage
|
|
374
|
+
///
|
|
375
|
+
/// # Panics
|
|
376
|
+
///
|
|
377
|
+
/// * `err_payload_hash_not_found`: If the stored hash doesn't match the expected hash
|
|
378
|
+
fn _validate_and_get_payload_hash(
|
|
379
|
+
ref self: ComponentState<TContractState>,
|
|
380
|
+
receiver: ContractAddress,
|
|
381
|
+
origin: @Origin,
|
|
382
|
+
expected_payload_hash: Bytes32,
|
|
383
|
+
) -> Bytes32 {
|
|
384
|
+
let current_payload_hash = self
|
|
385
|
+
._inbound_payload_hash_entry(
|
|
386
|
+
receiver, *origin.src_eid, *origin.sender, *origin.nonce,
|
|
387
|
+
)
|
|
388
|
+
.read();
|
|
389
|
+
assert_with_byte_array(
|
|
390
|
+
current_payload_hash == expected_payload_hash,
|
|
391
|
+
err_payload_hash_not_found(expected_payload_hash, current_payload_hash),
|
|
392
|
+
);
|
|
393
|
+
current_payload_hash
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
/// Clears a payload after successful execution and updates lazy nonce
|
|
397
|
+
///
|
|
398
|
+
/// This function is called during message execution to clear verified payloads.
|
|
399
|
+
/// Updates the lazy_inbound_nonce to the provided nonce if it's greater than current.
|
|
400
|
+
/// Verifies that all nonces between current and target have payload hashes (ordered
|
|
401
|
+
/// execution).
|
|
402
|
+
/// Validates the payload hash matches the stored hash before clearing.
|
|
403
|
+
/// Sets the payload hash to EMPTY_PAYLOAD_HASH to mark as executed.
|
|
404
|
+
///
|
|
405
|
+
/// # Arguments
|
|
406
|
+
///
|
|
407
|
+
/// * `receiver`: The receiver contract address
|
|
408
|
+
/// * `origin`: The origin information containing source endpoint, sender, and nonce
|
|
409
|
+
/// * `payload`: The payload bytes to verify and clear
|
|
410
|
+
fn _clear_payload(
|
|
411
|
+
ref self: ComponentState<TContractState>,
|
|
412
|
+
receiver: ContractAddress,
|
|
413
|
+
origin: @Origin,
|
|
414
|
+
payload: @ByteArray,
|
|
415
|
+
) {
|
|
416
|
+
// Get the current lazy nonce checkpoint
|
|
417
|
+
let lazy_nonce_entry = self
|
|
418
|
+
._lazy_inbound_nonce_entry(receiver, *origin.src_eid, *origin.sender);
|
|
419
|
+
let current_nonce = lazy_nonce_entry.read();
|
|
420
|
+
|
|
421
|
+
// If this nonce is beyond the current checkpoint, validate ordered execution
|
|
422
|
+
if *origin.nonce > current_nonce {
|
|
423
|
+
// Ensure that no nonce between current_nonce and origin.nonce is missing a payload
|
|
424
|
+
// hash. Because if it is, it means we have an unverified nonce in between
|
|
425
|
+
// and we can't execute the packet until everything before it is committed
|
|
426
|
+
for nonce in current_nonce + 1..*origin.nonce {
|
|
427
|
+
assert_with_byte_array(
|
|
428
|
+
self._has_payload_hash(receiver, *origin.src_eid, *origin.sender, nonce),
|
|
429
|
+
err_invalid_nonce(),
|
|
430
|
+
);
|
|
431
|
+
}
|
|
432
|
+
// Update the lazy nonce to the current execution point
|
|
433
|
+
lazy_nonce_entry.write(*origin.nonce);
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Verify the payload hash matches what was stored during verification
|
|
437
|
+
let actual_payload_hash = keccak256(payload);
|
|
438
|
+
let hash_entry = self
|
|
439
|
+
._inbound_payload_hash_entry(
|
|
440
|
+
receiver, *origin.src_eid, *origin.sender, *origin.nonce,
|
|
441
|
+
);
|
|
442
|
+
let expected_payload_hash = hash_entry.read();
|
|
443
|
+
|
|
444
|
+
assert_with_byte_array(
|
|
445
|
+
actual_payload_hash == expected_payload_hash,
|
|
446
|
+
err_payload_hash_not_found(expected_payload_hash, actual_payload_hash),
|
|
447
|
+
);
|
|
448
|
+
|
|
449
|
+
// Clear the payload hash to mark as executed
|
|
450
|
+
hash_entry.write(EMPTY_PAYLOAD_HASH);
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
//! Messaging composer errors
|
|
2
|
+
|
|
3
|
+
use lz_utils::bytes::Bytes32;
|
|
4
|
+
use lz_utils::error::{Error, format_error};
|
|
5
|
+
|
|
6
|
+
#[derive(Drop)]
|
|
7
|
+
pub enum MessagingChannelError {
|
|
8
|
+
/// Triggered when a compose message already exists and cannot be overwritten.
|
|
9
|
+
LzComposeAlreadyExists,
|
|
10
|
+
/// Triggered when a compose message is not found.
|
|
11
|
+
LzComposeNotFound,
|
|
12
|
+
/// Triggered when the value sent with a compose message exceeds the token allowance.
|
|
13
|
+
LzComposeValueExceedsAllowance,
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
impl ErrorNameImpl of Error<MessagingChannelError> {
|
|
17
|
+
fn prefix() -> ByteArray {
|
|
18
|
+
"LZ_MESSAGING_COMPOSER"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
fn name(self: MessagingChannelError) -> ByteArray {
|
|
22
|
+
match self {
|
|
23
|
+
MessagingChannelError::LzComposeAlreadyExists => "LZ_COMPOSE_ALREADY_EXISTS",
|
|
24
|
+
MessagingChannelError::LzComposeNotFound => "LZ_COMPOSE_NOT_FOUND",
|
|
25
|
+
MessagingChannelError::LzComposeValueExceedsAllowance => "LZ_COMPOSE_VALUE_EXCEEDS_ALLOWANCE",
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
pub fn err_lz_compose_not_found(expected_hash: Bytes32, actual_hash: Bytes32) -> ByteArray {
|
|
31
|
+
format_error(
|
|
32
|
+
MessagingChannelError::LzComposeNotFound,
|
|
33
|
+
format!("Expected hash: {}, Actual hash: {}", expected_hash.value, actual_hash.value),
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
pub fn err_lz_compose_value_exceeds_allowance(value: u256, allowance: u256) -> ByteArray {
|
|
38
|
+
format_error(
|
|
39
|
+
MessagingChannelError::LzComposeValueExceedsAllowance,
|
|
40
|
+
format!("Value: {}, Allowance: {}", value, allowance),
|
|
41
|
+
)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
pub fn err_lz_compose_already_exists() -> ByteArray {
|
|
45
|
+
format_error(MessagingChannelError::LzComposeAlreadyExists, "")
|
|
46
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//! Messaging composer events
|
|
2
|
+
|
|
3
|
+
use lz_utils::bytes::Bytes32;
|
|
4
|
+
use starknet::ContractAddress;
|
|
5
|
+
|
|
6
|
+
/// Emitted when a compose message is sent.
|
|
7
|
+
#[derive(Drop, starknet::Event)]
|
|
8
|
+
pub struct ComposeSent {
|
|
9
|
+
/// The sender of the compose message.
|
|
10
|
+
#[key]
|
|
11
|
+
pub from: ContractAddress,
|
|
12
|
+
/// The recipient of the compose message.
|
|
13
|
+
#[key]
|
|
14
|
+
pub to: ContractAddress,
|
|
15
|
+
/// The GUID of the original message.
|
|
16
|
+
#[key]
|
|
17
|
+
pub guid: Bytes32,
|
|
18
|
+
/// The index of the compose message.
|
|
19
|
+
pub index: u16,
|
|
20
|
+
/// The message payload.
|
|
21
|
+
pub message: ByteArray,
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/// Emitted when a compose message is delivered.
|
|
25
|
+
#[derive(Drop, starknet::Event)]
|
|
26
|
+
pub struct ComposeDelivered {
|
|
27
|
+
/// The sender of the compose message.
|
|
28
|
+
#[key]
|
|
29
|
+
pub from: ContractAddress,
|
|
30
|
+
/// The recipient of the compose message.
|
|
31
|
+
#[key]
|
|
32
|
+
pub to: ContractAddress,
|
|
33
|
+
/// The GUID of the original message.
|
|
34
|
+
#[key]
|
|
35
|
+
pub guid: Bytes32,
|
|
36
|
+
/// The index of the compose message.
|
|
37
|
+
pub index: u16,
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/// Emitted when a compose message fails.
|
|
41
|
+
#[derive(Drop, starknet::Event)]
|
|
42
|
+
pub struct LzComposeAlert {
|
|
43
|
+
/// The sender of the compose message.
|
|
44
|
+
#[key]
|
|
45
|
+
pub from: ContractAddress,
|
|
46
|
+
/// The recipient of the compose message.
|
|
47
|
+
#[key]
|
|
48
|
+
pub to: ContractAddress,
|
|
49
|
+
/// The address of the executor that triggered the alert.
|
|
50
|
+
#[key]
|
|
51
|
+
pub executor: ContractAddress,
|
|
52
|
+
/// The GUID of the original message.
|
|
53
|
+
#[key]
|
|
54
|
+
pub guid: Bytes32,
|
|
55
|
+
/// The index of the compose message.
|
|
56
|
+
pub index: u16,
|
|
57
|
+
/// The gas amount related to the alert.
|
|
58
|
+
pub gas: u256,
|
|
59
|
+
/// The value sent with the message.
|
|
60
|
+
pub value: u256,
|
|
61
|
+
/// The message payload.
|
|
62
|
+
pub message: ByteArray,
|
|
63
|
+
/// Extra data provided with the alert.
|
|
64
|
+
pub extra_data: ByteArray,
|
|
65
|
+
/// The reason for the alert.
|
|
66
|
+
pub reason: Array<felt252>,
|
|
67
|
+
}
|