Skip to content
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.

fix(curve): add cadc/usdc pool and farm #392

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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
15 changes: 10 additions & 5 deletions src/apps/curve/ethereum/curve.farm.contract-position-fetcher.ts
Expand Up @@ -71,6 +71,7 @@ export const FARMS = {
const appId = CURVE_DEFINITION.id;
const groupId = CURVE_DEFINITION.groups.farm.id;
const network = Network.ETHEREUM_MAINNET;
const CRV_TOKEN_ADDRESS = CURVE_DEFINITION.token!.address;

@Register.ContractPositionFetcher({ appId, groupId, network })
export class EthereumCurveFarmContractPositionFetcher implements PositionFetcher<ContractPosition> {
Expand All @@ -92,11 +93,18 @@ export class EthereumCurveFarmContractPositionFetcher implements PositionFetcher
appId,
groupId,
dependencies: [{ appId: CURVE_DEFINITION.id, groupIds: [CURVE_DEFINITION.groups.pool.id], network }],
resolveFarmAddresses: () => FARMS.single,
resolveFarmAddresses: async () => {
const factoryGaugeAddresses = await this.curveFactoryGaugeAddressHelper.getGaugeAddresses({
factoryAddress: '0xf18056bbd320e96a48e3fbf8bc061322531aac99',
network,
getPoolAddress: poolToken => poolToken.dataProps.swapAddress,
});
return [...FARMS.single, ...factoryGaugeAddresses];
},
resolveImplementation: () => 'single-gauge',
resolveFarmContract: ({ address, network }) => this.curveContractFactory.curveGauge({ address, network }),
resolveStakedTokenAddress: ({ contract, multicall }) => multicall.wrap(contract).lp_token(),
resolveRewardTokenAddresses: async () => ['0xd533a949740bb3306d119cc777fa900ba034cd52'],
resolveRewardTokenAddresses: async () => [CRV_TOKEN_ADDRESS],
resolveIsActive: this.curveGaugeIsActiveStrategy.build({
resolveInflationRate: ({ contract, multicall }) => multicall.wrap(contract).inflation_rate(),
}),
Expand Down Expand Up @@ -126,7 +134,6 @@ export class EthereumCurveFarmContractPositionFetcher implements PositionFetcher
resolveStakedTokenAddress: ({ contract, multicall }) => multicall.wrap(contract).lp_token(),
resolveTotalValueLocked: ({ contract, multicall }) => multicall.wrap(contract).totalSupply(),
resolveRewardTokenAddresses: async ({ contract, multicall }) => {
const CRV_TOKEN_ADDRESS = '0xd533a949740bb3306d119cc777fa900ba034cd52';
const bonusRewardTokenAddress = await multicall.wrap(contract).rewarded_token();
return [CRV_TOKEN_ADDRESS, bonusRewardTokenAddress].filter(v => v !== ZERO_ADDRESS);
},
Expand Down Expand Up @@ -166,7 +173,6 @@ export class EthereumCurveFarmContractPositionFetcher implements PositionFetcher
resolveFarmContract: ({ address, network }) => this.curveContractFactory.curveNGauge({ address, network }),
resolveStakedTokenAddress: ({ contract, multicall }) => multicall.wrap(contract).lp_token(),
resolveRewardTokenAddresses: async ({ contract, multicall }) => {
const CRV_TOKEN_ADDRESS = '0xd533a949740bb3306d119cc777fa900ba034cd52';
const bonusRewardTokenAddress = await multicall.wrap(contract).reward_tokens(0);
return [CRV_TOKEN_ADDRESS, bonusRewardTokenAddress].filter(v => v !== ZERO_ADDRESS);
},
Expand Down Expand Up @@ -199,7 +205,6 @@ export class EthereumCurveFarmContractPositionFetcher implements PositionFetcher
resolveFarmContract: ({ address, network }) => this.curveContractFactory.curveNGauge({ address, network }),
resolveStakedTokenAddress: ({ contract, multicall }) => multicall.wrap(contract).lp_token(),
resolveRewardTokenAddresses: async ({ contract, multicall }) => {
const CRV_TOKEN_ADDRESS = '0xd533a949740bb3306d119cc777fa900ba034cd52';
const bonusRewardTokenAddress = await multicall.wrap(contract).reward_tokens(0);
return [CRV_TOKEN_ADDRESS, bonusRewardTokenAddress].filter(v => v !== ZERO_ADDRESS);
},
Expand Down
11 changes: 8 additions & 3 deletions src/apps/curve/helpers/curve.factory-gauge.address-helper.ts
Expand Up @@ -2,14 +2,18 @@ import { Inject, Injectable } from '@nestjs/common';

import { APP_TOOLKIT, IAppToolkit } from '~app-toolkit/app-toolkit.interface';
import { ZERO_ADDRESS } from '~app-toolkit/constants/address';
import { AppTokenPosition } from '~position/position.interface';
import { Network } from '~types/network.interface';

import { CurveContractFactory } from '../contracts';
import { CURVE_DEFINITION } from '../curve.definition';

import { CurvePoolTokenDataProps } from './curve.pool.token-helper';

type CurveFactoryGaugeAddressHelperParams = {
factoryAddress: string;
network: Network;
getPoolAddress?: (poolToken: AppTokenPosition<CurvePoolTokenDataProps>) => string;
};

@Injectable()
Expand All @@ -19,18 +23,19 @@ export class CurveFactoryGaugeAddressHelper {
@Inject(CurveContractFactory) private readonly curveContractFactory: CurveContractFactory,
) {}

async getGaugeAddresses({ factoryAddress, network }: CurveFactoryGaugeAddressHelperParams) {
async getGaugeAddresses({ factoryAddress, network, getPoolAddress }: CurveFactoryGaugeAddressHelperParams) {
const multicall = this.appToolkit.getMulticall(network);
const factoryContract = this.curveContractFactory.curveFactoryV2({ address: factoryAddress, network });
const poolTokens = await this.appToolkit.getAppTokenPositions({
const poolTokens = await this.appToolkit.getAppTokenPositions<CurvePoolTokenDataProps>({
appId: CURVE_DEFINITION.id,
groupIds: [CURVE_DEFINITION.groups.pool.id],
network,
});

const maybeGaugeAddresses = await Promise.all(
poolTokens.map(async poolToken => {
const gaugeAddressRaw = await multicall.wrap(factoryContract).get_gauge(poolToken.address);
const tokenAddress = getPoolAddress ? getPoolAddress(poolToken) : poolToken.address;
const gaugeAddressRaw = await multicall.wrap(factoryContract).get_gauge(tokenAddress);
const gaugeAddress = gaugeAddressRaw.toLowerCase();
return gaugeAddress;
}),
Expand Down