Skip to content

Commit 4da0b14

Browse files
committed
feat: update DiamondLoupeFacet to use internal diamondStorage methods and optimize function selectors retrieval
1 parent d0943b5 commit 4da0b14

1 file changed

Lines changed: 15 additions & 14 deletions

File tree

src/facets/DiamondLoupeFacet.sol

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@ contract DiamondLoupeFacet is IDiamondLoupe {
1919
/// @notice Gets all facet addresses and their function selectors.
2020
/// @return facets_ Facet
2121
function facets() external view returns (Facet[] memory facets_) {
22-
DiamondStorage storage ds = LibDiamond.diamondStorage();
23-
uint256 facetCount = ds.facetAddresses.length;
22+
DiamondStorage storage ds = LibDiamond._diamondStorage();
23+
uint256 facetCount = ds.facetAddresses.length();
2424
facets_ = new Facet[](facetCount);
2525
for (uint256 facet; facet < facetCount;) {
2626
address facetAddr = ds.facetAddresses.at(facet);
@@ -35,27 +35,22 @@ contract DiamondLoupeFacet is IDiamondLoupe {
3535
/// @notice Gets all the function selectors provided by a facet.
3636
/// @param _facet The facet address.
3737
/// @return facetFunctionSelectors_
38-
function facetFunctionSelectors(address _facet)
39-
external
40-
view
41-
override
42-
returns (bytes4[] memory facetFunctionSelectors_)
43-
{
44-
facetFunctionSelectors_ = LibDiamond.diamondStorage().facetToSelectorsAndPosition[_facet].functionSelectors;
38+
function facetFunctionSelectors(address _facet) external view override returns (bytes4[] memory) {
39+
return bytes32SetToBytes4(LibDiamond._diamondStorage().facetToSelectors[_facet].values());
4540
}
4641

4742
/// @notice Get all the facet addresses used by a diamond.
4843
/// @return facetAddresses_
49-
function facetAddresses() external view override returns (address[] memory facetAddresses_) {
50-
facetAddresses_ = LibDiamond.diamondStorage().facetAddresses;
44+
function facetAddresses() external view override returns (address[] memory) {
45+
return LibDiamond._diamondStorage().facetAddresses.values();
5146
}
5247

5348
/// @notice Gets the facet that supports the given selector.
5449
/// @dev If facet is not found return address(0).
5550
/// @param _functionSelector The function selector.
5651
/// @return facetAddress_ The facet address.
57-
function facetAddress(bytes4 _functionSelector) external view override returns (address facetAddress_) {
58-
facetAddress_ = LibDiamond.diamondStorage().selectorToFacetAndPosition[_functionSelector].facetAddress;
52+
function facetAddress(bytes4 _functionSelector) external view override returns (address) {
53+
return LibDiamond._diamondStorage().selectorToFacet[_functionSelector];
5954
}
6055

6156
/// @notice Query if a contract implements an interface
@@ -65,6 +60,12 @@ contract DiamondLoupeFacet is IDiamondLoupe {
6560
/// @return `true` if the contract implements `interfaceID` and
6661
/// `interfaceID` is not 0xffffffff, `false` otherwise
6762
function supportsInterface(bytes4 _interfaceId) external view returns (bool) {
68-
return LibDiamond.diamondStorage().supportedInterfaces[_interfaceId];
63+
return LibDiamond._diamondStorage().supportedInterfaces[_interfaceId];
64+
}
65+
66+
function bytes32SetToBytes4(bytes32[] memory _data) private pure returns (bytes4[] memory result_) {
67+
assembly ("memory-safe") {
68+
result_ := _data
69+
}
6970
}
7071
}

0 commit comments

Comments
 (0)