For the complete documentation index, see llms.txt. This page is also available as Markdown.

Allocation

This section describes how the USP board allocates collateral between the whitelisted yield sources. These are classified according to some liquidity tiers

  • T1: is a cash equivalent product, instantly redeemable (0-2 days) --> wsw_s

  • T2: is a short-term yield product, redeemable in less than 1 week (\leq 7 days) --> w7w_7

  • T3: is a long-term yield product, redeemable in less than 1 month (8-30 days) --> w30w_{30}

The weights should satisfy the condition ws+w7+w30  =  1.w_s + w_{7} + w_{30} \;=\; 1.

Allocation rules

  1. Sort vaults by descending yield vs duration score SiS_i (see Formulae)

  2. Fill Tier 2 weight up to the global cap c7c_7. One-fourth of T2 allocations unlock every week and are constantly moved back to T1

  3. Allocate the remainder to Tier 3 until the target length (12d) is reached

where c7c_7 limits the exposure to T2 products: too small allocation decreases the yield, but too large one risks draining liquidity if many users redeem within one week.

Formulae

Given some key parameters:

  • AA = total collateral (USDC + USDS)

  • RdR_d = net USP redemptions on the day dd

  • APRi,τiAPR_{i, \tau_i}= APR and epoch (days) of vault ii

  • σw\sigma_w = daily standard deviation of redemptions (look-back W90dW \approx 90d)

  • pp = instant-service percentile (e.g. 97.5%)


To compute the instant-liquidity buffer (T1)

  1. Statistical need --> L=zpσwHL = z_p\,\sigma_w\,\sqrt{H}

    where H=H = days promised instant liquidity (usually 1) and zp1.96  forp=97.5%z_p \approx 1.96 \; \text{for} \: p = 97.5\%

  2. Add operational cushion --> buffermin=L+κA\text{buffer}_{\min}=L+\kappa_A where κ1%\kappa \approx 1\% of AA (oracle lag, gas spikes)

  3. Target balance --> BsUSDS=max(buffermin,Bmin)B_{\text{sUSDS}}=\max \left(\text{buffer}_{\min},\,B_{\min}\right)

  4. Convert to portfolio weight ws=BsUSDSAw_s^{*}=\dfrac{B_{\text{sUSDS}}}{A}

If the current ws<wsw_s < w_s^* then move funds into T1, otherwise sweep the surplus out of the best-scoring vault.

To allocate the surplus, we compute a yield vs duration scoring for every vault ii using the formula

Si=APRifi1+λτiS_i = \dfrac{\text{APR}_i - f_i}{1 + \lambda \tau_i}

where fif_i is the annualized fee, and λ0.04\lambda \approx 0.04 is a factor used to penalize long-term strategies.

T3 allocation should be larger than the target length (τtarget12\tau_{\text{target}} \approx 12 days)

iwiτi1ws    τtarget\dfrac{\sum_i w_i \tau_i}{1 - w_s^{*}} \;\le\; \tau_{\text{target}}

where wi,maxw_{i, \max} is an optional exposure limit to any single vault or protocol. It should be used only when two or more independent vaults exist.

A keeper routine should be set to rebalance funds either weekly or whenever (wswstarget)>ε| (w_s - w_{s_\text{target}}) > \varepsilon |

def rebalance():
    A = current_AUM()
    sigma_w = stdev(redemptions, window=W)
    L = z_p * sigma_w * sqrt(H)
    B_s = max(L + kappa * A, B_min)
    w_s_target = B_s / A

    scores = [
        (i, (apr[i] - fee[i]) / (1 + lambda_ * tau[i]))
        for i in vaults
    ]
    scores.sort(key=lambda x: x[1], reverse=True)

    alloc = {"sUSDS": w_s_target}
    remaining = 1 - w_s_target
    w7 = 0

    for i, _ in scores:
        if tau[i] <= 7 and w7 < c7:                 # fill T2
            x = min(c7 - w7, remaining)
            alloc[i] = x
            w7 += x
            remaining -= x
        elif remaining > 0:                         # fill T3
            alloc[i] = remaining
            remaining = 0
        if remaining <= 0:
            break

    execute_onchain_swaps(alloc)

Initial parameters

The USP board can modify the allocation parameters. The default values are:

Variable
Description
Default value

pp

Instant-redeem service level

97–99%

κ\kappa

Operational cushion

1–2 % A

λ\lambda

Converts “epoch-day” into APR penalty

0.03–0.05

τtarget\tau_{\text{target}}

Max weighted epoch

10–14 days

c7c_7

Upper bound on the total weight of the 7-day vault sleeve

20–30 % A

wi,maxw_{i, \max}

Optional per-vault cap. Use once the number of vaults is 3\geq 3

off / 30 % A

Last updated