Aller au contenu principal

Cut

Ce module gère les mises à jour d'état au sein du Diamond, mais applique le modèle de sécurité strict « Registry-First » de Blok Capital.

DiamondCutBase.sol

Il s'agit du moteur interne pour toutes les mises à jour. Contrairement aux Diamonds standard qui acceptent des adresses de facettes arbitraires, le DiamondCutBase de Blok Capital impose que chaque mise à jour soit validée par rapport au FacetRegistry global.

À retenir pour les Builders : Un Garden ne peut ajouter une facette que si elle figure sur la liste blanche globale et que son module est explicitement autorisé pour ce type de Garden spécifique.

Extrait crucial : Vérification de sécurité du Registry

// From addFunctions() in DiamondCutBase.sol
// Ensure facet's module is allowed for this garden's type
bytes32 gardenType = ld.gardenType;
if (gardenType != bytes32(0)) {
bytes32 moduleId = IFacetRegistry(facetRegistry).getFacetModule(_facetAddress);
if (!IFacetRegistry(facetRegistry).isModuleAllowedForGardenType(gardenType, moduleId)) {
revert DiamondCut_ModuleNotAllowedForGardenType(gardenType, moduleId);
}
}

DiamondCutFacet.sol (Le Bouclier)

Dans une implémentation EIP-2535 standard, la fonction diamondCut peut être appelée par le propriétaire pour mettre à jour le contrat. Chez Blok Capital, cette fonction est intentionnellement bloquée. Cette facette est incluse pour satisfaire les exigences d'interface de l'EIP-2535, mais elle force toutes les mises à jour réelles à passer par un flux de mise à jour personnalisé et fortement contrôlé (probablement via un UpgradeFacet non montré ici), évitant ainsi toute ambiguïté et erreur humaine.

Extrait crucial : Le revert intentionnel

/// @inheritdoc IDiamondCut
function diamondCut(
FacetCut[] memory _diamondCut,
address _init,
bytes calldata _calldata
)
external
override
onlyGardenOwner
ifIndexNotConnected
{
// Blocked intentionally to force controlled upgrade paths
revert DiamondCutFacet_DiamondCutNotAllowed();
}

DiamondCutStorage.sol

Définit la disposition de stockage standard EIP-2535 nécessaire pour suivre les adresses de facettes et leurs sélecteurs de fonctions associés.

  • Modèle de Stockage : Utilise LibStorageSlot.deriveStorageSlot(type(DiamondCutStorage).name) pour garantir que la disposition de stockage n'entre jamais en collision avec d'autres facettes.