xpx_chain_sdk/models/transaction/
transaction_modify_metadata.rs1use crate::models::{
8 account::PublicAccount,
9 consts::METADATA_HEADER_SIZE,
10 metadata::{MetadataModification, MetadataType},
11};
12
13use super::{
14 buffers, CommonTransaction,
15 internal::metadata_modification_array_to_buffer, schema::modify_metadata_transaction_schema,
16};
17
18#[derive(Clone, Debug, Serialize, Deserialize)]
19#[serde(rename_all = "camelCase")]
20pub struct ModifyMetadataTransaction {
21 pub common: CommonTransaction,
22 pub metadata_type: MetadataType,
23 pub modifications: Vec<MetadataModification>,
24}
25
26impl ModifyMetadataTransaction {
27 pub(crate) fn set_aggregate(&mut self, signer: PublicAccount) {
28 self.common.set_aggregate(signer)
29 }
30
31 pub(crate) fn common(&self) -> CommonTransaction {
32 self.common.to_owned()
33 }
34
35 pub(crate) fn size(&self) -> usize {
36 let size_of_modifications: usize = self.modifications.iter().map(|m| m.size()).sum();
37
38 METADATA_HEADER_SIZE + size_of_modifications
39 }
40
41 pub(crate) fn embedded_to_bytes(
42 &self,
43 builder: &mut fb::FlatBufferBuilder,
44 metadata_vec: fb::WIPOffset<fb::Vector<u8>>,
45 alias_size: usize,
46 ) -> Vec<u8> {
47 let modification_vec =
48 metadata_modification_array_to_buffer(builder, self.modifications.to_owned());
49
50 let abs_vector = self.common.build_vector(builder, self.size());
51
52 let mut txn_builder = buffers::ModifyMetadataTransactionBufferBuilder::new(builder);
53 txn_builder.add_size_((self.size() + alias_size) as u32);
54 txn_builder.add_signature(abs_vector.signature_vec);
55 txn_builder.add_signer(abs_vector.signer_vec);
56 txn_builder.add_version(abs_vector.version_vec);
57 txn_builder.add_type_(abs_vector.type_vec);
58 txn_builder.add_max_fee(abs_vector.max_fee_vec);
59 txn_builder.add_deadline(abs_vector.deadline_vec);
60 txn_builder.add_metadata_type(self.metadata_type.value());
61 txn_builder.add_metadata_id(metadata_vec);
62 txn_builder.add_modifications(fb::WIPOffset::new(modification_vec));
63 let t = txn_builder.finish();
64
65 builder.finish(t, None);
66
67 let buf = builder.finished_data();
68
69 modify_metadata_transaction_schema().serialize(&mut buf.to_vec())
70 }
71}