penumbra_sdk_transaction/
parameters.rs

1use anyhow::Error;
2use penumbra_sdk_fee::Fee;
3use penumbra_sdk_proto::core::transaction::v1 as pbt;
4use penumbra_sdk_proto::DomainType;
5use penumbra_sdk_txhash::{EffectHash, EffectingData};
6
7/// Parameters determining when the transaction should be accepted to the chain.
8#[derive(Clone, Debug, Default)]
9pub struct TransactionParameters {
10    pub expiry_height: u64,
11    pub chain_id: String,
12    pub fee: Fee,
13}
14
15impl EffectingData for TransactionParameters {
16    fn effect_hash(&self) -> EffectHash {
17        EffectHash::from_proto_effecting_data(&self.to_proto())
18    }
19}
20
21impl DomainType for TransactionParameters {
22    type Proto = pbt::TransactionParameters;
23}
24
25impl TryFrom<pbt::TransactionParameters> for TransactionParameters {
26    type Error = Error;
27
28    fn try_from(proto: pbt::TransactionParameters) -> anyhow::Result<Self, Self::Error> {
29        Ok(TransactionParameters {
30            expiry_height: proto.expiry_height,
31            chain_id: proto.chain_id,
32            fee: proto
33                .fee
34                .ok_or_else(|| anyhow::anyhow!("transaction parameters missing fee"))?
35                .try_into()?,
36        })
37    }
38}
39
40impl From<TransactionParameters> for pbt::TransactionParameters {
41    fn from(msg: TransactionParameters) -> Self {
42        pbt::TransactionParameters {
43            expiry_height: msg.expiry_height,
44            chain_id: msg.chain_id,
45            fee: Some(msg.fee.into()),
46        }
47    }
48}