use super::gateway::Signature64;
use super::ser::{EpeeRead, EpeeWrite, Reader, write_var_bytes, write_vec};
use super::types::{AccountPublicAddr, Value256};
use super::variant::{Variant, tag};
use super::varint::append_varint;
use crate::error::Result;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct AccountPublicAddrOld {
pub spend_key: Value256,
pub view_key: Value256,
}
impl EpeeWrite for AccountPublicAddrOld {
fn write_epee(&self, out: &mut Vec<u8>) {
self.spend_key.write_epee(out);
self.view_key.write_epee(out);
}
}
impl EpeeRead for AccountPublicAddrOld {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(AccountPublicAddrOld {
spend_key: Value256::read_epee(r)?,
view_key: Value256::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct TxInMultisig {
pub amount: u64,
pub multisig_out_id: Value256,
pub sigs_count: u64,
pub etc_details: Vec<Variant>,
}
impl EpeeWrite for TxInMultisig {
fn write_epee(&self, out: &mut Vec<u8>) {
append_varint(out, self.amount);
self.multisig_out_id.write_epee(out);
append_varint(out, self.sigs_count);
write_vec(&self.etc_details, out);
}
}
impl EpeeRead for TxInMultisig {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(TxInMultisig {
amount: r.read_varint()?,
multisig_out_id: Value256::read_epee(r)?,
sigs_count: r.read_varint()?,
etc_details: r.read_vec()?,
})
}
}
#[derive(Clone, Debug)]
pub enum TxoutTarget {
ToKey {
key: Value256,
mix_attr: u8,
},
Multisig {
minimum_sigs: u64,
keys: Vec<Value256>,
},
}
impl TxoutTarget {
pub fn tag(&self) -> u8 {
match self {
TxoutTarget::ToKey { .. } => tag::TXOUT_TO_KEY,
TxoutTarget::Multisig { .. } => tag::TXOUT_MULTISIG,
}
}
}
impl EpeeWrite for TxoutTarget {
fn write_epee(&self, out: &mut Vec<u8>) {
out.push(self.tag());
match self {
TxoutTarget::ToKey { key, mix_attr } => {
key.write_epee(out);
out.push(*mix_attr);
}
TxoutTarget::Multisig { minimum_sigs, keys } => {
append_varint(out, *minimum_sigs);
write_vec(keys, out);
}
}
}
}
impl EpeeRead for TxoutTarget {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(match r.read_byte()? {
tag::TXOUT_TO_KEY => TxoutTarget::ToKey {
key: Value256::read_epee(r)?,
mix_attr: r.read_byte()?,
},
tag::TXOUT_MULTISIG => TxoutTarget::Multisig {
minimum_sigs: r.read_varint()?,
keys: r.read_vec()?,
},
other => return Err(crate::err!("unsupported txout target tag {other}")),
})
}
}
#[derive(Clone, Debug)]
pub struct TxOutBare {
pub amount: u64,
pub target: TxoutTarget,
}
impl EpeeWrite for TxOutBare {
fn write_epee(&self, out: &mut Vec<u8>) {
append_varint(out, self.amount);
self.target.write_epee(out);
}
}
impl EpeeRead for TxOutBare {
fn read_epee(r: &mut Reader<'_>) -> Result<Self> {
Ok(TxOutBare {
amount: r.read_varint()?,
target: TxoutTarget::read_epee(r)?,
})
}
}
#[derive(Clone, Debug)]
pub struct ExtraAliasEntry {
pub alias: Vec<u8>,
pub address: AliasAddress,
pub text_comment: Vec<u8>,
pub view_key: Vec<Value256>,
pub sign: Vec<Signature64>,
}
#[derive(Clone, Copy, Debug)]
pub enum AliasAddress {
Current(AccountPublicAddr),
Old(AccountPublicAddrOld),
}
impl ExtraAliasEntry {
pub fn read_with(r: &mut Reader<'_>, old: bool) -> Result<Self> {
let alias = r.read_var_bytes()?;
let address = if old {
AliasAddress::Old(AccountPublicAddrOld::read_epee(r)?)
} else {
AliasAddress::Current(AccountPublicAddr::read_epee(r)?)
};
Ok(ExtraAliasEntry {
alias,
address,
text_comment: r.read_var_bytes()?,
view_key: r.read_vec()?,
sign: r.read_vec()?,
})
}
}
impl EpeeWrite for ExtraAliasEntry {
fn write_epee(&self, out: &mut Vec<u8>) {
write_var_bytes(&self.alias, out);
match &self.address {
AliasAddress::Current(a) => a.write_epee(out),
AliasAddress::Old(a) => a.write_epee(out),
}
write_var_bytes(&self.text_comment, out);
write_vec(&self.view_key, out);
write_vec(&self.sign, out);
}
}