chore: refractor

This commit is contained in:
aryan
2024-12-04 17:07:53 +05:30
parent b2a9ddcd06
commit 4d140f33df
19 changed files with 266 additions and 173 deletions

View File

@@ -1 +0,0 @@
solanaagentkit.xyz

View File

@@ -1 +1 @@
window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE7Wa227bOBCG34W+FZxw6EPsu7TZAIttu0U36I0QBKxEu0JlyivRzQZB3n1BHayhOU5oq71qEXP++Tn8KFKknllZPFZsGT+zH5lO2ZLDVcS03Ci2ZP8UudTyeq20+SszLGK7MmdLluSyqlR14f48/m42OYu6X9mSsZeoU51y2Ksmha5MuUtMUYZIjtz2SD5iW1kqbXynfWJ+CROcWavEZIUOTdw3H5L3Uea5CqrfaN90eL4HmaalqqoT8qKQE/PD5aTnplT/7lRlbuUuUeZ2p9MwD2TYEB+p2ubF013xQ4UNuNt+eOb3RZ6fwBsRNMTDWpl3Mpc6UUHZneZD8m4ybT7d3gUl7dsOyWhKqauVCnucoMbDGF9nlVHlTbGRWdj4eiED+5yGDWzXcki2XOn0uqqUCZvJTvMheVfKJN8/KJ1men2jjMzyMAN03IlOZmjlKJU0qml5VxTIxWqn68laXXhtXl0RYTrbq7+3kWg1zLRR5Uomqrpof3pVynn2Hz70j2iN3nrSd56OpNmqMlHayLV6M5PTNDSZU579E/HvbV1qMuVho/CS1f8ES47a5kd64nk9knRXZifkbFoPTFkWTzI3T+9klVWfi0ybEwo5IoMHGkqaYT/FBgo5PTkN1U297G5s+Ks++nbhaCX76OtX5uWxFCMq/K1uo+4cMVVlay3NrnwD+kMzOOwsE7j8HzNt+uafbu++qGpb6Ir0dLRx+EDYjcbp0qM2jO7u8T4cM6GMTKWR5xjpQ883A5eLOZ/2b2Ifdnlxo7ZFlZl6tf6Ii2Setqq6oJoEr2s2+DpJip027SL82igfbx0+zKYwMv8q8905GUZONF3mV7p0xFKdX1XmD1lqlZ5jy1P4VdZKJXOTbdT19ukcX274rzJVKWMyvSaflG85QrED7MymU9FD/PBgZ8IQN+O9xKmmxvsOHSlW8agVuW880du4EzrbYdfJY9vSPC8eVfq5LEyR4P3zAM+E5u+y/73YqG/yrOeWZxtp/S67m0xnm93mizS/xLErN9z0fcQynar/2PKZ/VRlZc86lgzGYrxgEVtlKk/tkWS3MU+KTbs7S4tkV//3vm32VSX1bnAZN60vLlkUX0ZCjAXA/X0Ud8H1D/UfOo3+L3UgZ1HMqUDuBXInEFgUAxUIXiA4gYJFsaAChRconMAJi+IJFTjxAidO4JRF8ZQKnHqBUydwxqJ4RgXOvMCZEzhnUTynAude4NwJvGJRfEUFXnmBV07ggkXxggpceIELFwDLAyfZ4T48/ICeGh+aHwIglyBuueAkQ9yHiLsUccsGJzniPkjcJYlbPjjJEvdh4i5N3DLCSZ64DxR3ieKWE04yxX2ouEsVt6xwkivug8VdsrjlhZNscR8u7tLFLTOc5Iv7gHGXMLDMAEkY+ISBSxhYZoAkDHzC4OAZVT+k6KcU8ZhyCQPLDJCEgU8YuISBZQZIwsAnDFzCwDIDJGHgEwYuYWCZAZIw8AkDlzCwzABJGPiEgUsYWGaAJAx8wsAlDCwzQBIGPmHgEiYsM4IkTPiECZcwYZkRJGHCJ0y4hAnLjCAJEz5h4mAlrJdCei0kFkOXMGGZESRhwidMuIQJy4wgCRM+YcIlTFhmBEmY8AkTLmHCMiNIwoRPmHAJE5YZQRImfMKES5iwzAiSMOETJlzCJpaZCUnYxCes/VO93/upSqPSP5t9Xxzv36ue2UO7Gexfup6ZmLHl88tLv/lbPr+g/Z/9zWban2L3Knzeq/B5mErzIrHtXySQqStk6ipIrj+1I+zBtNeD6Yl6KTqqRJITJDk5UbLojtRRBReogotAvf6qHBlDvkJl+qt+ZAj5CdOpr2Kq+irGFAcjytEI8MAR6C5okAqClYfB2p9doxIJVCMRJNNAkKBr4l4OsR+GfiNmmivvXgd1Lqxv9YVb3ly4pd2FG6oWQpSHIbpW5lt3H90LodkYNhn7t200pxHgIgzw7gxOtWdwSAyNoAgbQVsn2V6PohohIR4otMsL2bx0t0Uv9wesyCGaPyJsAlnhtDn2rY025+BI8hJJXgZJ9ifYiH40EBA2EO1ZRFmfRfRKE2RoEmjooE+A2IIwuKxEPxH1ylDlBzQpIWxWWl29ctyhSoUVqjk8QTZQhSCsQu2hIBp21BUR1hV8+4tYR7XmYbXuTpulPW1GltCTRYQ9WbrvMNL2OwxkC680YTOl/WhpVX+0tGo+WuoF0VITttK016zf7DXrtr1mRWOIV9SwJbU/Ekc1Q7ZEmC90+YfsoGUCwtaJZk2W9mOLH5kDOMIzjM76tuZnc1uD+oZKJMJK1H4ggzBAGjxYo/2qCMmgLvGwPtX3/KjAiEcI47H7gBBVBBXkBIkHYvOK5lrAVLuP2DbbqjzTii3j+5eX/wGMkws5bSoAAA==";
window.searchData = "data:application/octet-stream;base64,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";

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -1,2 +1,2 @@
<!DOCTYPE html><html class="default" lang="en"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>LuloDepositAssetMint | solana-agent-kit</title><meta name="description" content="Documentation for solana-agent-kit"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-search"></use></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div><div class="field"><div id="tsd-toolbar-links"></div></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">solana-agent-kit</a></div><div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb"><li><a href="../modules.html">solana-agent-kit</a></li><li><a href="LuloDepositAssetMint.html">LuloDepositAssetMint</a></li></ul><h1>Type Alias LuloDepositAssetMint</h1></div><div class="tsd-signature"><span class="tsd-kind-type-alias">Lulo<wbr/>Deposit<wbr/>Asset<wbr/>Mint</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-keyword">typeof </span><span class="tsd-signature-type">TOKENS</span><span class="tsd-signature-symbol">[</span><span class="tsd-signature-keyword">keyof </span><span class="tsd-signature-keyword">typeof </span><span class="tsd-signature-type">TOKENS</span><span class="tsd-signature-symbol">]</span></div><div class="tsd-comment tsd-typography"><p>Mint addresses of supported tokens for lending on Lulo</p>
</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/arihantbansal/solana-agent-kit/blob/e3d1ff1d419696356ab6c10021d694b51a86f79c/src/types/index.ts#L30">types/index.ts:30</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>solana-agent-kit</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
</div><div class="tsd-comment tsd-typography"></div><aside class="tsd-sources"><ul><li>Defined in <a href="https://github.com/thearyanag/solana-agent-kit/blob/68d250df242c0112259edd8be99b0a241897da3a/src/types/index.ts#L30">types/index.ts:30</a></li></ul></aside></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><h3><svg width="20" height="20" viewBox="0 0 24 24" fill="none"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-protected" name="protected"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Protected</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-external" name="external"/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>External</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="../assets/icons.svg#icon-1"></use></svg><span>solana-agent-kit</span></a><ul class="tsd-small-nested-navigation" id="tsd-nav-container" data-base=".."><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>

View File

@@ -25,6 +25,7 @@
"@solana/web3.js": "^1.95.4",
"bs58": "^6.0.0",
"dotenv": "^16.4.5",
"form-data": "^4.0.1",
"langchain": "^0.3.6",
"typedoc": "^0.26.11"
},

3
pnpm-lock.yaml generated
View File

@@ -44,6 +44,9 @@ importers:
dotenv:
specifier: ^16.4.5
version: 16.4.5
form-data:
specifier: ^4.0.1
version: 4.0.1
langchain:
specifier: ^0.3.6
version: 0.3.6(@langchain/core@0.3.18(openai@4.72.0(zod@3.23.8)))(axios@1.7.7)(openai@4.72.0(zod@3.23.8))

View File

@@ -9,9 +9,9 @@ import {
transfer,
trade,
registerDomain,
launchpumpfuntoken,
launchPumpFunToken,
} from "../tools";
import { CollectionOptions } from "../types";
import { CollectionOptions, PumpFunTokenOptions } from "../types";
import { DEFAULT_OPTIONS } from "../constants";
/**
@@ -81,20 +81,12 @@ export class SolanaAgentKit {
) {
return trade(this, outputMint, inputAmount, inputMint, slippageBps);
}
async launchpumpfuntoken(
async launchPumpFunToken(
tokenName: string,
tokenTicker: string,
options: {
description: string;
twitter: string;
telegram: string;
website: string;
imageUrl: string;
initialLiquiditySOL: any;
mintAddress: string;
}
options?: PumpFunTokenOptions
) {
return launchpumpfuntoken(this, tokenName, tokenTicker, options);
return launchPumpFunToken(this, tokenName, tokenTicker, options);
}
}

View File

@@ -1,6 +1,7 @@
import { Tool } from "langchain/tools";
import { SolanaAgentKit } from "../index";
import { PublicKey } from "@solana/web3.js";
import { launchPumpFunToken } from "../tools";
export class SolanaBalanceTool extends Tool {
name = "solana_balance";
@@ -185,58 +186,21 @@ export class SolanaGetWalletAddressTool extends Tool {
export class SolanaPumpfunTokenLaunch extends Tool {
name = "solana_launch_pumpfun_token";
description = "Launch a new token on Pump.fun via Solana Agent Kit. Input should be JSON with: {tokenName: string, tokenTicker: string, description?: string, twitter?: string, telegram?: string, website?: string, imageUrl?: string, initialLiquiditySOL?: number, mintAddress?: string}";
constructor(private solanaKit: SolanaAgentKit) {
super();
}
async _call(input: string): Promise<string> {
try {
// Parse and validate input
const validJson = input
.replace(/([a-zA-Z0-9_]+):/g, '"$1":')
.trim();
const {
tokenName,
tokenTicker,
description,
twitter,
telegram,
website,
imageUrl,
initialLiquiditySOL,
mintAddress
} = JSON.parse(validJson);
if (!tokenName || !tokenTicker) {
throw new Error("tokenName and tokenTicker are required");
}
// Launch token with options
const result = await this.solanaKit.launchpumpfuntoken(
tokenName,
tokenTicker,
{
description,
twitter,
telegram,
website,
imageUrl,
initialLiquiditySOL,
mintAddress,
}
);
return `Token launched successfully.
Transaction: ${result.signature}
Mint Address: ${result.mint}
Metadata URI: ${result.metadataUri}`;
const options = JSON.parse(input);
await launchPumpFunToken(this.solanaKit, options.tokenName, options.tokenTicker, options);
return "Token launched successfully on Pump.fun";
} catch (error: any) {
return `Error launching token: ${error.message}`;
}
}
}
// Updated createSolanaTools function
export function createSolanaTools(solanaKit: SolanaAgentKit) {
return [

View File

@@ -1,87 +1,84 @@
// src/tools/launch_pumpfun_token.ts
import { VersionedTransaction, Keypair } from "@solana/web3.js";
import { PumpFunTokenOptions, SolanaAgentKit } from "../index";
import fetch from "node-fetch";
import FormData from 'form-data';
async function uploadMetadata(
tokenName: string,
tokenTicker: string,
options: PumpFunTokenOptions
options?: PumpFunTokenOptions
): Promise<any> {
// Create metadata object
const formData = new URLSearchParams();
formData.append('name', tokenName);
formData.append('symbol', tokenTicker);
formData.append('description', options?.description || `${tokenName} token created via SolanaAgentKit`);
formData.append('showName', 'true');
// Create form data for IPFS
const formData: FormData = new FormData();
// required fields
formData.append("name", tokenName);
formData.append("symbol", tokenTicker);
formData.append("description", options.description || `${tokenName} token created via PumpPortal.fun`);
formData.append("showName", "true");
if (options?.twitter) formData.append('twitter', options.twitter);
if (options?.telegram) formData.append('telegram', options.telegram);
if (options?.website) formData.append('website', options.website);
// optional fields
if (options.twitter) formData.append("twitter", options.twitter);
if (options.telegram) formData.append("telegram", options.telegram);
if (options.website) formData.append("website", options.website);
// If imageUrl is provided, fetch and append the image
if (options.imageUrl) {
let files;
// If imageUrl is provided, fetch and prepare the image
if (options?.imageUrl) {
const imageResponse = await fetch(options.imageUrl);
const imageBuffer = await imageResponse.buffer();
formData.append("file", imageBuffer, {
filename: "token_image.png",
contentType: "image/png"
});
const imageBlob = await imageResponse.blob();
files = {
file: new File([imageBlob], 'token_image.png', { type: 'image/png' })
};
}
// TBD : Remove after approval
console.log("Uploading metadata with fields:", {
name: tokenName,
symbol: tokenTicker,
description: options.description,
hasImage: !!options.imageUrl
});
// Create form data with both metadata and file
const finalFormData = new FormData();
// Add all metadata fields
for (const [key, value] of formData.entries()) {
finalFormData.append(key, value);
}
// Add file if exists
if (files?.file) {
finalFormData.append('file', files.file);
}
const metadataResponse = await fetch("https://pump.fun/api/ipfs", {
method: "POST",
body: formData as any,
headers: formData.getHeaders()
body: finalFormData
});
if (!metadataResponse.ok) {
const errorText = await metadataResponse.text();
throw new Error(`Metadata upload failed: ${errorText || metadataResponse.statusText}`);
throw new Error(`Metadata upload failed: ${metadataResponse.statusText}`);
}
return await metadataResponse.json();
}
async function createTokenTransaction(
kit: SolanaAgentKit,
agent: SolanaAgentKit,
mintKeypair: Keypair,
metadataResponse: any,
options: PumpFunTokenOptions
options?: PumpFunTokenOptions
) {
const payload = {
publicKey: agent.wallet_address.toBase58(),
action: "create",
tokenMetadata: {
name: metadataResponse.metadata.name,
symbol: metadataResponse.metadata.symbol,
uri: metadataResponse.metadataUri,
},
mint: mintKeypair.publicKey.toBase58(),
denominatedInSol: "true", // API expects string "true"
amount: options?.initialLiquiditySOL || 0.0001,
slippage: options?.slippageBps || 5,
priorityFee: options?.priorityFee || 0.00005,
pool: "pump",
};
const response = await fetch("https://pumpportal.fun/api/trade-local", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
publicKey: kit.wallet_address.toBase58(),
action: "create",
tokenMetadata: {
name: metadataResponse.metadata.name,
symbol: metadataResponse.metadata.symbol,
uri: metadataResponse.metadataUri,
},
mint: mintKeypair.publicKey.toBase58(),
denominatedInSol: "true",
amount: options.initialLiquiditySOL || 0.0001,
slippage: 5,
priorityFee: 0.00005,
pool: "pump",
}),
body: JSON.stringify(payload)
});
if (!response.ok) {
@@ -135,11 +132,18 @@ async function signAndSendTransaction(
}
}
export async function launchpumpfuntoken(
kit: SolanaAgentKit,
/**
* Launch a token on Pump.fun
* @param agent - SolanaAgentKit instance
* @param tokenName - Name of the token
* @param tokenTicker - Ticker of the token
* @param options - Optional token options (description, twitter, telegram, website, imageUrl, initialLiquiditySOL, slippageBps, priorityFee)
*/
export async function launchPumpFunToken(
agent: SolanaAgentKit,
tokenName: string,
tokenTicker: string,
options: PumpFunTokenOptions = {}
options?: PumpFunTokenOptions
) {
try {
// TBD : Remove clgs after approval
@@ -156,14 +160,14 @@ export async function launchpumpfuntoken(
// Create token transaction
console.log("Creating token transaction...");
const response = await createTokenTransaction(kit, mintKeypair, metadataResponse, options);
const response = await createTokenTransaction(agent, mintKeypair, metadataResponse, options);
const transactionData = await response.arrayBuffer();
const tx = VersionedTransaction.deserialize(new Uint8Array(transactionData));
// Send transaction with proper blockhash handling
console.log("Sending transaction...");
const signature = await signAndSendTransaction(kit, tx, mintKeypair);
const signature = await signAndSendTransaction(agent, tx, mintKeypair);
console.log("Token launch successful!");
return {

View File

@@ -29,10 +29,9 @@ export interface PumpFunTokenOptions {
telegram?: string;
website?: string;
imageUrl?: string;
initialLiquiditySOL?: any;
initialLiquiditySOL?: number;
slippageBps?: number;
priorityFee?: number;
mintAddress?: string; // Optional mint address
}
export interface PumpfunLaunchResponse {

View File

@@ -1,42 +1,168 @@
// import { SolanaAgentKit } from "../src";
// import { createSolanaTools } from "../src/langchain";
// import { OpenAI } from "@langchain/openai";
// import { AgentExecutor } from "langchain/agents";
// import { PromptTemplate } from "@langchain/core/prompts";
// import { pull } from "langchain/hub";
// import { createReactAgent } from "langchain/agents";
import { SolanaAgentKit } from "../src";
import { createSolanaTools } from "../src/langchain";
import { OpenAI } from "@langchain/openai";
import { AgentExecutor } from "langchain/agents";
import { PromptTemplate } from "@langchain/core/prompts";
import { pull } from "langchain/hub";
import { createReactAgent } from "langchain/agents";
import { HumanMessage, AIMessage, BaseMessage } from "@langchain/core/messages";
import * as readline from "readline";
// // Initialize SolanaAgentKit
// const solanaKit = new SolanaAgentKit(undefined, "rpc-url");
async function initializeAgent() {
const solanaKit = new SolanaAgentKit(
"5wuqAMP68kNiqs935hDfYkm9ngLzPAxWwYuk12eqVvdMVGJfaVcmYgcz8Met7w61goYubwegRJ7btEBWYsBtpubU",
"https://mainnet.helius-rpc.com/?api-key=da5b04e7-ae1c-4474-ae18-cf81af2b0653"
);
// // Create Solana-specific tools
// const tools = createSolanaTools(solanaKit);
// Create Solana-specific tools
const tools = createSolanaTools(solanaKit);
// (async () => {
// // Define a Prompt Template for the Agent
// const prompt = await pull<PromptTemplate>("hwchase17/react");
// Create an LLM Chain
const llm = new OpenAI({
modelName: "gpt-4o-mini",
temperature: 0.7,
});
// // Create an LLM Chain
// const llm = new OpenAI({
// modelName: "gpt-4o-mini",
// temperature: 0,
// });
const prompt = await pull<PromptTemplate>("hwchase17/react");
// const agent = await createReactAgent({
// llm,
// tools,
// prompt,
// });
const agent = await createReactAgent({
llm,
tools,
prompt,
});
// const agentExecutor = new AgentExecutor({
// agent,
// tools,
// maxIterations: 50,
// });
const agentExecutor = new AgentExecutor({
agent,
tools,
maxIterations: 5,
});
// const result = await agentExecutor.invoke({
// input: "Deploy a token with 6 decimals ",
// });
return { agentExecutor };
}
// console.log(result);
// })();
async function runAutonomousMode(
agentExecutor: AgentExecutor,
interval: number = 10000
) {
console.log("Starting autonomous mode...");
// Initialize message history
const messageHistory: BaseMessage[] = [];
while (true) {
try {
// Use the same thought prompt as in the Python example
const thought =
"Be creative and do something interesting on the blockchain. " +
"Choose an action or set of actions and execute it that highlights your abilities.";
const result = await agentExecutor.invoke({
input: thought, // Changed from messages to input
history: messageHistory,
returnIntermediateSteps: true,
});
console.log(result);
// Add the interaction to history
messageHistory.push(new HumanMessage(thought));
messageHistory.push(new AIMessage(result.output));
console.log(result.output);
console.log("-------------------");
// Wait before the next action
await new Promise((resolve) => setTimeout(resolve, interval));
} catch (error) {
console.error("Error in autonomous mode:", error);
await new Promise((resolve) => setTimeout(resolve, interval));
}
}
}
async function runChatMode(agentExecutor: AgentExecutor) {
console.log("Starting chat mode... Type 'exit' to end.");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
// Initialize message history
const messageHistory: BaseMessage[] = [];
while (true) {
try {
const userInput = await new Promise<string>((resolve) => {
rl.question("\nUser: ", resolve);
});
if (userInput.toLowerCase() === "exit") {
break;
}
const result = await agentExecutor.invoke({
input: userInput, // Changed from messages to input
history: messageHistory,
});
// Add the interaction to history
messageHistory.push(new HumanMessage(userInput));
messageHistory.push(new AIMessage(result.output));
console.log(result.output);
console.log("-------------------");
} catch (error) {
console.error("Error in chat mode:", error);
}
}
rl.close();
}
function chooseMode(): Promise<string> {
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
console.log("\nAvailable modes:");
console.log("1. chat - Interactive chat mode");
console.log("2. auto - Autonomous action mode");
return new Promise((resolve) => {
rl.question("\nChoose a mode (enter number or name): ", (answer) => {
rl.close();
const mode = answer.toLowerCase().trim();
if (mode === "1" || mode === "chat") {
resolve("chat");
} else if (mode === "2" || mode === "auto") {
resolve("auto");
} else {
console.log("Invalid choice. Defaulting to chat mode.");
resolve("chat");
}
});
});
}
async function main() {
console.log("Starting Agent...");
const { agentExecutor } = await initializeAgent();
const mode = await chooseMode();
if (mode === "chat") {
await runChatMode(agentExecutor);
} else {
await runAutonomousMode(agentExecutor);
}
}
// Handle Ctrl+C gracefully
process.on("SIGINT", () => {
console.log("\nGoodbye Agent!");
process.exit(0);
});
// Start the agent
main().catch(console.error);

View File

@@ -10,21 +10,15 @@
"rootDir": "./src",
"strict": true,
"noImplicitAny": true,
"strictNullChecks": true,
"strictFunctionTypes": true,
"strictBindCallApply": true,
"strictPropertyInitialization": true,
"noImplicitThis": true,
"useUnknownInCatchVariables": true,
"alwaysStrict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"exactOptionalPropertyTypes": true,
"noImplicitReturns": true,
"noFallthroughCasesInSwitch": true,
"noUncheckedIndexedAccess": true,
"noImplicitOverride": true,
"noPropertyAccessFromIndexSignature": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"skipLibCheck": true,