use crate::contract::abi::continuation::ContinuationPoint;
use crate::contract::object::ObjectMetadata;
use crate::template::output::OutputMeta;
use crate::template::TemplateMetadata;
use ::miniscript::*;
use bitcoin::consensus::serialize;
use bitcoin::util::psbt::PartiallySignedTransaction;
use bitcoin::OutPoint;
use sapio_base::effects::EffectPath;
use sapio_base::serialization_helpers::SArc;
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap;
#[derive(Serialize, Deserialize)]
#[serde(rename = "linked_psbt")]
pub struct LinkedPSBT {
pub psbt: PartiallySignedTransaction,
pub metadata: TemplateMetadata,
pub output_metadata: Vec<ObjectMetadata>,
pub added_output_metadata: Vec<OutputMeta>,
}
#[derive(Serialize, Deserialize, JsonSchema, Debug)]
pub enum SapioStudioFormat {
#[serde(rename = "linked_psbt")]
LinkedPSBT {
psbt: String,
hex: String,
metadata: TemplateMetadata,
output_metadata: Vec<ObjectMetadata>,
added_output_metadata: Vec<OutputMeta>,
},
}
impl From<LinkedPSBT> for SapioStudioFormat {
fn from(l: LinkedPSBT) -> SapioStudioFormat {
let psbt = {
let bytes = serialize(&l.psbt);
base64::encode(bytes)
};
let hex = bitcoin::consensus::encode::serialize_hex(&l.psbt.extract_tx());
SapioStudioFormat::LinkedPSBT {
psbt,
hex,
metadata: l.metadata,
output_metadata: l.output_metadata,
added_output_metadata: l.added_output_metadata,
}
}
}
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
pub struct Program {
pub program: BTreeMap<SArc<EffectPath>, SapioStudioObject>,
}
#[derive(Serialize, Deserialize, Debug, JsonSchema)]
pub struct SapioStudioObject {
pub metadata: ObjectMetadata,
pub out: OutPoint,
pub txs: Vec<SapioStudioFormat>,
pub continue_apis: BTreeMap<SArc<EffectPath>, ContinuationPoint>,
}