use crate::DealWeight;
use address::Address;
use cid::{Cid, Prefix, Version};
use clock::ChainEpoch;
use crypto::Signature;
use encoding::tuple::*;
use encoding::Cbor;
use fil_types::PaddedPieceSize;
use num_bigint::bigint_ser;
use vm::TokenAmount;
pub const PIECE_CID_PREFIX: Prefix = Prefix {
version: Version::V1,
codec: cid::FIL_COMMITMENT_UNSEALED,
mh_type: cid::SHA2_256_TRUNC254_PADDED,
mh_len: 32,
};
#[derive(Clone, Debug, PartialEq, Serialize_tuple, Deserialize_tuple)]
pub struct DealProposal {
pub piece_cid: Cid,
pub piece_size: PaddedPieceSize,
pub verified_deal: bool,
pub client: Address,
pub provider: Address,
pub label: String,
pub start_epoch: ChainEpoch,
pub end_epoch: ChainEpoch,
#[serde(with = "bigint_ser")]
pub storage_price_per_epoch: TokenAmount,
#[serde(with = "bigint_ser")]
pub provider_collateral: TokenAmount,
#[serde(with = "bigint_ser")]
pub client_collateral: TokenAmount,
}
impl Cbor for DealProposal {}
impl DealProposal {
pub fn duration(&self) -> ChainEpoch {
self.end_epoch - self.start_epoch
}
pub fn weight(&self) -> DealWeight {
DealWeight::from(self.duration()) * self.piece_size.0
}
pub fn total_storage_fee(&self) -> TokenAmount {
self.storage_price_per_epoch.clone() * self.duration() as u64
}
pub fn client_balance_requirement(&self) -> TokenAmount {
&self.client_collateral + self.total_storage_fee()
}
pub fn provider_balance_requirement(&self) -> &TokenAmount {
&self.provider_collateral
}
}
#[derive(Clone, Debug, PartialEq, Serialize_tuple, Deserialize_tuple)]
pub struct ClientDealProposal {
pub proposal: DealProposal,
pub client_signature: Signature,
}
impl Cbor for ClientDealProposal {}
#[derive(Clone, Debug, PartialEq, Copy, Serialize_tuple, Deserialize_tuple)]
pub struct DealState {
pub sector_start_epoch: ChainEpoch, pub last_updated_epoch: ChainEpoch, pub slash_epoch: ChainEpoch, }