Unlock host stake at end of contract

This commit is contained in:
Mark Spanbroek 2021-11-04 10:19:23 +01:00
parent d0a22afc3d
commit aa673ff71c
3 changed files with 29 additions and 4 deletions

View File

@ -54,6 +54,11 @@ contract Storage is Contracts, Proofs, Stakes {
_expectProofs(id, proofPeriod(id), proofTimeout(id), duration(id)); _expectProofs(id, proofPeriod(id), proofTimeout(id), duration(id));
} }
function finishContract(bytes32 id) public {
require(block.number > proofEnd(id), "Contract has not ended yet");
_unlockStake(host(id));
}
function duration(bytes32 contractId) public view returns (uint) { function duration(bytes32 contractId) public view returns (uint) {
return _duration(contractId); return _duration(contractId);
} }

View File

@ -2,6 +2,7 @@ const { expect } = require("chai")
const { ethers } = require("hardhat") const { ethers } = require("hardhat")
const { hashRequest, hashBid, sign } = require("./marketplace") const { hashRequest, hashBid, sign } = require("./marketplace")
const { exampleRequest, exampleBid } = require("./examples") const { exampleRequest, exampleBid } = require("./examples")
const { mineBlock, minedBlockNumber } = require ("./mining")
describe("Storage", function () { describe("Storage", function () {
@ -74,6 +75,28 @@ describe("Storage", function () {
).to.be.revertedWith("Only host can call this function") ).to.be.revertedWith("Only host can call this function")
}) })
}) })
describe("finishing the contract", function () {
beforeEach(async function () {
await storage.connect(host).startContract(id)
})
it("unlocks the host stake", async function () {
const end = await storage.proofEnd(id)
while (await minedBlockNumber() < end) {
await mineBlock()
}
await storage.finishContract(id)
await expect(storage.connect(host).withdrawStake()).not.to.be.reverted
})
it("is only allowed when end time has passed", async function () {
await expect(
storage.finishContract(id)
).to.be.revertedWith("Contract has not ended yet")
})
})
}) })
it("doesn't create contract with insufficient stake", async function () { it("doesn't create contract with insufficient stake", async function () {
@ -97,11 +120,8 @@ describe("Storage", function () {
}) })
}) })
// TODO: unlock stake at end of contract
// TODO: payment when new contract // TODO: payment when new contract
// TODO: contract start and timeout // TODO: contract start and timeout
// TODO: failure to start contract burns host and client // TODO: failure to start contract burns host and client
// TODO: implement checking of actual proofs of storage, instead of dummy bool // TODO: implement checking of actual proofs of storage, instead of dummy bool
// TODO: only allow proofs after start of contract
// TODO: proofs no longer required after contract duration
// TODO: payout // TODO: payout

View File

@ -1,7 +1,7 @@
const { ethers } = require("hardhat") const { ethers } = require("hardhat")
const exampleRequest = () => ({ const exampleRequest = () => ({
duration: 200000, // 200,000 blocks ≈ 1 month duration: 150, // 150 blocks ≈ half an hour
size: 1 * 1024 * 1024 * 1024, // 1 Gigabyte size: 1 * 1024 * 1024 * 1024, // 1 Gigabyte
contentHash: ethers.utils.sha256("0xdeadbeef"), contentHash: ethers.utils.sha256("0xdeadbeef"),
proofPeriod: 8, // 8 blocks ≈ 2 minutes proofPeriod: 8, // 8 blocks ≈ 2 minutes