# Releasing
## Prerequisites
- `cargo fmt --all`
- `cargo clippy --workspace --all-features -- -D warnings`
- `cargo test --workspace --all-features`
- valid crates.io authentication via `cargo login`
## First crates.io publish
This workspace publishes in dependency order.
The top-level `silent-payments` crate and the `silent-payments-cli` crate cannot be
packaged locally until their internal dependencies already exist on crates.io.
That is expected on the first publish.
Some internal crates also reference sibling crates in `dev-dependencies`, so
the first publish is simplest with `--no-verify`.
Publish in this exact order:
```sh
cargo publish -p silent-payments-bdk-sp --no-verify
cargo publish -p silent-payments-core --no-verify
cargo publish -p silent-payments-send --no-verify
cargo publish -p silent-payments-receive --no-verify
cargo publish -p silent-payments-dleq --no-verify
cargo publish -p silent-payments-descriptor --no-verify
cargo publish -p silent-payments-psbt --no-verify
cargo publish -p silent-payments-scan --no-verify
```
Wait for the crates.io index to catch up, then publish:
```sh
cargo publish -p silent-payments
cargo publish -p silent-payments-cli
```
If index propagation is still lagging, retry the final two commands after a few
minutes.
## Recommended dry runs after first publish
Once the internal crates exist on crates.io, these should work for future
releases:
```sh
cargo publish --dry-run -p silent-payments-bdk-sp
cargo publish --dry-run -p silent-payments-core
cargo publish --dry-run -p silent-payments-send
cargo publish --dry-run -p silent-payments-receive
cargo publish --dry-run -p silent-payments-dleq
cargo publish --dry-run -p silent-payments-descriptor
cargo publish --dry-run -p silent-payments-psbt
cargo publish --dry-run -p silent-payments-scan
cargo publish --dry-run -p silent-payments
cargo publish --dry-run -p silent-payments-cli
```
## Suggested release flow
```sh
git status
cargo fmt --all
cargo clippy --workspace --all-features -- -D warnings
cargo test --workspace --all-features
git tag -a v0.1.1 -m "Release v0.1.1"
```