casper_storage/data_access_layer/
handle_refund.rs1use crate::{
2 data_access_layer::BalanceIdentifier, system::runtime_native::Config as NativeRuntimeConfig,
3 tracking_copy::TrackingCopyError,
4};
5use casper_types::{
6 execution::Effects, Digest, InitiatorAddr, Phase, ProtocolVersion, TransactionHash, Transfer,
7 U512,
8};
9use num_rational::Ratio;
10
11#[derive(Debug, Clone, PartialEq, Eq)]
13pub enum HandleRefundMode {
14 Burn {
16 limit: U512,
18 cost: U512,
20 consumed: U512,
22 gas_price: u8,
24 source: Box<BalanceIdentifier>,
26 ratio: Ratio<u64>,
28 },
29 Refund {
31 initiator_addr: Box<InitiatorAddr>,
33 limit: U512,
35 cost: U512,
37 consumed: U512,
39 gas_price: u8,
41 ratio: Ratio<u64>,
43 source: Box<BalanceIdentifier>,
45 target: Box<BalanceIdentifier>,
47 },
48 RefundNoFeeCustomPayment {
52 initiator_addr: Box<InitiatorAddr>,
54 limit: U512,
56 cost: U512,
58 gas_price: u8,
60 },
61 CalculateAmount {
64 limit: U512,
66 cost: U512,
68 consumed: U512,
70 gas_price: u8,
72 ratio: Ratio<u64>,
74 source: Box<BalanceIdentifier>,
76 },
77 SetRefundPurse {
79 target: Box<BalanceIdentifier>,
81 },
82 ClearRefundPurse,
84}
85
86impl HandleRefundMode {
87 pub fn phase(&self) -> Phase {
89 match self {
90 HandleRefundMode::Burn { .. }
91 | HandleRefundMode::Refund { .. }
92 | HandleRefundMode::RefundNoFeeCustomPayment { .. }
93 | HandleRefundMode::CalculateAmount { .. } => Phase::FinalizePayment,
94
95 HandleRefundMode::ClearRefundPurse | HandleRefundMode::SetRefundPurse { .. } => {
96 Phase::Payment
97 }
98 }
99 }
100}
101
102#[derive(Debug, Clone, PartialEq, Eq)]
104pub struct HandleRefundRequest {
105 pub(crate) config: NativeRuntimeConfig,
107 pub(crate) state_hash: Digest,
109 pub(crate) protocol_version: ProtocolVersion,
111 pub(crate) transaction_hash: TransactionHash,
113 pub(crate) refund_mode: HandleRefundMode,
115}
116
117impl HandleRefundRequest {
118 pub fn new(
120 config: NativeRuntimeConfig,
121 state_hash: Digest,
122 protocol_version: ProtocolVersion,
123 transaction_hash: TransactionHash,
124 refund_mode: HandleRefundMode,
125 ) -> Self {
126 HandleRefundRequest {
127 config,
128 state_hash,
129 protocol_version,
130 transaction_hash,
131 refund_mode,
132 }
133 }
134
135 pub fn config(&self) -> &NativeRuntimeConfig {
137 &self.config
138 }
139
140 pub fn state_hash(&self) -> Digest {
142 self.state_hash
143 }
144
145 pub fn protocol_version(&self) -> ProtocolVersion {
147 self.protocol_version
148 }
149
150 pub fn transaction_hash(&self) -> TransactionHash {
152 self.transaction_hash
153 }
154
155 pub fn refund_mode(&self) -> &HandleRefundMode {
157 &self.refund_mode
158 }
159}
160
161#[derive(Debug)]
163pub enum HandleRefundResult {
164 RootNotFound,
166 Success {
168 transfers: Vec<Transfer>,
170 effects: Effects,
172 amount: Option<U512>,
174 },
175 InvalidPhase,
177 Failure(TrackingCopyError),
179}
180
181impl HandleRefundResult {
182 pub fn effects(&self) -> Effects {
184 match self {
185 HandleRefundResult::RootNotFound
186 | HandleRefundResult::InvalidPhase
187 | HandleRefundResult::Failure(_) => Effects::new(),
188 HandleRefundResult::Success { effects, .. } => effects.clone(),
189 }
190 }
191
192 pub fn refund_amount(&self) -> U512 {
194 match self {
195 HandleRefundResult::RootNotFound
196 | HandleRefundResult::InvalidPhase
197 | HandleRefundResult::Failure(_) => U512::zero(),
198 HandleRefundResult::Success {
199 amount: refund_amount,
200 ..
201 } => refund_amount.unwrap_or(U512::zero()),
202 }
203 }
204
205 pub fn error_message(&self) -> Option<String> {
207 match self {
208 HandleRefundResult::RootNotFound => Some("root not found".to_string()),
209 HandleRefundResult::InvalidPhase => Some("invalid phase selected".to_string()),
210 HandleRefundResult::Failure(tce) => Some(format!("{}", tce)),
211 HandleRefundResult::Success { .. } => None,
212 }
213 }
214}