diff --git a/src/diamond/DiamondInspectFacet.sol b/src/diamond/DiamondInspectFacet.sol index 9fbc8033..4f1c4490 100644 --- a/src/diamond/DiamondInspectFacet.sol +++ b/src/diamond/DiamondInspectFacet.sol @@ -161,6 +161,11 @@ contract DiamondInspectFacet { } } + /** + * @notice Exports the function selectors of the DiamondInspectFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the DiamondInspectFacet + */ function exportSelectors() external pure returns (bytes memory) { return bytes.concat( this.facetAddress.selector, diff --git a/src/diamond/DiamondUpgradeFacet.sol b/src/diamond/DiamondUpgradeFacet.sol index 260bc82c..dfde194e 100644 --- a/src/diamond/DiamondUpgradeFacet.sol +++ b/src/diamond/DiamondUpgradeFacet.sol @@ -714,7 +714,12 @@ contract DiamondUpgradeFacet { } } + /** + * @notice Exports the function selectors of the DiamondUpgradeFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the DiamondUpgradeFacet + */ function exportSelectors() external pure returns (bytes memory) { - return bytes.concat(DiamondUpgradeFacet.upgradeDiamond.selector); + return bytes.concat(this.upgradeDiamond.selector); } } diff --git a/src/interfaceDetection/ERC165/ERC165Facet.sol b/src/interfaceDetection/ERC165/ERC165Facet.sol index 64eb061a..454e17e9 100644 --- a/src/interfaceDetection/ERC165/ERC165Facet.sol +++ b/src/interfaceDetection/ERC165/ERC165Facet.sol @@ -78,4 +78,13 @@ contract ERC165Facet { return s.supportedInterfaces[_interfaceId]; } + + /** + * @notice Exports the function selectors of the ERC165Facet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC165Facet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.supportsInterface.selector); + } } diff --git a/src/token/ERC20/Approve/ERC20ApproveFacet.sol b/src/token/ERC20/Approve/ERC20ApproveFacet.sol index 5643c227..a4914192 100644 --- a/src/token/ERC20/Approve/ERC20ApproveFacet.sol +++ b/src/token/ERC20/Approve/ERC20ApproveFacet.sol @@ -63,4 +63,13 @@ contract ERC20ApproveFacet { emit Approval(msg.sender, _spender, _value); return true; } + + /** + * @notice Exports the function selectors of the ERC20ApproveFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC20ApproveFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.approve.selector); + } } diff --git a/src/token/ERC20/Bridgeable/ERC20BridgeableFacet.sol b/src/token/ERC20/Bridgeable/ERC20BridgeableFacet.sol index d8f87f8b..634113e1 100644 --- a/src/token/ERC20/Bridgeable/ERC20BridgeableFacet.sol +++ b/src/token/ERC20/Bridgeable/ERC20BridgeableFacet.sol @@ -212,4 +212,13 @@ contract ERC20BridgeableFacet { revert ERC20InvalidBridgeAccount(_caller); } } + + /** + * @notice Exports the function selectors of the ERC20BridgeableFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC20BridgeableFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.crosschainMint.selector, this.crosschainBurn.selector, this.checkTokenBridge.selector); + } } diff --git a/src/token/ERC20/Burn/ERC20BurnFacet.sol b/src/token/ERC20/Burn/ERC20BurnFacet.sol index 960a1de0..65fcb51f 100644 --- a/src/token/ERC20/Burn/ERC20BurnFacet.sol +++ b/src/token/ERC20/Burn/ERC20BurnFacet.sol @@ -101,4 +101,13 @@ contract ERC20BurnFacet { } emit Transfer(_account, address(0), _value); } + + /** + * @notice Exports the function selectors of the ERC20BurnFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC20BurnFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.burnERC20.selector, this.burnERC20From.selector); + } } diff --git a/src/token/ERC20/Data/ERC20DataFacet.sol b/src/token/ERC20/Data/ERC20DataFacet.sol index b6c8713e..ad2b7560 100644 --- a/src/token/ERC20/Data/ERC20DataFacet.sol +++ b/src/token/ERC20/Data/ERC20DataFacet.sol @@ -59,4 +59,13 @@ contract ERC20DataFacet { function allowance(address _owner, address _spender) external view returns (uint256) { return getStorage().allowance[_owner][_spender]; } + + /** + * @notice Exports the function selectors of the ERC20Data facet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC20DataFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.totalSupply.selector, this.balanceOf.selector, this.allowance.selector); + } } diff --git a/src/token/ERC20/Metadata/ERC20MetadataFacet.sol b/src/token/ERC20/Metadata/ERC20MetadataFacet.sol index 153848c8..1c3cb660 100644 --- a/src/token/ERC20/Metadata/ERC20MetadataFacet.sol +++ b/src/token/ERC20/Metadata/ERC20MetadataFacet.sol @@ -56,4 +56,13 @@ contract ERC20MetadataFacet { function decimals() external view returns (uint8) { return getStorage().decimals; } + + /** + * @notice Exports the function selectors of the ERC20Metadata facet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC20MetadataFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.name.selector, this.symbol.selector, this.decimals.selector); + } } diff --git a/src/token/ERC20/Permit/ERC20PermitFacet.sol b/src/token/ERC20/Permit/ERC20PermitFacet.sol index 5e777fea..cba8b74d 100644 --- a/src/token/ERC20/Permit/ERC20PermitFacet.sol +++ b/src/token/ERC20/Permit/ERC20PermitFacet.sol @@ -5,6 +5,11 @@ pragma solidity >=0.8.30; * https://compose.diamonds */ +/** + * @title ERC20PermitFacet + * @notice Facet for ERC20 permit functionality + * @dev Implements EIP-2612: https://eips.ethereum.org/EIPS/eip-2612 + */ contract ERC20PermitFacet { /** * @notice Thrown when a permit signature is invalid or expired. @@ -177,4 +182,13 @@ contract ERC20PermitFacet { s.nonces[_owner] = currentNonce + 1; emit Approval(_owner, _spender, _value); } + + /** + * @notice Exports the function selectors of the ERC20PermitFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC20PermitFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.nonces.selector, this.DOMAIN_SEPARATOR.selector, this.permit.selector); + } } diff --git a/src/token/ERC20/Transfer/ERC20TransferFacet.sol b/src/token/ERC20/Transfer/ERC20TransferFacet.sol index 55349017..19bb51b6 100644 --- a/src/token/ERC20/Transfer/ERC20TransferFacet.sol +++ b/src/token/ERC20/Transfer/ERC20TransferFacet.sol @@ -133,4 +133,13 @@ contract ERC20TransferFacet { emit Transfer(_from, _to, _value); return true; } + + /** + * @notice Exports the function selectors of the ERC20TransferFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC20TransferFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.transfer.selector, this.transferFrom.selector); + } } diff --git a/src/token/ERC721/Approve/ERC721ApproveFacet.sol b/src/token/ERC721/Approve/ERC721ApproveFacet.sol index 8072759d..a9c79d4c 100644 --- a/src/token/ERC721/Approve/ERC721ApproveFacet.sol +++ b/src/token/ERC721/Approve/ERC721ApproveFacet.sol @@ -88,4 +88,13 @@ contract ERC721ApproveFacet { getStorage().isApprovedForAll[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } + + /** + * @notice Exports the function selectors of the ERC721ApproveFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721ApproveFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.approve.selector, this.setApprovalForAll.selector); + } } diff --git a/src/token/ERC721/Burn/ERC721BurnFacet.sol b/src/token/ERC721/Burn/ERC721BurnFacet.sol index 2a9d8d54..5dba5f1e 100644 --- a/src/token/ERC721/Burn/ERC721BurnFacet.sol +++ b/src/token/ERC721/Burn/ERC721BurnFacet.sol @@ -98,4 +98,13 @@ contract ERC721BurnFacet { emit Transfer(owner, address(0), tokenId); } } + + /** + * @notice Exports the function selectors of the ERC721BurnFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721BurnFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.burnERC721.selector, this.burnERC721s.selector); + } } diff --git a/src/token/ERC721/Data/ERC721DataFacet.sol b/src/token/ERC721/Data/ERC721DataFacet.sol index fa5b9df4..b8d81aad 100644 --- a/src/token/ERC721/Data/ERC721DataFacet.sol +++ b/src/token/ERC721/Data/ERC721DataFacet.sol @@ -90,4 +90,15 @@ contract ERC721DataFacet { function isApprovedForAll(address _owner, address _operator) external view returns (bool) { return getStorage().isApprovedForAll[_owner][_operator]; } + + /** + * @notice Exports the function selectors of the ERC721DataFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721DataFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat( + this.balanceOf.selector, this.ownerOf.selector, this.getApproved.selector, this.isApprovedForAll.selector + ); + } } diff --git a/src/token/ERC721/Enumerable/Burn/ERC721EnumerableBurnFacet.sol b/src/token/ERC721/Enumerable/Burn/ERC721EnumerableBurnFacet.sol index fd787c1b..c5d99eea 100644 --- a/src/token/ERC721/Enumerable/Burn/ERC721EnumerableBurnFacet.sol +++ b/src/token/ERC721/Enumerable/Burn/ERC721EnumerableBurnFacet.sol @@ -122,4 +122,13 @@ contract ERC721EnumerableBurnFacet { emit Transfer(owner, address(0), _tokenId); } + + /** + * @notice Exports the function selectors of the ERC721EnumerableBurnFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721EnumerableBurnFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.burn.selector); + } } diff --git a/src/token/ERC721/Enumerable/Data/ERC721EnumerableDataFacet.sol b/src/token/ERC721/Enumerable/Data/ERC721EnumerableDataFacet.sol index 9c91ac95..8aa2ba58 100644 --- a/src/token/ERC721/Enumerable/Data/ERC721EnumerableDataFacet.sol +++ b/src/token/ERC721/Enumerable/Data/ERC721EnumerableDataFacet.sol @@ -91,4 +91,13 @@ contract ERC721EnumerableDataFacet { } return s.allTokens[_index]; } + + /** + * @notice Exports the function selectors of the ERC721EnumerableDataFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721EnumerableDataFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.totalSupply.selector, this.tokenOfOwnerByIndex.selector, this.tokenByIndex.selector); + } } diff --git a/src/token/ERC721/Enumerable/Transfer/ERC721EnumerableTransferFacet.sol b/src/token/ERC721/Enumerable/Transfer/ERC721EnumerableTransferFacet.sol index 037c2bbe..f2919a11 100644 --- a/src/token/ERC721/Enumerable/Transfer/ERC721EnumerableTransferFacet.sol +++ b/src/token/ERC721/Enumerable/Transfer/ERC721EnumerableTransferFacet.sol @@ -201,4 +201,17 @@ contract ERC721EnumerableTransferFacet { } } } + + /** + * @notice Exports the function selectors of the ERC721EnumerableTransferFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721EnumerableTransferFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat( + this.transferFrom.selector, + bytes4(keccak256("safeTransferFrom(address,address,uint256)")), + bytes4(keccak256("safeTransferFrom(address,address,uint256,bytes)")) + ); + } } diff --git a/src/token/ERC721/Metadata/ERC721MetadataFacet.sol b/src/token/ERC721/Metadata/ERC721MetadataFacet.sol index cb0efe70..a618bf2c 100644 --- a/src/token/ERC721/Metadata/ERC721MetadataFacet.sol +++ b/src/token/ERC721/Metadata/ERC721MetadataFacet.sol @@ -120,4 +120,13 @@ contract ERC721MetadataFacet { } return string.concat(s.baseURI, string(tokenIdString)); } + + /** + * @notice Exports the function selectors of the ERC721MetadataFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721MetadataFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat(this.name.selector, this.symbol.selector, this.tokenURI.selector); + } } diff --git a/src/token/ERC721/Transfer/ERC721TransferFacet.sol b/src/token/ERC721/Transfer/ERC721TransferFacet.sol index 506eb40d..e6c040ef 100644 --- a/src/token/ERC721/Transfer/ERC721TransferFacet.sol +++ b/src/token/ERC721/Transfer/ERC721TransferFacet.sol @@ -167,4 +167,17 @@ contract ERC721TransferFacet { } } } + + /** + * @notice Exports the function selectors of the ERC721TransferFacet + * @dev This function is use as a selector discovery mechanism for diamonds + * @return selectors The exported function selectors of the ERC721TransferFacet + */ + function exportSelectors() external pure returns (bytes memory) { + return bytes.concat( + this.transferFrom.selector, + bytes4(keccak256("safeTransferFrom(address,address,uint256)")), + bytes4(keccak256("safeTransferFrom(address,address,uint256,bytes)")) + ); + } }