stellar_base/operations/
begin_sponsoring_future_reserves.rs1use 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 pub fn source_account(&self) -> &Option<MuxedAccount> {
21 &self.source_account
22 }
23
24 pub fn source_account_mut(&mut self) -> &mut Option<MuxedAccount> {
26 &mut self.source_account
27 }
28
29 pub fn sponsored_id(&self) -> &PublicKey {
31 &self.sponsored_id
32 }
33
34 pub fn sponsored_id_mut(&mut self) -> &mut PublicKey {
36 &mut self.sponsored_id
37 }
38
39 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 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}