Skip to content

Commit a66dfa9

Browse files
authored
Merge pull request #353 from Anchor-Protocol/feature/deposit-apy
More precise apy calc with epoch period.
2 parents 7549f2f + 6c4df9e commit a66dfa9

File tree

5 files changed

+36
-13
lines changed

5 files changed

+36
-13
lines changed

app/src/@anchor-protocol/app-fns/logics/earn/computeApy.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,13 @@ import { computeApr } from './computeApr';
55
export function computeApy(
66
depositRate: Rate | undefined,
77
blocksPerYear: number,
8+
epochPeriod: number,
89
): Rate<Big> {
10+
const compoundTimes = blocksPerYear / epochPeriod;
11+
const perCompound = big(depositRate ?? '0').mul(epochPeriod);
12+
913
const apy = big(
10-
Math.pow(
11-
big(depositRate ?? '0')
12-
.add(1)
13-
.toNumber(),
14-
blocksPerYear,
15-
) - 1,
14+
Math.pow(perCompound.add(1).toNumber(), compoundTimes) - 1,
1615
) as Rate<Big>;
1716

1817
if (apy.toNumber() >= 0.19) {

app/src/@anchor-protocol/app-fns/queries/earn/epochStates.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,10 @@ interface EarnEpochStatesWasmQuery {
1515
moneyMarket.overseer.EpochState,
1616
moneyMarket.overseer.EpochStateResponse
1717
>;
18+
overseerConfig: WasmQuery<
19+
moneyMarket.overseer.Config,
20+
moneyMarket.overseer.ConfigResponse
21+
>;
1822
}
1923

2024
export type EarnEpochStates = WasmQueryData<EarnEpochStatesWasmQuery>;
@@ -45,6 +49,12 @@ export async function earnEpochStatesQuery(
4549
epoch_state: {},
4650
},
4751
},
52+
overseerConfig: {
53+
contractAddress: overseerContract,
54+
query: {
55+
config: {},
56+
},
57+
},
4858
},
4959
});
5060
}

app/src/hooks/useDepositApy.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,14 @@ import { useMemo } from 'react';
77

88
export const useDepositApy = () => {
99
const { constants } = useAnchorWebapp();
10-
const { data: { overseerEpochState } = {} } = useEarnEpochStatesQuery();
10+
const { data: { overseerConfig, overseerEpochState } = {} } =
11+
useEarnEpochStatesQuery();
1112

1213
return useMemo(() => {
1314
return computeApy(
1415
overseerEpochState?.deposit_rate,
1516
constants.blocksPerYear,
17+
overseerConfig?.epoch_period ?? 1,
1618
);
17-
}, [constants.blocksPerYear, overseerEpochState]);
19+
}, [constants.blocksPerYear, overseerEpochState, overseerConfig]);
1820
};

app/src/pages/earn/components/InterestSection.tsx

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ export function InterestSection({ className }: InterestSectionProps) {
2828
const { constants } = useAnchorWebapp();
2929

3030
const { data: { apyHistory } = {} } = useEarnAPYHistoryQuery();
31-
const { data: { overseerEpochState } = {} } = useEarnEpochStatesQuery();
31+
const { data: { overseerEpochState, overseerConfig } = {} } =
32+
useEarnEpochStatesQuery();
3233

3334
const apy = useDepositApy();
3435

@@ -41,6 +42,7 @@ export function InterestSection({ className }: InterestSectionProps) {
4142
value: computeApy(
4243
DepositRate,
4344
constants.blocksPerYear,
45+
overseerConfig?.epoch_period ?? 1,
4446
).toNumber() as Rate<number>,
4547
}))
4648
.reverse();
@@ -54,7 +56,13 @@ export function InterestSection({ className }: InterestSectionProps) {
5456
},
5557
]
5658
: undefined;
57-
}, [apyHistory, constants.blocksPerYear, apy, overseerEpochState]);
59+
}, [
60+
apyHistory,
61+
constants.blocksPerYear,
62+
apy,
63+
overseerEpochState,
64+
overseerConfig,
65+
]);
5866

5967
return (
6068
<Section className={className}>

app/src/queries/earn/useEarnApyProjectionQuery.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,16 @@ const computeNewRate = (
6868

6969
const bound = (rate: Big) => {
7070
return max(
71-
min(rate, computeApy(dyn_rate_max, blocksPerYear)),
72-
computeApy(dyn_rate_min, blocksPerYear),
71+
min(rate, computeApy(dyn_rate_max, blocksPerYear, config.epoch_period)),
72+
computeApy(dyn_rate_min, blocksPerYear, config.epoch_period),
7373
);
7474
};
7575

76-
const currentRate = computeApy(threshold_deposit_rate, blocksPerYear);
76+
const currentRate = computeApy(
77+
threshold_deposit_rate,
78+
blocksPerYear,
79+
config.epoch_period,
80+
);
7781

7882
if (yr.isHigher) {
7983
return bound(currentRate.plus(yr.change));

0 commit comments

Comments
 (0)