@symmetry-hq/agents-sdk
Version:
Symmetry Agents SDK
180 lines (179 loc) • 8.13 kB
JavaScript
;
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");
});
}