mirror of
https://github.com/codex-storage/nim-codex.git
synced 2025-01-24 19:59:51 +00:00
0c3fbad470
When a request for storage times out (not enough slots filled), the client will initiate a withdraw request to retrieve its funds out of the contract, setting the state of the request to RequestState.Cancelled. The client will also emit a RequestCancelled event for others to listen to (ie hosts will need to listen for this event to withdraw its collateral). Add unit test that checks for emission of RequestCancelled after request is purchased request expires. Update dagger-contracts dependency to commit that holds the changes supporting withdrawing of funds.
106 lines
4.0 KiB
Nim
106 lines
4.0 KiB
Nim
import pkg/ethers
|
|
import pkg/upraises
|
|
import pkg/questionable
|
|
import ../market
|
|
import ./storage
|
|
|
|
export market
|
|
|
|
type
|
|
OnChainMarket* = ref object of Market
|
|
contract: Storage
|
|
signer: Signer
|
|
MarketSubscription = market.Subscription
|
|
EventSubscription = ethers.Subscription
|
|
OnChainMarketSubscription = ref object of MarketSubscription
|
|
eventSubscription: EventSubscription
|
|
|
|
func new*(_: type OnChainMarket, contract: Storage): OnChainMarket =
|
|
without signer =? contract.signer:
|
|
raiseAssert("Storage contract should have a signer")
|
|
OnChainMarket(
|
|
contract: contract,
|
|
signer: signer,
|
|
)
|
|
|
|
method getSigner*(market: OnChainMarket): Future[Address] {.async.} =
|
|
return await market.signer.getAddress()
|
|
|
|
method requestStorage(market: OnChainMarket,
|
|
request: StorageRequest):
|
|
Future[StorageRequest] {.async.} =
|
|
var request = request
|
|
request.client = await market.signer.getAddress()
|
|
await market.contract.requestStorage(request)
|
|
return request
|
|
|
|
method getRequest(market: OnChainMarket,
|
|
id: RequestId): Future[?StorageRequest] {.async.} =
|
|
let request = await market.contract.getRequest(id)
|
|
if request != StorageRequest.default:
|
|
return some request
|
|
else:
|
|
return none StorageRequest
|
|
|
|
method getHost(market: OnChainMarket,
|
|
requestId: RequestId,
|
|
slotIndex: UInt256): Future[?Address] {.async.} =
|
|
let slotId = slotId(requestId, slotIndex)
|
|
let address = await market.contract.getHost(slotId)
|
|
if address != Address.default:
|
|
return some address
|
|
else:
|
|
return none Address
|
|
|
|
method fillSlot(market: OnChainMarket,
|
|
requestId: RequestId,
|
|
slotIndex: UInt256,
|
|
proof: seq[byte]) {.async.} =
|
|
await market.contract.fillSlot(requestId, slotIndex, proof)
|
|
|
|
method withdrawFunds(market: OnChainMarket,
|
|
requestId: array[32, byte]) {.async.} =
|
|
await market.contract.withdrawFunds(requestId)
|
|
|
|
method subscribeRequests(market: OnChainMarket,
|
|
callback: OnRequest):
|
|
Future[MarketSubscription] {.async.} =
|
|
proc onEvent(event: StorageRequested) {.upraises:[].} =
|
|
callback(event.requestId, event.ask)
|
|
let subscription = await market.contract.subscribe(StorageRequested, onEvent)
|
|
return OnChainMarketSubscription(eventSubscription: subscription)
|
|
|
|
method subscribeSlotFilled*(market: OnChainMarket,
|
|
requestId: RequestId,
|
|
slotIndex: UInt256,
|
|
callback: OnSlotFilled):
|
|
Future[MarketSubscription] {.async.} =
|
|
proc onEvent(event: SlotFilled) {.upraises:[].} =
|
|
if event.requestId == requestId and event.slotIndex == slotIndex:
|
|
callback(event.requestId, event.slotIndex)
|
|
let subscription = await market.contract.subscribe(SlotFilled, onEvent)
|
|
return OnChainMarketSubscription(eventSubscription: subscription)
|
|
|
|
method subscribeFulfillment(market: OnChainMarket,
|
|
requestId: RequestId,
|
|
callback: OnFulfillment):
|
|
Future[MarketSubscription] {.async.} =
|
|
proc onEvent(event: RequestFulfilled) {.upraises:[].} =
|
|
if event.requestId == requestId:
|
|
callback(event.requestId)
|
|
let subscription = await market.contract.subscribe(RequestFulfilled, onEvent)
|
|
return OnChainMarketSubscription(eventSubscription: subscription)
|
|
|
|
method subscribeRequestCancelled*(market: OnChainMarket,
|
|
requestId: array[32, byte],
|
|
callback: OnRequestCancelled):
|
|
Future[MarketSubscription] {.async.} =
|
|
proc onEvent(event: RequestCancelled) {.upraises:[].} =
|
|
if event.requestId == requestId:
|
|
callback(event.requestId)
|
|
let subscription = await market.contract.subscribe(RequestCancelled, onEvent)
|
|
return OnChainMarketSubscription(eventSubscription: subscription)
|
|
|
|
method unsubscribe*(subscription: OnChainMarketSubscription) {.async.} =
|
|
await subscription.eventSubscription.unsubscribe()
|