pub mod abi;
pub mod v10;
pub mod v11;
pub mod v12;
pub mod v13;
pub mod v8;
pub mod v9;
pub extern crate fvm_ipld_amt;
pub extern crate fvm_ipld_bitfield;
pub extern crate fvm_ipld_blockstore;
pub extern crate fvm_ipld_encoding;
pub extern crate fvm_ipld_hamt;
pub extern crate fvm_shared as fvm_shared2;
pub extern crate fvm_shared3;
use fvm_ipld_hamt::BytesKey;
use fvm_shared4::ActorID;
use integer_encoding::VarInt;
pub mod frc46_token {
use crate::actor_id_key;
use cid::Cid;
use fvm_ipld_blockstore::Blockstore;
use fvm_ipld_encoding::tuple::*;
use fvm_ipld_hamt::Hamt;
use fvm_ipld_hamt::{BytesKey, Error as HamtError};
use fvm_shared3::econ::TokenAmount;
use fvm_shared4::ActorID;
type Map<'bs, BS, K, V> = Hamt<&'bs BS, V, K>;
type BalanceMap<'bs, BS> = Map<'bs, BS, BytesKey, TokenAmount>;
type AllowanceMap<'bs, BS> = Map<'bs, BS, BytesKey, Cid>;
type Result<T> = std::result::Result<T, HamtError>;
pub const DEFAULT_HAMT_BIT_WIDTH: u32 = 3;
#[derive(Serialize_tuple, Deserialize_tuple, PartialEq, Eq, Clone, Debug)]
pub struct TokenState {
pub supply: TokenAmount,
pub balances: Cid,
pub allowances: Cid,
hamt_bit_width: u32,
}
impl TokenState {
pub fn new<BS: Blockstore>(store: &BS) -> Result<Self> {
Self::new_with_bit_width(store, DEFAULT_HAMT_BIT_WIDTH)
}
pub fn new_with_bit_width<BS: Blockstore>(store: &BS, hamt_bit_width: u32) -> Result<Self> {
let empty_balance_map =
BalanceMap::new_with_bit_width(store, hamt_bit_width).flush()?;
let empty_allowances_map =
AllowanceMap::new_with_bit_width(store, hamt_bit_width).flush()?;
Ok(Self {
supply: Default::default(),
balances: empty_balance_map,
allowances: empty_allowances_map,
hamt_bit_width,
})
}
pub fn get_balance<BS: Blockstore>(
&self,
bs: &BS,
owner: ActorID,
) -> Result<Option<TokenAmount>> {
let balances = self.get_balance_map(bs)?;
balances
.get(&actor_id_key(owner))
.map(|amount_opt| amount_opt.map(|opt| opt.to_owned()))
}
pub fn get_balance_map<'bs, BS: Blockstore>(
&self,
bs: &'bs BS,
) -> Result<BalanceMap<'bs, BS>> {
BalanceMap::load_with_bit_width(&self.balances, bs, self.hamt_bit_width)
}
}
}
pub fn actor_id_key(a: ActorID) -> BytesKey {
a.encode_var_vec().into()
}