use cosmwasm_schema::cw_serde;
use cosmwasm_std::{Addr, Binary, Coin, Decimal};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ProvenanceRoute {
Attribute,
Marker,
Name,
Metadata,
Msgfees,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Names {
pub records: Vec<Name>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Name {
pub name: String,
pub address: Addr,
pub restricted: bool,
}
#[derive(Serialize, Deserialize, Clone, Debug, Hash, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum NameBinding {
Restricted,
Unrestricted,
}
impl Default for NameBinding {
fn default() -> Self {
NameBinding::Restricted
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Attributes {
pub address: Addr,
#[serde(default)]
pub attributes: Vec<Attribute>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum AttributeValueType {
Uuid,
Json,
String,
Bytes,
Uri,
Int,
Float,
Proto,
Unspecified,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Attribute {
pub name: String,
pub value: Binary,
#[serde(rename(serialize = "type", deserialize = "type"))]
pub value_type: AttributeValueType,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Marker {
pub address: Addr,
pub allow_forced_transfer: bool,
#[serde(default)]
pub coins: Vec<Coin>,
pub account_number: u64,
pub sequence: u64,
#[serde(default)]
pub manager: String,
pub permissions: Vec<AccessGrant>,
pub status: MarkerStatus,
pub denom: String,
pub total_supply: Decimal,
pub marker_type: MarkerType,
pub supply_fixed: bool,
}
impl Marker {
pub fn bank_sends_disabled(&self) -> bool {
matches!(self.marker_type, MarkerType::Restricted)
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct AccessGrant {
pub permissions: Vec<MarkerAccess>,
pub address: Addr,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum MarkerAccess {
Admin,
Burn,
Deposit,
Delete,
Mint,
Transfer,
Unspecified,
Withdraw,
}
impl MarkerAccess {
pub fn all() -> Vec<MarkerAccess> {
vec![
MarkerAccess::Admin,
MarkerAccess::Burn,
MarkerAccess::Deposit,
MarkerAccess::Delete,
MarkerAccess::Mint,
MarkerAccess::Transfer,
MarkerAccess::Withdraw,
]
}
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum MarkerType {
Coin,
Restricted,
Unspecified,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum MarkerStatus {
Active,
Cancelled,
Destroyed,
Finalized,
Proposed,
Unspecified,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Scope {
pub scope_id: String,
pub specification_id: String,
#[serde(default)]
pub owners: Vec<Party>,
#[serde(default)]
pub data_access: Vec<Addr>,
pub value_owner_address: Addr,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Session {
pub name: String,
pub session_id: String,
pub specification_id: String,
#[serde(default)]
pub parties: Vec<Party>,
pub context: Binary,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Sessions {
pub sessions: Vec<Session>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Record {
pub name: String,
pub session_id: String,
pub specification_id: String,
pub process: Process,
#[serde(default)]
pub inputs: Vec<RecordInput>,
#[serde(default)]
pub outputs: Vec<RecordOutput>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Records {
pub records: Vec<Record>,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Party {
pub address: Addr,
pub role: PartyType,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum PartyType {
Originator,
Servicer,
Investor,
Custodian,
Owner,
Affiliate,
Omnibus,
Provenance,
Unspecified,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct Process {
pub process_id: ProcessId,
pub method: String,
pub name: String,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ProcessId {
Address { address: String },
Hash { hash: String },
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct RecordInput {
pub name: String,
pub type_name: String,
pub source: RecordInputSource,
pub status: RecordInputStatus,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RecordInputSource {
Record { record_id: String },
Hash { hash: String },
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum RecordInputStatus {
Proposed,
Record,
Unspecified,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub struct RecordOutput {
pub hash: String,
pub status: ResultStatus,
}
#[derive(Serialize, Deserialize, Clone, Debug, Eq, PartialEq, JsonSchema)]
#[serde(rename_all = "snake_case")]
pub enum ResultStatus {
Pass,
Skip,
Fail,
Unspecified,
}
#[cw_serde]
pub struct Fee {
pub recipient: Option<Addr>,
pub amount: Coin,
}