From 9a76c04d4525544710f4a32589e0380bb3a754b1 Mon Sep 17 00:00:00 2001 From: Mark Spanbroek Date: Wed, 20 Jul 2022 10:29:24 +0200 Subject: [PATCH] [marketplace] Emit RequestFulfilled when all slots are filled --- contracts/Marketplace.sol | 10 ++++++++++ test/Marketplace.test.js | 20 ++++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/contracts/Marketplace.sol b/contracts/Marketplace.sol index 8711998..51f8420 100644 --- a/contracts/Marketplace.sol +++ b/contracts/Marketplace.sol @@ -9,6 +9,7 @@ contract Marketplace is Collateral, Proofs { uint256 public immutable collateral; MarketplaceFunds private funds; mapping(bytes32 => Request) private requests; + mapping(bytes32 => RequestState) private requestState; mapping(bytes32 => Slot) private slots; constructor( @@ -65,8 +66,13 @@ contract Marketplace is Collateral, Proofs { _expectProofs(slotId, request.ask.proofProbability, request.ask.duration); _submitProof(slotId, proof); + RequestState storage state = requestState[requestId]; slot.host = msg.sender; + state.slotsFilled += 1; emit SlotFilled(requestId, slotIndex, slotId); + if (state.slotsFilled == request.content.erasure.totalNodes) { + emit RequestFulfilled(requestId); + } } function payoutSlot(bytes32 requestId, uint256 slotIndex) @@ -138,6 +144,10 @@ contract Marketplace is Collateral, Proofs { bytes name; // random name } + struct RequestState { + uint256 slotsFilled; + } + struct Slot { address host; bool hostPaid; diff --git a/test/Marketplace.test.js b/test/Marketplace.test.js index 91076cc..b595751 100644 --- a/test/Marketplace.test.js +++ b/test/Marketplace.test.js @@ -231,4 +231,24 @@ describe("Marketplace", function () { }) }) + describe("fulfilling a request", function () { + beforeEach(async function () { + switchAccount(client) + await token.approve(marketplace.address, request.ask.reward) + await marketplace.requestStorage(request) + switchAccount(host) + await token.approve(marketplace.address, collateral) + await marketplace.deposit(collateral) + }) + + it("emits event when all slots are filled", async function () { + const lastSlot = request.content.erasure.totalNodes - 1 + for (let i = 0; i < lastSlot; i++) { + await marketplace.fillSlot(slot.request, i, proof) + } + await expect(marketplace.fillSlot(slot.request, lastSlot, proof)) + .to.emit(marketplace, "RequestFulfilled") + .withArgs(requestId(request)) + }) + }) })