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