[purchasing] Ignore offers that are about to expire

This commit is contained in:
Mark Spanbroek 2022-03-28 15:16:39 +02:00 committed by markspanbroek
parent dcfd6be1c6
commit 5b5f3335d6
2 changed files with 28 additions and 3 deletions

View File

@ -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

View File

@ -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