1use alloy_primitives::{Address, U256};
2use arb_storage::DatabaseError;
3
4#[derive(Debug, Clone, thiserror::Error)]
7pub enum BalanceError {
8 #[error("insufficient balance on {account}: available {available}, requested {requested}")]
10 InsufficientBalance {
11 account: Address,
12 available: U256,
13 requested: U256,
14 },
15
16 #[error(transparent)]
18 Database(#[from] DatabaseError),
19}
20
21pub fn transfer_balance<F>(
25 from: Option<&Address>,
26 to: Option<&Address>,
27 amount: U256,
28 mut state_fn: F,
29) -> Result<(), BalanceError>
30where
31 F: FnMut(Option<&Address>, Option<&Address>, U256) -> Result<(), BalanceError>,
32{
33 state_fn(from, to, amount)
34}
35
36pub fn mint_balance<F>(to: &Address, amount: U256, state_fn: F) -> Result<(), BalanceError>
38where
39 F: FnMut(Option<&Address>, Option<&Address>, U256) -> Result<(), BalanceError>,
40{
41 transfer_balance(None, Some(to), amount, state_fn)
42}
43
44pub fn burn_balance<F>(from: &Address, amount: U256, state_fn: F) -> Result<(), BalanceError>
46where
47 F: FnMut(Option<&Address>, Option<&Address>, U256) -> Result<(), BalanceError>,
48{
49 transfer_balance(Some(from), None, amount, state_fn)
50}