-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'main' into feat/pricing-unit-tests
* main: Add enforcer unit testing (#37) feat/originator testing/bnpl /w testing (#39) differential fuzzing of lib (#35)
- Loading branch information
Showing
54 changed files
with
1,580 additions
and
816 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,82 +1,114 @@ | ||
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallBase() (gas: 1039520) | ||
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLender() (gas: 691168) | ||
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLiquidation() (gas: 770737) | ||
TestCustodian:testCannotLazyMintTwice() (gas: 76597) | ||
DiffFuzzTestStarPortLib:testSpentToReceived((uint8,address,uint256,uint256)[]) (runs: 256, μ: 880501, ~: 882340) | ||
DiffFuzzTestStarPortLib:testUnboundSpentToReceived((uint8,address,uint256,uint256)[]) (runs: 256, μ: 232899, ~: 237832) | ||
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallBase() (gas: 1041013) | ||
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLender() (gas: 693016) | ||
TestAstariaV1Loan:testNewLoanERC721CollateralDefaultTermsRecallLiquidation() (gas: 772585) | ||
TestBorrowerEnforcer:testBERevertAdditionalTransfers() (gas: 73101) | ||
TestBorrowerEnforcer:testBERevertInvalidLoanTerms() (gas: 78338) | ||
TestBorrowerEnforcer:testBEValidLoanTerms() (gas: 69429) | ||
TestBorrowerEnforcer:testBEValidLoanTermsAnyIssuer() (gas: 69581) | ||
TestCustodian:testCannotLazyMintTwice() (gas: 76686) | ||
TestCustodian:testCannotMintInvalidLoanInvalidCustodian() (gas: 66883) | ||
TestCustodian:testCannotMintInvalidLoanValidCustodian() (gas: 72422) | ||
TestCustodian:testCannotMintInvalidLoanValidCustodian() (gas: 72511) | ||
TestCustodian:testCustodySelector() (gas: 2543980) | ||
TestCustodian:testDefaultCustodySelectorRevert() (gas: 70105) | ||
TestCustodian:testGenerateOrderInvalidHandlerExecution() (gas: 132855) | ||
TestCustodian:testGenerateOrderRepay() (gas: 164375) | ||
TestCustodian:testGenerateOrderRepayAsRepayApprovedBorrower() (gas: 190022) | ||
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNative() (gas: 843726) | ||
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNativeHandlerAuthorized() (gas: 785358) | ||
TestCustodian:testGenerateOrderRepayERC1155WithRevert() (gas: 518154) | ||
TestCustodian:testGenerateOrderRepay() (gas: 164353) | ||
TestCustodian:testGenerateOrderRepayAsRepayApprovedBorrower() (gas: 190000) | ||
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNative() (gas: 847956) | ||
TestCustodian:testGenerateOrderRepayERC1155AndERC20AndNativeHandlerAuthorized() (gas: 789588) | ||
TestCustodian:testGenerateOrderRepayERC1155WithRevert() (gas: 520259) | ||
TestCustodian:testGenerateOrderRepayInvalidHookAddress() (gas: 90249) | ||
TestCustodian:testGenerateOrderRepayInvalidHookReturnType() (gas: 84653) | ||
TestCustodian:testGenerateOrderRepayNotBorrower() (gas: 96449) | ||
TestCustodian:testGenerateOrderSettlement() (gas: 151381) | ||
TestCustodian:testGenerateOrderSettlementHandlerAuthorized() (gas: 160421) | ||
TestCustodian:testGenerateOrderSettlementNoActiveLoan() (gas: 155620) | ||
TestCustodian:testGenerateOrderSettlement() (gas: 151359) | ||
TestCustodian:testGenerateOrderSettlementHandlerAuthorized() (gas: 160399) | ||
TestCustodian:testGenerateOrderSettlementNoActiveLoan() (gas: 155598) | ||
TestCustodian:testGenerateOrderSettlementUnauthorized() (gas: 94219) | ||
TestCustodian:testGetBorrower() (gas: 76234) | ||
TestCustodian:testInvalidAction() (gas: 114400) | ||
TestCustodian:testInvalidActionRepayInActiveLoan() (gas: 117327) | ||
TestCustodian:testInvalidActionSettleActiveLoan() (gas: 117287) | ||
TestCustodian:testInvalidAction() (gas: 114489) | ||
TestCustodian:testInvalidActionRepayInActiveLoan() (gas: 117416) | ||
TestCustodian:testInvalidActionSettleActiveLoan() (gas: 117376) | ||
TestCustodian:testName() (gas: 7120) | ||
TestCustodian:testNonPayableFunctions() (gas: 225770) | ||
TestCustodian:testOnlySeaport() (gas: 17917) | ||
TestCustodian:testPayableFunctions() (gas: 41689) | ||
TestCustodian:testPreviewOrderNoActiveLoan() (gas: 98687) | ||
TestCustodian:testPreviewOrderRepay() (gas: 208128) | ||
TestCustodian:testPreviewOrderSettlement() (gas: 182676) | ||
TestCustodian:testPreviewOrderSettlementInvalidFufliller() (gas: 100488) | ||
TestCustodian:testPreviewOrderSettlementInvalidRepayer() (gas: 106646) | ||
TestCustodian:testRatifyOrder() (gas: 170218) | ||
TestCustodian:testPreviewOrderNoActiveLoan() (gas: 98776) | ||
TestCustodian:testPreviewOrderRepay() (gas: 208195) | ||
TestCustodian:testPreviewOrderSettlement() (gas: 182743) | ||
TestCustodian:testPreviewOrderSettlementInvalidFufliller() (gas: 100577) | ||
TestCustodian:testPreviewOrderSettlementInvalidRepayer() (gas: 106735) | ||
TestCustodian:testRatifyOrder() (gas: 170196) | ||
TestCustodian:testSeaportMetadata() (gas: 8567) | ||
TestCustodian:testSetRepayApproval() (gas: 37883) | ||
TestCustodian:testSupportsInterface() (gas: 9428) | ||
TestCustodian:testSymbol() (gas: 7149) | ||
TestCustodian:testTokenURI() (gas: 64839) | ||
TestCustodian:testTokenURIInvalidLoan() (gas: 13218) | ||
TestLoanCombinations:testLoan20For721SimpleInterestDutchFixedRepay() (gas: 530977) | ||
TestLoanCombinations:testLoan20for20SimpleInterestDutchFixedRepay() (gas: 499814) | ||
TestLoanCombinations:testLoan721for20SimpleInterestDutchFixedRepay() (gas: 549734) | ||
TestLoanCombinations:testLoanAstariaSettlementRepay() (gas: 539558) | ||
TestLoanCombinations:testLoanSimpleInterestEnglishFixed() (gas: 544218) | ||
TestLoanManager:testCannotIssueSameLoanTwice() (gas: 331333) | ||
TestLenderEnforcer:testLERevertAdditionalTransfersFromLender() (gas: 73760) | ||
TestLenderEnforcer:testLERevertInvalidLoanTerms() (gas: 78385) | ||
TestLenderEnforcer:testLEValidLoanTerms() (gas: 69429) | ||
TestLenderEnforcer:testLEValidLoanTermsAnyBorrower() (gas: 69516) | ||
TestLenderEnforcer:testLEValidLoanTermsWithAdditionalTransfers() (gas: 70757) | ||
TestLoanCombinations:testLoan20For721SimpleInterestDutchFixedRepay() (gas: 532861) | ||
TestLoanCombinations:testLoan20for20SimpleInterestDutchFixedRepay() (gas: 501718) | ||
TestLoanCombinations:testLoan721for20SimpleInterestDutchFixedRepay() (gas: 551584) | ||
TestLoanCombinations:testLoanAstariaSettlementRepay() (gas: 541442) | ||
TestLoanCombinations:testLoanSimpleInterestEnglishFixed() (gas: 546102) | ||
TestLoanManager:testAdditionalTransfers() (gas: 293082) | ||
TestLoanManager:testCannotIssueSameLoanTwice() (gas: 331285) | ||
TestLoanManager:testCannotOriginateWhilePaused() (gas: 87923) | ||
TestLoanManager:testCannotSettleInvalidLoan() (gas: 72594) | ||
TestLoanManager:testCannotSettleUnlessValidCustodian() (gas: 68772) | ||
TestLoanManager:testCaveatEnforcerRevert() (gas: 116699) | ||
TestLoanManager:testDefaultFeeRake() (gas: 350119) | ||
TestLoanManager:testExoticDebtWithNoCaveatsNotAsBorrower() (gas: 342776) | ||
TestLoanManager:testInitializedFlagSetProperly() (gas: 65230) | ||
TestLoanManager:testInvalidAmountCollateral() (gas: 152875) | ||
TestLoanManager:testInvalidAmountCollateral721() (gas: 152995) | ||
TestLoanManager:testInvalidAmountDebt() (gas: 177208) | ||
TestLoanManager:testInvalidItemType() (gas: 138923) | ||
TestLoanManager:testInvalidTransferLengthCollateral() (gas: 161136) | ||
TestLoanManager:testInvalidTransferLengthDebt() (gas: 165669) | ||
TestLoanManager:testIssued() (gas: 67055) | ||
TestLoanManager:testCannotSettleUnlessValidCustodian() (gas: 68750) | ||
TestLoanManager:testCaveatEnforcerRevert() (gas: 119155) | ||
TestLoanManager:testDefaultFeeRake() (gas: 352463) | ||
TestLoanManager:testExoticDebtWithNoCaveatsNotAsBorrower() (gas: 342734) | ||
TestLoanManager:testInitializedFlagSetProperly() (gas: 65262) | ||
TestLoanManager:testInvalidAmountCollateral() (gas: 152833) | ||
TestLoanManager:testInvalidAmountCollateral721() (gas: 152976) | ||
TestLoanManager:testInvalidAmountDebt() (gas: 177144) | ||
TestLoanManager:testInvalidIdentifierDebt() (gas: 197138) | ||
TestLoanManager:testInvalidItemType() (gas: 138881) | ||
TestLoanManager:testInvalidTransferLengthCollateral() (gas: 161050) | ||
TestLoanManager:testInvalidTransferLengthDebt() (gas: 165593) | ||
TestLoanManager:testIssued() (gas: 67144) | ||
TestLoanManager:testName() (gas: 7184) | ||
TestLoanManager:testNonDefaultCustodianCustodyCallFails() (gas: 190240) | ||
TestLoanManager:testNonDefaultCustodianCustodyCallSuccess() (gas: 258491) | ||
TestLoanManager:testNonPayableFunctions() (gas: 173071) | ||
TestLoanManager:testOverrideFeeRake() (gas: 343912) | ||
TestLoanManager:testSupportsInterface() (gas: 9159) | ||
TestLoanManager:testSymbol() (gas: 7127) | ||
TestLoanManager:testTokenNoCodeCollateral() (gas: 137717) | ||
TestLoanManager:testTokenNoCodeDebt() (gas: 170775) | ||
TestLoanManager:testTokenURI() (gas: 64914) | ||
TestLoanManager:testTokenURIInvalidLoan() (gas: 13309) | ||
TestLoanManager:testTransferFromFail() (gas: 80088) | ||
TestNewLoan:testBuyNowPayLater() (gas: 208) | ||
TestNewLoan:testNewLoanERC721CollateralDefaultTerms2():((uint256,address,address,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256)[],(address,bytes,address,bytes,address,bytes))) (gas: 389501) | ||
TestNewLoan:testNewLoanERC721CollateralLessDebtThanOffered():((uint256,address,address,address,address,(uint8,address,uint256,uint256)[],(uint8,address,uint256,uint256)[],(address,bytes,address,bytes,address,bytes))) (gas: 2259) | ||
TestLoanManager:testNonDefaultCustodianCustodyCallFails() (gas: 190220) | ||
TestLoanManager:testNonDefaultCustodianCustodyCallSuccess() (gas: 258469) | ||
TestLoanManager:testNonPayableFunctions() (gas: 175555) | ||
TestLoanManager:testOverrideFeeRake() (gas: 346202) | ||
TestLoanManager:testPause() (gas: 34222) | ||
TestLoanManager:testSupportsInterface() (gas: 9181) | ||
TestLoanManager:testSymbol() (gas: 7235) | ||
TestLoanManager:testTokenNoCodeCollateral() (gas: 137653) | ||
TestLoanManager:testTokenNoCodeDebt() (gas: 170689) | ||
TestLoanManager:testTokenURI() (gas: 64892) | ||
TestLoanManager:testTokenURIInvalidLoan() (gas: 13244) | ||
TestLoanManager:testTransferFromFail() (gas: 80176) | ||
TestLoanManager:testUnPause() (gas: 14291) | ||
TestNewLoan:testBuyNowPayLater() (gas: 2831719) | ||
TestNewLoan:testNewLoanERC721CollateralDefaultTerms2() (gas: 391890) | ||
TestNewLoan:testNewLoanERC721CollateralLessDebtThanOffered() (gas: 2259) | ||
TestNewLoan:testNewLoanRefinanceNew() (gas: 207) | ||
TestNewLoan:testNewLoanViaOriginatorBorrowerApprovalAndLenderApproval() (gas: 299336) | ||
TestNewLoan:testNewLoanViaOriginatorLenderApproval() (gas: 353952) | ||
TestNewLoan:testSettleLoan() (gas: 163) | ||
TestRefStarPortLib:testSpentToReceived() (gas: 13315) | ||
TestRefStarPortLib:testValidateSalt(address,bytes32) (runs: 256, μ: 33865, ~: 33865) | ||
TestRepayLoan:testRepayLoan() (gas: 207) | ||
TestStarLiteUtils:testEncodeReceivedWithRecipient() (gas: 17955) | ||
TestStarLiteUtils:testSpentToReceived() (gas: 17708) | ||
TestStarLiteUtils:testValidateSaltOpt(address,bytes32) (runs: 256, μ: 26479, ~: 26479) | ||
TestStarLiteUtils:testValidateSaltRef(address,bytes32) (runs: 256, μ: 26849, ~: 26849) | ||
TestStarPortLib:testSpentToReceived() (gas: 13315) | ||
TestStarPortLib:testValidateSalt(address,bytes32) (runs: 256, μ: 33865, ~: 33865) | ||
TestStrategistOriginator:testEncodeWithAccountCounter() (gas: 12307) | ||
TestStrategistOriginator:testGetStrategistData() (gas: 1473217) | ||
TestStrategistOriginator:testIncrementCounterAsStrategist() (gas: 18676) | ||
TestStrategistOriginator:testIncrementCounterNotAuthorized() (gas: 13467) | ||
TestStrategistOriginator:testInvalidCollateral() (gas: 204416) | ||
TestStrategistOriginator:testInvalidDeadline() (gas: 210145) | ||
TestStrategistOriginator:testInvalidDebt() (gas: 206100) | ||
TestStrategistOriginator:testInvalidDebtAmountAskingMoreThanOffered() (gas: 206548) | ||
TestStrategistOriginator:testInvalidDebtAmountOfferingZero() (gas: 186903) | ||
TestStrategistOriginator:testInvalidDebtAmountRequestingZero() (gas: 206801) | ||
TestStrategistOriginator:testInvalidDebtLength() (gas: 205428) | ||
TestStrategistOriginator:testInvalidOffer() (gas: 396325) | ||
TestStrategistOriginator:testInvalidSigner() (gas: 208639) | ||
TestStrategistOriginator:testSetStrategist() (gas: 17818) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,6 +1,7 @@ | ||
[profile.default] | ||
#cancun = true | ||
src = "src" | ||
out = "out" | ||
libs = ["lib"] | ||
|
||
#solc = "./bin/solc" | ||
# See more config options https://github.com/foundry-rs/foundry/tree/master/config |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,138 @@ | ||
pragma solidity ^0.8.17; | ||
|
||
import { | ||
OfferItem, | ||
SpentItem, | ||
ConsiderationItem, | ||
AdvancedOrder, | ||
OrderParameters, | ||
CriteriaResolver, | ||
ItemType, | ||
Fulfillment | ||
} from "seaport-types/src/lib/ConsiderationStructs.sol"; | ||
import {ConduitTransfer, ConduitItemType} from "seaport-types/src/conduit/lib/ConduitStructs.sol"; | ||
|
||
import {Seaport} from "seaport/contracts/Seaport.sol"; | ||
import {LoanManager} from "./LoanManager.sol"; | ||
import {CaveatEnforcer} from "./enforcers/CaveatEnforcer.sol"; | ||
import "forge-std/console.sol"; | ||
|
||
interface IVault { | ||
function flashLoan( | ||
IFlashLoanRecipient recipient, | ||
address[] calldata tokens, | ||
uint256[] calldata amounts, | ||
bytes memory userData | ||
) external; | ||
} | ||
|
||
interface IFlashLoanRecipient { | ||
function receiveFlashLoan( | ||
address[] calldata tokens, | ||
uint256[] calldata amounts, | ||
uint256[] calldata feeAmounts, | ||
bytes memory userData | ||
) external; | ||
} | ||
|
||
interface IWETH9 { | ||
function withdraw(uint256) external; | ||
} | ||
|
||
interface ERC20 { | ||
function transfer(address, uint256) external returns (bool); | ||
} | ||
|
||
// fulfiller | ||
|
||
contract BNPLHelper is IFlashLoanRecipient { | ||
address private constant vault = address(0xBA12222222228d8Ba445958a75a0704d566BF2C8); | ||
IWETH9 private immutable WETH; | ||
bytes32 private activeUserDataHash; | ||
|
||
constructor(address WETH_) { | ||
WETH = IWETH9(WETH_); | ||
} | ||
|
||
struct Execution { | ||
address lm; | ||
address seaport; | ||
address borrower; | ||
CaveatEnforcer.CaveatWithApproval borrowerCaveat; | ||
CaveatEnforcer.CaveatWithApproval lenderCaveat; | ||
LoanManager.Loan loan; | ||
AdvancedOrder[] orders; | ||
CriteriaResolver[] resolvers; | ||
Fulfillment[] fulfillments; | ||
} | ||
|
||
error SenderNotSelf(); | ||
error DoNotSendETH(); | ||
error InvalidUserDataProvided(); | ||
|
||
function makeFlashLoan( | ||
address[] calldata tokens, | ||
uint256[] calldata amounts, | ||
// uint256[] calldata userProvidedAmounts, | ||
bytes calldata userData | ||
) external { | ||
// assembly { | ||
// // Compute the hash of userData | ||
// let dataHash := keccak256(userData.offset, calldatasize()) | ||
// | ||
// // Store the hash in the activeUserDataHash state variable | ||
// tstore(activeUserDataHash.slot, dataHash) | ||
// } | ||
activeUserDataHash = keccak256(userData); | ||
|
||
IVault(vault).flashLoan(this, tokens, amounts, userData); | ||
} | ||
|
||
function receiveFlashLoan( | ||
address[] calldata tokens, // are all erc20s | ||
uint256[] calldata amounts, | ||
uint256[] calldata feeAmounts, | ||
bytes calldata userData | ||
) external override { | ||
require(msg.sender == vault); | ||
|
||
if (activeUserDataHash != keccak256(userData)) { | ||
revert InvalidUserDataProvided(); | ||
} | ||
delete activeUserDataHash; | ||
|
||
Execution memory execution = abi.decode(userData, (Execution)); | ||
//approve seaport | ||
for (uint256 i = 0; i < tokens.length;) { | ||
ERC20(tokens[i]).transfer(execution.borrower, amounts[i]); | ||
unchecked { | ||
++i; | ||
} | ||
} | ||
Seaport(payable(execution.seaport)).matchAdvancedOrders( | ||
execution.orders, execution.resolvers, execution.fulfillments, execution.borrower | ||
); | ||
|
||
ConduitTransfer[] memory transfers = new ConduitTransfer[](tokens.length); | ||
for (uint256 i = 0; i < tokens.length;) { | ||
transfers[i] = ConduitTransfer({ | ||
itemType: ConduitItemType.ERC20, | ||
identifier: 0, | ||
token: tokens[0], | ||
from: execution.borrower, | ||
to: vault, | ||
amount: amounts[0] + feeAmounts[0] | ||
}); | ||
unchecked { | ||
++i; | ||
} | ||
} | ||
LoanManager(execution.lm).originate(transfers, execution.borrowerCaveat, execution.lenderCaveat, execution.loan); | ||
} | ||
|
||
receive() external payable { | ||
if (msg.sender != address(WETH)) { | ||
revert DoNotSendETH(); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.