Skip to content

Commit

Permalink
feat/V1 hook updates (#44)
Browse files Browse the repository at this point in the history
* update getAuctionStart to be a public helper, make an internal version that is more optimized(less calls/decoding), add tests

* coverage testing for AstariaV1Settlement handler complete

* coverage testing for AstariaV1Settlement handler complete

* fix test name

* Astaria V1 Hook testing complete(-withdraw), Conduit Helper Removed, ConduitTransfer => AdditionalTransfer

* remove commented code

* final comment removal

* additional tests for v1 hook as well as some cleanup/fixes

* update snaphot
  • Loading branch information
androolloyd authored and 0xgregthedev committed Nov 2, 2023
1 parent 6444d59 commit 97e6932
Show file tree
Hide file tree
Showing 7 changed files with 283 additions and 100 deletions.
159 changes: 85 additions & 74 deletions .gas-snapshot
Original file line number Diff line number Diff line change
@@ -1,9 +1,30 @@
DiffFuzzTestStarPortLib:testSpentToReceived((uint8,address,uint256,uint256)[]) (runs: 256, μ: 880529, ~: 882914)
DiffFuzzTestStarPortLib:testSpentToReceived((uint8,address,uint256,uint256)[]) (runs: 256, μ: 880433, ~: 883031)
DiffFuzzTestStarPortLib:testUnboundSpentToReceived((uint8,address,uint256,uint256)[]) (runs: 256, μ: 232899, ~: 237832)
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallBase() (gas: 1011545)
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLender() (gas: 693342)
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLiquidation() (gas: 746648)
TestBorrowerEnforcer:testBERevertAdditionalTransfers() (gas: 73101)
TestAstariaV1Handler:testGetAuctionStart() (gas: 425169)
TestAstariaV1Handler:testGetAuctionStartNotStarted() (gas: 424764)
TestAstariaV1Handler:testGetCurrentAuctionPrice() (gas: 440046)
TestAstariaV1Handler:testGetCurrentAuctionPriceNoAuction() (gas: 428373)
TestAstariaV1Handler:testGetSettlementDutchAuctionSettlementAbove() (gas: 482578)
TestAstariaV1Handler:testGetSettlementFailedDutchAuction() (gas: 440369)
TestAstariaV1Handler:testGetSettlementLoanNotRecalled() (gas: 430871)
TestAstariaV1Handler:testV1SettlementHandlerExecute() (gas: 411378)
TestAstariaV1Handler:testV1SettlementHandlerValidate() (gas: 411490)
TestAstariaV1Handler:testV1SettlementHandlerValidateInvalidHandler() (gas: 411614)
TestAstariaV1Hook:testCannotRecallTwice() (gas: 567550)
TestAstariaV1Hook:testCannotWithdrawLoanHasNotBeenRefinanced() (gas: 417239)
TestAstariaV1Hook:testCannotWithdrawWithdrawDoesNotExist() (gas: 423656)
TestAstariaV1Hook:testGenerateRecallConsideration() (gas: 466708)
TestAstariaV1Hook:testInvalidRecallInvalidStakeType() (gas: 483833)
TestAstariaV1Hook:testInvalidRecallLoanDoesNotExist() (gas: 513060)
TestAstariaV1Hook:testIsActive() (gas: 424376)
TestAstariaV1Hook:testIsRecalledInsideWindow() (gas: 560673)
TestAstariaV1Hook:testIsRecalledOutsideWindow() (gas: 558574)
TestAstariaV1Hook:testRecallRateActiveRecall() (gas: 546234)
TestAstariaV1Hook:testRecallRateEmptyRecall() (gas: 421919)
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallBase() (gas: 1007784)
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLender() (gas: 717605)
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLiquidation() (gas: 742743)
TestBorrowerEnforcer:testBERevertAdditionalTransfers() (gas: 73128)
TestBorrowerEnforcer:testBERevertInvalidLoanTerms() (gas: 78338)
TestBorrowerEnforcer:testBEValidLoanTerms() (gas: 69429)
TestBorrowerEnforcer:testBEValidLoanTermsAnyIssuer() (gas: 69581)
Expand All @@ -12,107 +33,100 @@ TestCustodian:testCannotMintInvalidLoanInvalidCustodian() (gas: 66861)
TestCustodian:testCannotMintInvalidLoanValidCustodian() (gas: 72501)
TestCustodian:testCustodySelector() (gas: 2625664)
TestCustodian:testDefaultCustodySelectorRevert() (gas: 70083)
TestCustodian:testGenerateOrderInvalidHandlerExecution() (gas: 132842)
TestCustodian:testGenerateOrderRepay() (gas: 173845)
TestCustodian:testGenerateOrderRepayAsRepayApprovedBorrower() (gas: 199470)
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNative() (gas: 864690)
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNativeHandlerAuthorized() (gas: 789937)
TestCustodian:testGenerateOrderRepayERC1155WithRevert() (gas: 529819)
TestCustodian:testGenerateOrderRepayInvalidHookAddress() (gas: 90336)
TestCustodian:testGenerateOrderRepayInvalidHookReturnType() (gas: 84653)
TestCustodian:testGenerateOrderRepayNotBorrower() (gas: 96427)
TestCustodian:testGenerateOrderSettlement() (gas: 151465)
TestCustodian:testGenerateOrderSettlementHandlerAuthorized() (gas: 160461)
TestCustodian:testGenerateOrderSettlementNoActiveLoan() (gas: 155682)
TestCustodian:testGenerateOrderSettlementUnauthorized() (gas: 94206)
TestCustodian:testGenerateOrderInvalidHandlerExecution() (gas: 132813)
TestCustodian:testGenerateOrderRepay() (gas: 173924)
TestCustodian:testGenerateOrderRepayAsRepayApprovedBorrower() (gas: 199549)
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNative() (gas: 865388)
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNativeHandlerAuthorized() (gas: 790527)
TestCustodian:testGenerateOrderRepayERC1155WithRevert() (gas: 530139)
TestCustodian:testGenerateOrderRepayInvalidHookAddress() (gas: 90307)
TestCustodian:testGenerateOrderRepayInvalidHookReturnType() (gas: 84624)
TestCustodian:testGenerateOrderRepayNotBorrower() (gas: 96398)
TestCustodian:testGenerateOrderSettlement() (gas: 151490)
TestCustodian:testGenerateOrderSettlementHandlerAuthorized() (gas: 160486)
TestCustodian:testGenerateOrderSettlementNoActiveLoan() (gas: 155707)
TestCustodian:testGenerateOrderSettlementUnauthorized() (gas: 94177)
TestCustodian:testGetBorrower() (gas: 76322)
TestCustodian:testInvalidAction() (gas: 114479)
TestCustodian:testInvalidActionRepayInActiveLoan() (gas: 117428)
TestCustodian:testInvalidActionSettleActiveLoan() (gas: 117388)
TestCustodian:testInvalidAction() (gas: 114421)
TestCustodian:testInvalidActionRepayInActiveLoan() (gas: 117370)
TestCustodian:testInvalidActionSettleActiveLoan() (gas: 117330)
TestCustodian:testName() (gas: 7098)
TestCustodian:testNonPayableFunctions() (gas: 225770)
TestCustodian:testOnlySeaport() (gas: 17895)
TestCustodian:testPayableFunctions() (gas: 41667)
TestCustodian:testPreviewOrderNoActiveLoan() (gas: 98766)
TestCustodian:testPreviewOrderRepay() (gas: 225774)
TestCustodian:testPreviewOrderSettlement() (gas: 182835)
TestCustodian:testPreviewOrderSettlementInvalidFufliller() (gas: 100684)
TestCustodian:testPreviewOrderSettlementInvalidRepayer() (gas: 106814)
TestCustodian:testRatifyOrder() (gas: 180014)
TestCustodian:testPreviewOrderNoActiveLoan() (gas: 98737)
TestCustodian:testPreviewOrderRepay() (gas: 225878)
TestCustodian:testPreviewOrderSettlement() (gas: 182831)
TestCustodian:testPreviewOrderSettlementInvalidFufliller() (gas: 100655)
TestCustodian:testPreviewOrderSettlementInvalidRepayer() (gas: 106785)
TestCustodian:testRatifyOrder() (gas: 180093)
TestCustodian:testSeaportMetadata() (gas: 8545)
TestCustodian:testSetRepayApproval() (gas: 37861)
TestCustodian:testSupportsInterface() (gas: 9428)
TestCustodian:testSymbol() (gas: 7127)
TestCustodian:testTokenURI() (gas: 64817)
TestCustodian:testTokenURIInvalidLoan() (gas: 13196)
TestLenderEnforcer:testLERevertAdditionalTransfersFromLender() (gas: 73738)
TestLenderEnforcer:testLERevertAdditionalTransfersFromLender() (gas: 73765)
TestLenderEnforcer:testLERevertInvalidLoanTerms() (gas: 78363)
TestLenderEnforcer:testLEValidLoanTerms() (gas: 69496)
TestLenderEnforcer:testLEValidLoanTermsAnyBorrower() (gas: 69494)
TestLenderEnforcer:testLEValidLoanTermsWithAdditionalTransfers() (gas: 70735)
TestLoanCombinations:testLoan20For721SimpleInterestDutchFixedRepay() (gas: 552683)
TestLoanCombinations:testLoan20for20SimpleInterestDutchFixedRepay() (gas: 540288)
TestLoanCombinations:testLoan721for20SimpleInterestDutchFixedRepay() (gas: 570519)
TestLoanCombinations:testLoanAstariaSettlementRepay() (gas: 560249)
TestLoanCombinations:testLoanSimpleInterestEnglishFixed() (gas: 565723)
TestLenderEnforcer:testLEValidLoanTermsWithAdditionalTransfers() (gas: 70762)
TestLoanCombinations:testLoan20For721SimpleInterestDutchFixedRepay() (gas: 553060)
TestLoanCombinations:testLoan20for20SimpleInterestDutchFixedRepay() (gas: 540665)
TestLoanCombinations:testLoan721for20SimpleInterestDutchFixedRepay() (gas: 570896)
TestLoanCombinations:testLoanAstariaSettlementRepay() (gas: 560626)
TestLoanCombinations:testLoanSimpleInterestEnglishFixed() (gas: 566100)
TestLoanManager:testActive() (gas: 67135)
TestLoanManager:testAdditionalTransfers() (gas: 293184)
TestLoanManager:testCannotIssueSameLoanTwice() (gas: 331467)
TestLoanManager:testAdditionalTransfers() (gas: 293454)
TestLoanManager:testCannotIssueSameLoanTwice() (gas: 331845)
TestLoanManager:testCannotOriginateWhilePaused() (gas: 87814)
TestLoanManager:testCannotSettleInvalidLoan() (gas: 72691)
TestLoanManager:testCannotSettleInvalidLoan() (gas: 72745)
TestLoanManager:testCannotSettleUnlessValidCustodian() (gas: 68772)
TestLoanManager:testCaveatEnforcerRevert() (gas: 119189)
TestLoanManager:testDefaultFeeRake() (gas: 352643)
TestLoanManager:testExoticDebtWithNoCaveatsNotAsBorrower() (gas: 342836)
TestLoanManager:testDefaultFeeRake() (gas: 352859)
TestLoanManager:testExoticDebtWithNoCaveatsNotAsBorrower() (gas: 343160)
TestLoanManager:testInitializedFlagSetProperly() (gas: 65234)
TestLoanManager:testInvalidAmountCollateral() (gas: 152867)
TestLoanManager:testInvalidAmountCollateral721() (gas: 153010)
TestLoanManager:testInvalidAmountDebt() (gas: 177200)
TestLoanManager:testInvalidIdentifierDebt() (gas: 197194)
TestLoanManager:testInvalidItemType() (gas: 138915)
TestLoanManager:testInvalidTransferLengthCollateral() (gas: 161106)
TestLoanManager:testInvalidTransferLengthDebt() (gas: 165627)
TestLoanManager:testInvalidAmountCollateral() (gas: 152921)
TestLoanManager:testInvalidAmountCollateral721() (gas: 153064)
TestLoanManager:testInvalidAmountDebt() (gas: 177254)
TestLoanManager:testInvalidIdentifierDebt() (gas: 197248)
TestLoanManager:testInvalidItemType() (gas: 138969)
TestLoanManager:testInvalidTransferLengthCollateral() (gas: 161133)
TestLoanManager:testInvalidTransferLengthDebt() (gas: 165654)
TestLoanManager:testIssued() (gas: 67084)
TestLoanManager:testName() (gas: 7251)
TestLoanManager:testNonDefaultCustodianCustodyCallFails() (gas: 190254)
TestLoanManager:testNonDefaultCustodianCustodyCallSuccess() (gas: 258571)
TestLoanManager:testNonDefaultCustodianCustodyCallFails() (gas: 190362)
TestLoanManager:testNonDefaultCustodianCustodyCallSuccess() (gas: 258841)
TestLoanManager:testNonPayableFunctions() (gas: 175599)
TestLoanManager:testOverrideFeeRake() (gas: 346404)
TestLoanManager:testOverrideFeeRake() (gas: 346620)
TestLoanManager:testPause() (gas: 34091)
TestLoanManager:testSupportsInterface() (gas: 9181)
TestLoanManager:testSymbol() (gas: 7235)
TestLoanManager:testTokenNoCodeCollateral() (gas: 137687)
TestLoanManager:testTokenNoCodeDebt() (gas: 170831)
TestLoanManager:testTokenNoCodeCollateral() (gas: 137741)
TestLoanManager:testTokenNoCodeDebt() (gas: 170885)
TestLoanManager:testTokenURI() (gas: 64945)
TestLoanManager:testTokenURIInvalidLoan() (gas: 13384)
TestLoanManager:testTransferFromFail() (gas: 80088)
TestLoanManager:testUnPause() (gas: 14291)
TestNewLoan:testBuyNowPayLater() (gas: 2831787)
TestNewLoan:testNewLoanERC721CollateralDefaultTerms2() (gas: 391958)
TestNewLoan:testBuyNowPayLater() (gas: 2830344)
TestNewLoan:testNewLoanERC721CollateralDefaultTerms2() (gas: 392228)
TestNewLoan:testNewLoanERC721CollateralLessDebtThanOffered() (gas: 2348)
TestNewLoan:testNewLoanRefinanceNew() (gas: 185)
TestNewLoan:testNewLoanViaOriginatorBorrowerApprovalAndLenderApproval() (gas: 299404)
TestNewLoan:testNewLoanViaOriginatorLenderApproval() (gas: 354020)
TestNewLoan:testNewLoanViaOriginatorBorrowerApprovalAndLenderApproval() (gas: 299558)
TestNewLoan:testNewLoanViaOriginatorLenderApproval() (gas: 354228)
TestNewLoan:testSettleLoan() (gas: 252)
TestRefStarPortLib:testSpentToReceived() (gas: 13315)
TestRefStarPortLib:testValidateSalt(address,bytes32) (runs: 256, μ: 33865, ~: 33865)
TestRepayLoan:testRepayLoanApprovedRepayer() (gas: 643615)
TestRepayLoan:testRepayLoanBase() (gas: 580019)
TestRepayLoan:testRepayLoanGenerateOrderNotSeaport() (gas: 399854)
TestRepayLoan:testRepayLoanInSettlement() (gas: 540930)
TestRepayLoan:testRepayLoanInvalidRepayer() (gas: 560285)
TestRepayLoan:testRepayLoanThatDoesNotExist() (gas: 848820)
TestRepayLoan:testRepayLoanApprovedRepayer() (gas: 643968)
TestRepayLoan:testRepayLoanBase() (gas: 580372)
TestRepayLoan:testRepayLoanGenerateOrderNotSeaport() (gas: 400095)
TestRepayLoan:testRepayLoanInSettlement() (gas: 541092)
TestRepayLoan:testRepayLoanInvalidRepayer() (gas: 560501)
TestRepayLoan:testRepayLoanThatDoesNotExist() (gas: 849335)
TestStarPortLib:testSpentToReceived() (gas: 13315)
TestStarPortLib:testValidateSalt(address,bytes32) (runs: 256, μ: 33865, ~: 33865)
TestStrategistOriginator:testEncodeWithAccountCounter() (gas: 12307)
TestStrategistOriginator:testGetAuctionStart() (gas: 424899)
TestStrategistOriginator:testGetAuctionStartNotStarted() (gas: 424491)
TestStrategistOriginator:testGetCurrentAuctionPrice() (gas: 439776)
TestStrategistOriginator:testGetCurrentAuctionPriceNoAuction() (gas: 428100)
TestStrategistOriginator:testGetSettlementDutchAuctionSettlementAbove() (gas: 482308)
TestStrategistOriginator:testGetSettlementFailedDutchAuction() (gas: 440099)
TestStrategistOriginator:testGetSettlementLoanNotRecalled() (gas: 430598)
TestStrategistOriginator:testGetStrategistData() (gas: 1473217)
TestStrategistOriginator:testGetStrategistData() (gas: 1471010)
TestStrategistOriginator:testIncrementCounterAsStrategist() (gas: 18654)
TestStrategistOriginator:testIncrementCounterNotAuthorized() (gas: 13445)
TestStrategistOriginator:testInvalidCollateral() (gas: 204438)
Expand All @@ -122,9 +136,6 @@ TestStrategistOriginator:testInvalidDebtAmountAskingMoreThanOffered() (gas: 2065
TestStrategistOriginator:testInvalidDebtAmountOfferingZero() (gas: 186947)
TestStrategistOriginator:testInvalidDebtAmountRequestingZero() (gas: 206823)
TestStrategistOriginator:testInvalidDebtLength() (gas: 205450)
TestStrategistOriginator:testInvalidOffer() (gas: 396393)
TestStrategistOriginator:testInvalidOffer() (gas: 396601)
TestStrategistOriginator:testInvalidSigner() (gas: 208683)
TestStrategistOriginator:testSetStrategist() (gas: 17796)
TestStrategistOriginator:testV1SettlementHandlerExecute() (gas: 411108)
TestStrategistOriginator:testV1SettlementHandlerValidate() (gas: 411220)
TestStrategistOriginator:testV1SettlementHandlerValidateInvalidHandler() (gas: 411344)
TestStrategistOriginator:testSetStrategist() (gas: 17796)
57 changes: 57 additions & 0 deletions mermaid/origination.mmd
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
sequenceDiagram
title Starport Origination Sequence Diagram
participant F as Fulfiller
participant L as Lender
participant B as Borrower


F->>LoanManager: originate

opt F is not Borrower
loop 1->n
LoanManager->>CaveatEnforcer: validate
end
end
opt F is not Lender
loop 1->n
LoanManager->>CaveatEnforcer: validate
end
end
loop Transfer 1->n collateral items
B->>Custodian: Move Collateral to Custodian
end
opt Custodian is not default
LoanManager->>Custodian: custody (optional)
end

alt Fees Disabled
loop Transfer 1->n debt items
L->>B: Move debt to borrower
end
else Fees Enabled
LoanManager->>LoanManager: compute feeRake
opt FeeItems length > 0
loop Transfer 1->n fee items
L->>FeeRecipient: Move Fee to FeeRecipient
end
end
loop Transfer 1->n debt items
L->>B: Move debt to Borrower
end
end

opt AdditionalTransferItems length > 0
loop 1->n
alt From is Borrower
B->>AdditionalTransferRecipient: AdditionalTransferItem from Borrower => AdditionalTransferRecipient
else From is Lender
L->>AdditionalTransferRecipient: AdditionalTransferItem from Lender => AdditionalTransferRecipient
else From is F
F->>AdditionalTransferRecipient: AdditionalTransferItem from Fulfiller => AdditionalTransferRecipient
end
end
end

opt Lender is contract
LoanManager->>L: onERC721Received
end
1 change: 1 addition & 0 deletions mermaid/origination.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@
"name": "starlite",
"dependencies": {
"@chainlink/contracts": "^0.6.1",
"@mermaid-js/mermaid-cli": "^10.6.0",
"chai": "^4.3.7",
"global": "^4.4.0",
"husky": "^8.0.3",
"mocha": "^10.2.0",
"prettier": "^2.8.8",
Expand Down
29 changes: 15 additions & 14 deletions src/hooks/BaseRecall.sol
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ abstract contract BaseRecall {
error LoanHasNotBeenRefinanced();
error WithdrawDoesNotExist();
error InvalidItemType();
error RecallAlreadyExists();

mapping(uint256 => Recall) public recalls;

Expand Down Expand Up @@ -99,26 +100,22 @@ abstract contract BaseRecall {
}

if (loan.issuer != msg.sender && loan.borrower != msg.sender) {
// (,, address conduitController) = LM.seaport().information();
// validate that the provided conduit is owned by the msg.sender
// if (ConduitControllerInterface(conduitController).ownerOf(conduit) != msg.sender) {
// revert InvalidConduit();
// }
AdditionalTransfer[] memory recallConsideration = _generateRecallConsideration(
loan, 0, details.recallStakeDuration, 1e18, msg.sender, payable(address(this))
);
StarPortLib.transferAdditionalTransfers(recallConsideration);
}
// get conduitController

bytes memory encodedLoan = abi.encode(loan);

uint256 loanId = uint256(keccak256(encodedLoan));
uint256 loanId = loan.getId();

if (!LM.active(loanId)) revert LoanDoesNotExist();
if (!LM.active(loanId)) {
revert LoanDoesNotExist();
}

if (recalls[loanId].start > 0) {
revert RecallAlreadyExists();
}
recalls[loanId] = Recall(payable(msg.sender), uint64(block.timestamp));
emit Recalled(loanId, msg.sender, loan.start + details.recallWindow);
emit Recalled(loanId, msg.sender, block.timestamp + details.recallWindow);
}

// transfers all stake to anyone who asks after the LM token is burned
Expand All @@ -128,7 +125,9 @@ abstract contract BaseRecall {
uint256 loanId = uint256(keccak256(encodedLoan));

// loan has not been refinanced, loan is still active. LM.tokenId changes on refinance
if (!LM.inactive(loanId)) revert LoanHasNotBeenRefinanced();
if (!LM.inactive(loanId)) {
revert LoanHasNotBeenRefinanced();
}

Recall storage recall = recalls[loanId];
// ensure that a recall exists for the provided tokenId, ensure that the recall
Expand All @@ -143,7 +142,9 @@ abstract contract BaseRecall {
recall.start = 0;

for (uint256 i; i < recallConsideration.length;) {
if (loan.debt[i].itemType != ItemType.ERC20) revert InvalidStakeType();
if (loan.debt[i].itemType != ItemType.ERC20) {
revert InvalidItemType();
}

ERC20(loan.debt[i].token).transfer(receiver, recallConsideration[i].amount);

Expand Down
4 changes: 3 additions & 1 deletion src/pricing/AstariaV1Pricing.sol
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ contract AstariaV1Pricing is CompoundInterestPricing {
if (hook.isRecalled(loan)) {
uint256 rate = hook.getRecallRate(loan);
// offered loan did not meet the terms of the recall auction
if (newDetails.rate > rate) revert InsufficientRefinance();
if (newDetails.rate > rate) {
revert InsufficientRefinance();
}
}
// recall is not occuring
else {
Expand Down
Loading

0 comments on commit 97e6932

Please sign in to comment.