diff --git a/src/api.rs b/src/api.rs index 93ba732..3509d05 100644 --- a/src/api.rs +++ b/src/api.rs @@ -905,38 +905,59 @@ fn handle_prd( }); } PrdType::Response => { - let mut to_update = relevant_process - .get_latest_concurrent_states_mut()? - .into_iter() - .find(|r| { - r.pcd_commitment == prd.pcd_commitments - }) - .ok_or(anyhow::Error::msg("Original request not found"))?; + let update_state_id = prd.pcd_commitments.create_merkle_tree()?.root().ok_or(AnyhowError::msg("Invalid merkle tree"))?.to_lower_hex_string(); + let mut to_update = relevant_process.get_state_for_id_mut(&update_state_id)?; - to_update - .validation_tokens - .extend(prd.validation_tokens); + let new_validations = prd.validation_tokens; + let mut to_add: Vec<&Proof> = vec![]; + + for token in &new_validations { + let key = token.get_key(); + + // Check if the token key already exists + let already_exists = to_update + .validation_tokens + .iter() + .any(|existing_token| existing_token.get_key() == key); + + if !already_exists { + debug!("Adding token with key {}", key); + to_add.push(token); + } else { + debug!("Token with key {} already exists, skipping", key); + } + } + + // If there's no new proofs return early + if to_add.is_empty() { + return Err(AnyhowError::msg("No new validation tokens found in prd response")); + } + + // We add the new tokens and return all that was updated + to_update.validation_tokens.extend(to_add); let updated_state = to_update.clone(); let clear_state = to_update.decrypt_pcd()?; let roles = Value::Object(clear_state).extract_roles()?; + let modified_state = Some(to_update.state_id.clone()); + let mut commit_msg = CommitMessage::new_update_commitment( + OutPoint::from_str(&prd.root_commitment)?, + updated_state.pcd_commitment, + roles + ); + + commit_msg.set_validation_tokens(updated_state.validation_tokens); // We must return an update of the process let updated_process = UpdatedProcess { commitment_tx: OutPoint::from_str(&prd.root_commitment)?, current_process: relevant_process.clone(), - modified_state: Some(updated_state.state_id), + modified_state, ..Default::default() }; - let commit_msg = CommitMessage::new_update_commitment( - OutPoint::from_str(&prd.root_commitment)?, - updated_state.pcd_commitment, - roles - ); - return Ok(ApiReturn { updated_process: Some(updated_process), commit_to_send: Some(commit_msg), @@ -1359,7 +1380,7 @@ pub fn create_update_message( let full_prd = Prd::new_update( outpoint, - serde_json::to_string(&sender)?, + sender, roles, update_state.keys.clone(), update_state.pcd_commitment.clone(), @@ -1522,7 +1543,7 @@ pub fn create_response_prd(init_commitment: String, merkle_root_hex: String) -> let response_prd = Prd::new_response( outpoint, - serde_json::to_string(&sender)?, + sender, vec![*proof], update_state.pcd_commitment.clone(), );