fix: clear detected credential after settlement to prevent double-settle#163
Closed
fix: clear detected credential after settlement to prevent double-settle#163
Conversation
When a tool handler calls requirePayment() multiple times in the same request (e.g., image server: pre-flight balance check + post-generation charge), the second call would try to re-settle the same credential that was already consumed by the first call. This caused settlement failures: "Transaction hash has already been used" (MPP) or "AlreadyProcessed" (Solana X402). Fix: clear the credential from ALS after successful settlement so subsequent requirePayment() calls in the same request see no credential and proceed directly to charge. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
5 tasks
Contributor
Author
|
Superseded by #164 — settlement moved to middleware instead of clearing credentials after settlement. |
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.
Summary
settleDetectedCredential()succeeds, clears the credential from AsyncLocalStorage so a secondrequirePayment()call in the same request doesn't try to re-settle the same already-consumed credentialrequirePayment()multiple times (e.g., image server's pre-flight balance check + post-generation charge)Root cause
The image MCP server (
circuitandchisel/image/src/tools.ts) callsrequirePayment()twice per tool invocation:On a retry request (with payment credential in headers), both calls read the same credential from ALS. The first settles it successfully, but the second tries to settle the same consumed credential — the on-chain transaction was already processed.
Fix
Add
clearDetectedCredential()and call it immediately after successful settlement inrequirePayment(). The second call sees no credential and proceeds directly tocharge().Test plan
🤖 Generated with Claude Code