pragma solidity ^0.8.26;
import {Test, console} from "forge-std/Test.sol";
import {ReFiSwapRebateHook} from "../src/RebateFiHook.sol";
import {Deployers} from "@uniswap/v4-core/test/utils/Deployers.sol";
import {MockERC20} from "solmate/src/test/utils/mocks/MockERC20.sol";
contract EventOrderPoCTest is Test, Deployers {
ReFiSwapRebateHook public hook;
MockERC20 public reFiToken;
address recipient = address(0xBEEF);
event TokensWithdrawn(address indexed token, address indexed to, uint256 amount);
function setUp() public {
deployFreshManagerAndRouters();
reFiToken = new MockERC20("ReFi", "REFI", 18);
hook = new ReFiSwapRebateHook(manager, address(reFiToken));
reFiToken.mint(address(hook), 100 ether);
}
function test_PoC_EventParametersSwapped() public {
uint256 withdrawAmount = 10 ether;
address tokenAddress = address(reFiToken);
address recipientAddress = recipient;
console.log("=== Event Parameter Analysis ===");
console.log("Token Address:", tokenAddress);
console.log("Recipient Address:", recipientAddress);
console.log("");
console.log("EXPECTED Event: TokensWithdrawn(token, recipient, amount)");
console.log(" - First indexed param (token):", tokenAddress);
console.log(" - Second indexed param (to):", recipientAddress);
console.log("");
console.log("ACTUAL Event: TokensWithdrawn(recipient, token, amount)");
console.log(" - First indexed param (token):", recipientAddress, "<-- WRONG!");
console.log(" - Second indexed param (to):", tokenAddress, "<-- WRONG!");
vm.expectEmit(true, true, false, true);
emit TokensWithdrawn(recipientAddress, tokenAddress, withdrawAmount);
hook.withdrawTokens(tokenAddress, recipientAddress, withdrawAmount);
}
function test_PoC_IndexerMisinterpretation() public {
address tokenAddress = address(reFiToken);
address recipientAddress = recipient;
uint256 amount = 10 ether;
console.log("=== Indexer Interpretation ===");
console.log("");
console.log("Indexer sees in event logs:");
console.log(" topics[1] (thinks 'token'):", recipientAddress);
console.log(" topics[2] (thinks 'to'):", tokenAddress);
console.log("");
console.log("Indexer database records:");
console.log(" Token withdrawn: 0xBEEF (actually an EOA!)");
console.log(" Sent to: ReFi token contract (actually a token!)");
console.log("");
console.log("Result: Completely corrupted withdrawal history");
vm.expectEmit(true, true, false, true);
emit TokensWithdrawn(recipientAddress, tokenAddress, amount);
hook.withdrawTokens(tokenAddress, recipientAddress, amount);
}
}