Skip to content

Commit

Permalink
pluto fix
Browse files Browse the repository at this point in the history
  • Loading branch information
opptylabs committed Feb 14, 2025
1 parent bf888ea commit 27516d1
Show file tree
Hide file tree
Showing 5 changed files with 115 additions and 19 deletions.
4 changes: 4 additions & 0 deletions packages/plugins/src/plugins/pluto/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,3 +22,7 @@ export const leverageObligationDataSize = 6696;

export const earnVaultsKey = 'earn-vaults';
export const leveragesVaultKey = 'leverage-vaults';
export const leveragesVaultApiKey = 'leverage-vaults-api';

export const leverageVaultsApiUrl =
'https://storage.googleapis.com/plutoso/accounts.json';
7 changes: 6 additions & 1 deletion packages/plugins/src/plugins/pluto/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,12 @@ import leverageFetcher from './leverageFetcher';
import earnFetcher from './earnFetcher';
import earnVaultsJob from './earnVaultsJob';
import leverageVaultsJob from './leverageVaultsJob';
import leverageVaultsApiJob from './leverageVaultsApiJob';

export const platforms: Platform[] = [platform];
export const jobs: Job[] = [earnVaultsJob, leverageVaultsJob];
export const jobs: Job[] = [
earnVaultsJob,
leverageVaultsJob,
leverageVaultsApiJob,
];
export const fetchers: Fetcher[] = [earnFetcher, leverageFetcher];
61 changes: 43 additions & 18 deletions packages/plugins/src/plugins/pluto/leverageFetcher.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
import { apyToApr, NetworkId } from '@sonarwatch/portfolio-core';
import { Fetcher, FetcherExecutor } from '../../Fetcher';
import { leveragesVaultKey, platformId } from './constants';
import {
leveragesVaultApiKey,
leveragesVaultKey,
platformId,
} from './constants';
import { getClientSolana } from '../../utils/clients';
import { Cache } from '../../Cache';
import { getLeverageObligations } from './helper';
import { MemoizedCache } from '../../utils/misc/MemoizedCache';
import { ParsedAccount } from '../../utils/solana';
import { VaultLeverage } from './structs';
import { ElementRegistry } from '../../utils/elementbuilder/ElementRegistry';
import { LeverageVaultAddress } from './types';

const leverageVaultsMemo = new MemoizedCache<ParsedAccount<VaultLeverage>[]>(
leveragesVaultKey,
Expand All @@ -17,6 +22,14 @@ const leverageVaultsMemo = new MemoizedCache<ParsedAccount<VaultLeverage>[]>(
}
);

const leverageVaultsApiMemo = new MemoizedCache<LeverageVaultAddress[]>(
leveragesVaultApiKey,
{
prefix: platformId,
networkId: NetworkId.solana,
}
);

const executor: FetcherExecutor = async (owner: string, cache: Cache) => {
const client = getClientSolana();

Expand All @@ -26,14 +39,24 @@ const executor: FetcherExecutor = async (owner: string, cache: Cache) => {
const vaults = await leverageVaultsMemo.getItem(cache);
if (!vaults.length) return [];

// used only for vault name, non necessary
const vaultsApi = await leverageVaultsApiMemo.getItem(cache);

const elementRegistry = new ElementRegistry(NetworkId.solana, platformId);
accounts.forEach((acc) => {
const vault = vaults.find(
(v) => v.protocol.toString() === acc.protocol.toString()
(v) => v.pubkey.toString() === acc.vault.toString()
);
if (!vault) return;

const vaultFromApi = vaultsApi.find(
(v) => v.leverageVault === vault.pubkey.toString()
);

const element = elementRegistry.addElementBorrowlend({
name: `Leverage`,
name: `Leverage ${
vaultFromApi ? vaultFromApi.leverageName.replace('-', '/') : ''
}`,
label: 'Leverage',
ref: acc.pubkey,
sourceRefs: [
Expand All @@ -50,12 +73,15 @@ const executor: FetcherExecutor = async (owner: string, cache: Cache) => {
continue;
}

const unit = position.unit.toNumber() / 1e8;
const borrowingUnit = position.borrowing_unit.toNumber() / 1e8;
const borrowingIndex = vault.borrowingIndex / 1e12;
const borrowingAmount = borrowingUnit * borrowingIndex;
const index = vault.index / 1e12;
const amount = unit * index;
const amount = position.token_collateral_amount
.shiftedBy(-vault.tokenCollateralTokenDecimal)
.toNumber();

element.addSuppliedAsset({
address: vault.tokenCollateralTokenMint.toString(),
amount,
alreadyShifted: true,
});

const apy = Number(vault.apy.ema7d / 1e5);
element.addSuppliedYield([
Expand All @@ -65,24 +91,23 @@ const executor: FetcherExecutor = async (owner: string, cache: Cache) => {
},
]);

element.addSuppliedAsset({
address: vault.nativeCollateralTokenMint.toString(),
amount,
const borrowingUnit = position.borrowing_unit.toNumber() / 1e8;
const borrowingIndex = vault.borrowingIndex / 1e12;
const borrowingAmount = borrowingUnit * borrowingIndex;
const borrowingApy = Number(vault.borrowingApy.ema7d / 1e5);

element.addBorrowedAsset({
address: vault.tokenCollateralTokenMint.toString(),
amount: borrowingAmount,
alreadyShifted: true,
});

const borrowingApy = Number(vault.borrowingApy.ema7d / 1e5);
element.addBorrowedYield([
{
apy: borrowingApy,
apr: apyToApr(borrowingApy),
},
]);
element.addBorrowedAsset({
address: vault.tokenCollateralTokenMint.toString(),
amount: borrowingAmount,
alreadyShifted: true,
});
}
});

Expand Down
30 changes: 30 additions & 0 deletions packages/plugins/src/plugins/pluto/leverageVaultsApiJob.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
import { NetworkId } from '@sonarwatch/portfolio-core';
import axios from 'axios';
import { Cache } from '../../Cache';
import { Job, JobExecutor } from '../../Job';
import {
leveragesVaultApiKey,
leverageVaultsApiUrl,
platformId,
} from './constants';
import { LeverageVaultAddress } from './types';

const executor: JobExecutor = async (cache: Cache) => {
const vaults = await axios
.get<{ production: { [key: string]: LeverageVaultAddress }[] }>(
leverageVaultsApiUrl
)
.then((response) => response.data);

await cache.setItem(leveragesVaultApiKey, Object.values(vaults.production), {
prefix: platformId,
networkId: NetworkId.solana,
});
};

const job: Job = {
id: `${platformId}-leverage-vaults-api`,
executor,
label: 'normal',
};
export default job;
32 changes: 32 additions & 0 deletions packages/plugins/src/plugins/pluto/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
export type LeverageVaultAddress = {
earnName: string;
leverageName: string;
programId: string;
protocol: string;
indexer: string;
keeper: string;
feeVault: string;
tokenProgramA: string;
tokenMintA: string;
tokenDecimalA: number;
tokenCollateralPriceOracle: string;
tokenCollateralPriceFeed: string;
tokenProgramB: string;
tokenMintB: string;
tokenDecimalB: number;
nativeCollateralPriceOracle: string;
nativeCollateralPriceFeed: string;
earnConfig: string;
earnStats: string;
earnVaultAuthority: string;
earnVault: string;
earnVaultLiquidity: string;
leverageConfig: string;
leverageStats: string;
leverageVaultAuthority: string;
leverageVault: string;
leverageVaultTokenCollateralLiquidity: string;
leverageVaultNativeCollateralLiquidity: string;
lookupTable: string;
lookupTableGeneric: string;
};

0 comments on commit 27516d1

Please sign in to comment.