UNPKG

@symmetry-hq/agents-sdk

Version:

Symmetry Agents SDK

180 lines (179 loc) 8.13 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.getAgentsProgram = getAgentsProgram; exports.getAgentStateAccount = getAgentStateAccount; exports.getAgent = getAgent; exports.getEventAuthority = getEventAuthority; exports.getFeesVault = getFeesVault; exports.getMetadataAccount = getMetadataAccount; exports.getAta = getAta; exports.getRandomSeed = getRandomSeed; exports.getStringFromSeed = getStringFromSeed; exports.getAccountInfos = getAccountInfos; exports.getAllAgents = getAllAgents; exports.getAgentsByCreator = getAgentsByCreator; exports.getEventsFromTx = getEventsFromTx; exports.getTopUpBalanceEventFromTx = getTopUpBalanceEventFromTx; exports.getCreateAgentEventFromTx = getCreateAgentEventFromTx; // Core dependencies const anchor_1 = require("@coral-xyz/anchor"); const nodewallet_1 = __importDefault(require("@coral-xyz/anchor/dist/cjs/nodewallet")); const spl_token_1 = require("@solana/spl-token"); const web3_js_1 = require("@solana/web3.js"); const js_1 = require("@metaplex-foundation/js"); // Local imports const idl_1 = require("../idl/idl"); const uuid_1 = require("uuid"); const constants_1 = require("../constants"); const agent_1 = require("../state/agent"); const bytes_1 = require("@coral-xyz/anchor/dist/cjs/utils/bytes"); function getAgentsProgram(connection) { const program = new anchor_1.Program(idl_1.IDL, new anchor_1.AnchorProvider(connection, new nodewallet_1.default(web3_js_1.Keypair.generate()))); return program; } function getAgentStateAccount(agent) { return web3_js_1.PublicKey.findProgramAddressSync([Uint8Array.from(agent.toBuffer())], constants_1.AGENTS_PROGRAM_ID)[0]; } function getAgent(agentUuid) { return web3_js_1.PublicKey.findProgramAddressSync([Uint8Array.from(agentUuid)], constants_1.AGENTS_PROGRAM_ID)[0]; } function getEventAuthority(program) { const [eventAuthority] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.EVENT_AUTHORITY_SEED)], program.programId); return eventAuthority; } function getFeesVault(program) { const [feeVault] = web3_js_1.PublicKey.findProgramAddressSync([Buffer.from(constants_1.FEES_VAULT_SEED)], program.programId); return feeVault; } function getMetadataAccount(tokenMint) { const metaplex = js_1.Metaplex.make(new web3_js_1.Connection("https://api.devnet.solana.com")); return metaplex.nfts().pdas().metadata({ mint: tokenMint }); } function getAta(wallet, tokenMint) { return (0, spl_token_1.getAssociatedTokenAddressSync)(tokenMint, wallet, true); } function getRandomSeed() { return Array.from((0, uuid_1.parse)((0, uuid_1.v4)())); } function getStringFromSeed(seed) { return (0, uuid_1.stringify)(Uint8Array.from(seed)); } function getAccountInfos(connection, keys) { return __awaiter(this, void 0, void 0, function* () { const allAccounts = []; const batchSize = 100; for (let i = 0; i < keys.length; i += batchSize) { const batch = keys.slice(i, i + batchSize); const batchAccounts = yield connection.getMultipleAccountsInfo(batch); allAccounts.push(...batchAccounts); } return allAccounts; }); } function getAllAgents(program) { return __awaiter(this, void 0, void 0, function* () { const accounts = (yield program.account.agent.all()).map(account => account.account); return accounts.map(account => (0, agent_1.parseAgentState)(account)); }); } function getAgentsByCreator(program, creator) { return __awaiter(this, void 0, void 0, function* () { const accountFilters = [ { dataSize: agent_1.AGENTS_STATE_SIZE + 8, }, { memcmp: { offset: 8 + 32 + 16, bytes: creator.toBase58(), }, } ]; const accounts = yield program.provider.connection .getProgramAccounts(constants_1.AGENTS_PROGRAM_ID, { commitment: "confirmed", filters: accountFilters, encoding: 'base64' }); const agents = accounts.map(account => program.coder.accounts.decode("agent", account.account.data)); return yield Promise.all(agents.map(agent => (0, agent_1.parseAgentState)(agent))); }); } function getEventsFromTx(connection, program, txId) { return __awaiter(this, void 0, void 0, function* () { const parsed = yield connection.getParsedTransaction(txId, { maxSupportedTransactionVersion: 0, commitment: "confirmed" }).catch((_) => null); if (!parsed || !parsed.meta || parsed.meta.err || !parsed.meta.innerInstructions) throw new Error("Transaction is invalid"); const eventAuthority = getEventAuthority(program); let rawEvents = []; for (let i = 0; i < parsed.meta.innerInstructions.length; i++) { for (let j = 0; j < parsed.meta.innerInstructions[i].instructions.length; j++) { let ix = parsed.meta.innerInstructions[i].instructions[j]; if (!ix.programId.equals(program.programId)) continue; //@ts-ignore let accounts = ix.accounts; //@ts-ignore let data = ix.data; if (!accounts || !data || accounts.length != 1) continue; if (!accounts[0].equals(eventAuthority)) continue; let buffer = bytes_1.bs58.decode(data); let str64 = buffer.subarray(8, buffer.length).toString("base64"); const rawEvent = program.coder.events.decode(str64); if (!rawEvent) continue; rawEvents.push(rawEvent); } } return rawEvents; }); } function getTopUpBalanceEventFromTx(connection, program, txId) { return __awaiter(this, void 0, void 0, function* () { const rawEvents = yield getEventsFromTx(connection, program, txId); for (let i = 0; i < rawEvents.length; i++) { let rawEvent = rawEvents[i]; if (rawEvent.name !== "topUpBalanceEvent") continue; let parsedEvent = { user: rawEvent.data.user.toBase58(), amount: parseInt(rawEvent.data.amount.toString()), mint: rawEvent.data.mint.toBase58(), }; return parsedEvent; } throw new Error("Top up balance event not found"); }); } function getCreateAgentEventFromTx(connection, program, txId) { return __awaiter(this, void 0, void 0, function* () { const rawEvents = yield getEventsFromTx(connection, program, txId); for (let i = 0; i < rawEvents.length; i++) { let rawEvent = rawEvents[i]; if (rawEvent.name !== "createAgentEvent") continue; let parsedEvent = { agent: rawEvent.data.agent.toBase58(), agentState: rawEvent.data.stateAddress.toBase58(), agentUuid: getStringFromSeed(rawEvent.data.agentUuid), creator: rawEvent.data.creator.toBase58(), }; return parsedEvent; } throw new Error("Create agent event not found"); }); }