1pub mod dummy;
2pub mod vectors;
3pub use self::vectors::VTXO_VECTORS;
4
5
6use std::fmt;
7
8use bitcoin::hex::DisplayHex;
9
10use crate::{ProtocolEncoding, Vtxo};
11use crate::vtxo::{Full, GenesisTransition};
12
13
14impl Vtxo<Full> {
15 pub fn invalidate_final_sig(&mut self) {
16 let fake: bitcoin::secp256k1::schnorr::Signature = "cc8b93e9f6fbc2506bb85ae8bbb530b178daac49704f5ce2e3ab69c266fd59320b28d028eef212e3b9fdc42cfd2e0760a0359d3ea7d2e9e8cfe2040e3f1b71ea".parse().unwrap();
17 let item = self.genesis.items.last_mut().unwrap();
18 match item.transition {
19 GenesisTransition::Cosigned(ref mut inner) => inner.signature = Some(fake),
20 GenesisTransition::HashLockedCosigned(ref mut inner) => {
21 inner.signature.replace(fake).expect("didn't have signature");
22 },
23 GenesisTransition::Arkoor(ref mut inner) => {
24 inner.signature.replace(fake).expect("didn't have arkoor signature");
25 },
26 }
27 }
28}
29
30pub fn encoding_roundtrip<T>(object: &T)
32where
33 T: ProtocolEncoding + fmt::Debug + PartialEq,
34{
35 let encoded = object.serialize();
36 let decoded = T::deserialize(&encoded).unwrap();
37
38 assert_eq!(*object, decoded);
39
40 let re_encoded = decoded.serialize();
41 assert_eq!(encoded.as_hex().to_string(), re_encoded.as_hex().to_string());
42}
43
44pub fn json_roundtrip<T>(object: &T)
45where
46 T: fmt::Debug + PartialEq + serde::Serialize + for<'de> serde::Deserialize<'de>,
47{
48 let encoded = serde_json::to_string(object).unwrap();
49 let decoded: T = serde_json::from_str(&encoded).unwrap();
50
51 assert_eq!(*object, decoded);
52}
53
54#[cfg(test)]
56pub fn verify_tx(
57 inputs: &[bitcoin::TxOut],
58 input_idx: usize,
59 tx: &bitcoin::Transaction,
60) -> Result<(), bitcoinkernel::KernelError> {
61 use bitcoinkernel as krn;
62 use bitcoin::consensus::encode::serialize;
63
64 krn::verify(
65 &krn::ScriptPubkey::new(inputs[input_idx].script_pubkey.as_bytes()).unwrap(),
66 Some(inputs[input_idx].value.to_sat() as i64),
67 &krn::Transaction::new(&serialize(tx)).unwrap(),
68 input_idx,
69 Some(krn::VERIFY_ALL),
70 &inputs.iter().map(|i| krn::TxOut::new(
71 &krn::ScriptPubkey::new(i.script_pubkey.as_bytes()).unwrap(),
72 i.value.to_sat() as i64,
73 )).collect::<Vec<_>>(),
74 )
75}