Skip to content

For AI agents: a documentation index is available at /llms.txt. Every page is also available as Markdown at the same URL with a .md suffix, or by requesting Accept: text/markdown.

BLOK Capital

Base.sol & Facet.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é.

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#

  1. _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.
  2. _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);
    }
}