1use amplify::confinement::{SmallBlob, TinyOrdMap, TinyString};
23use amplify::Bytes32;
24use rgb::{AssignmentType, ContractId, GlobalStateType};
25use strict_types::value;
26
27use crate::LIB_NAME_RGB_STD;
28
29#[derive(Wrapper, Copy, Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)]
33#[wrapper(Deref, BorrowSlice, Hex, Index, RangeOps)]
34#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
35#[strict_type(lib = LIB_NAME_RGB_STD)]
36#[cfg_attr(
37 feature = "serde",
38 derive(Serialize, Deserialize),
39 serde(crate = "serde_crate", transparent)
40)]
41pub struct SupplId(
42 #[from]
43 #[from([u8; 32])]
44 Bytes32,
45);
46
47#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
52#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
53#[strict_type(lib = LIB_NAME_RGB_STD)]
54#[cfg_attr(
55 feature = "serde",
56 derive(Serialize, Deserialize),
57 serde(crate = "serde_crate", rename_all = "camelCase")
58)]
59pub struct ContractSuppl {
60 pub contract_id: ContractId,
61 pub ticker: TickerSuppl,
62 pub media_kit: TinyString,
65 pub global_state: TinyOrdMap<AssignmentType, OwnedStateSuppl>,
66 pub owned_state: TinyOrdMap<AssignmentType, OwnedStateSuppl>,
67 pub extensions: TinyOrdMap<u16, SmallBlob>,
69}
70
71#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
72#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
73#[strict_type(lib = LIB_NAME_RGB_STD, tags = custom)]
74#[cfg_attr(
75 feature = "serde",
76 derive(Serialize, Deserialize),
77 serde(crate = "serde_crate", rename_all = "camelCase")
78)]
79pub enum TickerSuppl {
80 #[strict_type(tag = 0, dumb)]
81 Absent,
82 #[strict_type(tag = 1)]
83 Global(GlobalStateType, value::Path),
84 #[strict_type(tag = 2)]
85 Owned(AssignmentType, value::Path),
86}
87
88#[derive(Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug)]
89#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
90#[strict_type(lib = LIB_NAME_RGB_STD)]
91#[cfg_attr(
92 feature = "serde",
93 derive(Serialize, Deserialize),
94 serde(crate = "serde_crate", rename_all = "camelCase")
95)]
96pub struct OwnedStateSuppl {
97 pub meaning: TinyString,
98 pub velocity: VelocityHint,
99}
100
101#[derive(Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash, Debug, Display, Default)]
102#[derive(StrictType, StrictEncode, StrictDecode)]
103#[strict_type(lib = LIB_NAME_RGB_STD, tags = repr, try_from_u8, into_u8)]
104#[cfg_attr(
105 feature = "serde",
106 derive(Serialize, Deserialize),
107 serde(crate = "serde_crate", rename_all = "camelCase")
108)]
109#[display(lowercase)]
110#[repr(u8)]
111pub enum VelocityHint {
112 #[default]
113 Unspecified = 0,
114 Seldom = 15,
117 Episodic = 31,
119 Regular = 63,
121 Frequent = 127,
123 HighFrequency = 255,
125}
126
127impl VelocityHint {
128 pub fn with_value(value: &u8) -> Self {
129 match *value {
130 0 => VelocityHint::Unspecified,
131 1..=15 => VelocityHint::Seldom,
132 16..=31 => VelocityHint::Episodic,
133 32..=63 => VelocityHint::Regular,
134 64..=127 => VelocityHint::Frequent,
135 128..=255 => VelocityHint::HighFrequency,
136 }
137 }
138}