1use cid::Cid;
4use fvm_shared::MAX_CID_LEN;
5use fvm_shared::chainid::ChainID;
6use fvm_shared::clock::ChainEpoch;
7use fvm_shared::econ::TokenAmount;
8use fvm_shared::error::ErrorNumber;
9use fvm_shared::sys::out::network::NetworkContext;
10use fvm_shared::version::NetworkVersion;
11
12use crate::error::EpochBoundsError;
13use crate::sys;
14
15lazy_static::lazy_static! {
16 pub(crate) static ref NETWORK_CONTEXT: NetworkContext = {
17 unsafe {
18 sys::network::context().expect("failed to lookup network context")
19 }
20 };
21}
22
23pub fn chain_id() -> ChainID {
24 NETWORK_CONTEXT.chain_id.into()
25}
26
27pub fn curr_epoch() -> ChainEpoch {
28 NETWORK_CONTEXT.epoch
29}
30
31pub fn version() -> NetworkVersion {
32 NETWORK_CONTEXT.network_version
33}
34
35pub fn base_fee() -> TokenAmount {
36 NETWORK_CONTEXT.base_fee.into()
37}
38
39pub fn total_fil_circ_supply() -> TokenAmount {
40 unsafe {
41 sys::network::total_fil_circ_supply()
42 .expect("failed to get circulating supply")
43 .into()
44 }
45}
46
47pub fn tipset_timestamp() -> u64 {
49 NETWORK_CONTEXT.timestamp
50}
51
52pub fn tipset_cid(epoch: ChainEpoch) -> Result<Cid, EpochBoundsError> {
55 let mut buf = [0u8; MAX_CID_LEN];
56
57 unsafe {
58 match sys::network::tipset_cid(epoch, buf.as_mut_ptr(), MAX_CID_LEN as u32) {
59 Ok(len) => Ok(Cid::read_bytes(&buf[..len as usize]).expect("invalid cid")),
60 Err(ErrorNumber::IllegalArgument) => Err(EpochBoundsError::Invalid),
61 Err(ErrorNumber::LimitExceeded) => Err(EpochBoundsError::ExceedsLookback),
62 Err(other) => panic!("unexpected cid resolution failure: {}", other),
63 }
64 }
65}