diff --git a/dagger/purchasing.nim b/dagger/purchasing.nim index 5d45db6b..55b88626 100644 --- a/dagger/purchasing.nim +++ b/dagger/purchasing.nim @@ -13,15 +13,18 @@ type market: Market proofProbability*: UInt256 requestExpiryInterval*: UInt256 + offerExpiryMargin*: UInt256 Purchase* = ref object future: Future[void] market: Market + offerExpiryMargin: UInt256 request*: StorageRequest offers*: seq[StorageOffer] selected*: ?StorageOffer const DefaultProofProbability = 100.u256 const DefaultRequestExpiryInterval = (10 * 60).u256 +const DefaultOfferExpiryMargin = (8 * 60).u256 proc start(purchase: Purchase) {.gcsafe.} @@ -29,7 +32,8 @@ proc new*(_: type Purchasing, market: Market): Purchasing = Purchasing( market: market, proofProbability: DefaultProofProbability, - requestExpiryInterval: DefaultRequestExpiryInterval + requestExpiryInterval: DefaultRequestExpiryInterval, + offerExpiryMargin: DefaultOfferExpiryMargin ) proc populate*(purchasing: Purchasing, request: StorageRequest): StorageRequest = @@ -43,14 +47,18 @@ proc populate*(purchasing: Purchasing, request: StorageRequest): StorageRequest proc purchase*(purchasing: Purchasing, request: StorageRequest): Purchase = let request = purchasing.populate(request) - let purchase = Purchase(request: request, market: purchasing.market) + let purchase = Purchase( + request: request, + market: purchasing.market, + offerExpiryMargin: purchasing.offerExpiryMargin + ) purchase.start() purchase proc selectOffer(purchase: Purchase) {.async.} = var cheapest: ?StorageOffer for offer in purchase.offers: - without offer.expiry > getTime().toUnix().u256: + without getTime().toUnix().u256 < offer.expiry - purchase.offerExpiryMargin: continue without current =? cheapest: cheapest = some offer diff --git a/tests/dagger/testpurchasing.nim b/tests/dagger/testpurchasing.nim index 5569ba81..efbffa7b 100644 --- a/tests/dagger/testpurchasing.nim +++ b/tests/dagger/testpurchasing.nim @@ -98,3 +98,20 @@ suite "Purchasing": market.advanceTimeTo(request.expiry) await purchase.wait() check market.selected[0] == offer1.id + + test "has a default expiration margin for offers": + check purchasing.offerExpiryMargin != 0.u256 + + test "ignores offers that are about to expire": + let expiryMargin = purchasing.offerExpiryMargin + let purchase = purchasing.purchase(request) + let request = market.requested[0] + var offer1, offer2 = request.createOffer() + offer1.price = 20.u256 + offer2.price = 10.u256 + offer2.expiry = getTime().toUnix().u256 + expiryMargin - 1 + await market.offerStorage(offer1) + await market.offerStorage(offer2) + market.advanceTimeTo(request.expiry) + await purchase.wait() + check market.selected[0] == offer1.id