snarkvm_console_program/owner/
mod.rs1mod bytes;
17mod serialize;
18mod string;
19
20use snarkvm_console_account::{Address, PrivateKey, Signature};
21use snarkvm_console_network::Network;
22use snarkvm_console_types::prelude::*;
23
24#[derive(Copy, Clone, PartialEq, Eq, Hash)]
25pub struct ProgramOwner<N: Network> {
26 address: Address<N>,
28 signature: Signature<N>,
30}
31
32impl<N: Network> ProgramOwner<N> {
33 pub fn new<R: Rng + CryptoRng>(private_key: &PrivateKey<N>, deployment_id: Field<N>, rng: &mut R) -> Result<Self> {
35 let address = Address::try_from(private_key)?;
37 let signature = private_key.sign(&[deployment_id], rng)?;
39 Ok(Self { signature, address })
41 }
42
43 pub fn from(address: Address<N>, signature: Signature<N>) -> Self {
45 Self { address, signature }
46 }
47
48 pub const fn address(&self) -> Address<N> {
50 self.address
51 }
52
53 pub const fn signature(&self) -> &Signature<N> {
55 &self.signature
56 }
57
58 pub fn verify(&self, deployment_id: Field<N>) -> bool {
60 self.signature.verify(&self.address, &[deployment_id])
61 }
62}
63
64#[cfg(test)]
65pub(crate) mod test_helpers {
66 use super::*;
67 use snarkvm_console_network::MainnetV0;
68
69 use once_cell::sync::OnceCell;
70
71 type CurrentNetwork = MainnetV0;
72
73 pub(crate) fn sample_program_owner() -> ProgramOwner<CurrentNetwork> {
74 static INSTANCE: OnceCell<ProgramOwner<CurrentNetwork>> = OnceCell::new();
75 *INSTANCE.get_or_init(|| {
76 let rng = &mut TestRng::default();
78
79 let private_key = PrivateKey::<CurrentNetwork>::new(rng).unwrap();
81
82 let deployment_id: Field<CurrentNetwork> = rng.gen();
84
85 ProgramOwner::new(&private_key, deployment_id, rng).unwrap()
87 })
88 }
89
90 #[test]
91 fn test_verify_program_owner() {
92 let rng = &mut TestRng::default();
94
95 let private_key = PrivateKey::<CurrentNetwork>::new(rng).unwrap();
97
98 let deployment_id: Field<CurrentNetwork> = rng.gen();
100
101 let owner = ProgramOwner::new(&private_key, deployment_id, rng).unwrap();
103 assert!(owner.verify(deployment_id));
105
106 let incorrect_deployment_id: Field<CurrentNetwork> = rng.gen();
108 assert!(!owner.verify(incorrect_deployment_id));
109 }
110}