penumbra_sdk_sct/component/
source.rs

1use async_trait::async_trait;
2use cnidarium::StateWrite;
3use penumbra_sdk_txhash::TransactionId;
4
5use crate::state_key;
6
7/// A helper trait for placing a transaction id as an ambient source during execution.
8#[async_trait]
9pub trait SourceContext: StateWrite {
10    fn put_current_source(&mut self, source: Option<TransactionId>) {
11        if let Some(source) = source {
12            self.object_put(state_key::ambient::current_source(), source)
13        } else {
14            self.object_delete(state_key::ambient::current_source())
15        }
16    }
17
18    fn get_current_source(&self) -> Option<TransactionId> {
19        self.object_get(state_key::ambient::current_source())
20    }
21
22    /// Sets a mock source, for testing.
23    ///
24    /// The `counter` field allows distinguishing hashes at different stages of the test.
25    fn put_mock_source(&mut self, counter: u8) {
26        self.put_current_source(Some(TransactionId([counter; 32])))
27    }
28}
29impl<T: StateWrite + ?Sized> SourceContext for T {}