Place the following code in a Foundry Forge test file.
pragma solidity >=0.8.22;
import { Test } from "../../lib/forge-std/src/Test.sol";
import { PausableMockERC20, IERC20 } from "./PausableMockERC20.sol";
import { SablierV2LockupLinear } from "../../src/SablierV2LockupLinear.sol";
import { SablierV2NFTDescriptor } from "../../src/SablierV2NFTDescriptor.sol";
import { ISablierV2NFTDescriptor } from "../../src/interfaces/ISablierV2NFTDescriptor.sol";
import { Lockup, LockupLinear, Broker } from "../../src/types/DataTypes.sol";
import { wrap } from "@prb/math/src/ud60x18/Casting.sol";
contract BlacklistTest is Test, Events {
PausableMockERC20 token;
SablierV2LockupLinear sablier;
SablierV2NFTDescriptor nftDescriptor;
address sender = makeAddr("sender");
address recipient = makeAddr("recipient");
address tokenController = makeAddr("tokenController");
address sablierAdmin = makeAddr("sablierAdmin");
uint256 ONE_THOUSAND_TOKENS = 1000 * 1e18;
LockupLinear.CreateWithTimestamps params;
function setUp() public {
nftDescriptor = new SablierV2NFTDescriptor();
sablier = new SablierV2LockupLinear(sablierAdmin, ISablierV2NFTDescriptor(nftDescriptor));
vm.startPrank(tokenController);
token = new PausableMockERC20();
token.mint(ONE_THOUSAND_TOKENS);
token.transfer(sender, ONE_THOUSAND_TOKENS);
vm.stopPrank();
params = LockupLinear.CreateWithTimestamps({
sender: sender,
recipient: recipient,
totalAmount: uint128(ONE_THOUSAND_TOKENS),
asset: IERC20(token),
cancelable: true,
transferable: false,
timestamps: LockupLinear.Timestamps({
start: uint40(block.timestamp),
cliff: uint40(block.timestamp + 60),
end: uint40(block.timestamp + 3600)
}),
broker: Broker({ account: address(0), fee: wrap(0) })
});
}
function test_blacklist() public {
vm.prank(tokenController);
token.addToBlacklist(recipient);
vm.startPrank(sender);
token.approve(address(sablier), ONE_THOUSAND_TOKENS);
sablier.createWithTimestamps(params);
vm.stopPrank();
vm.warp(params.timestamps.end);
vm.expectRevert();
sablier.withdraw(1, recipient, uint128(ONE_THOUSAND_TOKENS));
}
function test_pausableToken() public {
vm.startPrank(sender);
token.approve(address(sablier), ONE_THOUSAND_TOKENS);
sablier.createWithTimestamps(params);
vm.stopPrank();
vm.prank(tokenController);
token.pause();
vm.warp(params.timestamps.end);
vm.expectRevert();
sablier.withdraw(1, recipient, uint128(ONE_THOUSAND_TOKENS));
}