ckb_ssri_std/public_module_traits/
udt.rs

1use ckb_std::ckb_types::{
2    bytes::Bytes,
3    packed::{Byte32Vec, Script, Transaction},
4};
5extern crate alloc;
6
7use alloc::vec::Vec;
8use serde::{Deserialize, Serialize};
9
10/// User-Defined Token (UDT) trait for implementing custom tokens on CKB
11///
12/// This trait defines the standard interface for implementing fungible tokens
13/// on the CKB blockchain following the SSRI protocol. 
14///
15/// # Implementation Notes
16///
17/// - All amounts are represented as u128 in convention
18/// - Methods that modify state return a Transaction that must be committed
19/// - Verification methods are separate from state-changing methods
20///
21/// # Example
22///
23/// ```rust,no_run
24/// use ckb_ssri_std::public_module_traits::udt::UDT;
25///
26/// struct MyToken;
27///
28/// impl UDT for MyToken {
29///     type Error = ();
30///     
31///     fn balance() -> Result<u128, Self::Error> {
32///         // Implementation
33///         Ok(0)
34///     }
35///     // ... implement other required methods
36/// }
37/// ```
38pub trait UDT {
39    type Error;
40    fn transfer(
41        tx: Option<Transaction>,
42        to_lock_vec: Vec<Script>,
43        to_amount_vec: Vec<u128>,
44    ) -> Result<Transaction, Self::Error>;
45    fn verify_transfer() -> Result<(), Self::Error>;
46    fn name() -> Result<Bytes, Self::Error>;
47    fn symbol() -> Result<Bytes, Self::Error>;
48    fn decimals() -> Result<u8, Self::Error>;
49    fn icon() -> Result<Bytes, Self::Error>;
50    fn mint(
51        tx: Option<Transaction>,
52        to_lock_vec: Vec<Script>,
53        to_amount_vec: Vec<u128>,
54    ) -> Result<Transaction, Self::Error>;
55    fn verify_mint() -> Result<(), Self::Error>;
56}
57pub const UDT_LEN: usize = 16;
58pub enum UDTError {
59    InsufficientBalance,
60    NoMintPermission,
61    NoBurnPermission,
62}
63
64pub trait UDTPausable: UDT {
65    /* NOTE: Pausing/Unpause without lock hashes should take effect on the global level */
66    fn pause(
67        tx: Option<Transaction>,
68        lock_hashes: &Vec<[u8; 32]>,
69    ) -> Result<Transaction, Self::Error>;
70    fn unpause(
71        tx: Option<Transaction>,
72        lock_hashes: &Vec<[u8; 32]>,
73    ) -> Result<Transaction, Self::Error>;
74    fn is_paused(lock_hashes: &Vec<[u8; 32]>) -> Result<Vec<bool>, Self::Error>;
75    fn enumerate_paused(offset: u64, limit: u64) -> Result<Byte32Vec, Self::Error>;
76}
77
78#[derive(Serialize, Deserialize, Clone, Debug)]
79pub struct UDTPausableData {
80    pub pause_list: Vec<[u8; 32]>,
81    pub next_type_script: Option<ScriptLike>
82}
83
84#[derive(Serialize, Deserialize, Clone, Debug)]
85pub struct ScriptLike {
86    pub code_hash: [u8; 32],
87    pub hash_type: u8,
88    pub args: Vec<u8>,
89}
90pub enum UDTPausableError {
91    NoPausePermission,
92    NoUnpausePermission,
93    AbortedFromPause,
94    IncompletePauseList,
95    CyclicPauseList,
96}