IndexBase.sol et IndexFacet.sol
Ces fichiers contiennent la logique métier principale pour le rééquilibrage de portefeuille. Le processus est divisé en deux transactions distinctes pour garantir la sécurité.
Concept Central : Le pipeline en deux étapes
_rebalanceIntent(): Verrouille les prix de marché actuels et calcule les allocations cibles selon les pondérations de l'Indice. Stocke le numéro de bloc._rebalance(SwapStep[]): Exécute les transactions réelles selon les instructions du CRE.
Extrait crucial pour les Builders : Protection contre Flash Loans et Slippage
La fonction _rebalance contient les contrôles de sécurité les plus critiques du protocole. Elle empêche les attaques flash loan en exigeant des délais entre blocs et vérifie strictement la valeur du portefeuille après l'exécution des swaps.
function _rebalance(SwapStep[] calldata steps) internal {
IndexStorage.Layout storage s = IndexStorage.layout();
// Flash loan protection: intent and rebalance must be in different blocks
if (block.number <= s.lastIntentBlock) {
revert IndexFacet_IntentBlockDelayNotPassed();
}
// Capture portfolio value BEFORE swaps
uint256 valueBefore = _calculateTotalValue(componentRegistry);
// Execute internal DEX swaps via self-calls
_executeSwapSteps(steps);
// Verify individual token balances match targets within 2% threshold
uint256 valueAfter = _verifyBalancesMatchTargets(componentRegistry);
// Guardrail: Ensure total portfolio value did not drop beyond 0.5%
uint256 minAcceptableValue = Math.mulDiv(
valueBefore,
10_000 - IndexStorage.MAX_VALUE_LOSS_BPS,
10_000,
Math.Rounding.Floor
);
if (valueAfter < minAcceptableValue) {
revert IndexFacet_ExcessiveValueLoss(valueBefore, valueAfter);
}
}