Skip to content

Commit 71fa3da

Browse files
Compatible group... Include group.
1 parent 1467c4b commit 71fa3da

File tree

2 files changed

+77
-150
lines changed

2 files changed

+77
-150
lines changed

cardano_clusterlib/compat_common.py

Lines changed: 65 additions & 150 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
"""Generic reusable classes for cardano-cli `compatible` commands."""
22

3+
import pathlib as pl
34
from typing import TYPE_CHECKING
45

6+
from cardano_clusterlib import clusterlib_helpers
7+
from cardano_clusterlib import helpers
8+
from cardano_clusterlib import structs
59
from cardano_clusterlib import types as itp
610

711
if TYPE_CHECKING:
@@ -121,180 +125,91 @@ def __init__(self, clusterlib_obj: "ClusterLib", era: str) -> None:
121125
self._clusterlib_obj = clusterlib_obj
122126
self._base = ("cardano-cli", "compatible", era, "stake-pool")
123127

124-
def _resolve_pool_vkey_args(
128+
def gen_registration_cert(
125129
self,
126130
*,
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
247137

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)
254141

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
264142
metadata_args: list[str] = []
265-
if metadata_url and metadata_hash:
143+
if pool_data.pool_metadata_url and pool_data.pool_metadata_hash:
266144
metadata_args.extend(
267145
[
268146
"--metadata-url",
269-
metadata_url,
147+
str(pool_data.pool_metadata_url),
270148
"--metadata-hash",
271-
metadata_hash,
149+
str(pool_data.pool_metadata_hash),
272150
]
273151
)
274-
if check_metadata_hash:
152+
if pool_params.check_metadata_hash:
275153
metadata_args.append("--check-metadata-hash")
276154

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+
278184
cmd = [
279185
*self._base,
280186
"registration-certificate",
281-
*pool_args,
282-
*vrf_args,
283187
"--pool-pledge",
284-
str(pool_pledge),
188+
str(pool_data.pool_pledge),
285189
"--pool-cost",
286-
str(pool_cost),
190+
str(pool_data.pool_cost),
287191
"--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,
293203
"--out-file",
294204
str(out_file),
205+
*metadata_args,
206+
*relay_args,
295207
]
296208

297209
self._clusterlib_obj.cli(cmd, add_default_args=False)
210+
helpers._check_outfiles(out_file)
211+
212+
return out_file
298213

299214

300215
class GovernanceActionGroup:

cardano_clusterlib/structs.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,18 @@ class PoolData:
232232
pool_relay_port: int = 0
233233

234234

235+
@dataclasses.dataclass(frozen=True, order=True)
236+
class CompatPoolParams:
237+
pool_data: PoolData
238+
vrf_vkey_file: itp.FileType
239+
cold_vkey_file: itp.FileType
240+
owner_stake_vkey_files: itp.FileTypeList
241+
reward_account_vkey_file: itp.FileType | None = None
242+
relay_ipv6: str = ""
243+
multi_host_relay: str = ""
244+
check_metadata_hash: bool = False
245+
246+
235247
@dataclasses.dataclass(frozen=True, order=True)
236248
class TxRawOutput:
237249
txins: list[UTXOData] # UTXOs used as inputs

0 commit comments

Comments
 (0)