Fix: Support zero-payment private listings #1834
Merged
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