/lido-dot-ksm

Lido KSM/DOT liquid staking

Primary LanguageSolidityMIT LicenseMIT

Lido KSM/DOT Liquid Staking Protocol

The Lido KSM/DOT Liquid Staking Protocol, built on Kusama(Polkadot) chain, allows their users to earn staking rewards on the Kusama chain without locking KSM or maintaining staking infrastructure.

Users can deposit KSM to the Lido smart contract and receive stKSM tokens in return. The smart contract then stakes tokens with the DAO-picked node operators. Users' deposited funds are pooled by the DAO, node operators never have direct access to the users' assets.

Unlike staked KSM directly on Kusama network, the stKSM token is free from the limitations associated with a lack of liquidity and can be transferred at any time. The stKSM token balance corresponds to the amount of Kusama chain KSM that the holder could withdraw.

Before getting started with this repo, please read:

Contracts

Most of the protocol is implemented as a set of smart contracts. These contracts are located in the contracts/ directory.

Lido

Main contract that implements stakes pooling, distribution logic and stKSM minting/burning mechanic. Contract also inherits from stKSM.sol and impements ERC-20 interface for stKSM token.

stKSM

The ERC20 token which uses shares to calculate users balances. A balance of a user depends on how much shares was minted and how much KSM was pooled to LIDO.sol.

WstKSM

The ERC20 token which uses user shares in stKSM token to mint WstKSM. stKSM is a rebaseable token which makes it unusable for some protocols. For using funds in that protocols stKSM can be changed to WstKSM.

Ledger

This contract contains staking logic of particular ledger. Basically, contract receive "target" stake amount from Lido.sol and current staking ledger state from relaychain and spawn XCM calls to relaychain to bring real ledger stake to "target" value.

Oracle

Oracle contains logic to provide actual relaychain staking ledgers state to ledger contracts. Contract uses consensus mechanism for protecting from malicious members, so in two words that require particular quorum from oracle members to report new state.

OracleMaster

The hub for all oracles, which receives all reports from oracles members and simply sends them to oracles and also calls update of ledgers stakes in the Lido.sol when a new epoch begins.

Controller

Intermediate contract for interaction with relaychain through XCM. This contract basically incapsulate whole stuff about cross-chain communications and provide simple external interface for: calling relaychain's staking operations, bridging KSM from relaychain to parachain and back.

AuthManager

Simple contract which manages roles for the whole protocol. New and old roles can be added and removed.

LedgerFactory

The factory for creating new ledgers according the beacon proxy pattern. The beacon proxy allows to change an implementation for all proxies in one tx.

Quick start

Install dependencies

npm install
pip install -r requirements.txt

Compile contracts

brownie compile

Run tests

brownie test

Check coverage

brownie test --coverage

Contract deployments

Moonbase

Deploy commit: 617b60fd8a0da43e44e11d62793334053269fa1a

Contract Address
Controller 0xB9AEC6Cd04b97EC674e7FDcAdDF1315D59fC6842
AuthManager 0x918C4f26945a02402a3E30d62dB2bE702aBaE0C4
Lido 0xC3EEEc5f6BFad2D0bFE6F58B8212aF9874E7160B
Oracle 0x0bc00c94744f0103f1bC059049D461B7Da593DB5
OracleMaster 0x8acdf52eB1c78c0e641Ea37dcA3b8F4010E235f2
Ledger 0xD9ff2f841aE95B180C2468C1B4AddceD8be00497
LedgerBeacon 0xAD082FfdA68ab9210328ff496E07a44E81e0dC89
LedgerFactory 0x7d34c26790F2652D29aFdf68B59dDDf89FF9cd83
WstKSM 0xFa900DB303584FCe6F5026b8c4083eDC87866f8e
Withdrawal 0x22364D0f3faECbE002271B6D0D023FE76857EaBE

Moonriver (Kusama)

Deploy commit: 2f2725faa0bc371e4d1ddfceacd8c45d8f0905f8

Contract Address
Controller 0xA3965dCeE17DceDA55244ff85E979D4D5b8A0D86
AuthManager 0x1077799f07c4DC45872E832902571f56e1f9185B
Lido 0xFfc7780C34B450d917d557E728f033033CB4fA8C
Oracle 0xA73Bc334b3c64a66969677CbE7103e38DBC8858D
OracleMaster 0x698ec30D747996670A4063505E34Dfbd6d1E1db5
Ledger 0x93f220D3e997D21D423687cBCa5874a7EAbEbE8B
LedgerBeacon 0x36Cf86FFa541fed07550ffD9536DBFaAC73da7Eb
LedgerFactory 0x780825fD0E7b09A8c136aD41090E356c138E0EdE
WstKSM 0x3bfd113ad0329a7994a681236323fb16E16790e3
Withdrawal 0x50afC32c3E5D25aee36D035806D80eE0C09c2a16

Moonbeam (Polkadot)

Deploy commit: 7db47f7fef94eb40781f62beb551ae45d82dd40f

Contract Address
Controller 0xa4b43F9B0aef0b22365727e93E91c096a09ef091
AuthManager 0x78d36208D2Eb3a1E6D84a727Ee1C012FF4cc293F
Lido 0xFA36Fe1dA08C89eC72Ea1F0143a35bFd5DAea108
Oracle 0x91069b93062c1Fdd6998741C9CA3C6eA57672956
OracleMaster 0x29767b69c2c39b22667dfD960e95911AC6e0CCEd
Ledger 0x891F6825afEbfbB4Bf6889b86724ac859477E4C4
LedgerBeacon 0xB9675751CE5840acD4c0Ba0E2d5a9188A8f34Bb8
LedgerFactory 0xf8B73E2Ffb2d0e25cf3166A22ea3Fe1F73483F49
WstKSM 0x191cf2602Ca2e534c5Ccae7BCBF4C46a704bb949
Withdrawal 0x25442Adf37379BE90ed1F7FcCd9c9417b10aA4DC