IndexBase.sol y IndexFacet.sol
Estos archivos contienen la lógica de negocio principal para el rebalanceo de carteras. El proceso se divide en dos transacciones distintas para garantizar la seguridad.
Concepto Central: La canalización en dos pasos
_rebalanceIntent(): Bloquea los precios de mercado actuales y calcula las asignaciones objetivo según los pesos del Índice. Almacena el número de bloque._rebalance(SwapStep[]): Ejecuta las operaciones reales según las instrucciones del CRE.
Fragmento crucial para Builders: Protección frente a Flash Loans y Slippage
La función _rebalance contiene las comprobaciones de seguridad más críticas del protocolo. Previene los ataques de flash loan exigiendo retardos por bloque y comprueba estrictamente el valor de la cartera tras la ejecución de los 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);
}
}