diff --git a/src/process.rs b/src/process.rs index 4b261fb..9a319a8 100644 --- a/src/process.rs +++ b/src/process.rs @@ -99,6 +99,32 @@ impl ProcessState { } } + fn handle_pairing(&self, pairing_role: RoleDefinition, previous_addresses: Vec) -> 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<()> { if self.validation_tokens.is_empty() { return Err(anyhow::anyhow!(