From bcbf20b87373ef8c8d3392defea13a5983ac4947 Mon Sep 17 00:00:00 2001 From: Conner Swenberg Date: Mon, 6 Oct 2025 15:01:00 -0500 Subject: [PATCH 1/4] Fix build warnings --- foundry.toml | 7 ++- src/BuilderCodes.sol | 37 +++++++------- test/lib/BuilderCodesTest.sol | 2 +- test/unit/BuilderCodes/contractURI.t.sol | 22 +++----- test/unit/BuilderCodes/hasRole.t.sol | 2 +- test/unit/BuilderCodes/isRegistered.t.sol | 25 +++------ test/unit/BuilderCodes/isValidCode.t.sol | 51 +++++-------------- test/unit/BuilderCodes/payoutAddress.t.sol | 40 +++++---------- test/unit/BuilderCodes/register.t.sol | 1 - .../BuilderCodes/registerWithSignature.t.sol | 3 +- .../unit/BuilderCodes/supportsInterface.t.sol | 10 ++-- test/unit/BuilderCodes/toCode.t.sol | 24 +++------ test/unit/BuilderCodes/toTokenId.t.sol | 25 +++------ test/unit/BuilderCodes/tokenURI.t.sol | 4 +- 14 files changed, 91 insertions(+), 162 deletions(-) diff --git a/foundry.toml b/foundry.toml index 180dff2..81b8c13 100644 --- a/foundry.toml +++ b/foundry.toml @@ -17,4 +17,9 @@ optimizer_runs = 100000 # Generate skimmable test docs with command: make docs-test [profile.testdocs] -src = "test" \ No newline at end of file +src = "test" + +[lint] +lint_on_build = false +ignore = ["test/**"] +exclude_lints = ["mixed-case-variable", "mixed-case-function", "asm-keccak256"] \ No newline at end of file diff --git a/src/BuilderCodes.sol b/src/BuilderCodes.sol index 77194c0..8c64769 100644 --- a/src/BuilderCodes.sol +++ b/src/BuilderCodes.sol @@ -121,26 +121,26 @@ contract BuilderCodes is /// /// @param code Custom builder code for the builder code /// @param initialOwner Owner of the builder code - /// @param payoutAddress Default payout address for all chains - function register(string memory code, address initialOwner, address payoutAddress) + /// @param initialPayoutAddress Default payout address for all chains + function register(string memory code, address initialOwner, address initialPayoutAddress) external onlyRole(REGISTER_ROLE) { - _register(code, initialOwner, payoutAddress); + _register(code, initialOwner, initialPayoutAddress); } /// @notice Registers a new referral code in the system with a signature /// /// @param code Custom builder code for the builder code /// @param initialOwner Owner of the builder code - /// @param payoutAddress Default payout address for all chains + /// @param initialPayoutAddress Default payout address for all chains /// @param deadline Deadline to submit the registration /// @param registrar Address of the registrar /// @param signature Signature of the registrar function registerWithSignature( string memory code, address initialOwner, - address payoutAddress, + address initialPayoutAddress, uint48 deadline, address registrar, bytes memory signature @@ -153,12 +153,12 @@ contract BuilderCodes is // Check signature is valid bytes32 structHash = - keccak256(abi.encode(REGISTRATION_TYPEHASH, keccak256(bytes(code)), initialOwner, payoutAddress, deadline)); + keccak256(abi.encode(REGISTRATION_TYPEHASH, keccak256(bytes(code)), initialOwner, initialPayoutAddress, deadline)); if (!SignatureCheckerLib.isValidSignatureNow(registrar, _hashTypedData(structHash), signature)) { revert Unauthorized(); } - _register(code, initialOwner, payoutAddress); + _register(code, initialOwner, initialPayoutAddress); } /// @inheritdoc ERC721Upgradeable @@ -167,6 +167,7 @@ contract BuilderCodes is /// @dev ERC721Upgradeable.safeTransferFrom inherits this function (and no other functions can initiate transfers) function transferFrom(address from, address to, uint256 tokenId) public override(ERC721Upgradeable, IERC721) { _checkRole(TRANSFER_ROLE, msg.sender); + // test super.transferFrom(from, to, tokenId); } @@ -190,12 +191,12 @@ contract BuilderCodes is /// @notice Updates the default payout address for a referral code /// /// @param code Builder code - /// @param payoutAddress New default payout address + /// @param initialPayoutAddress New default payout address /// @dev Only callable by referral code owner - function updatePayoutAddress(string memory code, address payoutAddress) external { + function updatePayoutAddress(string memory code, address initialPayoutAddress) external { uint256 tokenId = toTokenId(code); if (_requireOwned(tokenId) != msg.sender) revert Unauthorized(); - _updatePayoutAddress(tokenId, payoutAddress); + _updatePayoutAddress(tokenId, initialPayoutAddress); } /// @notice Gets the default payout address for a referral code @@ -329,22 +330,22 @@ contract BuilderCodes is /// /// @param code Referral code /// @param initialOwner Owner of the ref code - /// @param payoutAddress Default payout address for all chains - function _register(string memory code, address initialOwner, address payoutAddress) internal { + /// @param initialPayoutAddress Default payout address for all chains + function _register(string memory code, address initialOwner, address initialPayoutAddress) internal { uint256 tokenId = toTokenId(code); _mint(initialOwner, tokenId); emit CodeRegistered(tokenId, code); - _updatePayoutAddress(tokenId, payoutAddress); + _updatePayoutAddress(tokenId, initialPayoutAddress); } /// @notice Registers a new referral code /// /// @param tokenId Token ID of the referral code - /// @param payoutAddress Default payout address for all chains - function _updatePayoutAddress(uint256 tokenId, address payoutAddress) internal { - if (payoutAddress == address(0)) revert ZeroAddress(); - _getRegistryStorage().payoutAddresses[tokenId] = payoutAddress; - emit PayoutAddressUpdated(tokenId, payoutAddress); + /// @param initialPayoutAddress Default payout address for all chains + function _updatePayoutAddress(uint256 tokenId, address initialPayoutAddress) internal { + if (initialPayoutAddress == address(0)) revert ZeroAddress(); + _getRegistryStorage().payoutAddresses[tokenId] = initialPayoutAddress; + emit PayoutAddressUpdated(tokenId, initialPayoutAddress); } /// @notice Authorization for upgrades diff --git a/test/lib/BuilderCodesTest.sol b/test/lib/BuilderCodesTest.sol index 0da8580..dd36164 100644 --- a/test/lib/BuilderCodesTest.sol +++ b/test/lib/BuilderCodesTest.sol @@ -51,7 +51,7 @@ abstract contract BuilderCodesTest is Test { /// @param seed Random number to seed the invalid code generation /// /// @return code Invalid code containing disallowed characters - function _generateInvalidCode(uint256 seed) internal view returns (string memory code) { + function _generateInvalidCode(uint256 seed) internal pure returns (string memory code) { uint256 length = seed % 32 + 1; // 1-32 characters string memory invalidCharacters = "!@#$%^&*()ABCDEFGHIJKLMNOPQRSTUVWXYZ"; return _generateCode(seed, length, invalidCharacters); diff --git a/test/unit/BuilderCodes/contractURI.t.sol b/test/unit/BuilderCodes/contractURI.t.sol index f66e83a..59bbce7 100644 --- a/test/unit/BuilderCodes/contractURI.t.sol +++ b/test/unit/BuilderCodes/contractURI.t.sol @@ -7,11 +7,9 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.contractURI contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI returns correct URI when base URI is set - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_contractURI_success_returnsCorrectURIWithBaseURI(address initialOwner, address initialPayoutAddress) + function test_contractURI_success_returnsCorrectURIWithBaseURI(address /* initialOwner */, address /* initialPayoutAddress */) public + view { // The builderCodes contract is already initialized with URI_PREFIX string memory contractURI = builderCodes.contractURI(); @@ -21,11 +19,9 @@ contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI returns empty string when base URI is not set /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_contractURI_success_returnsEmptyStringWithoutBaseURI( address initialOwner, - address initialPayoutAddress + address /* initialPayoutAddress */ ) public { initialOwner = _boundNonZeroAddress(initialOwner); BuilderCodes freshContract = _deployFreshBuilderCodes(); @@ -38,12 +34,10 @@ contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI reflects updated base URI /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address /// @param newBaseURI The new base URI function test_contractURI_success_reflectsUpdatedBaseURI( - address initialOwner, - address initialPayoutAddress, + address /* initialOwner */, + address /* initialPayoutAddress */, string memory newBaseURI ) public { // Update base URI using owner permissions @@ -61,12 +55,10 @@ contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI returns contractURI.json suffix /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address /// @param baseURI The base URI function test_contractURI_success_returnsWithCorrectSuffix( - address initialOwner, - address initialPayoutAddress, + address /* initialOwner */, + address /* initialPayoutAddress */, string memory baseURI ) public { vm.assume(bytes(baseURI).length > 0); diff --git a/test/unit/BuilderCodes/hasRole.t.sol b/test/unit/BuilderCodes/hasRole.t.sol index 415c715..ba4f11d 100644 --- a/test/unit/BuilderCodes/hasRole.t.sol +++ b/test/unit/BuilderCodes/hasRole.t.sol @@ -8,7 +8,7 @@ contract HasRoleTest is BuilderCodesTest { /// @notice Test that the owner has any role /// /// @param role The role to check - function test_hasRole_true_isOwner(bytes32 role) public { + function test_hasRole_true_isOwner(bytes32 role) public view { assertTrue(builderCodes.hasRole(role, owner)); } diff --git a/test/unit/BuilderCodes/isRegistered.t.sol b/test/unit/BuilderCodes/isRegistered.t.sol index c925247..5916d2e 100644 --- a/test/unit/BuilderCodes/isRegistered.t.sol +++ b/test/unit/BuilderCodes/isRegistered.t.sol @@ -7,10 +7,7 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.isRegistered contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered reverts when code is empty - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isRegistered_revert_emptyCode(address initialOwner, address initialPayoutAddress) public { + function test_isRegistered_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.isRegistered(""); } @@ -18,12 +15,10 @@ contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered reverts when code is over 32 characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_isRegistered_revert_codeOver32Characters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { string memory longCode = _generateLongCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, longCode)); @@ -33,12 +28,10 @@ contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered reverts when code contains invalid characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_isRegistered_revert_codeContainsInvalidCharacters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { string memory invalidCode = _generateInvalidCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, invalidCode)); @@ -48,13 +41,11 @@ contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered returns false for unregistered valid code /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_isRegistered_success_returnsFalseForUnregistered( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress - ) public { + address /* initialOwner */, + address /* initialPayoutAddress */ + ) public view { string memory validCode = _generateValidCode(codeSeed); assertFalse(builderCodes.isRegistered(validCode)); } diff --git a/test/unit/BuilderCodes/isValidCode.t.sol b/test/unit/BuilderCodes/isValidCode.t.sol index 2ea137b..e4f04c9 100644 --- a/test/unit/BuilderCodes/isValidCode.t.sol +++ b/test/unit/BuilderCodes/isValidCode.t.sol @@ -6,23 +6,18 @@ import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; /// @notice Unit tests for BuilderCodes.isValidCode contract IsValidCodeTest is BuilderCodesTest { /// @notice Test that isValidCode returns false for empty code - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isValidCode_false_emptyCode(address initialOwner, address initialPayoutAddress) public { + function test_isValidCode_false_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public view { assertFalse(builderCodes.isValidCode("")); } /// @notice Test that isValidCode returns false for code over 32 characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_isValidCode_false_codeOver32Characters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress - ) public { + address /* initialOwner */, + address /* initialPayoutAddress */ + ) public view { string memory longCode = _generateLongCode(codeSeed); assertFalse(builderCodes.isValidCode(longCode)); } @@ -30,13 +25,11 @@ contract IsValidCodeTest is BuilderCodesTest { /// @notice Test that isValidCode returns false for code with invalid characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_isValidCode_false_invalidCharacters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress - ) public { + address /* initialOwner */, + address /* initialPayoutAddress */ + ) public view { string memory invalidCode = _generateInvalidCode(codeSeed); assertFalse(builderCodes.isValidCode(invalidCode)); } @@ -44,56 +37,40 @@ contract IsValidCodeTest is BuilderCodesTest { /// @notice Test that isValidCode returns true for valid code /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isValidCode_true_validCode(uint256 codeSeed, address initialOwner, address initialPayoutAddress) + function test_isValidCode_true_validCode(uint256 codeSeed, address /* initialOwner */, address /* initialPayoutAddress */) public + view { string memory validCode = _generateValidCode(codeSeed); assertTrue(builderCodes.isValidCode(validCode)); } /// @notice Test that isValidCode returns true for single character valid code - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isValidCode_true_singleCharacter(address initialOwner, address initialPayoutAddress) public { + function test_isValidCode_true_singleCharacter(address /* initialOwner */, address /* initialPayoutAddress */) public view { assertTrue(builderCodes.isValidCode("a")); assertTrue(builderCodes.isValidCode("0")); assertTrue(builderCodes.isValidCode("_")); } /// @notice Test that isValidCode returns true for 32 character valid code - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isValidCode_true_32Characters(address initialOwner, address initialPayoutAddress) public { + function test_isValidCode_true_32Characters(address /* initialOwner */, address /* initialPayoutAddress */) public view { string memory code32 = "abcdefghijklmnopqrstuvwxyz012345"; assertTrue(builderCodes.isValidCode(code32)); } /// @notice Test that isValidCode returns true for code with underscores - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isValidCode_true_underscores(address initialOwner, address initialPayoutAddress) public { + function test_isValidCode_true_underscores(address /* initialOwner */, address /* initialPayoutAddress */) public view { assertTrue(builderCodes.isValidCode("test_code")); assertTrue(builderCodes.isValidCode("_underscore_")); } /// @notice Test that isValidCode returns true for numeric only code - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isValidCode_true_numericOnly(address initialOwner, address initialPayoutAddress) public { + function test_isValidCode_true_numericOnly(address /* initialOwner */, address /* initialPayoutAddress */) public view { assertTrue(builderCodes.isValidCode("1234567890")); } /// @notice Test that isValidCode returns true for alphabetic only code - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_isValidCode_true_alphabeticOnly(address initialOwner, address initialPayoutAddress) public { + function test_isValidCode_true_alphabeticOnly(address /* initialOwner */, address /* initialPayoutAddress */) public view { assertTrue(builderCodes.isValidCode("abcdefghijklmnopqrstuvwxyz")); } } diff --git a/test/unit/BuilderCodes/payoutAddress.t.sol b/test/unit/BuilderCodes/payoutAddress.t.sol index 9087651..7f1474c 100644 --- a/test/unit/BuilderCodes/payoutAddress.t.sol +++ b/test/unit/BuilderCodes/payoutAddress.t.sol @@ -9,12 +9,10 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(string) reverts when code is not registered /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_payoutAddressString_revert_unregistered( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { string memory code = _generateValidCode(codeSeed); @@ -23,10 +21,7 @@ contract PayoutAddressTest is BuilderCodesTest { } /// @notice Test that payoutAddress(string) reverts when code is empty - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_payoutAddressString_revert_emptyCode(address initialOwner, address initialPayoutAddress) public { + function test_payoutAddressString_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.payoutAddress(""); } @@ -34,12 +29,10 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(string) reverts when code is over 32 characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_payoutAddressString_revert_codeOver32Characters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { string memory longCode = _generateLongCode(codeSeed); @@ -50,12 +43,10 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(string) reverts when code contains invalid characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_payoutAddressString_revert_codeContainsInvalidCharacters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { string memory invalidCode = _generateInvalidCode(codeSeed); @@ -66,12 +57,10 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(uint256) reverts when token ID is not registered /// /// @param tokenId The token ID - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_payoutAddressUint256_revert_unregistered( uint256 tokenId, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { // Generate a valid token ID but don't register it string memory code = _generateValidCode(tokenId); @@ -82,10 +71,7 @@ contract PayoutAddressTest is BuilderCodesTest { } /// @notice Test that payoutAddress(uint256) reverts when token ID represents empty code - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_payoutAddressUint256_revert_emptyCode(address initialOwner, address initialPayoutAddress) public { + function test_payoutAddressUint256_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { uint256 emptyTokenId = 0; vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); @@ -95,12 +81,10 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(uint256) reverts when token ID represents code with invalid characters /// /// @param codeSeed The token ID representing invalid code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_payoutAddressUint256_revert_codeContainsInvalidCharacters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { // Use an invalid token ID that doesn't normalize properly string memory invalidCode = _generateInvalidCode(codeSeed); diff --git a/test/unit/BuilderCodes/register.t.sol b/test/unit/BuilderCodes/register.t.sol index 30ea9e3..0834690 100644 --- a/test/unit/BuilderCodes/register.t.sol +++ b/test/unit/BuilderCodes/register.t.sol @@ -129,7 +129,6 @@ contract RegisterTest is BuilderCodesTest { payoutAddress = _boundNonZeroAddress(payoutAddress); string memory code = _generateValidCode(codeSeed); - uint256 tokenId = builderCodes.toTokenId(code); // Register the code first vm.prank(registrar); diff --git a/test/unit/BuilderCodes/registerWithSignature.t.sol b/test/unit/BuilderCodes/registerWithSignature.t.sol index 211676f..96e7c73 100644 --- a/test/unit/BuilderCodes/registerWithSignature.t.sol +++ b/test/unit/BuilderCodes/registerWithSignature.t.sol @@ -92,12 +92,11 @@ contract RegisterWithSignatureTest is BuilderCodesTest { /// @notice Test that registerWithSignature reverts when attempting to register an empty code /// - /// @param codeSeed The seed for generating the code /// @param initialOwner The initial owner address /// @param payoutAddress The payout address /// @param deadline The registration deadline function test_registerWithSignature_revert_emptyCode( - uint256 codeSeed, + uint256 /* codeSeed */, address initialOwner, address payoutAddress, uint48 deadline diff --git a/test/unit/BuilderCodes/supportsInterface.t.sol b/test/unit/BuilderCodes/supportsInterface.t.sol index 97d6c06..351cc44 100644 --- a/test/unit/BuilderCodes/supportsInterface.t.sol +++ b/test/unit/BuilderCodes/supportsInterface.t.sol @@ -6,29 +6,29 @@ import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; /// @notice Unit tests for BuilderCodes.supportsInterface contract SupportsInterfaceTest is BuilderCodesTest { /// @notice Test that supportsInterface returns true for ERC165 - function test_supportsInterface_true_ERC165() public { + function test_supportsInterface_true_ERC165() public view { assertTrue(builderCodes.supportsInterface(0x01ffc9a7)); // ERC165 interface ID } /// @notice Test that supportsInterface returns true for ERC721 - function test_supportsInterface_true_ERC721() public { + function test_supportsInterface_true_ERC721() public view { assertTrue(builderCodes.supportsInterface(0x80ac58cd)); // ERC721 interface ID } /// @notice Test that supportsInterface returns true for ERC4906 - function test_supportsInterface_true_ERC4906() public { + function test_supportsInterface_true_ERC4906() public view { assertTrue(builderCodes.supportsInterface(0x49064906)); // ERC4906 interface ID } /// @notice Test that supportsInterface returns true for AccessControl - function test_supportsInterface_true_AccessControl() public { + function test_supportsInterface_true_AccessControl() public view { assertTrue(builderCodes.supportsInterface(0x7965db0b)); // AccessControl interface ID } /// @notice Test that supportsInterface returns false for unsupported interfaces /// /// @param interfaceId The interface ID to test - function test_supportsInterface_false_other(bytes4 interfaceId) public { + function test_supportsInterface_false_other(bytes4 interfaceId) public view { // Filter out known supported interface IDs vm.assume(interfaceId != 0x01ffc9a7); // ERC165 vm.assume(interfaceId != 0x80ac58cd); // ERC721 diff --git a/test/unit/BuilderCodes/toCode.t.sol b/test/unit/BuilderCodes/toCode.t.sol index fb90f87..31b8a4f 100644 --- a/test/unit/BuilderCodes/toCode.t.sol +++ b/test/unit/BuilderCodes/toCode.t.sol @@ -10,9 +10,7 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; contract ToCodeTest is BuilderCodesTest { /// @notice Test that toCode reverts when token ID represents empty code /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_toCode_revert_emptyCode(address initialOwner, address initialPayoutAddress) public { + function test_toCode_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { uint256 emptyTokenId = 0; vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.toCode(emptyTokenId); @@ -21,12 +19,10 @@ contract ToCodeTest is BuilderCodesTest { /// @notice Test that toCode reverts when token ID represents code with invalid characters /// /// @param tokenId The token ID representing invalid code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_toCode_revert_codeContainsInvalidCharacters( uint256 tokenId, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { // Use a token ID that would convert to invalid characters string memory invalidCode = _generateInvalidCode(tokenId); @@ -37,13 +33,11 @@ contract ToCodeTest is BuilderCodesTest { /// @notice Test that toCode reverts when token ID does not normalize properly /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address /// @param seed The seed for generating the valid code /// @param zeroCharacter The character position to zero out function test_toCode_revert_invalidNormalization( - address initialOwner, - address initialPayoutAddress, + address /* initialOwner */, + address /* initialPayoutAddress */, uint256 seed, uint8 zeroCharacter ) public { @@ -59,13 +53,11 @@ contract ToCodeTest is BuilderCodesTest { /// @notice Test that toCode returns correct code for valid token ID /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_toCode_success_returnsCorrectCode( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress - ) public { + address /* initialOwner */, + address /* initialPayoutAddress */ + ) public view { string memory validCode = _generateValidCode(codeSeed); uint256 tokenId = builderCodes.toTokenId(validCode); diff --git a/test/unit/BuilderCodes/toTokenId.t.sol b/test/unit/BuilderCodes/toTokenId.t.sol index 22ca02f..887538a 100644 --- a/test/unit/BuilderCodes/toTokenId.t.sol +++ b/test/unit/BuilderCodes/toTokenId.t.sol @@ -7,10 +7,7 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.toTokenId contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId reverts when code is empty - /// - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_toTokenId_revert_emptyCode(address initialOwner, address initialPayoutAddress) public { + function test_toTokenId_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.toTokenId(""); } @@ -18,12 +15,10 @@ contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId reverts when code is over 32 characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_toTokenId_revert_codeOver32Characters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { string memory longCode = _generateLongCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, longCode)); @@ -33,12 +28,10 @@ contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId reverts when code contains invalid characters /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_toTokenId_revert_codeContainsInvalidCharacters( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress + address /* initialOwner */, + address /* initialPayoutAddress */ ) public { string memory invalidCode = _generateInvalidCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, invalidCode)); @@ -48,13 +41,11 @@ contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId returns correct token ID for valid code /// /// @param codeSeed The seed for generating the code - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address function test_toTokenId_success_returnsCorrectTokenId( uint256 codeSeed, - address initialOwner, - address initialPayoutAddress - ) public { + address /* initialOwner */, + address /* initialPayoutAddress */ + ) public view { string memory validCode = _generateValidCode(codeSeed); uint256 tokenId = builderCodes.toTokenId(validCode); diff --git a/test/unit/BuilderCodes/tokenURI.t.sol b/test/unit/BuilderCodes/tokenURI.t.sol index c4d948f..87d29cb 100644 --- a/test/unit/BuilderCodes/tokenURI.t.sol +++ b/test/unit/BuilderCodes/tokenURI.t.sol @@ -9,9 +9,7 @@ contract TokenURITest is BuilderCodesTest { /// @notice Test that tokenURI reverts when token ID does not exist /// /// @param tokenId The token ID - /// @param initialOwner The initial owner address - /// @param initialPayoutAddress The initial payout address - function test_tokenURI_revert_tokenDoesNotExist(uint256 tokenId, address initialOwner, address initialPayoutAddress) + function test_tokenURI_revert_tokenDoesNotExist(uint256 tokenId, address /* initialOwner */, address /* initialPayoutAddress */) public { // Ensure the token ID is not registered by trying a random high value From 38d38e16141e5be4e2627bb90a3b98c7a8c40ebc Mon Sep 17 00:00:00 2001 From: Conner Swenberg Date: Mon, 6 Oct 2025 15:41:43 -0500 Subject: [PATCH 2/4] Clean up formatting --- foundry.toml | 7 ++-- src/BuilderCodes.sol | 23 +++++++------ test/unit/BuilderCodes/contractURI.t.sol | 22 +++--------- test/unit/BuilderCodes/isRegistered.t.sol | 20 +++-------- test/unit/BuilderCodes/isValidCode.t.sol | 29 +++++----------- test/unit/BuilderCodes/payoutAddress.t.sol | 34 ++++--------------- .../BuilderCodes/registerWithSignature.t.sol | 9 ++--- test/unit/BuilderCodes/toCode.t.sol | 21 +++--------- test/unit/BuilderCodes/toTokenId.t.sol | 20 +++-------- test/unit/BuilderCodes/tokenURI.t.sol | 4 +-- 10 files changed, 53 insertions(+), 136 deletions(-) diff --git a/foundry.toml b/foundry.toml index 81b8c13..96c0ac9 100644 --- a/foundry.toml +++ b/foundry.toml @@ -21,5 +21,8 @@ src = "test" [lint] lint_on_build = false -ignore = ["test/**"] -exclude_lints = ["mixed-case-variable", "mixed-case-function", "asm-keccak256"] \ No newline at end of file +exclude_lints = [ + "mixed-case-variable", # *URI variable names + "mixed-case-function", # *URI function names + "asm-keccak256" # EIP-712 hashing +] \ No newline at end of file diff --git a/src/BuilderCodes.sol b/src/BuilderCodes.sol index 8c64769..c5226b1 100644 --- a/src/BuilderCodes.sol +++ b/src/BuilderCodes.sol @@ -68,7 +68,7 @@ contract BuilderCodes is /// @notice Emitted when a publisher's default payout address is updated /// /// @param tokenId Token ID of the referral code - /// @param payoutAddress New default payout address for all chains + /// @param payoutAddress New default payout address event PayoutAddressUpdated(uint256 indexed tokenId, address payoutAddress); /// @notice Emits when the contract URI is updated (ERC-7572) @@ -121,7 +121,7 @@ contract BuilderCodes is /// /// @param code Custom builder code for the builder code /// @param initialOwner Owner of the builder code - /// @param initialPayoutAddress Default payout address for all chains + /// @param initialPayoutAddress Default payout address function register(string memory code, address initialOwner, address initialPayoutAddress) external onlyRole(REGISTER_ROLE) @@ -133,7 +133,7 @@ contract BuilderCodes is /// /// @param code Custom builder code for the builder code /// @param initialOwner Owner of the builder code - /// @param initialPayoutAddress Default payout address for all chains + /// @param initialPayoutAddress Default payout address /// @param deadline Deadline to submit the registration /// @param registrar Address of the registrar /// @param signature Signature of the registrar @@ -152,8 +152,9 @@ contract BuilderCodes is _checkRole(REGISTER_ROLE, registrar); // Check signature is valid - bytes32 structHash = - keccak256(abi.encode(REGISTRATION_TYPEHASH, keccak256(bytes(code)), initialOwner, initialPayoutAddress, deadline)); + bytes32 structHash = keccak256( + abi.encode(REGISTRATION_TYPEHASH, keccak256(bytes(code)), initialOwner, initialPayoutAddress, deadline) + ); if (!SignatureCheckerLib.isValidSignatureNow(registrar, _hashTypedData(structHash), signature)) { revert Unauthorized(); } @@ -330,7 +331,7 @@ contract BuilderCodes is /// /// @param code Referral code /// @param initialOwner Owner of the ref code - /// @param initialPayoutAddress Default payout address for all chains + /// @param initialPayoutAddress Default payout address function _register(string memory code, address initialOwner, address initialPayoutAddress) internal { uint256 tokenId = toTokenId(code); _mint(initialOwner, tokenId); @@ -341,11 +342,11 @@ contract BuilderCodes is /// @notice Registers a new referral code /// /// @param tokenId Token ID of the referral code - /// @param initialPayoutAddress Default payout address for all chains - function _updatePayoutAddress(uint256 tokenId, address initialPayoutAddress) internal { - if (initialPayoutAddress == address(0)) revert ZeroAddress(); - _getRegistryStorage().payoutAddresses[tokenId] = initialPayoutAddress; - emit PayoutAddressUpdated(tokenId, initialPayoutAddress); + /// @param newPayoutAddress New payout address + function _updatePayoutAddress(uint256 tokenId, address newPayoutAddress) internal { + if (newPayoutAddress == address(0)) revert ZeroAddress(); + _getRegistryStorage().payoutAddresses[tokenId] = newPayoutAddress; + emit PayoutAddressUpdated(tokenId, newPayoutAddress); } /// @notice Authorization for upgrades diff --git a/test/unit/BuilderCodes/contractURI.t.sol b/test/unit/BuilderCodes/contractURI.t.sol index 59bbce7..cba9733 100644 --- a/test/unit/BuilderCodes/contractURI.t.sol +++ b/test/unit/BuilderCodes/contractURI.t.sol @@ -7,10 +7,7 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.contractURI contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI returns correct URI when base URI is set - function test_contractURI_success_returnsCorrectURIWithBaseURI(address /* initialOwner */, address /* initialPayoutAddress */) - public - view - { + function test_contractURI_success_returnsCorrectURIWithBaseURI() public view { // The builderCodes contract is already initialized with URI_PREFIX string memory contractURI = builderCodes.contractURI(); string memory expected = string.concat(URI_PREFIX, "contractURI.json"); @@ -19,10 +16,7 @@ contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI returns empty string when base URI is not set /// - function test_contractURI_success_returnsEmptyStringWithoutBaseURI( - address initialOwner, - address /* initialPayoutAddress */ - ) public { + function test_contractURI_success_returnsEmptyStringWithoutBaseURI(address initialOwner) public { initialOwner = _boundNonZeroAddress(initialOwner); BuilderCodes freshContract = _deployFreshBuilderCodes(); @@ -35,11 +29,7 @@ contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI reflects updated base URI /// /// @param newBaseURI The new base URI - function test_contractURI_success_reflectsUpdatedBaseURI( - address /* initialOwner */, - address /* initialPayoutAddress */, - string memory newBaseURI - ) public { + function test_contractURI_success_reflectsUpdatedBaseURI(string memory newBaseURI) public { // Update base URI using owner permissions vm.prank(owner); builderCodes.updateBaseURI(newBaseURI); @@ -56,11 +46,7 @@ contract ContractURITest is BuilderCodesTest { /// @notice Test that contractURI returns contractURI.json suffix /// /// @param baseURI The base URI - function test_contractURI_success_returnsWithCorrectSuffix( - address /* initialOwner */, - address /* initialPayoutAddress */, - string memory baseURI - ) public { + function test_contractURI_success_returnsWithCorrectSuffix(string memory baseURI) public { vm.assume(bytes(baseURI).length > 0); vm.prank(owner); diff --git a/test/unit/BuilderCodes/isRegistered.t.sol b/test/unit/BuilderCodes/isRegistered.t.sol index 5916d2e..35fb3e7 100644 --- a/test/unit/BuilderCodes/isRegistered.t.sol +++ b/test/unit/BuilderCodes/isRegistered.t.sol @@ -7,7 +7,7 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.isRegistered contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered reverts when code is empty - function test_isRegistered_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { + function test_isRegistered_revert_emptyCode() public { vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.isRegistered(""); } @@ -15,11 +15,7 @@ contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered reverts when code is over 32 characters /// /// @param codeSeed The seed for generating the code - function test_isRegistered_revert_codeOver32Characters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_isRegistered_revert_codeOver32Characters(uint256 codeSeed) public { string memory longCode = _generateLongCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, longCode)); builderCodes.isRegistered(longCode); @@ -28,11 +24,7 @@ contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered reverts when code contains invalid characters /// /// @param codeSeed The seed for generating the code - function test_isRegistered_revert_codeContainsInvalidCharacters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_isRegistered_revert_codeContainsInvalidCharacters(uint256 codeSeed) public { string memory invalidCode = _generateInvalidCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, invalidCode)); builderCodes.isRegistered(invalidCode); @@ -41,11 +33,7 @@ contract IsRegisteredTest is BuilderCodesTest { /// @notice Test that isRegistered returns false for unregistered valid code /// /// @param codeSeed The seed for generating the code - function test_isRegistered_success_returnsFalseForUnregistered( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public view { + function test_isRegistered_success_returnsFalseForUnregistered(uint256 codeSeed) public view { string memory validCode = _generateValidCode(codeSeed); assertFalse(builderCodes.isRegistered(validCode)); } diff --git a/test/unit/BuilderCodes/isValidCode.t.sol b/test/unit/BuilderCodes/isValidCode.t.sol index e4f04c9..05396c8 100644 --- a/test/unit/BuilderCodes/isValidCode.t.sol +++ b/test/unit/BuilderCodes/isValidCode.t.sol @@ -6,18 +6,14 @@ import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; /// @notice Unit tests for BuilderCodes.isValidCode contract IsValidCodeTest is BuilderCodesTest { /// @notice Test that isValidCode returns false for empty code - function test_isValidCode_false_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public view { + function test_isValidCode_false_emptyCode() public view { assertFalse(builderCodes.isValidCode("")); } /// @notice Test that isValidCode returns false for code over 32 characters /// /// @param codeSeed The seed for generating the code - function test_isValidCode_false_codeOver32Characters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public view { + function test_isValidCode_false_codeOver32Characters(uint256 codeSeed) public view { string memory longCode = _generateLongCode(codeSeed); assertFalse(builderCodes.isValidCode(longCode)); } @@ -25,11 +21,7 @@ contract IsValidCodeTest is BuilderCodesTest { /// @notice Test that isValidCode returns false for code with invalid characters /// /// @param codeSeed The seed for generating the code - function test_isValidCode_false_invalidCharacters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public view { + function test_isValidCode_false_invalidCharacters(uint256 codeSeed) public view { string memory invalidCode = _generateInvalidCode(codeSeed); assertFalse(builderCodes.isValidCode(invalidCode)); } @@ -37,40 +29,37 @@ contract IsValidCodeTest is BuilderCodesTest { /// @notice Test that isValidCode returns true for valid code /// /// @param codeSeed The seed for generating the code - function test_isValidCode_true_validCode(uint256 codeSeed, address /* initialOwner */, address /* initialPayoutAddress */) - public - view - { + function test_isValidCode_true_validCode(uint256 codeSeed) public view { string memory validCode = _generateValidCode(codeSeed); assertTrue(builderCodes.isValidCode(validCode)); } /// @notice Test that isValidCode returns true for single character valid code - function test_isValidCode_true_singleCharacter(address /* initialOwner */, address /* initialPayoutAddress */) public view { + function test_isValidCode_true_singleCharacter() public view { assertTrue(builderCodes.isValidCode("a")); assertTrue(builderCodes.isValidCode("0")); assertTrue(builderCodes.isValidCode("_")); } /// @notice Test that isValidCode returns true for 32 character valid code - function test_isValidCode_true_32Characters(address /* initialOwner */, address /* initialPayoutAddress */) public view { + function test_isValidCode_true_32Characters() public view { string memory code32 = "abcdefghijklmnopqrstuvwxyz012345"; assertTrue(builderCodes.isValidCode(code32)); } /// @notice Test that isValidCode returns true for code with underscores - function test_isValidCode_true_underscores(address /* initialOwner */, address /* initialPayoutAddress */) public view { + function test_isValidCode_true_underscores() public view { assertTrue(builderCodes.isValidCode("test_code")); assertTrue(builderCodes.isValidCode("_underscore_")); } /// @notice Test that isValidCode returns true for numeric only code - function test_isValidCode_true_numericOnly(address /* initialOwner */, address /* initialPayoutAddress */) public view { + function test_isValidCode_true_numericOnly() public view { assertTrue(builderCodes.isValidCode("1234567890")); } /// @notice Test that isValidCode returns true for alphabetic only code - function test_isValidCode_true_alphabeticOnly(address /* initialOwner */, address /* initialPayoutAddress */) public view { + function test_isValidCode_true_alphabeticOnly() public view { assertTrue(builderCodes.isValidCode("abcdefghijklmnopqrstuvwxyz")); } } diff --git a/test/unit/BuilderCodes/payoutAddress.t.sol b/test/unit/BuilderCodes/payoutAddress.t.sol index 7f1474c..e25a7b8 100644 --- a/test/unit/BuilderCodes/payoutAddress.t.sol +++ b/test/unit/BuilderCodes/payoutAddress.t.sol @@ -9,11 +9,7 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(string) reverts when code is not registered /// /// @param codeSeed The seed for generating the code - function test_payoutAddressString_revert_unregistered( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_payoutAddressString_revert_unregistered(uint256 codeSeed) public { string memory code = _generateValidCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.Unregistered.selector, code)); @@ -21,7 +17,7 @@ contract PayoutAddressTest is BuilderCodesTest { } /// @notice Test that payoutAddress(string) reverts when code is empty - function test_payoutAddressString_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { + function test_payoutAddressString_revert_emptyCode() public { vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.payoutAddress(""); } @@ -29,11 +25,7 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(string) reverts when code is over 32 characters /// /// @param codeSeed The seed for generating the code - function test_payoutAddressString_revert_codeOver32Characters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_payoutAddressString_revert_codeOver32Characters(uint256 codeSeed) public { string memory longCode = _generateLongCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, longCode)); @@ -43,11 +35,7 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(string) reverts when code contains invalid characters /// /// @param codeSeed The seed for generating the code - function test_payoutAddressString_revert_codeContainsInvalidCharacters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_payoutAddressString_revert_codeContainsInvalidCharacters(uint256 codeSeed) public { string memory invalidCode = _generateInvalidCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, invalidCode)); @@ -57,11 +45,7 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(uint256) reverts when token ID is not registered /// /// @param tokenId The token ID - function test_payoutAddressUint256_revert_unregistered( - uint256 tokenId, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_payoutAddressUint256_revert_unregistered(uint256 tokenId) public { // Generate a valid token ID but don't register it string memory code = _generateValidCode(tokenId); uint256 validTokenId = builderCodes.toTokenId(code); @@ -71,7 +55,7 @@ contract PayoutAddressTest is BuilderCodesTest { } /// @notice Test that payoutAddress(uint256) reverts when token ID represents empty code - function test_payoutAddressUint256_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { + function test_payoutAddressUint256_revert_emptyCode() public { uint256 emptyTokenId = 0; vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); @@ -81,11 +65,7 @@ contract PayoutAddressTest is BuilderCodesTest { /// @notice Test that payoutAddress(uint256) reverts when token ID represents code with invalid characters /// /// @param codeSeed The token ID representing invalid code - function test_payoutAddressUint256_revert_codeContainsInvalidCharacters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_payoutAddressUint256_revert_codeContainsInvalidCharacters(uint256 codeSeed) public { // Use an invalid token ID that doesn't normalize properly string memory invalidCode = _generateInvalidCode(codeSeed); uint256 invalidTokenId = uint256(bytes32(bytes(invalidCode))) >> ((32 - bytes(invalidCode).length) * 8); diff --git a/test/unit/BuilderCodes/registerWithSignature.t.sol b/test/unit/BuilderCodes/registerWithSignature.t.sol index 96e7c73..4ef36db 100644 --- a/test/unit/BuilderCodes/registerWithSignature.t.sol +++ b/test/unit/BuilderCodes/registerWithSignature.t.sol @@ -95,12 +95,9 @@ contract RegisterWithSignatureTest is BuilderCodesTest { /// @param initialOwner The initial owner address /// @param payoutAddress The payout address /// @param deadline The registration deadline - function test_registerWithSignature_revert_emptyCode( - uint256 /* codeSeed */, - address initialOwner, - address payoutAddress, - uint48 deadline - ) public { + function test_registerWithSignature_revert_emptyCode(address initialOwner, address payoutAddress, uint48 deadline) + public + { initialOwner = _boundNonZeroAddress(initialOwner); payoutAddress = _boundNonZeroAddress(payoutAddress); deadline = uint48(bound(deadline, uint48(block.timestamp), type(uint48).max)); diff --git a/test/unit/BuilderCodes/toCode.t.sol b/test/unit/BuilderCodes/toCode.t.sol index 31b8a4f..d8739bb 100644 --- a/test/unit/BuilderCodes/toCode.t.sol +++ b/test/unit/BuilderCodes/toCode.t.sol @@ -10,7 +10,7 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; contract ToCodeTest is BuilderCodesTest { /// @notice Test that toCode reverts when token ID represents empty code /// - function test_toCode_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { + function test_toCode_revert_emptyCode() public { uint256 emptyTokenId = 0; vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.toCode(emptyTokenId); @@ -19,11 +19,7 @@ contract ToCodeTest is BuilderCodesTest { /// @notice Test that toCode reverts when token ID represents code with invalid characters /// /// @param tokenId The token ID representing invalid code - function test_toCode_revert_codeContainsInvalidCharacters( - uint256 tokenId, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_toCode_revert_codeContainsInvalidCharacters(uint256 tokenId) public { // Use a token ID that would convert to invalid characters string memory invalidCode = _generateInvalidCode(tokenId); uint256 invalidTokenId = uint256(bytes32(bytes(invalidCode))) >> ((32 - bytes(invalidCode).length) * 8); @@ -35,12 +31,7 @@ contract ToCodeTest is BuilderCodesTest { /// /// @param seed The seed for generating the valid code /// @param zeroCharacter The character position to zero out - function test_toCode_revert_invalidNormalization( - address /* initialOwner */, - address /* initialPayoutAddress */, - uint256 seed, - uint8 zeroCharacter - ) public { + function test_toCode_revert_invalidNormalization(uint256 seed, uint8 zeroCharacter) public { vm.assume(zeroCharacter > 0); string memory validCode = _generateValidCode(seed); vm.assume(bytes(validCode).length - 1 > zeroCharacter); @@ -53,11 +44,7 @@ contract ToCodeTest is BuilderCodesTest { /// @notice Test that toCode returns correct code for valid token ID /// /// @param codeSeed The seed for generating the code - function test_toCode_success_returnsCorrectCode( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public view { + function test_toCode_success_returnsCorrectCode(uint256 codeSeed) public view { string memory validCode = _generateValidCode(codeSeed); uint256 tokenId = builderCodes.toTokenId(validCode); diff --git a/test/unit/BuilderCodes/toTokenId.t.sol b/test/unit/BuilderCodes/toTokenId.t.sol index 887538a..196e4b0 100644 --- a/test/unit/BuilderCodes/toTokenId.t.sol +++ b/test/unit/BuilderCodes/toTokenId.t.sol @@ -7,7 +7,7 @@ import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.toTokenId contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId reverts when code is empty - function test_toTokenId_revert_emptyCode(address /* initialOwner */, address /* initialPayoutAddress */) public { + function test_toTokenId_revert_emptyCode() public { vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, "")); builderCodes.toTokenId(""); } @@ -15,11 +15,7 @@ contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId reverts when code is over 32 characters /// /// @param codeSeed The seed for generating the code - function test_toTokenId_revert_codeOver32Characters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_toTokenId_revert_codeOver32Characters(uint256 codeSeed) public { string memory longCode = _generateLongCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, longCode)); builderCodes.toTokenId(longCode); @@ -28,11 +24,7 @@ contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId reverts when code contains invalid characters /// /// @param codeSeed The seed for generating the code - function test_toTokenId_revert_codeContainsInvalidCharacters( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public { + function test_toTokenId_revert_codeContainsInvalidCharacters(uint256 codeSeed) public { string memory invalidCode = _generateInvalidCode(codeSeed); vm.expectRevert(abi.encodeWithSelector(BuilderCodes.InvalidCode.selector, invalidCode)); builderCodes.toTokenId(invalidCode); @@ -41,11 +33,7 @@ contract ToTokenIdTest is BuilderCodesTest { /// @notice Test that toTokenId returns correct token ID for valid code /// /// @param codeSeed The seed for generating the code - function test_toTokenId_success_returnsCorrectTokenId( - uint256 codeSeed, - address /* initialOwner */, - address /* initialPayoutAddress */ - ) public view { + function test_toTokenId_success_returnsCorrectTokenId(uint256 codeSeed) public view { string memory validCode = _generateValidCode(codeSeed); uint256 tokenId = builderCodes.toTokenId(validCode); diff --git a/test/unit/BuilderCodes/tokenURI.t.sol b/test/unit/BuilderCodes/tokenURI.t.sol index 87d29cb..f2539aa 100644 --- a/test/unit/BuilderCodes/tokenURI.t.sol +++ b/test/unit/BuilderCodes/tokenURI.t.sol @@ -9,9 +9,7 @@ contract TokenURITest is BuilderCodesTest { /// @notice Test that tokenURI reverts when token ID does not exist /// /// @param tokenId The token ID - function test_tokenURI_revert_tokenDoesNotExist(uint256 tokenId, address /* initialOwner */, address /* initialPayoutAddress */) - public - { + function test_tokenURI_revert_tokenDoesNotExist(uint256 tokenId) public { // Ensure the token ID is not registered by trying a random high value tokenId = bound(tokenId, type(uint128).max, type(uint256).max); From 06cc2492744bdcffd461d38796290f97257cd8e2 Mon Sep 17 00:00:00 2001 From: Conner Swenberg Date: Mon, 6 Oct 2025 15:44:47 -0500 Subject: [PATCH 3/4] Revert updatePayoutAddress arg name change --- src/BuilderCodes.sol | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/BuilderCodes.sol b/src/BuilderCodes.sol index c5226b1..ad77f06 100644 --- a/src/BuilderCodes.sol +++ b/src/BuilderCodes.sol @@ -192,12 +192,12 @@ contract BuilderCodes is /// @notice Updates the default payout address for a referral code /// /// @param code Builder code - /// @param initialPayoutAddress New default payout address + /// @param newPayoutAddress New default payout address /// @dev Only callable by referral code owner - function updatePayoutAddress(string memory code, address initialPayoutAddress) external { + function updatePayoutAddress(string memory code, address newPayoutAddress) external { uint256 tokenId = toTokenId(code); if (_requireOwned(tokenId) != msg.sender) revert Unauthorized(); - _updatePayoutAddress(tokenId, initialPayoutAddress); + _updatePayoutAddress(tokenId, newPayoutAddress); } /// @notice Gets the default payout address for a referral code From 6421f6f642115868f7aaa7fa1b2e04a191fa54d5 Mon Sep 17 00:00:00 2001 From: Conner Swenberg Date: Mon, 6 Oct 2025 15:51:36 -0500 Subject: [PATCH 4/4] Fix lint warnings --- foundry.toml | 4 +++- test/integration/BuilderCodeTransfers.t.sol | 1 - test/integration/BuilderCodesAdminOperations.t.sol | 1 - test/lib/BuilderCodesTest.sol | 1 - test/unit/BuilderCodes/codeURI.t.sol | 1 + test/unit/BuilderCodes/renounceOwnership.t.sol | 4 ++-- test/unit/BuilderCodes/safeTransferFrom.t.sol | 1 - test/unit/BuilderCodes/toCode.t.sol | 2 -- test/unit/BuilderCodes/transferFrom.t.sol | 1 - test/unit/BuilderCodes/updateBaseURI.t.sol | 1 - test/unit/BuilderCodes/updateMetadata.t.sol | 1 - 11 files changed, 6 insertions(+), 12 deletions(-) diff --git a/foundry.toml b/foundry.toml index 96c0ac9..ba81c89 100644 --- a/foundry.toml +++ b/foundry.toml @@ -24,5 +24,7 @@ lint_on_build = false exclude_lints = [ "mixed-case-variable", # *URI variable names "mixed-case-function", # *URI function names - "asm-keccak256" # EIP-712 hashing + "asm-keccak256", # EIP-712 hashing + "erc20-unchecked-transfer", # Warning on ERC-721 transferFrom + "unused-import" # BuilderCodesTest imports for purpose of dependent tests ] \ No newline at end of file diff --git a/test/integration/BuilderCodeTransfers.t.sol b/test/integration/BuilderCodeTransfers.t.sol index 7c8b758..5decf80 100644 --- a/test/integration/BuilderCodeTransfers.t.sol +++ b/test/integration/BuilderCodeTransfers.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.29; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; import {BuilderCodesTest} from "../lib/BuilderCodesTest.sol"; -import {BuilderCodes} from "../../src/BuilderCodes.sol"; import {MockTransferRules} from "../lib/mocks/MockTransferRules.sol"; /// @notice Integration tests for BuilderCodes transfers diff --git a/test/integration/BuilderCodesAdminOperations.t.sol b/test/integration/BuilderCodesAdminOperations.t.sol index b2e78ab..a32daeb 100644 --- a/test/integration/BuilderCodesAdminOperations.t.sol +++ b/test/integration/BuilderCodesAdminOperations.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.29; import {BuilderCodesTest} from "../lib/BuilderCodesTest.sol"; -import {BuilderCodes} from "../../src/BuilderCodes.sol"; import {Ownable} from "@openzeppelin/contracts/access/Ownable.sol"; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; diff --git a/test/lib/BuilderCodesTest.sol b/test/lib/BuilderCodesTest.sol index dd36164..6a62cfb 100644 --- a/test/lib/BuilderCodesTest.sol +++ b/test/lib/BuilderCodesTest.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.29; import {Test} from "forge-std/Test.sol"; -import {console} from "forge-std/console.sol"; import {ERC1967Proxy} from "@openzeppelin/contracts/proxy/ERC1967/ERC1967Proxy.sol"; import {IERC721Errors} from "@openzeppelin/contracts/interfaces/draft-IERC6093.sol"; diff --git a/test/unit/BuilderCodes/codeURI.t.sol b/test/unit/BuilderCodes/codeURI.t.sol index a820909..2f6df4d 100644 --- a/test/unit/BuilderCodes/codeURI.t.sol +++ b/test/unit/BuilderCodes/codeURI.t.sol @@ -2,6 +2,7 @@ pragma solidity ^0.8.29; import {BuilderCodesTest, IERC721Errors} from "../../lib/BuilderCodesTest.sol"; + import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.codeURI diff --git a/test/unit/BuilderCodes/renounceOwnership.t.sol b/test/unit/BuilderCodes/renounceOwnership.t.sol index ce4a296..6f2afb3 100644 --- a/test/unit/BuilderCodes/renounceOwnership.t.sol +++ b/test/unit/BuilderCodes/renounceOwnership.t.sol @@ -1,10 +1,10 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.29; -import {BuilderCodes} from "../../../src/BuilderCodes.sol"; - import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; +import {BuilderCodes} from "../../../src/BuilderCodes.sol"; + /// @notice Unit tests for BuilderCodes.renounceOwnership contract RenounceOwnershipTest is BuilderCodesTest { /// @notice Test that renounceOwnership is disabled and reverts diff --git a/test/unit/BuilderCodes/safeTransferFrom.t.sol b/test/unit/BuilderCodes/safeTransferFrom.t.sol index 6dbf7bc..9b3fbf0 100644 --- a/test/unit/BuilderCodes/safeTransferFrom.t.sol +++ b/test/unit/BuilderCodes/safeTransferFrom.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.29; import {IAccessControl} from "openzeppelin-contracts/access/IAccessControl.sol"; import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; -import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.safeTransferFrom contract SafeTransferFromTest is BuilderCodesTest { diff --git a/test/unit/BuilderCodes/toCode.t.sol b/test/unit/BuilderCodes/toCode.t.sol index d8739bb..3c59aad 100644 --- a/test/unit/BuilderCodes/toCode.t.sol +++ b/test/unit/BuilderCodes/toCode.t.sol @@ -1,8 +1,6 @@ // SPDX-License-Identifier: MIT pragma solidity ^0.8.29; -import {LibString} from "solady/utils/LibString.sol"; - import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; import {BuilderCodes} from "../../../src/BuilderCodes.sol"; diff --git a/test/unit/BuilderCodes/transferFrom.t.sol b/test/unit/BuilderCodes/transferFrom.t.sol index 25a5deb..77c1774 100644 --- a/test/unit/BuilderCodes/transferFrom.t.sol +++ b/test/unit/BuilderCodes/transferFrom.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.29; import {IAccessControl} from "openzeppelin-contracts/access/IAccessControl.sol"; import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; -import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.transferFrom contract TransferFromTest is BuilderCodesTest { diff --git a/test/unit/BuilderCodes/updateBaseURI.t.sol b/test/unit/BuilderCodes/updateBaseURI.t.sol index 02372a2..69277ef 100644 --- a/test/unit/BuilderCodes/updateBaseURI.t.sol +++ b/test/unit/BuilderCodes/updateBaseURI.t.sol @@ -4,7 +4,6 @@ pragma solidity ^0.8.29; import {IAccessControl} from "@openzeppelin/contracts/access/IAccessControl.sol"; import {BuilderCodesTest} from "../../lib/BuilderCodesTest.sol"; -import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.updateBaseURI contract UpdateBaseURITest is BuilderCodesTest { diff --git a/test/unit/BuilderCodes/updateMetadata.t.sol b/test/unit/BuilderCodes/updateMetadata.t.sol index facdf3f..6cb4028 100644 --- a/test/unit/BuilderCodes/updateMetadata.t.sol +++ b/test/unit/BuilderCodes/updateMetadata.t.sol @@ -2,7 +2,6 @@ pragma solidity ^0.8.29; import {BuilderCodesTest, IERC721Errors} from "../../lib/BuilderCodesTest.sol"; -import {BuilderCodes} from "../../../src/BuilderCodes.sol"; /// @notice Unit tests for BuilderCodes.updateMetadata contract UpdateMetadataTest is BuilderCodesTest {