@layerzerolabs/protocol-stellar-v2 0.2.18 → 0.2.20
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 +303 -253
- package/.turbo/turbo-lint.log +66 -65
- package/.turbo/turbo-test.log +1312 -1282
- package/Cargo.lock +21 -8
- package/Cargo.toml +2 -0
- package/contracts/ERROR_SPEC.md +9 -2
- package/contracts/common-macros/src/contract_ttl.rs +18 -7
- package/contracts/common-macros/src/lib.rs +4 -4
- package/contracts/common-macros/src/tests/contract_ttl.rs +1 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__contract_ttl__snapshot_generated_contractimpl_code.snap +2 -1
- package/contracts/common-macros/src/tests/snapshots/common_macros__tests__upgradeable__snapshot_generated_upgradeable_code.snap +7 -12
- package/contracts/common-macros/src/upgradeable.rs +15 -21
- package/contracts/message-libs/uln-302/src/events.rs +4 -0
- package/contracts/message-libs/uln-302/src/send_uln.rs +23 -7
- package/contracts/message-libs/uln-302/src/tests/send_uln302/send.rs +38 -64
- package/contracts/oapps/counter/Cargo.toml +1 -0
- package/contracts/oapps/counter/integration_tests/setup_uln.rs +1 -1
- package/contracts/oapps/oapp/src/oapp_receiver.rs +1 -1
- package/contracts/oapps/oapp/src/tests/test_oapp_core.rs +113 -65
- package/contracts/oapps/oapp/src/tests/test_oapp_options_type3.rs +111 -82
- package/contracts/oapps/oapp/src/tests/test_oapp_receiver.rs +293 -65
- package/contracts/oapps/oapp/src/tests/test_oapp_sender.rs +331 -56
- package/contracts/oapps/oft/Cargo.toml +10 -7
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_oft_fee.rs +3 -4
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_pausable.rs +2 -3
- package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/test_rate_limiter.rs +1 -1
- package/contracts/oapps/oft/integration-tests/mod.rs +1 -1
- package/contracts/oapps/oft/integration-tests/setup.rs +28 -127
- package/contracts/oapps/oft/integration-tests/utils.rs +254 -21
- package/contracts/oapps/oft/src/extensions/oft_fee.rs +23 -8
- package/contracts/oapps/oft/src/extensions/pausable.rs +19 -4
- package/contracts/oapps/oft/src/extensions/rate_limiter.rs +52 -28
- package/contracts/oapps/oft/src/lib.rs +10 -14
- package/contracts/oapps/oft/src/oft.rs +143 -193
- package/contracts/oapps/oft/src/oft_types/lock_unlock.rs +9 -11
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +12 -14
- package/contracts/oapps/oft/src/oft_types/mod.rs +13 -0
- package/contracts/oapps/{oft-std → oft-core}/Cargo.toml +6 -4
- package/contracts/oapps/{oft-std → oft-core}/integration-tests/mod.rs +1 -1
- package/contracts/oapps/{oft-std → oft-core}/integration-tests/setup.rs +126 -29
- package/contracts/oapps/{oft → oft-core}/integration-tests/test_with_sml.rs +3 -3
- package/contracts/oapps/oft-core/integration-tests/utils.rs +201 -0
- package/contracts/oapps/oft-core/src/lib.rs +18 -0
- package/contracts/oapps/oft-core/src/oft_core.rs +479 -0
- package/contracts/oapps/{oft → oft-core}/src/tests/mod.rs +0 -2
- package/contracts/oapps/{oft → oft-core}/src/tests/test_lz_receive.rs +7 -7
- package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_msg_codec.rs +4 -4
- package/contracts/oapps/{oft → oft-core}/src/tests/test_resolve_address.rs +3 -3
- package/contracts/oapps/{oft → oft-core}/src/tests/test_utils.rs +46 -27
- package/contracts/oapps/{oft → oft-core}/src/utils.rs +1 -1
- package/contracts/upgrader/src/lib.rs +30 -57
- 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 +44 -35
- package/contracts/utils/src/buffer_reader.rs +1 -0
- package/contracts/utils/src/errors.rs +8 -2
- package/contracts/utils/src/ownable.rs +125 -3
- package/contracts/utils/src/tests/option_ext.rs +1 -1
- package/contracts/utils/src/tests/ownable.rs +445 -7
- package/contracts/utils/src/tests/ttl_configurable.rs +2 -2
- package/contracts/utils/src/tests/upgradeable.rs +372 -175
- package/contracts/utils/src/ttl_configurable.rs +3 -3
- package/contracts/utils/src/upgradeable.rs +48 -23
- package/contracts/workers/dvn/Cargo.toml +1 -0
- package/contracts/workers/dvn/src/auth.rs +12 -42
- package/contracts/workers/dvn/src/dvn.rs +16 -31
- package/contracts/workers/dvn/src/errors.rs +0 -1
- package/contracts/workers/dvn/src/interfaces/dvn.rs +35 -0
- package/contracts/workers/dvn/src/lib.rs +4 -3
- package/contracts/workers/dvn/src/tests/auth.rs +1 -1
- package/contracts/workers/dvn/src/tests/dvn.rs +19 -15
- package/contracts/workers/dvn/src/tests/multisig/set_threshold.rs +2 -4
- package/contracts/workers/dvn/src/tests/multisig/verify_signatures.rs +1 -3
- package/contracts/workers/dvn/src/tests/setup.rs +5 -9
- package/contracts/workers/dvn-fee-lib/Cargo.toml +1 -1
- package/contracts/workers/dvn-fee-lib/src/dvn_fee_lib.rs +3 -5
- package/contracts/workers/dvn-fee-lib/src/tests/dvn_fee_lib.rs +2 -3
- package/contracts/workers/executor/Cargo.toml +1 -0
- package/contracts/workers/executor/src/executor.rs +15 -26
- package/contracts/workers/executor-fee-lib/Cargo.toml +2 -1
- package/contracts/workers/executor-fee-lib/src/executor_fee_lib.rs +63 -5
- package/contracts/workers/executor-fee-lib/src/executor_option.rs +28 -1
- package/contracts/workers/executor-fee-lib/src/lib.rs +3 -0
- package/contracts/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +701 -0
- package/contracts/workers/executor-fee-lib/src/tests/executor_option.rs +370 -0
- package/contracts/workers/executor-fee-lib/src/tests/mod.rs +4 -0
- package/contracts/workers/executor-fee-lib/src/tests/setup.rs +60 -0
- package/contracts/workers/executor-helper/src/lib.rs +3 -0
- package/contracts/workers/executor-helper/src/tests/executor_helper.rs +184 -0
- package/contracts/workers/executor-helper/src/tests/mod.rs +2 -0
- package/contracts/workers/executor-helper/src/tests/setup.rs +366 -0
- package/contracts/workers/fee-lib-interfaces/Cargo.toml +14 -0
- package/contracts/workers/{worker/src/interfaces/mod.rs → fee-lib-interfaces/src/lib.rs} +4 -3
- package/contracts/workers/price-feed/Cargo.toml +2 -1
- package/contracts/workers/price-feed/src/events.rs +1 -1
- package/contracts/workers/price-feed/src/lib.rs +3 -0
- package/contracts/workers/price-feed/src/price_feed.rs +6 -12
- package/contracts/workers/price-feed/src/storage.rs +1 -1
- package/contracts/workers/price-feed/src/tests/mod.rs +2 -0
- package/contracts/workers/price-feed/src/tests/price_feed.rs +869 -0
- package/contracts/workers/price-feed/src/tests/setup.rs +70 -0
- package/contracts/workers/price-feed/src/types.rs +1 -1
- package/contracts/workers/worker/src/errors.rs +0 -3
- package/contracts/workers/worker/src/lib.rs +0 -2
- package/contracts/workers/worker/src/storage.rs +32 -29
- package/contracts/workers/worker/src/tests/setup.rs +1 -7
- package/contracts/workers/worker/src/tests/worker.rs +50 -42
- package/contracts/workers/worker/src/worker.rs +49 -58
- package/package.json +4 -5
- package/sdk/.turbo/turbo-test.log +229 -217
- package/sdk/dist/generated/bml.d.ts +39 -1
- package/sdk/dist/generated/bml.js +33 -8
- package/sdk/dist/generated/counter.d.ts +131 -3
- package/sdk/dist/generated/counter.js +41 -10
- package/sdk/dist/generated/dvn.d.ts +431 -362
- package/sdk/dist/generated/dvn.js +80 -55
- package/sdk/dist/generated/dvn_fee_lib.d.ts +327 -251
- package/sdk/dist/generated/dvn_fee_lib.js +55 -57
- package/sdk/dist/generated/endpoint.d.ts +131 -3
- package/sdk/dist/generated/endpoint.js +41 -10
- package/sdk/dist/generated/executor.d.ts +503 -339
- package/sdk/dist/generated/executor.js +80 -48
- package/sdk/dist/generated/executor_fee_lib.d.ts +395 -319
- package/sdk/dist/generated/executor_fee_lib.js +54 -56
- package/sdk/dist/generated/executor_helper.d.ts +53 -187
- package/sdk/dist/generated/executor_helper.js +47 -29
- package/sdk/dist/generated/layerzero_view.d.ts +1271 -0
- package/sdk/dist/generated/layerzero_view.js +294 -0
- package/sdk/dist/generated/oft.d.ts +1851 -0
- package/sdk/dist/generated/oft.js +347 -0
- package/sdk/dist/generated/price_feed.d.ts +329 -253
- package/sdk/dist/generated/price_feed.js +55 -57
- package/sdk/dist/generated/sml.d.ts +131 -3
- package/sdk/dist/generated/sml.js +41 -10
- package/sdk/dist/generated/treasury.d.ts +131 -3
- package/sdk/dist/generated/treasury.js +41 -10
- package/sdk/dist/generated/uln302.d.ts +131 -3
- package/sdk/dist/generated/uln302.js +43 -12
- package/sdk/dist/generated/upgrader.d.ts +201 -15
- package/sdk/dist/generated/upgrader.js +99 -1
- package/sdk/dist/index.d.ts +2 -2
- package/sdk/dist/index.js +3 -3
- package/sdk/package.json +3 -2
- package/sdk/src/index.ts +3 -3
- package/sdk/test/oft-sml.test.ts +20 -20
- package/sdk/test/upgrader.test.ts +2 -3
- package/sdk/turbo.json +8 -0
- package/tools/ts-bindings-gen/Cargo.toml +2 -0
- package/tools/ts-bindings-gen/src/main.rs +53 -5
- package/turbo.json +0 -2
- package/contracts/oapps/oft/src/interfaces/mint_burn_token.rs +0 -23
- package/contracts/oapps/oft/src/interfaces/mod.rs +0 -3
- package/contracts/oapps/oft/src/oft_impl.rs +0 -201
- package/contracts/oapps/oft/src/tests/extensions/mod.rs +0 -11
- package/contracts/oapps/oft/src/tests/extensions/setup.rs +0 -917
- package/contracts/oapps/oft/src/tests/extensions/test_oft_fee.rs +0 -751
- package/contracts/oapps/oft/src/tests/extensions/test_pausable.rs +0 -434
- package/contracts/oapps/oft/src/tests/extensions/test_rate_limiter.rs +0 -1080
- package/contracts/oapps/oft-std/integration-tests/utils.rs +0 -427
- package/contracts/oapps/oft-std/src/lib.rs +0 -16
- package/contracts/oapps/oft-std/src/oft.rs +0 -174
- package/sdk/dist/generated/oft_std.d.ts +0 -1722
- package/sdk/dist/generated/oft_std.js +0 -316
- package/sdk/dist/wasm/blocked-message-lib.d.ts +0 -1
- package/sdk/dist/wasm/blocked-message-lib.js +0 -2
- package/sdk/dist/wasm/counter.d.ts +0 -1
- package/sdk/dist/wasm/counter.js +0 -2
- package/sdk/dist/wasm/dvn-fee-lib.d.ts +0 -1
- package/sdk/dist/wasm/dvn-fee-lib.js +0 -2
- package/sdk/dist/wasm/dvn.d.ts +0 -1
- package/sdk/dist/wasm/dvn.js +0 -2
- package/sdk/dist/wasm/endpoint-v2.d.ts +0 -1
- package/sdk/dist/wasm/endpoint-v2.js +0 -2
- package/sdk/dist/wasm/executor-fee-lib.d.ts +0 -1
- package/sdk/dist/wasm/executor-fee-lib.js +0 -2
- package/sdk/dist/wasm/executor-helper.d.ts +0 -1
- package/sdk/dist/wasm/executor-helper.js +0 -2
- package/sdk/dist/wasm/executor.d.ts +0 -1
- package/sdk/dist/wasm/executor.js +0 -2
- package/sdk/dist/wasm/layerzero-views.d.ts +0 -1
- package/sdk/dist/wasm/layerzero-views.js +0 -2
- package/sdk/dist/wasm/oft-std.d.ts +0 -1
- package/sdk/dist/wasm/oft-std.js +0 -2
- package/sdk/dist/wasm/price-feed.d.ts +0 -1
- package/sdk/dist/wasm/price-feed.js +0 -2
- package/sdk/dist/wasm/simple-message-lib.d.ts +0 -1
- package/sdk/dist/wasm/simple-message-lib.js +0 -2
- package/sdk/dist/wasm/treasury.d.ts +0 -1
- package/sdk/dist/wasm/treasury.js +0 -2
- package/sdk/dist/wasm/uln302.d.ts +0 -1
- package/sdk/dist/wasm/uln302.js +0 -2
- package/sdk/dist/wasm/upgrader.d.ts +0 -1
- package/sdk/dist/wasm/upgrader.js +0 -2
- package/sdk/dist/wasm.d.ts +0 -15
- package/sdk/dist/wasm.js +0 -15
- /package/contracts/oapps/{oft-std → oft}/integration-tests/extensions/mod.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/mod.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/oft_compose_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/codec/oft_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/errors.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/events.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/storage.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_decimals.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_compose_msg_codec.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_oft_version.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_oft.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_quote_send.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_send.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/tests/test_token.rs +0 -0
- /package/contracts/oapps/{oft → oft-core}/src/types.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/dvn_fee_lib.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/executor_fee_lib.rs +0 -0
- /package/contracts/workers/{worker/src/interfaces → fee-lib-interfaces/src}/price_feed.rs +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
use crate::{self as oapp, oapp_core::PeerSet, oapp_receiver::LzReceiveInternal};
|
|
2
2
|
use endpoint_v2::Origin;
|
|
3
3
|
use soroban_sdk::{
|
|
4
|
-
contract, contractimpl,
|
|
4
|
+
contract, contractimpl, contracttype,
|
|
5
5
|
testutils::{Address as _, MockAuth, MockAuthInvoke},
|
|
6
6
|
Address, Bytes, BytesN, Env, IntoVal,
|
|
7
7
|
};
|
|
@@ -10,10 +10,24 @@ use utils::testing_utils::assert_event;
|
|
|
10
10
|
#[contract]
|
|
11
11
|
pub struct DummyEndpoint;
|
|
12
12
|
|
|
13
|
+
#[derive(Clone)]
|
|
14
|
+
#[contracttype]
|
|
15
|
+
enum DummyEndpointDataKey {
|
|
16
|
+
Delegate(Address),
|
|
17
|
+
}
|
|
18
|
+
|
|
13
19
|
#[contractimpl]
|
|
14
20
|
impl DummyEndpoint {
|
|
15
|
-
pub fn set_delegate(
|
|
16
|
-
|
|
21
|
+
pub fn set_delegate(env: Env, oapp: &Address, delegate: &Option<Address>) {
|
|
22
|
+
let key = DummyEndpointDataKey::Delegate(oapp.clone());
|
|
23
|
+
match delegate {
|
|
24
|
+
Some(d) => env.storage().persistent().set(&key, d),
|
|
25
|
+
None => env.storage().persistent().remove(&key),
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
pub fn get_delegate(env: Env, oapp: Address) -> Option<Address> {
|
|
30
|
+
env.storage().persistent().get(&DummyEndpointDataKey::Delegate(oapp))
|
|
17
31
|
}
|
|
18
32
|
}
|
|
19
33
|
|
|
@@ -64,97 +78,127 @@ fn setup<'a>() -> TestSetup<'a> {
|
|
|
64
78
|
TestSetup { env, owner, endpoint, oapp_client }
|
|
65
79
|
}
|
|
66
80
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
81
|
+
fn set_peer_with_auth(
|
|
82
|
+
env: &Env,
|
|
83
|
+
signer: &Address,
|
|
84
|
+
oapp_client: &DummyOAppClient<'_>,
|
|
85
|
+
eid: u32,
|
|
86
|
+
peer: &Option<BytesN<32>>,
|
|
87
|
+
) {
|
|
73
88
|
env.mock_auths(&[MockAuth {
|
|
74
|
-
address:
|
|
89
|
+
address: signer,
|
|
75
90
|
invoke: &MockAuthInvoke {
|
|
76
91
|
contract: &oapp_client.address,
|
|
77
92
|
fn_name: "set_peer",
|
|
78
|
-
args: (&
|
|
93
|
+
args: (&eid, peer).into_val(env),
|
|
94
|
+
sub_invokes: &[],
|
|
95
|
+
},
|
|
96
|
+
}]);
|
|
97
|
+
oapp_client.set_peer(&eid, peer);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
fn set_delegate_with_auth(env: &Env, signer: &Address, oapp_client: &DummyOAppClient<'_>, delegate: &Option<Address>) {
|
|
101
|
+
env.mock_auths(&[MockAuth {
|
|
102
|
+
address: signer,
|
|
103
|
+
invoke: &MockAuthInvoke {
|
|
104
|
+
contract: &oapp_client.address,
|
|
105
|
+
fn_name: "set_delegate",
|
|
106
|
+
args: (delegate,).into_val(env),
|
|
79
107
|
sub_invokes: &[],
|
|
80
108
|
},
|
|
81
109
|
}]);
|
|
82
|
-
oapp_client.
|
|
110
|
+
oapp_client.set_delegate(delegate);
|
|
111
|
+
}
|
|
83
112
|
|
|
84
|
-
|
|
85
|
-
|
|
113
|
+
#[test]
|
|
114
|
+
fn test_constructor_initializes_owner_and_endpoint_and_clears_delegate() {
|
|
115
|
+
let TestSetup { env, owner, endpoint, oapp_client } = setup();
|
|
116
|
+
|
|
117
|
+
// owner initialized via oapp_initialize -> init_owner
|
|
118
|
+
assert_eq!(Some(owner), oapp_client.owner());
|
|
86
119
|
|
|
87
|
-
//
|
|
88
|
-
|
|
89
|
-
assert_eq!(Some(test_peer), retrieved_peer);
|
|
120
|
+
// endpoint stored via OAppCoreStorage::set_endpoint
|
|
121
|
+
assert_eq!(endpoint, oapp_client.endpoint());
|
|
90
122
|
|
|
91
|
-
//
|
|
92
|
-
let
|
|
93
|
-
assert_eq!(None,
|
|
123
|
+
// delegate set via oapp_initialize(..., &None) -> endpoint.set_delegate(..., None)
|
|
124
|
+
let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
|
|
125
|
+
assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
|
|
94
126
|
}
|
|
95
127
|
|
|
96
128
|
#[test]
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
let test_peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
|
|
102
|
-
oapp_client.set_peer(&REMOTE_EID, &Some(test_peer));
|
|
129
|
+
fn test_oapp_version_defaults_to_zero() {
|
|
130
|
+
let TestSetup { oapp_client, .. } = setup();
|
|
131
|
+
assert_eq!((1, 1), oapp_client.oapp_version());
|
|
103
132
|
}
|
|
104
133
|
|
|
105
134
|
#[test]
|
|
106
|
-
fn
|
|
107
|
-
let TestSetup { env, oapp_client, .. } = setup();
|
|
108
|
-
env.mock_all_auths();
|
|
135
|
+
fn test_peer_lifecycle_set_get_update_remove_and_events() {
|
|
136
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
109
137
|
|
|
110
|
-
|
|
111
|
-
|
|
138
|
+
// Unset cases
|
|
139
|
+
assert_eq!(None, oapp_client.peer(&UNSET_EID));
|
|
140
|
+
assert_eq!(None, oapp_client.peer(&REMOTE_EID));
|
|
112
141
|
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
142
|
+
// Set peer v1
|
|
143
|
+
let peer_v1: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
|
|
144
|
+
let peer_v1_option = Some(peer_v1.clone());
|
|
145
|
+
set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v1_option);
|
|
116
146
|
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
147
|
+
assert_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v1.clone()) });
|
|
148
|
+
assert_eq!(Some(peer_v1), oapp_client.peer(&REMOTE_EID));
|
|
149
|
+
assert_eq!(None, oapp_client.peer(&UNSET_EID));
|
|
120
150
|
|
|
121
|
-
|
|
122
|
-
|
|
151
|
+
// Update to peer v2
|
|
152
|
+
let peer_v2: BytesN<32> = BytesN::from_array(&env, &[2; 32]);
|
|
153
|
+
let peer_v2_option = Some(peer_v2.clone());
|
|
154
|
+
set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &peer_v2_option);
|
|
155
|
+
|
|
156
|
+
assert_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: Some(peer_v2.clone()) });
|
|
157
|
+
assert_eq!(Some(peer_v2), oapp_client.peer(&REMOTE_EID));
|
|
158
|
+
|
|
159
|
+
// Remove peer
|
|
160
|
+
let none_peer: Option<BytesN<32>> = None;
|
|
161
|
+
set_peer_with_auth(&env, &owner, &oapp_client, REMOTE_EID, &none_peer);
|
|
162
|
+
assert_event(&env, &oapp_client.address, PeerSet { eid: REMOTE_EID, peer: None });
|
|
163
|
+
assert_eq!(None, oapp_client.peer(&REMOTE_EID));
|
|
123
164
|
}
|
|
124
165
|
|
|
125
166
|
#[test]
|
|
126
|
-
|
|
167
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
168
|
+
fn test_set_peer_unauthorized() {
|
|
127
169
|
let TestSetup { env, oapp_client, .. } = setup();
|
|
128
|
-
env.mock_all_auths();
|
|
129
170
|
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
171
|
+
let test_peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
|
|
172
|
+
oapp_client.set_peer(&REMOTE_EID, &Some(test_peer));
|
|
173
|
+
}
|
|
133
174
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
175
|
+
#[test]
|
|
176
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
177
|
+
fn test_set_peer_non_owner_authorized() {
|
|
178
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
179
|
+
let non_owner = Address::generate(&env);
|
|
180
|
+
assert!(non_owner != owner);
|
|
137
181
|
|
|
138
|
-
let
|
|
139
|
-
|
|
182
|
+
let peer: BytesN<32> = BytesN::from_array(&env, &[33; 32]);
|
|
183
|
+
let peer_option = Some(peer);
|
|
184
|
+
set_peer_with_auth(&env, &non_owner, &oapp_client, REMOTE_EID, &peer_option);
|
|
140
185
|
}
|
|
141
186
|
|
|
142
187
|
#[test]
|
|
143
|
-
fn
|
|
144
|
-
let TestSetup { env, owner,
|
|
188
|
+
fn test_set_delegate_updates_and_clears_endpoint_delegate() {
|
|
189
|
+
let TestSetup { env, owner, endpoint, oapp_client } = setup();
|
|
145
190
|
|
|
146
191
|
let delegate = Address::generate(&env);
|
|
147
192
|
let delegate_option = Some(delegate.clone());
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
oapp_client.set_delegate(&delegate_option);
|
|
193
|
+
set_delegate_with_auth(&env, &owner, &oapp_client, &delegate_option);
|
|
194
|
+
|
|
195
|
+
let endpoint_client = DummyEndpointClient::new(&env, &endpoint);
|
|
196
|
+
assert_eq!(Some(delegate), endpoint_client.get_delegate(&oapp_client.address));
|
|
197
|
+
|
|
198
|
+
// Clear delegate
|
|
199
|
+
let none_delegate: Option<Address> = None;
|
|
200
|
+
set_delegate_with_auth(&env, &owner, &oapp_client, &none_delegate);
|
|
201
|
+
assert_eq!(None, endpoint_client.get_delegate(&oapp_client.address));
|
|
158
202
|
}
|
|
159
203
|
|
|
160
204
|
#[test]
|
|
@@ -167,9 +211,13 @@ fn test_set_delegate_unauthorized() {
|
|
|
167
211
|
}
|
|
168
212
|
|
|
169
213
|
#[test]
|
|
170
|
-
|
|
171
|
-
|
|
214
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
215
|
+
fn test_set_delegate_non_owner_authorized() {
|
|
216
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
217
|
+
let non_owner = Address::generate(&env);
|
|
218
|
+
assert!(non_owner != owner);
|
|
172
219
|
|
|
173
|
-
let
|
|
174
|
-
|
|
220
|
+
let delegate = Address::generate(&env);
|
|
221
|
+
let delegate_option = Some(delegate);
|
|
222
|
+
set_delegate_with_auth(&env, &non_owner, &oapp_client, &delegate_option);
|
|
175
223
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
use crate::{
|
|
2
2
|
self as oapp,
|
|
3
|
+
errors::OAppError,
|
|
3
4
|
oapp_core::OAppCore,
|
|
4
5
|
oapp_options_type3::{EnforcedOptionParam, EnforcedOptionSet},
|
|
5
6
|
oapp_receiver::{LzReceiveInternal, OAppReceiver},
|
|
@@ -83,40 +84,82 @@ fn create_valid_options(env: &Env, data: &[u8]) -> Bytes {
|
|
|
83
84
|
buffer
|
|
84
85
|
}
|
|
85
86
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
let options2 = create_valid_options(&env, &[5, 6, 7, 8]);
|
|
93
|
-
|
|
94
|
-
let enforced_params = vec![
|
|
95
|
-
&env,
|
|
96
|
-
EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: options1.clone() },
|
|
97
|
-
EnforcedOptionParam { eid: REMOTE_EID_2, msg_type: MSG_TYPE_RECEIVE, options: options2.clone() },
|
|
98
|
-
];
|
|
87
|
+
fn set_enforced_options_with_auth(
|
|
88
|
+
env: &Env,
|
|
89
|
+
signer: &Address,
|
|
90
|
+
oapp_client: &DummyOAppOptionsType3Client<'_>,
|
|
91
|
+
enforced_params: &soroban_sdk::Vec<EnforcedOptionParam>,
|
|
92
|
+
) {
|
|
99
93
|
env.mock_auths(&[MockAuth {
|
|
100
|
-
address:
|
|
94
|
+
address: signer,
|
|
101
95
|
invoke: &MockAuthInvoke {
|
|
102
96
|
contract: &oapp_client.address,
|
|
103
97
|
fn_name: "set_enforced_options",
|
|
104
|
-
args: (
|
|
98
|
+
args: (enforced_params,).into_val(env),
|
|
105
99
|
sub_invokes: &[],
|
|
106
100
|
},
|
|
107
101
|
}]);
|
|
102
|
+
oapp_client.set_enforced_options(enforced_params);
|
|
103
|
+
}
|
|
108
104
|
|
|
109
|
-
|
|
105
|
+
#[test]
|
|
106
|
+
fn test_enforced_options_lifecycle() {
|
|
107
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
108
|
+
|
|
109
|
+
// Unset returns empty
|
|
110
|
+
assert_eq!(oapp_client.enforced_options(&999, &999), Bytes::new(&env));
|
|
111
|
+
|
|
112
|
+
// Set enforced options for different eid/msg_type combinations
|
|
113
|
+
let enforced1 = create_valid_options(&env, &[1, 2, 3, 4]);
|
|
114
|
+
let enforced2 = create_valid_options(&env, &[5, 6, 7, 8]);
|
|
115
|
+
let enforced_params = vec![
|
|
116
|
+
&env,
|
|
117
|
+
EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced1.clone() },
|
|
118
|
+
EnforcedOptionParam { eid: REMOTE_EID_2, msg_type: MSG_TYPE_RECEIVE, options: enforced2.clone() },
|
|
119
|
+
];
|
|
120
|
+
set_enforced_options_with_auth(&env, &owner, &oapp_client, &enforced_params);
|
|
110
121
|
|
|
111
122
|
// assert events
|
|
112
123
|
assert_event(&env, &oapp_client.address, EnforcedOptionSet { enforced_option_params: enforced_params.clone() });
|
|
113
124
|
|
|
114
125
|
// Verify options were set correctly
|
|
115
|
-
|
|
116
|
-
assert_eq!(
|
|
126
|
+
assert_eq!(oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND), enforced1.clone());
|
|
127
|
+
assert_eq!(oapp_client.enforced_options(&REMOTE_EID_2, &MSG_TYPE_RECEIVE), enforced2.clone());
|
|
128
|
+
|
|
129
|
+
// Update enforced options for one combination
|
|
130
|
+
let updated = create_valid_options(&env, &[9, 8, 7, 6, 5]);
|
|
131
|
+
let update_params =
|
|
132
|
+
vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: updated.clone() }];
|
|
133
|
+
set_enforced_options_with_auth(&env, &owner, &oapp_client, &update_params);
|
|
134
|
+
assert_event(&env, &oapp_client.address, EnforcedOptionSet { enforced_option_params: update_params.clone() });
|
|
135
|
+
assert_eq!(oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND), updated);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
#[test]
|
|
139
|
+
fn test_combine_options() {
|
|
140
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
141
|
+
|
|
142
|
+
// combine_options: no enforced -> returns extra (including empty)
|
|
143
|
+
let extra_only = create_valid_options(&env, &[9, 10, 11]);
|
|
144
|
+
assert_eq!(oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_only), extra_only);
|
|
145
|
+
|
|
146
|
+
let empty_extra = Bytes::new(&env);
|
|
147
|
+
assert_eq!(oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &empty_extra), empty_extra);
|
|
148
|
+
|
|
149
|
+
// Set enforced options for the combine tests
|
|
150
|
+
let enforced = create_valid_options(&env, &[1, 2, 3, 4]);
|
|
151
|
+
let enforced_params =
|
|
152
|
+
vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced.clone() }];
|
|
153
|
+
set_enforced_options_with_auth(&env, &owner, &oapp_client, &enforced_params);
|
|
117
154
|
|
|
118
|
-
|
|
119
|
-
assert_eq!(
|
|
155
|
+
// combine_options: enforced present -> empty extra returns enforced
|
|
156
|
+
assert_eq!(oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &Bytes::new(&env)), enforced.clone());
|
|
157
|
+
|
|
158
|
+
// combine_options: both present -> enforced + extra(without its 2-byte header)
|
|
159
|
+
let extra: Bytes = create_valid_options(&env, &[4, 5, 6]);
|
|
160
|
+
let combined = oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra);
|
|
161
|
+
let expected_combined = create_valid_options(&env, &[1, 2, 3, 4, 4, 5, 6]);
|
|
162
|
+
assert_eq!(combined, expected_combined);
|
|
120
163
|
}
|
|
121
164
|
|
|
122
165
|
#[test]
|
|
@@ -131,82 +174,68 @@ fn test_set_enforced_options_unauthorized() {
|
|
|
131
174
|
}
|
|
132
175
|
|
|
133
176
|
#[test]
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
let
|
|
138
|
-
|
|
139
|
-
let combined = oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_options);
|
|
140
|
-
assert_eq!(combined, extra_options);
|
|
141
|
-
}
|
|
177
|
+
#[should_panic(expected = "HostError: Error(Auth, InvalidAction)")]
|
|
178
|
+
fn test_set_enforced_options_non_owner_authorized() {
|
|
179
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
180
|
+
let non_owner = Address::generate(&env);
|
|
181
|
+
assert!(non_owner != owner);
|
|
142
182
|
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
183
|
+
let options = create_valid_options(&env, &[1, 2, 3, 4]);
|
|
184
|
+
let enforced_params =
|
|
185
|
+
vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: options.clone() }];
|
|
146
186
|
|
|
147
|
-
|
|
148
|
-
// when no enforced options are set
|
|
149
|
-
let empty_extra = Bytes::new(&env);
|
|
150
|
-
let combined = oapp_client.combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &empty_extra);
|
|
151
|
-
assert_eq!(combined, empty_extra);
|
|
187
|
+
set_enforced_options_with_auth(&env, &non_owner, &oapp_client, &enforced_params);
|
|
152
188
|
}
|
|
153
189
|
|
|
154
190
|
#[test]
|
|
155
|
-
fn
|
|
156
|
-
let TestSetup { env, oapp_client, .. } = setup();
|
|
157
|
-
env.mock_all_auths();
|
|
158
|
-
|
|
159
|
-
let enforced = create_valid_options(&env, &[1, 2, 3]);
|
|
160
|
-
oapp_client.set_enforced_options(&vec![
|
|
161
|
-
&env,
|
|
162
|
-
EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced.clone() },
|
|
163
|
-
]);
|
|
191
|
+
fn test_set_enforced_options_invalid_options_returns_error() {
|
|
192
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
164
193
|
|
|
165
|
-
|
|
166
|
-
let
|
|
194
|
+
// wrong option type (not 3)
|
|
195
|
+
let mut invalid = Bytes::from_array(&env, &(4u16).to_be_bytes());
|
|
196
|
+
invalid.extend_from_slice(&[1, 2, 3]);
|
|
167
197
|
|
|
168
|
-
let
|
|
169
|
-
|
|
198
|
+
let enforced_params =
|
|
199
|
+
vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: invalid }];
|
|
170
200
|
|
|
171
|
-
|
|
172
|
-
|
|
201
|
+
env.mock_auths(&[MockAuth {
|
|
202
|
+
address: &owner,
|
|
203
|
+
invoke: &MockAuthInvoke {
|
|
204
|
+
contract: &oapp_client.address,
|
|
205
|
+
fn_name: "set_enforced_options",
|
|
206
|
+
args: (&enforced_params,).into_val(&env),
|
|
207
|
+
sub_invokes: &[],
|
|
208
|
+
},
|
|
209
|
+
}]);
|
|
210
|
+
let result = oapp_client.try_set_enforced_options(&enforced_params);
|
|
211
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::InvalidOptions.into());
|
|
173
212
|
}
|
|
174
213
|
|
|
175
214
|
#[test]
|
|
176
|
-
fn
|
|
177
|
-
let TestSetup { env, oapp_client, .. } = setup();
|
|
178
|
-
env.mock_all_auths();
|
|
179
|
-
|
|
180
|
-
// Set initial options
|
|
181
|
-
let initial_options = create_valid_options(&env, &[1, 2, 3]);
|
|
182
|
-
let params = vec![
|
|
183
|
-
&env,
|
|
184
|
-
EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: initial_options.clone() },
|
|
185
|
-
];
|
|
186
|
-
oapp_client.set_enforced_options(¶ms);
|
|
187
|
-
|
|
188
|
-
// Verify initial options
|
|
189
|
-
let retrieved = oapp_client.enforced_options(&REMOTE_EID_1, &MSG_TYPE_SEND);
|
|
190
|
-
assert_eq!(retrieved, initial_options);
|
|
191
|
-
|
|
192
|
-
// Update with new options
|
|
193
|
-
let updated_options = create_valid_options(&env, &[9, 8, 7, 6, 5]);
|
|
194
|
-
let update_params = vec![
|
|
195
|
-
&env,
|
|
196
|
-
EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: updated_options.clone() },
|
|
197
|
-
];
|
|
198
|
-
oapp_client.set_enforced_options(&update_params);
|
|
215
|
+
fn test_combine_options_extra_invalid_type_returns_error_when_enforced_present() {
|
|
216
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
199
217
|
|
|
200
|
-
|
|
201
|
-
let
|
|
202
|
-
|
|
218
|
+
let enforced = create_valid_options(&env, &[1, 2, 3]);
|
|
219
|
+
let params = vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced }];
|
|
220
|
+
set_enforced_options_with_auth(&env, &owner, &oapp_client, ¶ms);
|
|
221
|
+
|
|
222
|
+
// extra has wrong option type (not 3) but len >= 2 -> validated and should panic
|
|
223
|
+
let mut extra_invalid = Bytes::from_array(&env, &(4u16).to_be_bytes());
|
|
224
|
+
extra_invalid.extend_from_slice(&[9, 9, 9]);
|
|
225
|
+
let result = oapp_client.try_combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_invalid);
|
|
226
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::InvalidOptions.into());
|
|
203
227
|
}
|
|
204
228
|
|
|
205
229
|
#[test]
|
|
206
|
-
fn
|
|
207
|
-
let TestSetup { env, oapp_client, .. } = setup();
|
|
230
|
+
fn test_combine_options_extra_too_short_returns_error_when_enforced_present() {
|
|
231
|
+
let TestSetup { env, owner, oapp_client, .. } = setup();
|
|
232
|
+
|
|
233
|
+
let enforced = create_valid_options(&env, &[1, 2, 3]);
|
|
234
|
+
let params = vec![&env, EnforcedOptionParam { eid: REMOTE_EID_1, msg_type: MSG_TYPE_SEND, options: enforced }];
|
|
235
|
+
set_enforced_options_with_auth(&env, &owner, &oapp_client, ¶ms);
|
|
208
236
|
|
|
209
|
-
//
|
|
210
|
-
let
|
|
211
|
-
|
|
237
|
+
// extra is non-empty but len < 2 -> should panic
|
|
238
|
+
let extra_too_short = Bytes::from_array(&env, &[1u8]);
|
|
239
|
+
let result = oapp_client.try_combine_options(&REMOTE_EID_1, &MSG_TYPE_SEND, &extra_too_short);
|
|
240
|
+
assert_eq!(result.err().unwrap().ok().unwrap(), OAppError::InvalidOptions.into());
|
|
212
241
|
}
|