Repository navigation
Add order reclaim command to the CLI - #206
Merged
Merged
Conversation
Also ships the CLI Docker image workflow and a --version flag. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kaze-cow
commented
Oct 16, 2026
Malformed order PDAs/UIDs are now rejected at argument parsing, before any keypair load or RPC call. The PDA is derived from the UID afterwards, since a value parser can't see `--program-id`. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kaze-cow
added a commit
that referenced
this pull request
Oct 19, 2026
# Description Brings the `cow` CLI Docker image and its `CLI image` workflow into `main`. This is all @glokos's work: it builds `ghcr.io/cowprotocol/cow-cli` for amd64 and arm64, then merges both into one manifest tagged with the sha and branch/tag. The image includes the Solana CLI and `bc` that the buffer-reclaim script needs. The first three commits are Assem's original commits from #190 and #205, cherry-picked unchanged. The last one drops the temporary `cli-reclaim-buffer` push trigger, which #190 said to remove once the image landed in `main`. ## Motivation #190 and #205 were merged into the reclaim stack's branches instead of `main`, so the image work now shows up inside #206/#207/#204 and makes them harder to review. Landing it here on its own means those PRs only show CLI changes once they're rebased. ## Considerations ### Credit Please **rebase-merge** this PR rather than squash it, so that Assem's commits land on `main` with him as the author. The trigger commit lists him as co-author too. ### Parity with the stack `.github/workflows/cli-image.yml` and `test-cli/Dockerfile` on this branch are byte-for-byte identical to the versions on `cli-reclaim-buffer` (#204), so rebasing the stack onto `main` afterwards should drop these files from its diff. ## How to test This PR should be the same as those already included in the buffer reclaim changes we eventually expect to merge: ``` git diff origin/cli-reclaim-buffer -- .github/workflows/cli-image.yml test-cli/Dockerfile # empty ``` **Once merged**, any branch that contains the workflow file can be built by hand, via Actions → CLI image → Run workflow (pick the branch under "Use workflow from") or: ``` gh workflow run cli-image.yml --ref <branch> ``` Unfortunately it doesn't seem to be possible to workflow dispatch until this is actually merged, but an example of this dockerfile generating a successful build though CI is [already on its actions page](https://github.com/cowprotocol/solana-programs/actions/workflows/cli-image.yml). The image is tagged `cow-cli:<branch>` (slashes become `-`) and `cow-cli:sha-<short>`. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Assem Hasna <assem@cow.fi> Co-authored-by: Assem Hasna <210342530+glokos@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Federico Giacon <58218759+fedgiac@users.noreply.github.com>
the problem is TryFrom sort of implies that, if the `TryFrom` succeeds, it was a valid settlement error. but if the error was emitted by an unrelated program, this may be misleading. So use an explicit function
fedgiac
reviewed
Oct 21, 2026
| /// recipients couldn't be read, or the account is not owned by the settlement | ||
| /// program. | ||
| pub fn run(ctx: Context, args: ReclaimArgs) -> anyhow::Result<()> { | ||
| let orders = &args.orders; |
Contributor
There was a problem hiding this comment.
Should we try to dedup the orders first? I believe that reclaiming two times the same order would lead to failure.
Contributor
Author
There was a problem hiding this comment.
yea my mentality here is to leave the failures to the settlement program/solana runtime if they are going to happen. this seems like a rather specific error (there are many ways to specify invalid inputs here), so I would rather leave this out for the same reason as other errors in the input.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
kaze-cow
added a commit
that referenced
this pull request
Oct 23, 2026
# Description Adds the `cow buffer` subcommand group with its shared `send` helper, and `cow buffer create <mint>...`, which creates the missing buffer PDAs of up to 14 mints in one transaction. Mints whose buffer already exists are skipped and reported. ## Motivation Second of the three PRs split out of #204, stacked on #206. This lays the groundwork that `buffer reclaim` (#204) builds on. ## Considerations ### One instruction per token program `CreateBuffers` serves a single token program, so mints are grouped and get one instruction per program. `MAX_MINTS = 14` is the worst case, where the mints span both programs. `max_mints_is_the_most_that_always_fit` pins it. ### Validation As with order reclaim, every mint is checked first: it has to exist, be owned by a supported token program and decode as a mint. If any fail, nothing is sent. ## How to test ``` cargo test -p cow-test-cli cargo run -p cow-test-cli -- buffer create --help ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Federico Giacon <58218759+fedgiac@users.noreply.github.com>
kaze-cow
added a commit
that referenced
this pull request
Oct 23, 2026
# Description Adds `cow buffer reclaim <target> <buffer>[:<max burn>]...`, which closes up to 11 buffer PDAs in one transaction, burns whatever they hold up to a per-buffer limit, and sends their rent to `target`. The CLI image also gets the Solana CLI and `bc` (#205), which the devops buffer-reclaim script uses. ## Motivation This is used by the reclaim scripts on the devops side. It's the last of the three PRs split out of the original version of this one, stacked on #207 (buffer create), which is stacked on #206 (order reclaim). ## Considerations ### Older deployments Buffer and state PDAs are seeded with the `<major>.<minor>` release, so `--settlement-version` lets the CLI derive them for a deployment of an older release (e.g. `0.4`). The interface gains `settlement_seed_for_version` for this, and the CLI wraps it in `SettlementSeed`, which validates the version string. ### Burn limits A buffer holding more than its burn limit is left open and listed instead of failing the batch, since the program would skip it anyway. Any other bad buffer (wrong owner, not at its mint's PDA, not a token account) aborts the whole batch before anything is sent. ### Batch size `MAX_BUFFERS = 11` is the worst case: both token programs, and a reclaim authority signing separately from the payer. ## Refactor for Keypair Arg Its possible to have a key that only signs the transaction without actually holding any SOL. To allow for this. capability, a new `KeypairArg` parsable thing was added to clap and it allows for a file input which can then be resolved once the signer is needed. ## How to test ``` cargo test -p cow-test-cli -p cow-settlement-interface cargo run -p cow-test-cli -- buffer reclaim --help ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Assem Hasna <210342530+glokos@users.noreply.github.com> Co-authored-by: Federico Giacon <58218759+fedgiac@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description
Adds
cow reclaim <order>..., which closes up to 15 order PDAs in one transaction and refunds each one's rent to the order'screated_by. It also ships the CLI Docker image workflow (from #190, now triggered onmainand tags only) and acow --versionflag.Motivation
The devops reclaim scripts need to sweep closed orders from the CLI image. This is the first of three PRs split out of #204: order reclaim here, then buffer create, then buffer reclaim.
Considerations
All or nothing
Every input is resolved and checked (it has to be an order owned by the program) before anything is sent. If one fails, the CLI lists the offending inputs and sends nothing. If the transaction fails on-chain, the failing instruction index is mapped back to its input and the
SettlementErroris decoded.Batch size
MAX_ORDERS = 15is the worst case where every order has a distinct creator.max_orders_is_the_most_that_always_fitpins that against the 1232-byte packet limit, which is whybincodecomes in as a dev-dependency.From<InstructionError> for SettlementErrorfunctionInterestingly, there doesn't seems to be a good way to convert from a
InstructionErrorto aSettlementError. So I added this to the interface!How to test
🤖 Generated with Claude Code