Boost osToken
StakeWise Boost enhances staking rewards by leveraging your osTokens as collateral to borrow additional assets from Aave. The borrowed funds are then restaked, creating a compounding effect that amplifies your staking position.
How to lock osToken into the Boost leverage strategy
To boost a user's osToken position, look up the leverage strategy proxy with sdk.boost.getLeverageStrategyProxy, ensure the proxy has osToken allowance (via permit signature for EOAs or approve for multisig wallets), then call sdk.boost.lock. The full flow below covers both wallet types.
import { BrowserProvider, parseEther } from 'ethers'
import { StakeWiseSDK, Network, OsTokenPositionHealth } from '@stakewise/v3-sdk'
const eip1193Provider = window.ethereum
const browserProvider = new BrowserProvider(eip1193Provider, {
chainId: Network.Mainnet,
name: 'mainnet',
})
const sdk = new StakeWiseSDK({
network: Network.Mainnet,
provider: browserProvider,
})
type Input = {
amount: string
userAddress: string
vaultAddress: string
}
type PermitParams = Parameters<typeof sdk.boost.lock>[0]['permitParams']
const boost = async (values: Input) => {
const { amount, userAddress, vaultAddress } = values
const tokenAddress = sdk.config.addresses.tokens.mintToken
try {
const shares = parseEther(amount)
const osTokenContract = sdk.contracts.helpers.createErc20(tokenAddress)
const mint = await sdk.osToken.getBalance({ userAddress, vaultAddress })
const permitAddress = await sdk.boost.getLeverageStrategyProxy({ userAddress, vaultAddress })
const allowance = await osTokenContract.allowance(userAddress, permitAddress)
if (!mint.shares) {
throw new Error('You have no tokens to boost.')
}
if (shares > mint.shares) {
throw new Error('Insufficient osToken balance')
}
const isNeedApprove = allowance < shares
let permitParams: PermitParams
if (isNeedApprove) {
const code = await sdk.provider.getCode(userAddress)
const isMultiSig = code !== '0x'
if (isMultiSig) {
// Use traditional approve for multi-sig wallets
const signer = await sdk.provider.getSigner(userAddress)
const signedContract = osTokenContract.connect(signer)
const { hash } = await signedContract.approve(permitAddress, shares)
await sdk.provider.waitForTransaction(hash)
await sdk.utils.waitForSubgraph({ hash })
}
else {
// Use gasless permit for EOAs
const { amount, deadline, v, r, s } = await sdk.utils.getPermitSignature({
contract: sdk.contracts.tokens.mintToken,
spenderAddress: permitAddress,
ownerAddress: userAddress,
})
permitParams = {
vault: vaultAddress,
deadline,
amount,
v,
r,
s,
}
}
}
const hash = await sdk.boost.lock({
amount: shares,
permitParams,
vaultAddress,
userAddress,
})
await sdk.provider.waitForTransaction(hash)
await sdk.utils.waitForSubgraph({ hash })
}
catch (error) {
console.error(error)
}
}
boost({
amount: '1.12',
userAddress: 'USER_ADDRESS',
vaultAddress: 'VAULT_ADDRESS',
})