Skip to main content

smplx_sdk/presets/
p2pk.rs

1use crate::program::ArgumentsTrait;
2use crate::program::Program;
3
4use simplicityhl::simplicity::bitcoin::XOnlyPublicKey;
5
6// TODO macro
7pub struct P2PK {
8    program: Program,
9}
10
11impl P2PK {
12    pub const SOURCE: &'static str = include_str!("./simf/p2pk.simf");
13
14    pub fn new(public_key: XOnlyPublicKey, arguments: impl ArgumentsTrait + 'static) -> Self {
15        Self {
16            program: Program::new(Self::SOURCE, public_key, Box::new(arguments)),
17        }
18    }
19
20    pub fn get_program(&self) -> &Program {
21        &self.program
22    }
23
24    pub fn get_program_mut(&mut self) -> &mut Program {
25        &mut self.program
26    }
27}
28
29pub mod p2pk_build {
30    use crate::program::ArgumentsTrait;
31    use crate::program::WitnessTrait;
32    use simplicityhl::num::U256;
33    use simplicityhl::str::WitnessName;
34    use simplicityhl::value::UIntValue;
35    use simplicityhl::value::ValueConstructible;
36    use simplicityhl::{Arguments, Value, WitnessValues};
37    use std::collections::HashMap;
38
39    #[derive(Clone)]
40    pub struct P2PKWitness {
41        pub signature: [u8; 64usize],
42    }
43
44    #[derive(Clone)]
45    pub struct P2PKArguments {
46        pub public_key: [u8; 32],
47    }
48
49    impl WitnessTrait for P2PKWitness {
50        fn build_witness(&self) -> WitnessValues {
51            WitnessValues::from(HashMap::from([(
52                WitnessName::from_str_unchecked("SIGNATURE"),
53                Value::byte_array(self.signature),
54            )]))
55        }
56    }
57
58    impl ArgumentsTrait for P2PKArguments {
59        fn build_arguments(&self) -> Arguments {
60            Arguments::from(HashMap::from([(
61                WitnessName::from_str_unchecked("PUBLIC_KEY"),
62                Value::from(UIntValue::U256(U256::from_byte_array(self.public_key))),
63            )]))
64        }
65    }
66}