chik_sdk_test/
key_pairs.rs

1use bip39::Mnemonic;
2use chik_bls::{PublicKey, SecretKey};
3use chik_protocol::{Bytes32, Coin};
4use chik_puzzle_types::standard::StandardArgs;
5use chik_secp::{K1PublicKey, K1SecretKey, R1PublicKey, R1SecretKey};
6use rand::{Rng, SeedableRng};
7use rand_chacha::ChaCha8Rng;
8
9#[derive(Debug, Clone)]
10pub struct BlsPair {
11    pub sk: SecretKey,
12    pub pk: PublicKey,
13    pub puzzle_hash: Bytes32,
14}
15
16impl Default for BlsPair {
17    fn default() -> Self {
18        Self::new(0)
19    }
20}
21
22impl BlsPair {
23    pub fn new(seed: u64) -> Self {
24        let mut rng = ChaCha8Rng::seed_from_u64(seed);
25        let entropy: [u8; 32] = rng.gen();
26        let mnemonic = Mnemonic::from_entropy(&entropy).unwrap();
27        let seed = mnemonic.to_seed("");
28        let sk = SecretKey::from_seed(&seed);
29        let pk = sk.public_key();
30        Self {
31            sk,
32            pk,
33            puzzle_hash: StandardArgs::curry_tree_hash(pk).into(),
34        }
35    }
36
37    pub fn range<const N: usize>() -> [Self; N] {
38        Self::range_with_seed(0)
39    }
40
41    pub fn range_with_seed<const N: usize>(seed: u64) -> [Self; N] {
42        Self::range_vec_with_seed(seed, N).try_into().unwrap()
43    }
44
45    pub fn range_vec(length: usize) -> Vec<Self> {
46        Self::range_vec_with_seed(0, length)
47    }
48
49    pub fn range_vec_with_seed(seed: u64, length: usize) -> Vec<Self> {
50        let mut results = Vec::new();
51
52        for i in 0..length {
53            results.push(Self::new(seed + i as u64));
54        }
55
56        results
57    }
58}
59
60#[derive(Debug, Clone)]
61pub struct BlsPairWithCoin {
62    pub sk: SecretKey,
63    pub pk: PublicKey,
64    pub puzzle_hash: Bytes32,
65    pub coin: Coin,
66}
67
68impl BlsPairWithCoin {
69    pub fn new(pair: BlsPair, coin: Coin) -> Self {
70        Self {
71            sk: pair.sk,
72            pk: pair.pk,
73            puzzle_hash: pair.puzzle_hash,
74            coin,
75        }
76    }
77}
78
79#[derive(Debug, Clone)]
80pub struct K1Pair {
81    pub sk: K1SecretKey,
82    pub pk: K1PublicKey,
83}
84
85impl Default for K1Pair {
86    fn default() -> Self {
87        Self::new(0)
88    }
89}
90
91impl K1Pair {
92    pub fn new(seed: u64) -> Self {
93        let mut rng = ChaCha8Rng::seed_from_u64(seed);
94        let sk = K1SecretKey::from_bytes(&rng.gen()).unwrap();
95        let pk = sk.public_key();
96        Self { sk, pk }
97    }
98
99    pub fn range<const N: usize>() -> [Self; N] {
100        Self::range_with_seed(0)
101    }
102
103    pub fn range_with_seed<const N: usize>(seed: u64) -> [Self; N] {
104        Self::range_vec_with_seed(seed, N).try_into().unwrap()
105    }
106
107    pub fn range_vec(length: usize) -> Vec<Self> {
108        Self::range_vec_with_seed(0, length)
109    }
110
111    pub fn range_vec_with_seed(seed: u64, length: usize) -> Vec<Self> {
112        let mut results = Vec::new();
113
114        for i in 0..length {
115            results.push(Self::new(seed + i as u64));
116        }
117
118        results
119    }
120}
121
122#[derive(Debug, Clone)]
123pub struct R1Pair {
124    pub sk: R1SecretKey,
125    pub pk: R1PublicKey,
126}
127
128impl Default for R1Pair {
129    fn default() -> Self {
130        Self::new(0)
131    }
132}
133
134impl R1Pair {
135    pub fn new(seed: u64) -> Self {
136        let mut rng = ChaCha8Rng::seed_from_u64(seed);
137        let sk = R1SecretKey::from_bytes(&rng.gen()).unwrap();
138        let pk = sk.public_key();
139        Self { sk, pk }
140    }
141
142    pub fn range<const N: usize>() -> [Self; N] {
143        Self::range_with_seed(0)
144    }
145
146    pub fn range_with_seed<const N: usize>(seed: u64) -> [Self; N] {
147        Self::range_vec_with_seed(seed, N).try_into().unwrap()
148    }
149
150    pub fn range_vec(length: usize) -> Vec<Self> {
151        Self::range_vec_with_seed(0, length)
152    }
153
154    pub fn range_vec_with_seed(seed: u64, length: usize) -> Vec<Self> {
155        let mut results = Vec::new();
156
157        for i in 0..length {
158            results.push(Self::new(seed + i as u64));
159        }
160
161        results
162    }
163}