casper_node/types/transaction/meta_transaction/
meta_deploy.rs1use 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 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}