Skip to main content

ic_canister_kit/
identity.rs

1// 和 principal 和 identity 相关
2
3/*
4
5引入包后, 直接使用如下方法即可增加查看当前用户的接口
6
7#[ic_cdk::query]
8async fn whoami() -> ic_canister_kit::types::UserId {
9    ic_canister_kit::identity::caller()
10}
11
12*/
13
14/// 罐子 ID
15pub type CanisterId = candid::Principal; // 类型别名
16/// 字符串格式罐子 id
17pub type CanisterIdText = String; // ? 字符串格式
18
19/// 用户 ID
20pub type UserId = candid::Principal; // 类型别名
21/// 字符串格式的 用户 ID
22pub type UserIdText = String; // ? 字符串格式
23
24/// 调用者 ID
25pub type CallerId = candid::Principal; // 类型别名
26/// 字符串格式的 调用者 ID
27pub type CallerIdText = String; // ? 字符串格式
28
29/// 子账户
30pub type Subaccount = icrc_ledger_types::icrc1::account::Subaccount; // 长度必须是 32 长度
31/// 字符串格式的 子账户
32pub type SubaccountHex = String; // ? 16 进制文本
33
34/// 账户 ID 通过 Principal 配合子账户计算得来
35/// 账户 一般是 account id,如果用户使用的是 principal 也要和 subaccount 一起转换成对应的 account id
36pub type AccountIdentifier = ic_ledger_types::AccountIdentifier; // 账户
37/// 字符串格式的 账户
38pub type AccountIdentifierHex = String; // ? 16 进制文本
39
40// =================== 基础方法 ===================
41
42/// 数字转 subaccount
43pub fn u64_to_subaccount(value: u64) -> Subaccount {
44    let mut subaccount: [u8; 32] = [0; 32];
45    subaccount[24..].copy_from_slice(&value.to_be_bytes());
46    subaccount
47}
48
49/// 获取调用者 principal id
50#[inline]
51pub fn caller() -> CallerId {
52    ic_cdk::api::msg_caller()
53}
54
55/// 获取本罐子的 principal id
56#[inline]
57pub fn self_canister_id() -> CanisterId {
58    ic_cdk::api::canister_self()
59}