@layerzerolabs/protocol-stellar-v2 0.2.12 → 0.2.15
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 +384 -278
- package/.turbo/turbo-lint.log +110 -78
- package/.turbo/turbo-test.log +1248 -1014
- package/Cargo.lock +130 -3
- package/Cargo.toml +2 -1
- package/contracts/common-macros/src/contract_impl.rs +6 -1
- package/contracts/common-macros/src/lib.rs +47 -8
- package/contracts/common-macros/src/ownable.rs +7 -25
- package/contracts/common-macros/src/storage.rs +1 -1
- package/contracts/common-macros/src/tests/contract_impl.rs +5 -0
- package/contracts/common-macros/src/tests/mod.rs +1 -0
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_impl__snapshot_generated_contract_impl_code.snap +23 -7
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ownable__snapshot_generated_ownable_code.snap +5 -25
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__storage__snapshot_generated_storage_code.snap +48 -48
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__ttl_configurable__snapshot_generated_ttl_configurable_code.snap +5 -25
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +21 -0
- package/contracts/common-macros/src/tests/upgradeable.rs +31 -0
- package/contracts/common-macros/src/ttl_configurable.rs +14 -44
- package/contracts/common-macros/src/upgradeable.rs +76 -0
- package/contracts/endpoint-v2/src/endpoint_v2.rs +25 -1
- package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +175 -8
- package/contracts/endpoint-v2/src/tests/endpoint_v2/build_outbound_packet.rs +76 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +342 -159
- package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +3 -15
- package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +20 -31
- package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +126 -164
- package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +1 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +0 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +0 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +311 -304
- package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +423 -96
- package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +1 -1
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +47 -20
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +373 -403
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +96 -22
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +61 -9
- package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +4 -4
- package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +8 -11
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +81 -30
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +209 -76
- package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +0 -1
- package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library.rs +24 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/default_receive_library_timeout.rs +40 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/default_send_library.rs +24 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_config.rs +108 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_library_index.rs +52 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_receive_library.rs +92 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_registered_libraries.rs +74 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/get_send_library.rs +83 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/is_registered_library.rs +32 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/is_supported_eid.rs +28 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/is_valid_receive_library.rs +261 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +16 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/receive_library_timeout.rs +62 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +65 -43
- package/contracts/endpoint-v2/src/tests/message_lib_manager/registered_libraries_count.rs +42 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +61 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +3 -5
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +59 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +15 -1
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +155 -51
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +114 -92
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +235 -132
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +93 -87
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +346 -245
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +406 -60
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +252 -78
- package/contracts/endpoint-v2/src/tests/message_lib_manager/timeout.rs +102 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +212 -273
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +203 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound.rs +94 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +78 -248
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +7 -282
- package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +6 -274
- package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +3 -2
- package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +86 -178
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +328 -212
- package/contracts/endpoint-v2/src/tests/messaging_channel/outbound.rs +68 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +6 -209
- package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +207 -159
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +142 -153
- package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +6 -179
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +163 -221
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +90 -121
- package/contracts/endpoint-v2/src/tests/mock.rs +18 -4
- package/contracts/endpoint-v2/src/tests/util/build_payload.rs +4 -70
- package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +2 -1
- package/contracts/endpoint-v2/src/tests/util/keccak256.rs +17 -106
- package/contracts/layerzero-views/Cargo.toml +35 -0
- package/contracts/layerzero-views/src/errors.rs +10 -0
- package/contracts/layerzero-views/src/layerzero_view.rs +229 -0
- package/contracts/layerzero-views/src/lib.rs +38 -0
- package/contracts/layerzero-views/src/storage.rs +18 -0
- package/contracts/layerzero-views/src/tests/layerzero_view_tests.rs +423 -0
- package/contracts/layerzero-views/src/tests/mod.rs +4 -0
- package/contracts/layerzero-views/src/tests/setup.rs +377 -0
- package/contracts/layerzero-views/src/types.rs +50 -0
- package/contracts/macro-integration-tests/Cargo.toml +30 -0
- package/contracts/macro-integration-tests/src/lib.rs +1 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/initialization.rs +62 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/mod.rs +22 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/only_owner_guard.rs +97 -0
- package/contracts/macro-integration-tests/tests/runtime/ownable/ownership_transfer.rs +101 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/keyed_roundtrip.rs +225 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/mod.rs +4 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/name_override_runtime.rs +52 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/ttl_extension.rs +261 -0
- package/contracts/macro-integration-tests/tests/runtime/storage/unkeyed_roundtrip.rs +137 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/configuration.rs +113 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/extend_instance_ttl.rs +50 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/freeze.rs +139 -0
- package/contracts/macro-integration-tests/tests/runtime/ttl_configurable/mod.rs +3 -0
- package/contracts/macro-integration-tests/tests/runtime.rs +5 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/attr_not_empty.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/decreasing_discriminant.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.rs +21 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_int_discriminant.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/error/fail/non_unit_variant.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/error/pass/attr_on_variant_allowed.rs +20 -0
- package/contracts/macro-integration-tests/tests/ui/error/pass/basic_auto_discriminants.rs +15 -0
- package/contracts/macro-integration-tests/tests/ui/error/pass/mixed_discriminants.rs +16 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.rs +22 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/fail/only_owner_missing_env.stderr +16 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/minimal_contract.rs +26 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/namespacing_and_imports.rs +22 -0
- package/contracts/macro-integration-tests/tests/ui/ownable/pass/only_owner_env_param_variants.rs +46 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/invalid_storage_type_param.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/missing_storage_type_param.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_storage_kinds.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/multiple_type_params.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/no_ttl_extension_on_non_persistent.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.rs +10 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/non_enum_input.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.rs +12 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/storage_attr_rejects_args.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/tuple_variant_rejected.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.rs +13 -0
- package/contracts/macro-integration-tests/tests/ui/storage/fail/unknown_variant_attr.stderr +7 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/default_value_on_variant.rs +14 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_instance_unit_basic.rs +14 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_persistent_named_fields_keyed.rs +16 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/enum_temporary_unit_option.rs +15 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/name_override.rs +14 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/no_auto_ttl_extension.rs +19 -0
- package/contracts/macro-integration-tests/tests/ui/storage/pass/ttl_provider_basic.rs +15 -0
- package/contracts/macro-integration-tests/tests/ui/ttl_configurable/pass/minimal_contract.rs +44 -0
- package/contracts/macro-integration-tests/tests/ui_error.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_ownable.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_storage.rs +11 -0
- package/contracts/macro-integration-tests/tests/ui_ttl_configurable.rs +12 -0
- package/contracts/message-libs/blocked-message-lib/src/lib.rs +17 -17
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/decode_packet_header.rs +64 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet.rs +58 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/encode_packet_header.rs +138 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/mod.rs +6 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload.rs +30 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/payload_hash.rs +15 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1/test_helper.rs +39 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_dvn_option.rs +57 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_lz_receive_option.rs +50 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/append_native_drop_option.rs +74 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/convert_legacy_options.rs +280 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/extract_type_3_options.rs +126 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/left_pad_to_bytes32.rs +48 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/mod.rs +7 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options/split_worker_options.rs +139 -0
- package/contracts/message-libs/message-lib-common/src/worker_options.rs +31 -1
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +2 -2
- package/contracts/message-libs/treasury/src/errors.rs +0 -1
- package/contracts/message-libs/treasury/src/lib.rs +3 -3
- package/contracts/message-libs/treasury/src/storage.rs +2 -0
- package/contracts/message-libs/treasury/src/treasury.rs +12 -13
- package/contracts/message-libs/uln-302/Cargo.toml +1 -1
- package/contracts/message-libs/uln-302/src/errors.rs +0 -5
- package/contracts/message-libs/uln-302/src/events.rs +5 -6
- package/contracts/message-libs/uln-302/src/receive_uln.rs +24 -54
- package/contracts/message-libs/uln-302/src/send_uln.rs +89 -135
- package/contracts/message-libs/uln-302/src/storage.rs +5 -5
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +5 -7
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +3 -3
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +6 -9
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +2 -2
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +3 -3
- package/contracts/message-libs/uln-302/src/tests/setup.rs +9 -0
- package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +5 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +1 -2
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +1 -2
- package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +37 -55
- package/contracts/message-libs/uln-302/src/uln302.rs +8 -5
- package/contracts/oapps/counter/src/counter.rs +0 -1
- package/contracts/oapps/oapp/src/macro_tests/test_macros.rs +306 -224
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +0 -1
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +0 -1
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +0 -1
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +0 -1
- package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_core.rs +1 -0
- package/contracts/oapps/oft/integration-tests/setup.rs +10 -3
- package/contracts/oapps/oft/integration-tests/utils.rs +1 -1
- package/contracts/oapps/oft/src/default_oft_impl.rs +9 -3
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +5 -5
- package/contracts/oapps/oft/src/extensions/pausable.rs +1 -1
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +18 -18
- package/contracts/oapps/oft/src/oft.rs +9 -9
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +1 -1
- package/contracts/oapps/oft/src/tests/extensions/setup.rs +26 -11
- package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +1 -1
- package/contracts/oapps/oft/src/tests/test_send.rs +4 -4
- package/contracts/oapps/oft/src/tests/test_utils.rs +93 -74
- package/contracts/oapps/oft-std/Cargo.toml +6 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/mod.rs +3 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/test_oft_fee.rs +157 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/test_pausable.rs +162 -0
- package/contracts/oapps/oft-std/integration-tests/extensions/test_rate_limiter.rs +186 -0
- package/contracts/oapps/oft-std/integration-tests/mod.rs +3 -0
- package/contracts/oapps/oft-std/integration-tests/setup.rs +245 -0
- package/contracts/oapps/oft-std/integration-tests/utils.rs +427 -0
- package/contracts/oapps/oft-std/src/lib.rs +12 -1
- package/contracts/oapps/oft-std/src/oft.rs +122 -25
- package/contracts/upgrader/Cargo.toml +19 -0
- package/contracts/upgrader/src/lib.rs +96 -0
- package/contracts/upgrader/src/tests/mod.rs +1 -0
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract1.wasm +0 -0
- package/contracts/upgrader/src/tests/test_data/test_upgradeable_contract2.wasm +0 -0
- package/contracts/upgrader/src/tests/test_upgrader.rs +120 -0
- package/contracts/utils/src/errors.rs +6 -1
- package/contracts/utils/src/lib.rs +2 -1
- package/contracts/utils/src/ownable.rs +49 -61
- package/contracts/utils/src/tests/mod.rs +3 -1
- package/contracts/utils/src/tests/option_ext.rs +21 -0
- package/contracts/utils/src/tests/ownable.rs +10 -69
- package/contracts/utils/src/tests/ttl_configurable.rs +596 -0
- package/contracts/utils/src/tests/upgradeable.rs +288 -0
- package/contracts/utils/src/{ttl.rs → ttl_configurable.rs} +67 -52
- package/contracts/utils/src/upgradeable.rs +54 -0
- package/contracts/workers/dvn/Cargo.toml +1 -1
- package/contracts/workers/dvn/src/auth.rs +21 -32
- package/contracts/workers/dvn/src/dvn.rs +40 -3
- package/contracts/workers/dvn/src/errors.rs +1 -0
- package/contracts/workers/dvn/src/multisig.rs +10 -6
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -2
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +4 -4
- package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -2
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +46 -14
- package/contracts/workers/dvn-fee-lib/src/errors.rs +3 -2
- package/contracts/workers/dvn-fee-lib/src/lib.rs +5 -11
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +30 -16
- package/contracts/workers/executor/src/executor.rs +16 -2
- package/contracts/workers/executor-fee-lib/src/errors.rs +9 -7
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +154 -119
- package/contracts/workers/executor-helper/Cargo.toml +0 -5
- package/contracts/workers/executor-helper/src/lib.rs +1 -7
- package/contracts/workers/price-feed/Cargo.toml +0 -1
- package/contracts/workers/price-feed/src/errors.rs +3 -2
- package/contracts/workers/price-feed/src/lib.rs +5 -6
- package/contracts/workers/price-feed/src/price_feed.rs +39 -17
- package/contracts/workers/worker/Cargo.toml +4 -0
- package/contracts/workers/worker/src/interfaces/price_feed.rs +3 -3
- package/contracts/workers/worker/src/lib.rs +2 -2
- package/contracts/workers/worker/src/tests/mod.rs +4 -0
- package/contracts/workers/worker/src/tests/setup.rs +147 -0
- package/contracts/workers/worker/src/tests/worker.rs +501 -0
- package/contracts/workers/worker/src/worker.rs +10 -16
- package/package.json +3 -3
- package/sdk/dist/generated/bml.d.ts +40 -30
- package/sdk/dist/generated/bml.js +16 -11
- package/sdk/dist/generated/counter.d.ts +168 -134
- package/sdk/dist/generated/counter.js +26 -21
- package/sdk/dist/generated/dvn.d.ts +1932 -0
- package/sdk/dist/generated/dvn.js +288 -0
- package/sdk/dist/generated/dvn_fee_lib.d.ts +615 -0
- package/sdk/dist/generated/dvn_fee_lib.js +123 -0
- package/sdk/dist/generated/endpoint.d.ts +75 -41
- package/sdk/dist/generated/endpoint.js +22 -17
- package/sdk/dist/generated/executor.d.ts +1809 -0
- package/sdk/dist/generated/executor.js +269 -0
- package/sdk/dist/generated/executor_fee_lib.d.ts +999 -0
- package/sdk/dist/generated/executor_fee_lib.js +208 -0
- package/sdk/dist/generated/executor_helper.d.ts +869 -0
- package/sdk/dist/generated/executor_helper.js +187 -0
- package/sdk/dist/generated/oft_std.d.ts +1544 -0
- package/sdk/dist/generated/oft_std.js +271 -0
- package/sdk/dist/generated/price_feed.d.ts +1002 -0
- package/sdk/dist/generated/price_feed.js +170 -0
- package/sdk/dist/generated/sml.d.ts +75 -41
- package/sdk/dist/generated/sml.js +22 -17
- package/sdk/dist/generated/uln302.d.ts +79 -60
- package/sdk/dist/generated/uln302.js +37 -37
- package/sdk/dist/generated/upgrader.d.ts +70 -0
- package/sdk/dist/generated/upgrader.js +19 -0
- package/sdk/dist/index.d.ts +8 -0
- package/sdk/dist/index.js +11 -0
- package/sdk/package.json +4 -3
- package/sdk/src/index.ts +13 -0
- package/sdk/test/index.test.ts +0 -1
- package/sdk/test/oft.test.ts +12 -23
- package/sdk/test/suites/testUpgradeable.ts +169 -0
- package/sdk/test/upgrader.test.ts +309 -0
- package/tools/ts-bindings-gen/src/main.rs +11 -1
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +0 -316
- package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +0 -388
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +0 -162
- package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +0 -319
- package/contracts/utils/src/tests/ttl.rs +0 -421
- /package/contracts/{oapp-macros → oapps/oapp-macros}/Cargo.toml +0 -0
- /package/contracts/{oapp-macros → oapps/oapp-macros}/src/lib.rs +0 -0
- /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_full.rs +0 -0
- /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_options_type3.rs +0 -0
- /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_receiver.rs +0 -0
- /package/contracts/{oapp-macros → oapps/oapp-macros}/src/oapp_sender.rs +0 -0
- /package/contracts/{oapp-macros → oapps/oapp-macros}/src/util.rs +0 -0
|
@@ -1,144 +1,471 @@
|
|
|
1
|
-
use
|
|
2
|
-
use soroban_sdk::{
|
|
3
|
-
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
4
|
-
vec, Bytes, BytesN, IntoVal,
|
|
5
|
-
};
|
|
1
|
+
use soroban_sdk::{testutils::Address as _, vec, Address, Bytes, BytesN};
|
|
6
2
|
|
|
3
|
+
use crate::{errors::EndpointError, tests::endpoint_setup::setup, util::compute_guid, MessagingParams};
|
|
4
|
+
|
|
5
|
+
// Helpers
|
|
6
|
+
/// Helper to create default messaging params
|
|
7
|
+
fn default_params(env: &soroban_sdk::Env, dst_eid: u32, pay_in_zro: bool) -> MessagingParams {
|
|
8
|
+
MessagingParams {
|
|
9
|
+
dst_eid,
|
|
10
|
+
receiver: BytesN::from_array(env, &[1u8; 32]),
|
|
11
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
12
|
+
options: Bytes::new(env),
|
|
13
|
+
pay_in_zro,
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Native Fee Payment
|
|
7
18
|
#[test]
|
|
8
19
|
fn test_quote_with_native_fee() {
|
|
9
20
|
let context = setup();
|
|
10
21
|
let env = &context.env;
|
|
11
22
|
let endpoint_client = &context.endpoint_client;
|
|
12
23
|
|
|
13
|
-
let sender =
|
|
24
|
+
let sender = Address::generate(env);
|
|
14
25
|
let dst_eid = 2u32;
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
let
|
|
18
|
-
let fee_recipient = soroban_sdk::Address::generate(env);
|
|
19
|
-
|
|
20
|
-
// Setup mock send library with 100 native fee, 0 zro fee
|
|
21
|
-
let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 100, 0, fee_recipient);
|
|
22
|
-
|
|
23
|
-
// Register and set as default send library
|
|
24
|
-
context.mock_owner_auth("register_library", (&send_lib,));
|
|
25
|
-
endpoint_client.register_library(&send_lib);
|
|
26
|
-
context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
|
|
27
|
-
endpoint_client.set_default_send_library(&dst_eid, &send_lib);
|
|
28
|
-
|
|
29
|
-
let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: false };
|
|
30
|
-
|
|
31
|
-
// Mock auth for sender
|
|
32
|
-
env.mock_auths(&[MockAuth {
|
|
33
|
-
address: &sender,
|
|
34
|
-
invoke: &MockAuthInvoke {
|
|
35
|
-
contract: &endpoint_client.address,
|
|
36
|
-
fn_name: "quote",
|
|
37
|
-
args: (&sender, ¶ms).into_val(env),
|
|
38
|
-
sub_invokes: &[],
|
|
39
|
-
},
|
|
40
|
-
}]);
|
|
26
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
27
|
+
|
|
28
|
+
let params = default_params(env, dst_eid, false);
|
|
41
29
|
|
|
42
30
|
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
43
31
|
assert_eq!(fee.native_fee, 100);
|
|
44
32
|
assert_eq!(fee.zro_fee, 0);
|
|
45
33
|
}
|
|
46
34
|
|
|
35
|
+
// ZRO Fee Payment
|
|
47
36
|
#[test]
|
|
48
37
|
fn test_quote_with_zro_fee() {
|
|
49
38
|
let context = setup();
|
|
50
39
|
let env = &context.env;
|
|
51
40
|
let endpoint_client = &context.endpoint_client;
|
|
52
41
|
|
|
53
|
-
let sender =
|
|
42
|
+
let sender = Address::generate(env);
|
|
54
43
|
let dst_eid = 2u32;
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
let
|
|
59
|
-
|
|
60
|
-
// Setup ZRO token
|
|
61
|
-
context.mock_owner_auth("set_zro", (&context.zro_token_client.address,));
|
|
62
|
-
endpoint_client.set_zro(&context.zro_token_client.address);
|
|
63
|
-
|
|
64
|
-
// Setup mock send library with 50 native fee, 25 zro fee
|
|
65
|
-
let send_lib = context.setup_mock_send_lib(vec![env, dst_eid], 50, 25, fee_recipient);
|
|
66
|
-
|
|
67
|
-
// Register and set as default send library
|
|
68
|
-
context.mock_owner_auth("register_library", (&send_lib,));
|
|
69
|
-
endpoint_client.register_library(&send_lib);
|
|
70
|
-
context.mock_owner_auth("set_default_send_library", (&dst_eid, &send_lib));
|
|
71
|
-
endpoint_client.set_default_send_library(&dst_eid, &send_lib);
|
|
72
|
-
|
|
73
|
-
let params = MessagingParams { dst_eid, receiver, message, options, pay_in_zro: true };
|
|
74
|
-
|
|
75
|
-
// Mock auth for sender
|
|
76
|
-
env.mock_auths(&[MockAuth {
|
|
77
|
-
address: &sender,
|
|
78
|
-
invoke: &MockAuthInvoke {
|
|
79
|
-
contract: &endpoint_client.address,
|
|
80
|
-
fn_name: "quote",
|
|
81
|
-
args: (&sender, ¶ms).into_val(env),
|
|
82
|
-
sub_invokes: &[],
|
|
83
|
-
},
|
|
84
|
-
}]);
|
|
44
|
+
context.setup_zro_with_auth();
|
|
45
|
+
context.setup_default_send_lib(dst_eid, 50, 25);
|
|
46
|
+
|
|
47
|
+
let params = default_params(env, dst_eid, true);
|
|
85
48
|
|
|
86
49
|
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
87
50
|
assert_eq!(fee.native_fee, 50);
|
|
88
51
|
assert_eq!(fee.zro_fee, 25);
|
|
89
52
|
}
|
|
90
53
|
|
|
54
|
+
#[test]
|
|
55
|
+
fn test_quote_pay_in_zro_false_with_zro_set() {
|
|
56
|
+
let context = setup();
|
|
57
|
+
let env = &context.env;
|
|
58
|
+
let endpoint_client = &context.endpoint_client;
|
|
59
|
+
|
|
60
|
+
let sender = Address::generate(env);
|
|
61
|
+
let dst_eid = 2u32;
|
|
62
|
+
context.setup_zro_with_auth(); // Set ZRO but don't use it
|
|
63
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
64
|
+
|
|
65
|
+
let params = default_params(env, dst_eid, false);
|
|
66
|
+
|
|
67
|
+
// Should work fine even though ZRO is set, because pay_in_zro is false
|
|
68
|
+
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
69
|
+
assert_eq!(fee.native_fee, 100);
|
|
70
|
+
assert_eq!(fee.zro_fee, 0);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Send Library Management
|
|
91
74
|
#[test]
|
|
92
75
|
fn test_quote_with_custom_send_library() {
|
|
93
76
|
let context = setup();
|
|
94
77
|
let env = &context.env;
|
|
95
78
|
let endpoint_client = &context.endpoint_client;
|
|
96
79
|
|
|
97
|
-
let sender =
|
|
80
|
+
let sender = Address::generate(env);
|
|
98
81
|
let dst_eid = 2u32;
|
|
99
|
-
let
|
|
100
|
-
let message = Bytes::from_array(env, &[1, 2, 3, 4]);
|
|
101
|
-
let options = Bytes::new(env);
|
|
102
|
-
let fee_recipient = soroban_sdk::Address::generate(env);
|
|
82
|
+
let fee_recipient = Address::generate(env);
|
|
103
83
|
|
|
104
84
|
// Setup default send library with 100 fee
|
|
105
|
-
|
|
106
|
-
context.mock_owner_auth("register_library", (&default_lib,));
|
|
107
|
-
endpoint_client.register_library(&default_lib);
|
|
108
|
-
context.mock_owner_auth("set_default_send_library", (&dst_eid, &default_lib));
|
|
109
|
-
endpoint_client.set_default_send_library(&dst_eid, &default_lib);
|
|
85
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
110
86
|
|
|
111
87
|
// Setup custom send library with 200 fee
|
|
112
88
|
let custom_lib = context.setup_mock_send_lib(vec![env, dst_eid], 200, 0, fee_recipient);
|
|
113
|
-
context.
|
|
114
|
-
endpoint_client.register_library(&custom_lib);
|
|
89
|
+
context.register_library_with_auth(&custom_lib);
|
|
115
90
|
|
|
116
91
|
// Set custom library for sender
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
invoke: &MockAuthInvoke {
|
|
120
|
-
contract: &endpoint_client.address,
|
|
121
|
-
fn_name: "set_send_library",
|
|
122
|
-
args: (&sender, &sender, &dst_eid, &custom_lib).into_val(env),
|
|
123
|
-
sub_invokes: &[],
|
|
124
|
-
},
|
|
125
|
-
}]);
|
|
92
|
+
let custom_lib_option = Some(custom_lib.clone());
|
|
93
|
+
context.mock_auth(&sender, "set_send_library", (&sender, &sender, &dst_eid, &custom_lib_option));
|
|
126
94
|
endpoint_client.set_send_library(&sender, &sender, &dst_eid, &Some(custom_lib));
|
|
127
95
|
|
|
128
|
-
let params =
|
|
129
|
-
|
|
130
|
-
// Mock auth for sender
|
|
131
|
-
env.mock_auths(&[MockAuth {
|
|
132
|
-
address: &sender,
|
|
133
|
-
invoke: &MockAuthInvoke {
|
|
134
|
-
contract: &endpoint_client.address,
|
|
135
|
-
fn_name: "quote",
|
|
136
|
-
args: (&sender, ¶ms).into_val(env),
|
|
137
|
-
sub_invokes: &[],
|
|
138
|
-
},
|
|
139
|
-
}]);
|
|
96
|
+
let params = default_params(env, dst_eid, false);
|
|
140
97
|
|
|
141
98
|
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
142
99
|
// Should use custom library with 200 fee
|
|
143
100
|
assert_eq!(fee.native_fee, 200);
|
|
101
|
+
assert_eq!(fee.zro_fee, 0);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
// Error Cases
|
|
105
|
+
#[test]
|
|
106
|
+
fn test_quote_zro_unavailable_when_pay_in_zro() {
|
|
107
|
+
let context = setup();
|
|
108
|
+
let env = &context.env;
|
|
109
|
+
let endpoint_client = &context.endpoint_client;
|
|
110
|
+
|
|
111
|
+
let sender = Address::generate(env);
|
|
112
|
+
let dst_eid = 999u32; // Use unique dst_eid to avoid conflicts
|
|
113
|
+
|
|
114
|
+
// Verify ZRO is not set
|
|
115
|
+
let zro_token = endpoint_client.zro();
|
|
116
|
+
assert_eq!(zro_token, None, "ZRO must not be set for this test");
|
|
117
|
+
|
|
118
|
+
// DO NOT setup send library - the ZRO check happens FIRST (line 44), before get_send_library is called
|
|
119
|
+
// So we should get ZROUnavailable error, not DefaultSendLibUnavailable
|
|
120
|
+
let params = default_params(env, dst_eid, true);
|
|
121
|
+
|
|
122
|
+
let result = endpoint_client.try_quote(&sender, ¶ms);
|
|
123
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::ZROUnavailable.into());
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
#[test]
|
|
127
|
+
fn test_quote_default_send_lib_unavailable() {
|
|
128
|
+
let context = setup();
|
|
129
|
+
let env = &context.env;
|
|
130
|
+
let endpoint_client = &context.endpoint_client;
|
|
131
|
+
|
|
132
|
+
let sender = Address::generate(env);
|
|
133
|
+
let dst_eid = 999u32; // Use unique dst_eid that has no default send library
|
|
134
|
+
|
|
135
|
+
// Verify no default send library is set
|
|
136
|
+
let default_send_lib = context.endpoint_client.default_send_library(&dst_eid);
|
|
137
|
+
assert_eq!(default_send_lib, None, "Default send library should not be set for this test");
|
|
138
|
+
|
|
139
|
+
let params = default_params(env, dst_eid, false);
|
|
140
|
+
|
|
141
|
+
// Should fail with DefaultSendLibUnavailable since no default send library is set
|
|
142
|
+
let result = endpoint_client.try_quote(&sender, ¶ms);
|
|
143
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::DefaultSendLibUnavailable.into());
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Edge Cases
|
|
147
|
+
#[test]
|
|
148
|
+
fn test_quote_with_empty_message_and_options() {
|
|
149
|
+
let context = setup();
|
|
150
|
+
let env = &context.env;
|
|
151
|
+
let endpoint_client = &context.endpoint_client;
|
|
152
|
+
|
|
153
|
+
let sender = Address::generate(env);
|
|
154
|
+
let dst_eid = 2u32;
|
|
155
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
156
|
+
|
|
157
|
+
let params = MessagingParams {
|
|
158
|
+
dst_eid,
|
|
159
|
+
receiver: BytesN::from_array(env, &[1u8; 32]),
|
|
160
|
+
message: Bytes::new(env), // Empty message
|
|
161
|
+
options: Bytes::new(env),
|
|
162
|
+
pay_in_zro: false,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
// Should work fine with empty message
|
|
166
|
+
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
167
|
+
assert_eq!(fee.native_fee, 100);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
#[test]
|
|
171
|
+
fn test_quote_with_non_empty_options() {
|
|
172
|
+
let context = setup();
|
|
173
|
+
let env = &context.env;
|
|
174
|
+
let endpoint_client = &context.endpoint_client;
|
|
175
|
+
|
|
176
|
+
let sender = Address::generate(env);
|
|
177
|
+
let dst_eid = 2u32;
|
|
178
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
179
|
+
|
|
180
|
+
// Create non-empty options (simulating executor/DVN options)
|
|
181
|
+
// Format: [worker_id (1 byte), option_size (2 bytes), option_data...]
|
|
182
|
+
let options = Bytes::from_array(env, &[1u8, 0u8, 4u8, 1u8, 2u8, 3u8, 4u8]);
|
|
183
|
+
|
|
184
|
+
let params = MessagingParams {
|
|
185
|
+
dst_eid,
|
|
186
|
+
receiver: BytesN::from_array(env, &[1u8; 32]),
|
|
187
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
188
|
+
options,
|
|
189
|
+
pay_in_zro: false,
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// Should work fine with non-empty options
|
|
193
|
+
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
194
|
+
assert_eq!(fee.native_fee, 100);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
#[test]
|
|
198
|
+
fn test_quote_with_different_dst_eid() {
|
|
199
|
+
let context = setup();
|
|
200
|
+
let env = &context.env;
|
|
201
|
+
let endpoint_client = &context.endpoint_client;
|
|
202
|
+
|
|
203
|
+
let sender = Address::generate(env);
|
|
204
|
+
let dst_eid_1 = 2u32;
|
|
205
|
+
let dst_eid_2 = 3u32;
|
|
206
|
+
|
|
207
|
+
// Setup different send libraries for different dst_eids
|
|
208
|
+
context.setup_default_send_lib(dst_eid_1, 100, 0);
|
|
209
|
+
context.setup_default_send_lib(dst_eid_2, 200, 0);
|
|
210
|
+
|
|
211
|
+
let params_1 = default_params(env, dst_eid_1, false);
|
|
212
|
+
let fee_1 = endpoint_client.quote(&sender, ¶ms_1);
|
|
213
|
+
assert_eq!(fee_1.native_fee, 100);
|
|
214
|
+
|
|
215
|
+
let params_2 = default_params(env, dst_eid_2, false);
|
|
216
|
+
let fee_2 = endpoint_client.quote(&sender, ¶ms_2);
|
|
217
|
+
assert_eq!(fee_2.native_fee, 200);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#[test]
|
|
221
|
+
fn test_quote_with_different_receivers() {
|
|
222
|
+
let context = setup();
|
|
223
|
+
let env = &context.env;
|
|
224
|
+
let endpoint_client = &context.endpoint_client;
|
|
225
|
+
|
|
226
|
+
let sender = Address::generate(env);
|
|
227
|
+
let dst_eid = 2u32;
|
|
228
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
229
|
+
|
|
230
|
+
let receiver_1 = BytesN::from_array(env, &[1u8; 32]);
|
|
231
|
+
let receiver_2 = BytesN::from_array(env, &[2u8; 32]);
|
|
232
|
+
|
|
233
|
+
let params_1 = MessagingParams {
|
|
234
|
+
dst_eid,
|
|
235
|
+
receiver: receiver_1,
|
|
236
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
237
|
+
options: Bytes::new(env),
|
|
238
|
+
pay_in_zro: false,
|
|
239
|
+
};
|
|
240
|
+
let fee_1 = endpoint_client.quote(&sender, ¶ms_1);
|
|
241
|
+
assert_eq!(fee_1.native_fee, 100);
|
|
242
|
+
|
|
243
|
+
let params_2 = MessagingParams {
|
|
244
|
+
dst_eid,
|
|
245
|
+
receiver: receiver_2,
|
|
246
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
247
|
+
options: Bytes::new(env),
|
|
248
|
+
pay_in_zro: false,
|
|
249
|
+
};
|
|
250
|
+
let fee_2 = endpoint_client.quote(&sender, ¶ms_2);
|
|
251
|
+
assert_eq!(fee_2.native_fee, 100);
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
#[test]
|
|
255
|
+
fn test_quote_with_different_senders() {
|
|
256
|
+
let context = setup();
|
|
257
|
+
let env = &context.env;
|
|
258
|
+
let endpoint_client = &context.endpoint_client;
|
|
259
|
+
|
|
260
|
+
let sender_1 = Address::generate(env);
|
|
261
|
+
let sender_2 = Address::generate(env);
|
|
262
|
+
let dst_eid = 2u32;
|
|
263
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
264
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
265
|
+
|
|
266
|
+
// Each sender should have independent nonce tracking
|
|
267
|
+
let params_1 = MessagingParams {
|
|
268
|
+
dst_eid,
|
|
269
|
+
receiver: receiver.clone(),
|
|
270
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
271
|
+
options: Bytes::new(env),
|
|
272
|
+
pay_in_zro: false,
|
|
273
|
+
};
|
|
274
|
+
let fee_1 = endpoint_client.quote(&sender_1, ¶ms_1);
|
|
275
|
+
assert_eq!(fee_1.native_fee, 100);
|
|
276
|
+
|
|
277
|
+
let params_2 = MessagingParams {
|
|
278
|
+
dst_eid,
|
|
279
|
+
receiver: receiver.clone(),
|
|
280
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
281
|
+
options: Bytes::new(env),
|
|
282
|
+
pay_in_zro: false,
|
|
283
|
+
};
|
|
284
|
+
let fee_2 = endpoint_client.quote(&sender_2, ¶ms_2);
|
|
285
|
+
assert_eq!(fee_2.native_fee, 100);
|
|
286
|
+
|
|
287
|
+
// Verify both senders have independent nonces (both should be 0 initially)
|
|
288
|
+
let nonce_1 = endpoint_client.outbound_nonce(&sender_1, &dst_eid, &receiver);
|
|
289
|
+
let nonce_2 = endpoint_client.outbound_nonce(&sender_2, &dst_eid, &receiver);
|
|
290
|
+
assert_eq!(nonce_1, 0);
|
|
291
|
+
assert_eq!(nonce_2, 0);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
// Large Message Tests
|
|
295
|
+
#[test]
|
|
296
|
+
fn test_quote_with_large_message() {
|
|
297
|
+
let context = setup();
|
|
298
|
+
let env = &context.env;
|
|
299
|
+
let endpoint_client = &context.endpoint_client;
|
|
300
|
+
|
|
301
|
+
let sender = Address::generate(env);
|
|
302
|
+
let dst_eid = 2u32;
|
|
303
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
304
|
+
|
|
305
|
+
// Create a large message (1024 bytes)
|
|
306
|
+
let mut large_message_data = [0u8; 1024];
|
|
307
|
+
for i in 0..1024 {
|
|
308
|
+
large_message_data[i] = (i % 256) as u8;
|
|
309
|
+
}
|
|
310
|
+
let large_message = Bytes::from_array(env, &large_message_data);
|
|
311
|
+
|
|
312
|
+
let params = MessagingParams {
|
|
313
|
+
dst_eid,
|
|
314
|
+
receiver: BytesN::from_array(env, &[1u8; 32]),
|
|
315
|
+
message: large_message,
|
|
316
|
+
options: Bytes::new(env),
|
|
317
|
+
pay_in_zro: false,
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
// Should work fine with large message
|
|
321
|
+
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
322
|
+
assert_eq!(fee.native_fee, 100);
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
// Nonce and GUID Verification
|
|
326
|
+
#[test]
|
|
327
|
+
fn test_quote_nonce_calculation() {
|
|
328
|
+
let context = setup();
|
|
329
|
+
let env = &context.env;
|
|
330
|
+
let endpoint_client = &context.endpoint_client;
|
|
331
|
+
|
|
332
|
+
let sender = Address::generate(env);
|
|
333
|
+
let dst_eid = 2u32;
|
|
334
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
335
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
336
|
+
|
|
337
|
+
// Initial nonce should be 0
|
|
338
|
+
let initial_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
|
|
339
|
+
assert_eq!(initial_nonce, 0);
|
|
340
|
+
|
|
341
|
+
let params = MessagingParams {
|
|
342
|
+
dst_eid,
|
|
343
|
+
receiver: receiver.clone(),
|
|
344
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
345
|
+
options: Bytes::new(env),
|
|
346
|
+
pay_in_zro: false,
|
|
347
|
+
};
|
|
348
|
+
|
|
349
|
+
// First quote should use nonce = 0 + 1 = 1
|
|
350
|
+
let _fee_1 = endpoint_client.quote(&sender, ¶ms);
|
|
351
|
+
// Nonce should still be 0 (quote doesn't increment nonce)
|
|
352
|
+
let nonce_after_first = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
|
|
353
|
+
assert_eq!(nonce_after_first, 0);
|
|
354
|
+
|
|
355
|
+
// Second quote should also use nonce = 0 + 1 = 1 (nonce doesn't change)
|
|
356
|
+
let _fee_2 = endpoint_client.quote(&sender, ¶ms);
|
|
357
|
+
let nonce_after_second = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
|
|
358
|
+
assert_eq!(nonce_after_second, 0);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
#[test]
|
|
362
|
+
fn test_quote_guid_calculation() {
|
|
363
|
+
let context = setup();
|
|
364
|
+
let env = &context.env;
|
|
365
|
+
let endpoint_client = &context.endpoint_client;
|
|
366
|
+
|
|
367
|
+
let sender = Address::generate(env);
|
|
368
|
+
let dst_eid = 2u32;
|
|
369
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
370
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
371
|
+
|
|
372
|
+
let params = MessagingParams {
|
|
373
|
+
dst_eid,
|
|
374
|
+
receiver: receiver.clone(),
|
|
375
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
376
|
+
options: Bytes::new(env),
|
|
377
|
+
pay_in_zro: false,
|
|
378
|
+
};
|
|
379
|
+
|
|
380
|
+
// Get the expected nonce (outbound_nonce + 1)
|
|
381
|
+
let expected_nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver) + 1;
|
|
382
|
+
let src_eid = endpoint_client.eid();
|
|
383
|
+
|
|
384
|
+
// Calculate expected GUID
|
|
385
|
+
let expected_guid = compute_guid(env, expected_nonce, src_eid, &sender, dst_eid, &receiver);
|
|
386
|
+
|
|
387
|
+
// Mock the send library to capture the packet
|
|
388
|
+
// Since we can't directly inspect the packet passed to send_lib.quote(),
|
|
389
|
+
// we verify the nonce calculation indirectly by checking that quote works correctly
|
|
390
|
+
// The GUID is computed internally, so we verify the nonce is correct
|
|
391
|
+
let _fee = endpoint_client.quote(&sender, ¶ms);
|
|
392
|
+
|
|
393
|
+
// Verify the GUID would be computed correctly by checking next_guid
|
|
394
|
+
let next_guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
|
|
395
|
+
assert_eq!(next_guid, expected_guid);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
#[test]
|
|
399
|
+
fn test_quote_multiple_quotes_same_path() {
|
|
400
|
+
let context = setup();
|
|
401
|
+
let env = &context.env;
|
|
402
|
+
let endpoint_client = &context.endpoint_client;
|
|
403
|
+
|
|
404
|
+
let sender = Address::generate(env);
|
|
405
|
+
let dst_eid = 2u32;
|
|
406
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
407
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
408
|
+
|
|
409
|
+
let params = MessagingParams {
|
|
410
|
+
dst_eid,
|
|
411
|
+
receiver: receiver.clone(),
|
|
412
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
413
|
+
options: Bytes::new(env),
|
|
414
|
+
pay_in_zro: false,
|
|
415
|
+
};
|
|
416
|
+
|
|
417
|
+
// Multiple quotes for the same path should all use the same nonce (outbound_nonce + 1)
|
|
418
|
+
// because quote doesn't increment the nonce
|
|
419
|
+
for _ in 0..5 {
|
|
420
|
+
let fee = endpoint_client.quote(&sender, ¶ms);
|
|
421
|
+
assert_eq!(fee.native_fee, 100);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
// Nonce should still be 0 (quote doesn't increment it)
|
|
425
|
+
let nonce = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
|
|
426
|
+
assert_eq!(nonce, 0);
|
|
427
|
+
}
|
|
428
|
+
|
|
429
|
+
// Quote After Send
|
|
430
|
+
#[test]
|
|
431
|
+
fn test_quote_after_send() {
|
|
432
|
+
let context = setup();
|
|
433
|
+
let env = &context.env;
|
|
434
|
+
let endpoint_client = &context.endpoint_client;
|
|
435
|
+
|
|
436
|
+
let sender = Address::generate(env);
|
|
437
|
+
let refund_address = Address::generate(env);
|
|
438
|
+
let dst_eid = 2u32;
|
|
439
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
440
|
+
context.setup_default_send_lib(dst_eid, 100, 0);
|
|
441
|
+
|
|
442
|
+
// Setup ZRO token (required for send)
|
|
443
|
+
context.setup_zro_with_auth();
|
|
444
|
+
|
|
445
|
+
// Mint and transfer native tokens for send
|
|
446
|
+
context.fund_endpoint_with_native(&sender, 100);
|
|
447
|
+
|
|
448
|
+
let params = MessagingParams {
|
|
449
|
+
dst_eid,
|
|
450
|
+
receiver: receiver.clone(),
|
|
451
|
+
message: Bytes::from_array(env, &[1, 2, 3, 4]),
|
|
452
|
+
options: Bytes::new(env),
|
|
453
|
+
pay_in_zro: false,
|
|
454
|
+
};
|
|
455
|
+
|
|
456
|
+
// Send a message (this increments the nonce)
|
|
457
|
+
context.mock_auth(&sender, "send", (&sender, ¶ms, &refund_address));
|
|
458
|
+
let _receipt = endpoint_client.send(&sender, ¶ms, &refund_address);
|
|
459
|
+
|
|
460
|
+
// Verify nonce was incremented
|
|
461
|
+
let nonce_after_send = endpoint_client.outbound_nonce(&sender, &dst_eid, &receiver);
|
|
462
|
+
assert_eq!(nonce_after_send, 1);
|
|
463
|
+
|
|
464
|
+
// Quote should now use nonce = 1 + 1 = 2
|
|
465
|
+
let _fee = endpoint_client.quote(&sender, ¶ms);
|
|
466
|
+
|
|
467
|
+
// Verify next_guid uses nonce 2
|
|
468
|
+
let next_guid = endpoint_client.next_guid(&sender, &dst_eid, &receiver);
|
|
469
|
+
let expected_guid = compute_guid(env, 2, endpoint_client.eid(), &sender, dst_eid, &receiver);
|
|
470
|
+
assert_eq!(next_guid, expected_guid);
|
|
144
471
|
}
|
|
@@ -1,29 +1,56 @@
|
|
|
1
|
-
use
|
|
2
|
-
use soroban_sdk::
|
|
3
|
-
use soroban_sdk::IntoVal;
|
|
1
|
+
use soroban_sdk::testutils::Address as _;
|
|
2
|
+
use soroban_sdk::Address;
|
|
4
3
|
|
|
4
|
+
use crate::{tests::endpoint_setup::setup, EndpointV2};
|
|
5
|
+
|
|
6
|
+
// NOTE ABOUT COVERAGE
|
|
7
|
+
//
|
|
8
|
+
// `require_oapp_auth` has two "success" paths:
|
|
9
|
+
// - caller == oapp
|
|
10
|
+
// - caller == delegate(oapp)
|
|
11
|
+
//
|
|
12
|
+
// Those success paths MUST also satisfy `caller.require_auth()`.
|
|
13
|
+
// Calling `require_oapp_auth` directly from a unit test is brittle because the mocked auth context
|
|
14
|
+
// is keyed off the *public contract invocation* (e.g. `clear`), not internal function calls.
|
|
15
|
+
//
|
|
16
|
+
// We intentionally do NOT test the success paths here.
|
|
17
|
+
// They are covered end-to-end via the public `clear()` entrypoint in `clear.rs`:
|
|
18
|
+
// - OApp (receiver) clears successfully (covers caller == oapp)
|
|
19
|
+
// - Delegate clears successfully (covers caller == delegate(oapp))
|
|
20
|
+
|
|
21
|
+
// Unauthorized caller is rejected
|
|
22
|
+
#[test]
|
|
23
|
+
#[should_panic(expected = "Error(Contract, #21)")] // EndpointError::Unauthorized
|
|
24
|
+
fn test_require_oapp_auth_unauthorized() {
|
|
25
|
+
let context = setup();
|
|
26
|
+
let env = &context.env;
|
|
27
|
+
let endpoint_client = &context.endpoint_client;
|
|
28
|
+
let oapp = Address::generate(env);
|
|
29
|
+
let unauthorized = Address::generate(env);
|
|
30
|
+
|
|
31
|
+
// Unauthorized address (not oapp itself and not delegate) should fail with Unauthorized error
|
|
32
|
+
env.as_contract(&endpoint_client.address, || {
|
|
33
|
+
EndpointV2::require_oapp_auth(env, &unauthorized, &oapp);
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// Wrong delegate is rejected
|
|
5
38
|
#[test]
|
|
6
|
-
|
|
39
|
+
#[should_panic(expected = "Error(Contract, #21)")] // EndpointError::Unauthorized
|
|
40
|
+
fn test_require_oapp_auth_wrong_delegate() {
|
|
7
41
|
let context = setup();
|
|
8
42
|
let env = &context.env;
|
|
9
43
|
let endpoint_client = &context.endpoint_client;
|
|
10
|
-
let oapp =
|
|
11
|
-
let delegate =
|
|
44
|
+
let oapp = Address::generate(env);
|
|
45
|
+
let delegate = Address::generate(env);
|
|
46
|
+
let wrong_delegate = Address::generate(env);
|
|
12
47
|
|
|
13
48
|
// Set delegate
|
|
14
|
-
let delegate_option = Some(delegate
|
|
15
|
-
|
|
16
|
-
address: &oapp,
|
|
17
|
-
invoke: &MockAuthInvoke {
|
|
18
|
-
contract: &endpoint_client.address,
|
|
19
|
-
fn_name: "set_delegate",
|
|
20
|
-
args: (&oapp, &delegate_option).into_val(env),
|
|
21
|
-
sub_invokes: &[],
|
|
22
|
-
},
|
|
23
|
-
}]);
|
|
24
|
-
endpoint_client.set_delegate(&oapp, &delegate_option);
|
|
49
|
+
let delegate_option = Some(delegate);
|
|
50
|
+
context.set_delegate_with_auth(&oapp, &delegate_option);
|
|
25
51
|
|
|
26
|
-
//
|
|
27
|
-
|
|
28
|
-
|
|
52
|
+
// Wrong delegate (not the actual delegate) should fail with Unauthorized error
|
|
53
|
+
env.as_contract(&endpoint_client.address, || {
|
|
54
|
+
EndpointV2::require_oapp_auth(env, &wrong_delegate, &oapp);
|
|
55
|
+
});
|
|
29
56
|
}
|