UNPKG

@pod-protocol/cli

Version:

Command-line interface for PoD Protocol (Prompt or Die) AI Agent Communication Protocol

119 lines (118 loc) 3.63 kB
import { existsSync, readFileSync } from "fs"; import { homedir } from "os"; import { join } from "path"; import { Keypair } from "@solana/web3.js"; import chalk from "chalk"; /** * Load CLI configuration from file */ export function loadConfig() { const configPath = join(homedir(), ".config", "pod-com", "config.json"); if (!existsSync(configPath)) { return { network: "devnet", keypairPath: join(homedir(), ".config", "solana", "id.json"), }; } try { const configData = readFileSync(configPath, "utf8"); return JSON.parse(configData); } catch { console.warn(chalk.yellow("Warning: Could not read config file, using defaults")); return { network: "devnet", keypairPath: join(homedir(), ".config", "solana", "id.json"), }; } } /** * Load keypair from file path */ export function loadKeypair(keypairPath) { const config = loadConfig(); const path = keypairPath || config.keypairPath; // Expand ~ to home directory const expandedPath = path.startsWith("~") ? join(homedir(), path.slice(1)) : path; if (!existsSync(expandedPath)) { console.error(chalk.red("Error: Keypair file not found:"), expandedPath); console.log(chalk.yellow("Tip: Generate a new keypair with 'pod config generate-keypair'")); process.exit(1); } try { const keypairData = JSON.parse(readFileSync(expandedPath, "utf8")); return Keypair.fromSecretKey(new Uint8Array(keypairData)); } catch { console.error(chalk.red("Error: Invalid keypair file format:"), expandedPath); console.log(chalk.yellow("Tip: Ensure the file contains a valid Solana keypair")); process.exit(1); } } /** * Get network endpoint URL */ export function getNetworkEndpoint(network) { const config = loadConfig(); const selectedNetwork = network || config.network; // Use custom endpoint if configured if (config.customEndpoint) { return config.customEndpoint; } // Default endpoints for each network switch (selectedNetwork) { case "devnet": return "https://api.devnet.solana.com"; case "testnet": return "https://api.testnet.solana.com"; case "mainnet": return "https://api.mainnet-beta.solana.com"; default: console.error(chalk.red("Error: Invalid network:"), selectedNetwork); console.log(chalk.yellow("Valid networks: devnet, testnet, mainnet")); process.exit(1); } } /** * Get program ID from config or default */ export function getProgramId() { const config = loadConfig(); return config.programId || "HEpGLgYsE1kP8aoYKyLFc3JVVrofS7T4zEA6fWBJsZps"; } /** * Validate network name */ export function isValidNetwork(network) { return ["devnet", "testnet", "mainnet"].includes(network); } /** * Format SOL amount for display */ export function formatSol(lamports) { return (lamports / 1000000000).toFixed(9) + " SOL"; } /** * Format transaction signature for display */ export function formatSignature(signature) { return signature.length > 20 ? signature.slice(0, 8) + "..." + signature.slice(-8) : signature; } /** * Validate Solana public key format */ export function isValidPublicKey(key) { try { // Base58 check - Solana public keys are 44 characters in base58 return (key.length >= 32 && key.length <= 44 && /^[1-9A-HJ-NP-Za-km-z]+$/.test(key)); } catch { return false; } }