use massa_deferred_calls::DeferredCall;
use massa_final_state::StateChanges;
use massa_models::{
address::Address, amount::Amount, block_id::BlockId, deferred_calls::DeferredCallId,
operation::OperationId, output_event::SCOutputEvent, slot::Slot,
};
use serde::{Deserialize, Serialize};
use std::{collections::VecDeque, fmt::Display};
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum ReadOnlyResult {
Error(String),
Ok(Vec<u8>),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ExecuteReadOnlyResponse {
pub executed_at: Slot,
pub result: ReadOnlyResult,
pub output_events: VecDeque<SCOutputEvent>,
pub gas_cost: u64,
pub state_changes: StateChanges,
}
impl Display for ExecuteReadOnlyResponse {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
writeln!(f, "Executed at slot: {}", self.executed_at)?;
writeln!(
f,
"Result: {}",
match &self.result {
ReadOnlyResult::Error(e) =>
format!("an error occurred during the execution: {}", e),
ReadOnlyResult::Ok(ret) => format!("success, returned value: {:?}", ret),
}
)?;
writeln!(f, "Gas cost: {}", self.gas_cost)?;
if !self.output_events.is_empty() {
writeln!(f, "Generated events:",)?;
for event in self.output_events.iter() {
writeln!(f, "{}", event)?; }
}
Ok(())
}
}
#[derive(Debug, Deserialize, Clone, Serialize)]
pub struct ReadOnlyBytecodeExecution {
pub max_gas: u64,
pub bytecode: Vec<u8>,
pub address: Option<Address>,
pub operation_datastore: Option<Vec<u8>>,
pub fee: Option<Amount>,
}
#[derive(Debug, Deserialize, Clone, Serialize)]
pub struct ReadOnlyCall {
pub max_gas: u64,
pub target_address: Address,
pub target_function: String,
pub parameter: Vec<u8>,
pub caller_address: Option<Address>,
pub coins: Option<Amount>,
pub fee: Option<Amount>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum TransferContext {
#[serde(rename = "operation_id")]
Operation(OperationId),
#[serde(rename = "asc_index")]
ASC(u64),
#[serde(rename = "deferred_call_id")]
DeferredCall(DeferredCallId),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct Transfer {
pub from: Address,
pub to: Address,
pub amount: Amount,
pub effective_amount_received: Amount,
pub succeed: bool,
pub fee: Amount,
pub block_id: BlockId,
pub context: TransferContext,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DeferredCallsQuoteRequest {
pub target_slot: Slot,
pub max_gas_request: u64,
pub params_size: u64,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DeferredCallsQuoteResponse {
pub target_slot: Slot,
pub max_gas_request: u64,
pub available: bool,
pub price: Amount,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DeferredCallResponse {
pub call_id: String,
pub call: DeferredCall,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DeferredCallsSlotResponse {
pub slot: Slot,
pub call_ids: Vec<String>,
}