@chorus-one/ethereum
Version:
All-in-one toolkit for building staking dApps on Ethereum network
81 lines (72 loc) • 2.39 kB
text/typescript
import { Hex } from 'viem'
import { StakewiseConnector } from '../connector'
import { Vault } from '../types/vault'
interface VaultProperties {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
vaultData: any
}
// Extracts vault properties from Stakewise API
async function extractVaultProperties (connector: StakewiseConnector, vault: Hex): Promise<VaultProperties> {
const vars_getVault = {
address: vault.toLowerCase()
}
const today = new Date()
const dateBeforeYesterday = new Date()
dateBeforeYesterday.setDate(dateBeforeYesterday.getDate() - 8)
today.setDate(today.getDate())
const vaultData = await connector.graphqlRequest({
type: 'graph',
op: 'Vault',
query: `
query Vault($address: ID!) {
vault(id: $address) {
address: id
performance: score
apy
admin
isErc20
imageUrl
capacity
mevEscrow
isPrivate
createdAt
mevEscrow
tokenName
feePercent
totalAssets
isBlocklist
displayName
description
whitelister
tokenSymbol
feeRecipient
blocklistCount
whitelistCount
blocklistManager
}
}
`,
variables: vars_getVault
})
if (!vaultData.data.vault) {
throw new Error(`Vault data is missing the vault field`)
}
return { vaultData: vaultData.data }
}
// Get latest balance and cached properties
async function extractVaultDetails (connector: StakewiseConnector, vault: Hex): Promise<Vault> {
const vaultProperties: VaultProperties = await extractVaultProperties(connector, vault)
const vaultData = vaultProperties.vaultData
return {
address: vault,
name: vaultData.vault.displayName,
description: vaultData.vault.description,
logoUrl: vaultData.vault.imageUrl,
tvl: BigInt(vaultData.vault.totalAssets).toString(),
apy: vaultData.vault.apy > 0 ? vaultData.vault.apy : '0'
}
}
export async function getVault (params: { connector: StakewiseConnector; vault: Hex }): Promise<Vault> {
const { connector, vault } = params
return extractVaultDetails(connector, vault)
}