Fix: Support zero-payment private listings#1834
Merged
Conversation
8fd170b to
0e55cb3
Compare
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
0e55cb3 to
4b8636e
Compare
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
Fixes SDK crash when fulfilling zero-payment private listings (e.g., rewards claims).
Closes #1832 - This PR supersedes #1832 by properly supporting zero-payment private listings instead of just throwing an error.
Problem
The SDK crashes when fulfilling private listings with no payment consideration items:
constructPrivateListingCounterOrderaccessespaymentItems[0]without checking if the array is emptyfulfillPrivateOrderaccessescounterOrder.parameters.offer[0].startAmountwhich is undefined for zero-payment listingsWhy #1832's approach was insufficient
PR #1832 proposed throwing an error when
paymentItemsis empty. However, investigation of the backend (os2-core) revealed that zero-payment private listings are valid and deliberately supported:PrivateListingValidationRule.ktbypasses thepricePerItem <= 0check forREWARDS_PRIVATE_LISTING_CLAIM_WALLETSeaportListingValidationRules.ktbypasses the "must have 1-7 currency items" check for the same walletSeaport.kt:1563-1574explicitly handles empty payment items by returningoffer: emptyList()The backend already handles this correctly - the SDK should too.
Solution
Mirror the backend behavior:
Allow empty payment items -
constructPrivateListingCounterOrdernow returns a counter order withoffer: []for zero-payment listings instead of crashingCompute value from original order - Added
computePrivateListingValue()that sums native currency consideration items from the original order, handling both standard and zero-payment casesUse computed value -
fulfillPrivateOrdernow usescomputePrivateListingValue()instead ofcounterOrder.parameters.offer[0].startAmountChanges
src/orders/privateListings.ts:computePrivateListingValue()helper functionconstructPrivateListingCounterOrder()to handle empty payment itemssrc/sdk/fulfillment.ts:computePrivateListingValue()Testing