xrpl/models/transactions/
vault_delete.rs1use alloc::borrow::Cow;
2use alloc::vec::Vec;
3use serde::{Deserialize, Serialize};
4use serde_with::skip_serializing_none;
5
6use crate::models::amount::XRPAmount;
7use crate::models::{FlagCollection, Model, NoFlags, XRPLModelResult};
8
9use super::vault_common::validate_vault_id;
10use super::{CommonFields, CommonTransactionBuilder, Memo, Signer, Transaction, TransactionType};
11
12#[skip_serializing_none]
20#[derive(Debug, Default, Serialize, Deserialize, PartialEq, Eq, Clone)]
21#[serde(rename_all = "PascalCase")]
22pub struct VaultDelete<'a> {
23 #[serde(flatten)]
28 pub common_fields: CommonFields<'a, NoFlags>,
29 #[serde(rename = "VaultID")]
31 pub vault_id: Cow<'a, str>,
32}
33
34impl Model for VaultDelete<'_> {
35 fn get_errors(&self) -> XRPLModelResult<()> {
36 validate_vault_id(&self.vault_id)
37 }
38}
39
40impl<'a> Transaction<'a, NoFlags> for VaultDelete<'a> {
41 fn get_common_fields(&self) -> &CommonFields<'_, NoFlags> {
42 &self.common_fields
43 }
44
45 fn get_mut_common_fields(&mut self) -> &mut CommonFields<'a, NoFlags> {
46 &mut self.common_fields
47 }
48
49 fn get_transaction_type(&self) -> &TransactionType {
50 self.common_fields.get_transaction_type()
51 }
52}
53
54impl<'a> CommonTransactionBuilder<'a, NoFlags> for VaultDelete<'a> {
55 fn get_mut_common_fields(&mut self) -> &mut CommonFields<'a, NoFlags> {
56 &mut self.common_fields
57 }
58
59 fn into_self(self) -> Self {
60 self
61 }
62}
63
64impl<'a> VaultDelete<'a> {
65 pub fn new(
66 account: Cow<'a, str>,
67 account_txn_id: Option<Cow<'a, str>>,
68 fee: Option<XRPAmount<'a>>,
69 last_ledger_sequence: Option<u32>,
70 memos: Option<Vec<Memo>>,
71 sequence: Option<u32>,
72 signers: Option<Vec<Signer>>,
73 source_tag: Option<u32>,
74 ticket_sequence: Option<u32>,
75 vault_id: Cow<'a, str>,
76 ) -> VaultDelete<'a> {
77 VaultDelete {
78 common_fields: CommonFields::new(
79 account,
80 TransactionType::VaultDelete,
81 account_txn_id,
82 fee,
83 Some(FlagCollection::default()),
84 last_ledger_sequence,
85 memos,
86 None,
87 sequence,
88 signers,
89 None,
90 source_tag,
91 ticket_sequence,
92 None,
93 ),
94 vault_id,
95 }
96 }
97}
98
99#[cfg(test)]
100mod tests {
101 use super::*;
102
103 const VAULT_ID: &str = "A0000000000000000000000000000000000000000000000000000000DEADBEEF";
104
105 #[test]
106 fn test_serde() {
107 let vault_delete = VaultDelete {
108 common_fields: CommonFields {
109 account: "rVaultOwner123".into(),
110 transaction_type: TransactionType::VaultDelete,
111 signing_pub_key: Some("".into()),
112 ..Default::default()
113 },
114 vault_id: VAULT_ID.into(),
115 };
116
117 let json_str = r#"{"Account":"rVaultOwner123","TransactionType":"VaultDelete","Flags":0,"SigningPubKey":"","VaultID":"A0000000000000000000000000000000000000000000000000000000DEADBEEF"}"#;
118
119 let serialized = serde_json::to_string(&vault_delete).unwrap();
121 assert_eq!(
122 serde_json::to_value(&serialized).unwrap(),
123 serde_json::to_value(json_str).unwrap()
124 );
125
126 let deserialized: VaultDelete = serde_json::from_str(json_str).unwrap();
128 assert_eq!(vault_delete, deserialized);
129 }
130
131 #[test]
132 fn test_builder_pattern() {
133 let vault_delete = VaultDelete {
134 common_fields: CommonFields {
135 account: "rVaultOwner123".into(),
136 transaction_type: TransactionType::VaultDelete,
137 ..Default::default()
138 },
139 vault_id: VAULT_ID.into(),
140 }
141 .with_fee("12".into())
142 .with_sequence(100)
143 .with_last_ledger_sequence(7108682)
144 .with_source_tag(12345)
145 .with_memo(Memo {
146 memo_data: Some("deleting vault".into()),
147 memo_format: None,
148 memo_type: Some("text".into()),
149 });
150
151 assert_eq!(vault_delete.vault_id, VAULT_ID);
152 assert_eq!(vault_delete.common_fields.fee.as_ref().unwrap().0, "12");
153 assert_eq!(vault_delete.common_fields.sequence, Some(100));
154 assert_eq!(
155 vault_delete.common_fields.last_ledger_sequence,
156 Some(7108682)
157 );
158 assert_eq!(vault_delete.common_fields.source_tag, Some(12345));
159 assert_eq!(vault_delete.common_fields.memos.as_ref().unwrap().len(), 1);
160 }
161
162 #[test]
163 fn test_default() {
164 let vault_delete = VaultDelete {
165 common_fields: CommonFields {
166 account: "rVaultOwner456".into(),
167 transaction_type: TransactionType::VaultDelete,
168 ..Default::default()
169 },
170 vault_id: VAULT_ID.into(),
171 };
172
173 assert_eq!(vault_delete.common_fields.account, "rVaultOwner456");
174 assert_eq!(
175 vault_delete.common_fields.transaction_type,
176 TransactionType::VaultDelete
177 );
178 assert_eq!(vault_delete.vault_id, VAULT_ID);
179 assert!(vault_delete.common_fields.fee.is_none());
180 assert!(vault_delete.common_fields.sequence.is_none());
181 }
182
183 #[test]
184 fn test_ticket_sequence() {
185 let ticket_delete = VaultDelete {
186 common_fields: CommonFields {
187 account: "rTicketVaultDel789".into(),
188 transaction_type: TransactionType::VaultDelete,
189 ..Default::default()
190 },
191 vault_id: VAULT_ID.into(),
192 }
193 .with_ticket_sequence(54321)
194 .with_fee("12".into());
195
196 assert_eq!(ticket_delete.common_fields.ticket_sequence, Some(54321));
197 assert!(ticket_delete.common_fields.sequence.is_none());
198 }
199
200 #[test]
201 fn test_multiple_memos() {
202 let multi_memo_delete = VaultDelete {
203 common_fields: CommonFields {
204 account: "rMultiMemoVaultDel111".into(),
205 transaction_type: TransactionType::VaultDelete,
206 ..Default::default()
207 },
208 vault_id: VAULT_ID.into(),
209 }
210 .with_memo(Memo {
211 memo_data: Some("first memo".into()),
212 memo_format: None,
213 memo_type: Some("text".into()),
214 })
215 .with_memo(Memo {
216 memo_data: Some("second memo".into()),
217 memo_format: None,
218 memo_type: Some("text".into()),
219 })
220 .with_fee("18".into())
221 .with_sequence(400);
222
223 assert_eq!(
224 multi_memo_delete
225 .common_fields
226 .memos
227 .as_ref()
228 .unwrap()
229 .len(),
230 2
231 );
232 assert_eq!(multi_memo_delete.common_fields.sequence, Some(400));
233 }
234
235 #[test]
236 fn test_new_constructor() {
237 let vault_delete = VaultDelete::new(
238 "rNewDeleter222".into(),
239 None,
240 Some("12".into()),
241 Some(7108682),
242 None,
243 Some(100),
244 None,
245 None,
246 None,
247 VAULT_ID.into(),
248 );
249
250 assert_eq!(vault_delete.common_fields.account, "rNewDeleter222");
251 assert_eq!(
252 vault_delete.common_fields.transaction_type,
253 TransactionType::VaultDelete
254 );
255 assert_eq!(vault_delete.common_fields.fee.as_ref().unwrap().0, "12");
256 assert_eq!(
257 vault_delete.common_fields.last_ledger_sequence,
258 Some(7108682)
259 );
260 assert_eq!(vault_delete.common_fields.sequence, Some(100));
261 assert_eq!(vault_delete.vault_id, VAULT_ID);
262 }
263
264 #[test]
265 fn test_validate() {
266 let vault_delete = VaultDelete {
267 common_fields: CommonFields {
268 account: "rValidateVaultDel333".into(),
269 transaction_type: TransactionType::VaultDelete,
270 ..Default::default()
271 },
272 vault_id: VAULT_ID.into(),
273 }
274 .with_fee("12".into())
275 .with_sequence(300);
276
277 assert!(vault_delete.validate().is_ok());
278 }
279
280 #[test]
281 fn test_account_txn_id() {
282 let vault_delete = VaultDelete {
283 common_fields: CommonFields {
284 account: "rVaultDelTxnId444".into(),
285 transaction_type: TransactionType::VaultDelete,
286 ..Default::default()
287 },
288 vault_id: VAULT_ID.into(),
289 }
290 .with_account_txn_id("F1E2D3C4B5A69788".into())
291 .with_fee("12".into())
292 .with_sequence(500);
293
294 assert_eq!(
295 vault_delete.common_fields.account_txn_id,
296 Some("F1E2D3C4B5A69788".into())
297 );
298 }
299}