Add handle_pairing

This commit is contained in:
NicolasCantu 2025-03-26 12:36:26 +01:00 committed by Nicolas Cantu
parent c59a89fecd
commit 416d409fb9

View File

@ -99,6 +99,32 @@ impl ProcessState {
} }
} }
fn handle_pairing(&self, pairing_role: RoleDefinition, previous_addresses: Vec<SilentPaymentAddress>) -> anyhow::Result<()> {
// members must be empty
if !pairing_role.members.is_empty() { return Err(anyhow::Error::msg("Invalid pairing role: members list must be empty")); }
// pairing_role must have one rule that modifies pairedAddresses
let paired_addresses_rule = pairing_role.get_applicable_rules(PAIREDADDRESSES);
if paired_addresses_rule.len() != 1 {
return Err(anyhow::anyhow!("Invalid pairing role: there must one and only one rule for \"pairedAddresses\""));
}
// We must have a pairedAddresses field in public_data
let updated_addresses = self.public_data.get(PAIREDADDRESSES).ok_or(anyhow::Error::msg("No paired addresses"))?; // This shouldn't happen
// TODO check that it matches what we have in the commitment here or somewhere else?
let updated_member = Member::new(serde_json::from_value(updated_addresses.clone())?);
let previous_member = Member::new(previous_addresses);
let members = if previous_member.get_addresses().is_empty() {
vec![&updated_member]
} else {
vec![&previous_member]
};
paired_addresses_rule.iter().next().unwrap().is_satisfied(PAIREDADDRESSES, self.state_id, &self.validation_tokens, members.as_slice())
}
pub fn is_valid(&self, previous_state: Option<&ProcessState>, members_list: &OutPointMemberMap) -> anyhow::Result<()> { pub fn is_valid(&self, previous_state: Option<&ProcessState>, members_list: &OutPointMemberMap) -> anyhow::Result<()> {
if self.validation_tokens.is_empty() { if self.validation_tokens.is_empty() {
return Err(anyhow::anyhow!( return Err(anyhow::anyhow!(