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.
Problem
No manifest in the workspace sets
rust-version, and every CI job installsdtolnay/rust-toolchain@stable. Together those mean the build is pinned to "whatever Rustreleased most recently". When a new stable lands, CI silently moves to it. If it introduces a
new
clippylint, theclippyjob fails on a PR that changed nothing relevant; if it changescodegen, the WASM the workspace produces changes without a commit.
soroban-sdk27 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
soroban-sdk27.0.4MSRV and verify by building with that exact toolchain — do not guess and do not just copy the
current stable.
rust-versionto[workspace.package]and inherit it in both crates.than decorative. Keep the existing stable jobs; the point is to test both ends.
Acceptance criteria
rust-versionis declared once in[workspace.package]and inherited by both crates.dtolnay/rust-toolchain@<version>) and runscargo buildandcargo test.a compile error from inside a dependency.