@croptop/core-v6 0.0.38 → 0.0.40

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