use crate::deploy::slot::{MarketSlot, binary_options_slot};
use crate::utils::MarketId;
use crate::utils::json::Json;
use crate::utils::sign::goldilocks::Fp;
use crate::utils::sign::tx::{BadTx, Envelope, Tx, TxType, element, number};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct SettleMarket {
pub slot: MarketSlot,
pub market: MarketId,
pub price: u32,
pub refund: bool,
}
impl SettleMarket {
#[must_use]
pub const fn at(slot: MarketSlot, market: MarketId, price: u32) -> SettleMarket {
SettleMarket { slot, market, price, refund: false }
}
#[must_use]
pub const fn up(slot: MarketSlot, market: MarketId, settlement_cap: u32) -> SettleMarket {
SettleMarket::at(slot, market, settlement_cap)
}
#[must_use]
pub const fn down(slot: MarketSlot, market: MarketId) -> SettleMarket {
SettleMarket::at(slot, market, 0)
}
#[must_use]
pub const fn refund(slot: MarketSlot, market: MarketId) -> SettleMarket {
SettleMarket { slot, market, price: 0, refund: true }
}
}
impl Tx for SettleMarket {
fn tx_type(&self) -> TxType {
TxType::BinaryOptionsSettleMarket
}
fn check_signing(&self, chain_id: u32, _envelope: &Envelope) -> Result<(), BadTx> {
crate::deploy::check_chain(chain_id)
}
fn hash_fields(&self) -> Vec<Fp> {
vec![element(self.slot.get()), element(self.market.get()), element(self.price), element(u8::from(self.refund))]
}
fn info_fields(&self) -> Vec<(&'static str, Json)> {
vec![
("MarketIndex", number(self.slot.get())),
("PublicMarketIndex", number(self.market.get())),
("SettlementPrice", number(self.price)),
("IsRefund", number(u8::from(self.refund))),
]
}
fn check(&self) -> Result<(), BadTx> {
binary_options_slot(self.slot)?;
if self.refund && self.price != 0 {
return Err(BadTx::new("SettlementPrice", "a refund carries price 0: it settles at the default price"));
}
Ok(())
}
}
#[cfg(test)]
#[path = "tests/settle.rs"]
mod tests;