Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[base-apy] add SSV token support and add baseApy #258

Merged
merged 4 commits into from
Mar 10, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 30 additions & 1 deletion changelog/next-release.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,20 @@
# New
---
### 1. Add SSV token to config

### 2. Add new method [sdk.vault.getPeriodicDistributions](https://sdk.stakewise.io/vault/requests/getperiodicdistributions)
Getting the periodic distribution of additional incentives

```ts
type Output = Array<{
apy: string
token: string
}>
```

| Name | Description |
|---------------------|-------------------------|
| `apy` | The average weekly apy of the distribution |
| `token` | The address of the token that is distributed |

# Updates
### 1. [sdk.vault.getStakeBalance](https://sdk.stakewise.io/vault/requests/getstakebalance)
Expand All @@ -16,3 +31,17 @@ type Output = {
|---------------------|-------------------------|
| `assets` | Balance in ETH |
| `totalEarnedAssets` | Total earned rewards |


### 2. [sdk.vault.getVault](https://sdk.stakewise.io/vault/requests/getvault)

#### Add new output item:

```ts
type Output = {
baseApy: number
}
```
| Name | Description |
|-----------|--------------------------------------------------------------|
| `baseApy` | The vault average weekly base APY (without extra incentives) |
3 changes: 3 additions & 0 deletions src/graphql/subgraph/vault/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,3 +18,6 @@ export type { WhitelistAccountsQueryPayload, WhitelistAccountsQueryVariables } f

export { fetchBlocklistAccountsQuery } from './blocklistAccountsQuery.graphql'
export type { BlocklistAccountsQueryPayload, BlocklistAccountsQueryVariables } from './blocklistAccountsQuery.graphql'

export { fetchPeriodicDistributionsQuery } from './periodicDistributionsQuery.graphql'
export type { PeriodicDistributionsQueryPayload, PeriodicDistributionsQueryVariables } from './periodicDistributionsQuery.graphql'
13 changes: 13 additions & 0 deletions src/graphql/subgraph/vault/periodicDistributionsQuery.graphql
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
query PeriodicDistributions($vaultAddress: Bytes!, $startTimestamp: BigInt, $endTimestamp: BigInt) {
periodicDistributions(
where: {
data: $vaultAddress,
distributionType: VAULT,
endTimestamp_gte: $endTimestamp
startTimestamp_lte: $startTimestamp,
}
) {
apy
token
}
}
1 change: 1 addition & 0 deletions src/graphql/subgraph/vault/vaultQuery.graphql
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ query Vault($address: ID!) {
admin
version
isErc20
baseApy
imageUrl
capacity
mevEscrow
Expand Down
6 changes: 6 additions & 0 deletions src/methods/vault/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import getHarvestParams from './requests/getHarvestParams'
import getStakerActions from './requests/getStakerActions'
import getRewardSplitters from './requests/getRewardSplitters'
import getExitQueuePositions from './requests/getExitQueuePositions'
import getPeriodicDistributions from './requests/getPeriodicDistributions'

// Transactions
import { default as create } from './transactions/create'
Expand Down Expand Up @@ -104,6 +105,11 @@ export default {
* @see https://sdk.stakewise.io/vault/requests/getuserapy
*/
getUserApy,
/**
* @description Getting the periodic distribution of additional incentives.
* @see https://sdk.stakewise.io/vault/requests/getperiodicdistributions
*/
getPeriodicDistributions,
},
transactions: {
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
---
id: getPeriodicDistributions
slug: /vault/requests/getperiodicdistributions
---

#### Description:

Getting the periodic distribution of additional incentives

#### Arguments:

| Name | Type | Required | Description |
|--------------|----------|----------|---------------------------|
| vaultAddress | `string` | **Yes** | The address of the vault |
| endTimestamp | `number` | **Yes** | The timestamp when the distribution ends |
| startTimestamp | `number` | **Yes** | The timestamp when the distribution starts |

#### Returns:

```ts
type Output = Array<{
apy: string
token: string
}>
```

| Name | Description |
|---------------------|-------------------------|
| `apy` | The average weekly apy of the distribution |
| `token` | The address of the token that is distributed |

#### Example:

```ts
await sdk.vault.getPeriodicDistributions({
userAddress: '0x...',
endTimestamp: 1741346116,
startTimestamp: 1741346116,
})
```
33 changes: 33 additions & 0 deletions src/methods/vault/requests/getPeriodicDistributions/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import type { PeriodicDistributionsQueryPayload } from '../../../../graphql/subgraph/vault'
import { apiUrls, validateArgs } from '../../../../utils'
import graphql from '../../../../graphql'

import modifyPeriodicDistributions from './modifyPeriodicDistributions'


type GetPeriodicDistributionsInput = {
vaultAddress: string
endTimestamp: number
startTimestamp: number
options: StakeWise.Options
}

const getPeriodicDistributions = (values: GetPeriodicDistributionsInput) => {
const { options, vaultAddress, startTimestamp, endTimestamp } = values

validateArgs.address({ vaultAddress })
validateArgs.number({ startTimestamp, endTimestamp })

return graphql.subgraph.vault.fetchPeriodicDistributionsQuery({
url: apiUrls.getSubgraphqlUrl(options),
variables: {
endTimestamp: String(endTimestamp),
startTimestamp: String(startTimestamp),
vaultAddress: vaultAddress.toLowerCase(),
},
modifyResult: (data: PeriodicDistributionsQueryPayload) => modifyPeriodicDistributions({ data }),
})
}


export default getPeriodicDistributions
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
import type { PeriodicDistributionsQueryPayload } from '../../../../graphql/subgraph/vault'

import modifyPeriodicDistributions from './modifyPeriodicDistributions'


describe('modifyPeriodicDistributions', () => {
it('should modify PeriodicDistributions data', () => {
const mockData: PeriodicDistributionsQueryPayload = {
periodicDistributions: [
{
apy: '0.5',
token: '0x9d65ff81a3c488d585bbfb0bfe3c7707c7917f54',
},
{
apy: '0.5',
token: '0x48C3399719B582dD63eB5AADf12A40B4C3f52FA2',
},
{
apy: '0.5',
token: '0xf1C9acDc66974dFB6dEcB12aA385b9cD01190E38',
},
{
apy: '1.5',
token: '0x9d65ff81a3c488d585bbfb0bfe3c7707c7917f54',
},
{
apy: '2.5',
token: '0x48C3399719B582dD63eB5AADf12A40B4C3f52FA2',
},
{
apy: '3.5',
token: '0xf1C9acDc66974dFB6dEcB12aA385b9cD01190E38',
},
],
}

const expectedOutput = [
{
apy: '2',
token: '0x9d65ff81a3c488d585bbfb0bfe3c7707c7917f54',
},
{
apy: '3',
token: '0x48C3399719B582dD63eB5AADf12A40B4C3f52FA2',
},
{
apy: '4',
token: '0xf1C9acDc66974dFB6dEcB12aA385b9cD01190E38',
},
]

const result = modifyPeriodicDistributions({
data: mockData,
})

expect(result).toEqual(expectedOutput)
})
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import type {
AggregatedPayload,
ModifiedPeriodicDistributions,
ModifyPeriodicDistributionsInput,
} from './types'


const modifyPeriodicDistributions = (input: ModifyPeriodicDistributionsInput): ModifiedPeriodicDistributions => {
const { data } = input

const distributions = data?.periodicDistributions || []

const aggregatedData = distributions.reduce((acc: Record<string, AggregatedPayload>, { apy, token }) => {
const numericApy = parseFloat(apy)

if (acc[token]) {
acc[token].apy += numericApy
}
else {
acc[token] = { token, apy: numericApy }
}

return acc
}, {})

return Object.values(aggregatedData).map(item => ({
token: item.token,
apy: item.apy.toString(),
}))
}


export default modifyPeriodicDistributions
14 changes: 14 additions & 0 deletions src/methods/vault/requests/getPeriodicDistributions/types.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import type { PeriodicDistributionsQueryPayload } from '../../../../graphql/subgraph/vault'

export type ModifyPeriodicDistributionsInput = {
data: PeriodicDistributionsQueryPayload
}

type PeriodicDistributionsPayload = Pick<PeriodicDistributionsQueryPayload['periodicDistributions'][number]>

export type ModifiedPeriodicDistributions = Array<PeriodicDistributionsPayload>

export type AggregatedPayload = {
token: string
apy: number
}
2 changes: 2 additions & 0 deletions src/methods/vault/requests/getVault/getVault.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Returns the master data of the vault
```ts
type Output = {
apy: number
baseApy: number
version: number
isErc20: boolean
capacity: string
Expand Down Expand Up @@ -54,6 +55,7 @@ type Output = {
|-----------------------------|-------------------------------------------------|
| `version` | Vault version |
| `apy` | Current vault apy |
| `baseApy` | The vault average weekly base APY (without extra incentives) |
| `isErc20` | Does the vault have its own ERC20 token |
| `capacity` | Maximum TVL of Vault |
| `createdAt` | Date of Creation |
Expand Down
2 changes: 2 additions & 0 deletions src/methods/vault/requests/getVault/modifyVault.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ describe('modifyVault', () => {
allocatorMaxBoostApy: '123.2',
osTokenHolderMaxBoostApy: '123.2',
apy: '2.80',
baseApy: '0.80',
queuedShares: '0',
blocklistCount: '0',
whitelistCount: '0',
Expand All @@ -52,6 +53,7 @@ describe('modifyVault', () => {
it('should correctly transform the vault data', () => {
const expectedModifiedVault: ModifiedVault = {
apy: 2.80,
baseApy: 0.80,
isErc20: true,
feePercent: 2,
version: 1,
Expand Down
2 changes: 2 additions & 0 deletions src/methods/vault/requests/getVault/modifyVault.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ const modifyVault = (input: ModifyVaultInput): ModifiedVault => {
admin,
address,
version,
baseApy,
mevEscrow,
createdAt,
feePercent,
Expand All @@ -43,6 +44,7 @@ const modifyVault = (input: ModifyVaultInput): ModifiedVault => {
return {
...rest,
apy: Number(apy),
baseApy: Number(baseApy),
version: Number(version),
isSmoothingPool: !mevEscrow,
feePercent: feePercent / 100,
Expand Down
2 changes: 2 additions & 0 deletions src/methods/vault/requests/getVault/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export type ModifiedVault = Omit<
'apy'
| 'admin'
| 'address'
| 'baseApy'
| 'version'
| 'createdAt'
| 'mevEscrow'
Expand All @@ -18,6 +19,7 @@ export type ModifiedVault = Omit<
| 'osTokenHolderMaxBoostApy'
> & {
apy: number
baseApy: number
version: number
createdAt: number
vaultAdmin: string
Expand Down
2 changes: 2 additions & 0 deletions src/utils/configs/chiado.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export default {
},
addresses: {
tokens: {
ssv: ZeroAddress,
swise: '0x460d2c6c3254809949a7d0b4646ce15F77e9c545',
mintToken: '0x0b4F6bFB694790051E0203Db83edbB5888099556',
depositToken: '0x19C653Da7c37c66208fbfbE8908A5051B57b4C70',
Expand Down Expand Up @@ -48,6 +49,7 @@ export default {
},
},
tokens: {
ssv: constants.tokens.ssv,
swise: constants.tokens.swise,
mintToken: constants.tokens.osGNO,
nativeToken: constants.tokens.xdai,
Expand Down
2 changes: 2 additions & 0 deletions src/utils/configs/gnosis.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ export default {
},
addresses: {
tokens: {
ssv: ZeroAddress,
swise: '0xfdA94F056346d2320d4B5E468D6Ad099b2277746',
mintToken: '0xF490c80aAE5f2616d3e3BDa2483E30C4CB21d1A0',
depositToken: '0x9C58BAcC331c9aa871AFD802DB6379a98e80CEdb',
Expand Down Expand Up @@ -48,6 +49,7 @@ export default {
},
},
tokens: {
ssv: constants.tokens.ssv,
swise: constants.tokens.swise,
mintToken: constants.tokens.osGNO,
nativeToken: constants.tokens.xdai,
Expand Down
4 changes: 3 additions & 1 deletion src/utils/configs/holesky.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@ export default {
},
addresses: {
tokens: {
ssv: ZeroAddress,
depositToken: ZeroAddress,
swise: '0x484871C6D54a3dAEBeBBDB0AB7a54c97D72986Bb',
mintToken: '0xF603c5A3F774F05d4D848A9bB139809790890864',
depositToken: ZeroAddress,
v2RewardToken: '0x2ee2E20702B5881a1171c5dbEd01C3d1e49Bf632',
v2StakedToken: '0x91167861c590Fd68bEbE662951fBE30C9B23D759',
},
Expand Down Expand Up @@ -48,6 +49,7 @@ export default {
},
},
tokens: {
ssv: constants.tokens.ssv,
swise: constants.tokens.swise,
mintToken: constants.tokens.osETH,
nativeToken: constants.tokens.eth,
Expand Down
Loading