validate.rs 1.9 KB

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