Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 21 additions & 35 deletions crates/e2e-tests/tests/request_during_resharing.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,23 @@
use crate::common;

use mpc_primitives::domain::{Curve, DomainId};
use mpc_primitives::domain::DomainId;
use near_mpc_contract_interface::types::{
DomainConfig, DomainPurpose, Protocol, ProtocolContractState, ReconstructionThreshold,
RunningContractState,
};
use rand::SeedableRng;

/// Panics if no domain matches; each protocol appears at most once in this test's domain set.
fn find_domain_id(contract_state: &RunningContractState, protocol_type: Protocol) -> DomainId {
contract_state
.domains
.domains
.iter()
.find(|d| d.protocol == protocol_type)
.unwrap_or_else(|| panic!("no domain with protocol {protocol_type:?}"))
Comment on lines +16 to +17

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit (non-blocking): .find() returns the first match and this only panics on zero matches — not on multiple. The doc says "each protocol appears at most once in this test's set," but nothing enforces it, and production actually has two CaitSith domains (Sign + ForeignTx). If default_for_test ever grows a second same-protocol domain, this would silently pick whichever comes first (the old purpose == Sign filter guarded against that). Cheap to make it fail loudly instead:

let mut matches = contract_state.domains.domains.iter().filter(|d| d.protocol == protocol_type);
let domain = matches.next().unwrap_or_else(|| panic!("no domain with protocol {protocol_type:?}"));
assert!(matches.next().is_none(), "multiple domains with protocol {protocol_type:?}");
domain.id

.id
}

/// Tests that signature and CKD requests are processed using the previous
/// running state's threshold while resharing is in progress.
///
Expand Down Expand Up @@ -46,43 +58,17 @@ async fn test_request_during_resharing() {
cluster.kill_nodes(&[5]).expect("failed to kill node 5");

// then
let ecdsa_domain = contract_state
.domains
.domains
.iter()
.find(|d| {
Curve::from(d.protocol) == Curve::Secp256k1
&& d.protocol == Protocol::CaitSith
&& d.purpose == DomainPurpose::Sign
})
.expect("no CaitSith Sign domain");
let robust_ecdsa_domain = contract_state
.domains
.domains
.iter()
.find(|d| d.protocol == Protocol::DamgardEtAl && d.purpose == DomainPurpose::Sign)
.expect("no DamgardEtAl Sign domain");
let eddsa_domain = contract_state
.domains
.domains
.iter()
.find(|d| {
Curve::from(d.protocol) == Curve::Edwards25519 && d.purpose == DomainPurpose::Sign
})
.expect("no Edwards25519 Sign domain");
let ckd_domain = contract_state
.domains
.domains
.iter()
.find(|d| d.purpose == DomainPurpose::CKD)
.expect("no CKD domain");
let ecdsa_domain_id = find_domain_id(&contract_state, Protocol::CaitSith);
let robust_ecdsa_domain_id = find_domain_id(&contract_state, Protocol::DamgardEtAl);
let eddsa_domain_id = find_domain_id(&contract_state, Protocol::Frost);
let ckd_domain_id = find_domain_id(&contract_state, Protocol::ConfidentialKeyDerivation);

let mut rng = rand::rngs::StdRng::seed_from_u64(0);
for i in 0..3 {
for (label, domain_id, is_eddsa) in [
("ECDSA", ecdsa_domain.id, false),
("robust ECDSA", robust_ecdsa_domain.id, false),
("EdDSA", eddsa_domain.id, true),
("ECDSA", ecdsa_domain_id, false),
("robust ECDSA", robust_ecdsa_domain_id, false),
("EdDSA", eddsa_domain_id, true),
] {
let payload = if is_eddsa {
common::generate_eddsa_payload(&mut rng)
Expand All @@ -104,7 +90,7 @@ async fn test_request_during_resharing() {
tracing::info!(i, "sending CKD request during resharing");
let outcome = cluster
.send_ckd_request(
ckd_domain.id,
ckd_domain_id,
common::generate_ckd_app_public_key(&mut rng),
cluster.default_user_account(),
)
Expand Down
Loading