Skip to content
This repository has been archived by the owner on Jan 26, 2024. It is now read-only.

Commit

Permalink
liquidationInitialAsk Issue #99 (#121)
Browse files Browse the repository at this point in the history
* Added reverts for invalid liquidationInitialAsks

* Added testing for liquidationInitialAsk revert cases

* fixes and tests for adding liens against invalid stacks

* fix invalid rename

* getter to get opensea fee fees and payee data

* fix typo

* Fixed expectReverts for liquidationInitialAsk cases

Co-authored-by: Andrew Redden <=>
  • Loading branch information
0xgregthedev authored Nov 22, 2022
1 parent 0a02373 commit 8844343
Show file tree
Hide file tree
Showing 4 changed files with 96 additions and 2 deletions.
13 changes: 12 additions & 1 deletion src/LienToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -370,10 +370,21 @@ contract LienToken is ERC721, ILienToken, Auth {
) {
revert InvalidState(InvalidStates.COLLATERAL_AUCTION);
}

if (params.stack.length >= s.maxLiens) {
revert InvalidState(InvalidStates.MAX_LIENS);
}
if (
params.lien.details.liquidationInitialAsk < params.amount ||
params.lien.details.liquidationInitialAsk == 0
) {
revert InvalidState(InvalidStates.INVALID_LIQUIDATION_INITIAL_ASK);
}

if (params.stack.length > 0) {
if (params.lien.collateralId != params.stack[0].lien.collateralId) {
revert InvalidState(InvalidStates.COLLATERAL_MISMATCH);
}
}

if (params.stack.length > 0) {
if (params.lien.collateralId != params.stack[0].lien.collateralId) {
Expand Down
3 changes: 2 additions & 1 deletion src/interfaces/ILienToken.sol
Original file line number Diff line number Diff line change
Expand Up @@ -319,7 +319,8 @@ interface ILienToken is IERC721 {
LIEN_NO_DEBT,
EXPIRED_LIEN,
DEBT_LIMIT,
MAX_LIENS
MAX_LIENS,
INVALID_LIQUIDATION_INITIAL_ASK
}

error InvalidState(InvalidStates);
Expand Down
81 changes: 81 additions & 0 deletions src/test/RevertTesting.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -338,6 +338,87 @@ contract RevertTesting is TestHelpers {
isFirstLien: true
});
}
function testCannotLiquidationInitialAskExceedsAmountBorrowed() public {
TestNFT nft = new TestNFT(1);
address tokenContract = address(nft);
uint256 tokenId = uint256(0);

uint256 initialBalance = WETH9.balanceOf(address(this));

// create a PublicVault with a 14-day epoch
address publicVault = _createPublicVault({
strategist: strategistOne,
delegate: strategistTwo,
epochLength: 14 days
});

// lend 50 ether to the PublicVault as address(1)
_lendToVault(
Lender({addr: address(1), amountToLend: 50 ether}),
publicVault
);

ILienToken.Details memory standardLien = standardLienDetails;
standardLien.liquidationInitialAsk = 5 ether;
standardLien.maxAmount = 10 ether;

// borrow amount over liquidation initial ask
(, ILienToken.Stack[] memory stack) = _commitToLien({
vault: publicVault,
strategist: strategistOne,
strategistPK: strategistOnePK,
tokenContract: tokenContract,
tokenId: tokenId,
lienDetails: standardLien,
amount: 7.5 ether,
isFirstLien: true,
stack: new ILienToken.Stack[](0),
revertMessage: abi.encodeWithSelector(
ILienToken.InvalidState.selector,
ILienToken.InvalidStates.INVALID_LIQUIDATION_INITIAL_ASK
)
});
}
function testCannotLiquidationInitialAsk0() public {
TestNFT nft = new TestNFT(1);
address tokenContract = address(nft);
uint256 tokenId = uint256(0);

uint256 initialBalance = WETH9.balanceOf(address(this));

// create a PublicVault with a 14-day epoch
address publicVault = _createPublicVault({
strategist: strategistOne,
delegate: strategistTwo,
epochLength: 14 days
});

// lend 50 ether to the PublicVault as address(1)
_lendToVault(
Lender({addr: address(1), amountToLend: 50 ether}),
publicVault
);

ILienToken.Details memory zeroInitAsk = standardLienDetails;
zeroInitAsk.liquidationInitialAsk = 0;

// borrow 10 eth against the dummy NFT
(, ILienToken.Stack[] memory stack) = _commitToLien({
vault: publicVault,
strategist: strategistOne,
strategistPK: strategistOnePK,
tokenContract: tokenContract,
tokenId: tokenId,
lienDetails: zeroInitAsk,
amount: 10 ether,
isFirstLien: true,
stack: new ILienToken.Stack[](0),
revertMessage: abi.encodeWithSelector(
ILienToken.InvalidState.selector,
ILienToken.InvalidStates.INVALID_LIQUIDATION_INITIAL_ASK
)
});
}

function testFailPayLienAfterLiquidate() public {
TestNFT nft = new TestNFT(1);
Expand Down
1 change: 1 addition & 0 deletions src/test/TestHelpers.t.sol
Original file line number Diff line number Diff line change
Expand Up @@ -976,6 +976,7 @@ contract TestHelpers is ConsiderationTester {
WETH9.deposit{value: amount * 2}();
WETH9.approve(address(TRANSFER_PROXY), amount * 2);
WETH9.approve(address(LIEN_TOKEN), amount * 2);

newStack = LIEN_TOKEN.makePayment(
stack[position].lien.collateralId,
stack,
Expand Down

0 comments on commit 8844343

Please sign in to comment.