use crate::utils::dec::{Dec, Round};
use crate::utils::sign::Map;
use crate::utils::{Address, AssetKind};
use serde::Deserialize;
use std::fmt;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default, Deserialize)]
#[serde(transparent)]
pub struct BuilderFee(u64);
pub const PERP_BUILDER_CAP: BuilderFee = BuilderFee(100);
pub const SPOT_BUILDER_CAP: BuilderFee = BuilderFee(1_000);
pub const OUTCOME_BUILDER_CAP: BuilderFee = SPOT_BUILDER_CAP;
impl BuilderFee {
pub const ZERO: BuilderFee = BuilderFee(0);
#[must_use]
pub const fn from_tenths(tenths: u64) -> BuilderFee {
BuilderFee(tenths)
}
#[must_use]
pub const fn tenths(self) -> u64 {
self.0
}
#[must_use]
pub fn percent(self) -> String {
let figure = Dec::lit::<3>(i128::from(self.0)).to_wire();
format!("{figure}%")
}
#[must_use]
pub fn from_percent(text: &str) -> Option<BuilderFee> {
let digits = text.trim().strip_suffix('%')?;
if !digits.bytes().all(|byte| byte.is_ascii_digit() || byte == b'.') {
return None;
}
let figure = Dec::parse(digits).ok()?;
if figure.places() > 3 {
return None;
}
u64::try_from(figure.units_at(3, Round::Down)?).ok().map(BuilderFee)
}
}
impl fmt::Display for BuilderFee {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
f.write_str(&self.percent())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct Builder {
address: Address,
fee: BuilderFee,
}
impl Builder {
#[must_use]
pub const fn new(address: Address, fee: BuilderFee) -> Builder {
Builder { address, fee }
}
#[must_use]
pub const fn address(&self) -> Address {
self.address
}
#[must_use]
pub const fn fee(&self) -> BuilderFee {
self.fee
}
#[must_use]
pub fn wire(&self) -> Map {
Map::new().put("b", self.address.to_hex()).put("f", self.fee.tenths())
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, thiserror::Error)]
#[error("the builder fee of {} is over the {} {} order allows ({})", .fee.tenths(), .cap.tenths(), .kind.one(), .cap)]
pub struct OverCap {
pub fee: BuilderFee,
pub cap: BuilderFee,
pub kind: AssetKind,
}
#[cfg(test)]
#[path = "tests/fee.rs"]
mod tests;