mirror of
https://github.com/logos-messaging/logos-delivery.git
synced 2026-07-30 16:33:14 +00:00
RlnRefreshRetryTimeout previously wrapped the whole retry leg: merkle path refetch + proof regeneration + the second publish. Sharing one clock meant a slow (but successful) refetch could leave no budget for the publish, cancelling it mid-flight — burning the freshly drawn nonce and, worse, reporting the original RLN rejection while the retried request may already have reached the service node and been relayed. Move the withTimeout to cover only attachRLNProof (the on-chain eth_call + proof regeneration — the one step with an unbounded external dependency). The retried publish runs unbounded after it, matching the first attempt's semantics, so slow transports (e.g. an optional mix route) cannot be cancelled by the refresh budget and the caller always receives the publish's actual result. On refresh timeout the retry publish never starts and the original rejection is returned, so a "failed" answer now guarantees no second request is in flight. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>