pragma solidity ^0.8.26;
import {Test} from "forge-std/Test.sol";
import {IPoolManager} from "v4-core/interfaces/IPoolManager.sol";
import {PoolKey} from "v4-core/types/PoolKey.sol";
import {Currency} from "v4-core/types/Currency.sol";
import {ReFiSwapRebateHook} from "../src/RebateFiHook.sol";
contract Currency0RejectionTest is Test {
ReFiSwapRebateHook hook;
address refiToken = address(0x123);
address otherToken = address(0x456);
function setUp() public {
IPoolManager poolManager = IPoolManager(address(0x789));
hook = new ReFiSwapRebateHook(poolManager, refiToken);
}
function testRejectsReFiAsCurrency0() public {
PoolKey memory poolKey = PoolKey({
currency0: Currency.wrap(refiToken),
currency1: Currency.wrap(otherToken),
fee: 0x800000,
tickSpacing: 60,
hooks: hook
});
vm.expectRevert(ReFiSwapRebateHook.ReFiNotInPool.selector);
hook.beforeInitialize(address(this), poolKey, 0, "");
}
function testAcceptsReFiAsCurrency1() public view {
PoolKey memory poolKey = PoolKey({
currency0: Currency.wrap(otherToken),
currency1: Currency.wrap(refiToken),
fee: 0x800000,
tickSpacing: 60,
hooks: hook
});
hook.beforeInitialize(address(this), poolKey, 0, "");
}
function testCurrency0LogicUnreachable() public view {
PoolKey memory poolKey = PoolKey({
currency0: Currency.wrap(otherToken),
currency1: Currency.wrap(refiToken),
fee: 0x800000,
tickSpacing: 60,
hooks: hook
});
bool isReFiCurrency0 = Currency.unwrap(poolKey.currency0) == refiToken;
assertFalse(isReFiCurrency0, "ReFi can never be currency0");
}
}
function _beforeInitialize(address, PoolKey calldata key, uint160) internal view override returns (bytes4) {
- if (Currency.unwrap(key.currency1) != ReFi &&
- Currency.unwrap(key.currency1) != ReFi) {
+ if (Currency.unwrap(key.currency0) != ReFi &&
+ Currency.unwrap(key.currency1) != ReFi) {
revert ReFiNotInPool();
}
return BaseHook.beforeInitialize.selector;
}