diff --git a/app/components/UI/Predict/controllers/PredictController.ts b/app/components/UI/Predict/controllers/PredictController.ts index 957b5b3a038c..4c95fea1aad9 100644 --- a/app/components/UI/Predict/controllers/PredictController.ts +++ b/app/components/UI/Predict/controllers/PredictController.ts @@ -1157,70 +1157,58 @@ export class PredictController extends BaseController< // Track Predict Action Completed or Failed const completionDuration = performance.now() - startTime; - if (result.success) { - const { spentAmount, receivedAmount } = result.response; - - const cachedBalance = - this.state.balances[providerId]?.[signer.address]?.balance ?? 0; - let realAmountUsd = amountUsd; - let realSharePrice = sharePrice; - try { - if (preview.side === Side.BUY) { - realAmountUsd = parseFloat(spentAmount); - realSharePrice = - parseFloat(spentAmount) / parseFloat(receivedAmount); - - // Optimistically update balance - this.update((state) => { - state.balances[providerId] = state.balances[providerId] || {}; - state.balances[providerId][signer.address] = { - balance: cachedBalance - realAmountUsd, - // valid for 5 seconds (since it takes some time to reflect balance on-chain) - validUntil: Date.now() + 5000, - }; - }); - } else { - realAmountUsd = parseFloat(receivedAmount); - realSharePrice = - parseFloat(receivedAmount) / parseFloat(spentAmount); - - // Optimistically update balance - this.update((state) => { - state.balances[providerId] = state.balances[providerId] || {}; - state.balances[providerId][signer.address] = { - balance: cachedBalance + realAmountUsd, - // valid for 5 seconds (since it takes some time to reflect balance on-chain) - validUntil: Date.now() + 5000, - }; - }); - } - } catch (_e) { - // If we can't get real share price, continue without it - } - - // Track Predict Action Completed (fire and forget) - this.trackPredictOrderEvent({ - eventType: PredictEventType.COMPLETED, - amountUsd: realAmountUsd, - analyticsProperties, - providerId, - completionDuration, - sharePrice: realSharePrice, - }); - } else { - // Track Predict Action Failed (fire and forget) - this.trackPredictOrderEvent({ - eventType: PredictEventType.FAILED, - amountUsd, - analyticsProperties, - providerId, - sharePrice, - completionDuration, - failureReason: result.error || 'Unknown error', - }); + if (!result.success) { throw new Error(result.error); } + const { spentAmount, receivedAmount } = result.response; + + const cachedBalance = + this.state.balances[providerId]?.[signer.address]?.balance ?? 0; + let realAmountUsd = amountUsd; + let realSharePrice = sharePrice; + try { + if (preview.side === Side.BUY) { + realAmountUsd = parseFloat(spentAmount); + realSharePrice = parseFloat(spentAmount) / parseFloat(receivedAmount); + + // Optimistically update balance + this.update((state) => { + state.balances[providerId] = state.balances[providerId] || {}; + state.balances[providerId][signer.address] = { + balance: cachedBalance - realAmountUsd, + // valid for 5 seconds (since it takes some time to reflect balance on-chain) + validUntil: Date.now() + 5000, + }; + }); + } else { + realAmountUsd = parseFloat(receivedAmount); + realSharePrice = parseFloat(receivedAmount) / parseFloat(spentAmount); + + // Optimistically update balance + this.update((state) => { + state.balances[providerId] = state.balances[providerId] || {}; + state.balances[providerId][signer.address] = { + balance: cachedBalance + realAmountUsd, + // valid for 5 seconds (since it takes some time to reflect balance on-chain) + validUntil: Date.now() + 5000, + }; + }); + } + } catch (_e) { + // If we can't get real share price, continue without it + } + + // Track Predict Action Completed (fire and forget) + this.trackPredictOrderEvent({ + eventType: PredictEventType.COMPLETED, + amountUsd: realAmountUsd, + analyticsProperties, + providerId, + completionDuration, + sharePrice: realSharePrice, + }); + return result as unknown as Result; } catch (error) { const completionDuration = performance.now() - startTime; @@ -1229,6 +1217,7 @@ export class PredictController extends BaseController< ? error.message : PREDICT_ERROR_CODES.PLACE_ORDER_FAILED; + // Track Predict Action Failed (fire and forget) this.trackPredictOrderEvent({ eventType: PredictEventType.FAILED, amountUsd, diff --git a/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts b/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts index 09a49af9e848..90bd9a40df39 100644 --- a/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts +++ b/app/components/UI/Predict/providers/polymarket/PolymarketProvider.ts @@ -711,7 +711,10 @@ export class PolymarketProvider implements PredictProvider { if (error.includes(`order couldn't be fully filled`)) { throw new Error(PREDICT_ERROR_CODES.ORDER_NOT_FULLY_FILLED); } - if (error.includes(`not available in your region`)) { + if ( + error.includes(`not available in your region`) || + error.includes(`unable to access this provider`) + ) { throw new Error(PREDICT_ERROR_CODES.NOT_ELIGIBLE); } throw new Error(error ?? PREDICT_ERROR_CODES.PLACE_ORDER_FAILED);