1use cosmwasm_std::{Addr, Binary, Coin, Decimal};
2use schemars::JsonSchema;
3use serde::{Deserialize, Serialize};
4
5#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
7#[serde(rename_all = "snake_case")]
8pub enum ProvenanceRoute {
9    Attribute,
10    Marker,
11    Name,
12    Metadata,
13    Msgfees,
14}
15
16#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
18#[serde(rename_all = "snake_case")]
19pub struct Names {
20    pub records: Vec<Name>,
21}
22
23#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
25#[serde(rename_all = "snake_case")]
26pub struct Name {
27    pub name: String,
28    pub address: Addr,
29    pub restricted: bool,
30}
31
32#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq, JsonSchema)]
34#[serde(rename_all = "snake_case")]
35pub enum NameBinding {
36    Restricted,
37    Unrestricted,
38}
39
40impl Default for NameBinding {
42    fn default() -> Self {
43        NameBinding::Restricted
44    }
45}
46
47#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
49#[serde(rename_all = "snake_case")]
50pub struct Attributes {
51    pub address: Addr,
52    #[serde(default)]
53    pub attributes: Vec<Attribute>,
54}
55
56#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
58#[serde(rename_all = "snake_case")]
59pub enum AttributeValueType {
60    Uuid,
61    Json,
62    String,
63    Bytes,
64    Uri,
65    Int,
66    Float,
67    Proto,
68    Unspecified,
69}
70
71#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
73#[serde(rename_all = "snake_case")]
74pub struct Attribute {
75    pub name: String,
76    pub value: Binary,
77    #[serde(rename(serialize = "type", deserialize = "type"))]
78    pub value_type: AttributeValueType,
79}
80
81#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
83#[serde(rename_all = "snake_case")]
84pub struct Marker {
85    pub address: Addr,
86    #[serde(default)]
87    pub coins: Vec<Coin>,
88    pub account_number: u64,
89    pub sequence: u64,
90    #[serde(default)]
91    pub manager: String,
92    pub permissions: Vec<AccessGrant>,
93    pub status: MarkerStatus,
94    pub denom: String,
95    pub total_supply: Decimal,
96    pub marker_type: MarkerType,
97    pub supply_fixed: bool,
98}
99
100impl Marker {
101    pub fn bank_sends_disabled(&self) -> bool {
103        matches!(self.marker_type, MarkerType::Restricted)
104    }
105}
106
107#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
109#[serde(rename_all = "snake_case")]
110pub struct AccessGrant {
111    pub permissions: Vec<MarkerAccess>,
112    pub address: Addr,
113}
114
115#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
117#[serde(rename_all = "snake_case")]
118pub enum MarkerAccess {
119    Admin,
120    Burn,
121    Deposit,
122    Delete,
123    Mint,
124    Transfer,
125    Unspecified,
126    Withdraw,
127    Freeze,
128    UnFreeze,
129    ForceTransfer,
130}
131
132impl MarkerAccess {
133    pub fn all() -> Vec<MarkerAccess> {
135        vec![
136            MarkerAccess::Admin,
137            MarkerAccess::Burn,
138            MarkerAccess::Deposit,
139            MarkerAccess::Delete,
140            MarkerAccess::Mint,
141            MarkerAccess::Transfer,
142            MarkerAccess::Withdraw,
143            MarkerAccess::Freeze,
144            MarkerAccess::UnFreeze,
145            MarkerAccess::ForceTransfer,
146        ]
147    }
148}
149
150#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
152#[serde(rename_all = "snake_case")]
153pub enum MarkerType {
154    Coin,
155    Restricted,
156    Unspecified,
157}
158
159#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
161#[serde(rename_all = "snake_case")]
162pub enum MarkerStatus {
163    Active,
164    Cancelled,
165    Destroyed,
166    Finalized,
167    Proposed,
168    Unspecified,
169}
170
171#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
173#[serde(rename_all = "snake_case")]
174pub struct Scope {
175    pub scope_id: String,
176    pub specification_id: String,
177    #[serde(default)]
178    pub owners: Vec<Party>,
179    #[serde(default)]
180    pub data_access: Vec<Addr>,
181    pub value_owner_address: Addr,
182}
183
184#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
186#[serde(rename_all = "snake_case")]
187pub struct Session {
188    pub name: String,
189    pub session_id: String,
190    pub specification_id: String,
191    #[serde(default)]
192    pub parties: Vec<Party>,
193    pub context: Binary,
194}
195
196#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
198#[serde(rename_all = "snake_case")]
199pub struct Sessions {
200    pub sessions: Vec<Session>,
201}
202
203#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
205#[serde(rename_all = "snake_case")]
206pub struct Record {
207    pub name: String,
208    pub session_id: String,
209    pub specification_id: String,
210    pub process: Process,
211    #[serde(default)]
212    pub inputs: Vec<RecordInput>,
213    #[serde(default)]
214    pub outputs: Vec<RecordOutput>,
215}
216
217#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
219#[serde(rename_all = "snake_case")]
220pub struct Records {
221    pub records: Vec<Record>,
222}
223
224#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
226#[serde(rename_all = "snake_case")]
227pub struct Party {
228    pub address: Addr,
229    pub role: PartyType,
230}
231
232#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
234#[serde(rename_all = "snake_case")]
235pub enum PartyType {
236    Originator,
237    Servicer,
238    Investor,
239    Custodian,
240    Owner,
241    Affiliate,
242    Omnibus,
243    Provenance,
244    Unspecified,
245}
246
247#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
249#[serde(rename_all = "snake_case")]
250pub struct Process {
251    pub process_id: ProcessId,
252    pub method: String,
253    pub name: String,
254}
255
256#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
258#[serde(rename_all = "snake_case")]
259pub enum ProcessId {
260    Address { address: String },
262    Hash { hash: String },
264}
265
266#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
268#[serde(rename_all = "snake_case")]
269pub struct RecordInput {
270    pub name: String,
271    pub type_name: String,
272    pub source: RecordInputSource,
273    pub status: RecordInputStatus,
274}
275
276#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
278#[serde(rename_all = "snake_case")]
279pub enum RecordInputSource {
280    Record { record_id: String },
282    Hash { hash: String },
284}
285
286#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
288#[serde(rename_all = "snake_case")]
289pub enum RecordInputStatus {
290    Proposed,
291    Record,
292    Unspecified,
293}
294
295#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
297#[serde(rename_all = "snake_case")]
298pub struct RecordOutput {
299    pub hash: String,
300    pub status: ResultStatus,
301}
302
303#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
305#[serde(rename_all = "snake_case")]
306pub enum ResultStatus {
307    Pass,
308    Skip,
309    Fail,
310    Unspecified,
311}