@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,688 @@
|
|
|
1
|
+
/// # Endpoint Contract
|
|
2
|
+
///
|
|
3
|
+
/// The Endpoint contract is the core component of the LayerZero protocol, responsible for
|
|
4
|
+
/// managing the lifecycle of messages between different OApps. It provides a comprehensive set of
|
|
5
|
+
/// functionalities that enable developers to build sophisticated omnichain applications (OApps)
|
|
6
|
+
/// with ease.
|
|
7
|
+
///
|
|
8
|
+
/// ## Key Features
|
|
9
|
+
/// - **Message Sending and Receiving**: Core functions for sending and receiving messages across
|
|
10
|
+
/// different blockchains, abstracting away the complexities of cross-chain communication.
|
|
11
|
+
/// - **Configurable Security**: OApps can define their own security requirements by specifying a
|
|
12
|
+
/// set of Data Verification Networks (DVNs) and a threshold of required verifications,
|
|
13
|
+
/// ensuring that each message meets the application's security standards.
|
|
14
|
+
/// - **Fee Quotation**: Provides a mechanism to quote the cost of sending a message, allowing
|
|
15
|
+
/// applications to estimate and manage transaction fees transparently.
|
|
16
|
+
/// - **Message Verification and Execution**: Verifies the authenticity of incoming messages
|
|
17
|
+
/// through the configured DVNs and ensures that only valid messages are executed.
|
|
18
|
+
/// - **Commit-Store-Execute Pattern**: Implements a secure message handling pattern where message
|
|
19
|
+
/// commitments are stored on-chain and executed only after successful verification,
|
|
20
|
+
/// preventing race conditions and other security vulnerabilities.
|
|
21
|
+
/// - **Alerts and Error Handling**: Includes a system for receiving alerts about failed
|
|
22
|
+
/// messages, enabling robust error handling and recovery mechanisms.
|
|
23
|
+
/// - **Delegate and Token Management**: Supports delegation of OApp configuration management and
|
|
24
|
+
/// allows for the use of the ZRO token for paying fees.
|
|
25
|
+
#[starknet::contract]
|
|
26
|
+
pub mod Endpoint {
|
|
27
|
+
use alexandria_bytes::byte_array_ext::ByteArrayTraitExt;
|
|
28
|
+
use core::num::traits::Zero;
|
|
29
|
+
use lz_utils::bytes::{Bytes32, ContractAddressIntoBytes32};
|
|
30
|
+
use openzeppelin::access::ownable::OwnableComponent;
|
|
31
|
+
use openzeppelin::security::ReentrancyGuardComponent;
|
|
32
|
+
use openzeppelin::token::erc20::interface::{IERC20Dispatcher, IERC20DispatcherTrait};
|
|
33
|
+
use starknet::storage::{
|
|
34
|
+
Map, StoragePathEntry, StoragePointerReadAccess, StoragePointerWriteAccess,
|
|
35
|
+
};
|
|
36
|
+
use starknet::{ContractAddress, get_caller_address, get_contract_address};
|
|
37
|
+
use starkware_utils::errors::assert_with_byte_array;
|
|
38
|
+
use crate::MessagingFee;
|
|
39
|
+
use crate::common::guid::GUID;
|
|
40
|
+
use crate::common::structs::messaging::{MessageLibSendResult, MessageReceipt, MessagingParams};
|
|
41
|
+
use crate::common::structs::packet::{Origin, Packet};
|
|
42
|
+
use crate::endpoint::constants::{EMPTY_PAYLOAD_HASH, NIL_PAYLOAD_HASH};
|
|
43
|
+
use crate::endpoint::errors;
|
|
44
|
+
use crate::endpoint::events::{
|
|
45
|
+
DelegateSet, LzReceiveAlert, LzTokenSet, PacketCommitted, PacketDelivered, PacketSent,
|
|
46
|
+
};
|
|
47
|
+
use crate::endpoint::interfaces::endpoint::{ExecutionState, IEndpoint};
|
|
48
|
+
use crate::endpoint::interfaces::layerzero_receiver::{
|
|
49
|
+
ILayerZeroReceiverDispatcher, ILayerZeroReceiverDispatcherTrait,
|
|
50
|
+
};
|
|
51
|
+
use crate::endpoint::message_lib_manager::message_lib_manager::MessageLibManagerComponent;
|
|
52
|
+
use crate::endpoint::message_lib_manager::structs::GetLibraryResponse;
|
|
53
|
+
use crate::endpoint::messaging_channel::interface::IMessagingChannel;
|
|
54
|
+
use crate::endpoint::messaging_channel::messaging_channel::MessagingChannelComponent;
|
|
55
|
+
use crate::endpoint::messaging_composer::messaging_composer::MessagingComposerComponent;
|
|
56
|
+
use crate::message_lib::interface::{IMessageLibDispatcher, IMessageLibDispatcherTrait};
|
|
57
|
+
|
|
58
|
+
////////////////
|
|
59
|
+
// Components //
|
|
60
|
+
////////////////
|
|
61
|
+
|
|
62
|
+
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
|
|
63
|
+
component!(
|
|
64
|
+
path: MessageLibManagerComponent,
|
|
65
|
+
storage: message_lib_manager,
|
|
66
|
+
event: MessageLibManagerEvent,
|
|
67
|
+
);
|
|
68
|
+
component!(
|
|
69
|
+
path: ReentrancyGuardComponent, storage: reentrancy_guard, event: ReentrancyGuardEvent,
|
|
70
|
+
);
|
|
71
|
+
component!(
|
|
72
|
+
path: MessagingChannelComponent, storage: messaging_channel, event: MessagingChannelEvent,
|
|
73
|
+
);
|
|
74
|
+
component!(
|
|
75
|
+
path: MessagingComposerComponent,
|
|
76
|
+
storage: messaging_composer,
|
|
77
|
+
event: MessagingComposerEvent,
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
// Ownable
|
|
81
|
+
#[abi(embed_v0)]
|
|
82
|
+
impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
|
|
83
|
+
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;
|
|
84
|
+
|
|
85
|
+
#[abi(embed_v0)]
|
|
86
|
+
impl MessageLibManagerImpl =
|
|
87
|
+
MessageLibManagerComponent::MessageLibManagerImpl<ContractState>;
|
|
88
|
+
impl MessageLibManagerInternalImpl = MessageLibManagerComponent::InternalImpl<ContractState>;
|
|
89
|
+
|
|
90
|
+
// ReentrancyGuard
|
|
91
|
+
impl ReentrancyGuardInternalImpl = ReentrancyGuardComponent::InternalImpl<ContractState>;
|
|
92
|
+
|
|
93
|
+
// MessagingChannel
|
|
94
|
+
#[abi(embed_v0)]
|
|
95
|
+
impl MessagingChannelImpl =
|
|
96
|
+
MessagingChannelComponent::MessagingChannel<ContractState>;
|
|
97
|
+
impl MessagingChannelInternalImpl = MessagingChannelComponent::InternalImpl<ContractState>;
|
|
98
|
+
|
|
99
|
+
// MessagingComposer
|
|
100
|
+
#[abi(embed_v0)]
|
|
101
|
+
impl MessagingComposerImpl =
|
|
102
|
+
MessagingComposerComponent::MessagingComposerImpl<ContractState>;
|
|
103
|
+
impl MessagingComposerInternalImpl = MessagingComposerComponent::InternalImpl<ContractState>;
|
|
104
|
+
|
|
105
|
+
#[storage]
|
|
106
|
+
struct Storage {
|
|
107
|
+
// Native token address
|
|
108
|
+
native_token_address: ContractAddress,
|
|
109
|
+
lz_token_address: ContractAddress,
|
|
110
|
+
// Delegates
|
|
111
|
+
// Used to authorize OApps to set their own libraries
|
|
112
|
+
// oapp => delegate
|
|
113
|
+
delegates: Map<ContractAddress, ContractAddress>,
|
|
114
|
+
// Component substorages:
|
|
115
|
+
#[substorage(v0)]
|
|
116
|
+
ownable: OwnableComponent::Storage,
|
|
117
|
+
#[substorage(v0)]
|
|
118
|
+
message_lib_manager: MessageLibManagerComponent::Storage,
|
|
119
|
+
#[substorage(v0)]
|
|
120
|
+
reentrancy_guard: ReentrancyGuardComponent::Storage,
|
|
121
|
+
#[substorage(v0)]
|
|
122
|
+
messaging_channel: MessagingChannelComponent::Storage,
|
|
123
|
+
#[substorage(v0)]
|
|
124
|
+
messaging_composer: MessagingComposerComponent::Storage,
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
#[event]
|
|
128
|
+
#[derive(Drop, starknet::Event)]
|
|
129
|
+
pub enum Event {
|
|
130
|
+
PacketSent: PacketSent,
|
|
131
|
+
// Library-config events are now exclusively emitted by the MessageLibManager component
|
|
132
|
+
PacketCommitted: PacketCommitted,
|
|
133
|
+
PacketDelivered: PacketDelivered,
|
|
134
|
+
LzTokenSet: LzTokenSet,
|
|
135
|
+
LzReceiveAlert: LzReceiveAlert,
|
|
136
|
+
DelegateSet: DelegateSet,
|
|
137
|
+
// Component events:
|
|
138
|
+
#[flat]
|
|
139
|
+
OwnableEvent: OwnableComponent::Event,
|
|
140
|
+
#[flat]
|
|
141
|
+
ReentrancyGuardEvent: ReentrancyGuardComponent::Event,
|
|
142
|
+
#[flat]
|
|
143
|
+
MessagingChannelEvent: MessagingChannelComponent::Event,
|
|
144
|
+
#[flat]
|
|
145
|
+
MessageLibManagerEvent: MessageLibManagerComponent::Event,
|
|
146
|
+
#[flat]
|
|
147
|
+
MessagingComposerEvent: MessagingComposerComponent::Event,
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
#[constructor]
|
|
151
|
+
fn constructor(
|
|
152
|
+
ref self: ContractState,
|
|
153
|
+
owner: ContractAddress,
|
|
154
|
+
eid: u32,
|
|
155
|
+
native_token_address: ContractAddress,
|
|
156
|
+
blocked_library: ContractAddress,
|
|
157
|
+
) {
|
|
158
|
+
self.ownable.initializer(owner);
|
|
159
|
+
// Initialize MessagingChannel with EID
|
|
160
|
+
self.messaging_channel.initializer(eid);
|
|
161
|
+
// Initialize Native token
|
|
162
|
+
self.native_token_address.write(native_token_address);
|
|
163
|
+
// Initialize MessagingComposer with native token
|
|
164
|
+
self.messaging_composer.initializer(native_token_address);
|
|
165
|
+
// Initialize MessageLibManager with blocked library
|
|
166
|
+
self.message_lib_manager.initializer(blocked_library);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
#[abi(embed_v0)]
|
|
170
|
+
impl EndpointImpl of IEndpoint<ContractState> {
|
|
171
|
+
/// Here we're assuming that the OApp takes an allowance from the user,
|
|
172
|
+
/// takes that money from the user, gives that as allowance to the Endpoint
|
|
173
|
+
/// and then the endpoint gives the remainder back to the refund_address provided
|
|
174
|
+
fn send(
|
|
175
|
+
ref self: ContractState, params: MessagingParams, refund_address: ContractAddress,
|
|
176
|
+
) -> MessageReceipt {
|
|
177
|
+
self.reentrancy_guard.start();
|
|
178
|
+
|
|
179
|
+
let sender = get_caller_address();
|
|
180
|
+
|
|
181
|
+
// Create the packet and find the send message lib
|
|
182
|
+
let (packet, message_lib_dispatcher) = self._send(sender, @params);
|
|
183
|
+
|
|
184
|
+
let MessagingParams { options, pay_in_lz_token, dst_eid, receiver, .. } = params;
|
|
185
|
+
|
|
186
|
+
// Update the nonce
|
|
187
|
+
self
|
|
188
|
+
.messaging_channel
|
|
189
|
+
._outbound_nonce_entry(sender, dst_eid, receiver)
|
|
190
|
+
.write(packet.nonce);
|
|
191
|
+
|
|
192
|
+
// Call send on the message lib
|
|
193
|
+
let MessageLibSendResult {
|
|
194
|
+
message_receipt, encoded_packet,
|
|
195
|
+
} = message_lib_dispatcher.send(packet, options.clone(), pay_in_lz_token);
|
|
196
|
+
|
|
197
|
+
// Pay the workers based on the quote provided by the message lib
|
|
198
|
+
self._pay_workers(sender, @message_receipt, refund_address, pay_in_lz_token);
|
|
199
|
+
|
|
200
|
+
self
|
|
201
|
+
.emit(
|
|
202
|
+
PacketSent {
|
|
203
|
+
encoded_packet,
|
|
204
|
+
options,
|
|
205
|
+
send_library: message_lib_dispatcher.contract_address,
|
|
206
|
+
},
|
|
207
|
+
);
|
|
208
|
+
|
|
209
|
+
self.reentrancy_guard.end();
|
|
210
|
+
message_receipt
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
fn lz_receive_alert(
|
|
214
|
+
ref self: ContractState,
|
|
215
|
+
origin: Origin,
|
|
216
|
+
receiver: ContractAddress,
|
|
217
|
+
guid: Bytes32,
|
|
218
|
+
gas: u256,
|
|
219
|
+
value: u256,
|
|
220
|
+
message: ByteArray,
|
|
221
|
+
extra_data: ByteArray,
|
|
222
|
+
reason: Array<felt252>,
|
|
223
|
+
) {
|
|
224
|
+
let executor = get_caller_address();
|
|
225
|
+
self
|
|
226
|
+
.emit(
|
|
227
|
+
LzReceiveAlert {
|
|
228
|
+
origin, receiver, executor, guid, gas, value, message, extra_data, reason,
|
|
229
|
+
},
|
|
230
|
+
);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
|
|
234
|
+
/// This is the same thing as `verify` in the EVM implementation
|
|
235
|
+
/// and `commitVerification` in the TON implementation
|
|
236
|
+
fn commit(
|
|
237
|
+
ref self: ContractState,
|
|
238
|
+
origin: Origin,
|
|
239
|
+
receiver: ContractAddress,
|
|
240
|
+
payload_hash: Bytes32,
|
|
241
|
+
) {
|
|
242
|
+
// Assert that the caller is the receive library for this path
|
|
243
|
+
self._assert_only_receive_library(receiver, origin.src_eid);
|
|
244
|
+
|
|
245
|
+
// Get the lazy inbound nonce for this path
|
|
246
|
+
let lazy_nonce = self
|
|
247
|
+
.messaging_channel
|
|
248
|
+
.lazy_inbound_nonce(receiver, origin.src_eid, origin.sender);
|
|
249
|
+
|
|
250
|
+
// Ensure that the path is initializable
|
|
251
|
+
assert_with_byte_array(
|
|
252
|
+
self._initializable(origin.clone(), receiver, lazy_nonce),
|
|
253
|
+
errors::err_path_not_initializable(),
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
// Ensure that the path is verifiable
|
|
257
|
+
assert_with_byte_array(
|
|
258
|
+
self._committable(origin.clone(), receiver, lazy_nonce),
|
|
259
|
+
errors::err_path_not_committable(),
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
// Ensure that the payload hash is valid
|
|
263
|
+
assert_with_byte_array(
|
|
264
|
+
payload_hash != EMPTY_PAYLOAD_HASH, errors::err_invalid_payload_hash(),
|
|
265
|
+
);
|
|
266
|
+
|
|
267
|
+
// Store the payload hash for this inbound message
|
|
268
|
+
self
|
|
269
|
+
.messaging_channel
|
|
270
|
+
._inbound_payload_hash_entry(receiver, origin.src_eid, origin.sender, origin.nonce)
|
|
271
|
+
.write(payload_hash);
|
|
272
|
+
|
|
273
|
+
self.emit(PacketCommitted { origin, receiver, payload_hash });
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/// @dev MESSAGING STEP 3 - the last step
|
|
277
|
+
/// @dev execute a verified message to the designated receiver
|
|
278
|
+
/// @dev the execution provides the execution context (caller, extraData) to the receiver.
|
|
279
|
+
/// the receiver can optionally assert the caller and validate the untrusted extraData @dev
|
|
280
|
+
/// cant reentrant because the payload is cleared before execution @param origin the origin
|
|
281
|
+
/// of the message @param receiver the receiver of the message
|
|
282
|
+
/// @param guid the guid of the message
|
|
283
|
+
/// @param message the message
|
|
284
|
+
/// @param _extraData the extra data provided by the executor. This data is untrusted and
|
|
285
|
+
/// should be validated.
|
|
286
|
+
fn lz_receive(
|
|
287
|
+
ref self: ContractState,
|
|
288
|
+
origin: Origin,
|
|
289
|
+
receiver: ContractAddress,
|
|
290
|
+
guid: Bytes32,
|
|
291
|
+
message: ByteArray,
|
|
292
|
+
value: u256,
|
|
293
|
+
extra_data: ByteArray,
|
|
294
|
+
) {
|
|
295
|
+
// Create payload by concatenating guid and message
|
|
296
|
+
let payload = self._create_payload(guid, @message);
|
|
297
|
+
|
|
298
|
+
// Clear the payload first to prevent reentrancy, then execute the message
|
|
299
|
+
self.messaging_channel._clear_payload(receiver, @origin, @payload);
|
|
300
|
+
|
|
301
|
+
// Check if the LzReceive.value is greater than the allowance
|
|
302
|
+
let executor = get_caller_address();
|
|
303
|
+
|
|
304
|
+
let native_token_dispatcher = IERC20Dispatcher {
|
|
305
|
+
contract_address: self.native_token_address.read(),
|
|
306
|
+
};
|
|
307
|
+
let allowance = native_token_dispatcher.allowance(executor, get_contract_address());
|
|
308
|
+
assert_with_byte_array(
|
|
309
|
+
value <= allowance,
|
|
310
|
+
errors::err_lz_receive_value_exceeds_allowance(value, allowance),
|
|
311
|
+
);
|
|
312
|
+
|
|
313
|
+
// Transfer the LzReceive.value to the receiver
|
|
314
|
+
native_token_dispatcher.transfer_from(executor, receiver, value);
|
|
315
|
+
|
|
316
|
+
// We're calling .lz_receive after giving it the money, so they can have the money
|
|
317
|
+
// available to use it to handle the message
|
|
318
|
+
let receiver_dispatcher = ILayerZeroReceiverDispatcher { contract_address: receiver };
|
|
319
|
+
receiver_dispatcher
|
|
320
|
+
.lz_receive(origin.clone(), guid, message, executor, value, extra_data);
|
|
321
|
+
|
|
322
|
+
self.emit(PacketDelivered { origin, receiver });
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
fn clear(
|
|
326
|
+
ref self: ContractState,
|
|
327
|
+
origin: Origin,
|
|
328
|
+
receiver: ContractAddress,
|
|
329
|
+
guid: Bytes32,
|
|
330
|
+
message: ByteArray,
|
|
331
|
+
) {
|
|
332
|
+
self._assert_authorized(receiver);
|
|
333
|
+
|
|
334
|
+
/// Create payload by concatenating guid and message
|
|
335
|
+
let payload = self._create_payload(guid, @message);
|
|
336
|
+
|
|
337
|
+
/// Clear the payload first to prevent reentrancy, then execute the message
|
|
338
|
+
self.messaging_channel._clear_payload(receiver, @origin, @payload);
|
|
339
|
+
|
|
340
|
+
self.emit(PacketDelivered { origin, receiver });
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
fn quote(
|
|
344
|
+
self: @ContractState, params: MessagingParams, sender: ContractAddress,
|
|
345
|
+
) -> MessagingFee {
|
|
346
|
+
let (packet, msg_lib_dispatcher) = self._send(sender, @params);
|
|
347
|
+
msg_lib_dispatcher.quote(packet, params.options, params.pay_in_lz_token)
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
fn get_lz_token(self: @ContractState) -> ContractAddress {
|
|
351
|
+
self.lz_token_address.read()
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
fn get_eid(self: @ContractState) -> u32 {
|
|
355
|
+
self.messaging_channel.eid.read()
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
fn set_lz_token(ref self: ContractState, lz_token_address: ContractAddress) {
|
|
359
|
+
self.ownable.assert_only_owner();
|
|
360
|
+
self.lz_token_address.write(lz_token_address);
|
|
361
|
+
self.emit(LzTokenSet { lz_token_address });
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
fn set_delegate(ref self: ContractState, delegate: ContractAddress) {
|
|
365
|
+
let oapp = get_caller_address();
|
|
366
|
+
self.delegates.entry(oapp).write(delegate);
|
|
367
|
+
self.emit(DelegateSet { oapp, delegate });
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
fn get_delegate(self: @ContractState, oapp: ContractAddress) -> ContractAddress {
|
|
371
|
+
self.delegates.entry(oapp).read()
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
fn initializable(self: @ContractState, origin: Origin, receiver: ContractAddress) -> bool {
|
|
375
|
+
let lazy_nonce = self
|
|
376
|
+
.messaging_channel
|
|
377
|
+
.lazy_inbound_nonce(receiver, origin.src_eid, origin.sender);
|
|
378
|
+
self._initializable(origin, receiver, lazy_nonce)
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
fn committable(self: @ContractState, origin: Origin, receiver: ContractAddress) -> bool {
|
|
382
|
+
let Origin { src_eid, sender, .. } = origin.clone();
|
|
383
|
+
let lazy_nonce = self.messaging_channel.lazy_inbound_nonce(receiver, src_eid, sender);
|
|
384
|
+
self._committable(origin, receiver, lazy_nonce)
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
fn committable_with_receive_lib(
|
|
388
|
+
self: @ContractState,
|
|
389
|
+
origin: Origin,
|
|
390
|
+
receiver: ContractAddress,
|
|
391
|
+
receive_lib: ContractAddress,
|
|
392
|
+
) -> bool {
|
|
393
|
+
self.committable(origin.clone(), receiver)
|
|
394
|
+
&& self
|
|
395
|
+
.message_lib_manager
|
|
396
|
+
.is_valid_receive_library(
|
|
397
|
+
receiver, origin.src_eid, receive_lib.try_into().unwrap(),
|
|
398
|
+
)
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
fn executable(
|
|
402
|
+
self: @ContractState, origin: Origin, receiver: ContractAddress,
|
|
403
|
+
) -> ExecutionState {
|
|
404
|
+
let Origin { src_eid, sender, nonce } = origin;
|
|
405
|
+
|
|
406
|
+
let payload_hash = self
|
|
407
|
+
.messaging_channel
|
|
408
|
+
.inbound_payload_hash(receiver, src_eid, sender, nonce);
|
|
409
|
+
|
|
410
|
+
// executed if the payload hash has been cleared and the nonce is less than or equal to
|
|
411
|
+
// lazyInboundNonce
|
|
412
|
+
if payload_hash.value == EMPTY_PAYLOAD_HASH.value
|
|
413
|
+
&& nonce <= self.messaging_channel.lazy_inbound_nonce(receiver, src_eid, sender) {
|
|
414
|
+
return ExecutionState::Executed;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
// executable if nonce has not been executed and has not been nilified and nonce is less
|
|
418
|
+
// than or equal to inboundNonce
|
|
419
|
+
if payload_hash.value != NIL_PAYLOAD_HASH.value
|
|
420
|
+
&& nonce <= self.messaging_channel.inbound_nonce(receiver, src_eid, sender) {
|
|
421
|
+
return ExecutionState::Executable;
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// only start active executable polling if payload hash is not empty nor nil
|
|
425
|
+
if payload_hash.value != EMPTY_PAYLOAD_HASH.value
|
|
426
|
+
&& payload_hash.value != NIL_PAYLOAD_HASH.value {
|
|
427
|
+
return ExecutionState::VerifiedButNotExecutable;
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
// return NotExecutable as a catch-all
|
|
431
|
+
ExecutionState::NotExecutable
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
|
|
435
|
+
// =============================== Internal Functions ===============================
|
|
436
|
+
|
|
437
|
+
#[generate_trait]
|
|
438
|
+
impl InternalImpl of InternalTrait {
|
|
439
|
+
fn _send(
|
|
440
|
+
self: @ContractState, sender: ContractAddress, params: @MessagingParams,
|
|
441
|
+
) -> (Packet, IMessageLibDispatcher) {
|
|
442
|
+
let MessagingParams { dst_eid, receiver, message, pay_in_lz_token, .. } = params;
|
|
443
|
+
let src_eid = self.messaging_channel.eid.read();
|
|
444
|
+
|
|
445
|
+
assert_with_byte_array(
|
|
446
|
+
!(*pay_in_lz_token && self.lz_token_address.read().is_zero()),
|
|
447
|
+
errors::err_lz_token_unavailable(),
|
|
448
|
+
);
|
|
449
|
+
|
|
450
|
+
let nonce = self.messaging_channel.outbound_nonce(sender, *dst_eid, *receiver) + 1;
|
|
451
|
+
|
|
452
|
+
let packet = Packet {
|
|
453
|
+
nonce,
|
|
454
|
+
src_eid,
|
|
455
|
+
sender,
|
|
456
|
+
dst_eid: *dst_eid,
|
|
457
|
+
receiver: *receiver,
|
|
458
|
+
guid: GUID::generate(nonce, src_eid, sender.into(), *dst_eid, *receiver.into()),
|
|
459
|
+
message: message.clone(),
|
|
460
|
+
};
|
|
461
|
+
|
|
462
|
+
let GetLibraryResponse {
|
|
463
|
+
lib: send_msglib, ..,
|
|
464
|
+
} = self.message_lib_manager.get_send_library(sender, *dst_eid);
|
|
465
|
+
|
|
466
|
+
let message_lib_dispatcher = IMessageLibDispatcher { contract_address: send_msglib };
|
|
467
|
+
|
|
468
|
+
(packet, message_lib_dispatcher)
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
fn _pay_workers(
|
|
472
|
+
ref self: ContractState,
|
|
473
|
+
sender: ContractAddress,
|
|
474
|
+
message_receipt: @MessageReceipt,
|
|
475
|
+
refund_address: ContractAddress,
|
|
476
|
+
pay_in_lz_token: bool,
|
|
477
|
+
) {
|
|
478
|
+
// In order to satisfy the requirement of throwing a custom error in case the user
|
|
479
|
+
// didn't send enough fees to pay all of the workers,
|
|
480
|
+
// We follow this two step process to make sure none of the ERC20 transfers fail.
|
|
481
|
+
// First, we loop through the payees and make sure we have enough allowance to pay all
|
|
482
|
+
// of them
|
|
483
|
+
// Note that we do this loop twice, because we can't trust the message library to
|
|
484
|
+
// send us a non-consistent receipt (total_native_fee != sum(payees.native_amount))
|
|
485
|
+
// which would result in inaccurate allowance checks and some money remaining in the
|
|
486
|
+
// allowance.
|
|
487
|
+
let mut total_native_fee: u256 = 0;
|
|
488
|
+
let mut total_zro_fee: u256 = 0;
|
|
489
|
+
|
|
490
|
+
for payee in @message_receipt.payees {
|
|
491
|
+
total_native_fee += *payee.native_amount;
|
|
492
|
+
total_zro_fee += *payee.lz_token_amount;
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// Native token allowance
|
|
496
|
+
let contract_address = get_contract_address();
|
|
497
|
+
let native_dispatcher = IERC20Dispatcher {
|
|
498
|
+
contract_address: self.native_token_address.read(),
|
|
499
|
+
};
|
|
500
|
+
let native_allowance = native_dispatcher.allowance(sender, contract_address);
|
|
501
|
+
|
|
502
|
+
// ZRO token allowance
|
|
503
|
+
let zro_dispatcher = if pay_in_lz_token {
|
|
504
|
+
Some(IERC20Dispatcher { contract_address: self.lz_token_address.read() })
|
|
505
|
+
} else {
|
|
506
|
+
None
|
|
507
|
+
};
|
|
508
|
+
let zro_allowance = zro_dispatcher
|
|
509
|
+
.map(|dispatcher| dispatcher.allowance(sender, contract_address))
|
|
510
|
+
.unwrap_or_default();
|
|
511
|
+
|
|
512
|
+
Self::_assert_messaging_fee(
|
|
513
|
+
total_native_fee, native_allowance, total_zro_fee, zro_allowance,
|
|
514
|
+
);
|
|
515
|
+
|
|
516
|
+
// Pay the workers & refund the remainder of the allowances
|
|
517
|
+
self._pay_native_fees(sender, native_dispatcher, message_receipt, refund_address);
|
|
518
|
+
self
|
|
519
|
+
._refund_native(
|
|
520
|
+
native_dispatcher, native_allowance, total_native_fee, sender, refund_address,
|
|
521
|
+
);
|
|
522
|
+
|
|
523
|
+
self._pay_zro_fees(sender, zro_dispatcher, message_receipt, refund_address);
|
|
524
|
+
self._refund_zro(zro_dispatcher, zro_allowance, total_zro_fee, sender, refund_address);
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
fn _assert_only_receive_library(
|
|
528
|
+
ref self: ContractState, receiver: ContractAddress, src_eid: u32,
|
|
529
|
+
) {
|
|
530
|
+
let caller = get_caller_address();
|
|
531
|
+
assert_with_byte_array(
|
|
532
|
+
self.message_lib_manager.is_valid_receive_library(receiver, src_eid, caller),
|
|
533
|
+
errors::err_invalid_receive_library(),
|
|
534
|
+
);
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// Checkers for packet conditions
|
|
538
|
+
fn _initializable(
|
|
539
|
+
self: @ContractState,
|
|
540
|
+
origin: Origin,
|
|
541
|
+
receiver: ContractAddress,
|
|
542
|
+
lazy_inbound_nonce: u64,
|
|
543
|
+
) -> bool {
|
|
544
|
+
let receiver_dispatcher = ILayerZeroReceiverDispatcher { contract_address: receiver };
|
|
545
|
+
receiver_dispatcher.allow_initialize_path(origin) || lazy_inbound_nonce > 0
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
fn _committable(
|
|
549
|
+
self: @ContractState,
|
|
550
|
+
origin: Origin,
|
|
551
|
+
receiver: ContractAddress,
|
|
552
|
+
lazy_inbound_nonce: u64,
|
|
553
|
+
) -> bool {
|
|
554
|
+
origin.nonce > lazy_inbound_nonce
|
|
555
|
+
|| self
|
|
556
|
+
.messaging_channel
|
|
557
|
+
._has_payload_hash(receiver, origin.src_eid, origin.sender, origin.nonce)
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/// Helper function to create payload by concatenating guid and message
|
|
561
|
+
/// This mimics Solidity's abi.encodePacked(_guid, _message)
|
|
562
|
+
fn _create_payload(
|
|
563
|
+
ref self: ContractState, guid: Bytes32, message: @ByteArray,
|
|
564
|
+
) -> ByteArray {
|
|
565
|
+
let mut payload: ByteArray = "";
|
|
566
|
+
payload.append_u256(guid.value);
|
|
567
|
+
payload.append(message);
|
|
568
|
+
|
|
569
|
+
payload
|
|
570
|
+
}
|
|
571
|
+
|
|
572
|
+
fn _assert_authorized(self: @ContractState, oapp: ContractAddress) {
|
|
573
|
+
let caller = get_caller_address();
|
|
574
|
+
assert_with_byte_array(
|
|
575
|
+
self.delegates.entry(oapp).read() == caller || oapp == caller,
|
|
576
|
+
errors::err_unauthorized(),
|
|
577
|
+
);
|
|
578
|
+
}
|
|
579
|
+
|
|
580
|
+
/// Checks that the supplied fees are greater than or equal to the required fees or panics
|
|
581
|
+
fn _assert_messaging_fee(
|
|
582
|
+
required_native_fee: u256,
|
|
583
|
+
supplied_native_fee: u256,
|
|
584
|
+
required_lz_token_fee: u256,
|
|
585
|
+
supplied_lz_token_fee: u256,
|
|
586
|
+
) {
|
|
587
|
+
assert_with_byte_array(
|
|
588
|
+
required_native_fee <= supplied_native_fee
|
|
589
|
+
&& required_lz_token_fee <= supplied_lz_token_fee,
|
|
590
|
+
errors::err_insufficient_fee(
|
|
591
|
+
required_native_fee,
|
|
592
|
+
supplied_native_fee,
|
|
593
|
+
required_lz_token_fee,
|
|
594
|
+
supplied_lz_token_fee,
|
|
595
|
+
),
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
/// Refund the remainder of the native token allowance
|
|
600
|
+
fn _refund_native(
|
|
601
|
+
self: @ContractState,
|
|
602
|
+
native_dispatcher: IERC20Dispatcher,
|
|
603
|
+
allowance: u256,
|
|
604
|
+
fee: u256,
|
|
605
|
+
sender: ContractAddress,
|
|
606
|
+
refund_address: ContractAddress,
|
|
607
|
+
) {
|
|
608
|
+
if allowance > fee {
|
|
609
|
+
native_dispatcher.transfer_from(sender, refund_address, allowance - fee);
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
/// Refund the remainder of the ZRO token allowance
|
|
614
|
+
fn _refund_zro(
|
|
615
|
+
self: @ContractState,
|
|
616
|
+
zro_dispatcher: Option<IERC20Dispatcher>,
|
|
617
|
+
allowance: u256,
|
|
618
|
+
fee: u256,
|
|
619
|
+
sender: ContractAddress,
|
|
620
|
+
refund_address: ContractAddress,
|
|
621
|
+
) {
|
|
622
|
+
if let Some(zro_dispatcher) = zro_dispatcher {
|
|
623
|
+
if allowance > fee {
|
|
624
|
+
zro_dispatcher.transfer_from(sender, refund_address, allowance - fee);
|
|
625
|
+
}
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
|
|
629
|
+
/// Pay the native token fees
|
|
630
|
+
fn _pay_native_fees(
|
|
631
|
+
self: @ContractState,
|
|
632
|
+
sender: ContractAddress,
|
|
633
|
+
native_dispatcher: IERC20Dispatcher,
|
|
634
|
+
message_receipt: @MessageReceipt,
|
|
635
|
+
refund_address: ContractAddress,
|
|
636
|
+
) {
|
|
637
|
+
for payee in @message_receipt.payees {
|
|
638
|
+
let native_amount = *payee.native_amount;
|
|
639
|
+
if native_amount > 0 {
|
|
640
|
+
native_dispatcher.transfer_from(sender, *payee.receiver, native_amount);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
/// Pay the ZRO token fees
|
|
646
|
+
fn _pay_zro_fees(
|
|
647
|
+
ref self: ContractState,
|
|
648
|
+
sender: ContractAddress,
|
|
649
|
+
zro_dispatcher: Option<IERC20Dispatcher>,
|
|
650
|
+
message_receipt: @MessageReceipt,
|
|
651
|
+
refund_address: ContractAddress,
|
|
652
|
+
) {
|
|
653
|
+
if let Some(zro_dispatcher) = zro_dispatcher {
|
|
654
|
+
for payee in @message_receipt.payees {
|
|
655
|
+
let lz_token_amount = *payee.lz_token_amount;
|
|
656
|
+
if lz_token_amount > 0 {
|
|
657
|
+
zro_dispatcher.transfer_from(sender, *payee.receiver, lz_token_amount);
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
}
|
|
662
|
+
}
|
|
663
|
+
|
|
664
|
+
// =============================== Component Hooks =================================
|
|
665
|
+
|
|
666
|
+
impl MessageLibManagerHooksImpl of MessageLibManagerComponent::IMessageLibManagerHooks<
|
|
667
|
+
ContractState,
|
|
668
|
+
> {
|
|
669
|
+
fn _assert_authorized(
|
|
670
|
+
self: @MessageLibManagerComponent::ComponentState<ContractState>, oapp: ContractAddress,
|
|
671
|
+
) {
|
|
672
|
+
let mut contract_state = unsafe_new_contract_state();
|
|
673
|
+
contract_state._assert_authorized(oapp);
|
|
674
|
+
}
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
impl MessagingChannelHooksImpl of MessagingChannelComponent::IMessagingChannelHooks<
|
|
678
|
+
ContractState,
|
|
679
|
+
> {
|
|
680
|
+
fn _assert_authorized(
|
|
681
|
+
self: @MessagingChannelComponent::ComponentState<ContractState>,
|
|
682
|
+
receiver: ContractAddress,
|
|
683
|
+
) {
|
|
684
|
+
let mut contract_state = unsafe_new_contract_state();
|
|
685
|
+
contract_state._assert_authorized(receiver);
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
}
|