Skip to content

No crate declares an MSRV, so a stable toolchain bump can break the build with no warning #173

Description

@mallison031

Repo context. accensa-contracts holds the on-chain half of Accensa: ReceiptAnchor
(Merkle batch anchoring so an agent can verify it was charged correctly without trusting
the seller's API) and RefundVault (policy-bounded refunds without the merchant becoming
a custodian). Both are deployed on testnet. soroban-sdk 27.0.4, MIT. Read README.md,
docs/SECURITY_MODEL.md and DEPLOYMENTS.md before starting.

Problem

No manifest in the workspace sets rust-version, and every CI job installs
dtolnay/rust-toolchain@stable. Together those mean the build is pinned to "whatever Rust
released most recently". When a new stable lands, CI silently moves to it. If it introduces a
new clippy lint, the clippy job fails on a PR that changed nothing relevant; if it changes
codegen, the WASM the workspace produces changes without a commit.

soroban-sdk 27 has its own minimum supported Rust version. The workspace does not record it,
so a contributor on an older toolchain gets a confusing mid-compile error from inside the SDK
instead of a clear "this crate requires Rust >= X".

What to do

  • Determine the actual minimum this workspace builds on. Start from the soroban-sdk 27.0.4
    MSRV and verify by building with that exact toolchain — do not guess and do not just copy the
    current stable.
  • Add rust-version to [workspace.package] and inherit it in both crates.
  • Add a CI job that builds and tests on the pinned MSRV, so the declaration is enforced rather
    than decorative. Keep the existing stable jobs; the point is to test both ends.

Acceptance criteria

  • rust-version is declared once in [workspace.package] and inherited by both crates.
  • A CI job installs exactly that toolchain (dtolnay/rust-toolchain@<version>) and runs
    cargo build and cargo test.
  • Building with a toolchain older than the declared MSRV fails with cargo's own MSRV error, not
    a compile error from inside a dependency.
  • The PR states how the MSRV was determined.

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions