Commit 0954f71
authored
fix(predict): cap slippage to avoid sharePrice > 1 (MetaMask#22354)
## **Description**
This PR fixes a bug in the Polymarket prediction provider where orders
could fail due to an invalid share price calculation. The issue occurred
when slippage was applied to `minAmountReceived`, causing the calculated
share price to exceed 1 (which is mathematically impossible for
prediction market shares).
The fix introduces a cap on `minAmountWithSlippage` to ensure it never
falls below `maxAmountSpent + tickSize`, preventing the share price from
exceeding 1 while still accounting for slippage to reduce order failure
rates.
## **Changelog**
CHANGELOG entry: null
## **Related issues**
Fixes:
## **Manual testing steps**
```gherkin
Feature: Polymarket prediction order execution
Scenario: user creates a prediction market order with slippage
Given the user is on the Predict feature
And a Polymarket prediction market is available
When user creates an order with slippage applied
Then the order should execute successfully without sharePrice > 1 errors
And the minAmountReceived should be capped appropriately
```
## **Screenshots/Recordings**
<!-- If applicable, add screenshots and/or recordings to visualize the
before and after of your change. -->
### **Before**
<!-- Orders could fail with sharePrice > 1 errors -->
### **After**
<!-- Orders execute successfully with proper slippage capping -->
## **Pre-merge author checklist**
- [x] I've followed [MetaMask Contributor
Docs](https://github.com/MetaMask/contributor-docs) and [MetaMask Mobile
Coding
Standards](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/CODING_GUIDELINES.md).
- [x] I've completed the PR template to the best of my ability
- [x] I've included tests if applicable
- [x] I've documented my code using [JSDoc](https://jsdoc.app/) format
if applicable
- [x] I've applied the right labels on the PR (see [labeling
guidelines](https://github.com/MetaMask/metamask-mobile/blob/main/.github/guidelines/LABELING_GUIDELINES.md)).
Not required for external contributors.
## **Pre-merge reviewer checklist**
- [ ] I've manually tested the PR (e.g. pull and build branch, run the
app, test code being changed).
- [ ] I confirm that this PR addresses all acceptance criteria described
in the ticket it closes and includes the necessary testing evidence such
as recordings and or screenshots.
<!-- CURSOR_SUMMARY -->
---
> [!NOTE]
> Adjusts slippage handling in `PolymarketProvider.placeOrder` by
flooring BUY `minAmountWithSlippage` at `maxAmountSpent + tickSize`
before rounding to avoid invalid share prices.
>
> - **Predict/Polymarket**:
> - Update `placeOrder` slippage logic:
> - Compute `_minWithSlippage = minAmountReceived * (1 - slippage)`.
> - For `BUY`, floor to `maxAmountSpent + tickSize` before rounding via
`roundOrderAmount`.
> - Use the rounded value to derive `takerAmount`.
>
> <sup>Written by [Cursor
Bugbot](https://cursor.com/dashboard?tab=bugbot) for commit
dc8a157. This will update automatically
on new commits. Configure
[here](https://cursor.com/dashboard?tab=bugbot).</sup>
<!-- /CURSOR_SUMMARY -->1 parent dddee92 commit 0954f71
1 file changed
Lines changed: 18 additions & 2 deletions
Lines changed: 18 additions & 2 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
588 | 588 | | |
589 | 589 | | |
590 | 590 | | |
591 | | - | |
| 591 | + | |
| 592 | + | |
| 593 | + | |
592 | 594 | | |
593 | 595 | | |
| 596 | + | |
| 597 | + | |
| 598 | + | |
| 599 | + | |
| 600 | + | |
| 601 | + | |
| 602 | + | |
| 603 | + | |
| 604 | + | |
| 605 | + | |
| 606 | + | |
| 607 | + | |
| 608 | + | |
| 609 | + | |
594 | 610 | | |
595 | | - | |
| 611 | + | |
596 | 612 | | |
597 | 613 | | |
598 | 614 | | |
| |||
0 commit comments