-
-
Save Sentient-XII/1ee73b14df418fe8e565a0a77b1492c1 to your computer and use it in GitHub Desktop.
Unfillable Pod Listings caused by large minFillAmount
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
// 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(); | |
} | |
} | |
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
// 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