1use crate::StateRead;
2use std::{any::Any, collections::BTreeMap};
3use tendermint::abci;
45/// Write access to chain state.
6pub trait StateWrite: StateRead + Send + Sync {
7/// Puts raw bytes into the verifiable key-value store with the given key.
8fn put_raw(&mut self, key: String, value: Vec<u8>);
910/// Delete a key from the verifiable key-value store.
11fn delete(&mut self, key: String);
1213/// Puts raw bytes into the non-verifiable key-value store with the given key.
14fn nonverifiable_put_raw(&mut self, key: Vec<u8>, value: Vec<u8>);
1516/// Delete a key from non-verifiable key-value storage.
17fn nonverifiable_delete(&mut self, key: Vec<u8>);
1819/// Puts an object into the ephemeral object store with the given key.
20 ///
21 /// # Panics
22 ///
23 /// If the object is already present in the store, but its type is not the same as the type of
24 /// `value`.
25fn object_put<T: Clone + Any + Send + Sync>(&mut self, key: &'static str, value: T);
2627/// Deletes a key from the ephemeral object store.
28fn object_delete(&mut self, key: &'static str);
2930/// Merge a set of object changes into this `StateWrite`.
31 ///
32 /// Unlike `object_put`, this avoids re-boxing values and messing up the downcasting.
33fn object_merge(&mut self, objects: BTreeMap<&'static str, Option<Box<dyn Any + Send + Sync>>>);
3435/// Record that an ABCI event occurred while building up this set of state changes.
36fn record(&mut self, event: abci::Event);
37}
3839impl<'a, S: StateWrite + Send + Sync> StateWrite for &'a mut S {
40fn put_raw(&mut self, key: String, value: jmt::OwnedValue) {
41 (**self).put_raw(key, value)
42 }
4344fn delete(&mut self, key: String) {
45 (**self).delete(key)
46 }
4748fn nonverifiable_delete(&mut self, key: Vec<u8>) {
49 (**self).nonverifiable_delete(key)
50 }
5152fn nonverifiable_put_raw(&mut self, key: Vec<u8>, value: Vec<u8>) {
53 (**self).nonverifiable_put_raw(key, value)
54 }
5556fn object_put<T: Clone + Any + Send + Sync>(&mut self, key: &'static str, value: T) {
57 (**self).object_put(key, value)
58 }
5960fn object_delete(&mut self, key: &'static str) {
61 (**self).object_delete(key)
62 }
6364fn object_merge(
65&mut self,
66 objects: BTreeMap<&'static str, Option<Box<dyn Any + Send + Sync>>>,
67 ) {
68 (**self).object_merge(objects)
69 }
7071fn record(&mut self, event: abci::Event) {
72 (**self).record(event)
73 }
74}