Skip to main content

Staking Contract

Handles staking, unstaking, and rebase distribution.

Details

PropertyValue
ExtendsOP_NET
Epoch144 blocks (~1 day)

Storage

slohmAddress: StoredAddress
sSlohmAddress: StoredAddress
treasuryAddress: StoredAddress
lastRebaseBlock: StoredU256
epochLength: StoredU256 // Default: 144 blocks
rewardRate: StoredU256 // Rewards per epoch

Key Methods

stake(amount)

function stake(amount: u256): void {
// Pull SLOHM from user
SLOHM.transferFrom(sender, this, amount);
// Mint sSLOHM to user (1:1)
sSLOHM.mint(sender, amount);
}

unstake(amount)

function unstake(amount: u256): void {
// Burn sSLOHM from user
sSLOHM.burn(sender, amount);
// Transfer SLOHM back to user
SLOHM.transfer(sender, amount);
}

rebase()

function rebase(): void {
// Check epoch elapsed
require(block.number >= lastRebaseBlock + epochLength);
// Get rewards from treasury
const rewards = Treasury.mintRewards(rewardRate);
// Distribute via sSLOHM index increase
sSLOHM.rebase(rewards);
// Update last rebase block
lastRebaseBlock = block.number;
}

Admin Functions

FunctionAccessDescription
setRewardRateMultisigChange reward rate
setEpochLengthMultisigChange epoch duration

View Functions

  • nextRebaseBlock() - When next rebase can occur
  • canRebase() - Whether rebase is available