diff --git a/src/process.rs b/src/process.rs index 3abe6e6..df71038 100644 --- a/src/process.rs +++ b/src/process.rs @@ -9,12 +9,11 @@ use sp_client::bitcoin::{OutPoint, Transaction}; use tsify::Tsify; use crate::{ - pcd::{Member, Pcd, PcdCommitments, RoleDefinition, Roles}, - signature::{AnkHash, AnkValidationNoHash, AnkValidationYesHash, Proof}, - MutexExt, - serialization::{hex_array_btree, serialize_hex, deserialize_hex}, + pcd::{Member, Pcd, PcdCommitments, RoleDefinition, Roles}, serialization::{deserialize_hex, hex_array_btree, serialize_hex}, signature::{AnkHash, AnkValidationNoHash, AnkValidationYesHash, Proof}, MutexExt, SpecialRoles }; +const OBLITERATION_MSG: [u8; 32] = [167, 164, 238, 168, 233, 235, 152, 107, 194, 162, 145, 42, 140, 11, 244, 71, 252, 67, 204, 207, 114, 85, 209, 80, 129, 190, 151, 172, 77, 174, 243, 1]; + #[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize, Tsify)] #[tsify(into_wasm_abi, from_wasm_abi)] pub struct ProcessState { @@ -99,6 +98,16 @@ impl ProcessState { } } + /// This is a simplified and streamlined validation for obliteration state + fn handle_obliteration(&self) -> anyhow::Result<()> { + // We need an Apophis role + if let Some(apophis) = self.roles.get(SpecialRoles::APOPHIS.to_string().as_str()) { + apophis.is_satisfied(vec!["".to_owned()], [0u8; 32], &self.validation_tokens) + } else { + Err(anyhow::Error::msg("Missing an apophis role")) + } + } + pub fn is_valid(&self, previous_state: Option<&ProcessState>) -> anyhow::Result<()> { if self.validation_tokens.is_empty() { return Err(anyhow::anyhow!( @@ -106,6 +115,11 @@ impl ProcessState { )); } + if self.validation_tokens.get(0).unwrap().get_message() == OBLITERATION_MSG { + // We're dealing with a destruction update + return self.handle_obliteration(); + } + // Compute modified fields let modified_fields = self.list_modified_fields(previous_state); @@ -122,6 +136,7 @@ impl ProcessState { // We allow for a special case with a role that works only for initial state // That's optional though if previous_state.is_some() && *role_name == crate::SpecialRoles::DEMIURGE.to_string() { return None; } + if *role_name == crate::SpecialRoles::APOPHIS.to_string() { return None; } // We handle destructions separately let mut filtered_role_def = role_def.clone(); let rules = filtered_role_def.get_applicable_rules(field); filtered_role_def.validation_rules =