use crate::primitives::private_key::PrivateKey;
use crate::primitives::public_key::PublicKey;
pub type PubKeyHex = String;
pub type SatoshiValue = u64;
pub type OutpointString = String;
pub type TXIDHexString = String;
pub type DescriptionString5to50Bytes = String;
pub type BasketStringUnder300Bytes = String;
pub type OutputTagStringUnder300Bytes = String;
pub type LabelStringUnder300Bytes = String;
pub type KeyIDStringUnder800Bytes = String;
pub type OriginatorDomainNameStringUnder250Bytes = String;
pub type CertificateFieldNameUnder50Bytes = String;
pub type Base64String = String;
pub type HexString = String;
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "network", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "network", serde(transparent))]
pub struct BooleanDefaultTrue(pub Option<bool>);
impl Default for BooleanDefaultTrue {
fn default() -> Self {
BooleanDefaultTrue(Some(true))
}
}
impl std::ops::Deref for BooleanDefaultTrue {
type Target = bool;
fn deref(&self) -> &bool {
static TRUE: bool = true;
static FALSE: bool = false;
match self.0 {
Some(true) | None => &TRUE,
Some(false) => &FALSE,
}
}
}
impl From<BooleanDefaultTrue> for Option<bool> {
fn from(v: BooleanDefaultTrue) -> Self {
v.0
}
}
impl From<Option<bool>> for BooleanDefaultTrue {
fn from(v: Option<bool>) -> Self {
BooleanDefaultTrue(v)
}
}
impl BooleanDefaultTrue {
pub fn is_none(&self) -> bool {
self.0.is_none()
}
pub fn none() -> Self {
BooleanDefaultTrue(None)
}
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "network", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "network", serde(transparent))]
pub struct BooleanDefaultFalse(pub Option<bool>);
impl Default for BooleanDefaultFalse {
fn default() -> Self {
BooleanDefaultFalse(Some(false))
}
}
impl std::ops::Deref for BooleanDefaultFalse {
type Target = bool;
fn deref(&self) -> &bool {
static TRUE: bool = true;
static FALSE: bool = false;
match self.0 {
Some(true) => &TRUE,
Some(false) | None => &FALSE,
}
}
}
impl From<BooleanDefaultFalse> for Option<bool> {
fn from(v: BooleanDefaultFalse) -> Self {
v.0
}
}
impl From<Option<bool>> for BooleanDefaultFalse {
fn from(v: Option<bool>) -> Self {
BooleanDefaultFalse(v)
}
}
impl BooleanDefaultFalse {
pub fn is_none(&self) -> bool {
self.0.is_none()
}
pub fn none() -> Self {
BooleanDefaultFalse(None)
}
}
pub type PositiveIntegerDefault10Max10000 = Option<u32>;
pub type PositiveIntegerOrZero = u32;
#[derive(Clone, Debug)]
pub struct Protocol {
pub security_level: u8,
pub protocol: String,
}
#[cfg(feature = "network")]
impl serde::Serialize for Protocol {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
use serde::ser::SerializeSeq;
let mut seq = serializer.serialize_seq(Some(2))?;
seq.serialize_element(&self.security_level)?;
seq.serialize_element(&self.protocol)?;
seq.end()
}
}
#[cfg(feature = "network")]
impl<'de> serde::Deserialize<'de> for Protocol {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
use serde::de::{self, SeqAccess, Visitor};
use std::fmt;
struct ProtocolVisitor;
impl<'de> Visitor<'de> for ProtocolVisitor {
type Value = Protocol;
fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result {
formatter.write_str("an array [securityLevel, protocolName]")
}
fn visit_seq<A: SeqAccess<'de>>(self, mut seq: A) -> Result<Protocol, A::Error> {
let security_level: u8 = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(0, &self))?;
let protocol: String = seq
.next_element()?
.ok_or_else(|| de::Error::invalid_length(1, &self))?;
Ok(Protocol {
security_level,
protocol,
})
}
}
deserializer.deserialize_seq(ProtocolVisitor)
}
}
#[derive(Clone, Debug, PartialEq)]
pub enum CounterpartyType {
Uninitialized,
Self_,
Anyone,
Other,
}
#[derive(Clone, Debug)]
pub struct Counterparty {
pub counterparty_type: CounterpartyType,
pub public_key: Option<PublicKey>,
}
impl Default for Counterparty {
fn default() -> Self {
Self {
counterparty_type: CounterpartyType::Uninitialized,
public_key: None,
}
}
}
#[cfg(feature = "network")]
impl serde::Serialize for Counterparty {
fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
match self.counterparty_type {
CounterpartyType::Anyone => serializer.serialize_str("anyone"),
CounterpartyType::Self_ => serializer.serialize_str("self"),
CounterpartyType::Other => {
if let Some(ref pk) = self.public_key {
serializer.serialize_str(&pk.to_der_hex())
} else {
serializer.serialize_none()
}
}
CounterpartyType::Uninitialized => serializer.serialize_str(""),
}
}
}
#[cfg(feature = "network")]
impl<'de> serde::Deserialize<'de> for Counterparty {
fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let s: Option<String> = Option::<String>::deserialize(deserializer)?;
let s = match s {
None => {
return Ok(Counterparty {
counterparty_type: CounterpartyType::Uninitialized,
public_key: None,
})
}
Some(s) => s,
};
match s.as_str() {
"anyone" => Ok(Counterparty {
counterparty_type: CounterpartyType::Anyone,
public_key: None,
}),
"self" => Ok(Counterparty {
counterparty_type: CounterpartyType::Self_,
public_key: None,
}),
"" => Ok(Counterparty {
counterparty_type: CounterpartyType::Uninitialized,
public_key: None,
}),
hex_str => {
let pk = PublicKey::from_string(hex_str).map_err(serde::de::Error::custom)?;
Ok(Counterparty {
counterparty_type: CounterpartyType::Other,
public_key: Some(pk),
})
}
}
}
}
pub fn anyone_pubkey() -> PublicKey {
let priv_key = PrivateKey::from_bytes(&{
let mut buf = [0u8; 32];
buf[31] = 1;
buf
})
.expect("PrivateKey(1) is always valid");
priv_key.to_public_key()
}
pub fn anyone_private_key() -> PrivateKey {
PrivateKey::from_bytes(&{
let mut buf = [0u8; 32];
buf[31] = 1;
buf
})
.expect("PrivateKey(1) is always valid")
}
#[cfg(all(test, feature = "network"))]
mod serde_tests {
use super::*;
use crate::wallet::interfaces::{CreateSignatureArgs, EncryptArgs};
#[test]
fn counterparty_default_is_uninitialized() {
let cp = Counterparty::default();
assert_eq!(cp.counterparty_type, CounterpartyType::Uninitialized);
assert!(cp.public_key.is_none());
}
#[test]
fn create_signature_args_omit_counterparty_is_uninitialized() {
let json = serde_json::json!({
"protocolID": [0, "cross-sdk test"],
"keyID": "x",
"data": [1, 2, 3],
});
let args: CreateSignatureArgs = serde_json::from_value(json).unwrap();
assert_eq!(
args.counterparty.counterparty_type,
CounterpartyType::Uninitialized,
"omitted counterparty must deserialize to Uninitialized, not Self_ — \
otherwise createSignature will derive against the wrong key"
);
}
#[test]
fn encrypt_args_omit_counterparty_is_uninitialized() {
let json = serde_json::json!({
"protocolID": [0, "cross-sdk test"],
"keyID": "x",
"plaintext": [1, 2, 3],
});
let args: EncryptArgs = serde_json::from_value(json).unwrap();
assert_eq!(
args.counterparty.counterparty_type,
CounterpartyType::Uninitialized
);
}
#[test]
fn counterparty_explicit_null_is_uninitialized() {
let json = serde_json::json!({
"protocolID": [0, "cross-sdk test"],
"keyID": "x",
"data": [1, 2, 3],
"counterparty": serde_json::Value::Null,
});
let args: CreateSignatureArgs = serde_json::from_value(json).unwrap();
assert_eq!(
args.counterparty.counterparty_type,
CounterpartyType::Uninitialized
);
}
#[test]
fn counterparty_explicit_self_and_anyone_parse() {
let self_cp: Counterparty = serde_json::from_str("\"self\"").unwrap();
assert_eq!(self_cp.counterparty_type, CounterpartyType::Self_);
let anyone_cp: Counterparty = serde_json::from_str("\"anyone\"").unwrap();
assert_eq!(anyone_cp.counterparty_type, CounterpartyType::Anyone);
let empty_cp: Counterparty = serde_json::from_str("\"\"").unwrap();
assert_eq!(empty_cp.counterparty_type, CounterpartyType::Uninitialized);
}
}