chik_sdk_test/
key_pairs.rs1use 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}