stellar_base/operations/
begin_sponsoring_future_reserves.rs

1use crate::crypto::{MuxedAccount, PublicKey};
2use crate::error::{Error, Result};
3use crate::operations::Operation;
4use crate::xdr;
5
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct BeginSponsoringFutureReservesOperation {
8    source_account: Option<MuxedAccount>,
9    sponsored_id: PublicKey,
10}
11
12#[derive(Debug, Default)]
13pub struct BeginSponsoringFutureReservesOperationBuilder {
14    source_account: Option<MuxedAccount>,
15    sponsored_id: Option<PublicKey>,
16}
17
18impl BeginSponsoringFutureReservesOperation {
19    /// Retrieves the operation source account.
20    pub fn source_account(&self) -> &Option<MuxedAccount> {
21        &self.source_account
22    }
23
24    /// Retrieves a reference to the operation source account.
25    pub fn source_account_mut(&mut self) -> &mut Option<MuxedAccount> {
26        &mut self.source_account
27    }
28
29    /// Retrieves a reference to the sponsored id.
30    pub fn sponsored_id(&self) -> &PublicKey {
31        &self.sponsored_id
32    }
33
34    /// Retrieves a mutable reference to the sponsored id.
35    pub fn sponsored_id_mut(&mut self) -> &mut PublicKey {
36        &mut self.sponsored_id
37    }
38
39    /// Returns tho xdr operation body.
40    pub fn to_xdr_operation_body(&self) -> Result<xdr::OperationBody> {
41        let sponsored_id = self.sponsored_id.to_xdr_account_id()?;
42        let inner = xdr::BeginSponsoringFutureReservesOp { sponsored_id };
43        Ok(xdr::OperationBody::BeginSponsoringFutureReserves(inner))
44    }
45
46    /// Creates from the xdr operation body.
47    pub fn from_xdr_operation_body(
48        source_account: Option<MuxedAccount>,
49        x: &xdr::BeginSponsoringFutureReservesOp,
50    ) -> Result<BeginSponsoringFutureReservesOperation> {
51        let sponsored_id = PublicKey::from_xdr_account_id(&x.sponsored_id)?;
52        Ok(BeginSponsoringFutureReservesOperation {
53            source_account,
54            sponsored_id,
55        })
56    }
57}
58
59impl BeginSponsoringFutureReservesOperationBuilder {
60    pub fn new() -> BeginSponsoringFutureReservesOperationBuilder {
61        Default::default()
62    }
63
64    pub fn with_source_account<S>(
65        mut self,
66        source: S,
67    ) -> BeginSponsoringFutureReservesOperationBuilder
68    where
69        S: Into<MuxedAccount>,
70    {
71        self.source_account = Some(source.into());
72        self
73    }
74
75    pub fn with_sponsored_id(
76        mut self,
77        sponsored_id: PublicKey,
78    ) -> BeginSponsoringFutureReservesOperationBuilder {
79        self.sponsored_id = Some(sponsored_id);
80        self
81    }
82
83    pub fn build(self) -> Result<Operation> {
84        let sponsored_id = self.sponsored_id.ok_or_else(|| {
85            Error::InvalidOperation(
86                "missing begin sponsoring future reserves sponsored_id".to_string(),
87            )
88        })?;
89
90        Ok(Operation::BeginSponsoringFutureReserves(
91            BeginSponsoringFutureReservesOperation {
92                source_account: self.source_account,
93                sponsored_id,
94            },
95        ))
96    }
97}
98
99#[cfg(test)]
100mod tests {
101    use crate::network::Network;
102    use crate::operations::tests::*;
103    use crate::operations::Operation;
104    use crate::transaction::{Transaction, TransactionEnvelope, MIN_BASE_FEE};
105    use crate::xdr::{XDRDeserialize, XDRSerialize};
106
107    #[test]
108    fn test_begin_sponsoring_future_reserves() {
109        let kp = keypair0();
110        let kp1 = keypair1();
111
112        let op = Operation::new_begin_sponsoring_future_reserves()
113            .with_sponsored_id(kp1.public_key())
114            .build()
115            .unwrap();
116
117        let mut tx = Transaction::builder(kp.public_key(), 3556091187167235, MIN_BASE_FEE)
118            .add_operation(op)
119            .into_transaction()
120            .unwrap();
121        tx.sign(kp.as_ref(), &Network::new_test()).unwrap();
122        let envelope = tx.to_envelope();
123        let xdr = envelope.xdr_base64().unwrap();
124        let expected = "AAAAAgAAAADg3G3hclysZlFitS+s5zWyiiJD5B0STWy5LXCj6i5yxQAAAGQADKI/AAAAAwAAAAAAAAAAAAAAAQAAAAAAAAAQAAAAACXK8doPx27P6IReQlRRuweSSUiUfjqgyswxiu3Sh2R+AAAAAAAAAAHqLnLFAAAAQIf45R2LIdRhc5dYfL6gFHyeBmxaIMfts2/+oOOhyVyKXYShySjM3xR9k1dCbg7cmgGJAmPo49RZczTXE1Ufjgs=";
125        assert_eq!(expected, xdr);
126        let back = TransactionEnvelope::from_xdr_base64(&xdr).unwrap();
127        assert_eq!(envelope, back);
128    }
129
130    #[test]
131    fn test_begin_sponsoring_future_reserves_with_source_account() {
132        let kp = keypair0();
133        let kp1 = keypair1();
134        let kp2 = keypair2();
135
136        let op = Operation::new_begin_sponsoring_future_reserves()
137            .with_source_account(kp2.public_key())
138            .with_sponsored_id(kp1.public_key())
139            .build()
140            .unwrap();
141
142        let mut tx = Transaction::builder(kp.public_key(), 3556091187167235, MIN_BASE_FEE)
143            .add_operation(op)
144            .into_transaction()
145            .unwrap();
146        tx.sign(kp.as_ref(), &Network::new_test()).unwrap();
147        let envelope = tx.to_envelope();
148        let xdr = envelope.xdr_base64().unwrap();
149        let expected = "AAAAAgAAAADg3G3hclysZlFitS+s5zWyiiJD5B0STWy5LXCj6i5yxQAAAGQADKI/AAAAAwAAAAAAAAAAAAAAAQAAAAEAAAAAfhHLNNY19eGrAtSgLD3VpaRm2AjNjxIBWQg9zS4VWZgAAAAQAAAAACXK8doPx27P6IReQlRRuweSSUiUfjqgyswxiu3Sh2R+AAAAAAAAAAHqLnLFAAAAQCxAVR1PtQyNc3Bin78gpQlhX+Gu6r9RWh7Rezak0wJwOebKRKsjdO0R3hvQN9ZwSAQDeF5Du4panJMptWkgLQo=";
150        assert_eq!(expected, xdr);
151        let back = TransactionEnvelope::from_xdr_base64(&xdr).unwrap();
152        assert_eq!(envelope, back);
153    }
154}