[marketplace] Unlock collateral when list of slots is empty
This commit is contained in:
parent
c46c268880
commit
a7be363f04
|
@ -4,7 +4,7 @@ pragma solidity ^0.8.0;
|
|||
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
|
||||
import "./AccountLocks.sol";
|
||||
|
||||
contract Collateral is AccountLocks {
|
||||
abstract contract Collateral is AccountLocks {
|
||||
IERC20 public immutable token;
|
||||
CollateralFunds private funds;
|
||||
|
||||
|
@ -39,8 +39,14 @@ contract Collateral is AccountLocks {
|
|||
add(msg.sender, amount);
|
||||
}
|
||||
|
||||
function withdraw() public collateralInvariant {
|
||||
// TODO: remove AccountLocks
|
||||
function isWithdrawAllowed() internal virtual returns (bool) {
|
||||
_unlockAccount();
|
||||
return true;
|
||||
}
|
||||
|
||||
function withdraw() public collateralInvariant {
|
||||
require(isWithdrawAllowed(), "Account locked");
|
||||
uint256 amount = balanceOf(msg.sender);
|
||||
funds.withdrawn += amount;
|
||||
subtract(msg.sender, amount);
|
||||
|
|
|
@ -50,6 +50,10 @@ contract Marketplace is Collateral, Proofs {
|
|||
return _toSlotIds(slotsPerHost[msg.sender].filter(isActive));
|
||||
}
|
||||
|
||||
function isWithdrawAllowed() internal view override returns (bool) {
|
||||
return slotsPerHost[msg.sender].length() == 0;
|
||||
}
|
||||
|
||||
function _equals(RequestId a, RequestId b) internal pure returns (bool) {
|
||||
return RequestId.unwrap(a) == RequestId.unwrap(b);
|
||||
}
|
||||
|
@ -178,7 +182,10 @@ contract Marketplace is Collateral, Proofs {
|
|||
private
|
||||
marketplaceInvariant
|
||||
{
|
||||
require(_isFinished(requestId), "Contract not ended");
|
||||
require(
|
||||
_isFinished(requestId) || _isCancelled(requestId),
|
||||
"Contract not ended"
|
||||
);
|
||||
RequestContext storage context = _context(requestId);
|
||||
Request storage request = _request(requestId);
|
||||
context.state = RequestState.Finished;
|
||||
|
|
|
@ -5,7 +5,7 @@ import "./Marketplace.sol";
|
|||
import "./Proofs.sol";
|
||||
import "./Collateral.sol";
|
||||
|
||||
contract Storage is Collateral, Marketplace {
|
||||
contract Storage is Marketplace {
|
||||
uint256 public collateralAmount;
|
||||
uint256 public slashMisses;
|
||||
uint256 public slashPercentage;
|
||||
|
|
|
@ -77,6 +77,7 @@ describe("Storage", function () {
|
|||
it("unlocks the host collateral", async function () {
|
||||
await storage.fillSlot(slot.request, slot.index, proof)
|
||||
await waitUntilFinished(storage, slot.request)
|
||||
await storage.freeSlot(slotId(slot))
|
||||
await expect(storage.withdraw()).not.to.be.reverted
|
||||
})
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue