validate.rs 1.9 KB

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