validate.rs 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. use std::any::{Any, TypeId};
  2. use darkfi::crypto::types::DrkCircuitField;
  3. use crate::{
  4. dao_contract::{DaoBulla, State},
  5. demo::{CallDataBase, StateRegistry, Transaction, UpdateBase},
  6. };
  7. pub fn state_transition(
  8. _states: &StateRegistry,
  9. func_call_index: usize,
  10. parent_tx: &Transaction,
  11. ) -> Result<Box<dyn UpdateBase>> {
  12. let func_call = &parent_tx.func_calls[func_call_index];
  13. let call_data = func_call.call_data.as_any();
  14. assert_eq!((&*call_data).type_id(), TypeId::of::<CallData>());
  15. let call_data = call_data.downcast_ref::<CallData>();
  16. // This will be inside wasm so unwrap is fine.
  17. let call_data = call_data.unwrap();
  18. Ok(Box::new(Update { dao_bulla: call_data.dao_bulla.clone() }))
  19. }
  20. #[derive(Clone)]
  21. pub struct Update {
  22. pub dao_bulla: DaoBulla,
  23. }
  24. impl UpdateBase for Update {
  25. fn apply(self: Box<Self>, states: &mut StateRegistry) {
  26. // Lookup dao_contract state from registry
  27. let state = states.lookup_mut::<State>(&"DAO".to_string()).unwrap();
  28. // Add dao_bulla to state.dao_bullas
  29. state.add_dao_bulla(self.dao_bulla);
  30. }
  31. //fn as_any(&self) -> &dyn Any {
  32. // self
  33. //}
  34. }
  35. #[derive(Debug, Clone, thiserror::Error)]
  36. pub enum Error {}
  37. type Result<T> = std::result::Result<T, Error>;
  38. pub struct CallData {
  39. pub dao_bulla: DaoBulla,
  40. }
  41. impl CallDataBase for CallData {
  42. fn zk_public_values(&self) -> Vec<(String, Vec<DrkCircuitField>)> {
  43. vec![("dao-mint".to_string(), vec![self.dao_bulla.0])]
  44. }
  45. fn as_any(&self) -> &dyn Any {
  46. self
  47. }
  48. }