mirror of
https://github.com/d0zingcat/solana-agent-kit.git
synced 2026-05-13 23:16:55 +00:00
15
README.md
15
README.md
@@ -8,6 +8,7 @@ A powerful toolkit for interacting with the Solana blockchain, providing easy-to
|
||||
- Deploy new SPL tokens
|
||||
- Transfer SOL and SPL tokens
|
||||
- Check token balances
|
||||
- Stake SOL
|
||||
|
||||
- 🖼️ NFT Management
|
||||
- Deploy NFT collections
|
||||
@@ -108,6 +109,17 @@ const signature = await lendAsset(
|
||||
);
|
||||
```
|
||||
|
||||
### Stake SOL
|
||||
|
||||
```typescript
|
||||
import { stakeWithJup } from 'solana-agent-kit';
|
||||
|
||||
const signature = await stakeWithJup(
|
||||
agent,
|
||||
1 // amount in SOL
|
||||
);
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### Core Functions
|
||||
@@ -133,6 +145,9 @@ Check SOL or token balance for the agent's wallet.
|
||||
#### `lendAsset(agent, assetMint, amount, apiKey)`
|
||||
Lend idle assets to earn interest with Lulo.
|
||||
|
||||
#### `stakeWithJup(agent, amount)`
|
||||
Stake SOL with Jupiter to earn rewards.
|
||||
|
||||
## Dependencies
|
||||
|
||||
The toolkit relies on several key Solana and Metaplex libraries:
|
||||
|
||||
@@ -1 +1 @@
|
||||
window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE7WbXW/jthKG/wt9K2TNDzmO77LdE6DonnbRzemNEQSMRHuFlSVVojYnCPLfC+rDGpojh7K2Vy1izjsvyUdDSuS+kjJ/rshm+0q+J1lMNpStA5LJgyIb8jVPZSZv9yrTvyWaBKQuU7IhUSqrSlUf7J+vvulDSoL+V7Ih5C3oVUPKjqpRnlW6rCOdlz6SC7s9kA9IIUuVadfpkJgumYCZMxXpJM98Ew/N5+R9lmmqvMZvcWw6P9+jjONSVdWEvCBkTv68UJlMHmWRPH5XL175nZCJ+dlSDNyW6u9aVfpO1pHSd3UW+40BGjbHR6yKNH+5z78rP+Ds9vMz/5Kn6QTekaA5HvZKf5SpzCLlld1qPifvIcn073f3XkmHtnMy6lJm1U75lTPQeB7j+6TSqvyUH2TiN79OyMw+x34T27ecky1VWXxbVUr7PclW85kM33/56stv23RWP2WdRd++1Ifirs78CwcaNtHHCqyTpZJatS3v8zwdBn1XZ01pqD44bc6u/yxcHdV/MZFg7U8yrcqdjFT1ofvprJS10pwucSNai/fWtd7TSJpClZHKtNyrdzNZTX2TWcNzrL9/FM1QoylPG/kPWfMfb8lF13ykJ47XkaR1mUzI2baembLMX2SqXz7KKqm+5EmmJwzkAg2eaShqp32KDRAyPTkO1admkT+Y8LM+hnb+aEXH6Nszz+VYigUW/l63QXdGTFXJPpO6Lt+B/tQMDLvIBBz+/yaZHpr/fnf/p6qKPKtQT6ON/SfCbGumSy+6MLy7430YM6G0jKWWlxgZQi83AycALo1nyirSzH/Q9XOitULXtTHdxRCD9xPzPZZepWpfysO0/EPQbAPP6qlKNIr0aP4hZnb6JEt0ItPPyd91Eif65esfnydZweNn26rSpCjkXn0sJhG3sONm2yjKJC8T/XKnpk2QHXeJjdPHcFdnn5vt6rkaiDb0fxTP1vxxbY+ij/dgYhk+4+BsCZ6WvKuh/8O3Xuc8WJE/wYoqS3y/f8ZEH3NZegjd5zrNb6MorzP9SWmZpNU58sZbT1gJci3Tv2RaX5JhYUXj3T/TpdHqqFWpKv0fWWYqvsSWo/CzrJVKpjo5qNvi5RJfdvjPMlUprZNsj9bs9xyB2Bl2VmHIB4gfH/VLcRFOvZuro8RUU1fHDo19733O8H3PRG9XvdDFDvtOjn0uSNP8WcVfylznEfyuMcMzovlv2f+WH9STvKhuObaB1r9l95BkyaE+/CnxTeFUx7bcfNMPAUmyWP2fbF7JD1VW5ov3hrArfnVDArJLVBqbg7H+g0mUH7q35jiP6uZ/H7pmf6moeUvfbNvWH5Yk2C4Dvrpa0puHh2DbBzc/NH/oNYa/NIGUBFuKBVInkFqBjARbhgUyJ5BZgZwEW44FcieQW4GCBFuBBQonUFiBIQm2IRYYOoGhFbgiwXaFBa6cwJUVeE2C7TUWeO0EXluBaxJs11jg2glcW4E3JNjeYIE3TuCNDYDhgaLsUBceekJPgw/ODwKQTRA1XFCUIepCRG2KqGGDohxRFyRqk0QNHxRlibowUZsmahihKE/UBYraRFHDCUWZoi5U1KaKGlYoyhV1waI2WdTwQlG2qAsXtemihhmK8kVdwKhNGDPMMJQw5hLGbMKYYYahhDGXMHZSo5oihVcppEzZhDHDDEMJYy5hzCaMGWYYShhzCWM2Ycwww1DCmEsYswljhhmGEsZcwphNGDPMMJQw5hLGbMKYYYatA768uqF2rAsYswFjBhmGAsZcwJgNGDfI8CWSmLt8cZsvbojhKF/c5YvbfHFDDEf54i5f/GQdbBZCfCVElkKbL26I4Shf3OWL23xxQwxH+eIuX9zmixtiOMoXd/niNl/cEMNRvrjLF7f54gYZjlYw7gLGbcC4QYajgHEXMG4DJpZjZAsXMGEDJugYnMLlS9h8CUOMQCuncPkSNl/CECNQsoXLlzjZazWbLZRsgWy3bL6EIUagZAuXL2HzJQwxAt/nuXwJmy9hiBEo2cLlS9h8CUOMQMkWLl/C5ksYYgRKtnD5EjZfoUFGoGSHLmChDVhomBEo2aFLWGgTFhpmQpSw0CUstAkLDTMhSljoEtb9qXkJ+qFKreJf25eh7fb4seGVPHZvSOK6f6t7JeKGbF7f3oY3os3rG3gpMr+ZTMcj90GF3gwq1FOlfbsuhrdrYArIhdRLbjhiROwx0El2PVEvBueqQHIFJFcTJfP+oAroUaDn2+XhFiMQAjq+MsMtTDClYEb9dJp7I1Vzb0TnJzNKwQxQzxnob5MAlTVQWU9Rscc6BGMUesm0EETgBt0gB0z5eWrFdHubZ9ABQ+Q3Qt2XdPDcgEkT3Etjr/RTfzlvEALPn9/TvFdaF/aMg0GmfoM8fLkaZMIlKAV+QHfnfWl/3lflKVTk4Mnlfk9u/4VcdV/IwYgLMOJ+Yu2VrqI953AgoMAd9RRUWSy7O3FACDijwk+oTnPZfmOL229s5fE8BXQZVBjhJzyc+oNpAKxyvwrTyzS3iIAhgIjwQ6T74lg2XxwBbMBT6Pf8tMd6oFvADF+2QcKze0mmhwqT7TQ2+gw8mszv2TS62c5ySYFLuvRSaT+WAiNwofEb9dOr4GDgwbj7SbXnCQACUIVDvx7BC32gX2BomKdQd5S+U5YSB5a438rQVYW2RGDTz8H0c7/ph5UG2XhwMI/cbx77gzlZWJMowCwKvxWsv7gcdxeXAaHAFvW11dzy3zW3/HftLf9BENRVv7La3RR8MjcFi+6mIMAElFfmVwWH00MwZsCW8GMEXGUAdgBrbN2VHT96+/soT/b6zcF2hPvNZrv3k+YG8vfEqjfgmfIzNVxfAo7AkHO/IW9O3H+0J+5g0DkYdL960111B3wCDeq3VAz/PgDIwG223zJxvFkGRgaY4X5mTtZQBhSYn0L/D5qADeBigsQj8sYGt1V+Uv19M2AH1CPuMc0PASmSQqVJpshm+/D29g++b5eFQzcAAA==";
|
||||
window.searchData = "data:application/octet-stream;base64,H4sIAAAAAAAAE7Wb227jNhCG34W+FbLhQU7su2y3AYpu20U37Y0RBIxEe4XIkipRmwZB3r2gDtbQHDmUtb1KYHP+GXI+DSmSfiVl/lyR9eaVPCVZTNaUXQckk3tF1uRrnspM3uxUpn9NNAlIXaZkTaJUVpWqPthfX3zT+5QE/bdkTchb0KuGlB1UozyrdFlHOi99JBd2eyAfkEKWKtNupINjeskE9JypSCd55ut4aD7H77NMU+U1fotD0/n+HmQcl6qqJvgFJnP854XKZPIgi+ThSb14+XdMJvpnl2LgtlT/1KrSt7KOlL6ts9hvDFCzOXHEqkjzl7v8SfkBZ7ef7/mnPE0n8I4YzYlhp/RHmcosUl7ereZz/O6TTP9+e+fldGg7x6MuZVZtlV85A43nMb5LKq3KT/leJn75dUxm9jn2S2zfco63VGXxTVUp7fckW81nMnz35asvv23TWf2UdRZ9+1Lvi9s68y8cqNmcOCotn/yy27ec6G0JZuVSSa3alnd5ng4p3tZZU4iqD06bk6sNFi4P6j8ZS7DSSDKtyq2MVPWh++qklDWvHU+oI1qL92bRPqYRN4UqI5VpuVPverKa+jqzhudQ7f8omqFGXR438h+y5o+35KJrPtITJ9YRp3WZTPDZtp7pssxfZKpfPsoqqb7kSaYnDOQCNZ4ZUNSmfUoYwGS6cxyqT82SYm/MT8YxtPNHKzpY35x4LsdcLDDz97oNujMSVJXsMqnr8h3oj4OBZmcFAYf/tyTTQ/Pfb+/+VFWRZxUa02hj/0SYRdR06UVnhnd3vA9jQSgtY6nlOYEMpucHAxMAJ+ITZRVp5j/o+jnRWqHz2pjuYrDB+4nFPeZepWpXyv00/4PR7ACe1WOVaBTpUf+DzWz3SZboRKafk3/qJE70y9c/Pk8KBbefHVaVJkUhd+pjMYm4hW03O4yiTPIy0S+3alqCbLtzwjh+DLd19rlZHJ+qgWhD/0fxZM0f1/Yo+ngPJpbhExGcLMHTnHc19C986XUqBsvyB4SiyhJf758Iorc5zz2E7nOd5jdRlNeZ/qS0TNLqFHnjrSfMBLmW6d8yrc/xsLCs8e6f6NJoddSqVJX+WZaZis8Jy1H4UaGVSqY62aub4uWcuGzzHxVUpbROsh1as9+LCNjOCGcZhnyA+OFBvxRn4dRHc3GQmBrUxaFDY7vLzxm+7pkY20UvdHaEfSfHtgvSNH9W8Zcy13kE9zVmxIxo/l/hf8v36lGeVbecsIHW/xXuPsmSfb3/U+KLwqkR23Lzg74PSJLF6l+yfiXfVVmZ/fU1YRf8YkUCsk1UGptjuH7DJMr33VtznEd18+991+xvFTVv6etN2/rDJQk2lwFfXtDV6v4+2PTGzRfNB73G8EljSEmwoZghdQypZchIsGGYIXMMmWXISbDhmCF3DLllKEiwEZihcAyFZRiSYBNihqFjGFqGSxJslpjh0jFcWoZXJNhcYYZXjuGVZXhNgs01ZnjtGF5bhisSbFaY4coxXNkAGB4oyg514aFH9DT44PwgANkEUcMFRRmiLkTUpogaNijKEXVBojZJ1PBBUZaoCxO1aaKGEYryRF2gqE0UNZxQlCnqQkVtqqhhhaJcURcsapNFDS8UZYu6cFGbLmqYoShf1AWM2oQxwwxDCWMuYcwmjBlmGEoYcwljRzWqKVJ4lULKlE0YM8wwlDDmEsZswphhhqGEMZcwZhPGDDMMJYy5hDGbMGaYYShhzCWM2YQxwwxDCWMuYcwmjBlmGEoYcwljNmHMMMNWAacXlytqG7uEMZswbpjhKGHcJYzbhHHDDKeYZ+4Sxm3CuGGGo4RxlzB+NBM2UyE+FyKToU0YN8xwlDDuEsZtwrhhhqOEcZcwbhPGDTMcJYy7hHGbMG6Y4Shh3CWM24RxwwxHCeMuYdwmjBtmOFrDuEsYtwkThhmBEiZcwoRNmKCjbAuXMGETJtgonsIlTNiECcOMQKuncAkTR+utZsGFsi2QJZdNmDDMCJRt4RImbMKEYUbgaz2XMGETJgwzAmVbuIQJmzBhmBEo28IlTNiECcOMQNkWLmHCJixsCEPZDl3CQpuw0DAjULZDl7DQJiw0zIQo26FLWGgTFhpmQpSw0CUstAkLDTMhSljoEtZ91LxFfVelVvEv7dvUZnPYrXglD90r1nCT4ZWEl2T9+vY2vFKtX9/AW5X5zng6nNkPKuxyUGGeKu3reTG8ng9yIZALmZfccEaJhQc6ya4n6sXgYBZIXgHJq4mSeX/SBfQY0PPt8nDpEggBHV+Z4dLooEMHHeqn01w8qZqLJzo/yigFGaCeGeivowCVFVBZTVGxx3oJxmjpJdNCEIELf4Mc6Jpfz1ox3V4+GnQAUX5AdVvx4GEGyRfCS2On9GN/l3AQAuPsN8w7pXVhZzwEuQq9RIatL1AKAIch95LpDgzT/sCwylOoyME4c7+B7rfYVbfFDkYc9FL4ibU30Ir2oMSBgAI2qR+b5gqf7K7wASEBhPxYSOs0l+0mXdxu0pWHAxnQZQ667JfY4doASANglftVql6muYYEAgKICD9Eui3LstmyBLCBmEK/MWvPBUG3QDCctkbCs3tJpocKk201NvocTI3cb6Y1utnWipICFeqn0u62giIKMGB+o358cx0MPBh3P6n2QAJAAEpW6DdhwRuBoF8ggcxTqDuL3yo7VSAk7ldGu6rQlgj04QOJE36Jg5UGWXhwkEful8f+ZE8WVhIFKF3Cbybs71nH3T1rQCh4FKnf89P9KGHb/Chh2/4oYRAEwfmV1e6q4aO5alh0Vw0BJgBZ5sfscPwIxgxMRsKPEXAXAoQDWGOrruz40dtfaHm0528OljXcL5vt2k+aK8xPiVVvALV+0HZ3pQEPYKCo30Q73KECvQJp435pa479v7fH/iBxYHoVfkB1t/tBn8CjR/0eveEnEUAGLtX9cn643gZGBnSI+819R/MwAwrMT6H/DRcIA0QxQeIBeeuDGfKT6i+9gXBA2eAeab4PSJEUKk0yRdab+7e3/wDIrU8JNjgAAA==";
|
||||
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
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "solana-agent-kit",
|
||||
"version": "1.1.0",
|
||||
"version": "1.1.1",
|
||||
"description": "A toolkit for interacting with the Solana blockchain using LangChain",
|
||||
"main": "dist/index.js",
|
||||
"types": "dist/index.d.ts",
|
||||
|
||||
@@ -12,6 +12,7 @@ import {
|
||||
launchPumpFunToken,
|
||||
lendAsset,
|
||||
getTPS,
|
||||
stakeWithJup,
|
||||
} from "../tools";
|
||||
import { CollectionOptions, PumpFunTokenOptions } from "../types";
|
||||
import { DEFAULT_OPTIONS } from "../constants";
|
||||
@@ -111,4 +112,10 @@ export class SolanaAgentKit {
|
||||
options,
|
||||
);
|
||||
}
|
||||
|
||||
async stake(
|
||||
amount: number,
|
||||
) {
|
||||
return stakeWithJup(this, amount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,6 @@ export class SolanaTransferTool extends Tool {
|
||||
protected async _call(input: string): Promise<string> {
|
||||
try {
|
||||
const parsedInput = JSON.parse(input);
|
||||
console.log(parsedInput);
|
||||
|
||||
const recipient = new PublicKey(parsedInput.to);
|
||||
const mintAddress = parsedInput.mint
|
||||
@@ -64,7 +63,7 @@ export class SolanaTransferTool extends Tool {
|
||||
const tx = await this.solanaKit.transfer(
|
||||
recipient,
|
||||
parsedInput.amount,
|
||||
mintAddress
|
||||
mintAddress,
|
||||
);
|
||||
|
||||
return JSON.stringify({
|
||||
@@ -102,7 +101,7 @@ export class SolanaDeployTokenTool extends Tool {
|
||||
input.decimals > 9)
|
||||
) {
|
||||
throw new Error(
|
||||
"decimals must be a number between 0 and 9 when provided"
|
||||
"decimals must be a number between 0 and 9 when provided",
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -159,7 +158,7 @@ export class SolanaDeployCollectionTool extends Tool {
|
||||
input.royaltyBasisPoints > 10000)
|
||||
) {
|
||||
throw new Error(
|
||||
"royaltyBasisPoints must be a number between 0 and 10000 when provided"
|
||||
"royaltyBasisPoints must be a number between 0 and 10000 when provided",
|
||||
);
|
||||
}
|
||||
if (input.creators) {
|
||||
@@ -169,7 +168,7 @@ export class SolanaDeployCollectionTool extends Tool {
|
||||
input.creators.forEach((creator: any, index: number) => {
|
||||
if (!creator.address || typeof creator.address !== "string") {
|
||||
throw new Error(
|
||||
`creator[${index}].address is required and must be a string`
|
||||
`creator[${index}].address is required and must be a string`,
|
||||
);
|
||||
}
|
||||
if (
|
||||
@@ -178,7 +177,7 @@ export class SolanaDeployCollectionTool extends Tool {
|
||||
creator.percentage > 100
|
||||
) {
|
||||
throw new Error(
|
||||
`creator[${index}].percentage must be a number between 0 and 100`
|
||||
`creator[${index}].percentage must be a number between 0 and 100`,
|
||||
);
|
||||
}
|
||||
});
|
||||
@@ -246,7 +245,9 @@ export class SolanaMintNFTTool extends Tool {
|
||||
const result = await this.solanaKit.mintNFT(
|
||||
new PublicKey(parsedInput.collectionMint),
|
||||
parsedInput.metadata,
|
||||
parsedInput.recipient ? new PublicKey(parsedInput.recipient) : undefined
|
||||
parsedInput.recipient
|
||||
? new PublicKey(parsedInput.recipient)
|
||||
: undefined,
|
||||
);
|
||||
|
||||
return JSON.stringify({
|
||||
@@ -290,7 +291,7 @@ export class SolanaTradeTool extends Tool {
|
||||
parsedInput.inputMint
|
||||
? new PublicKey(parsedInput.inputMint)
|
||||
: new PublicKey("So11111111111111111111111111111111111111112"),
|
||||
parsedInput.slippageBps
|
||||
parsedInput.slippageBps,
|
||||
);
|
||||
|
||||
return JSON.stringify({
|
||||
@@ -302,7 +303,6 @@ export class SolanaTradeTool extends Tool {
|
||||
outputToken: parsedInput.outputMint,
|
||||
});
|
||||
} catch (error: any) {
|
||||
console.log(error);
|
||||
return JSON.stringify({
|
||||
status: "error",
|
||||
message: error.message,
|
||||
@@ -371,7 +371,7 @@ export class SolanaRegisterDomainTool extends Tool {
|
||||
|
||||
const tx = await this.solanaKit.registerDomain(
|
||||
parsedInput.name,
|
||||
parsedInput.spaceKB || 1
|
||||
parsedInput.spaceKB || 1,
|
||||
);
|
||||
|
||||
return JSON.stringify({
|
||||
@@ -423,7 +423,6 @@ export class SolanaPumpfunTokenLaunchTool extends Tool {
|
||||
}
|
||||
|
||||
private validateInput(input: any): void {
|
||||
console.log(input);
|
||||
if (!input.tokenName || typeof input.tokenName !== "string") {
|
||||
throw new Error("tokenName is required and must be a string");
|
||||
}
|
||||
@@ -463,7 +462,7 @@ export class SolanaPumpfunTokenLaunchTool extends Tool {
|
||||
telegram: parsedInput.telegram,
|
||||
website: parsedInput.website,
|
||||
initialLiquiditySOL: parsedInput.initialLiquiditySOL,
|
||||
}
|
||||
},
|
||||
);
|
||||
|
||||
return JSON.stringify({
|
||||
@@ -568,6 +567,39 @@ export class SolanaTPSCalculatorTool extends Tool {
|
||||
}
|
||||
}
|
||||
|
||||
export class SolanaStakeTool extends Tool {
|
||||
name = "solana_stake";
|
||||
description = `This tool can be used to stake your SOL (Solana), also called as SOL staking or liquid staking.
|
||||
|
||||
Inputs ( input is a JSON string ):
|
||||
amount: number, eg 1 or 0.01 (required)`;
|
||||
|
||||
constructor(private solanaKit: SolanaAgentKit) {
|
||||
super();
|
||||
}
|
||||
|
||||
protected async _call(input: string): Promise<string> {
|
||||
try {
|
||||
const parsedInput = JSON.parse(input) || Number(input);
|
||||
|
||||
const tx = await this.solanaKit.stake(parsedInput.amount);
|
||||
|
||||
return JSON.stringify({
|
||||
status: "success",
|
||||
message: "Staked successfully",
|
||||
transaction: tx,
|
||||
amount: parsedInput.amount,
|
||||
});
|
||||
} catch (error: any) {
|
||||
return JSON.stringify({
|
||||
status: "error",
|
||||
message: error.message,
|
||||
code: error.code || "UNKNOWN_ERROR",
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export function createSolanaTools(solanaKit: SolanaAgentKit) {
|
||||
return [
|
||||
new SolanaBalanceTool(solanaKit),
|
||||
@@ -583,5 +615,6 @@ export function createSolanaTools(solanaKit: SolanaAgentKit) {
|
||||
new SolanaCreateImageTool(solanaKit),
|
||||
new SolanaLendAssetTool(solanaKit),
|
||||
new SolanaTPSCalculatorTool(solanaKit),
|
||||
new SolanaStakeTool(solanaKit),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -27,10 +27,6 @@ export async function deploy_token(
|
||||
);
|
||||
|
||||
const mint = Keypair.generate();
|
||||
|
||||
console.log("Mint address: ", mint.publicKey.toString());
|
||||
console.log("Agent address: ", agent.wallet_address.toString());
|
||||
|
||||
let account_create_ix = SystemProgram.createAccount({
|
||||
fromPubkey: agent.wallet_address,
|
||||
newAccountPubkey: mint.publicKey,
|
||||
@@ -51,13 +47,6 @@ export async function deploy_token(
|
||||
|
||||
let hash = await sendTx(agent, tx, [mint]);
|
||||
|
||||
console.log("Transaction hash: ", hash);
|
||||
|
||||
console.log(
|
||||
"Token deployed successfully. Mint address: ",
|
||||
mint.publicKey.toString()
|
||||
);
|
||||
|
||||
return {
|
||||
mint: mint.publicKey,
|
||||
};
|
||||
|
||||
@@ -9,3 +9,4 @@ export * from "./register_domain";
|
||||
export * from "./launch_pumpfun_token";
|
||||
export * from "./lend";
|
||||
export * from "./get_tps";
|
||||
export * from './stake_with_jup';
|
||||
@@ -38,7 +38,6 @@ async function uploadMetadata(
|
||||
finalFormData.append('file', files.file);
|
||||
}
|
||||
|
||||
console.log("Final form data:", finalFormData);
|
||||
|
||||
const metadataResponse = await fetch("https://pump.fun/api/ipfs", {
|
||||
method: "POST",
|
||||
@@ -46,7 +45,6 @@ async function uploadMetadata(
|
||||
});
|
||||
|
||||
if (!metadataResponse.ok) {
|
||||
console.log("Metadata response:", await metadataResponse.json());
|
||||
throw new Error(`Metadata upload failed: ${metadataResponse.statusText}`);
|
||||
}
|
||||
|
||||
@@ -152,30 +150,14 @@ export async function launchPumpFunToken(
|
||||
options?: PumpFunTokenOptions
|
||||
) {
|
||||
try {
|
||||
// TBD : Remove clgs after approval
|
||||
console.log("Starting token launch process...");
|
||||
|
||||
// Generate mint keypair
|
||||
const mintKeypair = Keypair.generate();
|
||||
console.log("Mint public key:", mintKeypair.publicKey.toBase58());
|
||||
|
||||
// Upload metadata
|
||||
console.log("Uploading metadata to IPFS...");
|
||||
const metadataResponse = await uploadMetadata(tokenName, tokenTicker, description, imageUrl, options);
|
||||
console.log("Metadata response:", metadataResponse);
|
||||
|
||||
// Create token transaction
|
||||
console.log("Creating token transaction...");
|
||||
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(agent, tx, mintKeypair);
|
||||
|
||||
console.log("Token launch successful!");
|
||||
return {
|
||||
signature,
|
||||
mint: mintKeypair.publicKey.toBase58(),
|
||||
|
||||
56
src/tools/stake_with_jup.ts
Normal file
56
src/tools/stake_with_jup.ts
Normal file
@@ -0,0 +1,56 @@
|
||||
import { VersionedTransaction } from "@solana/web3.js";
|
||||
import { SolanaAgentKit } from "../agent";
|
||||
|
||||
/**
|
||||
* Stake SOL with Jup validator
|
||||
* @param agent SolanaAgentKit instance
|
||||
* @param amount Amount of SOL to stake
|
||||
* @returns Transaction signature
|
||||
*/
|
||||
export async function stakeWithJup(
|
||||
agent: SolanaAgentKit,
|
||||
amount: number,
|
||||
): Promise<string> {
|
||||
try {
|
||||
const res = await fetch(
|
||||
`https://worker.jup.ag/blinks/swap/So11111111111111111111111111111111111111112/jupSoLaHXQiZZTSfEWMTRRgpnyFm8f6sZdosWBjx93v/${amount}`,
|
||||
{
|
||||
method: "POST",
|
||||
headers: {
|
||||
"Content-Type": "application/json",
|
||||
},
|
||||
body: JSON.stringify({
|
||||
account: agent.wallet.publicKey.toBase58(),
|
||||
}),
|
||||
},
|
||||
);
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
const txn = VersionedTransaction.deserialize(
|
||||
Buffer.from(data.transaction, "base64"),
|
||||
);
|
||||
|
||||
const { blockhash } = await agent.connection.getLatestBlockhash();
|
||||
txn.message.recentBlockhash = blockhash;
|
||||
|
||||
// Sign and send transaction
|
||||
txn.sign([agent.wallet]);
|
||||
const signature = await agent.connection.sendTransaction(txn, {
|
||||
preflightCommitment: "confirmed",
|
||||
maxRetries: 3,
|
||||
});
|
||||
|
||||
const latestBlockhash = await agent.connection.getLatestBlockhash();
|
||||
await agent.connection.confirmTransaction({
|
||||
signature,
|
||||
blockhash: latestBlockhash.blockhash,
|
||||
lastValidBlockHeight: latestBlockhash.lastValidBlockHeight,
|
||||
});
|
||||
|
||||
return signature;
|
||||
} catch (error: any) {
|
||||
console.error(error);
|
||||
throw new Error(`jupSOL staking failed: ${error.message}`);
|
||||
}
|
||||
}
|
||||
@@ -19,8 +19,6 @@ export async function trade(
|
||||
slippageBps: number = DEFAULT_OPTIONS.SLIPPAGE_BPS,
|
||||
): Promise<string> {
|
||||
try {
|
||||
// Get quote for the swap
|
||||
console.log(inputMint.toString(), outputMint.toString(), inputAmount, slippageBps);
|
||||
const quoteResponse = await (
|
||||
await fetch(
|
||||
`${JUP_API}/quote?` +
|
||||
|
||||
Reference in New Issue
Block a user