@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,74 @@
|
|
|
1
|
+
//! Price feed structs
|
|
2
|
+
|
|
3
|
+
/// Fee estimate
|
|
4
|
+
#[derive(Drop, Serde, Default, PartialEq, Debug)]
|
|
5
|
+
pub struct FeeEstimate {
|
|
6
|
+
pub gas_fee: u256,
|
|
7
|
+
pub price_ratio: u128,
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/// Response for a fee estimation
|
|
11
|
+
#[derive(Drop, Serde, Default, PartialEq, Debug)]
|
|
12
|
+
pub struct GetFeeResponse {
|
|
13
|
+
pub gas_fee: u256,
|
|
14
|
+
pub price_ratio: u128,
|
|
15
|
+
pub price_ratio_denominator: u128,
|
|
16
|
+
pub native_price_usd: u128,
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/// Price for a given EID
|
|
20
|
+
#[derive(Drop, Serde, starknet::Store, Default, PartialEq, Clone, Debug)]
|
|
21
|
+
pub struct Price {
|
|
22
|
+
/// Conversion multiplier used to translate the destination chain's native token value
|
|
23
|
+
/// into the source chain's native token units.
|
|
24
|
+
///
|
|
25
|
+
/// This is a fixed-point number encoded as a `u128`, where the float value is scaled
|
|
26
|
+
/// by 10^20 for precision (i.e., 1.0 = 10^20).
|
|
27
|
+
///
|
|
28
|
+
/// The `price_ratio` incorporates two factors:
|
|
29
|
+
/// 1. Decimal normalization between destination and source tokens.
|
|
30
|
+
/// 2. The actual relative price (exchange rate) between the two tokens.
|
|
31
|
+
///
|
|
32
|
+
/// For example, if the source is an EVM chain (18 decimals) and the destination is Aptos (8
|
|
33
|
+
/// decimals), with a 1:1 token price, the base multiplier would be (10^18 / 10^8) = 10^10.
|
|
34
|
+
/// To represent this in fixed-point form, you multiply by 10^20, giving a `price_ratio` of
|
|
35
|
+
/// 10^30.
|
|
36
|
+
///
|
|
37
|
+
/// In real usage, `price_ratio` reflects both decimal scaling and fluctuating market prices.
|
|
38
|
+
pub price_ratio: u128,
|
|
39
|
+
pub gas_price_in_unit: u64, // for evm, it is in wei, for aptos, it is in octas.
|
|
40
|
+
pub gas_per_byte: u32,
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
#[derive(Drop, Serde, Default, PartialEq)]
|
|
44
|
+
pub struct SetEidToModelTypeParam {
|
|
45
|
+
pub eid: u32,
|
|
46
|
+
pub model_type: ModelType,
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
#[derive(Drop, Serde, Default, PartialEq)]
|
|
50
|
+
pub struct SetPriceParam {
|
|
51
|
+
pub eid: u32,
|
|
52
|
+
pub price: Price,
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
#[derive(Drop, Serde, starknet::Store, Default, PartialEq, Clone, Debug)]
|
|
56
|
+
pub struct ArbitrumPriceExt {
|
|
57
|
+
pub gas_per_l2_tx: u64,
|
|
58
|
+
pub gas_per_l1_call_data_byte: u32,
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
#[derive(Drop, Serde, Default, PartialEq, Clone)]
|
|
62
|
+
pub struct UpdatePriceExt {
|
|
63
|
+
pub eid: u32,
|
|
64
|
+
pub price: Price,
|
|
65
|
+
pub extend: ArbitrumPriceExt,
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
#[derive(Drop, Serde, starknet::Store, Default, PartialEq, Debug)]
|
|
69
|
+
pub enum ModelType {
|
|
70
|
+
#[default]
|
|
71
|
+
DEFAULT,
|
|
72
|
+
OP_STACK,
|
|
73
|
+
ARB_STACK,
|
|
74
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
use layerzero::endpoint::constants::{EMPTY_PAYLOAD_HASH, NIL_PAYLOAD_HASH};
|
|
2
|
+
use layerzero::message_lib::uln::ultra_light_node::UltraLightNode::EMPTY_VERIFICATION;
|
|
3
|
+
use lz_utils::bytes::Bytes32;
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn empty_payload_hash_should_be_default() {
|
|
7
|
+
assert(EMPTY_PAYLOAD_HASH == Default::default(), 'Empty payload hash should be 0');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
#[test]
|
|
11
|
+
fn nil_payload_hash_should_be_max_u256() {
|
|
12
|
+
assert(
|
|
13
|
+
NIL_PAYLOAD_HASH == Bytes32 { value: core::num::traits::Bounded::<u256>::MAX },
|
|
14
|
+
'Nil payload hash != max u256',
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
#[test]
|
|
19
|
+
fn empty_verification_should_be_default() {
|
|
20
|
+
assert(EMPTY_VERIFICATION == Default::default(), 'Empty verification should be 0');
|
|
21
|
+
}
|
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
//! GUID generation tests
|
|
2
|
+
|
|
3
|
+
use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
|
|
4
|
+
use core::num::traits::Bounded;
|
|
5
|
+
use layerzero::common::guid::GUID;
|
|
6
|
+
use lz_utils::bytes::Bytes32;
|
|
7
|
+
use lz_utils::keccak::keccak256;
|
|
8
|
+
|
|
9
|
+
// Test constants
|
|
10
|
+
pub const MAX_U64: u64 = Bounded::MAX;
|
|
11
|
+
pub const MAX_U32: u32 = Bounded::MAX;
|
|
12
|
+
pub const MAX_U256: u256 = Bounded::MAX;
|
|
13
|
+
|
|
14
|
+
#[test]
|
|
15
|
+
#[fuzzer(runs: 10)]
|
|
16
|
+
fn should_generate_deterministic_guid(
|
|
17
|
+
nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_value: u256,
|
|
18
|
+
) {
|
|
19
|
+
let sender = Bytes32 { value: sender_value };
|
|
20
|
+
let receiver = Bytes32 { value: receiver_value };
|
|
21
|
+
|
|
22
|
+
let guid1 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver);
|
|
23
|
+
let guid2 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver);
|
|
24
|
+
|
|
25
|
+
// Same inputs should produce same GUID
|
|
26
|
+
assert(guid1.value == guid2.value, 'GUID should be deterministic');
|
|
27
|
+
// GUID should not be zero (extremely unlikely with keccak256)
|
|
28
|
+
assert(guid1.value != 0, 'GUID should not be zero');
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
#[test]
|
|
32
|
+
#[fuzzer(runs: 10)]
|
|
33
|
+
fn should_generate_different_guid_for_different_nonces(
|
|
34
|
+
nonce_1: u64,
|
|
35
|
+
nonce_2: u64,
|
|
36
|
+
src_eid: u32,
|
|
37
|
+
sender_value: u256,
|
|
38
|
+
dst_eid: u32,
|
|
39
|
+
receiver_value: u256,
|
|
40
|
+
) {
|
|
41
|
+
// Ensure the nonces are different
|
|
42
|
+
// Same nonces are tested in should_generate_deterministic_guid
|
|
43
|
+
if nonce_1 == nonce_2 {
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
let sender = Bytes32 { value: sender_value };
|
|
48
|
+
let receiver = Bytes32 { value: receiver_value };
|
|
49
|
+
|
|
50
|
+
let guid_1 = GUID::generate(nonce_1, src_eid, sender, dst_eid, receiver);
|
|
51
|
+
let guid_2 = GUID::generate(nonce_2, src_eid, sender, dst_eid, receiver);
|
|
52
|
+
|
|
53
|
+
assert(guid_1.value != guid_2.value, 'Different nonces should change');
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
#[test]
|
|
57
|
+
#[fuzzer(runs: 10)]
|
|
58
|
+
fn should_generate_different_guid_for_different_src_eid(
|
|
59
|
+
nonce: u64,
|
|
60
|
+
src_eid_1: u32,
|
|
61
|
+
src_eid_2: u32,
|
|
62
|
+
sender_value: u256,
|
|
63
|
+
dst_eid: u32,
|
|
64
|
+
receiver_value: u256,
|
|
65
|
+
) {
|
|
66
|
+
// Ensure the src_eids are different
|
|
67
|
+
// Same src_eid are tested in should_generate_deterministic_guid
|
|
68
|
+
if src_eid_1 == src_eid_2 {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
let sender = Bytes32 { value: sender_value };
|
|
73
|
+
let receiver = Bytes32 { value: receiver_value };
|
|
74
|
+
|
|
75
|
+
let guid_1 = GUID::generate(nonce, src_eid_1, sender, dst_eid, receiver);
|
|
76
|
+
let guid_2 = GUID::generate(nonce, src_eid_2, sender, dst_eid, receiver);
|
|
77
|
+
|
|
78
|
+
assert(guid_1.value != guid_2.value, 'Different src_eid should change');
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
#[test]
|
|
82
|
+
#[fuzzer(runs: 10)]
|
|
83
|
+
fn should_generate_different_guid_for_different_sender(
|
|
84
|
+
nonce: u64, src_eid: u32, sender_1: u256, sender_2: u256, dst_eid: u32, receiver_value: u256,
|
|
85
|
+
) {
|
|
86
|
+
// Ensure the senders are different
|
|
87
|
+
// Same sender are tested in should_generate_deterministic_guid
|
|
88
|
+
if sender_1 == sender_2 {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
let sender_1 = Bytes32 { value: sender_1 };
|
|
93
|
+
let sender_2 = Bytes32 { value: sender_2 };
|
|
94
|
+
let receiver = Bytes32 { value: receiver_value };
|
|
95
|
+
|
|
96
|
+
let guid_1 = GUID::generate(nonce, src_eid, sender_1, dst_eid, receiver);
|
|
97
|
+
let guid_2 = GUID::generate(nonce, src_eid, sender_2, dst_eid, receiver);
|
|
98
|
+
|
|
99
|
+
assert(guid_1.value != guid_2.value, 'Different sender should change');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
#[test]
|
|
103
|
+
#[fuzzer(runs: 10)]
|
|
104
|
+
fn should_generate_different_guid_for_different_dst_eid(
|
|
105
|
+
nonce: u64,
|
|
106
|
+
src_eid: u32,
|
|
107
|
+
sender_value: u256,
|
|
108
|
+
dst_eid_1: u32,
|
|
109
|
+
dst_eid_2: u32,
|
|
110
|
+
receiver_value: u256,
|
|
111
|
+
) {
|
|
112
|
+
// Ensure the dst_eids are different
|
|
113
|
+
// Same dst_eid are tested in should_generate_deterministic_guid
|
|
114
|
+
if dst_eid_1 == dst_eid_2 {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
let sender = Bytes32 { value: sender_value };
|
|
119
|
+
let receiver = Bytes32 { value: receiver_value };
|
|
120
|
+
|
|
121
|
+
let guid_1 = GUID::generate(nonce, src_eid, sender, dst_eid_1, receiver);
|
|
122
|
+
let guid_2 = GUID::generate(nonce, src_eid, sender, dst_eid_2, receiver);
|
|
123
|
+
|
|
124
|
+
assert(guid_1.value != guid_2.value, 'Different dst_eid should change');
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#[test]
|
|
128
|
+
#[fuzzer(runs: 10)]
|
|
129
|
+
fn should_generate_different_guid_for_different_receiver(
|
|
130
|
+
nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_1: u256, receiver_2: u256,
|
|
131
|
+
) {
|
|
132
|
+
// Ensure the receivers are different
|
|
133
|
+
// Same receiver are tested in should_generate_deterministic_guid
|
|
134
|
+
if receiver_1 == receiver_2 {
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
let sender = Bytes32 { value: sender_value };
|
|
139
|
+
let receiver_1 = Bytes32 { value: receiver_1 };
|
|
140
|
+
let receiver_2 = Bytes32 { value: receiver_2 };
|
|
141
|
+
|
|
142
|
+
let guid_1 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver_1);
|
|
143
|
+
let guid_2 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver_2);
|
|
144
|
+
|
|
145
|
+
assert_ne!(guid_1.value, guid_2.value, "Different receivers should change");
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
#[test]
|
|
149
|
+
#[fuzzer(runs: 10)]
|
|
150
|
+
fn should_match_manual_hash_calculation(
|
|
151
|
+
nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_value: u256,
|
|
152
|
+
) {
|
|
153
|
+
let sender = Bytes32 { value: sender_value };
|
|
154
|
+
let receiver = Bytes32 { value: receiver_value };
|
|
155
|
+
|
|
156
|
+
let guid = GUID::generate(nonce, src_eid, sender, dst_eid, receiver);
|
|
157
|
+
|
|
158
|
+
// Manually construct the expected ByteArray and hash it
|
|
159
|
+
let mut expected_bytes: ByteArray = Default::default();
|
|
160
|
+
expected_bytes.append_u64(nonce);
|
|
161
|
+
expected_bytes.append_u32(src_eid);
|
|
162
|
+
expected_bytes.append_u256(sender.value);
|
|
163
|
+
expected_bytes.append_u32(dst_eid);
|
|
164
|
+
expected_bytes.append_u256(receiver.value);
|
|
165
|
+
|
|
166
|
+
let expected_guid = keccak256(@expected_bytes);
|
|
167
|
+
|
|
168
|
+
assert(guid.value == expected_guid.value, 'GUID should match manual');
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
#[test]
|
|
172
|
+
#[fuzzer(runs: 10)]
|
|
173
|
+
fn should_have_collision_resistance(
|
|
174
|
+
nonce: u64, src_eid: u32, sender_value: u256, dst_eid: u32, receiver_value: u256,
|
|
175
|
+
) {
|
|
176
|
+
let sender = Bytes32 { value: sender_value };
|
|
177
|
+
let receiver1 = Bytes32 { value: receiver_value };
|
|
178
|
+
let receiver2 = Bytes32 { value: receiver_value + 1 };
|
|
179
|
+
|
|
180
|
+
let guid1 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver1);
|
|
181
|
+
let guid2 = GUID::generate(nonce, src_eid, sender, dst_eid, receiver2);
|
|
182
|
+
|
|
183
|
+
// Verify the GUIDs are different (collision resistance)
|
|
184
|
+
assert(guid1.value != guid2.value, 'Should be different');
|
|
185
|
+
|
|
186
|
+
// Verify the difference is significant (not just a small bit flip)
|
|
187
|
+
let xor_diff = guid1.value ^ guid2.value;
|
|
188
|
+
assert(xor_diff != 0, 'Should be different');
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
#[test]
|
|
192
|
+
fn should_generate_guid_with_zero_values() {
|
|
193
|
+
let guid = GUID::generate(0, 0, Bytes32 { value: 0 }, 0, Bytes32 { value: 0 });
|
|
194
|
+
// Even zero inputs should produce non-zero GUID due to keccak256 properties
|
|
195
|
+
assert(guid.value != 0, 'Should be different');
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
#[test]
|
|
199
|
+
fn should_generate_guid_with_max_values() {
|
|
200
|
+
let max_bytes = Bytes32 { value: MAX_U256 };
|
|
201
|
+
|
|
202
|
+
let guid = GUID::generate(MAX_U64, MAX_U32, max_bytes, MAX_U32, max_bytes);
|
|
203
|
+
assert(guid.value != 0, 'Should be different');
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
#[test]
|
|
207
|
+
fn should_generate_realistic_layerzero_guid() {
|
|
208
|
+
const REALISTIC_NONCE: u64 = 987654321;
|
|
209
|
+
const ETHEREUM_EID: u32 = 30101;
|
|
210
|
+
const ARBITRUM_EID: u32 = 30110;
|
|
211
|
+
const MOCK_SENDER_ADDRESS: u256 = 0x742d35Cc6634C0532925a3b8D8E3C9b6b32a1E5A;
|
|
212
|
+
const MOCK_RECEIVER_ADDRESS: u256 = 0x8ba1f109551bD432803012645bac136c22afBa93;
|
|
213
|
+
|
|
214
|
+
// Test with realistic LayerZero values
|
|
215
|
+
let sender = Bytes32 { value: MOCK_SENDER_ADDRESS };
|
|
216
|
+
let receiver = Bytes32 { value: MOCK_RECEIVER_ADDRESS };
|
|
217
|
+
|
|
218
|
+
let guid = GUID::generate(REALISTIC_NONCE, ETHEREUM_EID, sender, ARBITRUM_EID, receiver);
|
|
219
|
+
|
|
220
|
+
// Verify GUID properties
|
|
221
|
+
assert(guid.value != 0, 'Should be different');
|
|
222
|
+
|
|
223
|
+
// Test deterministic behavior
|
|
224
|
+
let guid_repeat = GUID::generate(REALISTIC_NONCE, ETHEREUM_EID, sender, ARBITRUM_EID, receiver);
|
|
225
|
+
assert(guid.value == guid_repeat.value, 'Should be the same');
|
|
226
|
+
|
|
227
|
+
// Test that incrementing nonce changes GUID
|
|
228
|
+
let guid_next_nonce = GUID::generate(
|
|
229
|
+
REALISTIC_NONCE + 1, ETHEREUM_EID, sender, ARBITRUM_EID, receiver,
|
|
230
|
+
);
|
|
231
|
+
assert(guid.value != guid_next_nonce.value, 'Should be different');
|
|
232
|
+
}
|
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
//! Test packet v1 codec
|
|
2
|
+
|
|
3
|
+
use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
|
|
4
|
+
use layerzero::common::packet_v1_codec::PacketV1Codec;
|
|
5
|
+
use layerzero::common::packet_v1_codec::PacketV1Codec::{PacketPayload, PacketSenderBytes};
|
|
6
|
+
use layerzero::common::structs::packet::Packet;
|
|
7
|
+
use lz_utils::bytes::{Bytes32, ContractAddressIntoBytes32};
|
|
8
|
+
use snforge_std::fuzzable::{FuzzableU32, FuzzableU64, FuzzableU8};
|
|
9
|
+
use starknet::ContractAddress;
|
|
10
|
+
use starkware_utils::constants::MAX_U256;
|
|
11
|
+
use crate::fuzzable::bytes32::FuzzableBytes32;
|
|
12
|
+
use crate::fuzzable::contract_address::FuzzableContractAddress;
|
|
13
|
+
use crate::fuzzable::eid::{Eid, FuzzableEid};
|
|
14
|
+
use crate::fuzzable::small_byte_array::FuzzableByteArray;
|
|
15
|
+
|
|
16
|
+
#[test]
|
|
17
|
+
#[fuzzer(runs: 10)]
|
|
18
|
+
fn test_encode_decode_packet(
|
|
19
|
+
sender: ContractAddress,
|
|
20
|
+
receiver: ContractAddress,
|
|
21
|
+
nonce: u64,
|
|
22
|
+
guid: Bytes32,
|
|
23
|
+
src_eid: Eid,
|
|
24
|
+
dst_eid: Eid,
|
|
25
|
+
message: ByteArray,
|
|
26
|
+
) {
|
|
27
|
+
let src_eid = src_eid.eid;
|
|
28
|
+
let dst_eid = dst_eid.eid;
|
|
29
|
+
let receiver = receiver.into();
|
|
30
|
+
let packet = Packet {
|
|
31
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
32
|
+
};
|
|
33
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
34
|
+
|
|
35
|
+
// Verify decoding individual fields
|
|
36
|
+
assert(PacketV1Codec::version(@encoded) == PacketV1Codec::PACKET_VERSION, 'version mismatch');
|
|
37
|
+
assert(PacketV1Codec::nonce(@encoded) == nonce, 'nonce mismatch');
|
|
38
|
+
assert(PacketV1Codec::src_eid(@encoded) == src_eid, 'src_eid mismatch');
|
|
39
|
+
assert(PacketV1Codec::dst_eid(@encoded) == dst_eid, 'dst_eid mismatch');
|
|
40
|
+
assert(PacketV1Codec::receiver(@encoded) == receiver, 'receiver mismatch');
|
|
41
|
+
assert(PacketV1Codec::guid(@encoded) == guid, 'guid mismatch');
|
|
42
|
+
assert(PacketV1Codec::message(@encoded) == message, 'message mismatch');
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
#[test]
|
|
46
|
+
#[fuzzer(runs: 10)]
|
|
47
|
+
fn test_encode_packet_header(
|
|
48
|
+
sender: ContractAddress,
|
|
49
|
+
receiver: ContractAddress,
|
|
50
|
+
nonce: u64,
|
|
51
|
+
guid: Bytes32,
|
|
52
|
+
src_eid: Eid,
|
|
53
|
+
dst_eid: Eid,
|
|
54
|
+
message: ByteArray,
|
|
55
|
+
) {
|
|
56
|
+
let src_eid = src_eid.eid;
|
|
57
|
+
let dst_eid = dst_eid.eid;
|
|
58
|
+
let receiver = receiver.into();
|
|
59
|
+
let packet = Packet { nonce, src_eid, sender, dst_eid, receiver, guid, message };
|
|
60
|
+
|
|
61
|
+
// Header should be exactly 81 bytes (up to GUID_OFFSET)
|
|
62
|
+
let header = PacketV1Codec::encode_header(@packet);
|
|
63
|
+
assert(header.len() == PacketV1Codec::GUID_OFFSET, 'header length mismatch');
|
|
64
|
+
|
|
65
|
+
// Verify header extraction from full packet
|
|
66
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
67
|
+
assert(PacketV1Codec::header(@encoded) == header, 'header extraction mismatch');
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
#[test]
|
|
71
|
+
#[fuzzer(runs: 10)]
|
|
72
|
+
fn test_encode_payload(
|
|
73
|
+
sender: ContractAddress,
|
|
74
|
+
receiver: ContractAddress,
|
|
75
|
+
nonce: u64,
|
|
76
|
+
guid: Bytes32,
|
|
77
|
+
src_eid: Eid,
|
|
78
|
+
dst_eid: Eid,
|
|
79
|
+
message: ByteArray,
|
|
80
|
+
) {
|
|
81
|
+
let src_eid = src_eid.eid;
|
|
82
|
+
let dst_eid = dst_eid.eid;
|
|
83
|
+
let receiver = receiver.into();
|
|
84
|
+
let packet = Packet {
|
|
85
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
// Verify payload extraction from full packet
|
|
89
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
90
|
+
let payload = PacketV1Codec::payload(@encoded);
|
|
91
|
+
assert(PacketV1Codec::encode_payload(@packet) == payload, 'payload extraction mismatch');
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
#[test]
|
|
95
|
+
#[fuzzer(runs: 10)]
|
|
96
|
+
fn test_payload_hash(
|
|
97
|
+
sender: ContractAddress,
|
|
98
|
+
receiver: ContractAddress,
|
|
99
|
+
nonce: u64,
|
|
100
|
+
guid: Bytes32,
|
|
101
|
+
src_eid: Eid,
|
|
102
|
+
dst_eid: Eid,
|
|
103
|
+
message: ByteArray,
|
|
104
|
+
) {
|
|
105
|
+
let src_eid = src_eid.eid;
|
|
106
|
+
let dst_eid = dst_eid.eid;
|
|
107
|
+
let receiver = receiver.into();
|
|
108
|
+
let packet = Packet {
|
|
109
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Payload hash should not be zero
|
|
113
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
114
|
+
let payload_hash = PacketV1Codec::payload_hash(@encoded);
|
|
115
|
+
assert(payload_hash.value != 0, 'payload hash is zero');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
#[test]
|
|
119
|
+
#[fuzzer(runs: 10)]
|
|
120
|
+
fn test_sender_address_conversion(
|
|
121
|
+
sender: ContractAddress,
|
|
122
|
+
receiver: ContractAddress,
|
|
123
|
+
nonce: u64,
|
|
124
|
+
guid: Bytes32,
|
|
125
|
+
src_eid: Eid,
|
|
126
|
+
dst_eid: Eid,
|
|
127
|
+
message: ByteArray,
|
|
128
|
+
) {
|
|
129
|
+
let src_eid = src_eid.eid;
|
|
130
|
+
let dst_eid = dst_eid.eid;
|
|
131
|
+
let receiver = receiver.into();
|
|
132
|
+
let packet = Packet {
|
|
133
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
// Should be able to decode the sender address
|
|
137
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
138
|
+
let decoded_sender = PacketV1Codec::sender_address(@encoded);
|
|
139
|
+
assert(decoded_sender == sender, 'Decoded sender should match');
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
#[test]
|
|
143
|
+
#[fuzzer(runs: 10)]
|
|
144
|
+
#[should_panic(expected: "LZ_PACKET_V1_CODEC_INVALID_SENDER_ADDRESS")]
|
|
145
|
+
fn test_invalid_sender_address(random_8_bytes: u64, random_4_bytes: u32, random_byte: u8) {
|
|
146
|
+
// This will fail since its not a valid felt252, so its not a valid contract address
|
|
147
|
+
let mut encoded: ByteArray = Default::default();
|
|
148
|
+
// adding 13 bytes since its the sender offset
|
|
149
|
+
encoded.append_u64(random_8_bytes);
|
|
150
|
+
encoded.append_u32(random_4_bytes);
|
|
151
|
+
encoded.append_u8(random_byte);
|
|
152
|
+
encoded.append_u256(MAX_U256);
|
|
153
|
+
// this should return the expected error
|
|
154
|
+
PacketV1Codec::sender_address(@encoded);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
|
|
158
|
+
#[test]
|
|
159
|
+
#[fuzzer(runs: 10)]
|
|
160
|
+
fn test_receiver_address_conversion(
|
|
161
|
+
sender: ContractAddress,
|
|
162
|
+
receiver: ContractAddress,
|
|
163
|
+
nonce: u64,
|
|
164
|
+
guid: Bytes32,
|
|
165
|
+
src_eid: Eid,
|
|
166
|
+
dst_eid: Eid,
|
|
167
|
+
message: ByteArray,
|
|
168
|
+
) {
|
|
169
|
+
let src_eid = src_eid.eid;
|
|
170
|
+
let dst_eid = dst_eid.eid;
|
|
171
|
+
let receiver_bytes = receiver.into();
|
|
172
|
+
let packet = Packet {
|
|
173
|
+
nonce, src_eid, sender, dst_eid, receiver: receiver_bytes, guid, message: message.clone(),
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
// Should be able to decode the receiver address
|
|
177
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
178
|
+
let decoded_receiver = PacketV1Codec::receiver_address(@encoded);
|
|
179
|
+
assert(decoded_receiver == receiver, 'Decoded receiver should match');
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
#[test]
|
|
183
|
+
#[fuzzer(runs: 10)]
|
|
184
|
+
#[should_panic(expected: "LZ_PACKET_V1_CODEC_INVALID_RECEIVER_ADDRESS")]
|
|
185
|
+
fn test_invalid_receiver_address(
|
|
186
|
+
sender: ContractAddress,
|
|
187
|
+
nonce: u64,
|
|
188
|
+
guid: Bytes32,
|
|
189
|
+
src_eid: Eid,
|
|
190
|
+
dst_eid: Eid,
|
|
191
|
+
message: ByteArray,
|
|
192
|
+
) {
|
|
193
|
+
let receiver_max = Bytes32 { value: MAX_U256 };
|
|
194
|
+
let src_eid = src_eid.eid;
|
|
195
|
+
let dst_eid = dst_eid.eid;
|
|
196
|
+
let packet = Packet {
|
|
197
|
+
nonce, src_eid, sender, dst_eid, receiver: receiver_max, guid, message: message.clone(),
|
|
198
|
+
};
|
|
199
|
+
|
|
200
|
+
// Should be able to decode the receiver address
|
|
201
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
202
|
+
PacketV1Codec::receiver_address(@encoded);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
|
|
206
|
+
#[test]
|
|
207
|
+
#[fuzzer(runs: 10)]
|
|
208
|
+
fn test_decode_payload(
|
|
209
|
+
sender: ContractAddress,
|
|
210
|
+
receiver: ContractAddress,
|
|
211
|
+
nonce: u64,
|
|
212
|
+
guid: Bytes32,
|
|
213
|
+
src_eid: Eid,
|
|
214
|
+
dst_eid: Eid,
|
|
215
|
+
message: ByteArray,
|
|
216
|
+
) {
|
|
217
|
+
let src_eid = src_eid.eid;
|
|
218
|
+
let dst_eid = dst_eid.eid;
|
|
219
|
+
let receiver = receiver.into();
|
|
220
|
+
let packet = Packet {
|
|
221
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
225
|
+
let PacketPayload {
|
|
226
|
+
guid: decoded_guid, message: decoded_message,
|
|
227
|
+
} = PacketV1Codec::decode_payload(@encoded);
|
|
228
|
+
|
|
229
|
+
// Verify payload fields match
|
|
230
|
+
assert(decoded_guid == packet.guid, 'guid mismatch');
|
|
231
|
+
assert(decoded_message == message, 'message mismatch');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
#[test]
|
|
235
|
+
#[fuzzer(runs: 10)]
|
|
236
|
+
fn test_decode_full_packet(
|
|
237
|
+
sender: ContractAddress,
|
|
238
|
+
receiver: ContractAddress,
|
|
239
|
+
nonce: u64,
|
|
240
|
+
guid: Bytes32,
|
|
241
|
+
src_eid: Eid,
|
|
242
|
+
dst_eid: Eid,
|
|
243
|
+
message: ByteArray,
|
|
244
|
+
) {
|
|
245
|
+
let src_eid = src_eid.eid;
|
|
246
|
+
let dst_eid = dst_eid.eid;
|
|
247
|
+
let receiver = receiver.into();
|
|
248
|
+
let packet = Packet {
|
|
249
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
250
|
+
};
|
|
251
|
+
|
|
252
|
+
// Roundtrip
|
|
253
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
254
|
+
let decoded = PacketV1Codec::decode(@encoded);
|
|
255
|
+
|
|
256
|
+
// Verify all fields match exactly
|
|
257
|
+
assert(decoded.nonce == packet.nonce, 'nonce mismatch');
|
|
258
|
+
assert(decoded.src_eid == packet.src_eid, 'src_eid mismatch');
|
|
259
|
+
assert(decoded.sender == packet.sender, 'sender mismatch');
|
|
260
|
+
assert(decoded.dst_eid == packet.dst_eid, 'dst_eid mismatch');
|
|
261
|
+
assert(decoded.receiver == packet.receiver, 'receiver mismatch');
|
|
262
|
+
assert(decoded.guid == packet.guid, 'guid mismatch');
|
|
263
|
+
assert(decoded.message == packet.message, 'message mismatch');
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
#[test]
|
|
267
|
+
#[fuzzer(runs: 10)]
|
|
268
|
+
fn test_decode_with_bytes32_sender(
|
|
269
|
+
sender: ContractAddress,
|
|
270
|
+
receiver: ContractAddress,
|
|
271
|
+
nonce: u64,
|
|
272
|
+
guid: Bytes32,
|
|
273
|
+
src_eid: Eid,
|
|
274
|
+
dst_eid: Eid,
|
|
275
|
+
message: ByteArray,
|
|
276
|
+
) {
|
|
277
|
+
let src_eid = src_eid.eid;
|
|
278
|
+
let dst_eid = dst_eid.eid;
|
|
279
|
+
let receiver = receiver.into();
|
|
280
|
+
let packet = Packet {
|
|
281
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
285
|
+
let PacketSenderBytes {
|
|
286
|
+
nonce,
|
|
287
|
+
src_eid,
|
|
288
|
+
sender: sender_bytes,
|
|
289
|
+
dst_eid,
|
|
290
|
+
receiver: receiver_bytes,
|
|
291
|
+
guid: guid_bytes,
|
|
292
|
+
message: decoded_message,
|
|
293
|
+
} = PacketV1Codec::decode_with_bytes32_sender(@encoded);
|
|
294
|
+
|
|
295
|
+
// Verify all fields match
|
|
296
|
+
assert(nonce == packet.nonce, 'nonce mismatch');
|
|
297
|
+
assert(src_eid == packet.src_eid, 'src_eid mismatch');
|
|
298
|
+
assert(dst_eid == packet.dst_eid, 'dst_eid mismatch');
|
|
299
|
+
assert(receiver_bytes == packet.receiver, 'receiver mismatch');
|
|
300
|
+
assert(guid_bytes == packet.guid, 'guid mismatch');
|
|
301
|
+
assert(decoded_message == message, 'message mismatch');
|
|
302
|
+
|
|
303
|
+
// Verify sender can be converted back
|
|
304
|
+
assert(sender_bytes.try_into().unwrap() == packet.sender, 'sender mismatch');
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
#[test]
|
|
308
|
+
#[fuzzer(runs: 10)]
|
|
309
|
+
fn test_encode_decode_roundtrip(
|
|
310
|
+
sender: ContractAddress,
|
|
311
|
+
receiver: ContractAddress,
|
|
312
|
+
nonce: u64,
|
|
313
|
+
guid: Bytes32,
|
|
314
|
+
src_eid: Eid,
|
|
315
|
+
dst_eid: Eid,
|
|
316
|
+
message: ByteArray,
|
|
317
|
+
) {
|
|
318
|
+
let src_eid = src_eid.eid;
|
|
319
|
+
let dst_eid = dst_eid.eid;
|
|
320
|
+
let receiver = receiver.into();
|
|
321
|
+
let packet = Packet {
|
|
322
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
323
|
+
};
|
|
324
|
+
|
|
325
|
+
// Roundtrip
|
|
326
|
+
let encoded = PacketV1Codec::encode(@packet);
|
|
327
|
+
let decoded = PacketV1Codec::decode(@encoded);
|
|
328
|
+
|
|
329
|
+
// Verify perfect roundtrip
|
|
330
|
+
assert(decoded.nonce == packet.nonce, 'roundtrip nonce fail');
|
|
331
|
+
assert(decoded.src_eid == packet.src_eid, 'roundtrip src_eid fail');
|
|
332
|
+
assert(decoded.sender == packet.sender, 'roundtrip sender fail');
|
|
333
|
+
assert(decoded.dst_eid == packet.dst_eid, 'roundtrip dst_eid fail');
|
|
334
|
+
assert(decoded.receiver == packet.receiver, 'roundtrip receiver fail');
|
|
335
|
+
assert(decoded.guid == packet.guid, 'roundtrip guid fail');
|
|
336
|
+
assert(decoded.message == packet.message, 'roundtrip message fail');
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
#[test]
|
|
340
|
+
#[should_panic(expected: "LZ_PACKET_V1_CODEC_INVALID_PACKET_VERSION")]
|
|
341
|
+
#[fuzzer(runs: 10)]
|
|
342
|
+
fn test_decode_invalid_version(
|
|
343
|
+
sender: ContractAddress,
|
|
344
|
+
receiver: ContractAddress,
|
|
345
|
+
nonce: u64,
|
|
346
|
+
guid: Bytes32,
|
|
347
|
+
src_eid: Eid,
|
|
348
|
+
dst_eid: Eid,
|
|
349
|
+
message: ByteArray,
|
|
350
|
+
) {
|
|
351
|
+
let src_eid = src_eid.eid;
|
|
352
|
+
let dst_eid = dst_eid.eid;
|
|
353
|
+
let receiver = receiver.into();
|
|
354
|
+
let packet = Packet {
|
|
355
|
+
nonce, src_eid, sender, dst_eid, receiver, guid, message: message.clone(),
|
|
356
|
+
};
|
|
357
|
+
|
|
358
|
+
let mut encoded = PacketV1Codec::encode(@packet);
|
|
359
|
+
|
|
360
|
+
// Corrupt the version byte (first byte should be 1, change it to 2)
|
|
361
|
+
// We need to manually modify the first byte
|
|
362
|
+
let mut corrupted_encoded: ByteArray = Default::default();
|
|
363
|
+
corrupted_encoded.append_u8(2); // Invalid version
|
|
364
|
+
|
|
365
|
+
// Append the rest of the packet (skip the first byte)
|
|
366
|
+
for i in 1..encoded.len() {
|
|
367
|
+
corrupted_encoded.append_u8(encoded.at(i).unwrap());
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// This should panic with "Invalid packet version"
|
|
371
|
+
PacketV1Codec::decode(@corrupted_encoded);
|
|
372
|
+
}
|