Skip to content

Commit b9f9778

Browse files
committed
feat: added pooled staking vault daily apy averages to earn controller state
1 parent 3b76ebf commit b9f9778

File tree

2 files changed

+54
-1
lines changed

2 files changed

+54
-1
lines changed

packages/earn-controller/src/EarnController.test.ts

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ jest.mock('@metamask/stake-sdk', () => ({
2727
getPooledStakingEligibility: jest.fn(),
2828
getVaultData: jest.fn(),
2929
getVaultDailyApys: jest.fn(),
30+
getVaultApyAverages: jest.fn(),
3031
})),
3132
}));
3233

@@ -178,6 +179,15 @@ const mockPooledStakingVaultDailyApys = [
178179
},
179180
];
180181

182+
const mockPooledStakingVaultApyAverages = {
183+
oneDay: '3.047713358665092375',
184+
oneWeek: '3.25756026351317301786',
185+
oneMonth: '3.25616054301749304217',
186+
threeMonths: '3.31863306662107446672',
187+
sixMonths: '3.05557344496273894133',
188+
oneYear: '0',
189+
};
190+
181191
const setupController = ({
182192
options = {},
183193

@@ -257,6 +267,9 @@ describe('EarnController', () => {
257267
getVaultDailyApys: jest
258268
.fn()
259269
.mockResolvedValue(mockPooledStakingVaultDailyApys),
270+
getVaultApyAverages: jest
271+
.fn()
272+
.mockResolvedValue(mockPooledStakingVaultApyAverages),
260273
} as Partial<StakingApiService>;
261274

262275
StakingApiServiceMock.mockImplementation(
@@ -278,6 +291,7 @@ describe('EarnController', () => {
278291
vaultMetadata: mockVaultMetadata,
279292
isEligible: true,
280293
vaultDailyApys: mockPooledStakingVaultDailyApys,
294+
vaultApyAverages: mockPooledStakingVaultApyAverages,
281295
},
282296
lastUpdated: 1234567890,
283297
};
@@ -362,6 +376,7 @@ describe('EarnController', () => {
362376
exchangeRate: '1.5',
363377
vaultMetadata: mockVaultMetadata,
364378
vaultDailyApys: mockPooledStakingVaultDailyApys,
379+
vaultApyAverages: mockPooledStakingVaultApyAverages,
365380
isEligible: true,
366381
});
367382
expect(controller.state.lastUpdated).toBeDefined();
@@ -420,13 +435,14 @@ describe('EarnController', () => {
420435
consoleErrorSpy.mockRestore();
421436
});
422437

423-
// if no account is selected, it should not fetch stakes data but still update vault metadata
438+
// if no account is selected, it should not fetch stakes data but still update vault metadata, vault daily apys and vault apy averages.
424439
it('does not fetch staking data if no account is selected', async () => {
425440
const { controller } = setupController({
426441
mockGetSelectedAccount: jest.fn(() => null),
427442
});
428443

429444
expect(mockedStakingApiService.getPooledStakes).not.toHaveBeenCalled();
445+
430446
await controller.refreshPooledStakingData();
431447

432448
expect(controller.state.pooled_staking.pooledStakes).toStrictEqual(
@@ -435,6 +451,12 @@ describe('EarnController', () => {
435451
expect(controller.state.pooled_staking.vaultMetadata).toStrictEqual(
436452
mockVaultMetadata,
437453
);
454+
expect(controller.state.pooled_staking.vaultDailyApys).toStrictEqual(
455+
mockPooledStakingVaultDailyApys,
456+
);
457+
expect(controller.state.pooled_staking.vaultApyAverages).toStrictEqual(
458+
mockPooledStakingVaultApyAverages,
459+
);
438460
expect(controller.state.pooled_staking.isEligible).toBe(false);
439461
});
440462
});

packages/earn-controller/src/EarnController.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import {
2323
type StakeSdkConfig,
2424
type VaultData,
2525
type VaultDailyApy,
26+
type VaultApyAverages,
2627
} from '@metamask/stake-sdk';
2728

2829
export const controllerName = 'EarnController';
@@ -32,6 +33,7 @@ export type PooledStakingState = {
3233
exchangeRate: string;
3334
vaultMetadata: VaultData;
3435
vaultDailyApys: VaultDailyApy[];
36+
vaultApyAverages: VaultApyAverages;
3537
isEligible: boolean;
3638
};
3739

@@ -87,6 +89,15 @@ const DEFAULT_STABLECOIN_VAULT: StablecoinVault = {
8789
liquidity: '0',
8890
};
8991

92+
const DEFAULT_POOLED_STAKING_VAULT_APY_AVERAGES: VaultApyAverages = {
93+
oneDay: '0',
94+
oneWeek: '0',
95+
oneMonth: '0',
96+
threeMonths: '0',
97+
sixMonths: '0',
98+
oneYear: '0',
99+
};
100+
90101
/**
91102
* Gets the default state for the EarnController.
92103
*
@@ -110,6 +121,7 @@ export function getDefaultEarnControllerState(): EarnControllerState {
110121
vaultAddress: '0x0000000000000000000000000000000000000000',
111122
},
112123
vaultDailyApys: [],
124+
vaultApyAverages: DEFAULT_POOLED_STAKING_VAULT_APY_AVERAGES,
113125
isEligible: false,
114126
},
115127
stablecoin_lending: {
@@ -387,6 +399,22 @@ export class EarnController extends BaseController<
387399
});
388400
}
389401

402+
/**
403+
* Refreshes pooled staking vault apy averages for the current chain.
404+
* Updates the pooled staking vault apy averages controller state.
405+
*
406+
* @returns A promise that resolves when the pooled staking vault apy averages have been updated.
407+
*/
408+
async refreshPooledStakingVaultApyAverages() {
409+
const chainId = this.#getCurrentChainId();
410+
const vaultApyAverages =
411+
await this.#stakingApiService.getVaultApyAverages(chainId);
412+
413+
this.update((state) => {
414+
state.pooled_staking.vaultApyAverages = vaultApyAverages;
415+
});
416+
}
417+
390418
/**
391419
* Refreshes all pooled staking related data including stakes, eligibility, and vault data.
392420
* This method allows partial success, meaning some data may update while other requests fail.
@@ -412,6 +440,9 @@ export class EarnController extends BaseController<
412440
this.refreshPooledStakingVaultDailyApys().catch((error) => {
413441
errors.push(error);
414442
}),
443+
this.refreshPooledStakingVaultApyAverages().catch((error) => {
444+
errors.push(error);
445+
}),
415446
]);
416447

417448
if (errors.length > 0) {

0 commit comments

Comments
 (0)