Implementing Staking
This guide walks you through implementing staking functionality using the Steer Protocol SDK.
Prerequisites
Before you begin, make sure you have:
- Installed the required packages:
npm install @steerprotocol/sdk viem
# or
yarn add @steerprotocol/sdk viem
Implementation Steps
1. Initialize the SDK Client
First, set up the required clients for the SDK:
import { SteerClient, SteerConfig } from '@steerprotocol/sdk';
import { createPublicClient, createWalletClient, http } from 'viem';
import { polygon } from 'viem/chains';
// Create public client for blockchain interaction
const publicClient = createPublicClient({
chain: polygon,
transport: http()
});
// Create wallet client for transactions
const walletClient = createWalletClient({
chain: polygon,
transport: http()
});
// Initialize the Steer client
const steerConfig: SteerConfig = {
environment: 'production',
client: publicClient,
walletClient
};
const steerClient = new SteerClient(steerConfig);
2. Fetching Staking Pools
You can fetch staking pools with various filters:
// Get all active staking pools
const activePools = await steerClient.staking.getLiveStakingPools();
// Get pools for specific chain
const chainPools = await steerClient.staking.getStakingPools({
chainId: 137 // Polygon
});
// Get dual rewards pools
const dualRewardPools = await steerClient.staking.getDualRewardsStakingPools();
// Get high yield pools
const highYieldPools = await steerClient.staking.getHighYieldStakingPools(
1000, // Minimum daily emission for reward A
500 // Minimum daily emission for reward B
);
3. Staking Tokens
To stake tokens in a pool:
const stakeTx = await steerClient.staking.stake({
stakingPool: poolAddress,
amount: BigInt('1000000000000000000') // 1 token with 18 decimals
});
if (stakeTx.success) {
console.log('Stake transaction hash:', stakeTx.data);
}
4. Checking Balances and Rewards
Monitor staked balances and earned rewards:
// Check staked balance
const balance = await steerClient.staking.balanceOf(
poolAddress,
userAddress
);
// Check earned rewards
const rewards = await steerClient.staking.earned(
poolAddress,
userAddress
);
if (rewards.success) {
console.log('Reward A:', rewards.data.rewardA.toString());
if (rewards.data.rewardB) {
console.log('Reward B:', rewards.data.rewardB.toString());
}
}
5. Claiming Rewards
To claim earned rewards:
const claimTx = await steerClient.staking.getReward({
stakingPool: poolAddress
});
if (claimTx.success) {
console.log('Claim transaction hash:', claimTx.data);
}
6. Withdrawing Tokens
To withdraw staked tokens:
const withdrawTx = await steerClient.staking.withdraw({
stakingPool: poolAddress,
amount: BigInt('1000000000000000000') // 1 token with 18 decimals
});
if (withdrawTx.success) {
console.log('Withdraw transaction hash:', withdrawTx.data);
}
Advanced Features
Calculating APR
Calculate the APR for a staking pool:
const apr = steerClient.staking.calculateAPR(
pool,
rewardTokenPriceUSD,
totalStakedUSD
);
console.log('Pool APR:', apr);
Getting LP Token Values
For Steer vault staking pools, get the underlying token values:
const tokenValue = await steerClient.staking.getSteerLpTokenValue({
stakingPool: pool,
amount: lpTokenAmount,
token0UsdPrice: price0,
token1UsdPrice: price1
});
if (tokenValue.success) {
console.log('Total Value USD:', tokenValue.data.totalValueUsd);
console.log('Token 0 Value:', tokenValue.data.token0Value);
console.log('Token 1 Value:', tokenValue.data.token1Value);
}
Getting Total Staked Value
Get the total value staked in a pool:
const totalStaked = await steerClient.staking.getTotalStakingAmountInUsd(
pool,
token0Price,
token1Price // Required for Steer vaults
);
if (totalStaked.success) {
console.log('Total Staked USD:', totalStaked.data);
}
Error Handling
Always implement proper error handling:
try {
const stakeTx = await steerClient.staking.stake({
stakingPool: poolAddress,
amount: stakeAmount
});
if (!stakeTx.success) {
console.error('Stake failed:', stakeTx.error);
return;
}
console.log('Stake successful:', stakeTx.data);
} catch (error) {
console.error('Unexpected error:', error);
}
Best Practices
- Validate Chain Support
const chainId = await publicClient.getChainId();
if (chainId !== pool.chainId) {
console.error('Chain not supported');
return;
}
Check Balances Before Actions Always verify user has sufficient balance before staking.
Monitor Transaction Status Implement proper transaction monitoring and user feedback.
Handle Failed Transactions Implement proper error handling and user feedback for failed transactions.
Next Steps
- Learn about Pool Types
- Explore Advanced Features
- Set up monitoring and analytics