feat: drift vault info action

This commit is contained in:
michaelessiet
2025-01-10 23:26:14 +01:00
parent 2f83188cb9
commit 8bef717eb9
5 changed files with 158 additions and 18 deletions

View File

@@ -40,7 +40,6 @@ const createDriftVaultAction: Action = {
// regex matches SOL-SPOT
marketName: z
.string()
.regex(/^([A-Za-z0-9]{2,7})-SPOT$/)
.describe('Market name must be in the format "TOKEN-SPOT"'),
redeemPeriod: z
.number()

View File

@@ -0,0 +1,78 @@
import { z } from "zod";
import type { Action } from "../../types";
import { getVaultInfo } from "../../tools";
import type { SolanaAgentKit } from "../../agent";
import { decodeName } from "@drift-labs/vaults-sdk";
import { MainnetSpotMarkets, PERCENTAGE_PRECISION } from "@drift-labs/sdk";
const vaultInfoAction: Action = {
name: "DRIFT_VAULT_INFO",
similes: ["get drift vault info", "vault info", "vault information"],
description: "Get information about a drift vault",
examples: [
[
{
input: {
vaultAddress: "2nFeP7taii",
},
output: {
status: "success",
message: "Vault info retrieved successfully",
data: {
name: "My Drift Vault",
marketName: "SOL-SPOT",
redeemPeriod: 30,
maxTokens: 1000,
minDepositAmount: 100,
managementFee: 10,
profitShare: 5,
hurdleRate: 0.1,
permissioned: false,
},
},
explanation: "Get information about a drift vault",
},
],
],
schema: z.object({
vaultAddress: z.string(),
}),
handler: async (agent: SolanaAgentKit, input) => {
try {
const vaultInfo = await getVaultInfo(agent, input.vaultAddress as string);
const spotToken = MainnetSpotMarkets[vaultInfo.spotMarketIndex];
const data = {
name: decodeName(vaultInfo.name),
marketName: `${spotToken.symbol}-SPOT`,
redeemPeriod: vaultInfo.redeemPeriod.toNumber(),
maxTokens: vaultInfo.maxTokens.div(spotToken.precision).toNumber(),
minDepositAmount: vaultInfo.minDepositAmount
.div(spotToken.precision)
.toNumber(),
managementFee:
(vaultInfo.managementFee.toNumber() /
PERCENTAGE_PRECISION.toNumber()) *
100,
profitShare:
(vaultInfo.profitShare / PERCENTAGE_PRECISION.toNumber()) * 100,
hurdleRate:
(vaultInfo.hurdleRate / PERCENTAGE_PRECISION.toNumber()) * 100,
permissioned: vaultInfo.permissioned,
};
return {
status: "success",
message: "Vault info retrieved successfully",
data,
};
} catch (e) {
return {
status: "error",
// @ts-expect-error - error message
message: `Failed to retrieve vault info: ${e.message}`,
};
}
},
};
export default vaultInfoAction;

View File

@@ -36,6 +36,7 @@ import depositIntoDriftVaultAction from "./drift/depositIntoVault";
import requestWithdrawalFromVaultAction from "./drift/requestWithdrawalFromVault";
import withdrawFromVaultAction from "./drift/withdrawFromVault";
import tradeDelegatedDriftVaultAction from "./drift/tradeDelegatedDriftVault";
import vaultInfoAction from "./drift/vaultInfo";
export const ACTIONS = {
WALLET_ADDRESS_ACTION: getWalletAddressAction,
@@ -77,6 +78,7 @@ export const ACTIONS = {
REQUEST_WITHDRAWAL_FROM_DRIFT_VAULT_ACTION: requestWithdrawalFromVaultAction,
WITHDRAW_FROM_DRIFT_VAULT_ACTION: withdrawFromVaultAction,
TRADE_DELEGATED_DRIFT_VAULT_ACTION: tradeDelegatedDriftVaultAction,
DRIFT_VAULT_INFO_ACTION: vaultInfoAction,
};
export type { Action, ActionExample, Handler } from "../types/action";