Rebalance fee

Fix rebalance fee

Related section: https://predy.gitbook.io/predy-v3.2/product-recipe#fee

There is a problem with the current calculation of the rebalance fee.

https://github.com/predyprotocol/sqrt-contracts/blob/main/src/libraries/PerpFee.sol#L129

The rebalance fee is the interest that the protocol has paid for after rebalancing until the user first updates their position. In the implementation of v3.2, there are the following problems.

  • The rebalance fee is charged even after the user has settled.

  • The rebalance fee is also charged for new positions.

Variables

nameparent structtypedescription

rebalanceFeeGrowth

Perp

uint256

accumulated rebalance fee

lastRebalanceTotalSquartAmount

Perp

uint256

Total Squart Amount at the last rebalance

numRebalance

Perp

uint64

Number of rebalances, Rebalance ID

rebalanceFeeGrowthCache

Perp

mapping

Cache of rebalanceFeeGrowth at each rebalance

lastNumRebalance

User

uint64

Rebalance ID at the time of the last rebalance settlement

Logic of v5.0

  • At the time of rebalancing

    • Save TotalSquartAmount in lastRebalanceTotalSquartAmount

      • This is for sharing the rebalance fee with the Squart owners at the time of rebalance

    • At the time of rebalance, rebalanceFeeGrowthCache[numRebalance] = rebalanceFeeGrowth

    • Increment numRebalance.

  • Before each trade

    • Let rebalanceFeeGrowth grow.

      • growth += rebalanceFee * ONE / lastRebalanceTotalSquartAmount

      • This is to share the rebalance fee with the Squart owners at the time of rebalance

  • When a user trades

    • Only when settleUserBalance is done, settle the rebalance fee.

      • if lastNumRebalance < numRebalance

    • Only when Squart was owned at the time of rebalance, settle the fee.

      • rebalanceFeeGrowth - rebalanceFeeGrowthCache[lastNumRebalance]

    • If there was a trade, update lastNumRebalance.

      • lastNumRebalance = numRebalance

    • Subtract the settled SquartAmount from lastRebalanceTotalSquartAmount

Last updated