xCTR Staking

xCTR is an upgradeable ERC-4626 vault with voting power (ERC20Votes). It is non-transferable โ€” transfer() and transferFrom() revert. Standard ERC-4626 withdraw() and redeem() also revert; use the exit system instead.

Specifications

Property
Value

Name

Staked CTR

Symbol

xCTR

Decimals

18

Standard

ERC-4626 + ERC20Votes (upgradeable)

Transferable

No

Clock Mode

Timestamp

Configuration

Parameter
Default
Description

epochPeriod

7 days

Reward streaming period

minExitDuration

15 days

Minimum wait before exit completion

maxExitDuration

90 days

Wait time for zero penalty

minExitPenaltyBps

0 (0%)

Penalty at max duration

maxExitPenaltyBps

5000 (50%)

Penalty at min duration

instantExitPenaltyBps

5000 (50%)

Fixed instant exit penalty

All parameters are updatable by the contract owner.

Staking

Deposit CTR to receive xCTR shares:

Shares are calculated at the current exchange rate (totalAssets / totalSupply). As rewards accrue, each xCTR becomes redeemable for more CTR.

Rewards

Rewards are streamed linearly over weekly epochs:

  1. Rewards added via addRewards(amount) are queued for the next epoch

  2. When a new epoch starts, queued rewards stream linearly over 7 days

  3. Exit penalties are also added as rewards for remaining stakers

Exit System

Start Exit

Burns xCTR shares and locks the CTR value at the current exchange rate:

Each user can have multiple pending exits, each with its own ID and timeline. Exit parameters (penalty rates, durations) are snapshotted at start time โ€” subsequent parameter changes don't affect existing exits.

Complete Exit (after day 15)

Penalty decreases linearly from 50% โ†’ 0% over the exit window:

Penalty formula:

Cancel Exit (before day 15)

Returns xCTR at the current exchange rate (may differ from original amount):

Instant Exit

Immediate withdrawal with a fixed 50% penalty:

Read Functions

Voting

xCTR integrates ERC20Votes for governance. Voting power equals xCTR balance but must be delegated to activate:

Events

Event
Description

RewardsAdded(sender, amount, isPenalty)

Rewards queued for next epoch

ExitStarted(user, exitId, shares, assets)

Exit initiated

ExitCompleted(user, exitId, amount, penalty, duration)

Exit finalized

ExitCancelled(user, exitId, assets, sharesRestored)

Exit cancelled, xCTR restored

InstantExited(user, shares, amount, penalty)

Instant exit executed

Last updated

Was this helpful?