From 27cc366f4f188f68f1f8c5da67a65a39e762a7ed Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Thu, 23 Jan 2025 09:10:23 +0100 Subject: [PATCH 1/9] fix: drift user account balances and position amounts --- package.json | 174 +++++++++++++++++++-------------------- pnpm-lock.yaml | 28 +++---- src/tools/drift/drift.ts | 76 +++++++++++++---- 3 files changed, 161 insertions(+), 117 deletions(-) diff --git a/package.json b/package.json index 2839083f..04cc8512 100644 --- a/package.json +++ b/package.json @@ -1,89 +1,89 @@ { - "name": "solana-agent-kit", - "version": "1.4.3", - "description": "connect any ai agents to solana protocols", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "build": "tsc", - "docs": "typedoc src --out docs", - "test": "tsx test/index.ts", - "test:vercel-ai": "tsx test/agent_sdks/vercel_ai.ts", - "generate": "tsx src/utils/keypair.ts", - "lint": "eslint . --ext .ts", - "lint:fix": "eslint . --ext .ts --fix", - "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", - "prepare": "husky" - }, - "engines": { - "node": ">=22.0.0", - "pnpm": ">=8.0.0" - }, - "keywords": ["solana", "agent", "ai", "solana agent kit", "sendai"], - "author": "sendaifun", - "license": "Apache-2.0", - "dependencies": { - "@3land/listings-sdk": "^0.0.6", - "@ai-sdk/openai": "^1.0.11", - "@bonfida/spl-name-service": "^3.0.7", - "@cks-systems/manifest-sdk": "0.1.59", - "@coral-xyz/anchor": "0.29", - "@drift-labs/sdk": "2.107.0-beta.3", - "@drift-labs/vaults-sdk": "^0.2.49", - "@langchain/core": "^0.3.26", - "@langchain/groq": "^0.1.2", - "@langchain/langgraph": "^0.2.36", - "@langchain/openai": "^0.3.16", - "@lightprotocol/compressed-token": "^0.17.1", - "@lightprotocol/stateless.js": "^0.17.1", - "@metaplex-foundation/digital-asset-standard-api": "^1.0.4", - "@metaplex-foundation/mpl-core": "^1.1.1", - "@metaplex-foundation/mpl-token-metadata": "^3.3.0", - "@metaplex-foundation/mpl-toolbox": "^0.9.4", - "@metaplex-foundation/umi": "^0.9.2", - "@metaplex-foundation/umi-bundle-defaults": "^0.9.2", - "@metaplex-foundation/umi-web3js-adapters": "^0.9.2", - "@mercurial-finance/dynamic-amm-sdk": "^1.1.19", - "@meteora-ag/alpha-vault": "^1.1.7", - "@meteora-ag/dlmm": "^1.3.0", - "@onsol/tldparser": "^0.6.7", - "@orca-so/common-sdk": "0.6.4", - "@orca-so/whirlpools-sdk": "^0.13.12", - "@pythnetwork/hermes-client": "^1.3.0", - "@raydium-io/raydium-sdk-v2": "0.1.95-alpha", - "@solana/spl-token": "^0.4.9", - "@solana/web3.js": "^1.98.0", - "@sqds/multisig": "^2.1.3", - "@tensor-oss/tensorswap-sdk": "^4.5.0", - "@tiplink/api": "^0.3.1", - "@voltr/vault-sdk": "^0.1.1", - "ai": "^4.0.22", - "bn.js": "^5.2.1", - "bs58": "^6.0.0", - "chai": "^5.1.2", - "decimal.js": "^10.4.3", - "dotenv": "^16.4.7", - "flash-sdk": "^2.24.3", - "form-data": "^4.0.1", - "langchain": "^0.3.8", - "openai": "^4.77.0", - "typedoc": "^0.27.6", - "zod": "^3.24.1" - }, - "devDependencies": { - "@types/bn.js": "^5.1.6", - "@types/chai": "^5.0.1", - "@types/node": "^22.10.2", - "@typescript-eslint/eslint-plugin": "^8.18.2", - "@typescript-eslint/parser": "^8.18.2", - "eslint": "^8.56.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-prettier": "^5.2.1", - "husky": "^9.1.7", - "lint-staged": "^15.3.0", - "prettier": "^3.4.2", - "tsx": "^4.19.2", - "typescript": "^5.7.2" - }, - "packageManager": "pnpm@9.15.3" + "name": "solana-agent-kit", + "version": "1.4.3", + "description": "connect any ai agents to solana protocols", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "docs": "typedoc src --out docs", + "test": "tsx test/index.ts", + "test:vercel-ai": "tsx test/agent_sdks/vercel_ai.ts", + "generate": "tsx src/utils/keypair.ts", + "lint": "eslint . --ext .ts", + "lint:fix": "eslint . --ext .ts --fix", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "prepare": "husky" + }, + "engines": { + "node": ">=22.0.0", + "pnpm": ">=8.0.0" + }, + "keywords": ["solana", "agent", "ai", "solana agent kit", "sendai"], + "author": "sendaifun", + "license": "Apache-2.0", + "dependencies": { + "@3land/listings-sdk": "^0.0.6", + "@ai-sdk/openai": "^1.0.11", + "@bonfida/spl-name-service": "^3.0.7", + "@cks-systems/manifest-sdk": "0.1.59", + "@coral-xyz/anchor": "0.29", + "@drift-labs/sdk": "2.108.0-beta.4", + "@drift-labs/vaults-sdk": "^0.3.2", + "@langchain/core": "^0.3.26", + "@langchain/groq": "^0.1.2", + "@langchain/langgraph": "^0.2.36", + "@langchain/openai": "^0.3.16", + "@lightprotocol/compressed-token": "^0.17.1", + "@lightprotocol/stateless.js": "^0.17.1", + "@metaplex-foundation/digital-asset-standard-api": "^1.0.4", + "@metaplex-foundation/mpl-core": "^1.1.1", + "@metaplex-foundation/mpl-token-metadata": "^3.3.0", + "@metaplex-foundation/mpl-toolbox": "^0.9.4", + "@metaplex-foundation/umi": "^0.9.2", + "@metaplex-foundation/umi-bundle-defaults": "^0.9.2", + "@metaplex-foundation/umi-web3js-adapters": "^0.9.2", + "@mercurial-finance/dynamic-amm-sdk": "^1.1.19", + "@meteora-ag/alpha-vault": "^1.1.7", + "@meteora-ag/dlmm": "^1.3.0", + "@onsol/tldparser": "^0.6.7", + "@orca-so/common-sdk": "0.6.4", + "@orca-so/whirlpools-sdk": "^0.13.12", + "@pythnetwork/hermes-client": "^1.3.0", + "@raydium-io/raydium-sdk-v2": "0.1.95-alpha", + "@solana/spl-token": "^0.4.9", + "@solana/web3.js": "^1.98.0", + "@sqds/multisig": "^2.1.3", + "@tensor-oss/tensorswap-sdk": "^4.5.0", + "@tiplink/api": "^0.3.1", + "@voltr/vault-sdk": "^0.1.1", + "ai": "^4.0.22", + "bn.js": "^5.2.1", + "bs58": "^6.0.0", + "chai": "^5.1.2", + "decimal.js": "^10.4.3", + "dotenv": "^16.4.7", + "flash-sdk": "^2.24.3", + "form-data": "^4.0.1", + "langchain": "^0.3.8", + "openai": "^4.77.0", + "typedoc": "^0.27.6", + "zod": "^3.24.1" + }, + "devDependencies": { + "@types/bn.js": "^5.1.6", + "@types/chai": "^5.0.1", + "@types/node": "^22.10.2", + "@typescript-eslint/eslint-plugin": "^8.18.2", + "@typescript-eslint/parser": "^8.18.2", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-prettier": "^5.2.1", + "husky": "^9.1.7", + "lint-staged": "^15.3.0", + "prettier": "^3.4.2", + "tsx": "^4.19.2", + "typescript": "^5.7.2" + }, + "packageManager": "pnpm@9.15.3" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 06c844bb..9f5e38df 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,11 +24,11 @@ importers: specifier: '0.29' version: 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@drift-labs/sdk': - specifier: 2.107.0-beta.3 - version: 2.107.0-beta.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) + specifier: 2.108.0-beta.4 + version: 2.108.0-beta.4(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10) '@drift-labs/vaults-sdk': - specifier: ^0.2.49 - version: 0.2.49(@types/node@22.10.7)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) + specifier: ^0.3.2 + version: 0.3.2(@types/node@22.10.7)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10) '@langchain/core': specifier: ^0.3.26 version: 0.3.27(openai@4.77.3(zod@3.24.1)) @@ -325,12 +325,12 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@drift-labs/sdk@2.107.0-beta.3': - resolution: {integrity: sha512-pRWTRpAVYAhJZI+5WxrAzSMnU+1IiJXuTPanY9eNZZUn9S//RRc3CXigM/ogeGPaOolizBZDejwy2Igz7h22JQ==} + '@drift-labs/sdk@2.108.0-beta.4': + resolution: {integrity: sha512-P3pbBYV+CHanxI7ZAob3YOmQWE47v2J9dgdAtUL25qTee1fRAL8s/ESW8Fn7grkajb1v6Fq3QZOCY0qpqnuewA==} engines: {node: '>=20.18.0'} - '@drift-labs/vaults-sdk@0.2.49': - resolution: {integrity: sha512-Q4XFBlxdCN1J8nsQe3mmmEsgBFTEW3kGTe3yB3blzzMvdMa1ESYP4nlbZjaMv2pjYTn7u+mDLTye/xDgcYw2qg==} + '@drift-labs/vaults-sdk@0.3.2': + resolution: {integrity: sha512-wt4Rz4/o6ZGYZAr47fXpmMnmNpXESHe5BqxO5iCFGQibjCrcu1Sefko5xfwRH3eLUq//ue5EXpKbBXW7b8piYg==} engines: {node: '>=16'} '@ellipsis-labs/phoenix-sdk@1.4.5': @@ -5093,7 +5093,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@drift-labs/sdk@2.107.0-beta.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': + '@drift-labs/sdk@2.108.0-beta.4(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@coral-xyz/anchor-30': '@coral-xyz/anchor@0.30.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)' @@ -5129,7 +5129,7 @@ snapshots: - typescript - utf-8-validate - '@drift-labs/sdk@2.107.0-beta.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': + '@drift-labs/sdk@2.108.0-beta.4(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.7.2)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor': 0.29.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@coral-xyz/anchor-30': '@coral-xyz/anchor@0.30.1(bufferutil@4.0.9)(utf-8-validate@5.0.10)' @@ -5165,10 +5165,10 @@ snapshots: - typescript - utf-8-validate - '@drift-labs/vaults-sdk@0.2.49(@types/node@22.10.7)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)': + '@drift-labs/vaults-sdk@0.3.2(@types/node@22.10.7)(arweave@1.15.5)(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(utf-8-validate@5.0.10)': dependencies: '@coral-xyz/anchor': 0.28.0(bufferutil@4.0.9)(utf-8-validate@5.0.10) - '@drift-labs/sdk': 2.107.0-beta.3(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) + '@drift-labs/sdk': 2.108.0-beta.4(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) '@ledgerhq/hw-app-solana': 7.2.4 '@ledgerhq/hw-transport': 6.31.4 '@ledgerhq/hw-transport-node-hid': 6.29.5 @@ -5893,7 +5893,7 @@ snapshots: dependencies: '@ledgerhq/devices': 6.27.1 '@ledgerhq/errors': 6.19.1 - '@ledgerhq/hw-transport': 6.31.4 + '@ledgerhq/hw-transport': 6.27.1 '@ledgerhq/logs': 6.12.0 '@ledgerhq/hw-transport@6.27.1': @@ -6224,7 +6224,7 @@ snapshots: '@metaplex-foundation/mpl-candy-machine@5.1.0(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10)': dependencies: - '@metaplex-foundation/beet': 0.7.1 + '@metaplex-foundation/beet': 0.7.2 '@metaplex-foundation/beet-solana': 0.4.1(bufferutil@4.0.9)(utf-8-validate@5.0.10) '@metaplex-foundation/cusper': 0.0.2 '@solana/spl-token': 0.3.11(@solana/web3.js@1.98.0(bufferutil@4.0.9)(utf-8-validate@5.0.10))(bufferutil@4.0.9)(fastestsmallesttextencoderdecoder@1.0.22)(typescript@5.6.3)(utf-8-validate@5.0.10) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index a86fc5d9..389bd43c 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -1,6 +1,7 @@ import { BASE_PRECISION, BigNum, + BulkAccountLoader, calculateDepositRate, calculateEstimatedEntryPriceWithL2, calculateInterestRate, @@ -14,6 +15,7 @@ import { getInsuranceFundStakeAccountPublicKey, getLimitOrderParams, getMarketOrderParams, + getTokenAmount, getUserAccountPublicKeySync, JupiterClient, MainnetPerpMarkets, @@ -71,6 +73,10 @@ export async function initClients( txParams: { computeUnitsPrice: MINIMUM_COMPUTE_PRICE_FOR_COMPLEX_ACTIONS, }, + accountSubscription: { + type: "polling", + accountLoader: new BulkAccountLoader(agent.connection, "processed", 10), + }, txSender: new FastSingleTxSender({ connection: agent.connection, wallet, @@ -439,12 +445,14 @@ export async function doesUserHaveDriftAccount(agent: SolanaAgentKit) { export async function driftUserAccountInfo(agent: SolanaAgentKit) { try { const { driftClient, cleanUp } = await initClients(agent); + const userPublicKey = getUserAccountPublicKeySync( + new PublicKey(DRIFT_PROGRAM_ID), + agent.wallet.publicKey, + ); + const user = new User({ driftClient, - userAccountPublicKey: getUserAccountPublicKeySync( - new PublicKey(DRIFT_PROGRAM_ID), - agent.wallet.publicKey, - ), + userAccountPublicKey: userPublicKey, }); const userAccountExists = await user.exists(); @@ -457,28 +465,64 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { await cleanUp(); const perpPositions = account.perpPositions.map((pos) => ({ - ...pos, + market: MainnetPerpMarkets[pos.marketIndex].symbol, baseAssetAmount: convertToNumber(pos.baseAssetAmount, BASE_PRECISION), + quoteAssetAmount: convertToNumber( + pos.quoteAssetAmount.abs(), + QUOTE_PRECISION, + ), + quoteEntryAmount: convertToNumber( + pos.quoteEntryAmount.abs(), + QUOTE_PRECISION, + ), + quoteBreakEvenAmount: convertToNumber( + pos.quoteBreakEvenAmount.abs(), + QUOTE_PRECISION, + ), settledPnl: convertToNumber(pos.settledPnl, QUOTE_PRECISION), + openAsks: pos.openAsks.toNumber(), + openBids: pos.openBids.toNumber(), + openOrders: pos.openOrders, + positionType: + convertToNumber(pos.baseAssetAmount, QUOTE_PRECISION) > 0 + ? "long" + : "short", })); - const spotPositions = account.spotPositions.map((pos) => ({ - ...pos, - availableBalance: convertToNumber( + const spotPositions = account.spotPositions.map((pos) => { + const spotMarketAccount = driftClient.getSpotMarketAccount( + pos.marketIndex, + ); + + if (!spotMarketAccount) { + return; + } + + const tokenBalance = getTokenAmount( pos.scaledBalance, - MainnetSpotMarkets[pos.marketIndex].precision, - ), - symbol: MainnetSpotMarkets.find((v) => v.marketIndex === pos.marketIndex) - ?.symbol, - })); + spotMarketAccount, + pos.balanceType, + ); + + return { + availableBalance: convertToNumber( + tokenBalance, + MainnetSpotMarkets[pos.marketIndex].precision, + ), + symbol: MainnetSpotMarkets[pos.marketIndex].symbol, + openAsks: pos.openAsks.toNumber(), + openBids: pos.openBids.toNumber(), + openOrders: pos.openOrders, + }; + }); return { - ...account, name: account.name, + accountAddress: userPublicKey.toBase58(), authority: account.authority, settledPerpPnl: `$${convertToNumber(account.settledPerpPnl, QUOTE_PRECISION)}`, lastActiveSlot: account.lastActiveSlot.toNumber(), - perpPositions, - spotPositions, + perpPositions: perpPositions.filter((pos) => pos.baseAssetAmount !== 0), + spotPositions: spotPositions.filter((pos) => pos?.availableBalance !== 0), }; } catch (e) { // @ts-expect-error - error message is a string From 78168253d32656f2b3b54ad9f0b3b9d311ba496b Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 24 Jan 2025 08:23:16 +0100 Subject: [PATCH 2/9] fix: perp position precision --- src/tools/drift/drift.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 389bd43c..812476e8 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -484,7 +484,7 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { openBids: pos.openBids.toNumber(), openOrders: pos.openOrders, positionType: - convertToNumber(pos.baseAssetAmount, QUOTE_PRECISION) > 0 + convertToNumber(pos.baseAssetAmount, BASE_PRECISION) > 0 ? "long" : "short", })); From b8f916252bad0ed1b3552e23726f32cb091a4dfe Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 24 Jan 2025 08:24:38 +0100 Subject: [PATCH 3/9] fix: spot position balance type --- src/tools/drift/drift.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 812476e8..fbdc421e 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -26,6 +26,7 @@ import { PostOnlyParams, PRICE_PRECISION, QUOTE_PRECISION, + SpotBalanceType, User, type IWallet, } from "@drift-labs/sdk"; @@ -512,6 +513,7 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { openAsks: pos.openAsks.toNumber(), openBids: pos.openBids.toNumber(), openOrders: pos.openOrders, + type: pos.balanceType === SpotBalanceType.BORROW ? "borrow" : "deposit", }; }); From 64f3800dd238cc77729ed79cd5c0516d819a9a98 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 24 Jan 2025 08:42:21 +0100 Subject: [PATCH 4/9] fix: overall drift account usd balance --- src/tools/drift/drift.ts | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index fbdc421e..1d8b7ad1 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -462,9 +462,7 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { } await user.subscribe(); const account = user.getUserAccount(); - await user.unsubscribe(); - await cleanUp(); const perpPositions = account.perpPositions.map((pos) => ({ market: MainnetPerpMarkets[pos.marketIndex].symbol, baseAssetAmount: convertToNumber(pos.baseAssetAmount, BASE_PRECISION), @@ -517,10 +515,21 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { }; }); + const overallUserBalance = user.getNetSpotMarketValue(); + const unrealizedPnl = user.getUnrealizedPNL(true); + const netUSDValue = convertToNumber( + overallUserBalance.add(unrealizedPnl), + QUOTE_PRECISION, + ); + + await cleanUp(); + await user.unsubscribe(); + return { name: account.name, accountAddress: userPublicKey.toBase58(), authority: account.authority, + overallBalance: netUSDValue, settledPerpPnl: `$${convertToNumber(account.settledPerpPnl, QUOTE_PRECISION)}`, lastActiveSlot: account.lastActiveSlot.toNumber(), perpPositions: perpPositions.filter((pos) => pos.baseAssetAmount !== 0), From a1280161f665edbc9d59fcf91596dccd0fbbd85a Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Fri, 24 Jan 2025 14:27:14 +0100 Subject: [PATCH 5/9] fix: spot position balance type and signs --- src/tools/drift/drift.ts | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 1d8b7ad1..37a22f84 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -17,6 +17,7 @@ import { getMarketOrderParams, getTokenAmount, getUserAccountPublicKeySync, + isVariant, JupiterClient, MainnetPerpMarkets, MainnetSpotMarkets, @@ -503,17 +504,21 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { ); return { - availableBalance: convertToNumber( - tokenBalance, - MainnetSpotMarkets[pos.marketIndex].precision, - ), + availableBalance: isVariant(pos.balanceType, "borrow") + ? -1 + : 1 * + convertToNumber( + tokenBalance, + MainnetSpotMarkets[pos.marketIndex].precision, + ), symbol: MainnetSpotMarkets[pos.marketIndex].symbol, openAsks: pos.openAsks.toNumber(), openBids: pos.openBids.toNumber(), openOrders: pos.openOrders, - type: pos.balanceType === SpotBalanceType.BORROW ? "borrow" : "deposit", + type: isVariant(pos.balanceType, "borrow") ? "borrow" : "deposit", }; }); + console.log(spotPositions); const overallUserBalance = user.getNetSpotMarketValue(); const unrealizedPnl = user.getUnrealizedPNL(true); From c417b9b5680760d131e62746e4e8f227702fe259 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Sat, 25 Jan 2025 08:43:39 +0100 Subject: [PATCH 6/9] fix: spot position balance signs --- src/tools/drift/drift.ts | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 37a22f84..05f36c49 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -504,13 +504,12 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { ); return { - availableBalance: isVariant(pos.balanceType, "borrow") - ? -1 - : 1 * - convertToNumber( - tokenBalance, - MainnetSpotMarkets[pos.marketIndex].precision, - ), + availableBalance: + (isVariant(pos.balanceType, "borrow") ? -1 : 1) * + convertToNumber( + tokenBalance, + MainnetSpotMarkets[pos.marketIndex].precision, + ), symbol: MainnetSpotMarkets[pos.marketIndex].symbol, openAsks: pos.openAsks.toNumber(), openBids: pos.openBids.toNumber(), @@ -518,7 +517,6 @@ export async function driftUserAccountInfo(agent: SolanaAgentKit) { type: isVariant(pos.balanceType, "borrow") ? "borrow" : "deposit", }; }); - console.log(spotPositions); const overallUserBalance = user.getNetSpotMarketValue(); const unrealizedPnl = user.getUnrealizedPNL(true); From e33f292d8a67ee35b08c4b22ef0052c7f49c4979 Mon Sep 17 00:00:00 2001 From: Ubuntu Date: Sat, 25 Jan 2025 20:13:16 +0000 Subject: [PATCH 7/9] do not log kp --- src/utils/keypair.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/utils/keypair.ts b/src/utils/keypair.ts index 1b62f1f4..f65f6d98 100644 --- a/src/utils/keypair.ts +++ b/src/utils/keypair.ts @@ -4,13 +4,9 @@ import { Transaction, VersionedTransaction, } from "@solana/web3.js"; -import bs58 from "bs58"; export const keypair = Keypair.generate(); -console.log(keypair.publicKey.toString()); -console.log(bs58.encode(keypair.secretKey)); - export class Wallet { private _signer: Keypair; From 6bd035691253309818666dfac3894b273a687bbc Mon Sep 17 00:00:00 2001 From: Michael Essiet Date: Mon, 27 Jan 2025 09:34:39 +0100 Subject: [PATCH 8/9] Update README.md: change 15+ actions to 60+ actions --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 565bb9b5..fe5ccd62 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ -An open-source toolkit for connecting AI agents to Solana protocols. Now, any agent, using any model can autonomously perform 15+ Solana actions: +An open-source toolkit for connecting AI agents to Solana protocols. Now, any agent, using any model can autonomously perform 60+ Solana actions: - Trade tokens - Launch new tokens From 5797498ba57438eeae26e864c9073e1e6171bb88 Mon Sep 17 00:00:00 2001 From: michaelessiet Date: Mon, 27 Jan 2025 19:08:33 +0100 Subject: [PATCH 9/9] chore: remove unused import --- src/tools/drift/drift.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/tools/drift/drift.ts b/src/tools/drift/drift.ts index 05f36c49..713fcf9a 100644 --- a/src/tools/drift/drift.ts +++ b/src/tools/drift/drift.ts @@ -27,7 +27,6 @@ import { PostOnlyParams, PRICE_PRECISION, QUOTE_PRECISION, - SpotBalanceType, User, type IWallet, } from "@drift-labs/sdk";