From 03140fdf49af25d38b1cdcd962ee34b3d9b3803f Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Thu, 24 Mar 2022 14:22:45 +0100 Subject: [PATCH] [purchasing] Add state to track purchase progress --- dagger/market.nim | 2 ++ dagger/purchasing.nim | 37 ++++++++++++++++++++++++++++--------- 2 files changed, 30 insertions(+), 9 deletions(-) diff --git a/dagger/market.nim b/dagger/market.nim index 9983db79..0bd715c4 100644 --- a/dagger/market.nim +++ b/dagger/market.nim @@ -1,8 +1,10 @@ import pkg/chronos import ./contracts/requests +import ./contracts/offers export chronos export requests +export offers type Market* = ref object of RootObj diff --git a/dagger/purchasing.nim b/dagger/purchasing.nim index c8f5cd15..6ecfbe02 100644 --- a/dagger/purchasing.nim +++ b/dagger/purchasing.nim @@ -14,10 +14,17 @@ type proofProbability*: UInt256 requestExpiryInterval*: UInt256 Purchase* = ref object + future: Future[void] + market: Market + request*: StorageRequest + offers*: seq[StorageOffer] + selected*: ?StorageOffer const DefaultProofProbability = 100.u256 const DefaultRequestExpiryInterval = (10 * 60).u256 +proc start(purchase: Purchase) {.gcsafe.} + proc new*(_: type Purchasing, market: Market): Purchasing = Purchasing( market: market, @@ -25,15 +32,27 @@ proc new*(_: type Purchasing, market: Market): Purchasing = requestExpiryInterval: DefaultRequestExpiryInterval ) +proc populate*(purchasing: Purchasing, request: StorageRequest): StorageRequest = + result = request + if result.proofProbability == 0.u256: + result.proofProbability = purchasing.proofProbability + if result.expiry == 0.u256: + result.expiry = (getTime().toUnix().u256 + purchasing.requestExpiryInterval) + if result.nonce == array[32, byte].default: + doAssert randomBytes(result.nonce) == 32 + proc purchase*(purchasing: Purchasing, request: StorageRequest): Purchase = - var request = request - if request.proofProbability == 0.u256: - request.proofProbability = purchasing.proofProbability - if request.expiry == 0.u256: - request.expiry = (getTime().toUnix().u256 + purchasing.requestExpiryInterval) - if request.nonce == array[32, byte].default: - doAssert randomBytes(request.nonce) == 32 - asyncSpawn purchasing.market.requestStorage(request) + let request = purchasing.populate(request) + let purchase = Purchase(request: request, market: purchasing.market) + purchase.start() + purchase + +proc run(purchase: Purchase) {.async.} = + await purchase.market.requestStorage(purchase.request) + +proc start(purchase: Purchase) = + purchase.future = purchase.run() + asyncSpawn purchase.future proc wait*(purchase: Purchase) {.async.} = - discard + await purchase.future