fvm_sdk/
network.rs

1// Copyright 2021-2023 Protocol Labs
2// SPDX-License-Identifier: Apache-2.0, MIT
3use 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
47/// Returns the current block time in seconds since the EPOCH.
48pub fn tipset_timestamp() -> u64 {
49    NETWORK_CONTEXT.timestamp
50}
51
52/// Returns the tipset CID of the specified epoch, if available. Allows querying from now up to
53/// finality (900 epochs).
54pub 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}