Skip to main content
The tranching return model maps utilization to the Junior share of residual Senior-side yield. The active model is stored in a separate ExponentTranchingMarketReturnModel account so larger piecewise curves do not live directly inside the main market account.

ExponentTranchingMarketReturnModel

pub struct ExponentTranchingMarketReturnModel {
    pub market: Pubkey,
    pub return_model: TrancheReturnModel,
    pub reserved: [u8; 128],
}
FieldDescription
marketMain ExponentTranchingMarket this model belongs to
return_modelActive return allocation model
reservedReserved bytes for future compatibility

TrancheReturnModel

pub enum TrancheReturnModel {
    UtilizationGuidedCurve(UtilizationGuidedCurveParams),
    PiecewiseLinearCurve(PiecewiseLinearCurveParams),
}

UtilizationGuidedCurveParams

pub struct UtilizationGuidedCurveParams {
    pub junior_share_at_target_utilization: Number,
    pub last_target_shift_ts: i64,
    pub max_target_shift_speed: Number,
    pub zero_utilization_junior_share_discount: Number,
    pub full_utilization_junior_share_premium: Number,
}
FieldDescription
junior_share_at_target_utilizationJunior return share at the fixed 90% target utilization
last_target_shift_tsTimestamp used for target-shift accounting
max_target_shift_speedMaximum target-share movement per second
zero_utilization_junior_share_discountDiscount applied below target at zero utilization
full_utilization_junior_share_premiumPremium applied above target at full utilization

PiecewiseLinearCurveParams

pub struct PiecewiseLinearCurveParams {
    pub points: Vec<u64>,
}
The piecewise model stores 1000 possible utilization-indexed points. Non-zero points define the curve. The program interpolates between the nearest initialized lower and upper points.

PiecewiseLinearCurvePoint

pub struct PiecewiseLinearCurvePoint {
    pub utilization: Number,
    pub y: Number,
}
FieldDescription
utilizationUtilization value between 0 and 1
yJunior return share at that utilization

Update enum

Market initialization and modification use TrancheReturnModelUpdate:
pub enum TrancheReturnModelUpdate {
    UtilizationGuidedCurve(UtilizationGuidedCurveParams),
    PiecewiseLinearCurve(Vec<PiecewiseLinearCurvePoint>),
}
For PiecewiseLinearCurve, the update can pass only the points that should be set. The program stores them into the 1000-point backing array.