use alloc::string::String;
use core::borrow::Borrow;
use packable::{prefix::StringPrefix, Packable};
use super::address::Hrp;
use crate::types::block::{helper::network_name_to_id, output::RentStructure, ConvertTo, Error, PROTOCOL_VERSION};
#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Packable)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[packable(unpack_error = Error)]
pub struct ProtocolParameters {
#[cfg_attr(feature = "serde", serde(alias = "protocolVersion"))]
protocol_version: u8,
#[packable(unpack_error_with = |err| Error::InvalidNetworkName(err.into_item_err()))]
#[cfg_attr(feature = "serde", serde(alias = "networkName"))]
network_name: StringPrefix<u8>,
#[cfg_attr(feature = "serde", serde(alias = "bech32Hrp"))]
bech32_hrp: Hrp,
#[cfg_attr(feature = "serde", serde(alias = "minPowScore"))]
min_pow_score: u32,
#[cfg_attr(feature = "serde", serde(alias = "belowMaxDepth"))]
below_max_depth: u8,
#[cfg_attr(feature = "serde", serde(alias = "rentStructure"))]
rent_structure: RentStructure,
#[cfg_attr(feature = "serde", serde(alias = "tokenSupply"))]
token_supply: u64,
}
impl Borrow<()> for ProtocolParameters {
fn borrow(&self) -> &() {
&()
}
}
impl Default for ProtocolParameters {
fn default() -> Self {
Self::new(
PROTOCOL_VERSION,
String::from("shimmer"),
"smr",
1500,
15,
RentStructure::default(),
1_813_620_509_061_365,
)
.unwrap()
}
}
impl ProtocolParameters {
pub fn new(
protocol_version: u8,
network_name: String,
bech32_hrp: impl ConvertTo<Hrp>,
min_pow_score: u32,
below_max_depth: u8,
rent_structure: RentStructure,
token_supply: u64,
) -> Result<Self, Error> {
Ok(Self {
protocol_version,
network_name: <StringPrefix<u8>>::try_from(network_name).map_err(Error::InvalidStringPrefix)?,
bech32_hrp: bech32_hrp.convert()?,
min_pow_score,
below_max_depth,
rent_structure,
token_supply,
})
}
pub fn protocol_version(&self) -> u8 {
self.protocol_version
}
pub fn network_name(&self) -> &str {
&self.network_name
}
pub fn network_id(&self) -> u64 {
network_name_to_id(&self.network_name)
}
pub fn bech32_hrp(&self) -> &Hrp {
&self.bech32_hrp
}
pub fn min_pow_score(&self) -> u32 {
self.min_pow_score
}
pub fn below_max_depth(&self) -> u8 {
self.below_max_depth
}
pub fn rent_structure(&self) -> &RentStructure {
&self.rent_structure
}
pub fn token_supply(&self) -> u64 {
self.token_supply
}
}
pub fn protocol_parameters() -> ProtocolParameters {
ProtocolParameters::new(
2,
String::from("testnet"),
"rms",
1500,
15,
crate::types::block::output::RentStructure::new(500, 10, 1),
1_813_620_509_061_365,
)
.unwrap()
}
#[allow(missing_docs)]
pub mod dto {
use super::*;
use crate::types::block::{output::RentStructure, Error};
#[derive(Clone, Debug, Eq, PartialEq)]
#[cfg_attr(
feature = "serde",
derive(serde::Serialize, serde::Deserialize),
serde(rename_all = "camelCase")
)]
pub struct ProtocolParametersDto {
#[cfg_attr(feature = "serde", serde(rename = "version"))]
pub protocol_version: u8,
pub network_name: String,
pub bech32_hrp: Hrp,
pub min_pow_score: u32,
pub below_max_depth: u8,
pub rent_structure: RentStructure,
pub token_supply: String,
}
impl TryFrom<ProtocolParametersDto> for ProtocolParameters {
type Error = Error;
fn try_from(value: ProtocolParametersDto) -> Result<Self, Self::Error> {
Self::new(
value.protocol_version,
value.network_name,
value.bech32_hrp,
value.min_pow_score,
value.below_max_depth,
value.rent_structure,
value
.token_supply
.parse()
.map_err(|_| Error::InvalidField("token_supply"))?,
)
}
}
}