use crate::address::{Credential, RewardAddress};
use crate::primitives::{
DRepKeyHash, Epoch, Hash32, KeyHash, Lovelace, PoolId, ScriptHash, VrfKeyHash,
};
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum DRep {
KeyHash { hash: DRepKeyHash },
ScriptHash { hash: ScriptHash },
AlwaysAbstain,
AlwaysNoConfidence,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Anchor {
pub url: String,
pub data_hash: Hash32,
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum Relay {
#[serde(rename_all = "camelCase")]
SingleHostAddr {
#[serde(default, skip_serializing_if = "Option::is_none")]
port: Option<u16>,
#[serde(default, skip_serializing_if = "Option::is_none")]
ipv4: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
ipv6: Option<String>,
},
#[serde(rename_all = "camelCase")]
SingleHostName {
#[serde(default, skip_serializing_if = "Option::is_none")]
port: Option<u16>,
dns_name: String,
},
#[serde(rename_all = "camelCase")]
MultiHostName {
dns_name: String,
},
}
#[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PoolMetadata {
pub url: String,
pub hash: Hash32,
}
#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct UnitInterval {
pub numerator: u64,
pub denominator: u64,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PoolParams {
pub id: PoolId,
pub vrf_key_hash: VrfKeyHash,
pub pledge: Lovelace,
pub cost: Lovelace,
pub margin: UnitInterval,
pub reward_account: RewardAddress,
pub owners: Vec<KeyHash>,
#[serde(default, skip_serializing_if = "Vec::is_empty")]
pub relays: Vec<Relay>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub metadata: Option<PoolMetadata>,
}
#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "camelCase")]
pub enum Cert {
StakeRegistration { credential: Credential },
StakeDeregistration { credential: Credential },
StakeDelegation { credential: Credential, pool: PoolId },
PoolRegistration { pool_params: PoolParams },
PoolRetirement { pool: PoolId, epoch: Epoch },
#[serde(rename_all = "camelCase")]
Reg { credential: Credential, deposit: Lovelace },
#[serde(rename_all = "camelCase")]
Unreg { credential: Credential, deposit: Lovelace },
#[serde(rename_all = "camelCase")]
VoteDeleg { credential: Credential, drep: DRep },
#[serde(rename_all = "camelCase")]
StakeVoteDeleg { credential: Credential, pool: PoolId, drep: DRep },
#[serde(rename_all = "camelCase")]
StakeRegDeleg { credential: Credential, pool: PoolId, deposit: Lovelace },
#[serde(rename_all = "camelCase")]
VoteRegDeleg { credential: Credential, drep: DRep, deposit: Lovelace },
#[serde(rename_all = "camelCase")]
StakeVoteRegDeleg {
credential: Credential,
pool: PoolId,
drep: DRep,
deposit: Lovelace,
},
#[serde(rename_all = "camelCase")]
AuthCommitteeHot {
cold_credential: Credential,
hot_credential: Credential,
},
#[serde(rename_all = "camelCase")]
ResignCommitteeCold {
cold_credential: Credential,
#[serde(default, skip_serializing_if = "Option::is_none")]
anchor: Option<Anchor>,
},
#[serde(rename_all = "camelCase")]
RegDRep {
credential: Credential,
deposit: Lovelace,
#[serde(default, skip_serializing_if = "Option::is_none")]
anchor: Option<Anchor>,
},
#[serde(rename_all = "camelCase")]
UnregDRep { credential: Credential, deposit: Lovelace },
#[serde(rename_all = "camelCase")]
UpdateDRep {
credential: Credential,
#[serde(default, skip_serializing_if = "Option::is_none")]
anchor: Option<Anchor>,
},
}