API
To interact with Homa Liquid Staking from Javascript you can use
@acala-network/api
yarn add @polkadot/api @acala-network/[email protected]^4.0.2-17 @acala-network/[email protected]^4.0.2-17
const { ApiPromise, WsProvider } = require('@polkadot/api')
const { options } = require('@acala-network/api')
const { Wallet, Homa } = require('@acala-network/sdk')
async function main () {
const ENDPOINT = 'wss://karura.api.onfinality.io/public-ws'
const api = await ApiPromise.create(options({ provider: new WsProvider(ENDPOINT) }))
const wallet = new Wallet(api)
const homa = new Homa(api, wallet)
// should wait homa sdk ready
await homa.isReady
const env = await homa.getEnv();
// total staked token
console.log(env.totalStaking.toString())
// total L-Token
console.log(env.totalLiquidity.toString())
// estimated staking APY
console.log(env.apy.toString())
// exchange rate between L-Token and staked token e.g. rate of LDOT and DOT
console.log(env.exchangeRate.toString())
// minimum mint threshold
console.log(env.mintThreshold.toString())
// minimum redeem threshold
console.log(env.redeemThreshold.toString())
// staking soft cap
console.log(env.stakingSoftCap.toString())
}
;main()
Total number of assets staked via Homa Liquid Staking protocol
env.totalStaking.toString()
Total number of L-Token assets minted via Homa Liquid Staking protocol
env.totalLiquidity.toString()
Estimated staking APY
env.apy.toString()
Exchange rate between L-Token and staked token e.g. rate of LDOT and DOT
env.exchangeRate.toString()
env.mintThreshold.toString()
env.redeemThreshold.toString()
A soft cap for maximum token can be staked
env.stakingSoftCap.toString()
...init homa sdk
const {
convertLiquidToStaking,
convertStakingToLiquid
} = await homa.getConvertor()
const liquidToken = await wallet.getToken('LKSM')
const stakingToken = await wallet.getToken('KSM')
const liquidAmount = new FixedPointNumber(10, liquidToken.decimals)
const stakingAmount = new FixedPointNumber(10, stakingToken.decimals)
console.log(convertLiquidToStaking(liquidAmount).toString())
console.log(convertStakingToLiquid(stakingAmount).toString())
...init homa sdk
const keyring = new Keyring({ type: 'sr25519' })
const account = keyring.addFromMnemonic('XXX') // your account mnemonic
const stakingToken = await wallet.getToken('KSM')
const amount = new FixedPointNumber(10, stakingToken.decimals);
const mint = await homa.getEstimateMintResult(amount)
// check pay amount
console.log(mint.pay.toString())
// check receive amount
console.log(mint.receive.toString())
const call = homa.createMintCall(mint.pay)
// send transaction to mint LDOT/LKSM
await call.signAndSend(account)
When user stakes, the staking token will be stored in a mint pool before being sent to Relay Chain for staking via XCM. You can call fast redeem to exchange L-Token for staking token from this pool.
Some reference web application would employ the following flow to achieve instant redemption
- check there's enough staking token in the pool using
mint.canTryFastReddem
- if there's, then swap L-Token to staking token from the mint pool
...init homa sdk
const keyring = new Keyring({ type: 'sr25519' })
const account = keyring.addFromMnemonic('XXX') // your account mnemonic
const liquidToken = await wallet.getToken('LKSM')
const amount = new FixedPointNumber(10, liquidToken.decimals);
const redeem = await homa.getEstimateRedeemResult(amount, true)
// check request amount to redeem
console.log(redeem.request.toString())
// check receive amount
console.log(redeem.receive.toString())
if (redeem.canTryFastReddem) {
const call = homa.createRedeemCall(redeem.request, true, keyring.address)
// send call to redeem LDOT/LKSM
await call.signAndSend(account)
}
Redeem and wait unbounding period + 1 Era to receive staked tokens. Unbounding period is defined by the staking asset protocol e.g. 28 days unbounding period for DOT and 7 days for KSM.
...init homa sdk
const keyring = new Keyring({ type: 'sr25519' })
const account = keyring.addFromMnemonic('XXX') // your account mnemonic
const liquidToken = await wallet.getToken('LKSM')
const amount = new FixedPointNumber(10, liquidToken.decimals);
const redeem = await homa.getEstimateRedeemResult(amount, false)
// check request amount to redeem
console.log(redeem.request.toString())
// check receive amount
console.log(redeem.receive.toString())
const call = homa.createRedeemCall(redeem.request, false)
// send transaction to redeem LDOT/LKSM
await call.signAndSend(account)
Last modified 1yr ago