Fix: Add validation for empty payment items in private listings#1832
Closed
madisoncarter1234 wants to merge 1 commit intoProjectOpenSea:mainfrom
Closed
Fix: Add validation for empty payment items in private listings#1832madisoncarter1234 wants to merge 1 commit intoProjectOpenSea:mainfrom
madisoncarter1234 wants to merge 1 commit intoProjectOpenSea:mainfrom
Conversation
Prevents undefined access error when constructing private listing counter orders. If paymentItems array is empty after filtering, accessing paymentItems[0] on lines 37, 59-61 would crash. Added check to throw descriptive error if no payment items are found.
ryanio
added a commit
that referenced
this pull request
Nov 28, 2025
Fixes SDK crash when fulfilling zero-payment private listings (e.g., rewards claims). Problem: - constructPrivateListingCounterOrder crashes when paymentItems is empty - fulfillPrivateOrder crashes accessing counterOrder.parameters.offer[0] Solution (mirrors backend behavior in os2-core Seaport.kt): - Allow empty payment items in constructPrivateListingCounterOrder - Return counter order with offer: [] for zero-payment listings - Add computePrivateListingValue() to calculate ETH value from original order - Use computed value instead of counter order's offer[0].startAmount This enables fulfillment of zero-payment private listings used for rewards claims via REWARDS_PRIVATE_LISTING_CLAIM_WALLET. Closes #1832
3 tasks
Collaborator
|
thank you! went with an approach that allows fulfilling of zero payment item private orders (we use these types of orders for rewards when people earn NFTs, so is still nice to support) |
ryanio
added a commit
that referenced
this pull request
Nov 28, 2025
Fixes SDK crash when fulfilling zero-payment private listings (e.g., rewards claims). Problem: - constructPrivateListingCounterOrder crashes when paymentItems is empty - fulfillPrivateOrder crashes accessing counterOrder.parameters.offer[0] Solution (mirrors backend behavior in os2-core Seaport.kt): - Allow empty payment items in constructPrivateListingCounterOrder - Return counter order with offer: [] for zero-payment listings - Add computePrivateListingValue() to calculate ETH value from original order - Use computed value instead of counter order's offer[0].startAmount This enables fulfillment of zero-payment private listings used for rewards claims via REWARDS_PRIVATE_LISTING_CLAIM_WALLET. Closes #1832
ryanio
added a commit
that referenced
this pull request
Nov 28, 2025
Fixes SDK crash when fulfilling zero-payment private listings (e.g., rewards claims). Problem: - constructPrivateListingCounterOrder crashes when paymentItems is empty - fulfillPrivateOrder crashes accessing counterOrder.parameters.offer[0] Solution (mirrors backend behavior in os2-core Seaport.kt): - Allow empty payment items in constructPrivateListingCounterOrder - Return counter order with offer: [] for zero-payment listings - Add computePrivateListingValue() to calculate ETH value from original order - Use computed value instead of counter order's offer[0].startAmount This enables fulfillment of zero-payment private listings used for rewards claims via REWARDS_PRIVATE_LISTING_CLAIM_WALLET. Closes #1832
ryanio
added a commit
that referenced
this pull request
Nov 28, 2025
Fixes SDK crash when fulfilling zero-payment private listings (e.g., rewards claims). Problem: - constructPrivateListingCounterOrder crashes when paymentItems is empty - fulfillPrivateOrder crashes accessing counterOrder.parameters.offer[0] Solution (mirrors backend behavior in os2-core Seaport.kt): - Allow empty payment items in constructPrivateListingCounterOrder - Return counter order with offer: [] for zero-payment listings - Add computePrivateListingValue() to calculate ETH value from original order - Use computed value instead of counter order's offer[0].startAmount This enables fulfillment of zero-payment private listings used for rewards claims via REWARDS_PRIVATE_LISTING_CLAIM_WALLET. Closes #1832
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.
Bug
In
src/orders/privateListings.ts, theconstructPrivateListingCounterOrderfunction filters payment items but doesn't check if the result is empty. Lines 37, 59-61 then accesspaymentItems[0]which would be undefined and crash.How it happens
paymentItemsis emptypaymentItems.every(...)returns true for empty arrays (vacuous truth)paymentItems[0]which is undefined → crashFix
Added explicit length check after filtering. Now throws a descriptive error instead of crashing with undefined access.
This prevents runtime errors in edge case scenarios with malformed private listings.