Skip to content

Commit

Permalink
Merge branch 'main' into feat/pricing-unit-tests
Browse files Browse the repository at this point in the history
* main:
  Add enforcer unit testing (#37)
  feat/originator testing/bnpl /w testing (#39)
  differential fuzzing of lib (#35)
  • Loading branch information
justingreenberg committed Nov 1, 2023
2 parents eef0d6a + a2d9d81 commit ba65404
Show file tree
Hide file tree
Showing 54 changed files with 1,580 additions and 816 deletions.
148 changes: 90 additions & 58 deletions .gas-snapshot
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)
3 changes: 2 additions & 1 deletion foundry.toml
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
138 changes: 138 additions & 0 deletions src/BNPLHelper.sol
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();
}
}
}
2 changes: 1 addition & 1 deletion src/ConduitHelper.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*
* Chainworks Labs
*/
pragma solidity =0.8.17;
pragma solidity ^0.8.17;

import {ItemType, OfferItem, Schema, SpentItem, ReceivedItem} from "seaport-types/src/lib/ConsiderationStructs.sol";

Expand Down
2 changes: 1 addition & 1 deletion src/Custodian.sol
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@
*
* Chainworks Labs
*/
pragma solidity =0.8.17;
pragma solidity ^0.8.17;

import {ERC721} from "solady/src/tokens/ERC721.sol";
import {ERC20} from "solady/src/tokens/ERC20.sol";
Expand Down
Loading

0 comments on commit ba65404

Please sign in to comment.