@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.
Files changed (40) hide show
  1. package/README.md +2 -2
  2. package/foundry.toml +2 -1
  3. package/package.json +25 -13
  4. package/script/ConfigureFeeProject.s.sol +8 -5
  5. package/src/CTDeployer.sol +52 -51
  6. package/src/interfaces/ICTDeployer.sol +2 -2
  7. package/ADMINISTRATION.md +0 -94
  8. package/ARCHITECTURE.md +0 -96
  9. package/AUDIT_INSTRUCTIONS.md +0 -88
  10. package/RISKS.md +0 -78
  11. package/SKILLS.md +0 -46
  12. package/STYLE_GUIDE.md +0 -610
  13. package/USER_JOURNEYS.md +0 -134
  14. package/foundry.lock +0 -11
  15. package/slither-ci.config.json +0 -10
  16. package/sphinx.lock +0 -507
  17. package/test/CTDeployer.t.sol +0 -616
  18. package/test/CTProjectOwner.t.sol +0 -185
  19. package/test/CTPublisher.t.sol +0 -869
  20. package/test/ClaimCollectionOwnership.t.sol +0 -315
  21. package/test/CroptopAttacks.t.sol +0 -437
  22. package/test/Fork.t.sol +0 -227
  23. package/test/TestAuditGaps.sol +0 -696
  24. package/test/Test_MetadataGeneration.t.sol +0 -79
  25. package/test/audit/CodexNemesisCroptopPublisherBoundary.t.sol +0 -329
  26. package/test/audit/CodexNemesisCurrencyPoCs.t.sol +0 -371
  27. package/test/audit/CodexNemesisFreshRound.t.sol +0 -395
  28. package/test/audit/CodexNemesisMetadataShadow.t.sol +0 -196
  29. package/test/audit/CodexNemesisPoCs.t.sol +0 -263
  30. package/test/audit/CodexNemesisPolicyReuse.t.sol +0 -168
  31. package/test/audit/CodexNemesisUriDrift.t.sol +0 -252
  32. package/test/audit/DeployerPermissionBypass.t.sol +0 -213
  33. package/test/audit/EmptyPostFeeBypass.t.sol +0 -53
  34. package/test/audit/FeeBeneficiaryReentrancy.t.sol +0 -247
  35. package/test/audit/FeeFallbackBlackhole.t.sol +0 -263
  36. package/test/audit/Pass12Fixes.t.sol +0 -388
  37. package/test/fork/PublishFork.t.sol +0 -440
  38. package/test/regression/DuplicateUriFeeEvasion.t.sol +0 -312
  39. package/test/regression/FeeEvasion.t.sol +0 -286
  40. 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
- }