use crate::identity::CanisterId;
#[inline]
pub fn wallet_balance() -> candid::Nat {
candid::Nat::from(super::self_canister_cycles()) }
#[inline]
pub fn wallet_receive<F>(callback: F) -> candid::Nat
where
F: FnOnce(u128),
{
let available = ic_cdk::api::msg_cycles_available();
if available == 0 {
return candid::Nat::from(0_u128);
}
let accepted = ic_cdk::api::msg_cycles_accept(available);
assert!(accepted == available);
callback(accepted);
candid::Nat::from(accepted)
}
pub async fn deposit_cycles(
canister_id: CanisterId,
cycles: u128,
) -> Result<(), super::types::CanisterCallError> {
let call_result = ic_cdk::management_canister::deposit_cycles(
&ic_cdk::management_canister::DepositCyclesArgs { canister_id },
cycles,
)
.await;
super::wrap_call_result(canister_id, "ic#deposit_cycles", call_result)
}
pub async fn call_wallet_balance(
canister_id: CanisterId,
) -> super::types::CanisterCallResult<candid::Nat> {
let call_result = ic_cdk::call::Call::unbounded_wait(canister_id, "wallet_balance").await;
super::fetch_and_wrap_call_result(canister_id, "deposit_cycles", call_result)
}
pub async fn call_wallet_receive(
canister_id: CanisterId,
cycles: u64,
) -> super::types::CanisterCallResult<candid::Nat> {
let call_result = ic_cdk::call::Call::unbounded_wait(canister_id, "wallet_receive")
.with_cycles(cycles as u128)
.await;
super::fetch_and_wrap_call_result(canister_id, "wallet_receive", call_result)
}