-
Notifications
You must be signed in to change notification settings - Fork 21
Security audit of stealth-sender Soroban contract #3
Copy link
Copy link
Closed
Labels
Stellar WaveIssues in the Stellar wave programIssues in the Stellar wave programauditProduces a written report as primary deliverableProduces a written report as primary deliverabledripsFunded via Drips NetworkFunded via Drips Networkhelp wantedExtra attention is neededExtra attention is neededsecuritySecurity-sensitive workSecurity-sensitive workstellarTouches Stellar / Soroban codeTouches Stellar / Soroban code
Metadata
Metadata
Assignees
Labels
Stellar WaveIssues in the Stellar wave programIssues in the Stellar wave programauditProduces a written report as primary deliverableProduces a written report as primary deliverabledripsFunded via Drips NetworkFunded via Drips Networkhelp wantedExtra attention is neededExtra attention is neededsecuritySecurity-sensitive workSecurity-sensitive workstellarTouches Stellar / Soroban codeTouches Stellar / Soroban code
Type
Fields
Give feedbackNo fields configured for issues without a type.
Labels:
Stellar Wave,stellar,audit,security,drips,help-wantedTier: L (1–2 weeks)
Type: audit
Context
contracts/stellar/stealth-sender/performs the atomic "transfer asset + emit announcement" operation. It is the contract that handles user funds in flight during a stealth payment, and it interoperates with arbitrary Stellar Asset Contracts (SAC). The blast radius of an issue here is direct loss of funds.Scope
Independent security review with the standard severity matrix. Specific concerns:
send()callstoken::Client::new(env, &token).transfer(...). Confirm we cannot be re-entered by a malicious SAC during the call, and that we never accept a token contract address that hasn't been validated by the caller.batch_send()should be all-or-nothing. Verify by injecting a failing transfer mid-batch.require_auth_for_args— verify that auth contexts cover both the source account and the asset's spender contract correctly.stealth-sendercalls into the announcer; the announcer could in turn call back via a malicious extension. Confirm reentrancy is impossible or guarded.init()for one-shot semantics. Can it be re-initialized?Acceptance criteria
contracts/stellar/stealth-sender/audits/2026-XX-author.md.tests/audit.rsincluding:send().batch_send.Suggested approach
Build a small
mock-tokenSoroban contract undertests/mocks/that mimics SAC behavior but also implements re-entrancy callbacks. Use it as the harness for all adversarial cases.Files to start with
contracts/stellar/stealth-sender/src/lib.rscontracts/stellar/stealth-announcer/src/lib.rs(called atomically)contracts/evm/contracts/WraithSender.sol