use super::deal::DealProposal;
use crate::network::EPOCHS_IN_DAY;
use crate::DealWeight;
use clock::ChainEpoch;
use fil_types::{PaddedPieceSize, StoragePower, TOTAL_FILECOIN};
use num_bigint::Integer;
use num_traits::Zero;
use std::cmp::max;
use vm::TokenAmount;
pub const DEAL_UPDATES_INTERVAL: i64 = EPOCHS_IN_DAY;
const PROV_COLLATERAL_PERCENT_SUPPLY_NUM: i64 = 1;
const PROV_COLLATERAL_PERCENT_SUPPLY_DENOM: i64 = 100;
pub(super) const DEAL_MAX_LABEL_SIZE: usize = 256;
pub(super) fn deal_duration_bounds(_size: PaddedPieceSize) -> (ChainEpoch, ChainEpoch) {
(180 * EPOCHS_IN_DAY, 540 * EPOCHS_IN_DAY)
}
pub(super) fn deal_price_per_epoch_bounds(
_size: PaddedPieceSize,
_duration: ChainEpoch,
) -> (TokenAmount, &'static TokenAmount) {
(0.into(), &TOTAL_FILECOIN)
}
pub(super) fn deal_provider_collateral_bounds(
size: PaddedPieceSize,
network_raw_power: &StoragePower,
baseline_power: &StoragePower,
network_circulating_supply: &TokenAmount,
) -> (TokenAmount, &'static TokenAmount) {
let lock_target_num = network_circulating_supply * PROV_COLLATERAL_PERCENT_SUPPLY_NUM;
let power_share_num = TokenAmount::from(size.0);
let power_share_denom = max(max(network_raw_power, baseline_power), &power_share_num).clone();
let num: TokenAmount = power_share_num * lock_target_num;
let denom: TokenAmount = power_share_denom * PROV_COLLATERAL_PERCENT_SUPPLY_DENOM;
((num.div_floor(&denom)), &TOTAL_FILECOIN)
}
pub(super) fn deal_client_collateral_bounds(
_: PaddedPieceSize,
_: ChainEpoch,
) -> (TokenAmount, &'static TokenAmount) {
(TokenAmount::zero(), &TOTAL_FILECOIN) }
pub(super) fn collateral_penalty_for_deal_activation_missed(
provider_collateral: TokenAmount,
) -> TokenAmount {
provider_collateral
}
pub(super) fn deal_weight(proposal: &DealProposal) -> DealWeight {
let deal_duration = DealWeight::from(proposal.duration());
deal_duration * proposal.piece_size.0
}