@layerzerolabs/protocol-stellar-v2 0.2.122 → 0.2.124
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/endpoint-v2/src/tests/endpoint_v2/pay_messaging_fees.rs +7 -1
- package/endpoint-v2/src/tests/endpoint_v2/quote.rs +2 -2
- package/endpoint-v2/src/tests/endpoint_v2/ttl_config.rs +4 -1
- package/endpoint-v2/src/tests/endpoint_v2/verifiable.rs +0 -1
- package/endpoint-v2/src/tests/message_lib_manager/require_receive_lib_for_eid.rs +9 -3
- package/endpoint-v2/src/tests/message_lib_manager/require_send_lib_for_eid.rs +6 -2
- package/endpoint-v2/src/tests/message_lib_manager/require_supported_eid.rs +6 -2
- package/endpoint-v2/src/tests/messaging_channel/clear_payload.rs +1 -4
- package/endpoint-v2/src/tests/messaging_channel/inbound.rs +1 -4
- package/endpoint-v2/src/tests/messaging_channel/mod.rs +1 -1
- package/endpoint-v2/src/tests/messaging_channel/nilify.rs +3 -12
- package/endpoint-v2/src/tests/messaging_channel/pending_inbound_nonces.rs +0 -1
- package/endpoint-v2/src/tests/messaging_composer/lz_compose_alert.rs +1 -0
- package/message-libs/uln-302/src/tests/send_uln302/send.rs +20 -4
- package/message-libs/uln-302/src/tests/uln302/get_app_receive_uln_config.rs +2 -2
- package/package.json +8 -8
- package/rustfmt.toml +8 -11
- package/upgrader/src/tests/mod.rs +1 -1
- package/workers/dvn/src/tests/auth.rs +12 -60
- package/workers/executor/src/auth.rs +3 -8
- package/workers/executor/src/storage.rs +1 -1
- package/workers/executor/src/tests/auth.rs +6 -1
- package/workers/executor/src/tests/executor.rs +5 -5
- package/workers/executor/src/tests/setup.rs +1 -2
- package/workers/executor-fee-lib/src/tests/executor_fee_lib.rs +5 -5
- package/workers/executor-fee-lib/src/tests/executor_option.rs +2 -2
- package/workers/executor-helper/src/executor_helper.rs +0 -1
- package/workers/executor-helper/src/tests/executor_helper.rs +0 -1
- package/workers/price-feed/src/tests/price_feed.rs +11 -11
- package/workers/worker/src/tests/worker.rs +27 -27
- package/docs/error-spec.md +0 -55
- package/docs/layerzero-v2-on-stellar.md +0 -511
- package/docs/oapp-guide.md +0 -5
- package/docs/oft-guide.md +0 -5
|
@@ -23,7 +23,13 @@ fn pay_messaging_fees(
|
|
|
23
23
|
let env = &context.env;
|
|
24
24
|
let endpoint_addr = &context.endpoint_client.address;
|
|
25
25
|
env.as_contract(endpoint_addr, || {
|
|
26
|
-
EndpointV2::pay_messaging_fees_for_test(
|
|
26
|
+
EndpointV2::pay_messaging_fees_for_test(
|
|
27
|
+
env,
|
|
28
|
+
pay_in_zro,
|
|
29
|
+
native_fee_recipients,
|
|
30
|
+
zro_fee_recipients,
|
|
31
|
+
refund_address,
|
|
32
|
+
)
|
|
27
33
|
})
|
|
28
34
|
}
|
|
29
35
|
|
|
@@ -304,8 +304,8 @@ fn test_quote_with_large_message() {
|
|
|
304
304
|
|
|
305
305
|
// Create a large message (1024 bytes)
|
|
306
306
|
let mut large_message_data = [0u8; 1024];
|
|
307
|
-
for i in
|
|
308
|
-
|
|
307
|
+
for (i, byte) in large_message_data.iter_mut().enumerate() {
|
|
308
|
+
*byte = (i % 256) as u8;
|
|
309
309
|
}
|
|
310
310
|
let large_message = Bytes::from_array(env, &large_message_data);
|
|
311
311
|
|
|
@@ -141,7 +141,10 @@ fn test_freeze_ttl_configs_already_frozen() {
|
|
|
141
141
|
|
|
142
142
|
// Try to freeze again
|
|
143
143
|
context.mock_owner_auth("freeze_ttl_configs", ());
|
|
144
|
-
assert_eq!(
|
|
144
|
+
assert_eq!(
|
|
145
|
+
endpoint.try_freeze_ttl_configs().unwrap_err().unwrap(),
|
|
146
|
+
TtlConfigurableError::TtlConfigAlreadyFrozen.into()
|
|
147
|
+
);
|
|
145
148
|
}
|
|
146
149
|
|
|
147
150
|
#[test]
|
|
@@ -146,7 +146,6 @@ fn test_verifiable_upper_bound_is_enforced_when_inbound_nonce_nonzero() {
|
|
|
146
146
|
assert!(!endpoint_client.verifiable(&too_far, &receiver));
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
-
|
|
150
149
|
#[test]
|
|
151
150
|
fn test_verifiable_true_when_payload_hash_exists_even_if_nonce_outside_window() {
|
|
152
151
|
let context = setup();
|
|
@@ -11,7 +11,9 @@ fn test_require_receive_lib_for_eid_unregistered_lib() {
|
|
|
11
11
|
let endpoint_client = &context.endpoint_client;
|
|
12
12
|
|
|
13
13
|
let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
|
|
14
|
-
env.as_contract(&endpoint_client.address, ||
|
|
14
|
+
env.as_contract(&endpoint_client.address, || {
|
|
15
|
+
EndpointV2::require_receive_lib_for_eid_for_test(env, &lib, context.eid)
|
|
16
|
+
});
|
|
15
17
|
}
|
|
16
18
|
|
|
17
19
|
#[test]
|
|
@@ -24,7 +26,9 @@ fn test_require_receive_lib_for_eid_wrong_lib_type() {
|
|
|
24
26
|
let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
|
|
25
27
|
context.register_library_with_auth(&lib);
|
|
26
28
|
|
|
27
|
-
env.as_contract(&endpoint_client.address, ||
|
|
29
|
+
env.as_contract(&endpoint_client.address, || {
|
|
30
|
+
EndpointV2::require_receive_lib_for_eid_for_test(env, &lib, context.eid)
|
|
31
|
+
});
|
|
28
32
|
}
|
|
29
33
|
|
|
30
34
|
#[test]
|
|
@@ -38,7 +42,9 @@ fn test_require_receive_lib_for_eid_unsupported_eid() {
|
|
|
38
42
|
let lib = context.setup_mock_message_lib(MessageLibType::Receive, vec![env, context.eid]);
|
|
39
43
|
context.register_library_with_auth(&lib);
|
|
40
44
|
|
|
41
|
-
env.as_contract(&endpoint_client.address, ||
|
|
45
|
+
env.as_contract(&endpoint_client.address, || {
|
|
46
|
+
EndpointV2::require_receive_lib_for_eid_for_test(env, &lib, unsupported_eid)
|
|
47
|
+
});
|
|
42
48
|
}
|
|
43
49
|
|
|
44
50
|
#[test]
|
|
@@ -38,7 +38,9 @@ fn test_require_send_lib_for_eid_unsupported_eid() {
|
|
|
38
38
|
let lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
|
|
39
39
|
context.register_library_with_auth(&lib);
|
|
40
40
|
|
|
41
|
-
env.as_contract(&endpoint_client.address, ||
|
|
41
|
+
env.as_contract(&endpoint_client.address, || {
|
|
42
|
+
EndpointV2::require_send_lib_for_eid_for_test(env, &lib, unsupported_eid)
|
|
43
|
+
});
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
#[test]
|
|
@@ -49,7 +51,9 @@ fn test_require_send_lib_for_eid_success_for_send_and_send_and_receive() {
|
|
|
49
51
|
|
|
50
52
|
let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
|
|
51
53
|
context.register_library_with_auth(&send_lib);
|
|
52
|
-
env.as_contract(&endpoint_client.address, ||
|
|
54
|
+
env.as_contract(&endpoint_client.address, || {
|
|
55
|
+
EndpointV2::require_send_lib_for_eid_for_test(env, &send_lib, context.eid)
|
|
56
|
+
});
|
|
53
57
|
|
|
54
58
|
let send_and_receive = context.setup_mock_message_lib(MessageLibType::SendAndReceive, vec![env, context.eid]);
|
|
55
59
|
context.register_library_with_auth(&send_and_receive);
|
|
@@ -10,7 +10,9 @@ fn test_require_supported_eid_with_supported() {
|
|
|
10
10
|
let endpoint_client = &context.endpoint_client;
|
|
11
11
|
|
|
12
12
|
let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
|
|
13
|
-
env.as_contract(&endpoint_client.address, ||
|
|
13
|
+
env.as_contract(&endpoint_client.address, || {
|
|
14
|
+
EndpointV2::require_supported_eid_for_test(env, &send_lib, context.eid)
|
|
15
|
+
});
|
|
14
16
|
}
|
|
15
17
|
|
|
16
18
|
// The require_supported_eid rejects when the library does not support the EID
|
|
@@ -23,7 +25,9 @@ fn test_require_supported_eid_with_unsupported() {
|
|
|
23
25
|
|
|
24
26
|
let unsupported_eid = context.eid + 1;
|
|
25
27
|
let send_lib = context.setup_mock_message_lib(MessageLibType::Send, vec![env, context.eid]);
|
|
26
|
-
env.as_contract(&endpoint_client.address, ||
|
|
28
|
+
env.as_contract(&endpoint_client.address, || {
|
|
29
|
+
EndpointV2::require_supported_eid_for_test(env, &send_lib, unsupported_eid)
|
|
30
|
+
});
|
|
27
31
|
}
|
|
28
32
|
|
|
29
33
|
// The require_supported_eid panics if the library address has no deployed contract
|
|
@@ -239,10 +239,7 @@ fn test_clear_payload_missing_intermediate_nonce() {
|
|
|
239
239
|
|
|
240
240
|
// inbound_nonce should be 1 (nonce 2 is missing), and nonce 3 should be pending.
|
|
241
241
|
assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 1);
|
|
242
|
-
assert_eq!(
|
|
243
|
-
endpoint_client.pending_inbound_nonces(&receiver, &src_eid, &sender),
|
|
244
|
-
soroban_sdk::vec![env, 3u64]
|
|
245
|
-
);
|
|
242
|
+
assert_eq!(endpoint_client.pending_inbound_nonces(&receiver, &src_eid, &sender), soroban_sdk::vec![env, 3u64]);
|
|
246
243
|
|
|
247
244
|
// Clearing nonce 1 succeeds.
|
|
248
245
|
clear_payload(&context, &receiver, src_eid, &sender, 1, &payload1);
|
|
@@ -191,10 +191,7 @@ fn test_inbound_accepts_upper_bound_when_inbound_nonce_nonzero() {
|
|
|
191
191
|
|
|
192
192
|
// Nonce 356 is not consecutive to 100, so it stays pending and inbound_nonce does not advance.
|
|
193
193
|
assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 100);
|
|
194
|
-
assert_eq!(
|
|
195
|
-
endpoint_client.pending_inbound_nonces(&receiver, &src_eid, &sender),
|
|
196
|
-
soroban_sdk::vec![env, 356u64]
|
|
197
|
-
);
|
|
194
|
+
assert_eq!(endpoint_client.pending_inbound_nonces(&receiver, &src_eid, &sender), soroban_sdk::vec![env, 356u64]);
|
|
198
195
|
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &356u64), Some(hash));
|
|
199
196
|
}
|
|
200
197
|
|
|
@@ -193,24 +193,15 @@ fn test_nilify_closes_gap_and_drains_pending_nonces() {
|
|
|
193
193
|
});
|
|
194
194
|
|
|
195
195
|
assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 1);
|
|
196
|
-
assert_eq!(
|
|
197
|
-
endpoint_client.pending_inbound_nonces(&receiver, &src_eid, &sender),
|
|
198
|
-
soroban_sdk::vec![env, 3u64]
|
|
199
|
-
);
|
|
196
|
+
assert_eq!(endpoint_client.pending_inbound_nonces(&receiver, &src_eid, &sender), soroban_sdk::vec![env, 3u64]);
|
|
200
197
|
|
|
201
198
|
// Nilify nonce 2 with None closes the gap and should drain pending to advance inbound nonce to 3.
|
|
202
199
|
nilify_with_auth(&context, &receiver, &receiver, src_eid, &sender, 2u64, &None);
|
|
203
200
|
|
|
204
201
|
assert_eq!(endpoint_client.inbound_nonce(&receiver, &src_eid, &sender), 3);
|
|
205
202
|
assert!(endpoint_client.pending_inbound_nonces(&receiver, &src_eid, &sender).is_empty());
|
|
206
|
-
assert_eq!(
|
|
207
|
-
|
|
208
|
-
Some(nil_hash(&context))
|
|
209
|
-
);
|
|
210
|
-
assert_eq!(
|
|
211
|
-
endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &3u64),
|
|
212
|
-
Some(payload_hash_3)
|
|
213
|
-
);
|
|
203
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &2u64), Some(nil_hash(&context)));
|
|
204
|
+
assert_eq!(endpoint_client.inbound_payload_hash(&receiver, &src_eid, &sender, &3u64), Some(payload_hash_3));
|
|
214
205
|
}
|
|
215
206
|
|
|
216
207
|
// Nilify is allowed when nonce <= inbound_nonce if an `inbound_payload_hash` exists
|
|
@@ -108,4 +108,3 @@ fn test_pending_inbound_nonces_isolated_by_path() {
|
|
|
108
108
|
assert_eq!(endpoint_client.pending_inbound_nonces(&receiver_a, &src_eid_b, &sender_a), vec![env, 2u64]);
|
|
109
109
|
assert_eq!(endpoint_client.pending_inbound_nonces(&receiver_a, &src_eid_a, &sender_b), vec![env, 2u64]);
|
|
110
110
|
}
|
|
111
|
-
|
|
@@ -76,8 +76,16 @@ fn test_send_events_emittance() {
|
|
|
76
76
|
&setup.env,
|
|
77
77
|
&setup.uln302.address,
|
|
78
78
|
&[
|
|
79
|
-
&ExecutorFeePaid {
|
|
80
|
-
|
|
79
|
+
&ExecutorFeePaid {
|
|
80
|
+
guid: packet.guid.clone(),
|
|
81
|
+
executor: executor.clone(),
|
|
82
|
+
fee: native_fee_recipients.get(0).unwrap().clone(),
|
|
83
|
+
},
|
|
84
|
+
&DVNFeePaid {
|
|
85
|
+
guid: packet.guid.clone(),
|
|
86
|
+
dvns: dvns.slice(0..2).clone(),
|
|
87
|
+
fees: native_fee_recipients.slice(1..3).clone(),
|
|
88
|
+
},
|
|
81
89
|
],
|
|
82
90
|
);
|
|
83
91
|
|
|
@@ -164,8 +172,16 @@ fn test_send_events_emittance_with_zro() {
|
|
|
164
172
|
&setup.env,
|
|
165
173
|
&setup.uln302.address,
|
|
166
174
|
&[
|
|
167
|
-
&ExecutorFeePaid {
|
|
168
|
-
|
|
175
|
+
&ExecutorFeePaid {
|
|
176
|
+
guid: packet.guid.clone(),
|
|
177
|
+
executor: executor.clone(),
|
|
178
|
+
fee: native_fee_recipients.get(0).unwrap().clone(),
|
|
179
|
+
},
|
|
180
|
+
&DVNFeePaid {
|
|
181
|
+
guid: packet.guid.clone(),
|
|
182
|
+
dvns: dvns.slice(0..2).clone(),
|
|
183
|
+
fees: native_fee_recipients.slice(1..3).clone(),
|
|
184
|
+
},
|
|
169
185
|
],
|
|
170
186
|
);
|
|
171
187
|
|
|
@@ -34,8 +34,8 @@ fn test_get_oapp_receive_uln_config() {
|
|
|
34
34
|
endpoint.set_config(&Address::generate(&env), &oapp, &uln302.address, ¶ms);
|
|
35
35
|
|
|
36
36
|
let oapp_config = uln302.oapp_receive_uln_config(&oapp, &eid).unwrap();
|
|
37
|
-
|
|
38
|
-
|
|
37
|
+
assert!(oapp_config.use_default_confirmations);
|
|
38
|
+
assert!(!oapp_config.use_default_required_dvns);
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
#[test]
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@layerzerolabs/protocol-stellar-v2",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.124",
|
|
4
4
|
"private": false,
|
|
5
5
|
"license": "LZBL-1.3",
|
|
6
6
|
"files": [
|
|
@@ -9,19 +9,18 @@
|
|
|
9
9
|
"message-libs",
|
|
10
10
|
"upgrader",
|
|
11
11
|
"workers",
|
|
12
|
-
"docs",
|
|
13
12
|
"Cargo.toml",
|
|
14
13
|
"rust-toolchain.toml",
|
|
15
14
|
"rustfmt.toml",
|
|
16
15
|
"clippy.toml"
|
|
17
16
|
],
|
|
18
17
|
"dependencies": {
|
|
19
|
-
"@layerzerolabs/common-utils-stellar-contracts": "0.2.
|
|
20
|
-
"@layerzerolabs/common-utils-
|
|
18
|
+
"@layerzerolabs/common-utils-macros-stellar-contracts": "0.2.124",
|
|
19
|
+
"@layerzerolabs/common-utils-stellar-contracts": "0.2.124"
|
|
21
20
|
},
|
|
22
21
|
"devDependencies": {
|
|
23
|
-
"@layerzerolabs/build-utils-rust": "0.2.
|
|
24
|
-
"@layerzerolabs/vm-tooling-stellar": "0.2.
|
|
22
|
+
"@layerzerolabs/build-utils-rust": "0.2.124",
|
|
23
|
+
"@layerzerolabs/vm-tooling-stellar": "0.2.124"
|
|
25
24
|
},
|
|
26
25
|
"publishConfig": {
|
|
27
26
|
"access": "public",
|
|
@@ -46,8 +45,9 @@
|
|
|
46
45
|
"build:native": "pnpm build:contracts:native",
|
|
47
46
|
"clean": "rm -rf ./dependencies ./target ./node_modules",
|
|
48
47
|
"format": "pnpm exec lz-tool --script \"cargo fmt\" stellar",
|
|
49
|
-
"
|
|
50
|
-
"lint
|
|
48
|
+
"format:check": "pnpm exec lz-tool --script \"cargo fmt -- --check\" stellar",
|
|
49
|
+
"lint": "pnpm resolve-dependencies && pnpm exec lz-tool --script \"cargo fmt -- --check && cargo clippy --all-targets -- -D warnings\" stellar",
|
|
50
|
+
"lint:fix": "pnpm resolve-dependencies && pnpm exec lz-tool --script \"cargo clippy --all-targets --fix --allow-dirty --allow-staged && cargo fmt\" stellar",
|
|
51
51
|
"resolve-dependencies": "pnpm exec build-utils-rust resolve",
|
|
52
52
|
"test": "pnpm resolve-dependencies && pnpm exec lz-tool --script \"cargo nextest run\" stellar",
|
|
53
53
|
"test:snapshot:check": "pnpm exec turbo-snapshot check",
|
package/rustfmt.toml
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
1
|
+
# Only stable rustfmt options are kept here: the Stellar docker toolchain runs
|
|
2
|
+
# rustfmt on the stable channel (rust 1.90.0), which silently drops unstable
|
|
3
|
+
# options (they only apply on nightly). Do not re-add unstable options unless the
|
|
4
|
+
# tooling is switched to a pinned nightly (see the Solana packages for that setup).
|
|
2
5
|
max_width = 120
|
|
3
|
-
format_macro_matchers = true
|
|
4
|
-
format_strings = true
|
|
5
|
-
imports_granularity = "Crate"
|
|
6
|
-
match_arm_blocks = false
|
|
7
|
-
reorder_impl_items = true
|
|
8
|
-
group_imports = "StdExternalCrate"
|
|
9
6
|
use_field_init_shorthand = true
|
|
10
7
|
use_small_heuristics = "Max"
|
|
11
|
-
wrap_comments = true
|
|
12
|
-
format_code_in_doc_comments = true
|
|
13
8
|
|
|
14
|
-
#
|
|
15
|
-
|
|
9
|
+
# style_edition is a stable option honored by the docker toolchain. Pin it to
|
|
10
|
+
# 2021 to match every crate's `edition = "2021"` so formatting stays stable
|
|
11
|
+
# across rustfmt versions (setting it to 2024 would reformat the code).
|
|
12
|
+
style_edition = "2021"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
pub mod test_upgrader;
|
|
1
|
+
pub mod test_upgrader;
|
|
@@ -6,7 +6,7 @@ use crate::{
|
|
|
6
6
|
use ed25519_dalek::{Signer, SigningKey};
|
|
7
7
|
use rand::thread_rng;
|
|
8
8
|
use soroban_sdk::{
|
|
9
|
-
auth::{
|
|
9
|
+
auth::{Context, ContractContext},
|
|
10
10
|
testutils::Address as _,
|
|
11
11
|
vec, Address, BytesN, Env, IntoVal, Symbol, Val, Vec,
|
|
12
12
|
};
|
|
@@ -35,10 +35,7 @@ impl Ed25519KeyPair {
|
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
/// Creates a single self-call auth context and matching Call for testing.
|
|
38
|
-
fn make_self_call_context(
|
|
39
|
-
env: &Env,
|
|
40
|
-
contract_id: &soroban_sdk::Address,
|
|
41
|
-
) -> (Vec<Context>, Vec<Call>) {
|
|
38
|
+
fn make_self_call_context(env: &Env, contract_id: &soroban_sdk::Address) -> (Vec<Context>, Vec<Call>) {
|
|
42
39
|
let fn_name = Symbol::new(env, "set_paused");
|
|
43
40
|
let args: Vec<Val> = vec![env, true.into_val(env)];
|
|
44
41
|
|
|
@@ -67,12 +64,7 @@ fn make_upgrade_contexts(
|
|
|
67
64
|
let upgrader_ctx = Context::Contract(ContractContext {
|
|
68
65
|
contract: upgrader_id.clone(),
|
|
69
66
|
fn_name: Symbol::new(env, "upgrade_and_migrate"),
|
|
70
|
-
args: vec![
|
|
71
|
-
env,
|
|
72
|
-
contract_id.clone().into_val(env),
|
|
73
|
-
wasm_hash_val.clone(),
|
|
74
|
-
migration_data_val.clone(),
|
|
75
|
-
],
|
|
67
|
+
args: vec![env, contract_id.clone().into_val(env), wasm_hash_val, migration_data_val],
|
|
76
68
|
});
|
|
77
69
|
// [1]: upgrade self-call
|
|
78
70
|
let upgrade_ctx = Context::Contract(ContractContext {
|
|
@@ -374,12 +366,7 @@ fn test_check_auth_sender_none_fails_when_admin_required() {
|
|
|
374
366
|
let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
|
|
375
367
|
|
|
376
368
|
// Use Sender::None which should fail when admin is required
|
|
377
|
-
let tx_auth = TransactionAuthData {
|
|
378
|
-
vid: VID,
|
|
379
|
-
expiration,
|
|
380
|
-
signatures: vec![&env, sig],
|
|
381
|
-
sender: Sender::None,
|
|
382
|
-
};
|
|
369
|
+
let tx_auth = TransactionAuthData { vid: VID, expiration, signatures: vec![&env, sig], sender: Sender::None };
|
|
383
370
|
|
|
384
371
|
let res = env.try_invoke_contract_check_auth::<DvnError>(
|
|
385
372
|
&setup.contract_id,
|
|
@@ -410,26 +397,15 @@ fn test_check_auth_set_admin_bypasses_admin_verification() {
|
|
|
410
397
|
|
|
411
398
|
let payload = BytesN::from_array(&env, &[0u8; 32]);
|
|
412
399
|
|
|
413
|
-
let calls: Vec<Call> =
|
|
414
|
-
&env,
|
|
415
|
-
Call {
|
|
416
|
-
to: setup.contract_id.clone(),
|
|
417
|
-
func: Symbol::new(&env, "set_admin"),
|
|
418
|
-
args: Vec::new(&env),
|
|
419
|
-
},
|
|
420
|
-
];
|
|
400
|
+
let calls: Vec<Call> =
|
|
401
|
+
vec![&env, Call { to: setup.contract_id.clone(), func: Symbol::new(&env, "set_admin"), args: Vec::new(&env) }];
|
|
421
402
|
|
|
422
403
|
let dvn_client = LzDVNClient::new(&env, &setup.contract_id);
|
|
423
404
|
let hash = dvn_client.hash_call_data(&VID, &expiration, &calls);
|
|
424
405
|
let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
|
|
425
406
|
|
|
426
407
|
// Use Sender::None - should succeed for set_admin since it bypasses admin verification
|
|
427
|
-
let tx_auth = TransactionAuthData {
|
|
428
|
-
vid: VID,
|
|
429
|
-
expiration,
|
|
430
|
-
signatures: vec![&env, sig],
|
|
431
|
-
sender: Sender::None,
|
|
432
|
-
};
|
|
408
|
+
let tx_auth = TransactionAuthData { vid: VID, expiration, signatures: vec![&env, sig], sender: Sender::None };
|
|
433
409
|
|
|
434
410
|
let res = env.try_invoke_contract_check_auth::<DvnError>(
|
|
435
411
|
&setup.contract_id,
|
|
@@ -599,23 +575,14 @@ fn test_set_upgrader_requires_admin() {
|
|
|
599
575
|
|
|
600
576
|
let calls: Vec<Call> = vec![
|
|
601
577
|
&env,
|
|
602
|
-
Call {
|
|
603
|
-
to: setup.contract_id.clone(),
|
|
604
|
-
func: Symbol::new(&env, "set_upgrader"),
|
|
605
|
-
args: Vec::new(&env),
|
|
606
|
-
},
|
|
578
|
+
Call { to: setup.contract_id.clone(), func: Symbol::new(&env, "set_upgrader"), args: Vec::new(&env) },
|
|
607
579
|
];
|
|
608
580
|
|
|
609
581
|
let dvn_client = LzDVNClient::new(&env, &setup.contract_id);
|
|
610
582
|
let hash = dvn_client.hash_call_data(&VID, &expiration, &calls);
|
|
611
583
|
let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
|
|
612
584
|
|
|
613
|
-
let tx_auth = TransactionAuthData {
|
|
614
|
-
vid: VID,
|
|
615
|
-
expiration,
|
|
616
|
-
signatures: vec![&env, sig],
|
|
617
|
-
sender: Sender::None,
|
|
618
|
-
};
|
|
585
|
+
let tx_auth = TransactionAuthData { vid: VID, expiration, signatures: vec![&env, sig], sender: Sender::None };
|
|
619
586
|
|
|
620
587
|
let res = env.try_invoke_contract_check_auth::<DvnError>(
|
|
621
588
|
&setup.contract_id,
|
|
@@ -692,12 +659,7 @@ fn test_check_auth_upgrade_no_upgrader_set() {
|
|
|
692
659
|
let hash = dvn_client.hash_call_data(&VID, &expiration, &calls);
|
|
693
660
|
let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
|
|
694
661
|
|
|
695
|
-
let tx_auth = TransactionAuthData {
|
|
696
|
-
vid: VID,
|
|
697
|
-
expiration,
|
|
698
|
-
signatures: vec![&env, sig],
|
|
699
|
-
sender: Sender::None,
|
|
700
|
-
};
|
|
662
|
+
let tx_auth = TransactionAuthData { vid: VID, expiration, signatures: vec![&env, sig], sender: Sender::None };
|
|
701
663
|
|
|
702
664
|
let res = env.try_invoke_contract_check_auth::<DvnError>(
|
|
703
665
|
&setup.contract_id,
|
|
@@ -733,12 +695,7 @@ fn test_check_auth_upgrade_wrong_upgrader() {
|
|
|
733
695
|
let hash = dvn_client.hash_call_data(&VID, &expiration, &calls);
|
|
734
696
|
let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
|
|
735
697
|
|
|
736
|
-
let tx_auth = TransactionAuthData {
|
|
737
|
-
vid: VID,
|
|
738
|
-
expiration,
|
|
739
|
-
signatures: vec![&env, sig],
|
|
740
|
-
sender: Sender::None,
|
|
741
|
-
};
|
|
698
|
+
let tx_auth = TransactionAuthData { vid: VID, expiration, signatures: vec![&env, sig], sender: Sender::None };
|
|
742
699
|
|
|
743
700
|
let res = env.try_invoke_contract_check_auth::<DvnError>(
|
|
744
701
|
&setup.contract_id,
|
|
@@ -784,12 +741,7 @@ fn test_check_auth_upgrade_missing_migrate() {
|
|
|
784
741
|
let hash = dvn_client.hash_call_data(&VID, &expiration, &dummy_calls);
|
|
785
742
|
let sig = setup.key_pairs[0].sign_bytes(&env, &hash);
|
|
786
743
|
|
|
787
|
-
let tx_auth = TransactionAuthData {
|
|
788
|
-
vid: VID,
|
|
789
|
-
expiration,
|
|
790
|
-
signatures: vec![&env, sig],
|
|
791
|
-
sender: Sender::None,
|
|
792
|
-
};
|
|
744
|
+
let tx_auth = TransactionAuthData { vid: VID, expiration, signatures: vec![&env, sig], sender: Sender::None };
|
|
793
745
|
|
|
794
746
|
let res = env.try_invoke_contract_check_auth::<DvnError>(
|
|
795
747
|
&setup.contract_id,
|
|
@@ -111,13 +111,10 @@ impl LzExecutor {
|
|
|
111
111
|
}
|
|
112
112
|
|
|
113
113
|
// Helper path: first context must be on the registered executor helper
|
|
114
|
-
let helper_config =
|
|
115
|
-
ExecutorStorage::executor_helper(env).ok_or(ExecutorError::UnauthorizedContext)?;
|
|
114
|
+
let helper_config = ExecutorStorage::executor_helper(env).ok_or(ExecutorError::UnauthorizedContext)?;
|
|
116
115
|
|
|
117
116
|
// Validate first context: must be the helper address with an allowed function name
|
|
118
|
-
if first_ctx.contract != helper_config.address
|
|
119
|
-
|| !helper_config.allowed_functions.contains(first_fn_name)
|
|
120
|
-
{
|
|
117
|
+
if first_ctx.contract != helper_config.address || !helper_config.allowed_functions.contains(first_fn_name) {
|
|
121
118
|
return Err(ExecutorError::UnauthorizedContext);
|
|
122
119
|
}
|
|
123
120
|
|
|
@@ -128,9 +125,7 @@ impl LzExecutor {
|
|
|
128
125
|
};
|
|
129
126
|
|
|
130
127
|
let second_fn_name = &second_ctx.fn_name;
|
|
131
|
-
if *second_fn_name != Symbol::new(env, "lz_receive")
|
|
132
|
-
&& *second_fn_name != Symbol::new(env, "lz_compose")
|
|
133
|
-
{
|
|
128
|
+
if *second_fn_name != Symbol::new(env, "lz_receive") && *second_fn_name != Symbol::new(env, "lz_compose") {
|
|
134
129
|
return Err(ExecutorError::UnauthorizedContext);
|
|
135
130
|
}
|
|
136
131
|
|
|
@@ -252,7 +252,12 @@ fn test_check_auth_rejects_invalid_helper_fn_name() {
|
|
|
252
252
|
let bad_addr: Vec<Context> = vec![
|
|
253
253
|
&setup.env,
|
|
254
254
|
contract_ctx(&setup.env, wrong_helper, "execute", Vec::new(&setup.env)),
|
|
255
|
-
contract_ctx(
|
|
255
|
+
contract_ctx(
|
|
256
|
+
&setup.env,
|
|
257
|
+
Address::generate(&setup.env),
|
|
258
|
+
"lz_receive",
|
|
259
|
+
vec![&setup.env, 0i128.into_val(&setup.env)],
|
|
260
|
+
),
|
|
256
261
|
];
|
|
257
262
|
assert_eq!(check_auth(&setup, &payload, sig, &bad_addr), Err(Ok(ExecutorError::UnauthorizedContext)));
|
|
258
263
|
}
|
|
@@ -16,8 +16,8 @@ fn test_constructor_sets_endpoint_and_worker_config() {
|
|
|
16
16
|
|
|
17
17
|
assert_eq!(setup.client.owner(), Some(setup.owner.clone()));
|
|
18
18
|
assert_eq!(setup.client.admins(), setup.admins);
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
assert!(setup.client.is_admin(&setup.admins.get(0).unwrap()));
|
|
20
|
+
assert!(setup.client.is_supported_message_lib(&setup.send_lib));
|
|
21
21
|
assert_eq!(setup.client.message_libs(), vec![&setup.env, setup.send_lib.clone()]);
|
|
22
22
|
|
|
23
23
|
assert_eq!(setup.client.endpoint(), setup.endpoint);
|
|
@@ -25,7 +25,7 @@ fn test_constructor_sets_endpoint_and_worker_config() {
|
|
|
25
25
|
assert_eq!(setup.client.price_feed(), Some(setup.price_feed.clone()));
|
|
26
26
|
assert_eq!(setup.client.worker_fee_lib(), Some(setup.worker_fee_lib.clone()));
|
|
27
27
|
assert_eq!(setup.client.default_multiplier_bps(), setup.default_multiplier_bps);
|
|
28
|
-
|
|
28
|
+
assert!(!setup.client.paused());
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
// =============================================================================
|
|
@@ -71,12 +71,12 @@ fn test_set_admin_add_and_remove() {
|
|
|
71
71
|
// Add new admin
|
|
72
72
|
setup.mock_owner_auth("set_admin", (&new_admin, true));
|
|
73
73
|
setup.client.set_admin(&new_admin, &true);
|
|
74
|
-
|
|
74
|
+
assert!(setup.client.is_admin(&new_admin));
|
|
75
75
|
|
|
76
76
|
// Remove that admin
|
|
77
77
|
setup.mock_owner_auth("set_admin", (&new_admin, false));
|
|
78
78
|
setup.client.set_admin(&new_admin, &false);
|
|
79
|
-
|
|
79
|
+
assert!(!setup.client.is_admin(&new_admin));
|
|
80
80
|
}
|
|
81
81
|
|
|
82
82
|
#[test]
|
|
@@ -167,8 +167,7 @@ impl<'a> TestSetup<'a> {
|
|
|
167
167
|
|
|
168
168
|
// Register executor helper config directly in storage
|
|
169
169
|
let executor_helper = Address::generate(&env);
|
|
170
|
-
let allowed_functions: Vec<Symbol> =
|
|
171
|
-
vec![&env, Symbol::new(&env, "execute"), Symbol::new(&env, "compose")];
|
|
170
|
+
let allowed_functions: Vec<Symbol> = vec![&env, Symbol::new(&env, "execute"), Symbol::new(&env, "compose")];
|
|
172
171
|
env.as_contract(&contract_id, || {
|
|
173
172
|
crate::storage::ExecutorStorage::set_executor_helper(
|
|
174
173
|
&env,
|
|
@@ -546,13 +546,13 @@ fn test_is_v1_eid() {
|
|
|
546
546
|
let env = Env::default();
|
|
547
547
|
|
|
548
548
|
// V1: eid < 30000
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
549
|
+
assert!(ExecutorFeeLib::is_v1_eid_for_test(&env, 0));
|
|
550
|
+
assert!(ExecutorFeeLib::is_v1_eid_for_test(&env, 1));
|
|
551
|
+
assert!(ExecutorFeeLib::is_v1_eid_for_test(&env, 29_999));
|
|
552
552
|
|
|
553
553
|
// V2: eid >= 30000
|
|
554
|
-
|
|
555
|
-
|
|
554
|
+
assert!(!ExecutorFeeLib::is_v1_eid_for_test(&env, 30_000));
|
|
555
|
+
assert!(!ExecutorFeeLib::is_v1_eid_for_test(&env, 30_001));
|
|
556
556
|
}
|
|
557
557
|
|
|
558
558
|
#[test]
|
|
@@ -23,7 +23,7 @@ fn test_parse_executor_options_aggregates_values() {
|
|
|
23
23
|
assert_eq!(agg.total_gas, 17); // 10 + 7
|
|
24
24
|
assert_eq!(agg.total_value, 10); // 2 + 5 + 3
|
|
25
25
|
assert_eq!(agg.num_lz_compose, 1);
|
|
26
|
-
|
|
26
|
+
assert!(agg.ordered);
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
#[test]
|
|
@@ -53,7 +53,7 @@ fn test_parse_executor_options_accumulates_multiple_lz_receive_gas_and_value() {
|
|
|
53
53
|
assert_eq!(agg.total_gas, 30);
|
|
54
54
|
assert_eq!(agg.total_value, 5);
|
|
55
55
|
assert_eq!(agg.num_lz_compose, 0);
|
|
56
|
-
|
|
56
|
+
assert!(!agg.ordered);
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
#[test]
|