Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat/V1 hook updates #44

Merged
merged 12 commits into from
Nov 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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