xpx_chain_sdk/models/transaction/
transaction_modify_metadata.rs

1/*
2 * Copyright 2018 ProximaX Limited. All rights reserved.
3 * Use of this source code is governed by the Apache 2.0
4 * license that can be found in the LICENSE file.
5 */
6
7use 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}