@layerzerolabs/protocol-stellar-v2 0.2.8
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 +727 -0
- package/.turbo/turbo-lint.log +158 -0
- package/.turbo/turbo-test.log +796 -0
- package/Cargo.lock +2237 -0
- package/Cargo.toml +63 -0
- package/clippy.toml +7 -0
- package/contracts/common-macros/Cargo.toml +20 -0
- package/contracts/common-macros/src/error.rs +53 -0
- package/contracts/common-macros/src/event.rs +16 -0
- package/contracts/common-macros/src/lib.rs +255 -0
- package/contracts/common-macros/src/ownable.rs +63 -0
- package/contracts/common-macros/src/snapshots/common_macros__tests__tests__snapshot_generated_storage_code.snap +310 -0
- package/contracts/common-macros/src/storage.rs +439 -0
- package/contracts/common-macros/src/tests.rs +287 -0
- package/contracts/common-macros/src/ttl_configurable.rs +60 -0
- package/contracts/endpoint-v2/ARCHITECTURE.md +233 -0
- package/contracts/endpoint-v2/Cargo.toml +30 -0
- package/contracts/endpoint-v2/src/constants.rs +52 -0
- package/contracts/endpoint-v2/src/endpoint_v2.rs +305 -0
- package/contracts/endpoint-v2/src/errors.rs +29 -0
- package/contracts/endpoint-v2/src/events.rs +207 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_composer.rs +26 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_endpoint_v2.rs +170 -0
- package/contracts/endpoint-v2/src/interfaces/layerzero_receiver.rs +43 -0
- package/contracts/endpoint-v2/src/interfaces/message_lib.rs +62 -0
- package/contracts/endpoint-v2/src/interfaces/message_lib_manager.rs +220 -0
- package/contracts/endpoint-v2/src/interfaces/messaging_channel.rs +121 -0
- package/contracts/endpoint-v2/src/interfaces/messaging_composer.rs +63 -0
- package/contracts/endpoint-v2/src/interfaces/mod.rs +17 -0
- package/contracts/endpoint-v2/src/interfaces/send_lib.rs +70 -0
- package/contracts/endpoint-v2/src/lib.rs +22 -0
- package/contracts/endpoint-v2/src/message_lib_manager.rs +315 -0
- package/contracts/endpoint-v2/src/messaging_channel.rs +218 -0
- package/contracts/endpoint-v2/src/messaging_composer.rs +76 -0
- package/contracts/endpoint-v2/src/storage.rs +78 -0
- package/contracts/endpoint-v2/src/tests/endpoint_setup.rs +131 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/clear.rs +237 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/delegate.rs +42 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/initializable.rs +76 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/lz_receive_alert.rs +211 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/mod.rs +18 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/native_token.rs +10 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/owner.rs +10 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +424 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/quote.rs +144 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/recover_token.rs +72 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/require_oapp_auth.rs +29 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/send.rs +513 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_delegate.rs +43 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/set_zro.rs +27 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/transfer_ownership.rs +30 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +202 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +59 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/verify.rs +172 -0
- package/contracts/endpoint-v2/src/tests/endpoint_v2/zro.rs +23 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/mod.rs +10 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/register_library.rs +131 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_registered.rs +35 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +28 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_config.rs +79 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_lib_timeout.rs +246 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_receive_library.rs +285 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_default_send_library.rs +180 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library.rs +405 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_receive_library_timeout.rs +80 -0
- package/contracts/endpoint-v2/src/tests/message_lib_manager/set_send_library.rs +131 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/burn.rs +358 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/clear.rs +316 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_nonce.rs +288 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/inbound_payload_hash.rs +316 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/internal.rs +388 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/lazy_inbound_nonce.rs +307 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/mod.rs +10 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/next_guid.rs +239 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/nilify.rs +324 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/outbound_nonce.rs +242 -0
- package/contracts/endpoint-v2/src/tests/messaging_channel/skip.rs +232 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/clear_compose.rs +212 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/compose_queue.rs +213 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +269 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/mod.rs +4 -0
- package/contracts/endpoint-v2/src/tests/messaging_composer/send_compose.rs +173 -0
- package/contracts/endpoint-v2/src/tests/mock.rs +132 -0
- package/contracts/endpoint-v2/src/tests/mod.rs +12 -0
- package/contracts/endpoint-v2/src/tests/util/build_payload.rs +126 -0
- package/contracts/endpoint-v2/src/tests/util/compute_guid.rs +82 -0
- package/contracts/endpoint-v2/src/tests/util/keccak256.rs +115 -0
- package/contracts/endpoint-v2/src/tests/util/mod.rs +3 -0
- package/contracts/endpoint-v2/src/util.rs +52 -0
- package/contracts/message-libs/Cargo.toml +12 -0
- package/contracts/message-libs/block-message-lib/Cargo.toml +19 -0
- package/contracts/message-libs/block-message-lib/src/lib.rs +70 -0
- package/contracts/message-libs/lib.rs +2 -0
- package/contracts/message-libs/message-lib-common/Cargo.toml +24 -0
- package/contracts/message-libs/message-lib-common/src/errors.rs +20 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/dvn.rs +55 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/executor.rs +46 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/mod.rs +7 -0
- package/contracts/message-libs/message-lib-common/src/interfaces/treasury.rs +17 -0
- package/contracts/message-libs/message-lib-common/src/lib.rs +14 -0
- package/contracts/message-libs/message-lib-common/src/packet_codec_v1.rs +99 -0
- package/contracts/message-libs/message-lib-common/src/testing_utils.rs +27 -0
- package/contracts/message-libs/message-lib-common/src/tests/mod.rs +2 -0
- package/contracts/message-libs/message-lib-common/src/tests/packet_codec_v1.rs +162 -0
- package/contracts/message-libs/message-lib-common/src/tests/worker_options.rs +319 -0
- package/contracts/message-libs/message-lib-common/src/worker_options.rs +190 -0
- package/contracts/message-libs/simple-message-lib/Cargo.toml +26 -0
- package/contracts/message-libs/simple-message-lib/src/errors.rs +11 -0
- package/contracts/message-libs/simple-message-lib/src/lib.rs +14 -0
- package/contracts/message-libs/simple-message-lib/src/simple_message_lib.rs +136 -0
- package/contracts/message-libs/simple-message-lib/src/storage.rs +27 -0
- package/contracts/message-libs/simple-message-lib/src/test.rs +280 -0
- package/contracts/message-libs/treasury/Cargo.toml +27 -0
- package/contracts/message-libs/treasury/src/errors.rs +10 -0
- package/contracts/message-libs/treasury/src/events.rs +28 -0
- package/contracts/message-libs/treasury/src/interfaces/mod.rs +3 -0
- package/contracts/message-libs/treasury/src/interfaces/zro_fee_lib.rs +20 -0
- package/contracts/message-libs/treasury/src/lib.rs +20 -0
- package/contracts/message-libs/treasury/src/storage.rs +18 -0
- package/contracts/message-libs/treasury/src/tests/mod.rs +2 -0
- package/contracts/message-libs/treasury/src/tests/setup.rs +112 -0
- package/contracts/message-libs/treasury/src/tests/treasury_tests.rs +562 -0
- package/contracts/message-libs/treasury/src/treasury.rs +140 -0
- package/contracts/message-libs/uln-302/Cargo.toml +28 -0
- package/contracts/message-libs/uln-302/src/config_validation.rs +173 -0
- package/contracts/message-libs/uln-302/src/errors.rs +29 -0
- package/contracts/message-libs/uln-302/src/events.rs +72 -0
- package/contracts/message-libs/uln-302/src/interfaces/mod.rs +5 -0
- package/contracts/message-libs/uln-302/src/interfaces/receive.rs +82 -0
- package/contracts/message-libs/uln-302/src/interfaces/send.rs +159 -0
- package/contracts/message-libs/uln-302/src/lib.rs +20 -0
- package/contracts/message-libs/uln-302/src/receive.rs +199 -0
- package/contracts/message-libs/uln-302/src/send.rs +349 -0
- package/contracts/message-libs/uln-302/src/storage.rs +47 -0
- package/contracts/message-libs/uln-302/src/tests/config/mod.rs +2 -0
- package/contracts/message-libs/uln-302/src/tests/config/oapp_uln_config.rs +291 -0
- package/contracts/message-libs/uln-302/src/tests/config/uln_config.rs +163 -0
- package/contracts/message-libs/uln-302/src/tests/mod.rs +7 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/commit_verification.rs +183 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/confirmations.rs +128 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/effective_receive_uln_config.rs +104 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/mod.rs +66 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/set_default_receive_uln_configs.rs +79 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verifiable.rs +463 -0
- package/contracts/message-libs/uln-302/src/tests/receive_uln302/verify.rs +173 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_executor_config.rs +132 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/effective_send_uln_config.rs +117 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/mod.rs +6 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/quote.rs +586 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +834 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_executor_configs.rs +95 -0
- package/contracts/message-libs/uln-302/src/tests/send_uln302/set_default_send_uln_configs.rs +80 -0
- package/contracts/message-libs/uln-302/src/tests/setup.rs +268 -0
- package/contracts/message-libs/uln-302/src/tests/testing_utils.rs +47 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +51 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_app_send_uln_config.rs +51 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/get_oapp_executor_config.rs +48 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/mod.rs +4 -0
- package/contracts/message-libs/uln-302/src/tests/uln302/set_config.rs +998 -0
- package/contracts/message-libs/uln-302/src/uln302.rs +117 -0
- package/contracts/oapp-macros/Cargo.toml +21 -0
- package/contracts/oapp-macros/src/lib.rs +408 -0
- package/contracts/oapp-macros/src/oapp_core.rs +49 -0
- package/contracts/oapp-macros/src/oapp_full.rs +15 -0
- package/contracts/oapp-macros/src/oapp_options_type3.rs +46 -0
- package/contracts/oapp-macros/src/oapp_receiver.rs +67 -0
- package/contracts/oapp-macros/src/oapp_sender.rs +23 -0
- package/contracts/oapp-macros/src/util.rs +103 -0
- package/contracts/oapp-macros/tests/test_macros.rs +522 -0
- package/contracts/oapps/Cargo.toml +12 -0
- package/contracts/oapps/counter/Cargo.toml +24 -0
- package/contracts/oapps/counter/integration_tests/mod.rs +3 -0
- package/contracts/oapps/counter/integration_tests/setup.rs +201 -0
- package/contracts/oapps/counter/integration_tests/test_with_sml.rs +166 -0
- package/contracts/oapps/counter/integration_tests/utils.rs +144 -0
- package/contracts/oapps/counter/src/codec.rs +63 -0
- package/contracts/oapps/counter/src/counter.rs +235 -0
- package/contracts/oapps/counter/src/errors.rs +9 -0
- package/contracts/oapps/counter/src/lib.rs +16 -0
- package/contracts/oapps/counter/src/options.rs +30 -0
- package/contracts/oapps/counter/src/storage.rs +33 -0
- package/contracts/oapps/counter/src/tests/mod.rs +37 -0
- package/contracts/oapps/counter/src/tests/test_codec.rs +64 -0
- package/contracts/oapps/counter/src/tests/test_counter.rs +390 -0
- package/contracts/oapps/counter/src/u256_ext.rs +21 -0
- package/contracts/oapps/lib.rs +2 -0
- package/contracts/oapps/oapp/Cargo.toml +21 -0
- package/contracts/oapps/oapp/src/errors.rs +9 -0
- package/contracts/oapps/oapp/src/lib.rs +10 -0
- package/contracts/oapps/oapp/src/oapp_core.rs +92 -0
- package/contracts/oapps/oapp/src/oapp_options_type3.rs +89 -0
- package/contracts/oapps/oapp/src/oapp_receiver.rs +72 -0
- package/contracts/oapps/oapp/src/oapp_sender.rs +66 -0
- package/contracts/oapps/oapp/src/tests/mod.rs +4 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +162 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +180 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +157 -0
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +283 -0
- package/contracts/utils/Cargo.toml +21 -0
- package/contracts/utils/src/buffer_reader.rs +143 -0
- package/contracts/utils/src/buffer_writer.rs +117 -0
- package/contracts/utils/src/bytes_ext.rs +19 -0
- package/contracts/utils/src/errors.rs +30 -0
- package/contracts/utils/src/lib.rs +15 -0
- package/contracts/utils/src/option_ext.rs +38 -0
- package/contracts/utils/src/ownable.rs +88 -0
- package/contracts/utils/src/testing_utils.rs +100 -0
- package/contracts/utils/src/tests/buffer_reader.rs +1006 -0
- package/contracts/utils/src/tests/buffer_writer.rs +330 -0
- package/contracts/utils/src/tests/bytes_ext.rs +77 -0
- package/contracts/utils/src/tests/mod.rs +4 -0
- package/contracts/utils/src/tests/ownable.rs +149 -0
- package/contracts/utils/src/ttl.rs +164 -0
- package/contracts/workers/Cargo.toml +13 -0
- package/contracts/workers/executor/Cargo.toml +26 -0
- package/contracts/workers/executor/src/events.rs +22 -0
- package/contracts/workers/executor/src/executor.rs +347 -0
- package/contracts/workers/executor/src/interfaces/executor.rs +40 -0
- package/contracts/workers/executor/src/interfaces/mod.rs +5 -0
- package/contracts/workers/executor/src/interfaces/types.rs +51 -0
- package/contracts/workers/executor/src/lib.rs +10 -0
- package/contracts/workers/executor/src/storage.rs +23 -0
- package/contracts/workers/lib.rs +2 -0
- package/contracts/workers/worker-common/Cargo.toml +18 -0
- package/contracts/workers/worker-common/src/constants.rs +17 -0
- package/contracts/workers/worker-common/src/errors.rs +6 -0
- package/contracts/workers/worker-common/src/events.rs +34 -0
- package/contracts/workers/worker-common/src/interfaces/executor_fee_lib.rs +35 -0
- package/contracts/workers/worker-common/src/interfaces/mod.rs +7 -0
- package/contracts/workers/worker-common/src/interfaces/price_feed.rs +40 -0
- package/contracts/workers/worker-common/src/interfaces/worker.rs +60 -0
- package/contracts/workers/worker-common/src/lib.rs +19 -0
- package/contracts/workers/worker-common/src/storage.rs +32 -0
- package/contracts/workers/worker-common/src/worker_common.rs +166 -0
- package/package.json +25 -0
- package/rust-toolchain.toml +4 -0
- package/rustfmt.toml +17 -0
- package/sdk/.turbo/turbo-build.log +4 -0
- package/sdk/dist/generated/bml.d.ts +452 -0
- package/sdk/dist/generated/bml.js +72 -0
- package/sdk/dist/generated/counter.d.ts +824 -0
- package/sdk/dist/generated/counter.js +125 -0
- package/sdk/dist/generated/endpoint.d.ts +1676 -0
- package/sdk/dist/generated/endpoint.js +216 -0
- package/sdk/dist/generated/sml.d.ts +810 -0
- package/sdk/dist/generated/sml.js +132 -0
- package/sdk/dist/generated/uln302.d.ts +1227 -0
- package/sdk/dist/generated/uln302.js +185 -0
- package/sdk/dist/index.d.ts +5 -0
- package/sdk/dist/index.js +5 -0
- package/sdk/node_modules/.bin/tsc +21 -0
- package/sdk/node_modules/.bin/tsserver +21 -0
- package/sdk/node_modules/.bin/vitest +21 -0
- package/sdk/node_modules/.bin/zx +21 -0
- package/sdk/package.json +40 -0
- package/sdk/src/index.ts +5 -0
- package/sdk/test/index.test.ts +271 -0
- package/sdk/test/suites/constants.ts +13 -0
- package/sdk/test/suites/deploy.ts +277 -0
- package/sdk/test/suites/localnet.ts +42 -0
- package/sdk/test/suites/scan.ts +189 -0
- package/sdk/tsconfig.json +106 -0
- package/tools/ts-bindings-gen/Cargo.toml +14 -0
- package/tools/ts-bindings-gen/src/main.rs +147 -0
- package/turbo.json +12 -0
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
use crate::{interfaces::MessagingFee, FeeRecipient, FeesAndPacket, MessageLibType, Origin, OutboundPacket};
|
|
2
|
+
use soroban_sdk::{contract, contractimpl, vec, Address, Bytes, Env, Symbol, Vec};
|
|
3
|
+
|
|
4
|
+
// ============================================================================
|
|
5
|
+
// Mock Receiver Contract for Testing
|
|
6
|
+
// ============================================================================
|
|
7
|
+
|
|
8
|
+
#[contract]
|
|
9
|
+
pub struct MockReceiver;
|
|
10
|
+
|
|
11
|
+
#[contractimpl]
|
|
12
|
+
impl MockReceiver {
|
|
13
|
+
pub fn allow_initialize_path(_env: soroban_sdk::Env, _origin: Origin) -> bool {
|
|
14
|
+
// Default mock implementation returns true
|
|
15
|
+
true
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
#[contract]
|
|
20
|
+
pub struct MockReceiverReject;
|
|
21
|
+
|
|
22
|
+
#[contractimpl]
|
|
23
|
+
impl MockReceiverReject {
|
|
24
|
+
pub fn allow_initialize_path(_env: soroban_sdk::Env, _origin: Origin) -> bool {
|
|
25
|
+
// Mock implementation that rejects initialization
|
|
26
|
+
false
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#[contract]
|
|
31
|
+
pub struct MockValidMessageLib;
|
|
32
|
+
|
|
33
|
+
#[contractimpl]
|
|
34
|
+
impl MockValidMessageLib {
|
|
35
|
+
pub fn message_lib_type(_env: &Env) -> MessageLibType {
|
|
36
|
+
MessageLibType::Send
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Configurable mock message library for testing
|
|
41
|
+
#[contract]
|
|
42
|
+
pub struct MockMessageLib;
|
|
43
|
+
|
|
44
|
+
#[contractimpl]
|
|
45
|
+
impl MockMessageLib {
|
|
46
|
+
pub fn setup(env: Env, lib_type: MessageLibType, supported_eids: Vec<u32>) {
|
|
47
|
+
env.storage().instance().set(&Symbol::new(&env, "lib_type"), &lib_type);
|
|
48
|
+
env.storage().instance().set(&Symbol::new(&env, "supported_eids"), &supported_eids);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
pub fn message_lib_type(env: Env) -> MessageLibType {
|
|
52
|
+
env.storage().instance().get(&Symbol::new(&env, "lib_type")).unwrap_or(MessageLibType::Send)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
pub fn is_supported_eid(env: Env, eid: u32) -> bool {
|
|
56
|
+
let supported_eids: Vec<u32> =
|
|
57
|
+
env.storage().instance().get(&Symbol::new(&env, "supported_eids")).unwrap_or(vec![&env]);
|
|
58
|
+
supported_eids.contains(eid)
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// Mock send library for testing send/quote operations
|
|
63
|
+
#[contract]
|
|
64
|
+
pub struct MockSendLib;
|
|
65
|
+
|
|
66
|
+
#[contractimpl]
|
|
67
|
+
impl MockSendLib {
|
|
68
|
+
pub fn setup(env: Env, supported_eids: Vec<u32>, native_fee: i128, zro_fee: i128, fee_recipient: Address) {
|
|
69
|
+
env.storage().instance().set(&Symbol::new(&env, "supported_eids"), &supported_eids);
|
|
70
|
+
env.storage().instance().set(&Symbol::new(&env, "native_fee"), &native_fee);
|
|
71
|
+
env.storage().instance().set(&Symbol::new(&env, "zro_fee"), &zro_fee);
|
|
72
|
+
env.storage().instance().set(&Symbol::new(&env, "fee_recipient"), &fee_recipient);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
pub fn message_lib_type(_env: Env) -> MessageLibType {
|
|
76
|
+
MessageLibType::Send
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
pub fn is_supported_eid(env: Env, eid: u32) -> bool {
|
|
80
|
+
let supported_eids: Vec<u32> =
|
|
81
|
+
env.storage().instance().get(&Symbol::new(&env, "supported_eids")).unwrap_or(vec![&env]);
|
|
82
|
+
supported_eids.contains(eid)
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
pub fn quote(env: Env, _packet: OutboundPacket, _options: Bytes, _pay_in_zro: bool) -> MessagingFee {
|
|
86
|
+
let native_fee = env.storage().instance().get(&Symbol::new(&env, "native_fee")).unwrap_or(100);
|
|
87
|
+
let zro_fee = env.storage().instance().get(&Symbol::new(&env, "zro_fee")).unwrap_or(0);
|
|
88
|
+
MessagingFee { native_fee, zro_fee }
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
pub fn send(env: Env, packet: OutboundPacket, _options: Bytes, _pay_in_zro: bool) -> FeesAndPacket {
|
|
92
|
+
let native_fee = env.storage().instance().get(&Symbol::new(&env, "native_fee")).unwrap_or(100);
|
|
93
|
+
let zro_fee = env.storage().instance().get(&Symbol::new(&env, "zro_fee")).unwrap_or(0);
|
|
94
|
+
let fee_recipient: Address = env.storage().instance().get(&Symbol::new(&env, "fee_recipient")).unwrap();
|
|
95
|
+
|
|
96
|
+
let mut native_fee_recipients = Vec::new(&env);
|
|
97
|
+
if native_fee > 0 {
|
|
98
|
+
native_fee_recipients.push_back(FeeRecipient { amount: native_fee, address: fee_recipient.clone() });
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
let mut zro_fee_recipients = Vec::new(&env);
|
|
102
|
+
if zro_fee > 0 {
|
|
103
|
+
zro_fee_recipients.push_back(FeeRecipient { amount: zro_fee, address: fee_recipient });
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// Create a simple encoded payload (just the message for simplicity)
|
|
107
|
+
let encoded_packet = packet.message.clone();
|
|
108
|
+
|
|
109
|
+
FeesAndPacket { native_fee_recipients, zro_fee_recipients, encoded_packet }
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Mock receive library for testing verify operations
|
|
114
|
+
#[contract]
|
|
115
|
+
pub struct MockReceiveLib;
|
|
116
|
+
|
|
117
|
+
#[contractimpl]
|
|
118
|
+
impl MockReceiveLib {
|
|
119
|
+
pub fn setup(env: Env, supported_eids: Vec<u32>) {
|
|
120
|
+
env.storage().instance().set(&Symbol::new(&env, "supported_eids"), &supported_eids);
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
pub fn message_lib_type(_env: Env) -> MessageLibType {
|
|
124
|
+
MessageLibType::Receive
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
pub fn is_supported_eid(env: Env, eid: u32) -> bool {
|
|
128
|
+
let supported_eids: Vec<u32> =
|
|
129
|
+
env.storage().instance().get(&Symbol::new(&env, "supported_eids")).unwrap_or(vec![&env]);
|
|
130
|
+
supported_eids.contains(eid)
|
|
131
|
+
}
|
|
132
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
use crate::{tests::endpoint_setup::setup, util::build_payload};
|
|
2
|
+
use soroban_sdk::{Bytes, BytesN};
|
|
3
|
+
|
|
4
|
+
#[test]
|
|
5
|
+
fn test_build_payload_basic() {
|
|
6
|
+
let context = setup();
|
|
7
|
+
let env = &context.env;
|
|
8
|
+
|
|
9
|
+
let guid = BytesN::from_array(env, &[1u8; 32]);
|
|
10
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4, 5]);
|
|
11
|
+
|
|
12
|
+
let payload = build_payload(env, &guid, &message);
|
|
13
|
+
|
|
14
|
+
// Payload should be 32 bytes (guid) + message length
|
|
15
|
+
assert_eq!(payload.len(), 32 + 5);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
#[test]
|
|
19
|
+
fn test_build_payload() {
|
|
20
|
+
let context = setup();
|
|
21
|
+
let env = &context.env;
|
|
22
|
+
|
|
23
|
+
// Create a guid with 32 periods (ASCII 46 = '.')
|
|
24
|
+
let guid_bytes = [46u8; 32];
|
|
25
|
+
let guid = BytesN::from_array(env, &guid_bytes);
|
|
26
|
+
|
|
27
|
+
// Create message with bytes [18, 19, 20]
|
|
28
|
+
let message = Bytes::from_array(env, &[18, 19, 20]);
|
|
29
|
+
|
|
30
|
+
let payload = build_payload(env, &guid, &message);
|
|
31
|
+
|
|
32
|
+
// Expected payload: 32 bytes of guid + 3 bytes of message
|
|
33
|
+
let expected_bytes: [u8; 35] = [
|
|
34
|
+
46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 0-7
|
|
35
|
+
46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 8-15
|
|
36
|
+
46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 16-23
|
|
37
|
+
46, 46, 46, 46, 46, 46, 46, 46, // guid bytes 24-31 (32 periods)
|
|
38
|
+
18, 19, 20, // message
|
|
39
|
+
];
|
|
40
|
+
let expected = Bytes::from_array(env, &expected_bytes);
|
|
41
|
+
|
|
42
|
+
assert_eq!(payload, expected);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
#[test]
|
|
47
|
+
fn test_build_payload_empty_message() {
|
|
48
|
+
let context = setup();
|
|
49
|
+
let env = &context.env;
|
|
50
|
+
|
|
51
|
+
let guid = BytesN::from_array(env, &[1u8; 32]);
|
|
52
|
+
let message = Bytes::new(env);
|
|
53
|
+
|
|
54
|
+
let payload = build_payload(env, &guid, &message);
|
|
55
|
+
|
|
56
|
+
// Payload should be just the 32 bytes of GUID
|
|
57
|
+
assert_eq!(payload.len(), 32);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#[test]
|
|
61
|
+
fn test_build_payload_large_message() {
|
|
62
|
+
let context = setup();
|
|
63
|
+
let env = &context.env;
|
|
64
|
+
|
|
65
|
+
let guid = BytesN::from_array(env, &[1u8; 32]);
|
|
66
|
+
let message = Bytes::from_array(env, &[255u8; 1000]);
|
|
67
|
+
|
|
68
|
+
let payload = build_payload(env, &guid, &message);
|
|
69
|
+
|
|
70
|
+
// Payload should be 32 bytes (guid) + 1000 bytes (message)
|
|
71
|
+
assert_eq!(payload.len(), 32 + 1000);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
#[test]
|
|
76
|
+
fn test_build_payload_all_zero_guid() {
|
|
77
|
+
let context = setup();
|
|
78
|
+
let env = &context.env;
|
|
79
|
+
|
|
80
|
+
let guid = BytesN::from_array(env, &[0u8; 32]);
|
|
81
|
+
let message = Bytes::from_array(env, &[1, 2, 3]);
|
|
82
|
+
|
|
83
|
+
let payload = build_payload(env, &guid, &message);
|
|
84
|
+
|
|
85
|
+
// Should successfully build payload with all-zero GUID
|
|
86
|
+
assert_eq!(payload.len(), 32 + 3);
|
|
87
|
+
|
|
88
|
+
// First 32 bytes should be zeros
|
|
89
|
+
for i in 0..32 {
|
|
90
|
+
assert_eq!(payload.get(i).unwrap(), 0u8);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
#[test]
|
|
96
|
+
fn test_build_payload_single_byte_message() {
|
|
97
|
+
let context = setup();
|
|
98
|
+
let env = &context.env;
|
|
99
|
+
|
|
100
|
+
let guid = BytesN::from_array(env, &[1u8; 32]);
|
|
101
|
+
let message = Bytes::from_array(env, &[42]);
|
|
102
|
+
|
|
103
|
+
let payload = build_payload(env, &guid, &message);
|
|
104
|
+
|
|
105
|
+
// Payload should be 32 bytes (guid) + 1 byte (message)
|
|
106
|
+
assert_eq!(payload.len(), 33);
|
|
107
|
+
assert_eq!(payload.get(32).unwrap(), 42u8);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
|
|
111
|
+
#[test]
|
|
112
|
+
fn test_build_payload_preserves_message_order() {
|
|
113
|
+
let context = setup();
|
|
114
|
+
let env = &context.env;
|
|
115
|
+
|
|
116
|
+
let guid = BytesN::from_array(env, &[0u8; 32]);
|
|
117
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]);
|
|
118
|
+
|
|
119
|
+
let payload = build_payload(env, &guid, &message);
|
|
120
|
+
|
|
121
|
+
// Verify message bytes are preserved in order after GUID
|
|
122
|
+
for i in 0..10 {
|
|
123
|
+
assert_eq!(payload.get(32 + i).unwrap(), (i + 1) as u8);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
use crate::{tests::endpoint_setup::setup, util::compute_guid};
|
|
2
|
+
use hex_literal::hex;
|
|
3
|
+
use soroban_sdk::{address_payload::AddressPayload, testutils::Address as _, Address, BytesN, Env};
|
|
4
|
+
|
|
5
|
+
#[test]
|
|
6
|
+
fn test_compute_guid_basic() {
|
|
7
|
+
let context = setup();
|
|
8
|
+
let env = &context.env;
|
|
9
|
+
|
|
10
|
+
let nonce = 1u64;
|
|
11
|
+
let src_eid = 1u32;
|
|
12
|
+
let sender = Address::generate(env);
|
|
13
|
+
let dst_eid = 2u32;
|
|
14
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
15
|
+
|
|
16
|
+
let guid = compute_guid(env, nonce, src_eid, &sender, dst_eid, &receiver);
|
|
17
|
+
|
|
18
|
+
// Verify that GUID is 32 bytes
|
|
19
|
+
assert_eq!(guid.len(), 32);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
#[test]
|
|
23
|
+
fn test_compute_guid() {
|
|
24
|
+
let env = Env::default();
|
|
25
|
+
|
|
26
|
+
let src_eid: u32 = 1;
|
|
27
|
+
let dst_eid: u32 = 2;
|
|
28
|
+
let nonce: u64 = 0x1234;
|
|
29
|
+
|
|
30
|
+
// Create sender address from bytes32 (0x00...03)
|
|
31
|
+
let sender_bytes = hex!("0000000000000000000000000000000000000000000000000000000000000003");
|
|
32
|
+
let sender = Address::from_payload(&env, AddressPayload::ContractIdHash(BytesN::from_array(&env, &sender_bytes)));
|
|
33
|
+
|
|
34
|
+
// Create receiver bytes32 (0x00...04)
|
|
35
|
+
let receiver_bytes = hex!("0000000000000000000000000000000000000000000000000000000000000004");
|
|
36
|
+
let receiver = BytesN::from_array(&env, &receiver_bytes);
|
|
37
|
+
|
|
38
|
+
let guid = compute_guid(&env, nonce, src_eid, &sender, dst_eid, &receiver);
|
|
39
|
+
|
|
40
|
+
// Expected GUID: 4e80f6fdccb10b2634b15fd900819c9d609ae2c61047ed47718f1dcca05587e4
|
|
41
|
+
// (generated from Aptos)
|
|
42
|
+
let expected_guid =
|
|
43
|
+
BytesN::from_array(&env, &hex!("4e80f6fdccb10b2634b15fd900819c9d609ae2c61047ed47718f1dcca05587e4"));
|
|
44
|
+
|
|
45
|
+
assert_eq!(guid, expected_guid);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
#[test]
|
|
49
|
+
fn test_compute_guid_deterministic() {
|
|
50
|
+
let context = setup();
|
|
51
|
+
let env = &context.env;
|
|
52
|
+
|
|
53
|
+
let nonce = 1u64;
|
|
54
|
+
let src_eid = 1u32;
|
|
55
|
+
let sender = Address::generate(env);
|
|
56
|
+
let dst_eid = 2u32;
|
|
57
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
58
|
+
|
|
59
|
+
// Compute GUID twice with same parameters
|
|
60
|
+
let guid1 = compute_guid(env, nonce, src_eid, &sender, dst_eid, &receiver);
|
|
61
|
+
let guid2 = compute_guid(env, nonce, src_eid, &sender, dst_eid, &receiver);
|
|
62
|
+
|
|
63
|
+
// Should produce the same GUID
|
|
64
|
+
assert_eq!(guid1, guid2);
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
#[test]
|
|
68
|
+
fn test_compute_guid_different_nonces() {
|
|
69
|
+
let context = setup();
|
|
70
|
+
let env = &context.env;
|
|
71
|
+
|
|
72
|
+
let src_eid = 1u32;
|
|
73
|
+
let sender = Address::generate(env);
|
|
74
|
+
let dst_eid = 2u32;
|
|
75
|
+
let receiver = BytesN::from_array(env, &[1u8; 32]);
|
|
76
|
+
|
|
77
|
+
let guid1 = compute_guid(env, 1, src_eid, &sender, dst_eid, &receiver);
|
|
78
|
+
let guid2 = compute_guid(env, 2, src_eid, &sender, dst_eid, &receiver);
|
|
79
|
+
|
|
80
|
+
// Different nonces should produce different GUIDs
|
|
81
|
+
assert_ne!(guid1, guid2);
|
|
82
|
+
}
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
use crate::{tests::endpoint_setup::setup, util::keccak256};
|
|
2
|
+
use soroban_sdk::Bytes;
|
|
3
|
+
|
|
4
|
+
#[test]
|
|
5
|
+
fn test_keccak256_basic() {
|
|
6
|
+
let context = setup();
|
|
7
|
+
let env = &context.env;
|
|
8
|
+
|
|
9
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4, 5]);
|
|
10
|
+
|
|
11
|
+
let hash = keccak256(env, &message);
|
|
12
|
+
|
|
13
|
+
// Hash should be 32 bytes
|
|
14
|
+
assert_eq!(hash.len(), 32);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
#[test]
|
|
18
|
+
fn test_keccak256_empty_message() {
|
|
19
|
+
let context = setup();
|
|
20
|
+
let env = &context.env;
|
|
21
|
+
|
|
22
|
+
let message = Bytes::new(env);
|
|
23
|
+
|
|
24
|
+
let hash = keccak256(env, &message);
|
|
25
|
+
|
|
26
|
+
// Hash of empty message should still be 32 bytes
|
|
27
|
+
assert_eq!(hash.len(), 32);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#[test]
|
|
31
|
+
fn test_keccak256_deterministic() {
|
|
32
|
+
let context = setup();
|
|
33
|
+
let env = &context.env;
|
|
34
|
+
|
|
35
|
+
let message = Bytes::from_array(env, &[1, 2, 3, 4, 5]);
|
|
36
|
+
|
|
37
|
+
// Hash the same message twice
|
|
38
|
+
let hash1 = keccak256(env, &message);
|
|
39
|
+
let hash2 = keccak256(env, &message);
|
|
40
|
+
|
|
41
|
+
// Should produce the same hash
|
|
42
|
+
assert_eq!(hash1, hash2);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
#[test]
|
|
46
|
+
fn test_keccak256_different_messages() {
|
|
47
|
+
let context = setup();
|
|
48
|
+
let env = &context.env;
|
|
49
|
+
|
|
50
|
+
let message1 = Bytes::from_array(env, &[1, 2, 3]);
|
|
51
|
+
let message2 = Bytes::from_array(env, &[4, 5, 6]);
|
|
52
|
+
|
|
53
|
+
let hash1 = keccak256(env, &message1);
|
|
54
|
+
let hash2 = keccak256(env, &message2);
|
|
55
|
+
|
|
56
|
+
// Different messages should produce different hashes
|
|
57
|
+
assert_ne!(hash1, hash2);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
#[test]
|
|
61
|
+
fn test_keccak256_single_byte() {
|
|
62
|
+
let context = setup();
|
|
63
|
+
let env = &context.env;
|
|
64
|
+
|
|
65
|
+
let message = Bytes::from_array(env, &[42]);
|
|
66
|
+
|
|
67
|
+
let hash = keccak256(env, &message);
|
|
68
|
+
|
|
69
|
+
// Hash should be 32 bytes
|
|
70
|
+
assert_eq!(hash.len(), 32);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
#[test]
|
|
74
|
+
fn test_keccak256_large_message() {
|
|
75
|
+
let context = setup();
|
|
76
|
+
let env = &context.env;
|
|
77
|
+
|
|
78
|
+
let message = Bytes::from_array(env, &[255u8; 1000]);
|
|
79
|
+
|
|
80
|
+
let hash = keccak256(env, &message);
|
|
81
|
+
|
|
82
|
+
// Hash should still be 32 bytes
|
|
83
|
+
assert_eq!(hash.len(), 32);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
#[test]
|
|
87
|
+
fn test_keccak256_all_zeros() {
|
|
88
|
+
let context = setup();
|
|
89
|
+
let env = &context.env;
|
|
90
|
+
|
|
91
|
+
let message = Bytes::from_array(env, &[0u8; 100]);
|
|
92
|
+
|
|
93
|
+
let hash = keccak256(env, &message);
|
|
94
|
+
|
|
95
|
+
// Hash should be 32 bytes
|
|
96
|
+
assert_eq!(hash.len(), 32);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
#[test]
|
|
100
|
+
fn test_keccak256_very_long_message() {
|
|
101
|
+
let context = setup();
|
|
102
|
+
let env = &context.env;
|
|
103
|
+
|
|
104
|
+
// Create a very long message (e.g., 10000 bytes)
|
|
105
|
+
let mut data = [0u8; 10000];
|
|
106
|
+
for i in 0..10000 {
|
|
107
|
+
data[i] = (i % 256) as u8;
|
|
108
|
+
}
|
|
109
|
+
let message = Bytes::from_array(env, &data);
|
|
110
|
+
|
|
111
|
+
let hash = keccak256(env, &message);
|
|
112
|
+
|
|
113
|
+
// Hash should still be 32 bytes regardless of input size
|
|
114
|
+
assert_eq!(hash.len(), 32);
|
|
115
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
use soroban_sdk::{Address, Bytes, BytesN, Env};
|
|
2
|
+
use utils::buffer_writer::BufferWriter;
|
|
3
|
+
|
|
4
|
+
/// Computes a globally unique identifier (GUID) for cross-chain messages.
|
|
5
|
+
///
|
|
6
|
+
/// # Arguments
|
|
7
|
+
/// * `nonce` - The nonce of the message
|
|
8
|
+
/// * `src_eid` - The source endpoint ID
|
|
9
|
+
/// * `sender` - The sender OApp address on the source chain
|
|
10
|
+
/// * `dst_eid` - The destination endpoint ID
|
|
11
|
+
/// * `receiver` - The receiver OApp address on the destination chain
|
|
12
|
+
///
|
|
13
|
+
/// # Returns
|
|
14
|
+
/// * `BytesN<32>` - The GUID
|
|
15
|
+
pub fn compute_guid(
|
|
16
|
+
env: &Env,
|
|
17
|
+
nonce: u64,
|
|
18
|
+
src_eid: u32,
|
|
19
|
+
sender: &Address,
|
|
20
|
+
dst_eid: u32,
|
|
21
|
+
receiver: &BytesN<32>,
|
|
22
|
+
) -> BytesN<32> {
|
|
23
|
+
let mut writer = BufferWriter::new(env);
|
|
24
|
+
writer.write_u64(nonce).write_u32(src_eid).write_address_payload(sender).write_u32(dst_eid).write_bytes_n(receiver);
|
|
25
|
+
keccak256(env, &writer.to_bytes())
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/// Builds a payload from a GUID and message.
|
|
29
|
+
///
|
|
30
|
+
/// # Arguments
|
|
31
|
+
/// * `env` - The environment
|
|
32
|
+
/// * `guid` - The GUID
|
|
33
|
+
/// * `message` - The message
|
|
34
|
+
///
|
|
35
|
+
/// # Returns
|
|
36
|
+
/// * `Bytes` - The payload
|
|
37
|
+
pub fn build_payload(env: &Env, guid: &BytesN<32>, message: &Bytes) -> Bytes {
|
|
38
|
+
let mut data = Bytes::from_array(env, &guid.to_array());
|
|
39
|
+
data.append(message);
|
|
40
|
+
data
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Computes the Keccak-256 hash of a message.
|
|
44
|
+
///
|
|
45
|
+
/// # Arguments
|
|
46
|
+
/// * `message` - The message
|
|
47
|
+
///
|
|
48
|
+
/// # Returns
|
|
49
|
+
/// * `BytesN<32>` - The hash
|
|
50
|
+
pub fn keccak256(env: &Env, message: &Bytes) -> BytesN<32> {
|
|
51
|
+
env.crypto().keccak256(message).into()
|
|
52
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "block-message-lib"
|
|
3
|
+
version.workspace = true
|
|
4
|
+
edition.workspace = true
|
|
5
|
+
license.workspace = true
|
|
6
|
+
publish = false
|
|
7
|
+
|
|
8
|
+
[lib]
|
|
9
|
+
crate-type = ["cdylib"]
|
|
10
|
+
doctest = false
|
|
11
|
+
|
|
12
|
+
[dependencies]
|
|
13
|
+
soroban-sdk = { workspace = true }
|
|
14
|
+
# workspace dependencies
|
|
15
|
+
endpoint-v2 = { workspace = true, features = ["library"] }
|
|
16
|
+
common-macros = { workspace = true }
|
|
17
|
+
|
|
18
|
+
[dev-dependencies]
|
|
19
|
+
soroban-sdk = { workspace = true, features = ["testutils"] }
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
//! # Block Message Library
|
|
2
|
+
//!
|
|
3
|
+
//! A special message library that blocks all messaging operations.
|
|
4
|
+
//!
|
|
5
|
+
//! This library is used as a blocklist mechanism to prevent OApps from sending
|
|
6
|
+
//! or receiving cross-chain messages. When assigned as an OApp's send or receive
|
|
7
|
+
//! library, all quote, send, and config operations will fail.
|
|
8
|
+
//!
|
|
9
|
+
//! Use cases:
|
|
10
|
+
//! - Temporarily disable messaging for an OApp
|
|
11
|
+
//! - Emergency circuit breaker for cross-chain communication
|
|
12
|
+
|
|
13
|
+
#![no_std]
|
|
14
|
+
|
|
15
|
+
use common_macros::contract_error;
|
|
16
|
+
use endpoint_v2::{
|
|
17
|
+
FeesAndPacket, IMessageLib, ISendLib, MessageLibType, MessageLibVersion, MessagingFee, OutboundPacket,
|
|
18
|
+
SetConfigParam,
|
|
19
|
+
};
|
|
20
|
+
use soroban_sdk::{contract, contractimpl, panic_with_error, Address, Bytes, Env, Vec};
|
|
21
|
+
|
|
22
|
+
#[contract_error]
|
|
23
|
+
enum BlockMessageLibError {
|
|
24
|
+
NotImplemented,
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/// Block Message Library contract that rejects all messaging operations.
|
|
28
|
+
#[contract]
|
|
29
|
+
pub struct BlockMessageLib;
|
|
30
|
+
|
|
31
|
+
#[contractimpl]
|
|
32
|
+
impl IMessageLib for BlockMessageLib {
|
|
33
|
+
/// Always panics - config retrieval is not supported.
|
|
34
|
+
fn get_config(env: &Env, _eid: u32, _oapp: &Address, _config_type: u32) -> Bytes {
|
|
35
|
+
panic_with_error!(&env, BlockMessageLibError::NotImplemented);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/// Returns true for all EIDs to allow assignment as a blocking library.
|
|
39
|
+
fn is_supported_eid(_env: &Env, _eid: u32) -> bool {
|
|
40
|
+
true
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/// Returns SendAndReceive to indicate it can block both directions.
|
|
44
|
+
fn message_lib_type(_env: &Env) -> MessageLibType {
|
|
45
|
+
MessageLibType::SendAndReceive
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/// Always panics - config modification is not supported.
|
|
49
|
+
fn set_config(env: &Env, _oapp: &Address, _param: &Vec<SetConfigParam>) {
|
|
50
|
+
panic_with_error!(&env, BlockMessageLibError::NotImplemented);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/// Returns max version to ensure it's recognized as a valid library.
|
|
54
|
+
fn version(_env: &Env) -> MessageLibVersion {
|
|
55
|
+
MessageLibVersion { major: u64::MAX, minor: u8::MAX as u32, endpoint_version: 2 }
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
#[contractimpl]
|
|
60
|
+
impl ISendLib for BlockMessageLib {
|
|
61
|
+
/// Always panics - quoting is blocked.
|
|
62
|
+
fn quote(env: &Env, _packet: &OutboundPacket, _options: &Bytes, _pay_in_zro: bool) -> MessagingFee {
|
|
63
|
+
panic_with_error!(&env, BlockMessageLibError::NotImplemented);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/// Always panics - sending is blocked.
|
|
67
|
+
fn send(env: &Env, _packet: &OutboundPacket, _options: &Bytes, _pay_in_zro: bool) -> FeesAndPacket {
|
|
68
|
+
panic_with_error!(&env, BlockMessageLibError::NotImplemented);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
[package]
|
|
2
|
+
name = "message-lib-common"
|
|
3
|
+
version.workspace = true
|
|
4
|
+
edition.workspace = true
|
|
5
|
+
license.workspace = true
|
|
6
|
+
|
|
7
|
+
[lib]
|
|
8
|
+
crate-type = ["rlib"]
|
|
9
|
+
doctest = false
|
|
10
|
+
|
|
11
|
+
[features]
|
|
12
|
+
testutils = []
|
|
13
|
+
|
|
14
|
+
[dependencies]
|
|
15
|
+
cfg-if = "1.0"
|
|
16
|
+
soroban-sdk = { workspace = true }
|
|
17
|
+
# workspace dependencies
|
|
18
|
+
utils = { workspace = true }
|
|
19
|
+
common-macros = { workspace = true }
|
|
20
|
+
endpoint-v2 = { workspace = true, features = ["library"] }
|
|
21
|
+
|
|
22
|
+
[dev-dependencies]
|
|
23
|
+
soroban-sdk = { workspace = true, features = ["testutils"] }
|
|
24
|
+
hex-literal = { workspace = true }
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
use common_macros::contract_error;
|
|
2
|
+
|
|
3
|
+
#[contract_error]
|
|
4
|
+
pub enum PacketCodecV1Error {
|
|
5
|
+
InvalidPacketVersion = 11001,
|
|
6
|
+
InvalidPacketHeader,
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
#[contract_error]
|
|
10
|
+
pub enum WorkerOptionsError {
|
|
11
|
+
InvalidOptions = 11101,
|
|
12
|
+
InvalidWorkerId,
|
|
13
|
+
InvalidLegacyOptionsType1,
|
|
14
|
+
LegacyOptionsType1GasOverflow,
|
|
15
|
+
InvalidLegacyOptionsType2,
|
|
16
|
+
LegacyOptionsType2GasOverflow,
|
|
17
|
+
LegacyOptionsType2AmountOverflow,
|
|
18
|
+
InvalidOptionType,
|
|
19
|
+
InvalidBytesLength,
|
|
20
|
+
}
|