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::call::msg_cycles_available128();
if available == 0 {
return candid::Nat::from(0_u128);
}
let accepted = ic_cdk::api::call::msg_cycles_accept128(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::api::management_canister::main::deposit_cycles(
ic_cdk::api::management_canister::provisional::CanisterIdRecord { 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::api::call::call::<_, (candid::Nat,)>(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::api::call::call_with_payment::<_, (candid::Nat,)>(
canister_id,
"wallet_receive",
(),
cycles,
)
.await;
super::fetch_and_wrap_call_result(canister_id, "wallet_receive", call_result)
}