refactored code

This commit is contained in:
shivaji43
2025-01-12 12:13:37 +05:30
parent fcbb2e18c6
commit 58a9edd7e2
17 changed files with 776 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
import { Tool } from "langchain/tools";
import { SolanaAgentKit } from "../../agent";
export class SolanaHeliusWebhookTool extends Tool {
name = "create_helius_webhook";
description = `Creates a Helius Webhook that listens to specified account addresses.
Inputs (input is a JSON string):
accountAddresses: string[] | string,
e.g. ["BVdNLvyG2DNiWAXBE9qAmc4MTQXymd5Bzfo9xrQSUzVP","Eo2ciguhMLmcTWXELuEQPdu7DWZt67LHXb2rdHZUbot7"]
or "BVdNLvyG2DNiWAXBE9qAmc4MTQXymd5Bzfo9xrQSUzVP,Eo2ciguhMLmcTWXELuEQPdu7DWZt67LHXb2rdHZUbot7"
webhookURL: string, e.g. "https://TestServer.test.repl.co/webhooks"`;
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const parsedInput = JSON.parse(input);
let accountAddresses: string[] = [];
if (!parsedInput.accountAddresses) {
throw new Error('Missing "accountAddresses" property in input JSON.');
}
if (Array.isArray(parsedInput.accountAddresses)) {
accountAddresses = parsedInput.accountAddresses.map((addr: string) =>
addr.trim(),
);
} else if (typeof parsedInput.accountAddresses === "string") {
accountAddresses = parsedInput.accountAddresses
.split(",")
.map((addr: string) => addr.trim());
} else {
throw new Error(
'Invalid type for "accountAddresses". Expected array or comma-separated string.',
);
}
const webhookURL = parsedInput.webhookURL;
if (!webhookURL) {
throw new Error(
'Invalid input. Expected a "webhookURL" property in the JSON.',
);
}
const result = await this.solanaKit.CreateWebhook(
accountAddresses,
webhookURL,
);
// Return success in JSON
return JSON.stringify({
status: "success",
message: "Helius Webhook created successfully",
webhookURL: result.webhookURL,
webhookID: result.webhookID,
});
} catch (error: any) {
return JSON.stringify({
status: "error",
message: error.message,
code: error.code || "UNKNOWN_ERROR",
});
}
}
}

View File

@@ -0,0 +1,39 @@
import { Tool } from "langchain/tools";
import { SolanaAgentKit } from "../../agent";
export class SolanaDeleteHeliusWebhookTool extends Tool {
name = "delete_helius_webhook";
description = `Deletes a Helius Webhook by its ID.
Inputs (input is a JSON string):
webhookID: string, e.g. "1ed4244d-a591-4854-ac31-cc28d40b8255"`;
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const parsedInput = JSON.parse(input);
const webhookID = parsedInput.webhookID;
if (!webhookID || typeof webhookID !== "string") {
throw new Error(
'Invalid input. Expected a "webhookID" property in the JSON.',
);
}
const result = await this.solanaKit.deleteWebhook(webhookID);
return JSON.stringify({
status: "success",
message: "Helius Webhook deleted successfully",
data: result,
});
} catch (error: any) {
return JSON.stringify({
status: "error",
message: error.message,
code: error.code || "UNKNOWN_ERROR",
});
}
}
}

View File

@@ -0,0 +1,38 @@
import { Tool } from "langchain/tools";
import { SolanaAgentKit } from "../../agent";
import { PublicKey } from "@solana/web3.js";
export class SolanaGetAllAssetsByOwner extends Tool {
name = "solana_get_all_assets_by_owner";
description = `Get all assets owned by a specific wallet address.
Inputs:
- owner: string, the wallet address of the owner, e.g., "4Be9CvxqHW6BYiRAxW9Q3xu1ycTMWaL5z8NX4HR3ha7t" (required)
- limit: number, the maximum number of assets to retrieve (optional)`;
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const { owner, limit } = JSON.parse(input);
const ownerPubkey = new PublicKey(owner);
const assets = await this.solanaKit.getAllAssetsbyOwner(
ownerPubkey,
limit,
);
return JSON.stringify({
status: "success",
message: "Assets retrieved successfully",
assets: assets,
});
} catch (error: any) {
return JSON.stringify({
status: "error",
message: error.message,
code: error.code || "UNKNOWN_ERROR",
});
}
}
}

View File

@@ -0,0 +1,43 @@
import { Tool } from "langchain/tools";
import { SolanaAgentKit } from "../../agent";
export class SolanaGetHeliusWebhookTool extends Tool {
name = "get_helius_webhook";
description = `Retrieves a Helius Webhook by its ID.
Inputs (input is a JSON string):
webhookID: string, e.g. "1ed4244d-a591-4854-ac31-cc28d40b8255"`;
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const parsedInput = JSON.parse(input);
const webhookID = parsedInput.webhookID;
if (!webhookID || typeof webhookID !== "string") {
throw new Error(
'Invalid input. Expected a "webhookID" property in the JSON.',
);
}
const result = await this.solanaKit.getWebhook(webhookID);
return JSON.stringify({
status: "success",
message: "Helius Webhook retrieved successfully",
wallet: result.wallet,
webhookURL: result.webhookURL,
transactionTypes: result.transactionTypes,
accountAddresses: result.accountAddresses,
webhookType: result.webhookType,
});
} catch (error: any) {
return JSON.stringify({
status: "error",
message: error.message,
code: error.code || "UNKNOWN_ERROR",
});
}
}
}

View File

@@ -0,0 +1,6 @@
export * from "./create_webhook";
export * from "./delete_webhook";
export * from "./get_all_assets";
export * from "./get_webhook";
export * from "./parse_transaction";
export * from "./send_transaction_priority";

View File

@@ -0,0 +1,32 @@
import { Tool } from "langchain/tools";
import { SolanaAgentKit } from "../../agent";
export class SolanaParseTransactionHeliusTool extends Tool {
name = "solana_parse_transaction_helius";
description = `Parse a Solana transaction using Helius API.
Inputs:
- transactionId: string, the ID of the transaction to parse, e.g., "5h3k...9d2k" (required).`;
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<any> {
try {
const transactionId = input.trim();
const parsedTransaction =
await this.solanaKit.heliusParseTransactions(transactionId);
return JSON.stringify({
status: "success",
message: "transaction parsed successfully",
transaction: parsedTransaction,
});
} catch (error: any) {
return JSON.stringify({
status: "error",
message: error.message,
code: error.code || "NOt able to Parse transaction",
});
}
}
}

View File

@@ -0,0 +1,63 @@
import { Tool } from "langchain/tools";
import { SolanaAgentKit } from "../../agent";
import { PublicKey } from "@solana/web3.js";
export class SolanaSendTransactionWithPriorityFee extends Tool {
name = "solana_send_transaction_with_priority_fee";
description = `Sends a Solana transaction with a user-defined priority fee.
**Inputs (JSON-encoded string)**:
- priorityLevel: string — the priority level ("NONE", "Min", "Low", "Medium", "High", "VeryHigh", or "UnsafeMax")
- amount: number — the amount of SOL to send
- to: string — the recipient's wallet address (public key in base58);`;
constructor(private solanaKit: SolanaAgentKit) {
super();
}
protected async _call(input: string): Promise<string> {
try {
const { priorityLevel, amount, to, splmintAddress } = JSON.parse(input);
const validPriorityLevels = [
"NONE",
"Min",
"Low",
"Medium",
"High",
"VeryHigh",
"UnsafeMax",
];
if (!validPriorityLevels.includes(priorityLevel)) {
throw new Error(
`Invalid priority level. Must be one of: ${validPriorityLevels.join(", ")}. Received: ${priorityLevel}`,
);
}
if (!amount || !to) {
throw new Error(
`Missing required fields. Received: priorityLevel=${priorityLevel}, amount=${amount}, to=${to}`,
);
}
const toPubkey = new PublicKey(to);
const priorityFeeTx = await this.solanaKit.sendTranctionWithPriority(
priorityLevel,
amount,
toPubkey,
splmintAddress,
);
return JSON.stringify({
status: "success",
message: "Transaction sent successfully",
priorityFeeTx,
});
} catch (error: any) {
return JSON.stringify({
status: "error",
message: error.message,
code: error.code || "UNKNOWN_ERROR",
});
}
}
}

View File

@@ -24,6 +24,7 @@ export * from "./tiplink";
export * from "./sns";
export * from "./lightprotocol";
export * from "./squads";
export * from "./helius";
import { SolanaAgentKit } from "../agent";
import {
@@ -91,6 +92,12 @@ import {
SolanaApproveProposal2by2Multisig,
SolanaExecuteProposal2by2Multisig,
SolanaRejectProposal2by2Multisig,
SolanaSendTransactionWithPriorityFee,
SolanaHeliusWebhookTool,
SolanaGetHeliusWebhookTool,
SolanaDeleteHeliusWebhookTool,
SolanaParseTransactionHeliusTool,
SolanaGetAllAssetsByOwner,
} from "./index";
export function createSolanaTools(solanaKit: SolanaAgentKit) {
@@ -159,5 +166,11 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) {
new SolanaExecuteProposal2by2Multisig(solanaKit),
new SolanaDepositTo2by2Multisig(solanaKit),
new SolanaTransferFrom2by2Multisig(solanaKit),
new SolanaSendTransactionWithPriorityFee(solanaKit),
new SolanaHeliusWebhookTool(solanaKit),
new SolanaGetHeliusWebhookTool(solanaKit),
new SolanaDeleteHeliusWebhookTool(solanaKit),
new SolanaParseTransactionHeliusTool(solanaKit),
new SolanaGetAllAssetsByOwner(solanaKit),
];
}