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 NFT 集合
20pub type CollectionId = candid::Principal; // 类型别名
21/// 字符串格式的 集合 id
22pub type CollectionIdText = String; // ? 字符串格式
23
24/// 用户 ID
25pub type UserId = candid::Principal; // 类型别名
26/// 字符串格式的 用户 ID
27pub type UserIdText = String; // ? 字符串格式
28
29/// 调用者 ID
30pub type CallerId = candid::Principal; // 类型别名
31/// 字符串格式的 调用者 ID
32pub type CallerIdText = String; // ? 字符串格式
33
34/// 子账户
35pub type Subaccount = icrc_ledger_types::icrc1::account::Subaccount; // 长度必须是 32 长度
36/// 字符串格式的 子账户
37pub type SubaccountHex = String; // ? 16 进制文本
38
39/// 账户 ID 通过 Principal 配合子账户计算得来
40/// 账户 一般是 account id,如果用户使用的是 principal 也要和 subaccount 一起转换成对应的 account id
41pub type AccountIdentifier = ic_ledger_types::AccountIdentifier; // 账户
42/// 字符串格式的 账户
43pub type AccountIdentifierHex = String; // ? 16 进制文本
44
45// =================== 基础方法 ===================
46
47/// 数字转 subaccount
48pub fn u64_to_subaccount(value: u64) -> Subaccount {
49    let mut subaccount: [u8; 32] = [0; 32];
50    subaccount[24..].copy_from_slice(&value.to_be_bytes());
51    subaccount
52}
53
54/// 获取调用者 principal id
55#[inline]
56pub fn caller() -> CallerId {
57    ic_cdk::api::msg_caller()
58}
59
60/// 获取本罐子的 principal id
61#[inline]
62pub fn self_canister_id() -> CanisterId {
63    ic_cdk::api::canister_self()
64}