|
1 | 1 | """Generic reusable classes for cardano-cli `compatible` commands.""" |
2 | 2 |
|
| 3 | +import pathlib as pl |
3 | 4 | from typing import TYPE_CHECKING |
4 | 5 |
|
| 6 | +from cardano_clusterlib import clusterlib_helpers |
| 7 | +from cardano_clusterlib import helpers |
| 8 | +from cardano_clusterlib import structs |
5 | 9 | from cardano_clusterlib import types as itp |
6 | 10 |
|
7 | 11 | if TYPE_CHECKING: |
@@ -121,180 +125,91 @@ def __init__(self, clusterlib_obj: "ClusterLib", era: str) -> None: |
121 | 125 | self._clusterlib_obj = clusterlib_obj |
122 | 126 | self._base = ("cardano-cli", "compatible", era, "stake-pool") |
123 | 127 |
|
124 | | - def _resolve_pool_vkey_args( |
| 128 | + def gen_registration_cert( |
125 | 129 | self, |
126 | 130 | *, |
127 | | - stake_pool_vkey: str = "", |
128 | | - stake_pool_extended_vkey: str = "", |
129 | | - cold_vkey_file: itp.FileType | None = None, |
130 | | - ) -> list[str]: |
131 | | - """Resolve pool key identification.""" |
132 | | - if stake_pool_vkey: |
133 | | - return ["--stake-pool-verification-key", stake_pool_vkey] |
134 | | - if stake_pool_extended_vkey: |
135 | | - return ["--stake-pool-verification-extended-key", stake_pool_extended_vkey] |
136 | | - if cold_vkey_file: |
137 | | - return ["--cold-verification-key-file", str(cold_vkey_file)] |
138 | | - |
139 | | - msg = ( |
140 | | - "One of stake_pool_vkey, stake_pool_extended_vkey, or cold_vkey_file must be provided." |
141 | | - ) |
142 | | - raise ValueError(msg) |
143 | | - |
144 | | - def _resolve_vrf_args( |
145 | | - self, |
146 | | - *, |
147 | | - vrf_vkey: str = "", |
148 | | - vrf_vkey_file: itp.FileType | None = None, |
149 | | - ) -> list[str]: |
150 | | - """Resolve VRF key identification.""" |
151 | | - if vrf_vkey: |
152 | | - return ["--vrf-verification-key", vrf_vkey] |
153 | | - if vrf_vkey_file: |
154 | | - return ["--vrf-verification-key-file", str(vrf_vkey_file)] |
155 | | - |
156 | | - msg = "One of vrf_vkey or vrf_vkey_file must be provided." |
157 | | - raise ValueError(msg) |
158 | | - |
159 | | - def _resolve_reward_account_args( |
160 | | - self, |
161 | | - *, |
162 | | - reward_vkey: str = "", |
163 | | - reward_vkey_file: itp.FileType | None = None, |
164 | | - ) -> list[str]: |
165 | | - """Resolve reward account specification.""" |
166 | | - if reward_vkey: |
167 | | - return ["--pool-reward-account-verification-key", reward_vkey] |
168 | | - if reward_vkey_file: |
169 | | - return ["--pool-reward-account-verification-key-file", str(reward_vkey_file)] |
170 | | - |
171 | | - msg = "One of reward_vkey or reward_vkey_file must be provided." |
172 | | - raise ValueError(msg) |
173 | | - |
174 | | - def _resolve_owner_args( |
175 | | - self, |
176 | | - *, |
177 | | - owner_vkey: str = "", |
178 | | - owner_vkey_file: itp.FileType | None = None, |
179 | | - ) -> list[str]: |
180 | | - """Resolve owner stake key.""" |
181 | | - if owner_vkey: |
182 | | - return ["--pool-owner-verification-key", owner_vkey] |
183 | | - if owner_vkey_file: |
184 | | - return ["--pool-owner-stake-verification-key-file", str(owner_vkey_file)] |
185 | | - |
186 | | - msg = "One of owner_vkey or owner_vkey_file must be provided." |
187 | | - raise ValueError(msg) |
188 | | - |
189 | | - def registration_certificate( |
190 | | - self, |
191 | | - *, |
192 | | - # pool identification |
193 | | - stake_pool_vkey: str = "", |
194 | | - stake_pool_extended_vkey: str = "", |
195 | | - cold_vkey_file: itp.FileType | None = None, |
196 | | - # VRF identification |
197 | | - vrf_vkey: str = "", |
198 | | - vrf_vkey_file: itp.FileType | None = None, |
199 | | - # financials |
200 | | - pool_pledge: int, |
201 | | - pool_cost: int, |
202 | | - pool_margin: str, |
203 | | - # reward account |
204 | | - reward_vkey: str = "", |
205 | | - reward_vkey_file: itp.FileType | None = None, |
206 | | - # owner |
207 | | - owner_vkey: str = "", |
208 | | - owner_vkey_file: itp.FileType | None = None, |
209 | | - # relays |
210 | | - relay_ipv4: str = "", |
211 | | - relay_ipv6: str = "", |
212 | | - relay_port: int | None = None, |
213 | | - single_host_relay: str = "", |
214 | | - multi_host_relay: str = "", |
215 | | - # metadata |
216 | | - metadata_url: str = "", |
217 | | - metadata_hash: str = "", |
218 | | - check_metadata_hash: bool = False, |
219 | | - # output |
220 | | - out_file: itp.FileType, |
221 | | - ) -> None: |
222 | | - """Wrap the compat stake-pool registration-certificate command.""" |
223 | | - # Required argument groups |
224 | | - pool_args = self._resolve_pool_vkey_args( |
225 | | - stake_pool_vkey=stake_pool_vkey, |
226 | | - stake_pool_extended_vkey=stake_pool_extended_vkey, |
227 | | - cold_vkey_file=cold_vkey_file, |
228 | | - ) |
229 | | - |
230 | | - vrf_args = self._resolve_vrf_args( |
231 | | - vrf_vkey=vrf_vkey, |
232 | | - vrf_vkey_file=vrf_vkey_file, |
233 | | - ) |
234 | | - |
235 | | - reward_args = self._resolve_reward_account_args( |
236 | | - reward_vkey=reward_vkey, |
237 | | - reward_vkey_file=reward_vkey_file, |
238 | | - ) |
239 | | - |
240 | | - owner_args = self._resolve_owner_args( |
241 | | - owner_vkey=owner_vkey, |
242 | | - owner_vkey_file=owner_vkey_file, |
243 | | - ) |
244 | | - |
245 | | - # Relay handling |
246 | | - relay_args: list[str] = [] |
| 131 | + name: str, |
| 132 | + pool_params: structs.CompatPoolParams, |
| 133 | + destination_dir: itp.FileType = ".", |
| 134 | + ) -> pl.Path: |
| 135 | + """Generate a compatible stake pool registration certificate.""" |
| 136 | + pool_data = pool_params.pool_data |
247 | 137 |
|
248 | | - if relay_ipv4: |
249 | | - relay_args.extend(["--pool-relay-ipv4", relay_ipv4]) |
250 | | - if relay_ipv6: |
251 | | - relay_args.extend(["--pool-relay-ipv6", relay_ipv6]) |
252 | | - if relay_port: |
253 | | - relay_args.extend(["--pool-relay-port", str(relay_port)]) |
| 138 | + destination_dir_path = pl.Path(destination_dir).expanduser() |
| 139 | + out_file = destination_dir_path / f"{name}_pool_reg.cert" |
| 140 | + clusterlib_helpers._check_files_exist(out_file, clusterlib_obj=self._clusterlib_obj) |
254 | 141 |
|
255 | | - if single_host_relay: |
256 | | - relay_args.extend(["--single-host-pool-relay", single_host_relay]) |
257 | | - if relay_port: |
258 | | - relay_args.extend(["--pool-relay-port", str(relay_port)]) |
259 | | - |
260 | | - if multi_host_relay: |
261 | | - relay_args.extend(["--multi-host-pool-relay", multi_host_relay]) |
262 | | - |
263 | | - # Metadata arguments |
264 | 142 | metadata_args: list[str] = [] |
265 | | - if metadata_url and metadata_hash: |
| 143 | + if pool_data.pool_metadata_url and pool_data.pool_metadata_hash: |
266 | 144 | metadata_args.extend( |
267 | 145 | [ |
268 | 146 | "--metadata-url", |
269 | | - metadata_url, |
| 147 | + str(pool_data.pool_metadata_url), |
270 | 148 | "--metadata-hash", |
271 | | - metadata_hash, |
| 149 | + str(pool_data.pool_metadata_hash), |
272 | 150 | ] |
273 | 151 | ) |
274 | | - if check_metadata_hash: |
| 152 | + if pool_params.check_metadata_hash: |
275 | 153 | metadata_args.append("--check-metadata-hash") |
276 | 154 |
|
277 | | - # Build final CLI cmd |
| 155 | + relay_args: list[str] = [] |
| 156 | + if pool_data.pool_relay_dns: |
| 157 | + relay_args.extend(["--single-host-pool-relay", pool_data.pool_relay_dns]) |
| 158 | + |
| 159 | + if pool_data.pool_relay_ipv4: |
| 160 | + relay_args.extend(["--pool-relay-ipv4", pool_data.pool_relay_ipv4]) |
| 161 | + |
| 162 | + if pool_params.relay_ipv6: |
| 163 | + relay_args.extend(["--pool-relay-ipv6", pool_params.relay_ipv6]) |
| 164 | + |
| 165 | + if pool_data.pool_relay_port: |
| 166 | + relay_args.extend(["--pool-relay-port", str(pool_data.pool_relay_port)]) |
| 167 | + |
| 168 | + if pool_params.multi_host_relay: |
| 169 | + relay_args.extend(["--multi-host-pool-relay", pool_params.multi_host_relay]) |
| 170 | + |
| 171 | + # Reward account, default to first owner if not provided |
| 172 | + if pool_params.reward_account_vkey_file: |
| 173 | + reward_arg = [ |
| 174 | + "--pool-reward-account-verification-key-file", |
| 175 | + str(pool_params.reward_account_vkey_file), |
| 176 | + ] |
| 177 | + else: |
| 178 | + default_owner = next(iter(pool_params.owner_stake_vkey_files)) |
| 179 | + reward_arg = [ |
| 180 | + "--pool-reward-account-verification-key-file", |
| 181 | + str(default_owner), |
| 182 | + ] |
| 183 | + |
278 | 184 | cmd = [ |
279 | 185 | *self._base, |
280 | 186 | "registration-certificate", |
281 | | - *pool_args, |
282 | | - *vrf_args, |
283 | 187 | "--pool-pledge", |
284 | | - str(pool_pledge), |
| 188 | + str(pool_data.pool_pledge), |
285 | 189 | "--pool-cost", |
286 | | - str(pool_cost), |
| 190 | + str(pool_data.pool_cost), |
287 | 191 | "--pool-margin", |
288 | | - str(pool_margin), |
289 | | - *reward_args, |
290 | | - *owner_args, |
291 | | - *relay_args, |
292 | | - *metadata_args, |
| 192 | + str(pool_data.pool_margin), |
| 193 | + "--vrf-verification-key-file", |
| 194 | + str(pool_params.vrf_vkey_file), |
| 195 | + "--cold-verification-key-file", |
| 196 | + str(pool_params.cold_vkey_file), |
| 197 | + *reward_arg, |
| 198 | + *helpers._prepend_flag( |
| 199 | + "--pool-owner-stake-verification-key-file", |
| 200 | + pool_params.owner_stake_vkey_files, |
| 201 | + ), |
| 202 | + *self._clusterlib_obj.magic_args, |
293 | 203 | "--out-file", |
294 | 204 | str(out_file), |
| 205 | + *metadata_args, |
| 206 | + *relay_args, |
295 | 207 | ] |
296 | 208 |
|
297 | 209 | self._clusterlib_obj.cli(cmd, add_default_args=False) |
| 210 | + helpers._check_outfiles(out_file) |
| 211 | + |
| 212 | + return out_file |
298 | 213 |
|
299 | 214 |
|
300 | 215 | class GovernanceActionGroup: |
|
0 commit comments