canic_core/spec/icrc/icrc21/
mod.rs

1//! The [ICRC-21](https://github.com/dfinity/wg-identity-authentication/blob/main/topics/ICRC-21/icrc_21_consent_msg.md)
2//! Canister Call Consent Messages standard.
3
4///
5/// NOTE: We're using the code directly as importing the icrc-ledger-types is not
6/// currently a good idea.  It's got a lot of bloated dependencies and an older version
7/// of ic-stable-structures
8///
9mod errors;
10
11pub use errors::*;
12
13use crate::spec::prelude::*;
14
15///
16/// ConsentInfo
17///
18
19#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
20pub struct ConsentInfo {
21    pub consent_message: ConsentMessage,
22    pub metadata: ConsentMessageMetadata,
23}
24
25///
26/// ConsentMessage
27///
28
29#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
30pub enum ConsentMessage {
31    GenericDisplayMessage(String),
32    FieldsDisplayMessage(FieldsDisplay),
33}
34
35///
36/// ConsentMessageMetadata
37///
38
39#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
40pub struct ConsentMessageMetadata {
41    pub language: String,
42    pub utc_offset_minutes: Option<i16>,
43}
44
45///
46/// ConsentMessageRequest
47///
48
49#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
50pub struct ConsentMessageRequest {
51    pub method: String,
52    pub arg: Vec<u8>,
53    pub user_preferences: ConsentMessageSpec,
54}
55
56///
57/// ConsentMessageResponse
58/// Wrapper capturing the ok/error variants from an ICRC-21 consent request.
59///
60
61#[derive(CandidType, Deserialize)]
62pub enum ConsentMessageResponse {
63    Ok(ConsentInfo),
64    Err(Icrc21Error),
65}
66
67///
68/// ConsentMessageSpec
69///
70
71#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
72pub struct ConsentMessageSpec {
73    pub metadata: ConsentMessageMetadata,
74    pub device_spec: Option<DisplayMessageType>,
75}
76
77///
78/// DisplayMessageType
79///
80
81#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
82pub enum DisplayMessageType {
83    GenericDisplay,
84    FieldsDisplay,
85}
86
87///
88/// FieldsDisplay
89///
90
91#[derive(CandidType, Clone, Debug, Default, Deserialize, Eq, PartialEq)]
92pub struct FieldsDisplay {
93    pub intent: String,
94    pub fields: Vec<(String, Value)>,
95}
96
97///
98/// Value
99///
100
101#[derive(CandidType, Clone, Debug, Deserialize, Eq, PartialEq)]
102pub enum Value {
103    TokenAmount {
104        decimals: u8,
105        amount: u64,
106        symbol: String,
107    },
108    TimestampSeconds {
109        amount: u64,
110    },
111    DurationSeconds {
112        amount: u64,
113    },
114    Text {
115        content: String,
116    },
117}