Skip to content

docs: add missing crate and module-level documentation#769

Merged
scarmuega merged 3 commits into
mainfrom
fix/docs-and-hardano-restructure
May 11, 2026
Merged

docs: add missing crate and module-level documentation#769
scarmuega merged 3 commits into
mainfrom
fix/docs-and-hardano-restructure

Conversation

@scarmuega
Copy link
Copy Markdown
Member

@scarmuega scarmuega commented May 11, 2026

Adds comprehensive crate- and module-level documentation across the workspace, fixes rustdoc warnings, and moves pallas::interop::configs inside hardano.

Summary by CodeRabbit

  • New Features

    • Expanded public API surface across networking protocols with new message variants for protocol termination and batch operations.
    • Added Network::Other(u8) support for custom networks in address handling.
    • Exposed additional public modules: nonce in crypto, math_dashu in math, multiplexer in network, and conway in primitives.
  • Documentation

    • Substantially enhanced Rustdoc comments across all crates with comprehensive usage examples and architectural overviews.
  • Chores

    • Reorganized crate root module structure to use explicit public modules instead of alias re-exports.
    • Updated project hierarchy and configuration entries.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

Warning

Rate limit exceeded

@scarmuega has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 46 minutes and 51 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9f347ee3-b27b-4dfb-b953-b8aab9f8ac62

📥 Commits

Reviewing files that changed from the base of the PR and between 8eea8e6 and 41186bf.

📒 Files selected for processing (3)
  • README.md
  • pallas-primitives/src/lib.rs
  • pallas/src/lib.rs
📝 Walkthrough

Walkthrough

This PR comprehensively improves the pallas codebase by adding extensive Rustdoc comments across all crates, refactoring the umbrella crate's public API from alias re-exports to explicit modules, adding protocol termination message variants for graceful shutdown, moving multiplexer queue operations to AgentChannel, introducing new API methods, and exporting previously internal modules.

Changes

Documentation and API Surface Refinement

Layer / File(s) Summary
Core Type and API Enhancements
pallas-addresses/src/lib.rs, pallas-txbuilder/src/transaction/model.rs, pallas-utxorpc/src/lib.rs
Add Network::Other(u8) variant for unknown networks, ShelleyPaymentPart::is_script() helper method, MintAssets::new() empty constructor, and LedgerContext::get_slot_timestamp(slot: u64) required trait method.
Protocol Termination Variants
pallas-network/src/miniprotocols/blockfetch/protocol.rs, pallas-network/src/miniprotocols/keepalive/protocol.rs, pallas-network/src/miniprotocols/localmsgnotification/protocol.rs, pallas-network/src/miniprotocols/localstate/protocol.rs, pallas-network/src/miniprotocols/txmonitor/protocol.rs
Add BatchDone, Done, ClientDone, and Done message variants to enable graceful protocol termination and batch completion signaling.
Multiplexer API Refactoring
pallas-network/src/multiplexer.rs
Document multiplexer types and move enqueue_chunk/dequeue_chunk operations from Plexer to AgentChannel with comprehensive public method documentation; add ChannelBuffer::unwrap() accessor.
Public Module Exports
pallas-crypto/src/lib.rs, pallas-primitives/src/lib.rs
Export nonce module and conway module as part of public API.
Crate-Level Documentation
pallas-addresses/src/lib.rs, pallas-bech32/src/lib.rs, pallas-codec/src/lib.rs, pallas-configs/src/lib.rs, pallas-crypto/src/lib.rs, pallas-hardano/src/lib.rs, pallas-math/src/lib.rs, pallas-network/src/lib.rs, pallas-network2/src/lib.rs, pallas-primitives/src/lib.rs, pallas-traverse/src/lib.rs, pallas-txbuilder/src/lib.rs, pallas-utxorpc/src/lib.rs, pallas-validate/src/lib.rs
Add comprehensive crate-level documentation describing purpose, usage, feature flags, and module layout.
pallas-addresses Public API
pallas-addresses/src/lib.rs
Document error enums, Pointer, ShelleyAddress, and StakeAddress with added doc comments and support for unknown network identifiers.
Network Miniprotocol APIs
pallas-network/src/miniprotocols/*/client.rs, pallas-network/src/miniprotocols/*/server.rs, pallas-network/src/miniprotocols/*/protocol.rs
Document all miniprotocol error enums, message variants, state machines, and client/server API methods across blockfetch, chainsync, handshake, keepalive, localmsgnotification, localstate, localtxsubmission, peersharing, txmonitor, and txsubmission. Handshake server gains state inspection methods (state, is_done, unwrap).
Transaction Builder and Primitives Documentation
pallas-txbuilder/src/transaction/model.rs, pallas-txbuilder/src/conway.rs, pallas-txbuilder/src/lib.rs, pallas-primitives/src/lib.rs
Document StagingTransaction fields, BuiltTransaction signing, Conway era building semantics, and ledger primitives (Network, Nonce, Relay, StakeCredential, governance types).
Umbrella Crate Restructuring
pallas/src/lib.rs
Restructure public API from alias re-exports to explicit pub mod modules; organize ledger (primitives, traverse, addresses, validate), network, network2 (gated), crypto, codec, interop (utxorpc, hardano with renamed feature and expanded re-exports including interop::hardano::configs), and txbuilder; remove deprecated storage and wallet modules.
README and Configuration
README.md, pallas-addresses/README.md, .gitignore
Move txbuilder to top-level in crate hierarchy diagram; update pallas-addresses bech32 example; ignore .claude local agent directory.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • txpipe/pallas#734: Exposes pallas_network2 behind a feature gate; directly related to the network2 module restructuring in this PR.
  • txpipe/pallas#745: Modifies LedgerContext trait in pallas-utxorpc to add get_slot_timestamp method, same API change as this PR.
  • txpipe/pallas#760: Updates root README with crate listings and quickstart; directly related to README reorganization in this PR.

🐰 A tale of docs told true and APIs made new,
With protocols that know when to say "we're through,"
No breaking change could ever be so bright,
When every public surface shines in Rustdoc light!

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/docs-and-hardano-restructure

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (6)
pallas-network/src/miniprotocols/txmonitor/client.rs (1)

7-222: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Missing public method to send the Done message.

The client validates that Message::Done can be sent from the Idle state (line 79), and the protocol now includes this variant (pallas-network/src/miniprotocols/txmonitor/protocol.rs line 64), but there's no public API to actually send it. Other miniprotocol clients in this PR (e.g., peersharing::Client::send_done) expose this functionality.

➕ Suggested method to add
/// Terminate the protocol.
pub async fn done(&mut self) -> Result<(), Error> {
    let msg = Message::Done;
    self.send_message(&msg).await?;
    self.0 = State::Done;
    Ok(())
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pallas-network/src/miniprotocols/txmonitor/client.rs` around lines 7 - 222,
Add a public async method named done(&mut self) -> Result<(), Error> to impl
Client that constructs Message::Done, calls self.send_message(&msg).await? to
perform the send (this will enforce agency/outbound checks), then sets self.0 =
State::Done and returns Ok(()); place it alongside the other public API methods
(e.g., after release or with other query methods). Ensure the method signature
and state transition match the existing pattern used by
send_acquire/release/query_* and that Message::Done is the variant validated by
assert_outbound_state.
pallas-network/src/miniprotocols/handshake/server.rs (1)

91-98: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Return InvalidInbound for an unexpected client message here.

This branch is handling a message received from the peer, so returning InvalidOutbound misclassifies the failure and makes debugging noisier downstream.

Proposed fix
-            _ => Err(Error::InvalidOutbound),
+            _ => Err(Error::InvalidInbound),
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pallas-network/src/miniprotocols/handshake/server.rs` around lines 91 - 98,
In receive_proposed_versions (method on the handshake server) the
unexpected-message branch currently returns Error::InvalidOutbound but this is a
message we received from the peer, so change that to return
Error::InvalidInbound; update the match arm in receive_proposed_versions to
construct and return Error::InvalidInbound instead of InvalidOutbound to
correctly classify the error for downstream debugging and logs.
pallas-network/src/facades.rs (2)

97-106: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Exit the keep-alive server loop after protocol termination.

recv_keepalive_request() can move the server to Done, but this loop immediately calls keepalive_roundtrip() again. A clean shutdown then turns into an extra read/error path instead of returning normally.

Proposed fix
     pub async fn run_server(mut server: keepalive::Server) -> Result<(), Error> {
         loop {
             debug!("waiting keepalive request");

             server
                 .keepalive_roundtrip()
                 .await
                 .map_err(Error::KeepAliveServerLoop)?;
+
+            if server.is_done() {
+                return Ok(());
+            }
         }
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pallas-network/src/facades.rs` around lines 97 - 106, The server keep-alive
loop in run_server keeps calling keepalive_roundtrip() even after the protocol
transitions to Done; update run_server (the function taking server:
keepalive::Server) to detect the protocol termination and exit the loop normally
instead of invoking another roundtrip. Concretely, call or inspect the keepalive
API that reports state (e.g. recv_keepalive_request() or a returned status from
keepalive_roundtrip()), match the result/state and break/return Ok(()) when it
indicates Done, otherwise continue and map errors to Error::KeepAliveServerLoop
as before.

236-244: ⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

with_chainsync is unsound and appears to be unused.

tokio::spawn requires Send + 'static futures. Any closure capturing op(&mut self.chainsync) that awaits will borrow a non-'static reference and cannot satisfy this bound, making the helper effectively unusable. Additionally, the method is never called anywhere in the codebase. Either remove it as dead code or, if intended as public API, fix it by awaiting inline:

Corrected implementation
-    pub async fn with_chainsync<T, O, Fut>(&mut self, op: T) -> tokio::task::JoinHandle<O>
+    pub async fn with_chainsync<T, O, Fut>(&mut self, op: T) -> O
     where
         T: FnOnce(&mut chainsync::N2NClient) -> Fut,
-        Fut: std::future::Future<Output = O> + Send + 'static,
-        O: Send + 'static,
+        Fut: std::future::Future<Output = O>,
     {
-        tokio::spawn(op(&mut self.chainsync))
+        op(&mut self.chainsync).await
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pallas-network/src/facades.rs` around lines 236 - 244, with_chainsync is
unsound because it calls tokio::spawn(op(&mut self.chainsync)), which requires
the spawned future to be Send+'static but the closure borrows &mut
self.chainsync; either delete this unused method or change it so it does not
spawn a non-'static borrow: implement it to await inline (call op(&mut
self.chainsync).await and return O synchronously/async from with_chainsync) or
make chainsync shareable (e.g., store Arc<Mutex<chainsync::N2NClient>> as
self.chainsync and clone that into the spawned task) so the future is
Send+'static; update references to with_chainsync accordingly.
pallas-txbuilder/src/transaction/model.rs (1)

890-923: ⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Don't unwrap() an empty witness set on signature removal.

If this removes the last witness, NonEmptySet::from_vec(vkey_witnesses) returns None and Line 921 panics. Removing the final signature should clear vkeywitness, not crash.

Proposed fix
-                tx.transaction_witness_set.vkeywitness =
-                    Some(NonEmptySet::from_vec(vkey_witnesses).unwrap());
+                tx.transaction_witness_set.vkeywitness =
+                    NonEmptySet::from_vec(vkey_witnesses);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pallas-txbuilder/src/transaction/model.rs` around lines 890 - 923, The Conway
branch of remove_signature currently always calls
NonEmptySet::from_vec(...).unwrap() when reconstructing
transaction_witness_set.vkeywitness, which will panic if the retained
vkey_witnesses vector is empty; change the logic in remove_signature
(BuilderEra::Conway) to check if vkey_witnesses.is_empty() and set
tx.transaction_witness_set.vkeywitness = None in that case, otherwise set it to
Some(NonEmptySet::from_vec(vkey_witnesses).unwrap()); ensure you reference the
same variables (new_sigs, pk, tx, vkey_witnesses, self.tx_bytes) so the witness
list is safely cleared instead of panic-ing when the last signature is removed.
pallas-txbuilder/src/lib.rs (1)

55-60: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Fix the MalformedScript display string.

This variant documents a script-decoding failure, but Line 59 still renders "Transaction has no inputs". That will misreport the actual cause to callers.

Proposed fix
-    #[error("Transaction has no inputs")]
+    #[error("Could not decode script bytes")]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@pallas-txbuilder/src/lib.rs` around lines 55 - 60, The error variant
TxBuilderError::MalformedScript currently has the wrong display string; update
the #[error(...)] attribute on the MalformedScript enum variant so it describes
a script decoding failure (e.g., "Provided bytes could not be decoded into a
script" or similar) instead of "Transaction has no inputs" to ensure the
reported error matches the variant meaning.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@pallas-txbuilder/src/transaction/model.rs`:
- Around line 124-128: The remove_output builder currently calls Vec::remove
which will panic for empty outputs or out-of-range index; change remove_output
to guard by checking self.outputs (use self.outputs.as_mut() or
unwrap_or_default then operate on the mutable vec) and only call remove when
index < txouts.len(), otherwise leave self.outputs unchanged (no-op) and return
self; reference the remove_output method, the outputs field, and Vec::remove in
your change and keep the method signature the same.

In `@pallas-utxorpc/src/lib.rs`:
- Around line 96-104: The change adds a required method get_slot_timestamp to
the public LedgerContext trait which is a breaking change for existing
implementations; make it non-breaking by providing a default implementation on
the LedgerContext trait (e.g., returning None) so existing types implementing
LedgerContext (which currently implement get_utxos) continue to compile, or
alternatively mark it as a new required method only after a major version bump
and document the breaking change—update the trait declaration for LedgerContext
to supply a default for get_slot_timestamp so callers can opt-in to override it.

In `@pallas/src/lib.rs`:
- Around line 239-262: The new nested pub mod hardano::configs accidentally
feature-gates the configs API; restore a non-feature-gated export so consumers
can use pallas_configs without enabling hardano by either (A) adding a top-level
pub mod configs that re-exports pallas_configs (pub use pallas_configs::*;)
outside the #[cfg(feature = "hardano")] block, or (B) split the feature flags
and make configs gated by its own feature (e.g., #[cfg(feature = "configs")] for
the configs module) while keeping hardano separately gated; update the existing
hardano::configs to remain for compatibility if desired but ensure the top-level
pub mod configs or separate feature exposes pallas_configs unconditionally or
under its own feature.

---

Outside diff comments:
In `@pallas-network/src/facades.rs`:
- Around line 97-106: The server keep-alive loop in run_server keeps calling
keepalive_roundtrip() even after the protocol transitions to Done; update
run_server (the function taking server: keepalive::Server) to detect the
protocol termination and exit the loop normally instead of invoking another
roundtrip. Concretely, call or inspect the keepalive API that reports state
(e.g. recv_keepalive_request() or a returned status from keepalive_roundtrip()),
match the result/state and break/return Ok(()) when it indicates Done, otherwise
continue and map errors to Error::KeepAliveServerLoop as before.
- Around line 236-244: with_chainsync is unsound because it calls
tokio::spawn(op(&mut self.chainsync)), which requires the spawned future to be
Send+'static but the closure borrows &mut self.chainsync; either delete this
unused method or change it so it does not spawn a non-'static borrow: implement
it to await inline (call op(&mut self.chainsync).await and return O
synchronously/async from with_chainsync) or make chainsync shareable (e.g.,
store Arc<Mutex<chainsync::N2NClient>> as self.chainsync and clone that into the
spawned task) so the future is Send+'static; update references to with_chainsync
accordingly.

In `@pallas-network/src/miniprotocols/handshake/server.rs`:
- Around line 91-98: In receive_proposed_versions (method on the handshake
server) the unexpected-message branch currently returns Error::InvalidOutbound
but this is a message we received from the peer, so change that to return
Error::InvalidInbound; update the match arm in receive_proposed_versions to
construct and return Error::InvalidInbound instead of InvalidOutbound to
correctly classify the error for downstream debugging and logs.

In `@pallas-network/src/miniprotocols/txmonitor/client.rs`:
- Around line 7-222: Add a public async method named done(&mut self) ->
Result<(), Error> to impl Client that constructs Message::Done, calls
self.send_message(&msg).await? to perform the send (this will enforce
agency/outbound checks), then sets self.0 = State::Done and returns Ok(());
place it alongside the other public API methods (e.g., after release or with
other query methods). Ensure the method signature and state transition match the
existing pattern used by send_acquire/release/query_* and that Message::Done is
the variant validated by assert_outbound_state.

In `@pallas-txbuilder/src/lib.rs`:
- Around line 55-60: The error variant TxBuilderError::MalformedScript currently
has the wrong display string; update the #[error(...)] attribute on the
MalformedScript enum variant so it describes a script decoding failure (e.g.,
"Provided bytes could not be decoded into a script" or similar) instead of
"Transaction has no inputs" to ensure the reported error matches the variant
meaning.

In `@pallas-txbuilder/src/transaction/model.rs`:
- Around line 890-923: The Conway branch of remove_signature currently always
calls NonEmptySet::from_vec(...).unwrap() when reconstructing
transaction_witness_set.vkeywitness, which will panic if the retained
vkey_witnesses vector is empty; change the logic in remove_signature
(BuilderEra::Conway) to check if vkey_witnesses.is_empty() and set
tx.transaction_witness_set.vkeywitness = None in that case, otherwise set it to
Some(NonEmptySet::from_vec(vkey_witnesses).unwrap()); ensure you reference the
same variables (new_sigs, pk, tx, vkey_witnesses, self.tx_bytes) so the witness
list is safely cleared instead of panic-ing when the last signature is removed.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 2923dfed-7c55-4608-9d5b-ebcc0a0e37c4

📥 Commits

Reviewing files that changed from the base of the PR and between 18ce356 and 8eea8e6.

📒 Files selected for processing (63)
  • .gitignore
  • README.md
  • pallas-addresses/README.md
  • pallas-addresses/src/lib.rs
  • pallas-bech32/src/lib.rs
  • pallas-codec/src/lib.rs
  • pallas-configs/src/lib.rs
  • pallas-crypto/src/hash/mod.rs
  • pallas-crypto/src/lib.rs
  • pallas-hardano/src/lib.rs
  • pallas-math/src/lib.rs
  • pallas-network/src/facades.rs
  • pallas-network/src/lib.rs
  • pallas-network/src/miniprotocols/blockfetch/client.rs
  • pallas-network/src/miniprotocols/blockfetch/protocol.rs
  • pallas-network/src/miniprotocols/blockfetch/server.rs
  • pallas-network/src/miniprotocols/chainsync/buffer.rs
  • pallas-network/src/miniprotocols/chainsync/client.rs
  • pallas-network/src/miniprotocols/chainsync/protocol.rs
  • pallas-network/src/miniprotocols/chainsync/server.rs
  • pallas-network/src/miniprotocols/common.rs
  • pallas-network/src/miniprotocols/handshake/client.rs
  • pallas-network/src/miniprotocols/handshake/mod.rs
  • pallas-network/src/miniprotocols/handshake/n2c.rs
  • pallas-network/src/miniprotocols/handshake/n2n.rs
  • pallas-network/src/miniprotocols/handshake/protocol.rs
  • pallas-network/src/miniprotocols/handshake/server.rs
  • pallas-network/src/miniprotocols/keepalive/client.rs
  • pallas-network/src/miniprotocols/keepalive/protocol.rs
  • pallas-network/src/miniprotocols/keepalive/server.rs
  • pallas-network/src/miniprotocols/localmsgnotification/client.rs
  • pallas-network/src/miniprotocols/localmsgnotification/protocol.rs
  • pallas-network/src/miniprotocols/localmsgnotification/server.rs
  • pallas-network/src/miniprotocols/localmsgsubmission/protocol.rs
  • pallas-network/src/miniprotocols/localstate/client.rs
  • pallas-network/src/miniprotocols/localstate/mod.rs
  • pallas-network/src/miniprotocols/localstate/protocol.rs
  • pallas-network/src/miniprotocols/localstate/queries_v16/primitives.rs
  • pallas-network/src/miniprotocols/localstate/server.rs
  • pallas-network/src/miniprotocols/localtxsubmission/client.rs
  • pallas-network/src/miniprotocols/localtxsubmission/mod.rs
  • pallas-network/src/miniprotocols/localtxsubmission/primitives.rs
  • pallas-network/src/miniprotocols/localtxsubmission/server.rs
  • pallas-network/src/miniprotocols/mod.rs
  • pallas-network/src/miniprotocols/peersharing/client.rs
  • pallas-network/src/miniprotocols/peersharing/protocol.rs
  • pallas-network/src/miniprotocols/peersharing/server.rs
  • pallas-network/src/miniprotocols/txmonitor/client.rs
  • pallas-network/src/miniprotocols/txmonitor/protocol.rs
  • pallas-network/src/miniprotocols/txsubmission/client.rs
  • pallas-network/src/miniprotocols/txsubmission/protocol.rs
  • pallas-network/src/miniprotocols/txsubmission/server.rs
  • pallas-network/src/multiplexer.rs
  • pallas-network2/src/lib.rs
  • pallas-primitives/src/lib.rs
  • pallas-traverse/src/lib.rs
  • pallas-txbuilder/src/conway.rs
  • pallas-txbuilder/src/lib.rs
  • pallas-txbuilder/src/transaction/mod.rs
  • pallas-txbuilder/src/transaction/model.rs
  • pallas-utxorpc/src/lib.rs
  • pallas-validate/src/lib.rs
  • pallas/src/lib.rs

Comment thread pallas-txbuilder/src/transaction/model.rs
Comment thread pallas-utxorpc/src/lib.rs
Comment thread pallas/src/lib.rs
@scarmuega scarmuega merged commit 3520353 into main May 11, 2026
9 of 10 checks passed
@scarmuega scarmuega deleted the fix/docs-and-hardano-restructure branch May 11, 2026 14:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant