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
Name
Staked CTR
Symbol
xCTR
Decimals
18
Standard
ERC-4626 + ERC20Votes (upgradeable)
Transferable
No
Clock Mode
Timestamp
Configuration
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:
Rewards added via
addRewards(amount)are queued for the next epochWhen a new epoch starts, queued rewards stream linearly over 7 days
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
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?