use crate::subnet_id::SubnetID;
use fvm_ipld_encoding::repr::*;
use fvm_shared::{address::Address, clock::ChainEpoch, econ::TokenAmount};
use serde::{Deserialize, Serialize};
pub const MANIFEST_ID: &str = "ipc_subnet_actor";
#[repr(u8)]
#[derive(
Copy,
Debug,
Clone,
Serialize_repr,
Deserialize_repr,
PartialEq,
Eq,
strum::EnumString,
strum::VariantNames,
)]
#[strum(serialize_all = "snake_case")]
pub enum PermissionMode {
Collateral,
Federated,
Static,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct Asset {
pub kind: AssetKind,
pub token_address: Option<Address>,
}
impl Default for Asset {
fn default() -> Self {
Self {
kind: AssetKind::Native,
token_address: None,
}
}
}
#[repr(u8)]
#[derive(
Copy,
Debug,
Clone,
Serialize_repr,
Deserialize_repr,
PartialEq,
Eq,
strum::EnumString,
strum::VariantNames,
)]
#[strum(serialize_all = "snake_case")]
pub enum AssetKind {
Native,
ERC20,
}
#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq)]
pub struct ConstructParams {
pub parent: SubnetID,
pub ipc_gateway_addr: Address,
pub consensus: ConsensusType,
pub min_validator_stake: TokenAmount,
pub min_validators: u64,
pub bottomup_check_period: ChainEpoch,
pub active_validators_limit: u16,
pub min_cross_msg_fee: TokenAmount,
pub permission_mode: PermissionMode,
pub supply_source: Asset,
pub collateral_source: Asset,
pub validator_gater: Address,
pub validator_rewarder: Address,
}
#[derive(PartialEq, Eq, Clone, Copy, Debug, Deserialize_repr, Serialize_repr)]
#[repr(u64)]
pub enum ConsensusType {
Fendermint,
}