pragma solidity ^0.8.13;
import {Test} from "forge-std/Test.sol";
import {Stratax} from "../../src/Stratax.sol";
import {UpgradeableBeacon} from "@openzeppelin/contracts/proxy/beacon/UpgradeableBeacon.sol";
import {BeaconProxy} from "@openzeppelin/contracts/proxy/beacon/BeaconProxy.sol";
contract MockUSDT {
mapping(address => uint256) public balanceOf;
mapping(address => mapping(address => uint256)) public allowance;
uint8 public decimals = 6;
function transfer(address to, uint256 value) external returns (bool) {
balanceOf[to] += value;
return true;
}
function transferFrom(address from, address to, uint256 value) external returns (bool) {
uint256 allowed = allowance[from][msg.sender];
require(allowed >= value, "insufficient allowance");
allowance[from][msg.sender] = allowed - value;
balanceOf[from] -= value;
balanceOf[to] += value;
return true;
}
function approve(address spender, uint256 value) external {
allowance[msg.sender][spender] = value;
}
}
contract MockAavePool {
function flashLoanSimple(address receiver, address asset, uint256 amount, bytes calldata params, uint16) external {
Stratax(receiver).executeOperation(asset, amount, 0, receiver, params);
}
function supply(address, uint256, address, uint16) external {}
function borrow(address, uint256, uint256, uint16, address) external {}
function repay(address, uint256, uint256, address) external returns (uint256) {
return 0;
}
function withdraw(address, uint256, address) external returns (uint256) {
return 0;
}
function getUserAccountData(address)
external
pure
returns (
uint256,
uint256,
uint256,
uint256,
uint256,
uint256
)
{
return (0, 0, 0, 0, 0, 2e18);
}
}
contract MockDataProvider {
function getReserveConfigurationData(address)
external
pure
returns (uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256, uint256)
{
return (0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
}
}
contract PoC_USDT_Approval is Test {
Stratax public stratax;
MockUSDT public usdt;
MockAavePool public aavePool;
MockDataProvider public dataProvider;
address public ownerTrader = address(0x123);
function setUp() public {
usdt = new MockUSDT();
aavePool = new MockAavePool();
dataProvider = new MockDataProvider();
Stratax impl = new Stratax();
UpgradeableBeacon beacon = new UpgradeableBeacon(address(impl), address(this));
bytes memory initData = abi.encodeWithSelector(
Stratax.initialize.selector,
address(aavePool),
address(dataProvider),
address(0),
address(usdt),
address(0)
);
BeaconProxy proxy = new BeaconProxy(address(beacon), initData);
stratax = Stratax(address(proxy));
stratax.transferOwnership(ownerTrader);
usdt.transfer(ownerTrader, 1000 * 1e6);
}
function test_USDT_Approval_Reverts() public {
vm.startPrank(ownerTrader);
usdt.approve(address(stratax), 1000 * 1e6);
vm.expectRevert();
stratax.createLeveragedPosition(address(usdt), 100 * 1e6, 1000 * 1e6, address(0xBEEF), 0, "", 0);
vm.stopPrank();
}
}