Skip to main content

Calculation

VariableDescription
total_reward_unclaimedThe total amount of unclaimed rewards left for an incentive.
total_seconds_claimedHow many full liquidity-seconds have been already claimed for the incentive.
start_timeWhen the incentive rewards began in seconds.
end_timeWhen rewards are no longer being dripped out in seconds.
liquidityhe amount of liquidity, assumed to be constant over the period over which the snapshots are measured.
seconds_per_liquidity_inside_initialhe seconds per liquidity of the liquidity tick range as of the beginning of the period.
seconds_per_liquidity_insideThe seconds per liquidity of the liquidity tick range as of the current timestamp.
current_timeThe current timestamp, which must be greater than or equal to the start time.
/src/math.rs
pub fn calculate_reward(
total_reward_unclaimed: Decimal,
total_seconds_claimed: Decimal,
start_time: u64,
end_time: u64,
liquidity: Decimal,
seconds_per_liquidity_inside_initial: Decimal,
seconds_per_liquidity_inside: Decimal,
current_time: u64,
) -> Result<(Decimal, u64)> {
if current_time <= start_time {
return Err(ErrorCode::NotStarted.into());
}

let seconds_inside =
(seconds_per_liquidity_inside.sub
(seconds_per_liquidity_inside_initial)).mul(liquidity);

let total_seconds_unclaimed = cmp::max(
Decimal::from_integer(end_time as u128),
Decimal::from_integer(current_time as u128),
)
.sub(Decimal::from_integer(start_time as u128))
.sub(total_seconds_claimed);
let result = (total_reward_unclaimed
.mul(seconds_inside)
.div(total_seconds_unclaimed))
.v
.try_into()
.unwrap();
return Ok((seconds_inside, result));
}
}

Above function return two values:

  • seconds_inside - the total seconds spent inside the position's range for the duration of the stake,
  • result - the amount of rewards owed.

Reward updates

Rewards amount depends on user’s active liquidity over time what is described by secondsPerLiquidity factor which is saved on user position. Every time when this factor is increasing, rewards are also increasing. User’s secondsPerLiquidity depends on secondsPerLiquidityGlobal which is updated based on all active liquidity over time therefore if this factor increases user rewards also grow. Update frequency depends on time and all liquidity but also in case of withdraw rewards update is triggered by direct instruction before withdraw.