use crate::order_types;
use crate::service::submit::{NotConfirmed, Submission, TxStatus};
use crate::tokens::CHAIN_ID_HELP;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct PlaceInput {
#[schemars(description = CHAIN_ID_HELP)]
pub chain_id: String,
pub proxy_owner: String,
pub from: String,
pub to: String,
pub amount: String,
pub start_out: String,
pub end_out: String,
#[serde(default)]
pub decay_secs: Option<u64>,
#[serde(default)]
pub duration_secs: Option<u64>,
#[serde(default)]
pub deadline_secs: Option<u64>,
#[serde(default)]
pub relay: bool,
#[serde(default)]
pub self_submit: bool,
#[serde(default)]
pub dry_run: bool,
#[serde(default)]
pub max_amount: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct PlaceOutcome {
pub dry_run: bool,
pub chain_id: u64,
pub order: order_types::OrderDto,
pub id: String,
pub authorization: order_types::IntentAuthorizationDto,
#[serde(skip_serializing_if = "Option::is_none")]
pub envelope: Option<String>,
pub digest: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub signature: Option<String>,
pub relay: Option<serde_json::Value>,
pub tx_hash: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tx_status: Option<TxStatus>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tx_error: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub tx_explorer_url: Option<String>,
}
impl PlaceOutcome {
pub(super) fn record(&mut self, submission: Submission) {
let hash = submission.hash_hex();
self.tx_explorer_url = crate::display::tx_url(self.chain_id, &hash);
self.tx_hash = Some(hash);
self.tx_status = Some(submission.status);
self.tx_error = submission.error;
}
pub fn not_confirmed(&self) -> Option<NotConfirmed> {
NotConfirmed::check(self.tx_hash.as_deref(), self.tx_status, self.tx_error.as_deref())
}
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct ListInput {
#[schemars(description = CHAIN_ID_HELP)]
pub chain_id: String,
pub owner: Option<String>,
pub agent: Option<String>,
#[serde(default)]
pub lookback_blocks: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct StatusInput {
#[schemars(description = CHAIN_ID_HELP)]
pub chain_id: String,
pub id: String,
#[serde(default)]
pub lookback_blocks: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct PolicyInput {
#[schemars(description = CHAIN_ID_HELP)]
pub chain_id: String,
pub owner: String,
pub agent: String,
#[serde(default)]
pub lookback_blocks: Option<u64>,
#[serde(default)]
pub tokens: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct IntentRecord {
pub id: String,
pub placed_by: String,
pub owner: String,
pub agent: Option<String>,
pub pair: String,
pub amount_in: String,
pub start_out: String,
pub end_out: String,
pub window: String,
pub exclusive_window: bool,
pub floor_now: String,
pub fee_now: String,
pub required_now: String,
pub floor_for_outsider: String,
pub required_for_outsider: String,
pub status: String,
pub reason: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct PolicyOutput {
pub owner: String,
pub agent: String,
pub proxy: String,
pub expiry: String,
pub epoch_len: String,
pub action_mask: String,
pub generation: String,
pub tokens: Vec<TokenPolicy>,
pub note: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, schemars::JsonSchema)]
pub struct TokenPolicy {
pub token: String,
pub allowed: bool,
pub cap: String,
pub used: String,
pub epoch_start: String,
}