#![deny(missing_docs)]
use std::collections::BTreeMap;
use essential_types::{
contract::Contract,
predicate::Predicate,
solution::{Solution, SolutionData, SolutionDataIndex},
ContentAddress, Key, PredicateAddress, StateReadBytecode, Value,
};
const ZEROED_PREDICATE: PredicateAddress = PredicateAddress {
contract: ContentAddress([0; 32]),
predicate: ContentAddress([0; 32]),
};
pub mod ser;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
pub struct CheckSolutionOutput {
pub utility: f64,
pub gas: u64,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
pub enum SolutionOutcome {
Success(u64),
Fail(String),
}
#[derive(serde::Serialize, serde::Deserialize)]
pub struct CheckSolution {
pub solution: Solution,
pub contracts: Vec<Contract>,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
pub struct QueryStateReads {
#[serde(
serialize_with = "essential_types::serde::bytecode::serialize_vec",
deserialize_with = "essential_types::serde::bytecode::deserialize_vec"
)]
pub state_read: Vec<StateReadBytecode>,
pub index: SolutionDataIndex,
pub solution: Solution,
pub request_type: StateReadRequestType,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
pub enum StateReadRequestType {
All(SlotsRequest),
Slots(SlotsRequest),
Reads,
}
#[derive(Default, Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
pub enum SlotsRequest {
#[default]
All,
Pre,
Post,
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
pub enum QueryStateReadsOutput {
#[serde(
serialize_with = "ser::serialize_map",
deserialize_with = "ser::deserialize_map"
)]
Reads(BTreeMap<ContentAddress, BTreeMap<Key, Value>>),
Slots(Slots),
All(
#[serde(
serialize_with = "ser::serialize_map",
deserialize_with = "ser::deserialize_map"
)]
BTreeMap<ContentAddress, BTreeMap<Key, Value>>,
Slots,
),
Failure(String),
}
#[derive(Default, Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq)]
pub struct Slots {
pub pre: Vec<Value>,
pub post: Vec<Value>,
}
impl QueryStateReads {
pub fn from_solution(
mut solution: Solution,
index: SolutionDataIndex,
predicate: &Predicate,
request_type: StateReadRequestType,
) -> Self {
for (i, d) in solution.data.iter_mut().enumerate() {
if i as SolutionDataIndex == index {
continue;
}
d.decision_variables = Default::default();
}
Self {
state_read: predicate.state_read.clone(),
index,
solution,
request_type,
}
}
pub fn inline_empty(
state_read: Vec<StateReadBytecode>,
request_type: StateReadRequestType,
) -> Self {
let data = SolutionData {
predicate_to_solve: ZEROED_PREDICATE,
decision_variables: Default::default(),
transient_data: Default::default(),
state_mutations: Default::default(),
};
Self::inline(state_read, data, request_type)
}
pub fn inline(
state_read: Vec<StateReadBytecode>,
data: SolutionData,
request_type: StateReadRequestType,
) -> Self {
Self {
state_read,
index: 0,
solution: Solution { data: vec![data] },
request_type,
}
}
}
impl Default for StateReadRequestType {
fn default() -> Self {
Self::All(SlotsRequest::default())
}
}