#![doc(html_no_source)]
use serde::{Deserialize, Serialize};
use starknet_core::types::Felt;
use thiserror::Error;
#[derive(Debug, Error)]
#[non_exhaustive]
pub enum DeployerError {
#[error("manifest JSON parse failed: {0}")]
Json(#[from] serde_json::Error),
#[error("invalid felt in field `{field}`: {value}")]
InvalidFelt {
field: &'static str,
value: String,
},
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct ClassHashes {
#[serde(rename = "normalAmmClassHash")]
pub normal_amm: String,
#[serde(rename = "normalMathRuntimeClassHash")]
pub normal_math_runtime: String,
#[serde(rename = "normalFactoryPluginClassHash")]
pub normal_factory_plugin: String,
#[serde(rename = "lognormalAmmClassHash")]
pub lognormal_amm: String,
#[serde(rename = "lognormalMathRuntimeClassHash")]
pub lognormal_math_runtime: String,
#[serde(rename = "lognormalFactoryPluginClassHash")]
pub lognormal_factory_plugin: String,
#[serde(rename = "bivariateAmmClassHash")]
pub bivariate_amm: String,
#[serde(rename = "bivariateMathRuntimeClassHash")]
pub bivariate_math_runtime: String,
#[serde(rename = "bivariateFactoryPluginClassHash")]
pub bivariate_factory_plugin: String,
#[serde(rename = "multinoulliAmmClassHash")]
pub multinoulli_amm: String,
#[serde(rename = "multinoulliMathRuntimeClassHash")]
pub multinoulli_math_runtime: String,
#[serde(rename = "multinoulliFactoryPluginClassHash")]
pub multinoulli_factory_plugin: String,
#[serde(rename = "distributionFactoryClassHash")]
pub distribution_factory: String,
#[serde(rename = "oracleClassHash")]
pub oracle: String,
#[serde(rename = "insuranceClassHash", default)]
pub insurance: String,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct CollateralToken {
pub address: String,
pub symbol: String,
pub decimals: u8,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
pub struct Deployment {
pub network: String,
pub timestamp: String,
pub deployer: String,
#[serde(rename = "classHashes")]
pub class_hashes: ClassHashes,
#[serde(rename = "factoryAddress")]
pub factory_address: String,
#[serde(rename = "oracleAddress")]
pub oracle_address: String,
#[serde(rename = "multinoulliPluginAddress", default)]
pub multinoulli_plugin_address: String,
#[serde(rename = "normalPluginAddress", default)]
pub normal_plugin_address: String,
#[serde(rename = "lognormalPluginAddress", default)]
pub lognormal_plugin_address: String,
#[serde(rename = "bivariatePluginAddress", default)]
pub bivariate_plugin_address: String,
#[serde(rename = "collateralToken")]
pub collateral_token: CollateralToken,
}
impl Deployment {
pub fn sepolia() -> Result<Self, DeployerError> {
serde_json::from_slice(deadeye_artifacts::SEPOLIA_DEPLOYMENT_BYTES).map_err(Into::into)
}
pub fn mainnet() -> Result<Self, DeployerError> {
serde_json::from_slice(deadeye_artifacts::MAINNET_DEPLOYMENT_BYTES).map_err(Into::into)
}
pub fn from_bytes(bytes: &[u8]) -> Result<Self, DeployerError> {
serde_json::from_slice(bytes).map_err(Into::into)
}
pub fn factory_felt(&self) -> Result<Felt, DeployerError> {
Felt::from_hex(&self.factory_address).map_err(|_| DeployerError::InvalidFelt {
field: "factoryAddress",
value: self.factory_address.clone(),
})
}
pub fn oracle_felt(&self) -> Result<Felt, DeployerError> {
Felt::from_hex(&self.oracle_address).map_err(|_| DeployerError::InvalidFelt {
field: "oracleAddress",
value: self.oracle_address.clone(),
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn sepolia_manifest_parses() {
let d = Deployment::sepolia().expect("sepolia manifest parses");
assert_eq!(d.network, "sepolia");
assert!(!d.factory_address.is_empty());
assert!(!d.oracle_address.is_empty());
let factory = d.factory_felt().expect("factory address is a valid felt");
assert!(factory != Felt::ZERO);
}
#[test]
fn mainnet_manifest_parses() {
let _ = Deployment::mainnet().expect("mainnet manifest parses");
}
#[test]
fn class_hashes_are_present() {
let d = Deployment::sepolia().expect("sepolia manifest parses");
assert!(!d.class_hashes.normal_amm.is_empty());
assert!(!d.class_hashes.lognormal_amm.is_empty());
assert!(!d.class_hashes.multinoulli_amm.is_empty());
assert!(!d.class_hashes.bivariate_amm.is_empty());
assert!(!d.class_hashes.distribution_factory.is_empty());
assert!(!d.class_hashes.oracle.is_empty());
}
}