@croptop/core-v6 0.0.37 → 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/CTPublisher.sol +20 -5
  7. package/src/interfaces/ICTDeployer.sol +2 -2
  8. package/ADMINISTRATION.md +0 -94
  9. package/ARCHITECTURE.md +0 -96
  10. package/AUDIT_INSTRUCTIONS.md +0 -88
  11. package/RISKS.md +0 -78
  12. package/SKILLS.md +0 -46
  13. package/STYLE_GUIDE.md +0 -610
  14. package/USER_JOURNEYS.md +0 -134
  15. package/foundry.lock +0 -11
  16. package/slither-ci.config.json +0 -10
  17. package/sphinx.lock +0 -507
  18. package/test/CTDeployer.t.sol +0 -616
  19. package/test/CTProjectOwner.t.sol +0 -185
  20. package/test/CTPublisher.t.sol +0 -869
  21. package/test/ClaimCollectionOwnership.t.sol +0 -315
  22. package/test/CroptopAttacks.t.sol +0 -437
  23. package/test/Fork.t.sol +0 -227
  24. package/test/TestAuditGaps.sol +0 -696
  25. package/test/Test_MetadataGeneration.t.sol +0 -79
  26. package/test/audit/CodexNemesisCroptopPublisherBoundary.t.sol +0 -329
  27. package/test/audit/CodexNemesisCurrencyPoCs.t.sol +0 -371
  28. package/test/audit/CodexNemesisFreshRound.t.sol +0 -395
  29. package/test/audit/CodexNemesisMetadataShadow.t.sol +0 -203
  30. package/test/audit/CodexNemesisPoCs.t.sol +0 -263
  31. package/test/audit/CodexNemesisPolicyReuse.t.sol +0 -168
  32. package/test/audit/CodexNemesisUriDrift.t.sol +0 -252
  33. package/test/audit/DeployerPermissionBypass.t.sol +0 -213
  34. package/test/audit/EmptyPostFeeBypass.t.sol +0 -53
  35. package/test/audit/FeeBeneficiaryReentrancy.t.sol +0 -247
  36. package/test/audit/FeeFallbackBlackhole.t.sol +0 -263
  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 -218
@@ -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
- }