Files
solana-agent-kit/src/actions/orca/createOrcaSingleSidedWhirlpool.ts
2025-01-10 17:34:13 +05:30

117 lines
3.3 KiB
TypeScript

import { Action } from "../../types/action";
import { SolanaAgentKit } from "../../agent";
import { z } from "zod";
import { PublicKey } from "@solana/web3.js";
import { Decimal } from "decimal.js";
import { orcaCreateSingleSidedLiquidityPool } from "../../tools";
// Fee tiers mapping from the original tool
const FEE_TIERS = {
0.01: 1,
0.02: 2,
0.04: 4,
0.05: 8,
0.16: 16,
0.3: 64,
0.65: 96,
1.0: 128,
2.0: 256,
} as const;
const createOrcaSingleSidedWhirlpoolAction: Action = {
name: "CREATE_ORCA_SINGLE_SIDED_WHIRLPOOL",
similes: [
"create orca whirlpool",
"setup orca single sided pool",
"initialize orca whirlpool",
"create orca concentrated pool",
"setup orca concentrated liquidity",
"create orca trading pair",
],
description:
"Create a new single-sided whirlpool on Orca with concentrated liquidity",
examples: [
[
{
input: {
depositTokenAmount: "1000000000000", // 1 million tokens with 6 decimals
depositTokenMint: "EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v", // USDC
otherTokenMint: "So11111111111111111111111111111111111111112", // SOL
initialPrice: "0.001",
maxPrice: "5.0",
feeTier: 0.3,
},
output: {
status: "success",
signature: "2ZE7Rz...",
message: "Successfully created Orca single-sided whirlpool",
},
explanation:
"Create a USDC/SOL whirlpool with 1M USDC initial liquidity",
},
],
],
schema: z.object({
depositTokenAmount: z
.string()
.min(1)
.describe(
"The amount of deposit token to provide as liquidity (including decimals)",
),
depositTokenMint: z
.string()
.min(1)
.describe("The mint address of the token being deposited"),
otherTokenMint: z
.string()
.min(1)
.describe("The mint address of the other token in the pool"),
initialPrice: z
.string()
.min(1)
.describe("Initial price of deposit token in terms of the other token"),
maxPrice: z
.string()
.min(1)
.describe("Maximum price at which liquidity is added"),
feeTier: z
.number()
.refine((val) => val in FEE_TIERS, "Invalid fee tier")
.describe("Fee tier percentage for the pool (e.g., 0.3 for 0.3%)"),
}),
handler: async (agent: SolanaAgentKit, input: Record<string, any>) => {
try {
const depositTokenAmount = Number(input.depositTokenAmount);
const depositTokenMint = new PublicKey(input.depositTokenMint);
const otherTokenMint = new PublicKey(input.otherTokenMint);
const initialPrice = new Decimal(input.initialPrice);
const maxPrice = new Decimal(input.maxPrice);
const feeTier = input.feeTier;
// Create the whirlpool
const signature = await orcaCreateSingleSidedLiquidityPool(
agent,
depositTokenAmount,
depositTokenMint,
otherTokenMint,
initialPrice,
maxPrice,
feeTier,
);
return {
status: "success",
signature,
message: "Successfully created Orca single-sided whirlpool",
};
} catch (error: any) {
return {
status: "error",
message: `Failed to create whirlpool: ${error.message}`,
};
}
},
};
export default createOrcaSingleSidedWhirlpoolAction;