@layerzerolabs/protocol-stellar-v2 0.2.19 → 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 +245 -222
- package/.turbo/turbo-lint.log +77 -70
- package/.turbo/turbo-test.log +1385 -1221
- package/Cargo.lock +13 -3
- package/Cargo.toml +2 -0
- package/contracts/ERROR_SPEC.md +8 -1
- 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 +22 -6
- 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/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/src/extensions/oft_fee.rs +18 -2
- 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/oft.rs +29 -41
- package/contracts/oapps/oft/src/oft_types/mint_burn.rs +3 -25
- package/contracts/oapps/oft-core/integration-tests/setup.rs +2 -2
- package/contracts/oapps/oft-core/src/oft_core.rs +247 -207
- package/contracts/oapps/oft-core/src/tests/test_utils.rs +4 -4
- 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 +3 -1
- 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 +3 -3
- package/sdk/.turbo/turbo-test.log +220 -218
- package/sdk/dist/generated/bml.d.ts +12 -4
- package/sdk/dist/generated/bml.js +8 -6
- package/sdk/dist/generated/counter.d.ts +12 -4
- package/sdk/dist/generated/counter.js +8 -6
- package/sdk/dist/generated/dvn.d.ts +404 -365
- package/sdk/dist/generated/dvn.js +55 -53
- package/sdk/dist/generated/dvn_fee_lib.d.ts +224 -268
- package/sdk/dist/generated/dvn_fee_lib.js +22 -53
- package/sdk/dist/generated/endpoint.d.ts +12 -4
- package/sdk/dist/generated/endpoint.js +8 -6
- package/sdk/dist/generated/executor.d.ts +370 -326
- package/sdk/dist/generated/executor.js +47 -44
- package/sdk/dist/generated/executor_fee_lib.d.ts +258 -302
- package/sdk/dist/generated/executor_fee_lib.js +21 -52
- package/sdk/dist/generated/executor_helper.d.ts +26 -190
- package/sdk/dist/generated/executor_helper.js +22 -27
- 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 +49 -40
- package/sdk/dist/generated/oft.js +25 -23
- package/sdk/dist/generated/price_feed.d.ts +225 -269
- package/sdk/dist/generated/price_feed.js +22 -53
- package/sdk/dist/generated/sml.d.ts +12 -4
- package/sdk/dist/generated/sml.js +8 -6
- package/sdk/dist/generated/treasury.d.ts +12 -4
- package/sdk/dist/generated/treasury.js +8 -6
- package/sdk/dist/generated/uln302.d.ts +12 -4
- package/sdk/dist/generated/uln302.js +10 -8
- package/sdk/dist/generated/upgrader.d.ts +189 -18
- package/sdk/dist/generated/upgrader.js +84 -4
- package/sdk/dist/index.d.ts +1 -0
- package/sdk/dist/index.js +2 -0
- package/sdk/package.json +1 -1
- package/sdk/src/index.ts +3 -0
- package/sdk/test/oft-sml.test.ts +4 -4
- package/sdk/test/upgrader.test.ts +2 -3
- package/tools/ts-bindings-gen/src/main.rs +2 -1
- /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
|
}
|