Lagoon SDKs
Last updated
export interface IVault extends IToken {
asset: Address;
underlyingDecimals: number;
owner: Address;
pendingOwner: Address;
whitelistManager: Address;
feeReceiver: Address;
safe: Address;
feeRegistry: Address;
valuationManager: Address;
newRatesTimestamp: bigint;
lastFeeTime: bigint;
highWaterMark: bigint;
cooldown: bigint;
feeRates: Rates
totalAssets: bigint;
newTotalAssets: bigint;
depositEpochId: number;
depositSettleId: number;
lastDepositEpochIdSettled: number;
redeemEpochId: number;
redeemSettleId: number;
lastRedeemEpochIdSettled: number;
pendingSilo: Address;
wrappedNativeToken: Address;
decimals: number;
decimalsOffset: number;
totalAssetsExpiration: bigint;
totalAssetsLifespan: bigint;
state: State,
isWhitelistActivated: boolean,
version: Version
}# For Viem integration (recommanded)
npm install @lagoon-protocol/v0-viem
# For framework-agnostic usage
npm install @lagoon-protocol/v0-coreimport { Vault } from "@lagoon-protocol/v0-viem";
import { VaultUtils } from "@lagoon-protocol/v0-core";
import { Address, createPublicClient, http } from 'viem';
import { mainnet } from 'viem/chains';
const client = createPublicClient({
chain: mainnet,
transport: http(),
});
async function fetchVault(address: Address, blockNumber: bigint) {
const vault = await Vault.fetch(address, client, { blockNumber });
if (!vault) {
throw new Error("Vault not found")
}
return vault
}
async function calculateVaultAPR({
vaultAddress,
startBlockNumber,
endBlockNumber,
decimals = 18
}: { vaultAddress: Address, startBlockNumber: bigint, endBlockNumber: bigint, decimals?: number }) {
const startBlock = await client.getBlock({ blockNumber: startBlockNumber });
const endBlock = await client.getBlock({ blockNumber: endBlockNumber });
const vaultStart = await fetchVault(vaultAddress, startBlock.number);
const vaultEnd = await fetchVault(vaultAddress, endBlock.number);
const basePrice = vaultStart.convertToAssets(VaultUtils.ONE_SHARE);
const currentPrice = vaultEnd.convertToAssets(VaultUtils.ONE_SHARE);
const periodSeconds = endBlock.timestamp - startBlock.timestamp;
const SECONDS_PER_YEAR = 365n * 24n * 60n * 60n;
const BASIS_POINT = 10n ** BigInt(decimals + 2);
const periodYield = ((currentPrice - basePrice) * SECONDS_PER_YEAR * BASIS_POINT);
return periodYield / (periodSeconds * basePrice);
}
const decimals = 18
// If the vault is asynchronous, you can use the oldest and youngest TotalAssetUpdated event block numbers as the startBlockNumber and endBlockNumber, respectively.
const vaultApr = await calculateVaultAPR({ vaultAddress: '0x...', startBlockNumber: 1234n, endBlockNumber: 456n, decimals })
console.log(`vault APR: ${formatUnits(vaultApr, decimals)}%`);