use crate::epic_core::core::transaction::OutputFeatures;
use crate::epic_core::libtx::secp_ser;
use crate::epic_keychain::{BlindingFactor, Identifier};
use crate::epic_util::secp;
use crate::epic_util::secp::key::PublicKey;
use crate::epic_util::secp::pedersen::{Commitment, RangeProof};
use crate::epic_util::secp::Signature;
use crate::slate::CompatKernelFeatures;
use crate::slate_versions::v3::{OutputV3, TxKernelV3};
use crate::types::CbData;
use uuid::Uuid;
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct SlateV2 {
pub version_info: VersionCompatInfoV2,
pub num_participants: usize,
pub id: Uuid,
pub tx: TransactionV2,
#[serde(with = "secp_ser::string_or_u64")]
pub amount: u64,
#[serde(with = "secp_ser::string_or_u64")]
pub fee: u64,
#[serde(with = "secp_ser::string_or_u64")]
pub height: u64,
#[serde(with = "secp_ser::string_or_u64")]
pub lock_height: u64,
pub participant_data: Vec<ParticipantDataV2>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct VersionCompatInfoV2 {
pub version: u16,
pub orig_version: u16,
pub block_header_version: u16,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct ParticipantDataV2 {
#[serde(with = "secp_ser::string_or_u64")]
pub id: u64,
#[serde(with = "secp_ser::pubkey_serde")]
pub public_blind_excess: PublicKey,
#[serde(with = "secp_ser::pubkey_serde")]
pub public_nonce: PublicKey,
#[serde(with = "secp_ser::option_sig_serde")]
pub part_sig: Option<Signature>,
pub message: Option<String>,
#[serde(with = "secp_ser::option_sig_serde")]
pub message_sig: Option<Signature>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TransactionV2 {
#[serde(
serialize_with = "secp_ser::as_hex",
deserialize_with = "secp_ser::blind_from_hex"
)]
pub offset: BlindingFactor,
pub body: TransactionBodyV2,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TransactionBodyV2 {
pub inputs: Vec<InputV2>,
pub outputs: Vec<OutputV2>,
pub kernels: Vec<TxKernelV2>,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct InputV2 {
pub features: OutputFeatures,
#[serde(
serialize_with = "secp_ser::as_hex",
deserialize_with = "secp_ser::commitment_from_hex"
)]
pub commit: Commitment,
}
#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
pub struct OutputV2 {
pub features: OutputFeatures,
#[serde(
serialize_with = "secp_ser::as_hex",
deserialize_with = "secp_ser::commitment_from_hex"
)]
pub commit: Commitment,
#[serde(
serialize_with = "secp_ser::as_hex",
deserialize_with = "secp_ser::rangeproof_from_hex"
)]
pub proof: RangeProof,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct TxKernelV2 {
pub features: CompatKernelFeatures,
#[serde(with = "secp_ser::string_or_u64")]
pub fee: u64,
#[serde(with = "secp_ser::string_or_u64")]
pub lock_height: u64,
#[serde(
serialize_with = "secp_ser::as_hex",
deserialize_with = "secp_ser::commitment_from_hex"
)]
pub excess: Commitment,
#[serde(with = "secp_ser::sig_serde")]
pub excess_sig: secp::Signature,
}
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct CoinbaseV2 {
pub output: OutputV2,
pub kernel: TxKernelV2,
pub key_id: Option<Identifier>,
}
impl From<CbData> for CoinbaseV2 {
fn from(cb: CbData) -> CoinbaseV2 {
let output = OutputV3::from(&cb.output);
let output = OutputV2::from(&output);
let kernel = TxKernelV3::from(&cb.kernel);
let kernel = TxKernelV2::from(&kernel);
CoinbaseV2 {
output,
kernel,
key_id: cb.key_id,
}
}
}