@layerzerolabs/protocol-stellar-v2 0.2.13 → 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,13 +1,85 @@
|
|
|
1
|
-
use soroban_sdk::{testutils::Address as _, Address, BytesN
|
|
2
|
-
|
|
3
|
-
use crate::{endpoint_v2::EndpointV2, events::PacketNilified, storage, tests::endpoint_setup::setup};
|
|
1
|
+
use soroban_sdk::{testutils::Address as _, Address, BytesN};
|
|
4
2
|
use utils::testing_utils::assert_event;
|
|
5
3
|
|
|
4
|
+
use crate::{
|
|
5
|
+
endpoint_v2::EndpointV2, errors::EndpointError, events::PacketNilified, storage, tests::endpoint_setup::setup,
|
|
6
|
+
tests::endpoint_setup::TestSetup,
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
// Helpers
|
|
10
|
+
fn nil_hash(context: &TestSetup) -> BytesN<32> {
|
|
11
|
+
let env = &context.env;
|
|
12
|
+
let endpoint_client = &context.endpoint_client;
|
|
13
|
+
env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env))
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
fn nilify_with_auth(
|
|
17
|
+
context: &TestSetup,
|
|
18
|
+
caller: &Address,
|
|
19
|
+
receiver: &Address,
|
|
20
|
+
src_eid: u32,
|
|
21
|
+
sender: &BytesN<32>,
|
|
22
|
+
nonce: u64,
|
|
23
|
+
payload_hash: &Option<BytesN<32>>,
|
|
24
|
+
) {
|
|
25
|
+
context.mock_auth(caller, "nilify", (caller, receiver, &src_eid, sender, &nonce, payload_hash));
|
|
26
|
+
context.endpoint_client.nilify(caller, receiver, &src_eid, sender, &nonce, payload_hash);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fn try_nilify_with_auth(
|
|
30
|
+
context: &TestSetup,
|
|
31
|
+
caller: &Address,
|
|
32
|
+
receiver: &Address,
|
|
33
|
+
src_eid: u32,
|
|
34
|
+
sender: &BytesN<32>,
|
|
35
|
+
nonce: u64,
|
|
36
|
+
payload_hash: &Option<BytesN<32>>,
|
|
37
|
+
) -> Result<Result<(), soroban_sdk::ConversionError>, Result<soroban_sdk::Error, soroban_sdk::InvokeError>> {
|
|
38
|
+
context.mock_auth(caller, "nilify", (caller, receiver, &src_eid, sender, &nonce, payload_hash));
|
|
39
|
+
context.endpoint_client.try_nilify(caller, receiver, &src_eid, sender, &nonce, payload_hash)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Authorization (receiver or delegate(receiver) must authorize)
|
|
43
|
+
#[test]
|
|
44
|
+
fn test_nilify_unauthorized() {
|
|
45
|
+
let context = setup();
|
|
46
|
+
let env = &context.env;
|
|
47
|
+
let endpoint_client = &context.endpoint_client;
|
|
48
|
+
|
|
49
|
+
let receiver = Address::generate(env);
|
|
50
|
+
let unauthorized = Address::generate(env);
|
|
51
|
+
let src_eid = 2;
|
|
52
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
53
|
+
let nonce = 1u64;
|
|
54
|
+
|
|
55
|
+
// Unauthorized should fail before require_auth, so no mock_auth is needed.
|
|
56
|
+
let result = endpoint_client.try_nilify(&unauthorized, &receiver, &src_eid, &sender, &nonce, &None);
|
|
57
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::Unauthorized.into());
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#[test]
|
|
61
|
+
#[should_panic(expected = "Error(Auth, InvalidAction)")]
|
|
62
|
+
fn test_nilify_requires_auth_even_when_caller_is_receiver() {
|
|
63
|
+
let context = setup();
|
|
64
|
+
let env = &context.env;
|
|
65
|
+
let endpoint_client = &context.endpoint_client;
|
|
66
|
+
|
|
67
|
+
let receiver = Address::generate(env);
|
|
68
|
+
let src_eid = 2;
|
|
69
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
70
|
+
let nonce = 1u64;
|
|
71
|
+
|
|
72
|
+
// No mock_auth here: require_oapp_auth passes the (caller == receiver) check,
|
|
73
|
+
// then panics at caller.require_auth().
|
|
74
|
+
endpoint_client.nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &None);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Successful nilify with stored (verified) payload hash (state update + event emission)
|
|
6
78
|
#[test]
|
|
7
79
|
fn test_nilify_success_with_stored_payload() {
|
|
8
|
-
let
|
|
9
|
-
let env = &
|
|
10
|
-
let endpoint_client = &
|
|
80
|
+
let context = setup();
|
|
81
|
+
let env = &context.env;
|
|
82
|
+
let endpoint_client = &context.endpoint_client;
|
|
11
83
|
|
|
12
84
|
let receiver = Address::generate(env);
|
|
13
85
|
let src_eid = 2;
|
|
@@ -15,31 +87,17 @@ fn test_nilify_success_with_stored_payload() {
|
|
|
15
87
|
let nonce = 1;
|
|
16
88
|
let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
|
|
17
89
|
|
|
18
|
-
// Store a payload hash first
|
|
19
|
-
|
|
20
|
-
EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
|
|
21
|
-
});
|
|
90
|
+
// Store a payload hash first.
|
|
91
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
|
|
22
92
|
|
|
23
|
-
// Verify payload hash is stored
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
.mock_auths(&[soroban_sdk::testutils::MockAuth {
|
|
32
|
-
address: &receiver,
|
|
33
|
-
invoke: &soroban_sdk::testutils::MockAuthInvoke {
|
|
34
|
-
contract: &endpoint_client.address,
|
|
35
|
-
fn_name: "nilify",
|
|
36
|
-
args: (&receiver, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone())).into_val(env),
|
|
37
|
-
sub_invokes: &[],
|
|
38
|
-
},
|
|
39
|
-
}])
|
|
40
|
-
.nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone()));
|
|
41
|
-
|
|
42
|
-
// Verify PacketNilified event was emitted
|
|
93
|
+
// Verify payload hash is stored.
|
|
94
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash.clone()));
|
|
95
|
+
|
|
96
|
+
// Nilify the payload.
|
|
97
|
+
let payload_hash_opt = Some(payload_hash.clone());
|
|
98
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
|
|
99
|
+
|
|
100
|
+
// Verify PacketNilified event was emitted.
|
|
43
101
|
assert_event(
|
|
44
102
|
env,
|
|
45
103
|
&endpoint_client.address,
|
|
@@ -52,63 +110,132 @@ fn test_nilify_success_with_stored_payload() {
|
|
|
52
110
|
},
|
|
53
111
|
);
|
|
54
112
|
|
|
55
|
-
// Verify payload hash was replaced with nil hash
|
|
56
|
-
let nilified_hash =
|
|
57
|
-
|
|
58
|
-
});
|
|
59
|
-
let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
|
|
113
|
+
// Verify payload hash was replaced with nil hash.
|
|
114
|
+
let nilified_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
|
|
115
|
+
let expected_nil_hash = nil_hash(&context);
|
|
60
116
|
assert_eq!(nilified_hash, Some(expected_nil_hash));
|
|
61
117
|
}
|
|
62
118
|
|
|
119
|
+
// Successful nilify with None (non-verified nonce) when nonce > lazy nonce
|
|
63
120
|
#[test]
|
|
64
121
|
fn test_nilify_success_with_empty_payload() {
|
|
65
|
-
let
|
|
66
|
-
let env = &
|
|
67
|
-
let endpoint_client = &
|
|
122
|
+
let context = setup();
|
|
123
|
+
let env = &context.env;
|
|
124
|
+
let endpoint_client = &context.endpoint_client;
|
|
68
125
|
|
|
69
126
|
let receiver = Address::generate(env);
|
|
70
127
|
let src_eid = 2;
|
|
71
128
|
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
72
129
|
let nonce = 2;
|
|
73
130
|
|
|
74
|
-
// Set lazy nonce to 1 so nonce 2 is greater than lazy nonce
|
|
131
|
+
// Set lazy nonce to 1 so nonce 2 is greater than lazy nonce.
|
|
75
132
|
env.as_contract(&endpoint_client.address, || {
|
|
76
133
|
storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
|
|
77
134
|
});
|
|
78
135
|
|
|
79
|
-
// Nilify with None
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
invoke: &soroban_sdk::testutils::MockAuthInvoke {
|
|
84
|
-
contract: &endpoint_client.address,
|
|
85
|
-
fn_name: "nilify",
|
|
86
|
-
args: (&receiver, &receiver, &src_eid, &sender, &nonce, &None::<BytesN<32>>).into_val(env),
|
|
87
|
-
sub_invokes: &[],
|
|
88
|
-
},
|
|
89
|
-
}])
|
|
90
|
-
.nilify(&receiver, &receiver, &src_eid, &sender, &nonce, &None);
|
|
91
|
-
|
|
92
|
-
// Verify PacketNilified event was emitted
|
|
136
|
+
// Nilify with None.
|
|
137
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &None);
|
|
138
|
+
|
|
139
|
+
// Verify PacketNilified event was emitted.
|
|
93
140
|
assert_event(
|
|
94
141
|
env,
|
|
95
142
|
&endpoint_client.address,
|
|
96
143
|
PacketNilified { src_eid, sender: sender.clone(), receiver: receiver.clone(), nonce, payload_hash: None },
|
|
97
144
|
);
|
|
98
145
|
|
|
99
|
-
// Verify payload hash was set to nil hash
|
|
100
|
-
let nilified_hash =
|
|
101
|
-
|
|
102
|
-
});
|
|
103
|
-
let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
|
|
146
|
+
// Verify payload hash was set to nil hash.
|
|
147
|
+
let nilified_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
|
|
148
|
+
let expected_nil_hash = nil_hash(&context);
|
|
104
149
|
assert_eq!(nilified_hash, Some(expected_nil_hash));
|
|
105
150
|
}
|
|
106
151
|
|
|
152
|
+
// Nilify with None counts as "verified" for inbound_nonce (but does not change lazy nonce)
|
|
153
|
+
#[test]
|
|
154
|
+
fn test_nilify_with_none_advances_inbound_nonce_without_changing_lazy_nonce() {
|
|
155
|
+
let context = setup();
|
|
156
|
+
let env = &context.env;
|
|
157
|
+
let endpoint_client = &context.endpoint_client;
|
|
158
|
+
|
|
159
|
+
let receiver = Address::generate(env);
|
|
160
|
+
let src_eid = 2;
|
|
161
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
162
|
+
|
|
163
|
+
// Initial state.
|
|
164
|
+
assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 0);
|
|
165
|
+
assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 0);
|
|
166
|
+
|
|
167
|
+
// Nilify nonce 1 with None (non-verified nonce).
|
|
168
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, 1, &None);
|
|
169
|
+
|
|
170
|
+
// Nilify writes a payload hash, so inbound_nonce can now advance to 1.
|
|
171
|
+
assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 1);
|
|
172
|
+
|
|
173
|
+
// But nilify does not update lazy_inbound_nonce.
|
|
174
|
+
assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 0);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// Nilify is allowed when nonce <= lazy nonce if a payload hash exists
|
|
178
|
+
#[test]
|
|
179
|
+
fn test_nilify_allows_when_nonce_is_checkpointed_if_payload_exists() {
|
|
180
|
+
let context = setup();
|
|
181
|
+
let env = &context.env;
|
|
182
|
+
let endpoint_client = &context.endpoint_client;
|
|
183
|
+
|
|
184
|
+
let receiver = Address::generate(env);
|
|
185
|
+
let src_eid = 2;
|
|
186
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
187
|
+
let nonce = 5u64;
|
|
188
|
+
let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
|
|
189
|
+
|
|
190
|
+
// Checkpoint past the target nonce.
|
|
191
|
+
env.as_contract(&endpoint_client.address, || {
|
|
192
|
+
storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &10)
|
|
193
|
+
});
|
|
194
|
+
assert_eq!(endpoint_client.lazy_inbound_nonce(&receiver, &src_eid, &sender), 10);
|
|
195
|
+
|
|
196
|
+
// Store a verified payload hash at nonce 5.
|
|
197
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
|
|
198
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash.clone()));
|
|
199
|
+
|
|
200
|
+
// Even though nonce <= lazy_nonce, this should succeed because a payload hash exists.
|
|
201
|
+
let payload_hash_opt = Some(payload_hash.clone());
|
|
202
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
|
|
203
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(nil_hash(&context)));
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Nilify is idempotent if the caller passes the current stored payload hash (including nil hash)
|
|
207
|
+
#[test]
|
|
208
|
+
fn test_nilify_allows_repeated_call_when_already_nilified() {
|
|
209
|
+
let context = setup();
|
|
210
|
+
let env = &context.env;
|
|
211
|
+
let endpoint_client = &context.endpoint_client;
|
|
212
|
+
|
|
213
|
+
let receiver = Address::generate(env);
|
|
214
|
+
let src_eid = 2;
|
|
215
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
216
|
+
let nonce = 1u64;
|
|
217
|
+
let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
|
|
218
|
+
|
|
219
|
+
// First nilify: verified payload hash -> nil hash.
|
|
220
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
|
|
221
|
+
let payload_hash_opt = Some(payload_hash);
|
|
222
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
|
|
223
|
+
|
|
224
|
+
let nil = nil_hash(&context);
|
|
225
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(nil.clone()));
|
|
226
|
+
|
|
227
|
+
// Second nilify: passing the current stored nil hash should succeed.
|
|
228
|
+
let nil_opt = Some(nil.clone());
|
|
229
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &nil_opt);
|
|
230
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(nil));
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Delegate authorization (delegate(receiver) is allowed)
|
|
107
234
|
#[test]
|
|
108
235
|
fn test_nilify_with_delegate() {
|
|
109
|
-
let
|
|
110
|
-
let env = &
|
|
111
|
-
let endpoint_client = &
|
|
236
|
+
let context = setup();
|
|
237
|
+
let env = &context.env;
|
|
238
|
+
let endpoint_client = &context.endpoint_client;
|
|
112
239
|
|
|
113
240
|
let receiver = Address::generate(env);
|
|
114
241
|
let delegate = Address::generate(env);
|
|
@@ -117,28 +244,17 @@ fn test_nilify_with_delegate() {
|
|
|
117
244
|
let nonce = 1;
|
|
118
245
|
let payload_hash = BytesN::from_array(env, &[0xcdu8; 32]);
|
|
119
246
|
|
|
120
|
-
// Set delegate for receiver
|
|
247
|
+
// Set delegate for receiver.
|
|
121
248
|
env.as_contract(&endpoint_client.address, || storage::EndpointStorage::set_delegate(env, &receiver, &delegate));
|
|
122
249
|
|
|
123
|
-
// Store a payload hash first
|
|
124
|
-
|
|
125
|
-
EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce, &payload_hash)
|
|
126
|
-
});
|
|
250
|
+
// Store a payload hash first.
|
|
251
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
|
|
127
252
|
|
|
128
|
-
// Delegate can nilify on behalf of receiver
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
contract: &endpoint_client.address,
|
|
134
|
-
fn_name: "nilify",
|
|
135
|
-
args: (&delegate, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone())).into_val(env),
|
|
136
|
-
sub_invokes: &[],
|
|
137
|
-
},
|
|
138
|
-
}])
|
|
139
|
-
.nilify(&delegate, &receiver, &src_eid, &sender, &nonce, &Some(payload_hash.clone()));
|
|
140
|
-
|
|
141
|
-
// Verify PacketNilified event was emitted
|
|
253
|
+
// Delegate can nilify on behalf of receiver.
|
|
254
|
+
let payload_hash_opt = Some(payload_hash.clone());
|
|
255
|
+
nilify_with_auth(&context, &delegate, &receiver, src_eid, &sender, nonce, &payload_hash_opt);
|
|
256
|
+
|
|
257
|
+
// Verify PacketNilified event was emitted.
|
|
142
258
|
assert_event(
|
|
143
259
|
env,
|
|
144
260
|
&endpoint_client.address,
|
|
@@ -151,19 +267,18 @@ fn test_nilify_with_delegate() {
|
|
|
151
267
|
},
|
|
152
268
|
);
|
|
153
269
|
|
|
154
|
-
// Verify payload hash was replaced with nil hash
|
|
155
|
-
let nilified_hash =
|
|
156
|
-
|
|
157
|
-
});
|
|
158
|
-
let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
|
|
270
|
+
// Verify payload hash was replaced with nil hash.
|
|
271
|
+
let nilified_hash = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce);
|
|
272
|
+
let expected_nil_hash = nil_hash(&context);
|
|
159
273
|
assert_eq!(nilified_hash, Some(expected_nil_hash));
|
|
160
274
|
}
|
|
161
275
|
|
|
276
|
+
// Nilify affects only the targeted nonce (multiple nonces stay independent)
|
|
162
277
|
#[test]
|
|
163
278
|
fn test_nilify_multiple_payloads() {
|
|
164
|
-
let
|
|
165
|
-
let env = &
|
|
166
|
-
let endpoint_client = &
|
|
279
|
+
let context = setup();
|
|
280
|
+
let env = &context.env;
|
|
281
|
+
let endpoint_client = &context.endpoint_client;
|
|
167
282
|
|
|
168
283
|
let receiver = Address::generate(env);
|
|
169
284
|
let src_eid = 2;
|
|
@@ -173,59 +288,34 @@ fn test_nilify_multiple_payloads() {
|
|
|
173
288
|
let nonce1 = 1;
|
|
174
289
|
let nonce2 = 2;
|
|
175
290
|
|
|
176
|
-
// Store multiple payload hashes
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
});
|
|
180
|
-
env.as_contract(&endpoint_client.address, || {
|
|
181
|
-
EndpointV2::inbound(env, &receiver, src_eid, &sender, nonce2, &payload_hash2)
|
|
182
|
-
});
|
|
291
|
+
// Store multiple payload hashes.
|
|
292
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce1, &payload_hash1);
|
|
293
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce2, &payload_hash2);
|
|
183
294
|
|
|
184
|
-
// Nilify first payload
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
// Nilify second payload
|
|
198
|
-
endpoint_client
|
|
199
|
-
.mock_auths(&[soroban_sdk::testutils::MockAuth {
|
|
200
|
-
address: &receiver,
|
|
201
|
-
invoke: &soroban_sdk::testutils::MockAuthInvoke {
|
|
202
|
-
contract: &endpoint_client.address,
|
|
203
|
-
fn_name: "nilify",
|
|
204
|
-
args: (&receiver, &receiver, &src_eid, &sender, &nonce2, &Some(payload_hash2.clone())).into_val(env),
|
|
205
|
-
sub_invokes: &[],
|
|
206
|
-
},
|
|
207
|
-
}])
|
|
208
|
-
.nilify(&receiver, &receiver, &src_eid, &sender, &nonce2, &Some(payload_hash2.clone()));
|
|
209
|
-
|
|
210
|
-
// Verify both payload hashes were replaced with nil hash
|
|
211
|
-
let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
|
|
212
|
-
|
|
213
|
-
let nilified_hash1 = env.as_contract(&endpoint_client.address, || {
|
|
214
|
-
storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce1)
|
|
215
|
-
});
|
|
216
|
-
let nilified_hash2 = env.as_contract(&endpoint_client.address, || {
|
|
217
|
-
storage::EndpointStorage::inbound_payload_hash(env, &receiver, src_eid, &sender, nonce2)
|
|
218
|
-
});
|
|
295
|
+
// Nilify first payload.
|
|
296
|
+
let payload_hash1_opt = Some(payload_hash1.clone());
|
|
297
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce1, &payload_hash1_opt);
|
|
298
|
+
|
|
299
|
+
// Nilify second payload.
|
|
300
|
+
let payload_hash2_opt = Some(payload_hash2.clone());
|
|
301
|
+
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce2, &payload_hash2_opt);
|
|
302
|
+
|
|
303
|
+
// Verify both payload hashes were replaced with nil hash.
|
|
304
|
+
let expected_nil_hash = nil_hash(&context);
|
|
305
|
+
|
|
306
|
+
let nilified_hash1 = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce1);
|
|
307
|
+
let nilified_hash2 = endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce2);
|
|
219
308
|
|
|
220
309
|
assert_eq!(nilified_hash1, Some(expected_nil_hash.clone()));
|
|
221
310
|
assert_eq!(nilified_hash2, Some(expected_nil_hash));
|
|
222
311
|
}
|
|
223
312
|
|
|
313
|
+
// Path isolation (receiver/src_eid/sender are isolated)
|
|
224
314
|
#[test]
|
|
225
315
|
fn test_nilify_different_paths() {
|
|
226
|
-
let
|
|
227
|
-
let env = &
|
|
228
|
-
let endpoint_client = &
|
|
316
|
+
let context = setup();
|
|
317
|
+
let env = &context.env;
|
|
318
|
+
let endpoint_client = &context.endpoint_client;
|
|
229
319
|
|
|
230
320
|
let receiver1 = Address::generate(env);
|
|
231
321
|
let receiver2 = Address::generate(env);
|
|
@@ -236,89 +326,115 @@ fn test_nilify_different_paths() {
|
|
|
236
326
|
let nonce = 1;
|
|
237
327
|
let payload_hash = BytesN::from_array(env, &[0xefu8; 32]);
|
|
238
328
|
|
|
239
|
-
// Store payload hashes for different paths
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
EndpointV2::inbound(env, &receiver2, src_eid1, &sender1, nonce, &payload_hash)
|
|
245
|
-
});
|
|
246
|
-
env.as_contract(&endpoint_client.address, || {
|
|
247
|
-
EndpointV2::inbound(env, &receiver1, src_eid2, &sender1, nonce, &payload_hash)
|
|
248
|
-
});
|
|
249
|
-
env.as_contract(&endpoint_client.address, || {
|
|
250
|
-
EndpointV2::inbound(env, &receiver1, src_eid1, &sender2, nonce, &payload_hash)
|
|
251
|
-
});
|
|
329
|
+
// Store payload hashes for different paths.
|
|
330
|
+
context.inbound_as_verified(&receiver1, src_eid1, &sender1, nonce, &payload_hash);
|
|
331
|
+
context.inbound_as_verified(&receiver2, src_eid1, &sender1, nonce, &payload_hash);
|
|
332
|
+
context.inbound_as_verified(&receiver1, src_eid2, &sender1, nonce, &payload_hash);
|
|
333
|
+
context.inbound_as_verified(&receiver1, src_eid1, &sender2, nonce, &payload_hash);
|
|
252
334
|
|
|
253
|
-
// Nilify for different receivers
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
args: (&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
|
|
273
|
-
sub_invokes: &[],
|
|
274
|
-
},
|
|
275
|
-
}])
|
|
276
|
-
.nilify(&receiver2, &receiver2, &src_eid1, &sender1, &nonce, &Some(payload_hash.clone()));
|
|
277
|
-
|
|
278
|
-
// Nilify for different src_eids
|
|
279
|
-
endpoint_client
|
|
280
|
-
.mock_auths(&[soroban_sdk::testutils::MockAuth {
|
|
281
|
-
address: &receiver1,
|
|
282
|
-
invoke: &soroban_sdk::testutils::MockAuthInvoke {
|
|
283
|
-
contract: &endpoint_client.address,
|
|
284
|
-
fn_name: "nilify",
|
|
285
|
-
args: (&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &Some(payload_hash.clone())).into_val(env),
|
|
286
|
-
sub_invokes: &[],
|
|
287
|
-
},
|
|
288
|
-
}])
|
|
289
|
-
.nilify(&receiver1, &receiver1, &src_eid2, &sender1, &nonce, &Some(payload_hash.clone()));
|
|
290
|
-
|
|
291
|
-
// Nilify for different senders
|
|
292
|
-
endpoint_client
|
|
293
|
-
.mock_auths(&[soroban_sdk::testutils::MockAuth {
|
|
294
|
-
address: &receiver1,
|
|
295
|
-
invoke: &soroban_sdk::testutils::MockAuthInvoke {
|
|
296
|
-
contract: &endpoint_client.address,
|
|
297
|
-
fn_name: "nilify",
|
|
298
|
-
args: (&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &Some(payload_hash.clone())).into_val(env),
|
|
299
|
-
sub_invokes: &[],
|
|
300
|
-
},
|
|
301
|
-
}])
|
|
302
|
-
.nilify(&receiver1, &receiver1, &src_eid1, &sender2, &nonce, &Some(payload_hash.clone()));
|
|
303
|
-
|
|
304
|
-
// Verify all paths have been nilified independently
|
|
305
|
-
let expected_nil_hash = env.as_contract(&endpoint_client.address, || EndpointV2::nil_payload_hash(env));
|
|
306
|
-
|
|
307
|
-
let nilified_hash1 = env.as_contract(&endpoint_client.address, || {
|
|
308
|
-
storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender1, nonce)
|
|
309
|
-
});
|
|
310
|
-
let nilified_hash2 = env.as_contract(&endpoint_client.address, || {
|
|
311
|
-
storage::EndpointStorage::inbound_payload_hash(env, &receiver2, src_eid1, &sender1, nonce)
|
|
312
|
-
});
|
|
313
|
-
let nilified_hash3 = env.as_contract(&endpoint_client.address, || {
|
|
314
|
-
storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid2, &sender1, nonce)
|
|
315
|
-
});
|
|
316
|
-
let nilified_hash4 = env.as_contract(&endpoint_client.address, || {
|
|
317
|
-
storage::EndpointStorage::inbound_payload_hash(env, &receiver1, src_eid1, &sender2, nonce)
|
|
318
|
-
});
|
|
335
|
+
// Nilify for different receivers.
|
|
336
|
+
let payload_hash_opt = Some(payload_hash.clone());
|
|
337
|
+
nilify_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender1, nonce, &payload_hash_opt);
|
|
338
|
+
|
|
339
|
+
nilify_with_auth(&context, &receiver2, &receiver2, src_eid1, &sender1, nonce, &payload_hash_opt);
|
|
340
|
+
|
|
341
|
+
// Nilify for different src_eids.
|
|
342
|
+
nilify_with_auth(&context, &receiver1, &receiver1, src_eid2, &sender1, nonce, &payload_hash_opt);
|
|
343
|
+
|
|
344
|
+
// Nilify for different senders.
|
|
345
|
+
nilify_with_auth(&context, &receiver1, &receiver1, src_eid1, &sender2, nonce, &payload_hash_opt);
|
|
346
|
+
|
|
347
|
+
// Verify all paths have been nilified independently.
|
|
348
|
+
let expected_nil_hash = nil_hash(&context);
|
|
349
|
+
|
|
350
|
+
let nilified_hash1 = endpoint_client.inbound_payload_hash(&receiver1, &src_eid1, &sender1, &nonce);
|
|
351
|
+
let nilified_hash2 = endpoint_client.inbound_payload_hash(&receiver2, &src_eid1, &sender1, &nonce);
|
|
352
|
+
let nilified_hash3 = endpoint_client.inbound_payload_hash(&receiver1, &src_eid2, &sender1, &nonce);
|
|
353
|
+
let nilified_hash4 = endpoint_client.inbound_payload_hash(&receiver1, &src_eid1, &sender2, &nonce);
|
|
319
354
|
|
|
320
355
|
assert_eq!(nilified_hash1, Some(expected_nil_hash.clone()));
|
|
321
356
|
assert_eq!(nilified_hash2, Some(expected_nil_hash.clone()));
|
|
322
357
|
assert_eq!(nilified_hash3, Some(expected_nil_hash.clone()));
|
|
323
358
|
assert_eq!(nilified_hash4, Some(expected_nil_hash));
|
|
324
359
|
}
|
|
360
|
+
|
|
361
|
+
// Failure if payload_hash does not match the stored value
|
|
362
|
+
#[test]
|
|
363
|
+
fn test_nilify_payload_hash_not_found_when_mismatch() {
|
|
364
|
+
let context = setup();
|
|
365
|
+
let env = &context.env;
|
|
366
|
+
|
|
367
|
+
let receiver = Address::generate(env);
|
|
368
|
+
let src_eid = 2;
|
|
369
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
370
|
+
let nonce = 1u64;
|
|
371
|
+
let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
|
|
372
|
+
let wrong_payload_hash = BytesN::from_array(env, &[0x11u8; 32]);
|
|
373
|
+
|
|
374
|
+
// Store a payload hash first.
|
|
375
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
|
|
376
|
+
|
|
377
|
+
// Attempt nilify with wrong expected hash.
|
|
378
|
+
let wrong_payload_hash_opt = Some(wrong_payload_hash.clone());
|
|
379
|
+
let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &wrong_payload_hash_opt);
|
|
380
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
#[test]
|
|
384
|
+
fn test_nilify_payload_hash_not_found_when_expected_some_but_storage_none() {
|
|
385
|
+
let context = setup();
|
|
386
|
+
let env = &context.env;
|
|
387
|
+
|
|
388
|
+
let receiver = Address::generate(env);
|
|
389
|
+
let src_eid = 2;
|
|
390
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
391
|
+
let nonce = 1u64;
|
|
392
|
+
let expected_hash = BytesN::from_array(env, &[0xabu8; 32]);
|
|
393
|
+
|
|
394
|
+
// Storage has no payload hash for (receiver, src_eid, sender, nonce).
|
|
395
|
+
let expected_hash_opt = Some(expected_hash);
|
|
396
|
+
let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &expected_hash_opt);
|
|
397
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
#[test]
|
|
401
|
+
fn test_nilify_payload_hash_not_found_when_none_but_payload_exists() {
|
|
402
|
+
let context = setup();
|
|
403
|
+
let env = &context.env;
|
|
404
|
+
let endpoint_client = &context.endpoint_client;
|
|
405
|
+
|
|
406
|
+
let receiver = Address::generate(env);
|
|
407
|
+
let src_eid = 2;
|
|
408
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
409
|
+
let nonce = 1u64;
|
|
410
|
+
let payload_hash = BytesN::from_array(env, &[0xabu8; 32]);
|
|
411
|
+
|
|
412
|
+
// Store a payload hash first.
|
|
413
|
+
context.inbound_as_verified(&receiver, src_eid, &sender, nonce, &payload_hash);
|
|
414
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &nonce), Some(payload_hash));
|
|
415
|
+
|
|
416
|
+
// Calling nilify with None should fail, because payload_hash must match the stored value.
|
|
417
|
+
let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &None);
|
|
418
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::PayloadHashNotFound.into());
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
// Failure when nonce is already checkpointed and there is no stored payload hash
|
|
422
|
+
#[test]
|
|
423
|
+
fn test_nilify_invalid_nonce_when_already_checkpointed_without_payload() {
|
|
424
|
+
let context = setup();
|
|
425
|
+
let env = &context.env;
|
|
426
|
+
let endpoint_client = &context.endpoint_client;
|
|
427
|
+
|
|
428
|
+
let receiver = Address::generate(env);
|
|
429
|
+
let src_eid = 2;
|
|
430
|
+
let sender = BytesN::from_array(env, &[1u8; 32]);
|
|
431
|
+
let nonce = 1u64;
|
|
432
|
+
|
|
433
|
+
// Set lazy nonce to 1 and ensure there is NO payload for nonce 1.
|
|
434
|
+
env.as_contract(&endpoint_client.address, || {
|
|
435
|
+
storage::EndpointStorage::set_lazy_inbound_nonce(env, &receiver, src_eid, &sender, &1)
|
|
436
|
+
});
|
|
437
|
+
|
|
438
|
+
let result = try_nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, nonce, &None);
|
|
439
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), EndpointError::InvalidNonce.into());
|
|
440
|
+
}
|