use charms_client::{
BeamSource, NormalizedSpell,
tx::{Chain, Tx},
};
use charms_data::{App, B32, Data, UtxoId, util};
use serde::{Deserialize, Serialize};
use serde_with::{DisplayFromStr, IfIsHumanReadable, base64::Base64, serde_as};
use std::collections::BTreeMap;
pub type FeeAddressForNetwork = BTreeMap<String, String>;
#[derive(Clone, Debug, Serialize, Deserialize)]
pub struct CharmsFee {
pub fee_addresses: BTreeMap<Chain, FeeAddressForNetwork>,
pub fee_rate: u64,
pub fee_base: u64,
}
impl CharmsFee {
pub fn fee_address(&self, chain: &Chain, network: &str) -> Option<&str> {
self.fee_addresses.get(chain).and_then(|fee_addresses| {
fee_addresses
.get(network)
.map(|fee_address| fee_address.as_str())
})
}
}
serde_with::serde_conv!(
NormalizedSpellHex,
NormalizedSpell,
|data: &NormalizedSpell| hex::encode(util::write(data).expect("failed to write Data")),
|s: String| util::read(hex::decode(&s)?.as_slice())
);
serde_with::serde_conv!(
DataHex,
Data,
|data: &Data| hex::encode(util::write(data).expect("failed to write Data")),
|s: String| util::read(hex::decode(&s)?.as_slice())
);
#[serde_as]
#[derive(Debug, Serialize, Deserialize)]
pub struct ProveRequest {
#[serde_as(as = "IfIsHumanReadable<NormalizedSpellHex>")]
pub spell: NormalizedSpell,
#[serde_as(as = "IfIsHumanReadable<BTreeMap<DisplayFromStr, DataHex>>")]
#[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
pub app_private_inputs: BTreeMap<App, Data>,
#[serde_as(as = "IfIsHumanReadable<BTreeMap<DisplayFromStr, _>>")]
#[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
pub tx_ins_beamed_source_utxos: BTreeMap<usize, BeamSource>,
#[serde_as(as = "IfIsHumanReadable<BTreeMap<DisplayFromStr, Base64>>")]
#[serde(skip_serializing_if = "BTreeMap::is_empty", default)]
pub binaries: BTreeMap<B32, Vec<u8>>,
#[serde(skip_serializing_if = "Vec::is_empty", default)]
pub prev_txs: Vec<Tx>,
pub change_address: String,
#[serde(default)]
pub fee_rate: f64,
pub chain: Chain,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub collateral_utxo: Option<UtxoId>,
}