@croptop/core-v6 0.0.38 → 0.0.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -2
- package/foundry.toml +2 -1
- package/package.json +25 -13
- package/script/ConfigureFeeProject.s.sol +8 -5
- package/src/CTDeployer.sol +52 -51
- package/src/interfaces/ICTDeployer.sol +2 -2
- package/ADMINISTRATION.md +0 -94
- package/ARCHITECTURE.md +0 -96
- package/AUDIT_INSTRUCTIONS.md +0 -88
- package/RISKS.md +0 -78
- package/SKILLS.md +0 -46
- package/STYLE_GUIDE.md +0 -610
- package/USER_JOURNEYS.md +0 -134
- package/foundry.lock +0 -11
- package/slither-ci.config.json +0 -10
- package/sphinx.lock +0 -507
- package/test/CTDeployer.t.sol +0 -616
- package/test/CTProjectOwner.t.sol +0 -185
- package/test/CTPublisher.t.sol +0 -869
- package/test/ClaimCollectionOwnership.t.sol +0 -315
- package/test/CroptopAttacks.t.sol +0 -437
- package/test/Fork.t.sol +0 -227
- package/test/TestAuditGaps.sol +0 -696
- package/test/Test_MetadataGeneration.t.sol +0 -79
- package/test/audit/CodexNemesisCroptopPublisherBoundary.t.sol +0 -329
- package/test/audit/CodexNemesisCurrencyPoCs.t.sol +0 -371
- package/test/audit/CodexNemesisFreshRound.t.sol +0 -395
- package/test/audit/CodexNemesisMetadataShadow.t.sol +0 -196
- package/test/audit/CodexNemesisPoCs.t.sol +0 -263
- package/test/audit/CodexNemesisPolicyReuse.t.sol +0 -168
- package/test/audit/CodexNemesisUriDrift.t.sol +0 -252
- package/test/audit/DeployerPermissionBypass.t.sol +0 -213
- package/test/audit/EmptyPostFeeBypass.t.sol +0 -53
- package/test/audit/FeeBeneficiaryReentrancy.t.sol +0 -247
- package/test/audit/FeeFallbackBlackhole.t.sol +0 -263
- package/test/audit/Pass12Fixes.t.sol +0 -388
- package/test/fork/PublishFork.t.sol +0 -440
- package/test/regression/DuplicateUriFeeEvasion.t.sol +0 -312
- package/test/regression/FeeEvasion.t.sol +0 -286
- package/test/regression/StaleTierIdMapping.t.sol +0 -228
|
@@ -1,185 +0,0 @@
|
|
|
1
|
-
// SPDX-License-Identifier: MIT
|
|
2
|
-
pragma solidity 0.8.28;
|
|
3
|
-
|
|
4
|
-
// forge-lint: disable-next-line(unaliased-plain-import)
|
|
5
|
-
import "forge-std/Test.sol";
|
|
6
|
-
|
|
7
|
-
import {IERC721Receiver} from "@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol";
|
|
8
|
-
import {IJBPermissions} from "@bananapus/core-v6/src/interfaces/IJBPermissions.sol";
|
|
9
|
-
import {IJBProjects} from "@bananapus/core-v6/src/interfaces/IJBProjects.sol";
|
|
10
|
-
import {JBPermissionsData} from "@bananapus/core-v6/src/structs/JBPermissionsData.sol";
|
|
11
|
-
import {JBPermissionIds} from "@bananapus/permission-ids-v6/src/JBPermissionIds.sol";
|
|
12
|
-
|
|
13
|
-
import {CTProjectOwner} from "../src/CTProjectOwner.sol";
|
|
14
|
-
import {ICTPublisher} from "../src/interfaces/ICTPublisher.sol";
|
|
15
|
-
|
|
16
|
-
/// @notice Unit tests for CTProjectOwner.
|
|
17
|
-
contract CTProjectOwnerTest is Test {
|
|
18
|
-
CTProjectOwner projectOwner;
|
|
19
|
-
|
|
20
|
-
IJBPermissions permissions = IJBPermissions(makeAddr("permissions"));
|
|
21
|
-
IJBProjects projects = IJBProjects(makeAddr("projects"));
|
|
22
|
-
ICTPublisher publisher = ICTPublisher(makeAddr("publisher"));
|
|
23
|
-
|
|
24
|
-
address operator = makeAddr("operator");
|
|
25
|
-
address from = makeAddr("from");
|
|
26
|
-
|
|
27
|
-
function setUp() public {
|
|
28
|
-
projectOwner = new CTProjectOwner(permissions, projects, publisher);
|
|
29
|
-
|
|
30
|
-
// Mock setPermissionsFor to succeed by default.
|
|
31
|
-
vm.mockCall(
|
|
32
|
-
address(permissions), abi.encodeWithSelector(IJBPermissions.setPermissionsFor.selector), abi.encode()
|
|
33
|
-
);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
//*********************************************************************//
|
|
37
|
-
// --- Constructor --------------------------------------------------- //
|
|
38
|
-
//*********************************************************************//
|
|
39
|
-
|
|
40
|
-
/// @notice Verify that the constructor sets all three immutables correctly.
|
|
41
|
-
function test_constructor() public {
|
|
42
|
-
assertEq(address(projectOwner.PERMISSIONS()), address(permissions));
|
|
43
|
-
assertEq(address(projectOwner.PROJECTS()), address(projects));
|
|
44
|
-
assertEq(address(projectOwner.PUBLISHER()), address(publisher));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
//*********************************************************************//
|
|
48
|
-
// --- onERC721Received ---------------------------------------------- //
|
|
49
|
-
//*********************************************************************//
|
|
50
|
-
|
|
51
|
-
/// @notice When PROJECTS sends a project NFT, the contract grants ADJUST_721_TIERS permission to PUBLISHER and
|
|
52
|
-
/// returns the correct selector.
|
|
53
|
-
function test_onERC721Received_fromProjects_grantsPermission() public {
|
|
54
|
-
uint256 tokenId = 42;
|
|
55
|
-
|
|
56
|
-
// Build the expected arguments for setPermissionsFor.
|
|
57
|
-
uint8[] memory permissionIds = new uint8[](1);
|
|
58
|
-
permissionIds[0] = JBPermissionIds.ADJUST_721_TIERS;
|
|
59
|
-
|
|
60
|
-
vm.expectCall(
|
|
61
|
-
address(permissions),
|
|
62
|
-
abi.encodeCall(
|
|
63
|
-
IJBPermissions.setPermissionsFor,
|
|
64
|
-
(
|
|
65
|
-
address(projectOwner),
|
|
66
|
-
JBPermissionsData({
|
|
67
|
-
operator: address(publisher),
|
|
68
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
69
|
-
projectId: uint64(tokenId), // safe: mirrors CTProjectOwner.onERC721Received
|
|
70
|
-
permissionIds: permissionIds
|
|
71
|
-
})
|
|
72
|
-
)
|
|
73
|
-
)
|
|
74
|
-
);
|
|
75
|
-
|
|
76
|
-
// Call onERC721Received as if PROJECTS sent the NFT.
|
|
77
|
-
vm.prank(address(projects));
|
|
78
|
-
bytes4 retval = projectOwner.onERC721Received(operator, from, tokenId, "");
|
|
79
|
-
|
|
80
|
-
assertEq(retval, IERC721Receiver.onERC721Received.selector);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
/// @notice Calling onERC721Received from any address other than PROJECTS must revert.
|
|
84
|
-
function test_onERC721Received_fromNonProjects_reverts() public {
|
|
85
|
-
address notProjects = makeAddr("notProjects");
|
|
86
|
-
|
|
87
|
-
vm.prank(notProjects);
|
|
88
|
-
vm.expectRevert();
|
|
89
|
-
projectOwner.onERC721Received(operator, from, 1, "");
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/// @notice The permission is set with projectId equal to uint64(tokenId).
|
|
93
|
-
function test_onERC721Received_correctProjectId() public {
|
|
94
|
-
uint256 tokenId = type(uint64).max; // Use a large tokenId to confirm truncation.
|
|
95
|
-
|
|
96
|
-
uint8[] memory permissionIds = new uint8[](1);
|
|
97
|
-
permissionIds[0] = JBPermissionIds.ADJUST_721_TIERS;
|
|
98
|
-
|
|
99
|
-
vm.expectCall(
|
|
100
|
-
address(permissions),
|
|
101
|
-
abi.encodeCall(
|
|
102
|
-
IJBPermissions.setPermissionsFor,
|
|
103
|
-
(
|
|
104
|
-
address(projectOwner),
|
|
105
|
-
JBPermissionsData({
|
|
106
|
-
operator: address(publisher),
|
|
107
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
108
|
-
projectId: uint64(tokenId), // safe: mirrors CTProjectOwner.onERC721Received
|
|
109
|
-
permissionIds: permissionIds
|
|
110
|
-
})
|
|
111
|
-
)
|
|
112
|
-
)
|
|
113
|
-
);
|
|
114
|
-
|
|
115
|
-
vm.prank(address(projects));
|
|
116
|
-
projectOwner.onERC721Received(operator, from, tokenId, "");
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
/// @notice Transferring multiple different project NFTs sets permissions for each one independently.
|
|
120
|
-
function test_onERC721Received_multipleProjects() public {
|
|
121
|
-
uint256 tokenId1 = 10;
|
|
122
|
-
uint256 tokenId2 = 99;
|
|
123
|
-
|
|
124
|
-
uint8[] memory permissionIds = new uint8[](1);
|
|
125
|
-
permissionIds[0] = JBPermissionIds.ADJUST_721_TIERS;
|
|
126
|
-
|
|
127
|
-
// Expect the first call with tokenId1.
|
|
128
|
-
vm.expectCall(
|
|
129
|
-
address(permissions),
|
|
130
|
-
abi.encodeCall(
|
|
131
|
-
IJBPermissions.setPermissionsFor,
|
|
132
|
-
(
|
|
133
|
-
address(projectOwner),
|
|
134
|
-
JBPermissionsData({
|
|
135
|
-
operator: address(publisher),
|
|
136
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
137
|
-
projectId: uint64(tokenId1), // safe: mirrors CTProjectOwner.onERC721Received
|
|
138
|
-
permissionIds: permissionIds
|
|
139
|
-
})
|
|
140
|
-
)
|
|
141
|
-
)
|
|
142
|
-
);
|
|
143
|
-
|
|
144
|
-
vm.prank(address(projects));
|
|
145
|
-
bytes4 retval1 = projectOwner.onERC721Received(operator, from, tokenId1, "");
|
|
146
|
-
assertEq(retval1, IERC721Receiver.onERC721Received.selector);
|
|
147
|
-
|
|
148
|
-
// Expect the second call with tokenId2.
|
|
149
|
-
vm.expectCall(
|
|
150
|
-
address(permissions),
|
|
151
|
-
abi.encodeCall(
|
|
152
|
-
IJBPermissions.setPermissionsFor,
|
|
153
|
-
(
|
|
154
|
-
address(projectOwner),
|
|
155
|
-
JBPermissionsData({
|
|
156
|
-
operator: address(publisher),
|
|
157
|
-
// forge-lint: disable-next-line(unsafe-typecast)
|
|
158
|
-
projectId: uint64(tokenId2), // safe: mirrors CTProjectOwner.onERC721Received
|
|
159
|
-
permissionIds: permissionIds
|
|
160
|
-
})
|
|
161
|
-
)
|
|
162
|
-
)
|
|
163
|
-
);
|
|
164
|
-
|
|
165
|
-
vm.prank(address(projects));
|
|
166
|
-
bytes4 retval2 = projectOwner.onERC721Received(operator, from, tokenId2, "");
|
|
167
|
-
assertEq(retval2, IERC721Receiver.onERC721Received.selector);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
/// @notice Fuzz: any tokenId from PROJECTS succeeds and returns the correct selector.
|
|
171
|
-
function test_onERC721Received_fuzz(uint256 tokenId) public {
|
|
172
|
-
vm.prank(address(projects));
|
|
173
|
-
bytes4 retval = projectOwner.onERC721Received(operator, from, tokenId, "");
|
|
174
|
-
assertEq(retval, IERC721Receiver.onERC721Received.selector);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
/// @notice Fuzz: any non-PROJECTS sender reverts.
|
|
178
|
-
function test_onERC721Received_fuzz_nonProjects_reverts(address sender) public {
|
|
179
|
-
vm.assume(sender != address(projects));
|
|
180
|
-
|
|
181
|
-
vm.prank(sender);
|
|
182
|
-
vm.expectRevert();
|
|
183
|
-
projectOwner.onERC721Received(operator, from, 1, "");
|
|
184
|
-
}
|
|
185
|
-
}
|