-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathERC1363Module.t.sol
More file actions
117 lines (93 loc) · 4.26 KB
/
Copy pathERC1363Module.t.sol
File metadata and controls
117 lines (93 loc) · 4.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
//SPDX-License-Identifier: MPL-2.0
pragma solidity ^0.8.20;
import "forge-std/Test.sol";
import "../script/DeployCMTATStandaloneERC1363.s.sol";
import "./MockERC1363.sol";
import "@openzeppelin/contracts/interfaces/IERC1363.sol";
import "@openzeppelin/contracts/token/ERC20/utils/ERC1363Utils.sol";
/// @dev Behaviour of the ERC-1363 variant. The deployment test only covers the `transferAndCall`
/// happy path, so the callback payload, the spender path and the rejection paths are asserted here.
contract ERC1363ModuleTest is Test {
CMTATStandaloneERC1363 internal cmtat;
MockERC1363Receiver internal receiver;
MockERC1363Spender internal spender;
address internal constant ADMIN = address(1);
address internal constant USER1 = address(2);
address internal constant USER2 = address(3);
function setUp() public {
DeployCMTATStandaloneERC1363 deployer = new DeployCMTATStandaloneERC1363();
cmtat = deployer.deploy(
ADMIN, address(0), "CMTA Token", "CMTAT", 0, "CMTAT_ISIN", "Terms", "https://cmta.ch/terms", "CMTAT_info"
);
receiver = new MockERC1363Receiver();
spender = new MockERC1363Spender();
vm.prank(ADMIN);
cmtat.mint(USER1, 1_000);
}
function test_TransferAndCallForwardsOperatorFromAndData() public {
vm.prank(USER1);
assertTrue(cmtat.transferAndCall(address(receiver), 100, "payload"));
assertEq(cmtat.balanceOf(address(receiver)), 100);
assertEq(cmtat.balanceOf(USER1), 900);
assertEq(receiver.lastOperator(), USER1);
assertEq(receiver.lastFrom(), USER1);
assertEq(receiver.lastValue(), 100);
assertEq(receiver.lastData(), "payload");
}
function test_TransferFromAndCallConsumesAllowance() public {
vm.prank(USER1);
cmtat.approve(USER2, 300);
vm.prank(USER2);
assertTrue(cmtat.transferFromAndCall(USER1, address(receiver), 300, "from-call"));
assertEq(cmtat.balanceOf(address(receiver)), 300);
assertEq(cmtat.allowance(USER1, USER2), 0);
assertEq(receiver.lastOperator(), USER2);
assertEq(receiver.lastFrom(), USER1);
assertEq(receiver.lastData(), "from-call");
}
function test_ApproveAndCallSetsAllowanceAndNotifiesSpender() public {
vm.prank(USER1);
assertTrue(cmtat.approveAndCall(address(spender), 250, "approve-payload"));
assertEq(cmtat.allowance(USER1, address(spender)), 250);
assertEq(spender.lastOwner(), USER1);
assertEq(spender.lastValue(), 250);
assertEq(spender.lastData(), "approve-payload");
}
function test_RevertWhen_TransferAndCallToEOA() public {
vm.prank(USER1);
vm.expectRevert(abi.encodeWithSelector(ERC1363Utils.ERC1363InvalidReceiver.selector, USER2));
cmtat.transferAndCall(USER2, 100);
}
function test_RevertWhen_ReceiverReturnsWrongSelector() public {
MockERC1363RejectingReceiver rejecting = new MockERC1363RejectingReceiver();
vm.prank(USER1);
vm.expectRevert(abi.encodeWithSelector(ERC1363Utils.ERC1363InvalidReceiver.selector, address(rejecting)));
cmtat.transferAndCall(address(rejecting), 100);
assertEq(cmtat.balanceOf(address(rejecting)), 0);
assertEq(cmtat.balanceOf(USER1), 1_000);
}
function test_RevertWhen_ApproveAndCallOnNonSpenderContract() public {
vm.prank(USER1);
vm.expectRevert(abi.encodeWithSelector(ERC1363Utils.ERC1363InvalidSpender.selector, address(receiver)));
cmtat.approveAndCall(address(receiver), 100);
}
function test_RevertWhen_TransferAndCallWhilePaused() public {
vm.prank(ADMIN);
cmtat.pause();
vm.prank(USER1);
vm.expectRevert();
cmtat.transferAndCall(address(receiver), 100);
assertEq(cmtat.balanceOf(address(receiver)), 0);
}
function test_TransferAndCallFromFrozenAddressIsBlocked() public {
vm.prank(ADMIN);
cmtat.setAddressFrozen(USER1, true);
vm.prank(USER1);
vm.expectRevert();
cmtat.transferAndCall(address(receiver), 100);
assertEq(cmtat.balanceOf(address(receiver)), 0);
}
function test_SupportsERC1363Interface() public {
assertTrue(cmtat.supportsInterface(type(IERC1363).interfaceId));
}
}