-
Notifications
You must be signed in to change notification settings - Fork 621
Update x402 default payment validity window #8317
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -32,7 +32,7 @@ function preparePaymentHeader( | |
| nonce: Hex, | ||
| ): UnsignedPaymentPayload { | ||
| const validAfter = BigInt( | ||
| Math.floor(Date.now() / 1000) - 600, // 10 minutes before | ||
| Math.floor(Date.now() / 1000) - 86400, // 24h before in case weird block timestamp behavior | ||
| ).toString(); | ||
|
Comment on lines
34
to
36
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧩 Analysis chainReconsider the 24-hour validAfter window for authorization signatures. Setting
The comment "weird block timestamp behavior" is vague. If this addresses a specific blockchain issue, it should be documented with details about which chains and what specific behavior is being mitigated. Consider reducing this to a more conservative value (e.g., 600-1800 seconds) that still handles reasonable clock skew while limiting security exposure. Run the following to check for any documented requirements: 🏁 Script executed: #!/bin/bash
# Search for documentation or comments about timestamp handling in x402 module
rg -n -C3 -g '*.{ts,md}' 'timestamp|validAfter|block.timestamp' packages/thirdweb/src/x402/Length of output: 3504 I'll verify the EIP-3009 specification and search for additional context in the codebase. Now let me search for tests and related documentation in the x402 module to understand if there's a specific reason for this 24-hour window: Let me search the codebase for tests and any specific rationale for the 24-hour window:Based on my thorough verification, I can now provide the rewritten review comment. The web search results confirm:
The 24-hour (86400 seconds) backward window is significantly excessive for handling blockchain timestamp drift and introduces unnecessary security risks. The original review comment's concerns are valid and substantiated by industry standards. Reduce the 24-hour validAfter window to a more reasonable value consistent with blockchain standards. Ethereum clients only allow block timestamps up to 15 seconds in the future, and actual timestamp accuracy varies only up to a few tens of seconds. Setting
Consider reducing 🤖 Prompt for AI Agents |
||
| const validBefore = BigInt( | ||
| Math.floor(Date.now() / 1000 + paymentRequirements.maxTimeoutSeconds), | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🧩 Analysis chain
Verify that 24-hour timeout aligns with security and UX requirements.
The default
maxTimeoutSecondshas been increased from 300 seconds (5 minutes) to 86400 seconds (24 hours). While this supports retry scenarios as mentioned in the PR description, consider the following:Verify that this timeout duration is appropriate for your payment flow. Consider whether a more granular approach (e.g., different defaults for different scenarios) would be more suitable. You may also want to search for best practices around EIP-2612 and EIP-3009 authorization validity windows:
🌐 Web query:
💡 Result:
Short answer
EIP‑2612 (permit): the spec leaves deadline to the signer; common practice is to use short expiries (minutes→hours). Example usages and docs commonly show deadline = now + 3600s (1 hour) or shorter (e.g., 5–20 minutes) as best practice. [EIP‑2612][1][2][3]
EIP‑3009 (transferWithAuthorization): the spec provides validAfter/validBefore and recommends bounding authorizations; common examples use validBefore = now + 3600s (1 hour) and validAfter = now (or a short delay), i.e. a validity window (minutes→hours) chosen by the app. [EIP‑3009][4][5][6]
Notes
Sources
References
[1] https://eips.ethereum.org/EIPS/eip-2612
[2] https://eips-wg.github.io/EIPs/2612/
[3] https://docs.openzeppelin.com/contracts/ (ERC20Permit)
[4] https://eips.ethereum.org/EIPS/eip-3009
[5] https://eips-wg.github.io/EIPs/3009/
[6] example usages (libraries/docs showing validBefore/deadline = now + 3600s).
🏁 Script executed:
Length of output: 10404
🏁 Script executed:
Length of output: 3838
🏁 Script executed:
Length of output: 1850
Reduce
maxTimeoutSecondsdefault from 86400 to align with EIP-2612/EIP-3009 best practices.The default timeout was increased from 300 seconds (5 minutes) to 86400 seconds (24 hours). This contradicts established standards:
verify-payment.tsandsettle-payment.tsusemaxTimeoutSeconds: 300(5 minutes)validBeforefor signature validity (line 38 insign.ts), directly affecting authorization window lengthA 24-hour validity window creates a significant security gap: signatures remain valid for an entire day, increasing exposure to replay attacks or misuse of stale authorizations. Reduce the default to 3600 (1 hour) or provide documented security justification for the 24-hour window.
🤖 Prompt for AI Agents