fix(configs): parse directly into rational numbers (#437)

This commit is contained in:
Santiago Carmuega 2024-04-15 18:54:53 -03:00 committed by GitHub
parent 7ff70f4020
commit 7cf861fc5e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 66 additions and 10 deletions

View file

@ -20,6 +20,7 @@ serde = { version = "1.0.136", optional = true, features = ["derive"] }
serde_json = { version = "1.0.79", optional = true }
base64 = "0.22.0"
serde_with = "3.7.0"
num-rational = "0.4.1"
[features]
json = ["serde", "serde_json"]

View file

@ -1,5 +1,26 @@
use serde::Deserialize;
use std::collections::HashMap;
use num_rational::BigRational;
use pallas_crypto::hash::Hash;
use pallas_primitives::conway::RationalNumber;
use serde::{Deserialize, Deserializer};
use std::{collections::HashMap, str::FromStr};
fn deserialize_rational<'de, D>(
deserializer: D,
) -> Result<pallas_primitives::alonzo::RationalNumber, D::Error>
where
D: Deserializer<'de>,
{
let s = f32::deserialize(deserializer)?;
let r = BigRational::from_float(s)
.ok_or(serde::de::Error::custom("can't turn float into rational"))?;
let r = pallas_primitives::alonzo::RationalNumber {
numerator: r.numer().try_into().map_err(serde::de::Error::custom)?,
denominator: r.denom().try_into().map_err(serde::de::Error::custom)?,
};
Ok(r)
}
#[derive(Debug, Deserialize)]
#[serde(rename_all = "camelCase")]
@ -21,10 +42,37 @@ impl From<ProtocolVersion> for pallas_primitives::alonzo::ProtocolVersion {
}
}
#[derive(Debug, Deserialize)]
#[derive(Debug, Deserialize, Clone)]
pub enum NonceVariant {
NeutralNonce,
Nonce,
}
impl From<NonceVariant> for pallas_primitives::alonzo::NonceVariant {
fn from(value: NonceVariant) -> Self {
match value {
NonceVariant::NeutralNonce => Self::NeutralNonce,
NonceVariant::Nonce => Self::Nonce,
}
}
}
#[derive(Debug, Deserialize, Clone)]
#[serde(rename_all = "camelCase")]
pub struct ExtraEntropy {
pub tag: Option<String>,
pub tag: NonceVariant,
pub hash: Option<String>,
}
impl From<ExtraEntropy> for pallas_primitives::alonzo::Nonce {
fn from(value: ExtraEntropy) -> Self {
Self {
variant: value.tag.into(),
hash: value
.hash
.map(|x| Hash::<32>::from_str(&x).expect("invalid nonce hash value")),
}
}
}
#[derive(Debug, Deserialize)]
@ -42,13 +90,20 @@ pub struct ProtocolParams {
pub pool_deposit: u64,
pub n_opt: u32,
pub min_pool_cost: u64,
pub e_max: u32,
pub extra_entropy: ExtraEntropy,
pub decentralisation_param: Option<u32>,
pub e_max: Option<u32>,
pub extra_entropy: Option<ExtraEntropy>,
pub rho: Option<f32>,
pub tau: Option<f32>,
pub a0: Option<f32>,
#[serde(deserialize_with = "deserialize_rational")]
pub decentralisation_param: RationalNumber,
#[serde(deserialize_with = "deserialize_rational")]
pub rho: pallas_primitives::alonzo::RationalNumber,
#[serde(deserialize_with = "deserialize_rational")]
pub tau: pallas_primitives::alonzo::RationalNumber,
#[serde(deserialize_with = "deserialize_rational")]
pub a0: pallas_primitives::alonzo::RationalNumber,
}
#[derive(Debug, Deserialize)]