From 40501226fa778b2fc3497251c06cdfe7c7cac223 Mon Sep 17 00:00:00 2001 From: fm2055 <48504961+fm2055@users.noreply.github.com> Date: Mon, 16 Dec 2024 03:23:30 +0000 Subject: [PATCH 1/4] feat: add resolve_sol_domain --- src/tools/resolve_sol_domain.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 src/tools/resolve_sol_domain.ts diff --git a/src/tools/resolve_sol_domain.ts b/src/tools/resolve_sol_domain.ts new file mode 100644 index 0000000..607d0a1 --- /dev/null +++ b/src/tools/resolve_sol_domain.ts @@ -0,0 +1,30 @@ +import { resolve } from "@bonfida/spl-name-service"; +import { PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../index"; + +/** + * Resolves a .sol domain to a Solana PublicKey. + * + * This function uses the Bonfida SPL Name Service to resolve a given .sol domain + * to the corresponding Solana PublicKey. The domain can be provided with or without + * the .sol suffix. + * + * @param agent SolanaAgentKit instance + * @param domain The .sol domain to resolve. This can be provided with or without the .sol TLD suffix + * @returns A promise that resolves to the corresponding Solana PublicKey + * @throws Error if the domain resolution fails + */ +export async function resolve_sol_domain( + agent: SolanaAgentKit, + domain: string +): Promise { + if (!domain || typeof domain !== "string") { + throw new Error("Invalid domain. Expected a non-empty string."); + } + + try { + return await resolve(agent.connection, domain); + } catch (error) { + throw new Error(`Failed to resolve domain: ${domain}`); + } +} From 8927ac4130e9e38be48316f3015c6212bdee92bc Mon Sep 17 00:00:00 2001 From: fm2055 <48504961+fm2055@users.noreply.github.com> Date: Mon, 16 Dec 2024 03:23:17 +0000 Subject: [PATCH 2/4] feat: add get_primary_domain --- src/tools/get_primary_domain.ts | 37 +++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/tools/get_primary_domain.ts diff --git a/src/tools/get_primary_domain.ts b/src/tools/get_primary_domain.ts new file mode 100644 index 0000000..1fe3892 --- /dev/null +++ b/src/tools/get_primary_domain.ts @@ -0,0 +1,37 @@ +import { getPrimaryDomain } from "@bonfida/spl-name-service"; +import { PublicKey } from "@solana/web3.js"; +import { SolanaAgentKit } from "../index"; + +/** + * Retrieves the primary .sol domain associated with a given Solana public key. + * + * This function queries the Bonfida SPL Name Service to get the primary .sol domain for + * a specified Solana public key. If the primary domain is stale or an error occurs during + * the resolution, it throws an error. + * + * @param agent SolanaAgentKit instance + * @param account The Solana public key for which to retrieve the primary domain + * @returns A promise that resolves to the primary .sol domain as a string + * @throws Error if the domain is stale or if the domain resolution fails + */ +export async function get_primary_domain( + agent: SolanaAgentKit, + account: PublicKey +): Promise { + try { + const { reverse, stale } = await getPrimaryDomain( + agent.connection, + account + ); + if (stale) { + throw new Error( + `Primary domain is stale for account: ${account.toBase58()}` + ); + } + return reverse; + } catch (error) { + throw new Error( + `Failed to get primary domain for account: ${account.toBase58()}` + ); + } +} From ff8cb4b842bbdfa4f63dcbe18560ddc5ef204446 Mon Sep 17 00:00:00 2001 From: fm2055 <48504961+fm2055@users.noreply.github.com> Date: Mon, 16 Dec 2024 23:00:31 +0800 Subject: [PATCH 3/4] feat: langchain integration --- src/agent/index.ts | 10 ++++ src/langchain/index.ts | 87 +++++++++++++++++++++++++++++++++ src/tools/get_primary_domain.ts | 6 +-- src/tools/index.ts | 2 + src/tools/resolve_sol_domain.ts | 2 +- 5 files changed, 103 insertions(+), 4 deletions(-) diff --git a/src/agent/index.ts b/src/agent/index.ts index 23af3ad..c5cbf2b 100644 --- a/src/agent/index.ts +++ b/src/agent/index.ts @@ -9,6 +9,8 @@ import { transfer, trade, registerDomain, + resolveSolDomain, + getPrimaryDomain, launchPumpFunToken, lendAsset, getTPS, @@ -79,6 +81,14 @@ export class SolanaAgentKit { return registerDomain(this, name, spaceKB); } + async resolveSolDomain(domain:string ){ + return resolveSolDomain(this, domain) + } + + async getPrimaryDomain(account: PublicKey){ + return getPrimaryDomain(this, account) + } + async trade( outputMint: PublicKey, inputAmount: number, diff --git a/src/langchain/index.ts b/src/langchain/index.ts index c4d506b..89b3864 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -390,6 +390,93 @@ export class SolanaRegisterDomainTool extends Tool { } } +export class SolanaResolveDomainTool extends Tool { + name = "solana_resolve_domain"; + description = `Resolve a .sol domain to a Solana PublicKey. + + Inputs: + domain: string, eg "pumpfun.sol" or "pumpfun"(required) + `; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + private validateInput(input: any): void { + if (!input.domain || typeof input.domain !== "string") { + throw new Error("domain is required and must be a string"); + } + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + this.validateInput(parsedInput); + + const publicKey = await this.solanaKit.resolveSolDomain(parsedInput.domain); + + return JSON.stringify({ + status: "success", + message: "Domain resolved successfully", + publicKey: publicKey.toBase58(), + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + + +export class SolanaGetPrimaryDomainTool extends Tool { + name = "solana_get_primary_domain"; + description = `Retrieve the primary .sol domain associated with a given Solana public key. + + Inputs: + account: string, eg "4Be9CvxqHW6BYiRAxW9Q3xu1ycTMWaL5z8NX4HR3ha7t" (required) + `; + + constructor(private solanaKit: SolanaAgentKit) { + super(); + } + + private validateInput(input: any): void { + if (!input.account || typeof input.account !== "string") { + throw new Error("account is required and must be a string"); + } + try { + new PublicKey(input.account); + } catch { + throw new Error("account is not a valid public key"); + } + } + + protected async _call(input: string): Promise { + try { + const parsedInput = JSON.parse(input); + this.validateInput(parsedInput); + + const account = new PublicKey(parsedInput.account); + const domain = await this.solanaKit.getPrimaryDomain(account); + + return JSON.stringify({ + status: "success", + message: "Primary domain retrieved successfully", + domain, + }); + } catch (error: any) { + return JSON.stringify({ + status: "error", + message: error.message, + code: error.code || "UNKNOWN_ERROR", + }); + } + } +} + export class SolanaGetWalletAddressTool extends Tool { name = "solana_get_wallet_address"; description = `Get the wallet address of the agent`; diff --git a/src/tools/get_primary_domain.ts b/src/tools/get_primary_domain.ts index 1fe3892..775af4b 100644 --- a/src/tools/get_primary_domain.ts +++ b/src/tools/get_primary_domain.ts @@ -1,4 +1,4 @@ -import { getPrimaryDomain } from "@bonfida/spl-name-service"; +import { getPrimaryDomain as _getPrimaryDomain } from "@bonfida/spl-name-service"; import { PublicKey } from "@solana/web3.js"; import { SolanaAgentKit } from "../index"; @@ -14,12 +14,12 @@ import { SolanaAgentKit } from "../index"; * @returns A promise that resolves to the primary .sol domain as a string * @throws Error if the domain is stale or if the domain resolution fails */ -export async function get_primary_domain( +export async function getPrimaryDomain( agent: SolanaAgentKit, account: PublicKey ): Promise { try { - const { reverse, stale } = await getPrimaryDomain( + const { reverse, stale } = await _getPrimaryDomain( agent.connection, account ); diff --git a/src/tools/index.ts b/src/tools/index.ts index dca3c04..8d7576e 100644 --- a/src/tools/index.ts +++ b/src/tools/index.ts @@ -6,6 +6,8 @@ export * from "./mint_nft"; export * from "./transfer"; export * from "./trade"; export * from "./register_domain"; +export * from "./resolve_sol_domain"; +export * from "./get_primary_domain"; export * from "./launch_pumpfun_token"; export * from "./lend"; export * from "./get_tps"; diff --git a/src/tools/resolve_sol_domain.ts b/src/tools/resolve_sol_domain.ts index 607d0a1..d8764cc 100644 --- a/src/tools/resolve_sol_domain.ts +++ b/src/tools/resolve_sol_domain.ts @@ -14,7 +14,7 @@ import { SolanaAgentKit } from "../index"; * @returns A promise that resolves to the corresponding Solana PublicKey * @throws Error if the domain resolution fails */ -export async function resolve_sol_domain( +export async function resolveSolDomain( agent: SolanaAgentKit, domain: string ): Promise { From 47db362f0b0849f9a160dbe896c1511fc2d4ded8 Mon Sep 17 00:00:00 2001 From: aryan Date: Thu, 19 Dec 2024 05:57:28 +0530 Subject: [PATCH 4/4] fix: parsing --- src/langchain/index.ts | 37 +++++++++---------------------------- 1 file changed, 9 insertions(+), 28 deletions(-) diff --git a/src/langchain/index.ts b/src/langchain/index.ts index 89b3864..7f9062c 100644 --- a/src/langchain/index.ts +++ b/src/langchain/index.ts @@ -402,18 +402,10 @@ export class SolanaResolveDomainTool extends Tool { super(); } - private validateInput(input: any): void { - if (!input.domain || typeof input.domain !== "string") { - throw new Error("domain is required and must be a string"); - } - } - protected async _call(input: string): Promise { try { - const parsedInput = JSON.parse(input); - this.validateInput(parsedInput); - - const publicKey = await this.solanaKit.resolveSolDomain(parsedInput.domain); + const domain = input.trim(); + const publicKey = await this.solanaKit.resolveSolDomain(domain); return JSON.stringify({ status: "success", @@ -431,9 +423,9 @@ export class SolanaResolveDomainTool extends Tool { } -export class SolanaGetPrimaryDomainTool extends Tool { - name = "solana_get_primary_domain"; - description = `Retrieve the primary .sol domain associated with a given Solana public key. +export class SolanaGetDomainTool extends Tool { + name = "solana_get_domain"; + description = `Retrieve the .sol domain associated for a given account address. Inputs: account: string, eg "4Be9CvxqHW6BYiRAxW9Q3xu1ycTMWaL5z8NX4HR3ha7t" (required) @@ -443,25 +435,12 @@ export class SolanaGetPrimaryDomainTool extends Tool { super(); } - private validateInput(input: any): void { - if (!input.account || typeof input.account !== "string") { - throw new Error("account is required and must be a string"); - } - try { - new PublicKey(input.account); - } catch { - throw new Error("account is not a valid public key"); - } - } protected async _call(input: string): Promise { try { - const parsedInput = JSON.parse(input); - this.validateInput(parsedInput); - - const account = new PublicKey(parsedInput.account); + const account = new PublicKey(input.trim()); const domain = await this.solanaKit.getPrimaryDomain(account); - + return JSON.stringify({ status: "success", message: "Primary domain retrieved successfully", @@ -735,5 +714,7 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) { new SolanaTPSCalculatorTool(solanaKit), new SolanaStakeTool(solanaKit), new SolanaFetchPriceTool(solanaKit), + new SolanaResolveDomainTool(solanaKit), + new SolanaGetDomainTool(solanaKit), ]; }