use amplify::confinement::SmallBlob;
use rgb::bitcoin::hashes::sha256d;
use rgb::bitcoin::{OutPoint as Outpoint, Txid};
use strict_encoding::{StrictDeserialize, StrictSerialize};
use strict_types::StrictVal;
use super::LIB_NAME_RGB_CONTRACT;
#[derive(Clone, Ord, PartialOrd, Eq, PartialEq, Hash, Debug, From)]
#[derive(StrictType, StrictDumb, StrictEncode, StrictDecode)]
#[strict_type(lib = LIB_NAME_RGB_CONTRACT, dumb = ProofOfReserves::new(strict_dumb!(), strict_dumb!()))]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize), serde(crate = "serde_crate"))]
pub struct ProofOfReserves {
pub utxo: Outpoint,
pub proof: SmallBlob,
}
impl StrictSerialize for ProofOfReserves {}
impl StrictDeserialize for ProofOfReserves {}
impl ProofOfReserves {
pub fn new(utxo: Outpoint, proof: SmallBlob) -> ProofOfReserves {
ProofOfReserves { utxo, proof }
}
pub fn from_strict_val_unchecked(value: &StrictVal) -> Self {
let utxo = value.unwrap_struct("utxo");
let txid_bytes: [u8; 32] = utxo
.unwrap_struct("txid")
.unwrap_bytes()
.try_into()
.unwrap();
let txid = Txid::from_raw_hash(*sha256d::Hash::from_bytes_ref(&txid_bytes));
let vout: u32 = utxo.unwrap_struct("vout").unwrap_uint();
let utxo = Outpoint::new(txid, vout);
let proof = SmallBlob::from_checked(value.unwrap_struct("proof").unwrap_bytes().into());
Self { utxo, proof }
}
}