@@ -110,6 +110,20 @@ export const createTokenId = (
110110 }
111111}
112112
113+ // Ignore requests with a future time with an allowance for clients that are close enough
114+ const isFutureTime = ( {
115+ rateDate,
116+ rightNow,
117+ fuzzFactor = 0
118+ } : {
119+ rateDate : Date
120+ rightNow : Date
121+ fuzzFactor ?: number
122+ } ) : boolean => {
123+ const fuzzyFutureThreshold = new Date ( rightNow . getTime ( ) + fuzzFactor )
124+ return rateDate > fuzzyFutureThreshold
125+ }
126+
113127// These functions reduce requested rates into buckets based on the date that
114128// the providers can handle efficiently. The rates returned by the providers
115129// can then be rematched with the requested rates
@@ -121,6 +135,16 @@ export const reduceRequestedCryptoRates = (
121135 const buckets : DateBuckets = new Map ( )
122136
123137 requestedRates . forEach ( rate => {
138+ if (
139+ isFutureTime ( {
140+ rateDate : rate . isoDate ,
141+ rightNow,
142+ fuzzFactor : ONE_MINUTE
143+ } )
144+ ) {
145+ return
146+ }
147+
124148 const rateTime = rate . isoDate . getTime ( )
125149
126150 // Current rates (< five minutes old) use minute precision and historical rates use five minutes
@@ -193,11 +217,22 @@ export const expandReturnedCryptoRates = (
193217}
194218
195219export const reduceRequestedFiatRates = (
196- requestedRates : FiatRateMap
220+ requestedRates : FiatRateMap ,
221+ rightNow : Date
197222) : DateBuckets => {
198223 const buckets : DateBuckets = new Map ( )
199224
200225 requestedRates . forEach ( rate => {
226+ if (
227+ isFutureTime ( {
228+ rateDate : rate . isoDate ,
229+ rightNow,
230+ fuzzFactor : ONE_MINUTE
231+ } )
232+ ) {
233+ return
234+ }
235+
201236 const rateTime = rate . isoDate . getTime ( )
202237
203238 // Floor to the start of the interval bucket
@@ -243,14 +278,24 @@ export const expandReturnedFiatRates = (
243278// This function breaks apart the requested rates into buckets of the given interval.
244279type UpdateBuckets = Map < string , Record < string , number > >
245280export const groupCryptoRatesByTime = (
246- requestedRates : CryptoRateMap
281+ requestedRates : CryptoRateMap ,
282+ rightNow : Date
247283) : UpdateBuckets => {
248284 const buckets : UpdateBuckets = new Map ( )
249285 const rightNowMs = new Date ( ) . getTime ( )
250286
251287 requestedRates . forEach ( cryptoRate => {
252288 if ( cryptoRate . rate == null ) return
253289
290+ if (
291+ isFutureTime ( {
292+ rateDate : cryptoRate . isoDate ,
293+ rightNow
294+ } )
295+ ) {
296+ return
297+ }
298+
254299 const rateTime = cryptoRate . isoDate . getTime ( )
255300
256301 // Current rates (< five minutes old) use minute precision and historical rates use five minutes
@@ -269,13 +314,23 @@ export const groupCryptoRatesByTime = (
269314}
270315
271316export const groupFiatRatesByTime = (
272- requestedRates : FiatRateMap
317+ requestedRates : FiatRateMap ,
318+ rightNow : Date
273319) : UpdateBuckets => {
274320 const buckets : UpdateBuckets = new Map ( )
275321
276322 requestedRates . forEach ( fiatRate => {
277323 if ( fiatRate . rate == null ) return
278324
325+ if (
326+ isFutureTime ( {
327+ rateDate : fiatRate . isoDate ,
328+ rightNow
329+ } )
330+ ) {
331+ return
332+ }
333+
279334 const rateTime = fiatRate . isoDate . getTime ( )
280335
281336 // Floor to the start of the interval bucket
0 commit comments