canic_core/interface/ck/
mod.rs

1//! ck Interfaces
2//! Convenience bindings for ck-token ledgers deployed by the IC team.
3
4use crate::{
5    Error, env,
6    interface::{icrc::icrc2::icrc2_allowance, prelude::*},
7};
8
9///
10/// CkToken
11/// Enumerates supported ck-ledger canisters with helper methods.
12///
13
14#[derive(Clone, Copy, Debug)]
15pub enum CkToken {
16    CkBtc,
17    CkEth,
18
19    // ERC-20
20    CkLink,
21    CkOct,
22    CkPepe,
23    CkUsdc,
24    CkUsdt,
25}
26
27impl CkToken {
28    #[must_use]
29    pub fn ledger_canister(&self) -> Principal {
30        match &self {
31            Self::CkBtc => *env::ck::CKBTC_LEDGER_CANISTER,
32            Self::CkEth => *env::ck::CKETH_LEDGER_CANISTER,
33
34            Self::CkLink => *env::ck::CKLINK_LEDGER_CANISTER,
35            Self::CkOct => *env::ck::CKOCT_LEDGER_CANISTER,
36            Self::CkPepe => *env::ck::CKPEPE_LEDGER_CANISTER,
37            Self::CkUsdc => *env::ck::CKUSDC_LEDGER_CANISTER,
38            Self::CkUsdt => *env::ck::CKUSDT_LEDGER_CANISTER,
39        }
40    }
41}
42
43///
44/// ck_icrc2_allowance
45/// Retrieve the remaining allowance for a spender on a ck-ledger.
46///
47pub async fn ck_icrc2_allowance(
48    token: CkToken,
49    account: impl Into<Account>,
50    spender: impl Into<Account>,
51) -> Result<Nat, Error> {
52    icrc2_allowance(token.ledger_canister(), account, spender).await
53}