From 9253a66cc54cd0363f5f8ff82d31f8c26105e028 Mon Sep 17 00:00:00 2001 From: Ian Harvey Date: Tue, 7 Feb 2023 08:47:32 -0500 Subject: [PATCH 1/3] Added test and fix --- src/ERC20Pool.sol | 2 +- .../ERC20TakeWithExternalLiquidity.t.sol | 23 +++++++++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/src/ERC20Pool.sol b/src/ERC20Pool.sol index bcc82cb5d..f7733b0c4 100644 --- a/src/ERC20Pool.sol +++ b/src/ERC20Pool.sol @@ -405,7 +405,7 @@ contract ERC20Pool is FlashloanablePool, IERC20Pool { ); } - _transferQuoteTokenFrom(callee_, result.quoteTokenAmount); + _transferQuoteTokenFrom(msg.sender, result.quoteTokenAmount); } /** diff --git a/tests/forge/interactions/ERC20TakeWithExternalLiquidity.t.sol b/tests/forge/interactions/ERC20TakeWithExternalLiquidity.t.sol index f16a77e10..76a3ad201 100644 --- a/tests/forge/interactions/ERC20TakeWithExternalLiquidity.t.sol +++ b/tests/forge/interactions/ERC20TakeWithExternalLiquidity.t.sol @@ -132,4 +132,27 @@ contract ERC20TakeWithExternalLiquidityTest is Test { // confirm we earned some quote token assertGt(usdc.balanceOf(address(taker)), 0); } + + function testTakeCalleeDiffersFromSender() external { + + // _lender is msg.sender, QT & CT balances pre take + assertEq(usdc.balanceOf(_lender), 119_999.999999926999804658 * 1e18); + assertEq(weth.balanceOf(_lender), 0); + + // callee, _lender1 QT & CT balances pre take + assertEq(usdc.balanceOf(_lender1), 120_000.0 * 1e18); + assertEq(weth.balanceOf(_lender1), 4.0 * 1e18); + + // lender calls take, passing _lender1 as the callee + changePrank(_lender); + _ajnaPool.take(_borrower, 1_001 * 1e18, _lender1, new bytes(0)); + + // _lender is has QT deducted from balance + assertEq(usdc.balanceOf(_lender), 119_999.999999926985301196 * 1e18); + assertEq(weth.balanceOf(_lender), 0); + + // callee, _lender1 receives CT from take + assertEq(usdc.balanceOf(_lender1), 120_000.0 * 1e18); + assertEq(weth.balanceOf(_lender1), 6.0 * 1e18); + } } From 49a86c67d2c403e9691352cff1fbe147a7ddfe89 Mon Sep 17 00:00:00 2001 From: Ian Harvey Date: Wed, 8 Feb 2023 08:16:57 -0500 Subject: [PATCH 2/3] fixed ERC721 take as well --- src/ERC721Pool.sol | 2 +- .../ERC721TakeWithExternalLiquidity.sol | 36 +++++++++++++++++++ 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/ERC721Pool.sol b/src/ERC721Pool.sol index 3a7f4def3..5d6d3c6d0 100644 --- a/src/ERC721Pool.sol +++ b/src/ERC721Pool.sol @@ -459,7 +459,7 @@ contract ERC721Pool is FlashloanablePool, IERC721Pool { if (result.settledAuction) _rebalanceTokens(borrowerAddress_, result.remainingCollateral); // transfer from taker to pool the amount of quote tokens needed to cover collateral auctioned (including excess for rounded collateral) - _transferQuoteTokenFrom(callee_, totalQuoteTokenAmount); + _transferQuoteTokenFrom(msg.sender, totalQuoteTokenAmount); // transfer from pool to borrower the excess of quote tokens after rounding collateral auctioned if (result.excessQuoteToken != 0) _transferQuoteToken(borrowerAddress_, result.excessQuoteToken); diff --git a/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol b/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol index 835384a09..fa15f4fb7 100644 --- a/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol +++ b/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol @@ -19,17 +19,20 @@ contract ERC721TakeWithExternalLiquidityTest is ERC721HelperContract { address internal _borrower; address internal _borrower2; address internal _lender; + address internal _lender1; function setUp() external { _borrower = makeAddr("borrower"); _borrower2 = makeAddr("borrower2"); _lender = makeAddr("lender"); + _lender1 = makeAddr("lender1"); // deploy collection pool _pool = _deployCollectionPool(); _mintAndApproveQuoteTokens(_lender, 100_000 * 1e18); + _mintAndApproveQuoteTokens(_lender1, 100_000 * 1e18); _mintAndApproveCollateralTokens(_borrower, 3); _mintAndApproveCollateralTokens(_borrower2, 5); @@ -88,4 +91,37 @@ contract ERC721TakeWithExternalLiquidityTest is ERC721HelperContract { // confirm we earned some quote token assertEq(_quote.balanceOf(address(taker)), 970.423096682230524352 * 1e18); } + + function testTakeNFTCalleeDiffersFromSender() external { + // instantiate and fund a hypothetical NFT marketplace + NFTMarketPlace marketPlace = new NFTMarketPlace(_quote); + deal(address(_quote), address(marketPlace), 25_000 * 1e18); + + // instantiate a taker contract which implements IERC721Taker and uses this marketplace + NFTTakeExample taker = new NFTTakeExample(address(marketPlace)); + changePrank(address(taker)); + assertEq(_quote.balanceOf(address(taker)), 0); + _quote.approve(address(_pool), type(uint256).max); + _collateral.setApprovalForAll(address(marketPlace), true); + + // _lender is msg.sender, QT & CT balances pre take + assertEq(_quote.balanceOf(_lender), 49_979.825641778370686641 * 1e18); + assertEq(_quote.balanceOf(address(taker)), 0); + + // call take using taker contract + changePrank(_lender); + bytes memory data = abi.encode(address(_pool)); + vm.expectEmit(true, true, false, true); + uint256 quoteTokenPaid = 529.576903317769475648 * 1e18; + uint256 collateralPurchased = 2 * 1e18; + uint256 bondChange = 5.295769033177694756 * 1e18; + emit Take(_borrower, quoteTokenPaid, collateralPurchased, bondChange, true); + _pool.take(_borrower, 2, address(taker), data); + + // _lender is msg.sender, QT & CT balances post take + assertEq(_quote.balanceOf(_lender), 49_450.248738460601210993 * 1e18); + assertEq(_quote.balanceOf(address(taker)), 1_500.0 * 1e18); // QT is increased as NFTTakeExample contract sells the NFT + } + + } From c523c59d56f8fb878e03c28d8cfb4f97ad70fb64 Mon Sep 17 00:00:00 2001 From: Ian Harvey Date: Wed, 8 Feb 2023 11:58:19 -0500 Subject: [PATCH 3/3] removed lender1 in tests, as that actor wasn't necessary --- tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol | 5 ----- 1 file changed, 5 deletions(-) diff --git a/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol b/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol index fa15f4fb7..927b22a58 100644 --- a/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol +++ b/tests/forge/interactions/ERC721TakeWithExternalLiquidity.sol @@ -19,20 +19,17 @@ contract ERC721TakeWithExternalLiquidityTest is ERC721HelperContract { address internal _borrower; address internal _borrower2; address internal _lender; - address internal _lender1; function setUp() external { _borrower = makeAddr("borrower"); _borrower2 = makeAddr("borrower2"); _lender = makeAddr("lender"); - _lender1 = makeAddr("lender1"); // deploy collection pool _pool = _deployCollectionPool(); _mintAndApproveQuoteTokens(_lender, 100_000 * 1e18); - _mintAndApproveQuoteTokens(_lender1, 100_000 * 1e18); _mintAndApproveCollateralTokens(_borrower, 3); _mintAndApproveCollateralTokens(_borrower2, 5); @@ -122,6 +119,4 @@ contract ERC721TakeWithExternalLiquidityTest is ERC721HelperContract { assertEq(_quote.balanceOf(_lender), 49_450.248738460601210993 * 1e18); assertEq(_quote.balanceOf(address(taker)), 1_500.0 * 1e18); // QT is increased as NFTTakeExample contract sells the NFT } - - }