This commit is contained in:
Arihant Bansal
2024-12-22 01:30:29 +05:30
parent ed689f5efd
commit 6d4f468fb3
43 changed files with 407 additions and 213 deletions

View File

@@ -1,7 +1,7 @@
import { PublicKey } from "@solana/web3.js";
import Decimal from "decimal.js";
import { Tool } from "langchain/tools";
import { SolanaAgent } from "../index";
import { SolanaAgentKit } from "../index";
import { create_image } from "../tools/create_image";
import { BN } from "@coral-xyz/anchor";
import { FEE_TIERS } from "../tools";
@@ -17,14 +17,14 @@ export class SolanaBalanceTool extends Tool {
Inputs:
tokenAddress: string, eg "So11111111111111111111111111111111111111112" (optional)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const tokenAddress = input ? new PublicKey(input) : undefined;
const balance = await this.solanaAgent.getBalance(tokenAddress);
const balance = await this.solanaKit.getBalance(tokenAddress);
return JSON.stringify({
status: "success",
@@ -50,7 +50,7 @@ export class SolanaTransferTool extends Tool {
amount: number, eg 1 (required)
mint?: string, eg "So11111111111111111111111111111111111111112" or "SENDdRQtYMWaQrBroBrJ2Q53fgVuq95CV9UPGEvpCxa" (optional)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -63,7 +63,7 @@ export class SolanaTransferTool extends Tool {
? new PublicKey(parsedInput.mint)
: undefined;
const tx = await this.solanaAgent.transfer(
const tx = await this.solanaKit.transfer(
recipient,
parsedInput.amount,
mintAddress,
@@ -98,7 +98,7 @@ export class SolanaDeployTokenTool extends Tool {
decimals?: number, eg 9 (optional, defaults to 9)
initialSupply?: number, eg 1000000 (optional)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -106,7 +106,7 @@ export class SolanaDeployTokenTool extends Tool {
try {
const parsedInput = JSON.parse(input);
const result = await this.solanaAgent.deployToken(
const result = await this.solanaKit.deployToken(
parsedInput.name,
parsedInput.uri,
parsedInput.symbol,
@@ -139,7 +139,7 @@ export class SolanaDeployCollectionTool extends Tool {
uri: string, eg "https://example.com/collection.json" (required)
royaltyBasisPoints?: number, eg 500 for 5% (optional)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -147,7 +147,7 @@ export class SolanaDeployCollectionTool extends Tool {
try {
const parsedInput = JSON.parse(input);
const result = await this.solanaAgent.deployCollection(parsedInput);
const result = await this.solanaKit.deployCollection(parsedInput);
return JSON.stringify({
status: "success",
@@ -173,9 +173,9 @@ export class SolanaMintNFTTool extends Tool {
collectionMint: string, eg "J1S9H3QjnRtBbbuD4HjPV6RpRhwuk4zKbxsnCHuTgh9w" (required) - The address of the collection to mint into
name: string, eg "My NFT" (required)
uri: string, eg "https://example.com/nft.json" (required)
recipient?: string, eg "9aUn5swQzUTRanaaTwmszxiv89cvFwUCjEBv1vZCoT1u" (optional) - The wallet to receive the NFT, defaults to agent's wallet which is ${this.solanaAgent.wallet_address.toString()}`;
recipient?: string, eg "9aUn5swQzUTRanaaTwmszxiv89cvFwUCjEBv1vZCoT1u" (optional) - The wallet to receive the NFT, defaults to agent's wallet which is ${this.solanaKit.wallet_address.toString()}`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -183,7 +183,7 @@ export class SolanaMintNFTTool extends Tool {
try {
const parsedInput = JSON.parse(input);
const result = await this.solanaAgent.mintNFT(
const result = await this.solanaKit.mintNFT(
new PublicKey(parsedInput.collectionMint),
{
name: parsedInput.name,
@@ -191,7 +191,7 @@ export class SolanaMintNFTTool extends Tool {
},
parsedInput.recipient
? new PublicKey(parsedInput.recipient)
: this.solanaAgent.wallet_address,
: this.solanaKit.wallet_address,
);
return JSON.stringify({
@@ -225,7 +225,7 @@ export class SolanaTradeTool extends Tool {
inputMint?: string, eg "So11111111111111111111111111111111111111112" (optional)
slippageBps?: number, eg 100 (optional)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -233,7 +233,7 @@ export class SolanaTradeTool extends Tool {
try {
const parsedInput = JSON.parse(input);
const tx = await this.solanaAgent.trade(
const tx = await this.solanaKit.trade(
new PublicKey(parsedInput.outputMint),
parsedInput.inputAmount,
parsedInput.inputMint
@@ -264,18 +264,18 @@ export class SolanaRequestFundsTool extends Tool {
name = "solana_request_funds";
description = "Request SOL from Solana faucet (devnet/testnet only)";
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(_input: string): Promise<string> {
try {
await this.solanaAgent.requestFaucetFunds();
await this.solanaKit.requestFaucetFunds();
return JSON.stringify({
status: "success",
message: "Successfully requested faucet funds",
network: this.solanaAgent.connection.rpcEndpoint.split("/")[2],
network: this.solanaKit.connection.rpcEndpoint.split("/")[2],
});
} catch (error: any) {
return JSON.stringify({
@@ -296,7 +296,7 @@ export class SolanaRegisterDomainTool extends Tool {
spaceKB: number, eg 1 (optional, default is 1)
`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -317,7 +317,7 @@ export class SolanaRegisterDomainTool extends Tool {
const parsedInput = toJSON(input);
this.validateInput(parsedInput);
const tx = await this.solanaAgent.registerDomain(
const tx = await this.solanaKit.registerDomain(
parsedInput.name,
parsedInput.spaceKB || 1,
);
@@ -347,14 +347,14 @@ export class SolanaResolveDomainTool extends Tool {
domain: string, eg "pumpfun.sol" or "pumpfun"(required)
`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const domain = input.trim();
const publicKey = await this.solanaAgent.resolveSolDomain(domain);
const publicKey = await this.solanaKit.resolveSolDomain(domain);
return JSON.stringify({
status: "success",
@@ -379,14 +379,14 @@ export class SolanaGetDomainTool extends Tool {
account: string, eg "4Be9CvxqHW6BYiRAxW9Q3xu1ycTMWaL5z8NX4HR3ha7t" (required)
`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const account = new PublicKey(input.trim());
const domain = await this.solanaAgent.getPrimaryDomain(account);
const domain = await this.solanaKit.getPrimaryDomain(account);
return JSON.stringify({
status: "success",
@@ -407,12 +407,12 @@ export class SolanaGetWalletAddressTool extends Tool {
name = "solana_get_wallet_address";
description = `Get the wallet address of the agent`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
async _call(_input: string): Promise<string> {
return this.solanaAgent.wallet_address.toString();
return this.solanaKit.wallet_address.toString();
}
}
@@ -430,7 +430,7 @@ export class SolanaPumpfunTokenLaunchTool extends Tool {
description: string, eg "PumpFun Token is a token on the Solana blockchain",
imageUrl: string, eg "https://i.imgur.com/UFm07Np_d.png`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -464,7 +464,7 @@ export class SolanaPumpfunTokenLaunchTool extends Tool {
this.validateInput(parsedInput);
// Launch token with validated input
await this.solanaAgent.launchPumpFunToken(
await this.solanaKit.launchPumpFunToken(
parsedInput.tokenName,
parsedInput.tokenTicker,
parsedInput.description,
@@ -498,7 +498,7 @@ export class SolanaCreateImageTool extends Tool {
description =
"Create an image using OpenAI's DALL-E. Input should be a string prompt for the image.";
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -511,7 +511,7 @@ export class SolanaCreateImageTool extends Tool {
protected async _call(input: string): Promise<string> {
try {
this.validateInput(input);
const result = await create_image(this.solanaAgent, input.trim());
const result = await create_image(this.solanaKit, input.trim());
return JSON.stringify({
status: "success",
@@ -535,7 +535,7 @@ export class SolanaLendAssetTool extends Tool {
Inputs (input is a json string):
amount: number, eg 1, 0.01 (required)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -543,7 +543,7 @@ export class SolanaLendAssetTool extends Tool {
try {
let amount = JSON.parse(input).amount || input;
const tx = await this.solanaAgent.lendAssets(amount);
const tx = await this.solanaKit.lendAssets(amount);
return JSON.stringify({
status: "success",
@@ -565,13 +565,13 @@ export class SolanaTPSCalculatorTool extends Tool {
name = "solana_get_tps";
description = "Get the current TPS of the Solana network";
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
async _call(_input: string): Promise<string> {
try {
const tps = await this.solanaAgent.getTPS();
const tps = await this.solanaKit.getTPS();
return `Solana (mainnet-beta) current transactions per second: ${tps}`;
} catch (error: any) {
return `Error fetching TPS: ${error.message}`;
@@ -586,7 +586,7 @@ export class SolanaStakeTool extends Tool {
Inputs ( input is a JSON string ):
amount: number, eg 1 or 0.01 (required)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -594,7 +594,7 @@ export class SolanaStakeTool extends Tool {
try {
const parsedInput = JSON.parse(input) || Number(input);
const tx = await this.solanaAgent.stake(parsedInput.amount);
const tx = await this.solanaKit.stake(parsedInput.amount);
return JSON.stringify({
status: "success",
@@ -622,13 +622,13 @@ export class SolanaFetchPriceTool extends Tool {
Inputs:
- tokenId: string, the mint address of the token, e.g., "JUPyiwrYJFskUPiHa7hkeR8VUtAeFoSYbKedZNsDvCN"`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
async _call(input: string): Promise<string> {
try {
const price = await this.solanaAgent.fetchTokenPrice(input.trim());
const price = await this.solanaKit.fetchTokenPrice(input.trim());
return JSON.stringify({
status: "success",
tokenId: input.trim(),
@@ -651,7 +651,7 @@ export class SolanaTokenDataTool extends Tool {
Inputs: mintAddress is required.
mintAddress: string, eg "So11111111111111111111111111111111111111112" (required)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -659,8 +659,7 @@ export class SolanaTokenDataTool extends Tool {
try {
const parsedInput = input.trim();
const tokenData =
await this.solanaAgent.getTokenDataByAddress(parsedInput);
const tokenData = await this.solanaKit.getTokenDataByAddress(parsedInput);
return JSON.stringify({
status: "success",
@@ -683,14 +682,14 @@ export class SolanaTokenDataByTickerTool extends Tool {
Inputs: ticker is required.
ticker: string, eg "USDC" (required)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const ticker = input.trim();
const tokenData = await this.solanaAgent.getTokenDataByTicker(ticker);
const tokenData = await this.solanaKit.getTokenDataByTicker(ticker);
return JSON.stringify({
status: "success",
tokenData: tokenData,
@@ -717,7 +716,7 @@ export class SolanaCompressedAirdropTool extends Tool {
priorityFeeInLamports: number, the priority fee in lamports. Default is 30_000. (optional)
shouldLog: boolean, whether to log progress to stdout. Default is false. (optional)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -725,7 +724,7 @@ export class SolanaCompressedAirdropTool extends Tool {
try {
const parsedInput = JSON.parse(input);
const txs = await this.solanaAgent.sendCompressedAirdrop(
const txs = await this.solanaKit.sendCompressedAirdrop(
parsedInput.mintAddress,
parsedInput.amount,
parsedInput.decimals,
@@ -761,7 +760,7 @@ export class SolanaCreateSingleSidedWhirlpoolTool extends Tool {
- maxPrice: number, eg: 5.0 (required, maximum price at which liquidity is added)
- feeTier: number, eg: 0.30 (required, fee tier for the pool)`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -781,7 +780,7 @@ export class SolanaCreateSingleSidedWhirlpoolTool extends Tool {
);
}
const txId = await this.solanaAgent.createOrcaSingleSidedWhirlpool(
const txId = await this.solanaKit.createOrcaSingleSidedWhirlpool(
depositTokenAmount,
depositTokenMint,
otherTokenMint,
@@ -816,7 +815,7 @@ export class SolanaRaydiumCreateAmmV4 extends Tool {
startTime: number(seconds), eg: now number or zero (required)
`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -824,7 +823,7 @@ export class SolanaRaydiumCreateAmmV4 extends Tool {
try {
let inputFormat = JSON.parse(input);
const tx = await this.solanaAgent.raydiumCreateAmmV4(
const tx = await this.solanaKit.raydiumCreateAmmV4(
new PublicKey(inputFormat.marketId),
new BN(inputFormat.baseAmount),
new BN(inputFormat.quoteAmount),
@@ -858,7 +857,7 @@ export class SolanaRaydiumCreateClmm extends Tool {
startTime: number(seconds), eg: now number or zero (required)
`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -866,7 +865,7 @@ export class SolanaRaydiumCreateClmm extends Tool {
try {
let inputFormat = JSON.parse(input);
const tx = await this.solanaAgent.raydiumCreateClmm(
const tx = await this.solanaKit.raydiumCreateClmm(
new PublicKey(inputFormat.mint1),
new PublicKey(inputFormat.mint2),
@@ -904,7 +903,7 @@ export class SolanaRaydiumCreateCpmm extends Tool {
startTime: number(seconds), eg: now number or zero (required)
`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -912,7 +911,7 @@ export class SolanaRaydiumCreateCpmm extends Tool {
try {
let inputFormat = JSON.parse(input);
const tx = await this.solanaAgent.raydiumCreateCpmm(
const tx = await this.solanaKit.raydiumCreateCpmm(
new PublicKey(inputFormat.mint1),
new PublicKey(inputFormat.mint2),
@@ -950,7 +949,7 @@ export class SolanaOpenbookCreateMarket extends Tool {
tickSize: number (required)
`;
constructor(private solanaAgent: SolanaAgent) {
constructor(private solanaKit: SolanaAgentKit) {
super();
}
@@ -958,7 +957,7 @@ export class SolanaOpenbookCreateMarket extends Tool {
try {
let inputFormat = JSON.parse(input);
const tx = await this.solanaAgent.openbookCreateMarket(
const tx = await this.solanaKit.openbookCreateMarket(
new PublicKey(inputFormat.baseMint),
new PublicKey(inputFormat.quoteMint),
@@ -981,32 +980,32 @@ export class SolanaOpenbookCreateMarket extends Tool {
}
}
export function createSolanaTools(solanaAgent: SolanaAgent) {
export function createSolanaTools(solanaKit: SolanaAgentKit) {
return [
new SolanaBalanceTool(solanaAgent),
new SolanaTransferTool(solanaAgent),
new SolanaDeployTokenTool(solanaAgent),
new SolanaDeployCollectionTool(solanaAgent),
new SolanaMintNFTTool(solanaAgent),
new SolanaTradeTool(solanaAgent),
new SolanaRequestFundsTool(solanaAgent),
new SolanaRegisterDomainTool(solanaAgent),
new SolanaGetWalletAddressTool(solanaAgent),
new SolanaPumpfunTokenLaunchTool(solanaAgent),
new SolanaCreateImageTool(solanaAgent),
new SolanaLendAssetTool(solanaAgent),
new SolanaTPSCalculatorTool(solanaAgent),
new SolanaStakeTool(solanaAgent),
new SolanaFetchPriceTool(solanaAgent),
new SolanaResolveDomainTool(solanaAgent),
new SolanaGetDomainTool(solanaAgent),
new SolanaTokenDataTool(solanaAgent),
new SolanaTokenDataByTickerTool(solanaAgent),
new SolanaCompressedAirdropTool(solanaAgent),
new SolanaRaydiumCreateAmmV4(solanaAgent),
new SolanaRaydiumCreateClmm(solanaAgent),
new SolanaRaydiumCreateCpmm(solanaAgent),
new SolanaOpenbookCreateMarket(solanaAgent),
new SolanaCreateSingleSidedWhirlpoolTool(solanaAgent),
new SolanaBalanceTool(solanaKit),
new SolanaTransferTool(solanaKit),
new SolanaDeployTokenTool(solanaKit),
new SolanaDeployCollectionTool(solanaKit),
new SolanaMintNFTTool(solanaKit),
new SolanaTradeTool(solanaKit),
new SolanaRequestFundsTool(solanaKit),
new SolanaRegisterDomainTool(solanaKit),
new SolanaGetWalletAddressTool(solanaKit),
new SolanaPumpfunTokenLaunchTool(solanaKit),
new SolanaCreateImageTool(solanaKit),
new SolanaLendAssetTool(solanaKit),
new SolanaTPSCalculatorTool(solanaKit),
new SolanaStakeTool(solanaKit),
new SolanaFetchPriceTool(solanaKit),
new SolanaResolveDomainTool(solanaKit),
new SolanaGetDomainTool(solanaKit),
new SolanaTokenDataTool(solanaKit),
new SolanaTokenDataByTickerTool(solanaKit),
new SolanaCompressedAirdropTool(solanaKit),
new SolanaRaydiumCreateAmmV4(solanaKit),
new SolanaRaydiumCreateClmm(solanaKit),
new SolanaRaydiumCreateCpmm(solanaKit),
new SolanaOpenbookCreateMarket(solanaKit),
new SolanaCreateSingleSidedWhirlpoolTool(solanaKit),
];
}