mod handle_payment_native;
mod internal;
pub mod mint_provider;
pub mod runtime_provider;
pub mod storage_provider;
use casper_types::{
system::handle_payment::{Error, REFUND_PURSE_KEY},
AccessRights, PublicKey, URef, U512,
};
use num_rational::Ratio;
use tracing::error;
use crate::system::handle_payment::{
mint_provider::MintProvider, runtime_provider::RuntimeProvider,
storage_provider::StorageProvider,
};
pub trait HandlePayment: MintProvider + RuntimeProvider + StorageProvider + Sized {
fn get_payment_purse(&mut self) -> Result<URef, Error> {
let purse = internal::get_payment_purse(self)?;
Ok(URef::new(purse.addr(), AccessRights::READ_ADD))
}
fn set_refund_purse(&mut self, purse: URef) -> Result<(), Error> {
let _balance = self.available_balance(purse)?;
internal::set_refund(self, purse)
}
fn get_refund_purse(&mut self) -> Result<Option<URef>, Error> {
let maybe_purse = internal::get_refund_purse(self)?;
Ok(maybe_purse.map(|p| p.remove_access_rights()))
}
fn clear_refund_purse(&mut self) -> Result<(), Error> {
if self.get_caller() != PublicKey::System.to_account_hash() {
error!("invalid caller to clear refund purse");
return Err(Error::InvalidCaller);
}
self.remove_key(REFUND_PURSE_KEY)
}
#[allow(clippy::too_many_arguments)]
fn calculate_overpayment_and_fee(
&mut self,
limit: U512,
gas_price: u8,
cost: U512,
consumed: U512,
source_purse: URef,
refund_ratio: Ratio<U512>,
) -> Result<(U512, U512), Error> {
if self.get_caller() != PublicKey::System.to_account_hash() {
error!("invalid caller to calculate overpayment and fee");
return Err(Error::InvalidCaller);
}
let available_balance = match self.available_balance(source_purse)? {
Some(balance) => balance,
None => return Err(Error::PaymentPurseBalanceNotFound),
};
internal::calculate_overpayment_and_fee(
limit,
gas_price,
cost,
consumed,
available_balance,
refund_ratio,
)
}
fn distribute_accumulated_fees(
&mut self,
source_uref: URef,
amount: Option<U512>,
) -> Result<(), Error> {
if self.get_caller() != PublicKey::System.to_account_hash() {
error!("invalid caller to distribute accumulated fee");
return Err(Error::InvalidCaller);
}
internal::distribute_accumulated_fees(self, source_uref, amount)
}
fn payment_burn(&mut self, source_uref: URef, amount: Option<U512>) -> Result<(), Error> {
if self.get_caller() != PublicKey::System.to_account_hash() {
error!("invalid caller to payment burn");
return Err(Error::InvalidCaller);
}
internal::payment_burn(self, source_uref, amount)
}
}