Skip to main content

casper_node/types/transaction/meta_transaction/
meta_deploy.rs

1use datasize::DataSize;
2use once_cell::sync::OnceCell;
3use serde::Serialize;
4
5#[cfg(test)]
6use casper_types::TransactionLaneDefinition;
7use casper_types::{
8    calculate_lane_id_for_deploy, Deploy, ExecutableDeployItem, InitiatorAddr, InvalidTransaction,
9    PricingHandling, TransactionV1Config,
10};
11#[derive(Clone, Debug, Serialize, DataSize)]
12pub(crate) struct MetaDeploy {
13    deploy: Deploy,
14    //We need to keep this id here since we can fetch it only from chainspec.
15    lane_id: u8,
16    #[data_size(skip)]
17    #[serde(skip)]
18    initiator_addr: OnceCell<InitiatorAddr>,
19}
20
21impl MetaDeploy {
22    pub(crate) fn from_deploy(
23        deploy: Deploy,
24        pricing_handling: PricingHandling,
25        config: &TransactionV1Config,
26    ) -> Result<Self, InvalidTransaction> {
27        let lane_id = calculate_lane_id_for_deploy(&deploy, pricing_handling, config)
28            .map_err(InvalidTransaction::Deploy)?;
29        let initiator_addr = OnceCell::new();
30        Ok(MetaDeploy {
31            deploy,
32            lane_id,
33            initiator_addr,
34        })
35    }
36
37    pub(crate) fn initiator_addr(&self) -> &InitiatorAddr {
38        self.initiator_addr
39            .get_or_init(|| InitiatorAddr::PublicKey(self.deploy.account().clone()))
40    }
41
42    pub(crate) fn lane_id(&self) -> u8 {
43        self.lane_id
44    }
45
46    pub(crate) fn session(&self) -> &ExecutableDeployItem {
47        self.deploy.session()
48    }
49
50    pub(crate) fn deploy(&self) -> &Deploy {
51        &self.deploy
52    }
53}
54
55#[cfg(test)]
56pub(crate) fn calculate_lane_id_of_biggest_wasm(
57    wasm_lanes: &[TransactionLaneDefinition],
58) -> Option<u8> {
59    wasm_lanes
60        .iter()
61        .max_by(|left, right| {
62            left.max_transaction_length
63                .cmp(&right.max_transaction_length)
64        })
65        .map(|definition| definition.id)
66}
67#[cfg(test)]
68mod tests {
69    use super::calculate_lane_id_of_biggest_wasm;
70    use casper_types::TransactionLaneDefinition;
71    #[test]
72    fn calculate_lane_id_of_biggest_wasm_should_return_none_on_empty() {
73        let wasms = vec![];
74        assert!(calculate_lane_id_of_biggest_wasm(&wasms).is_none());
75    }
76
77    #[test]
78    fn calculate_lane_id_of_biggest_wasm_should_return_biggest() {
79        let wasms = vec![
80            TransactionLaneDefinition {
81                id: 0,
82                max_transaction_length: 1,
83                max_transaction_args_length: 2,
84                max_transaction_gas_limit: 3,
85                max_transaction_count: 4,
86            },
87            TransactionLaneDefinition {
88                id: 1,
89                max_transaction_length: 10,
90                max_transaction_args_length: 2,
91                max_transaction_gas_limit: 3,
92                max_transaction_count: 4,
93            },
94        ];
95        assert_eq!(calculate_lane_id_of_biggest_wasm(&wasms), Some(1));
96        let wasms = vec![
97            TransactionLaneDefinition {
98                id: 0,
99                max_transaction_length: 1,
100                max_transaction_args_length: 2,
101                max_transaction_gas_limit: 3,
102                max_transaction_count: 4,
103            },
104            TransactionLaneDefinition {
105                id: 1,
106                max_transaction_length: 10,
107                max_transaction_args_length: 2,
108                max_transaction_gas_limit: 3,
109                max_transaction_count: 4,
110            },
111            TransactionLaneDefinition {
112                id: 2,
113                max_transaction_length: 7,
114                max_transaction_args_length: 2,
115                max_transaction_gas_limit: 3,
116                max_transaction_count: 4,
117            },
118        ];
119        assert_eq!(calculate_lane_id_of_biggest_wasm(&wasms), Some(1));
120
121        let wasms = vec![
122            TransactionLaneDefinition {
123                id: 0,
124                max_transaction_length: 1,
125                max_transaction_args_length: 2,
126                max_transaction_gas_limit: 3,
127                max_transaction_count: 4,
128            },
129            TransactionLaneDefinition {
130                id: 1,
131                max_transaction_length: 10,
132                max_transaction_args_length: 2,
133                max_transaction_gas_limit: 3,
134                max_transaction_count: 4,
135            },
136            TransactionLaneDefinition {
137                id: 2,
138                max_transaction_length: 70,
139                max_transaction_args_length: 2,
140                max_transaction_gas_limit: 3,
141                max_transaction_count: 4,
142            },
143        ];
144        assert_eq!(calculate_lane_id_of_biggest_wasm(&wasms), Some(2));
145    }
146}