@vtx-labs/solana-explain 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +328 -0
- package/dist/cli/index.d.ts +14 -0
- package/dist/cli/index.js +3317 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/index.d.ts +116 -0
- package/dist/index.js +3130 -0
- package/dist/index.js.map +1 -0
- package/dist/programs.d.ts +42 -0
- package/dist/programs.js +919 -0
- package/dist/programs.js.map +1 -0
- package/dist/render.d.ts +59 -0
- package/dist/render.js +300 -0
- package/dist/render.js.map +1 -0
- package/dist/types-MSKEy1VA.d.ts +482 -0
- package/package.json +83 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/decode/known-programs.ts","../src/errors.ts","../src/input/encoding.ts","../src/decode/reader.ts","../src/decode/programs/system.ts","../src/decode/programs/spl-token.ts","../src/decode/programs/token-2022.ts","../src/decode/programs/ata.ts","../src/decode/programs/memo.ts","../src/decode/programs/compute-budget.ts","../src/decode/programs/recognize.ts","../src/decode/registry.ts"],"names":["acc"],"mappings":"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","file":"programs.js","sourcesContent":["/**\n * Program ID → friendly name/kind map.\n *\n * Used both by the bundled decoders (for their own IDs) and by best-effort\n * recognition (name-only) for programs we don't byte-decode.\n */\n\nimport type { KnownProgramInfo } from '../types.js';\n\nexport const SYSTEM_PROGRAM_ID = '11111111111111111111111111111111';\nexport const TOKEN_PROGRAM_ID = 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA';\nexport const TOKEN_2022_PROGRAM_ID = 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb';\nexport const ASSOCIATED_TOKEN_PROGRAM_ID = 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL';\nexport const MEMO_PROGRAM_ID = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr';\nexport const MEMO_V1_PROGRAM_ID = 'Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo';\nexport const COMPUTE_BUDGET_PROGRAM_ID = 'ComputeBudget111111111111111111111111111111';\n\nexport const KNOWN_PROGRAMS: Readonly<Record<string, KnownProgramInfo>> = Object.freeze({\n // Core / decoded\n [SYSTEM_PROGRAM_ID]: { name: 'System', kind: 'system' },\n [TOKEN_PROGRAM_ID]: { name: 'SPL Token', kind: 'token' },\n [TOKEN_2022_PROGRAM_ID]: { name: 'Token-2022', kind: 'token-2022' },\n [ASSOCIATED_TOKEN_PROGRAM_ID]: { name: 'Associated Token Account', kind: 'ata' },\n [MEMO_PROGRAM_ID]: { name: 'Memo', kind: 'memo' },\n [MEMO_V1_PROGRAM_ID]: { name: 'Memo (v1)', kind: 'memo' },\n [COMPUTE_BUDGET_PROGRAM_ID]: { name: 'Compute Budget', kind: 'compute-budget' },\n\n // Native\n Stake11111111111111111111111111111111111111: { name: 'Stake', kind: 'stake' },\n Vote111111111111111111111111111111111111111: { name: 'Vote', kind: 'vote' },\n BPFLoaderUpgradeab1e11111111111111111111111: { name: 'BPF Upgradeable Loader', kind: 'loader' },\n BPFLoader2111111111111111111111111111111111: { name: 'BPF Loader 2', kind: 'loader' },\n AddressLookupTab1e1111111111111111111111111: {\n name: 'Address Lookup Table',\n kind: 'other',\n },\n\n // Metaplex\n metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s: {\n name: 'Metaplex Token Metadata',\n kind: 'nft',\n },\n BGUMAp9Gq7iTEuizy4pqaxsTyUCBK68MDfK752saRPUY: {\n name: 'Metaplex Bubblegum',\n kind: 'nft',\n },\n cndy3Z4yxLzowg4ZTHTHJYjBmtkk3vd6yMJ4r8x7q3o: {\n name: 'Metaplex Candy Machine',\n kind: 'nft',\n },\n\n // Aggregators / DEX\n JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4: { name: 'Jupiter v6', kind: 'aggregator' },\n JUP4Fb2cqiRUcaTHdrPC8h2gNsA2ETXiPDD33WconZX: { name: 'Jupiter v4', kind: 'aggregator' },\n '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8': { name: 'Raydium AMM v4', kind: 'amm' },\n CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK: { name: 'Raydium CLMM', kind: 'amm' },\n whirLbMiicVdio4qvUfM5KAg6Ct8VwpYzGff3uctyCc: { name: 'Orca Whirlpool', kind: 'amm' },\n '9W959DqEETiGZocYWCQPaJ6sBmUzgfxXfqGeTEdp3aQP': { name: 'Orca v2', kind: 'amm' },\n PhoeNiXZ8ByJGLkxNfZRnkUfjvmuYqLR89jjFHGqdXY: { name: 'Phoenix', kind: 'amm' },\n LBUZKhRxPF3XUpBCjp4YzTKgLccjZhTSDM9YuVaPwxo: { name: 'Meteora DLMM', kind: 'amm' },\n});\n\n/** Look up a known program's info, or `undefined`. */\nexport function knownProgram(programId: string): KnownProgramInfo | undefined {\n return KNOWN_PROGRAMS[programId];\n}\n","/**\n * Error hierarchy for solana-explain.\n *\n * Every public async function rejects ONLY with a {@link SolanaExplainError}\n * subclass. Raw/underlying errors are always wrapped and preserved on `.cause`.\n */\n\nexport type ErrorCode =\n | 'INVALID_INPUT'\n | 'INVALID_SIGNATURE'\n | 'INVALID_ENCODING'\n | 'EMPTY_INPUT'\n | 'TX_NOT_FOUND'\n | 'RPC_HTTP'\n | 'RPC_JSON'\n | 'RPC_TIMEOUT'\n | 'ABORTED'\n | 'DECODE_FAILED'\n | 'SIMULATION_REJECTED'\n | 'UNSUPPORTED_TX_VERSION';\n\nexport interface SolanaExplainErrorOptions {\n cause?: unknown;\n /** Optional human hint surfaced by the CLI alongside the message. */\n hint?: string;\n}\n\n/** Base class. Never thrown directly by public functions — only its subclasses. */\nexport class SolanaExplainError extends Error {\n readonly code: ErrorCode;\n override readonly cause?: unknown;\n /** Optional, CLI-friendly remediation hint. */\n readonly hint?: string;\n\n constructor(code: ErrorCode, message: string, options: SolanaExplainErrorOptions = {}) {\n super(message);\n this.name = new.target.name;\n this.code = code;\n if (options.cause !== undefined) this.cause = options.cause;\n if (options.hint !== undefined) this.hint = options.hint;\n // Maintain prototype chain across transpile targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/** Transport / JSON-RPC error (HTTP failure, malformed JSON, JSON-RPC error object, timeout). */\nexport class RpcError extends SolanaExplainError {}\n\n/** Malformed transaction bytes / wire message. */\nexport class DecodeError extends SolanaExplainError {}\n\n/**\n * Simulation produced a runtime error (the tx would fail). Still carries a\n * partial {@link import('./types').ExplainResult} on `.result` when available,\n * because the user usually wants to know *why* it failed.\n *\n * Note: a node *rejecting* the simulation outright (bad blockhash, etc.) is a\n * different condition and is also surfaced as a `SimulationError`, with code\n * `SIMULATION_REJECTED`.\n */\nexport class SimulationError extends SolanaExplainError {\n /** Partial result when the simulation ran but reverted. */\n readonly result?: unknown;\n /** Tail of the node's program logs, for diagnostics. */\n readonly logs?: readonly string[];\n\n constructor(\n code: ErrorCode,\n message: string,\n options: SolanaExplainErrorOptions & { result?: unknown; logs?: readonly string[] } = {},\n ) {\n super(code, message, options);\n if (options.result !== undefined) this.result = options.result;\n if (options.logs !== undefined) this.logs = options.logs;\n }\n}\n\n/** Bad signature / encoding / empty input. */\nexport class InputError extends SolanaExplainError {}\n\n/**\n * Wrap an unknown thrown value into a `SolanaExplainError` subclass, preserving\n * the original on `.cause`. Pass-through if it is already one of ours.\n */\nexport function wrapError(\n err: unknown,\n fallbackCode: ErrorCode,\n fallbackMessage: string,\n): SolanaExplainError {\n if (err instanceof SolanaExplainError) return err;\n if (isAbortError(err)) {\n return new RpcError('ABORTED', 'The operation was aborted.', { cause: err });\n }\n const detail = err instanceof Error ? err.message : String(err);\n return new SolanaExplainError(fallbackCode, `${fallbackMessage}: ${detail}`, { cause: err });\n}\n\n/** Detect a DOMException/AbortError-style cancellation from any runtime. */\nexport function isAbortError(err: unknown): boolean {\n return (\n typeof err === 'object' &&\n err !== null &&\n 'name' in err &&\n (err as { name?: unknown }).name === 'AbortError'\n );\n}\n","/**\n * Base58/base64 decode helpers + RPC URL scheme normalization.\n *\n * bs58 is our single hard runtime dependency — the de-facto Solana standard.\n */\n\nimport bs58 from 'bs58';\nimport { InputError } from '../errors.js';\n\n/** Decode base58 into bytes. Throws {@link InputError} on invalid alphabet. */\nexport function decodeBase58(input: string): Uint8Array {\n try {\n return bs58.decode(input);\n } catch (err) {\n throw new InputError('INVALID_ENCODING', 'Input is not valid base58.', { cause: err });\n }\n}\n\n/** Encode bytes to base58. */\nexport function encodeBase58(bytes: Uint8Array): string {\n return bs58.encode(bytes);\n}\n\n/** Try base58; return `null` instead of throwing. */\nexport function tryDecodeBase58(input: string): Uint8Array | null {\n try {\n const out = bs58.decode(input);\n return out.length > 0 ? out : null;\n } catch {\n return null;\n }\n}\n\nconst BASE64_RE = /^[A-Za-z0-9+/]+={0,2}$/;\n\n/** Decode base64 into bytes. Throws {@link InputError} on invalid input. */\nexport function decodeBase64(input: string): Uint8Array {\n const trimmed = input.trim();\n if (!BASE64_RE.test(trimmed) || trimmed.length % 4 !== 0) {\n throw new InputError('INVALID_ENCODING', 'Input is not valid base64.');\n }\n try {\n return new Uint8Array(Buffer.from(trimmed, 'base64'));\n } catch (err) {\n throw new InputError('INVALID_ENCODING', 'Input is not valid base64.', { cause: err });\n }\n}\n\n/** Try base64; return `null` instead of throwing. Validates round-trip to reject loose matches. */\nexport function tryDecodeBase64(input: string): Uint8Array | null {\n const trimmed = input.trim();\n if (trimmed.length === 0 || trimmed.length % 4 !== 0 || !BASE64_RE.test(trimmed)) return null;\n try {\n const buf = Buffer.from(trimmed, 'base64');\n if (buf.length === 0) return null;\n // Re-encode and compare to reject inputs Buffer silently truncates.\n if (buf.toString('base64') !== trimmed) return null;\n return new Uint8Array(buf);\n } catch {\n return null;\n }\n}\n\n/** Encode bytes as base64. */\nexport function encodeBase64(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString('base64');\n}\n\n/** Looks like base64 (contains `+`, `/`, or `=`, or only base64 alphabet)? */\nexport function looksLikeBase64(input: string): boolean {\n const trimmed = input.trim();\n if (trimmed.length === 0) return false;\n if (/[+/=]/.test(trimmed)) return true;\n return BASE64_RE.test(trimmed);\n}\n\n/** Looks like base58 (only base58 alphabet, no `0OIl`)? */\nexport function looksLikeBase58(input: string): boolean {\n const trimmed = input.trim();\n if (trimmed.length === 0) return false;\n return /^[1-9A-HJ-NP-Za-km-z]+$/.test(trimmed);\n}\n\n/**\n * Normalize an RPC URL: trim whitespace, prepend `https://` if scheme-less.\n * Throws {@link InputError} if clearly invalid.\n */\nexport function normalizeRpcUrl(url: string): string {\n let u = url.trim();\n if (u.length === 0) {\n throw new InputError('INVALID_INPUT', 'RPC URL is empty.');\n }\n if (!/^[a-zA-Z][a-zA-Z0-9+.-]*:\\/\\//.test(u)) {\n // Scheme-less — assume https.\n u = `https://${u}`;\n }\n try {\n const parsed = new URL(u);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new InputError(\n 'INVALID_INPUT',\n `Unsupported RPC URL scheme \"${parsed.protocol}\". Use http(s).`,\n );\n }\n return parsed.toString();\n } catch (err) {\n if (err instanceof InputError) throw err;\n throw new InputError('INVALID_INPUT', `Invalid RPC URL: ${url}`, { cause: err });\n }\n}\n","/**\n * Tiny little-endian byte reader over a DataView. No allocations beyond slices.\n * Throws {@link DecodeError} naming the field on underrun.\n */\n\nimport { DecodeError } from '../errors.js';\nimport { encodeBase58 } from '../input/encoding.js';\n\nexport class Reader {\n private readonly view: DataView;\n private readonly bytes: Uint8Array;\n offset = 0;\n\n constructor(bytes: Uint8Array) {\n this.bytes = bytes;\n this.view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n }\n\n get remaining(): number {\n return this.bytes.length - this.offset;\n }\n\n private ensure(n: number, field: string): void {\n if (this.offset + n > this.bytes.length) {\n throw new DecodeError(\n 'DECODE_FAILED',\n `unexpected end while reading ${field} (need ${n} bytes at offset ${this.offset}, have ${this.remaining})`,\n );\n }\n }\n\n u8(field = 'u8'): number {\n this.ensure(1, field);\n const v = this.view.getUint8(this.offset);\n this.offset += 1;\n return v;\n }\n\n u16(field = 'u16'): number {\n this.ensure(2, field);\n const v = this.view.getUint16(this.offset, true);\n this.offset += 2;\n return v;\n }\n\n u32(field = 'u32'): number {\n this.ensure(4, field);\n const v = this.view.getUint32(this.offset, true);\n this.offset += 4;\n return v;\n }\n\n u64(field = 'u64'): bigint {\n this.ensure(8, field);\n const v = this.view.getBigUint64(this.offset, true);\n this.offset += 8;\n return v;\n }\n\n i64(field = 'i64'): bigint {\n this.ensure(8, field);\n const v = this.view.getBigInt64(this.offset, true);\n this.offset += 8;\n return v;\n }\n\n bytes_(n: number, field = 'bytes'): Uint8Array {\n this.ensure(n, field);\n const out = this.bytes.subarray(this.offset, this.offset + n);\n this.offset += n;\n return out;\n }\n\n /** Read a 32-byte pubkey and return base58. */\n pubkey(field = 'pubkey'): string {\n return encodeBase58(this.bytes_(32, field));\n }\n\n /**\n * Solana compact-u16 (a.k.a. ShortVec) length prefix. 1–3 bytes, 7 bits each.\n */\n compactU16(field = 'compact-u16'): number {\n let value = 0;\n let shift = 0;\n for (let i = 0; i < 3; i++) {\n const byte = this.u8(`${field} length byte`);\n value |= (byte & 0x7f) << shift;\n if ((byte & 0x80) === 0) return value >>> 0;\n shift += 7;\n }\n return value >>> 0;\n }\n\n /** Remaining bytes (no copy). */\n rest(): Uint8Array {\n const out = this.bytes.subarray(this.offset);\n this.offset = this.bytes.length;\n return out;\n }\n}\n","/**\n * System program decoder (u32 LE discriminator).\n *\n * Covers: createAccount(0), assign(1), transfer(2), createAccountWithSeed(3),\n * advanceNonce(4), withdrawNonce(5), initializeNonce(6), authorizeNonce(7),\n * allocate(8), allocateWithSeed(9), assignWithSeed(10), transferWithSeed(11).\n */\n\nimport type { CompiledInstructionView, DecodeOutput, ProgramDecoder } from '../../types.js';\nimport { Reader } from '../reader.js';\nimport { SYSTEM_PROGRAM_ID } from '../known-programs.js';\n\nfunction acc(ix: CompiledInstructionView, i: number): string | undefined {\n return ix.accounts[i]?.pubkey;\n}\n\nfunction decodeSystem(ix: CompiledInstructionView): DecodeOutput {\n if (ix.data.length < 4) {\n return { decoded: false, program: 'System', warning: 'instruction data too short' };\n }\n const r = new Reader(ix.data);\n const disc = r.u32('discriminator');\n\n try {\n switch (disc) {\n case 0: {\n // CreateAccount: lamports u64, space u64, owner pubkey\n const lamports = r.u64('lamports');\n const space = r.u64('space');\n const owner = r.pubkey('owner');\n const newAccount = acc(ix, 1) ?? '';\n return {\n program: 'System',\n type: 'createAccount',\n decoded: true,\n args: { lamports: lamports.toString(), space: space.toString(), owner },\n accountNames: ['funding', 'new'],\n effects: [\n {\n kind: 'account-created',\n address: newAccount,\n owner,\n lamports,\n space: Number(space),\n as: 'system',\n },\n ],\n };\n }\n case 1: {\n const owner = r.pubkey('owner');\n return {\n program: 'System',\n type: 'assign',\n decoded: true,\n args: { owner },\n accountNames: ['account'],\n };\n }\n case 2: {\n const lamports = r.u64('lamports');\n const from = acc(ix, 0) ?? '';\n const to = acc(ix, 1) ?? '';\n return {\n program: 'System',\n type: 'transfer',\n decoded: true,\n args: { lamports: lamports.toString() },\n accountNames: ['from', 'to'],\n effects: [{ kind: 'sol-transfer', from, to, lamports }],\n };\n }\n case 3: {\n // CreateAccountWithSeed: base pubkey, seed string, lamports, space, owner\n const base = r.pubkey('base');\n const seedLen = Number(r.u64('seed length'));\n const seed = new TextDecoder().decode(r.bytes_(seedLen, 'seed'));\n const lamports = r.u64('lamports');\n const space = r.u64('space');\n const owner = r.pubkey('owner');\n const newAccount = acc(ix, 1) ?? '';\n return {\n program: 'System',\n type: 'createAccountWithSeed',\n decoded: true,\n args: { base, seed, lamports: lamports.toString(), space: space.toString(), owner },\n accountNames: ['funding', 'new', 'base'],\n effects: [\n {\n kind: 'account-created',\n address: newAccount,\n owner,\n lamports,\n space: Number(space),\n as: 'system',\n },\n ],\n };\n }\n case 8: {\n const space = r.u64('space');\n return {\n program: 'System',\n type: 'allocate',\n decoded: true,\n args: { space: space.toString() },\n accountNames: ['account'],\n };\n }\n case 9: {\n const base = r.pubkey('base');\n const seedLen = Number(r.u64('seed length'));\n const seed = new TextDecoder().decode(r.bytes_(seedLen, 'seed'));\n const space = r.u64('space');\n const owner = r.pubkey('owner');\n return {\n program: 'System',\n type: 'allocateWithSeed',\n decoded: true,\n args: { base, seed, space: space.toString(), owner },\n accountNames: ['account', 'base'],\n };\n }\n case 10: {\n const base = r.pubkey('base');\n const seedLen = Number(r.u64('seed length'));\n const seed = new TextDecoder().decode(r.bytes_(seedLen, 'seed'));\n const owner = r.pubkey('owner');\n return {\n program: 'System',\n type: 'assignWithSeed',\n decoded: true,\n args: { base, seed, owner },\n accountNames: ['account', 'base'],\n };\n }\n case 11: {\n // TransferWithSeed: lamports, fromSeed string, fromOwner pubkey\n const lamports = r.u64('lamports');\n const seedLen = Number(r.u64('seed length'));\n const fromSeed = new TextDecoder().decode(r.bytes_(seedLen, 'fromSeed'));\n const fromOwner = r.pubkey('fromOwner');\n const from = acc(ix, 0) ?? '';\n const to = acc(ix, 2) ?? '';\n return {\n program: 'System',\n type: 'transferWithSeed',\n decoded: true,\n args: { lamports: lamports.toString(), fromSeed, fromOwner },\n accountNames: ['from', 'base', 'to'],\n effects: [{ kind: 'sol-transfer', from, to, lamports }],\n };\n }\n default: {\n const names: Record<number, string> = {\n 4: 'advanceNonceAccount',\n 5: 'withdrawNonceAccount',\n 6: 'initializeNonceAccount',\n 7: 'authorizeNonceAccount',\n };\n return {\n program: 'System',\n type: names[disc] ?? `unknown(${disc})`,\n decoded: disc in names,\n };\n }\n }\n } catch (err) {\n return {\n program: 'System',\n decoded: false,\n warning: err instanceof Error ? err.message : 'system decode failed',\n warningCode: 'partial-decode',\n };\n }\n}\n\nexport const systemDecoder: ProgramDecoder = {\n programId: SYSTEM_PROGRAM_ID,\n name: 'System',\n kind: 'system',\n decode: decodeSystem,\n};\n","/**\n * SPL Token decoder (single-byte discriminator). Shared by SPL Token and\n * Token-2022, which use the same base instruction layouts.\n *\n * Instruction tags (subset we decode):\n * 0 InitializeMint 1 InitializeAccount 3 Transfer\n * 4 Approve 5 Revoke 6 SetAuthority\n * 7 MintTo 8 Burn 9 CloseAccount\n * 10 FreezeAccount 11 ThawAccount 12 TransferChecked\n * 13 ApproveChecked 14 MintToChecked 15 BurnChecked\n * 16 InitializeAccount2 17 SyncNative 18 InitializeAccount3\n * 20 InitializeMint2\n */\n\nimport type { CompiledInstructionView, DecodeOutput } from '../../types.js';\nimport { Reader } from '../reader.js';\n\nconst MAX_U64 = (1n << 64n) - 1n;\n\nfunction acc(ix: CompiledInstructionView, i: number): string | undefined {\n return ix.accounts[i]?.pubkey;\n}\n\nexport type TokenProgramVariant = 'spl-token' | 'token-2022';\n\n/**\n * Decode an SPL-Token-layout instruction. `variant` differentiates the\n * effect's `tokenProgram` and lets Token-2022 flag unparsed extension ixs.\n */\nexport function decodeTokenInstruction(\n ix: CompiledInstructionView,\n programName: string,\n variant: TokenProgramVariant,\n): DecodeOutput {\n if (ix.data.length < 1) {\n return { decoded: false, program: programName, warning: 'empty instruction data' };\n }\n const r = new Reader(ix.data);\n const tag = r.u8('tag');\n\n try {\n switch (tag) {\n case 0: {\n const decimals = r.u8('decimals');\n return {\n program: programName,\n type: 'initializeMint',\n decoded: true,\n args: { decimals },\n accountNames: ['mint', 'rent'],\n };\n }\n case 20: {\n const decimals = r.u8('decimals');\n return {\n program: programName,\n type: 'initializeMint2',\n decoded: true,\n args: { decimals },\n accountNames: ['mint'],\n };\n }\n case 1:\n case 16:\n case 18: {\n const account = acc(ix, 0) ?? '';\n const mint = acc(ix, 1) ?? '';\n const owner = acc(ix, 2);\n const type =\n tag === 1 ? 'initializeAccount' : tag === 16 ? 'initializeAccount2' : 'initializeAccount3';\n return {\n program: programName,\n type,\n decoded: true,\n accountNames: ['account', 'mint', 'owner'],\n effects: [\n {\n kind: 'account-created',\n address: account,\n owner: owner ?? mint,\n as: 'token-account',\n },\n ],\n };\n }\n case 3: {\n const amount = r.u64('amount');\n const from = acc(ix, 0) ?? '';\n const to = acc(ix, 1) ?? '';\n return {\n program: programName,\n type: 'transfer',\n decoded: true,\n args: { amount: amount.toString() },\n accountNames: ['source', 'destination', 'authority'],\n // No decimals/mint in unchecked transfer — correlate fills from diff.\n effects: [{ kind: 'token-transfer', from, to, amount, tokenProgram: variant }],\n warning: 'unchecked transfer carries no mint/decimals',\n warningCode: 'ambiguous-amount',\n };\n }\n case 12: {\n const amount = r.u64('amount');\n const decimals = r.u8('decimals');\n const source = acc(ix, 0) ?? '';\n const mint = acc(ix, 1) ?? '';\n const dest = acc(ix, 2) ?? '';\n return {\n program: programName,\n type: 'transferChecked',\n decoded: true,\n args: { amount: amount.toString(), decimals },\n accountNames: ['source', 'mint', 'destination', 'authority'],\n effects: [\n { kind: 'token-transfer', from: source, to: dest, mint, amount, decimals, tokenProgram: variant },\n ],\n };\n }\n case 4: {\n const amount = r.u64('amount');\n const delegate = acc(ix, 1) ?? '';\n const owner = acc(ix, 2) ?? '';\n return {\n program: programName,\n type: 'approve',\n decoded: true,\n args: { amount: amount.toString() },\n accountNames: ['source', 'delegate', 'owner'],\n effects: [\n {\n kind: 'approval',\n owner,\n delegate,\n mint: '',\n amount: amount === MAX_U64 ? 'unlimited' : amount,\n },\n ],\n };\n }\n case 13: {\n const amount = r.u64('amount');\n const decimals = r.u8('decimals');\n const mint = acc(ix, 1) ?? '';\n const delegate = acc(ix, 2) ?? '';\n const owner = acc(ix, 3) ?? '';\n return {\n program: programName,\n type: 'approveChecked',\n decoded: true,\n args: { amount: amount.toString(), decimals },\n accountNames: ['source', 'mint', 'delegate', 'owner'],\n effects: [\n {\n kind: 'approval',\n owner,\n delegate,\n mint,\n amount: amount === MAX_U64 ? 'unlimited' : amount,\n },\n ],\n };\n }\n case 5: {\n const owner = acc(ix, 1) ?? '';\n return {\n program: programName,\n type: 'revoke',\n decoded: true,\n accountNames: ['source', 'owner'],\n effects: [{ kind: 'approval', owner, delegate: '', mint: '', amount: 0n, revoke: true }],\n };\n }\n case 6: {\n return {\n program: programName,\n type: 'setAuthority',\n decoded: true,\n accountNames: ['account', 'currentAuthority'],\n };\n }\n case 7: {\n const amount = r.u64('amount');\n const mint = acc(ix, 0) ?? '';\n const to = acc(ix, 1) ?? '';\n return {\n program: programName,\n type: 'mintTo',\n decoded: true,\n args: { amount: amount.toString() },\n accountNames: ['mint', 'destination', 'authority'],\n effects: [{ kind: 'mint', mint, to, amount }],\n };\n }\n case 14: {\n const amount = r.u64('amount');\n const decimals = r.u8('decimals');\n const mint = acc(ix, 0) ?? '';\n const to = acc(ix, 1) ?? '';\n return {\n program: programName,\n type: 'mintToChecked',\n decoded: true,\n args: { amount: amount.toString(), decimals },\n accountNames: ['mint', 'destination', 'authority'],\n effects: [{ kind: 'mint', mint, to, amount, decimals }],\n };\n }\n case 8: {\n const amount = r.u64('amount');\n const from = acc(ix, 0) ?? '';\n const mint = acc(ix, 1) ?? '';\n return {\n program: programName,\n type: 'burn',\n decoded: true,\n args: { amount: amount.toString() },\n accountNames: ['account', 'mint', 'authority'],\n effects: [{ kind: 'burn', mint, from, amount }],\n };\n }\n case 15: {\n const amount = r.u64('amount');\n const decimals = r.u8('decimals');\n const from = acc(ix, 0) ?? '';\n const mint = acc(ix, 1) ?? '';\n return {\n program: programName,\n type: 'burnChecked',\n decoded: true,\n args: { amount: amount.toString(), decimals },\n accountNames: ['account', 'mint', 'authority'],\n effects: [{ kind: 'burn', mint, from, amount, decimals }],\n };\n }\n case 9: {\n const account = acc(ix, 0) ?? '';\n const destination = acc(ix, 1) ?? '';\n return {\n program: programName,\n type: 'closeAccount',\n decoded: true,\n accountNames: ['account', 'destination', 'owner'],\n effects: [{ kind: 'close-account', account, destination }],\n };\n }\n case 10:\n return {\n program: programName,\n type: 'freezeAccount',\n decoded: true,\n accountNames: ['account', 'mint', 'authority'],\n };\n case 11:\n return {\n program: programName,\n type: 'thawAccount',\n decoded: true,\n accountNames: ['account', 'mint', 'authority'],\n };\n case 17: {\n const account = acc(ix, 0) ?? '';\n return {\n program: programName,\n type: 'syncNative',\n decoded: true,\n accountNames: ['account'],\n effects: [{ kind: 'sync-native', account }],\n };\n }\n default:\n return {\n program: programName,\n type: `unknown(${tag})`,\n decoded: false,\n warning: `unrecognized ${programName} instruction tag ${tag}`,\n warningCode: 'partial-decode',\n };\n }\n } catch (err) {\n return {\n program: programName,\n decoded: false,\n warning: err instanceof Error ? err.message : 'token decode failed',\n warningCode: 'partial-decode',\n };\n }\n}\n","/**\n * Token-2022 decoder. Shares the SPL Token base layouts but recognizes the\n * extension-instruction range and flags those it does not byte-decode, rather\n * than failing — the balance diff still reveals the fee impact.\n */\n\nimport type { CompiledInstructionView, DecodeOutput, ProgramDecoder } from '../../types.js';\nimport { TOKEN_2022_PROGRAM_ID, TOKEN_PROGRAM_ID } from '../known-programs.js';\nimport { decodeTokenInstruction } from './spl-token.js';\n\n/**\n * Token-2022 instruction tags >= 21 are extension namespaces (TransferFee,\n * ConfidentialTransfer, DefaultAccountState, MemoTransfer, InterestBearing,\n * CpiGuard, TransferHook, MetadataPointer, GroupPointer, etc.). The base\n * layouts (0..20) are identical to SPL Token.\n */\nconst EXTENSION_TAGS: Record<number, string> = {\n 21: 'getAccountDataSize',\n 22: 'initializeMintCloseAuthority',\n 23: 'transferFeeExtension',\n 24: 'confidentialTransferExtension',\n 25: 'defaultAccountStateExtension',\n 26: 'reallocate',\n 27: 'memoTransferExtension',\n 28: 'createNativeMint',\n 29: 'initializeNonTransferableMint',\n 30: 'interestBearingMintExtension',\n 31: 'cpiGuardExtension',\n 32: 'initializePermanentDelegate',\n 33: 'transferHookExtension',\n 34: 'confidentialTransferFeeExtension',\n 35: 'withdrawExcessLamports',\n 36: 'metadataPointerExtension',\n 37: 'groupPointerExtension',\n 38: 'groupMemberPointerExtension',\n};\n\nfunction decodeToken2022(ix: CompiledInstructionView): DecodeOutput {\n if (ix.data.length < 1) {\n return { decoded: false, program: 'Token-2022', warning: 'empty instruction data' };\n }\n const tag = ix.data[0]!;\n if (tag >= 21) {\n const name = EXTENSION_TAGS[tag] ?? `extension(${tag})`;\n return {\n program: 'Token-2022',\n type: name,\n decoded: false,\n warning: `Token-2022 extension instruction \"${name}\" not byte-decoded; effect visible in balance diff`,\n warningCode: 'token-2022-extension-unparsed',\n };\n }\n return decodeTokenInstruction(ix, 'Token-2022', 'token-2022');\n}\n\nexport const token2022Decoder: ProgramDecoder = {\n programId: TOKEN_2022_PROGRAM_ID,\n name: 'Token-2022',\n kind: 'token-2022',\n decode: decodeToken2022,\n};\n\n/** The classic SPL Token decoder, sharing the same base layout. */\nexport const splTokenDecoder: ProgramDecoder = {\n programId: TOKEN_PROGRAM_ID,\n name: 'SPL Token',\n kind: 'token',\n decode: (ix) => decodeTokenInstruction(ix, 'SPL Token', 'spl-token'),\n};\n","/**\n * Associated Token Account program decoder.\n *\n * Instructions:\n * (empty data) Create — legacy, no discriminator\n * 0 Create\n * 1 CreateIdempotent\n * 2 RecoverNested\n *\n * Account order for Create/CreateIdempotent:\n * [payer, ata, owner, mint, systemProgram, tokenProgram, (rent)]\n */\n\nimport type { CompiledInstructionView, DecodeOutput, ProgramDecoder } from '../../types.js';\nimport { ASSOCIATED_TOKEN_PROGRAM_ID } from '../known-programs.js';\n\nfunction acc(ix: CompiledInstructionView, i: number): string | undefined {\n return ix.accounts[i]?.pubkey;\n}\n\nfunction decodeAta(ix: CompiledInstructionView): DecodeOutput {\n // Legacy \"Create\" has empty data; modern variants carry a single tag byte.\n const tag = ix.data.length === 0 ? 0 : ix.data[0]!;\n const type =\n tag === 0 ? 'create' : tag === 1 ? 'createIdempotent' : tag === 2 ? 'recoverNested' : undefined;\n\n if (type === undefined) {\n return {\n program: 'Associated Token Account',\n decoded: false,\n warning: `unrecognized ATA instruction tag ${tag}`,\n warningCode: 'partial-decode',\n };\n }\n\n if (type === 'recoverNested') {\n return {\n program: 'Associated Token Account',\n type,\n decoded: true,\n accountNames: ['nestedAta', 'nestedMint', 'destinationAta', 'ownerAta', 'ownerMint', 'wallet'],\n };\n }\n\n const ata = acc(ix, 1) ?? '';\n const owner = acc(ix, 2) ?? '';\n const tokenProgram = acc(ix, 5);\n return {\n program: 'Associated Token Account',\n type,\n decoded: true,\n accountNames: ['payer', 'ata', 'owner', 'mint', 'systemProgram', 'tokenProgram'],\n effects: [\n {\n kind: 'account-created',\n address: ata,\n owner: owner || (tokenProgram ?? ''),\n as: 'ata',\n },\n ],\n };\n}\n\nexport const ataDecoder: ProgramDecoder = {\n programId: ASSOCIATED_TOKEN_PROGRAM_ID,\n name: 'Associated Token Account',\n kind: 'ata',\n decode: decodeAta,\n};\n","/**\n * Memo program decoder (v1 + v2). The instruction data IS the UTF-8 memo.\n * Invalid UTF-8 is lossy-decoded with replacement chars; display is truncated\n * at a sane length (full bytes remain available via --raw / args).\n */\n\nimport type { CompiledInstructionView, DecodeOutput, ProgramDecoder } from '../../types.js';\nimport { MEMO_PROGRAM_ID, MEMO_V1_PROGRAM_ID } from '../known-programs.js';\n\nconst MAX_DISPLAY = 256;\n\nfunction decodeMemoData(ix: CompiledInstructionView, name: string): DecodeOutput {\n // `fatal: false` yields replacement chars on invalid UTF-8 (lossy).\n const text = new TextDecoder('utf-8', { fatal: false }).decode(ix.data);\n const display = text.length > MAX_DISPLAY ? `${text.slice(0, MAX_DISPLAY)}…` : text;\n const truncated = text.length > MAX_DISPLAY;\n return {\n program: name,\n type: 'memo',\n decoded: true,\n args: { text: display, ...(truncated ? { truncated: true } : {}) },\n effects: [{ kind: 'memo', text: display }],\n ...(truncated\n ? { warning: 'memo truncated for display; full bytes available via --raw', warningCode: 'partial-decode' as const }\n : {}),\n };\n}\n\nexport const memoDecoder: ProgramDecoder = {\n programId: MEMO_PROGRAM_ID,\n name: 'Memo',\n kind: 'memo',\n decode: (ix) => decodeMemoData(ix, 'Memo'),\n};\n\nexport const memoV1Decoder: ProgramDecoder = {\n programId: MEMO_V1_PROGRAM_ID,\n name: 'Memo (v1)',\n kind: 'memo',\n decode: (ix) => decodeMemoData(ix, 'Memo (v1)'),\n};\n","/**\n * Compute Budget program decoder (single-byte discriminator).\n *\n * 0 RequestUnits (deprecated)\n * 1 RequestHeapFrame (u32 bytes)\n * 2 SetComputeUnitLimit (u32 units)\n * 3 SetComputeUnitPrice (u64 micro-lamports per CU — kept as bigint)\n * 4 SetLoadedAccountsDataSizeLimit (u32 bytes)\n */\n\nimport type { CompiledInstructionView, DecodeOutput, ProgramDecoder } from '../../types.js';\nimport { Reader } from '../reader.js';\nimport { COMPUTE_BUDGET_PROGRAM_ID } from '../known-programs.js';\n\nfunction decodeComputeBudget(ix: CompiledInstructionView): DecodeOutput {\n if (ix.data.length < 1) {\n return { decoded: false, program: 'Compute Budget', warning: 'empty instruction data' };\n }\n const r = new Reader(ix.data);\n const tag = r.u8('tag');\n\n try {\n switch (tag) {\n case 1: {\n const bytes = r.u32('heap bytes');\n return {\n program: 'Compute Budget',\n type: 'requestHeapFrame',\n decoded: true,\n args: { bytes },\n };\n }\n case 2: {\n const units = r.u32('unit limit');\n return {\n program: 'Compute Budget',\n type: 'setComputeUnitLimit',\n decoded: true,\n args: { units },\n effects: [{ kind: 'compute-budget', unitLimit: units }],\n };\n }\n case 3: {\n const price = r.u64('micro-lamports');\n return {\n program: 'Compute Budget',\n type: 'setComputeUnitPrice',\n decoded: true,\n args: { microLamports: price.toString() },\n effects: [{ kind: 'compute-budget', unitPriceMicroLamports: price }],\n };\n }\n case 4: {\n const bytes = r.u32('data size limit');\n return {\n program: 'Compute Budget',\n type: 'setLoadedAccountsDataSizeLimit',\n decoded: true,\n args: { bytes },\n };\n }\n case 0:\n return {\n program: 'Compute Budget',\n type: 'requestUnits',\n decoded: true,\n };\n default:\n return {\n program: 'Compute Budget',\n type: `unknown(${tag})`,\n decoded: false,\n warningCode: 'partial-decode',\n };\n }\n } catch (err) {\n return {\n program: 'Compute Budget',\n decoded: false,\n warning: err instanceof Error ? err.message : 'compute-budget decode failed',\n warningCode: 'partial-decode',\n };\n }\n}\n\nexport const computeBudgetDecoder: ProgramDecoder = {\n programId: COMPUTE_BUDGET_PROGRAM_ID,\n name: 'Compute Budget',\n kind: 'compute-budget',\n decode: decodeComputeBudget,\n};\n","/**\n * Best-effort, name-only recognizers for programs we do not byte-decode\n * (Jupiter, Metaplex, Raydium, Orca, Stake, Vote, BPF loaders, …).\n *\n * These set `program` + a `program-call` action; the actual \"what changed\" is\n * inferred from the balance diff + CPI transfers in the correlation layer.\n */\n\nimport type { ProgramDecoder } from '../../types.js';\nimport { KNOWN_PROGRAMS } from '../known-programs.js';\n\nconst ALREADY_DECODED = new Set([\n '11111111111111111111111111111111',\n 'TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA',\n 'TokenzQdBNbLqP5VEhdkAS6EPFLC1PHnBqCXEpPxuEb',\n 'ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL',\n 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr',\n 'Memo1UhkJRfHyvLMcVucJwxXeuD728EqVDDwQDxFMNo',\n 'ComputeBudget111111111111111111111111111111',\n]);\n\n/**\n * Build name-only decoders for every {@link KNOWN_PROGRAMS} entry that doesn't\n * already have a byte-level decoder. They never throw; they mark the\n * instruction recognized-but-undecoded and emit a `program-call`-friendly\n * output for the correlation layer.\n */\nexport function buildRecognizers(): ProgramDecoder[] {\n const decoders: ProgramDecoder[] = [];\n for (const [programId, info] of Object.entries(KNOWN_PROGRAMS)) {\n if (ALREADY_DECODED.has(programId)) continue;\n decoders.push({\n programId,\n name: info.name,\n kind: info.kind,\n decode: () => ({\n program: info.name,\n decoded: false,\n // Honest signal: we know *who* but not the exact ix semantics.\n warning: `${info.name} recognized by program id; semantics inferred from balance diff (no IDL)`,\n }),\n });\n }\n return decoders;\n}\n","/**\n * Program registry + `createRegistry` + `defaultRegistry` + `decodeInstruction`.\n *\n * This module is also the `@vtx-labs/solana-explain/programs` entry point, so\n * advanced consumers can register custom decoders without IDLs.\n */\n\nimport type {\n CompiledInstructionView,\n DecodedInstruction,\n ProgramDecoder,\n ProgramRegistry,\n} from '../types.js';\nimport { knownProgram } from './known-programs.js';\nimport { systemDecoder } from './programs/system.js';\nimport { splTokenDecoder, token2022Decoder } from './programs/token-2022.js';\nimport { ataDecoder } from './programs/ata.js';\nimport { memoDecoder, memoV1Decoder } from './programs/memo.js';\nimport { computeBudgetDecoder } from './programs/compute-budget.js';\nimport { buildRecognizers } from './programs/recognize.js';\n\nexport { KNOWN_PROGRAMS, knownProgram } from './known-programs.js';\nexport type {\n ProgramDecoder,\n ProgramRegistry,\n DecodeOutput,\n DecoderEffect,\n CompiledInstructionView,\n KnownProgramInfo,\n ProgramKind,\n} from '../types.js';\n\nclass Registry implements ProgramRegistry {\n private readonly map: Map<string, ProgramDecoder>;\n\n constructor(decoders: ProgramDecoder[]) {\n this.map = new Map();\n for (const d of decoders) this.map.set(d.programId, d);\n }\n\n get(programId: string): ProgramDecoder | undefined {\n return this.map.get(programId);\n }\n\n has(programId: string): boolean {\n return this.map.has(programId);\n }\n\n list(): ProgramDecoder[] {\n return [...this.map.values()];\n }\n\n merge(decoders: ProgramDecoder[]): ProgramRegistry {\n const merged = new Map(this.map);\n for (const d of decoders) merged.set(d.programId, d);\n return new Registry([...merged.values()]);\n }\n}\n\n/** Bundled byte-level decoders (precise semantics). */\nexport const BUNDLED_DECODERS: ProgramDecoder[] = [\n systemDecoder,\n splTokenDecoder,\n token2022Decoder,\n ataDecoder,\n memoDecoder,\n memoV1Decoder,\n computeBudgetDecoder,\n];\n\n/**\n * Create a registry. By default it includes the bundled byte-level decoders\n * plus name-only recognizers; pass `decoders` to merge overrides on top.\n */\nexport function createRegistry(decoders?: ProgramDecoder[]): ProgramRegistry {\n const base = [...BUNDLED_DECODERS, ...buildRecognizers()];\n const reg = new Registry(base);\n return decoders && decoders.length > 0 ? reg.merge(decoders) : reg;\n}\n\n/** The default registry (bundled decoders + recognizers). */\nexport const defaultRegistry: ProgramRegistry = createRegistry();\n\n/**\n * Pure: decode one instruction against the registry. Returns `{ decoded:false }`\n * (never throws) for unrecognized programs.\n */\nexport function decodeInstruction(\n ix: CompiledInstructionView,\n registry: ProgramRegistry = defaultRegistry,\n /**\n * Optional pre-computed decode output. When the caller has already run the\n * decoder (see {@link decodeInstructionRaw}), passing it here avoids decoding\n * the instruction a second time across the whole CPI tree.\n */\n precomputed?: import('../types.js').DecodeOutput,\n): DecodedInstruction {\n const decoder = registry.get(ix.programId);\n const known = knownProgram(ix.programId);\n\n const baseAccounts = ix.accounts.map((a) => ({\n pubkey: a.pubkey,\n isSigner: a.isSigner,\n isWritable: a.isWritable,\n }));\n\n if (!decoder) {\n return {\n index: ix.index,\n programId: ix.programId,\n ...(known ? { program: known.name } : {}),\n decoded: false,\n accounts: baseAccounts,\n warning: known\n ? `${known.name} recognized by program id (no byte decoder)`\n : 'unknown program (no decoder)',\n };\n }\n\n let out;\n try {\n out = precomputed ?? decoder.decode(ix);\n } catch (err) {\n // Decoders are contracted not to throw, but be defensive.\n return {\n index: ix.index,\n programId: ix.programId,\n program: decoder.name,\n decoded: false,\n accounts: baseAccounts,\n warning: `decoder error: ${err instanceof Error ? err.message : String(err)}`,\n };\n }\n\n const accounts = baseAccounts.map((a, i) => {\n const name = out.accountNames?.[i];\n return name !== undefined ? { ...a, name } : a;\n });\n\n return {\n index: ix.index,\n programId: ix.programId,\n ...(out.program !== undefined ? { program: out.program } : {}),\n ...(out.type !== undefined ? { type: out.type } : {}),\n decoded: out.decoded,\n accounts,\n ...(out.args !== undefined ? { args: out.args } : {}),\n ...(out.warning !== undefined ? { warning: out.warning } : {}),\n };\n}\n\n/** Internal helper to retain the structured effects for correlation. */\nexport function decodeInstructionRaw(\n ix: CompiledInstructionView,\n registry: ProgramRegistry = defaultRegistry,\n): { decoded: DecodedInstruction; effects: import('../types.js').DecoderEffect[]; warningCode?: import('../types.js').WarningCode } {\n const decoder = registry.get(ix.programId);\n if (!decoder) return { decoded: decodeInstruction(ix, registry), effects: [] };\n let out;\n try {\n out = decoder.decode(ix); // decode ONCE\n } catch {\n return { decoded: decodeInstruction(ix, registry), effects: [] };\n }\n // Reuse the single decode output for the human view (no second decode).\n const decoded = decodeInstruction(ix, registry, out);\n return {\n decoded,\n effects: out.effects ?? [],\n ...(out.warningCode !== undefined ? { warningCode: out.warningCode } : {}),\n };\n}\n"]}
|
package/dist/render.d.ts
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { a as ExplainResult, u as RenderOptions, h as Action } from './types-MSKEy1VA.js';
|
|
2
|
+
|
|
3
|
+
/** Format a base-unit bigint with `decimals` into a trimmed decimal string. */
|
|
4
|
+
declare function formatUnits(amount: bigint, decimals: number): string;
|
|
5
|
+
/** Lamports → SOL string (9 decimals, trimmed). */
|
|
6
|
+
declare function lamportsToSol(lamports: bigint): string;
|
|
7
|
+
/** A signed UI delta like `"+1.5 SOL"` / `"-250 USDC"`. */
|
|
8
|
+
declare function signedUi(delta: bigint, decimals: number, symbol?: string): string;
|
|
9
|
+
/** Shorten a base58 address to `abcd…wxyz` (4 + 4 by default). */
|
|
10
|
+
declare function shortAddr(addr: string, head?: number, tail?: number): string;
|
|
11
|
+
/** Format a Unix seconds timestamp as `YYYY-MM-DD HH:MM UTC`. */
|
|
12
|
+
declare function formatBlockTime(blockTime: number | null | undefined): string | undefined;
|
|
13
|
+
|
|
14
|
+
interface Styler {
|
|
15
|
+
enabled: boolean;
|
|
16
|
+
bold(s: string): string;
|
|
17
|
+
dim(s: string): string;
|
|
18
|
+
red(s: string): string;
|
|
19
|
+
green(s: string): string;
|
|
20
|
+
yellow(s: string): string;
|
|
21
|
+
blue(s: string): string;
|
|
22
|
+
magenta(s: string): string;
|
|
23
|
+
cyan(s: string): string;
|
|
24
|
+
gray(s: string): string;
|
|
25
|
+
brand(s: string): string;
|
|
26
|
+
}
|
|
27
|
+
declare function createStyler(enabled: boolean): Styler;
|
|
28
|
+
/**
|
|
29
|
+
* Decide whether color should be on, given an explicit preference and the
|
|
30
|
+
* environment. Explicit `true`/`false` wins; otherwise auto-detect.
|
|
31
|
+
*/
|
|
32
|
+
declare function shouldUseColor(opts: {
|
|
33
|
+
explicit?: boolean;
|
|
34
|
+
isTTY?: boolean;
|
|
35
|
+
env?: NodeJS.ProcessEnv;
|
|
36
|
+
}): boolean;
|
|
37
|
+
/** Strip ANSI escape codes from a string (for width calc / tests). */
|
|
38
|
+
declare function stripAnsi(s: string): string;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Pure rendering helpers. No I/O.
|
|
42
|
+
* - renderText: sectioned, aligned, optionally colorized
|
|
43
|
+
* - renderMarkdown: GitHub-flavored markdown (great for issues / PRs)
|
|
44
|
+
* - renderJson: BigInt-safe JSON serializer
|
|
45
|
+
*
|
|
46
|
+
* This module is the `@vtx-labs/solana-explain/render` entry point.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
/** Render the human-readable, optionally colorized report. */
|
|
50
|
+
declare function renderText(result: ExplainResult, opts?: RenderOptions): string;
|
|
51
|
+
/** Human one-liner for an action. */
|
|
52
|
+
declare function describeAction(a: Action): string;
|
|
53
|
+
declare function renderMarkdown(result: ExplainResult): string;
|
|
54
|
+
/** Serialize an ExplainResult to JSON; BigInts become decimal strings. */
|
|
55
|
+
declare function renderJson(result: ExplainResult, opts?: {
|
|
56
|
+
pretty?: boolean;
|
|
57
|
+
}): string;
|
|
58
|
+
|
|
59
|
+
export { createStyler, describeAction, formatBlockTime, formatUnits, lamportsToSol, renderJson, renderMarkdown, renderText, shortAddr, shouldUseColor, signedUi, stripAnsi };
|
package/dist/render.js
ADDED
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
// src/render/ansi.ts
|
|
2
|
+
var ESC = `${String.fromCharCode(27)}[`;
|
|
3
|
+
var RESET = `${ESC}0m`;
|
|
4
|
+
var CODES = {
|
|
5
|
+
bold: `${ESC}1m`,
|
|
6
|
+
dim: `${ESC}2m`,
|
|
7
|
+
red: `${ESC}31m`,
|
|
8
|
+
green: `${ESC}32m`,
|
|
9
|
+
yellow: `${ESC}33m`,
|
|
10
|
+
blue: `${ESC}34m`,
|
|
11
|
+
magenta: `${ESC}35m`,
|
|
12
|
+
cyan: `${ESC}36m`,
|
|
13
|
+
gray: `${ESC}90m`,
|
|
14
|
+
// VTX brand blue (#3182ce) via 256-color approximation.
|
|
15
|
+
brand: `${ESC}38;5;33m`
|
|
16
|
+
};
|
|
17
|
+
function wrap(enabled, code, s) {
|
|
18
|
+
return enabled ? `${code}${s}${RESET}` : s;
|
|
19
|
+
}
|
|
20
|
+
function createStyler(enabled) {
|
|
21
|
+
return {
|
|
22
|
+
enabled,
|
|
23
|
+
bold: (s) => wrap(enabled, CODES.bold, s),
|
|
24
|
+
dim: (s) => wrap(enabled, CODES.dim, s),
|
|
25
|
+
red: (s) => wrap(enabled, CODES.red, s),
|
|
26
|
+
green: (s) => wrap(enabled, CODES.green, s),
|
|
27
|
+
yellow: (s) => wrap(enabled, CODES.yellow, s),
|
|
28
|
+
blue: (s) => wrap(enabled, CODES.blue, s),
|
|
29
|
+
magenta: (s) => wrap(enabled, CODES.magenta, s),
|
|
30
|
+
cyan: (s) => wrap(enabled, CODES.cyan, s),
|
|
31
|
+
gray: (s) => wrap(enabled, CODES.gray, s),
|
|
32
|
+
brand: (s) => wrap(enabled, CODES.brand, s)
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
function shouldUseColor(opts) {
|
|
36
|
+
if (opts.explicit !== void 0) return opts.explicit;
|
|
37
|
+
const env = opts.env ?? {};
|
|
38
|
+
if (env["NO_COLOR"] !== void 0 && env["NO_COLOR"] !== "") return false;
|
|
39
|
+
if (env["FORCE_COLOR"] !== void 0 && env["FORCE_COLOR"] !== "0" && env["FORCE_COLOR"] !== "") {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return Boolean(opts.isTTY);
|
|
43
|
+
}
|
|
44
|
+
var ANSI_RE = new RegExp(`${String.fromCharCode(27)}[[0-9;]*m`, "g");
|
|
45
|
+
function stripAnsi(s) {
|
|
46
|
+
return s.replace(ANSI_RE, "");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// src/render/format.ts
|
|
50
|
+
function groupThousands(intStr) {
|
|
51
|
+
const neg = intStr.startsWith("-");
|
|
52
|
+
const digits = neg ? intStr.slice(1) : intStr;
|
|
53
|
+
const grouped = digits.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
54
|
+
return neg ? `-${grouped}` : grouped;
|
|
55
|
+
}
|
|
56
|
+
function formatUnits(amount, decimals) {
|
|
57
|
+
const neg = amount < 0n;
|
|
58
|
+
const abs = neg ? -amount : amount;
|
|
59
|
+
if (decimals <= 0) {
|
|
60
|
+
return (neg ? "-" : "") + groupThousands(abs.toString());
|
|
61
|
+
}
|
|
62
|
+
const base = 10n ** BigInt(decimals);
|
|
63
|
+
const whole = abs / base;
|
|
64
|
+
const frac = abs % base;
|
|
65
|
+
let fracStr = frac.toString().padStart(decimals, "0").replace(/0+$/, "");
|
|
66
|
+
const wholeStr = groupThousands(whole.toString());
|
|
67
|
+
const sign = neg ? "-" : "";
|
|
68
|
+
return fracStr.length > 0 ? `${sign}${wholeStr}.${fracStr}` : `${sign}${wholeStr}`;
|
|
69
|
+
}
|
|
70
|
+
function lamportsToSol(lamports) {
|
|
71
|
+
return formatUnits(lamports, 9);
|
|
72
|
+
}
|
|
73
|
+
function signedUi(delta, decimals, symbol) {
|
|
74
|
+
const sign = delta > 0n ? "+" : "";
|
|
75
|
+
const body = formatUnits(delta, decimals);
|
|
76
|
+
const unit = symbol ? ` ${symbol}` : "";
|
|
77
|
+
return `${sign}${body}${unit}`;
|
|
78
|
+
}
|
|
79
|
+
function shortAddr(addr, head = 4, tail = 4) {
|
|
80
|
+
if (addr.length <= head + tail + 1) return addr;
|
|
81
|
+
return `${addr.slice(0, head)}\u2026${addr.slice(-tail)}`;
|
|
82
|
+
}
|
|
83
|
+
function formatBlockTime(blockTime) {
|
|
84
|
+
if (blockTime === null || blockTime === void 0) return void 0;
|
|
85
|
+
const d = new Date(blockTime * 1e3);
|
|
86
|
+
if (Number.isNaN(d.getTime())) return void 0;
|
|
87
|
+
const pad = (n) => n.toString().padStart(2, "0");
|
|
88
|
+
return `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())} UTC`;
|
|
89
|
+
}
|
|
90
|
+
function formatCount(n) {
|
|
91
|
+
return groupThousands(Math.trunc(n).toString());
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// src/render/index.ts
|
|
95
|
+
var INDENT = " ";
|
|
96
|
+
function renderText(result, opts = {}) {
|
|
97
|
+
const s = createStyler(opts.color ?? false);
|
|
98
|
+
const lines = [];
|
|
99
|
+
if (opts.quiet) {
|
|
100
|
+
return result.summary;
|
|
101
|
+
}
|
|
102
|
+
const commitmentNote = result.source === "simulation" ? "simulation" : result.commitment ?? "confirmed";
|
|
103
|
+
const when = formatBlockTime(result.blockTime);
|
|
104
|
+
const headParts = [
|
|
105
|
+
`Solana transaction`,
|
|
106
|
+
commitmentNote,
|
|
107
|
+
result.slot !== void 0 ? `slot ${formatCount(result.slot)}` : void 0,
|
|
108
|
+
when
|
|
109
|
+
].filter(Boolean);
|
|
110
|
+
lines.push("");
|
|
111
|
+
lines.push(`${INDENT}${s.brand(headParts.join(" \xB7 "))}`);
|
|
112
|
+
const status = result.success ? s.green("\u2713 Success") : s.red("\u2717 Failed");
|
|
113
|
+
if (result.signature) {
|
|
114
|
+
lines.push(`${INDENT}${s.dim("Signature")} ${shortAddr(result.signature, 6, 6)} ${status}`);
|
|
115
|
+
} else {
|
|
116
|
+
lines.push(`${INDENT}${s.dim("Source")} ${result.source} ${status}`);
|
|
117
|
+
}
|
|
118
|
+
lines.push("");
|
|
119
|
+
lines.push(`${INDENT}${s.bold("Summary")} ${result.summary}`);
|
|
120
|
+
if (!result.success && result.error) {
|
|
121
|
+
lines.push(`${INDENT}${s.red("Error")} ${result.error.human}`);
|
|
122
|
+
}
|
|
123
|
+
if (result.balanceChanges.length > 0) {
|
|
124
|
+
lines.push("");
|
|
125
|
+
lines.push(`${INDENT}${s.bold("Balance changes")}`);
|
|
126
|
+
for (const d of groupBalances(result.balanceChanges, result.feePayer)) {
|
|
127
|
+
const label = d.label;
|
|
128
|
+
const focusTag = d.account === result.feePayer ? s.dim(" (fee payer)") : "";
|
|
129
|
+
const colored = colorDelta(d.text, s);
|
|
130
|
+
lines.push(`${INDENT}${INDENT}${padRight(label, 22)}${colored}${focusTag}`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
if (result.actions.length > 0) {
|
|
134
|
+
lines.push("");
|
|
135
|
+
lines.push(`${INDENT}${s.bold("Actions")}`);
|
|
136
|
+
result.actions.forEach((a, i) => {
|
|
137
|
+
lines.push(`${INDENT}${INDENT}${i + 1}. ${describeAction(a)}`);
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
if (opts.verbose && result.instructions.length > 0) {
|
|
141
|
+
lines.push("");
|
|
142
|
+
lines.push(`${INDENT}${s.bold("Instructions")}`);
|
|
143
|
+
for (const ix of result.instructions) {
|
|
144
|
+
renderInstruction(ix, lines, s, 2);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
if (result.programsInvoked.length > 0) {
|
|
148
|
+
const names = result.programsInvoked.map((p) => p.name ?? shortAddr(p.programId)).filter((v, idx, arr) => arr.indexOf(v) === idx);
|
|
149
|
+
lines.push("");
|
|
150
|
+
lines.push(`${INDENT}${s.bold("Programs")} ${names.join(" \xB7 ")}`);
|
|
151
|
+
}
|
|
152
|
+
const feeStr = `${lamportsToSol(result.feeLamports)} SOL`;
|
|
153
|
+
const computeStr = result.computeUnits !== void 0 ? `${formatCount(result.computeUnits)} units` : "n/a";
|
|
154
|
+
lines.push(`${INDENT}${s.bold("Fee")} ${feeStr}${" ".repeat(8)}${s.bold("Compute")} ${computeStr}`);
|
|
155
|
+
if (result.warnings.length > 0) {
|
|
156
|
+
lines.push("");
|
|
157
|
+
lines.push(`${INDENT}${s.yellow(`\u26A0 ${result.warnings.length} warning${result.warnings.length > 1 ? "s" : ""}`)}`);
|
|
158
|
+
for (const w of result.warnings) {
|
|
159
|
+
const at = w.instructionIndex !== void 0 ? ` [ix #${w.instructionIndex}]` : "";
|
|
160
|
+
lines.push(`${INDENT}${INDENT}${s.dim("\xB7")} ${w.message}${s.dim(at)}`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
lines.push("");
|
|
164
|
+
return lines.join("\n");
|
|
165
|
+
}
|
|
166
|
+
function renderInstruction(ix, lines, s, depth) {
|
|
167
|
+
const pad = INDENT.repeat(depth);
|
|
168
|
+
const name = ix.program ?? shortAddr(ix.programId);
|
|
169
|
+
const type = ix.type ? `.${ix.type}` : "";
|
|
170
|
+
const mark = ix.decoded ? "" : s.dim(" (not decoded)");
|
|
171
|
+
lines.push(`${pad}${s.cyan(`#${ix.index}`)} ${name}${type}${mark}`);
|
|
172
|
+
if (ix.args && Object.keys(ix.args).length > 0) {
|
|
173
|
+
const argStr = Object.entries(ix.args).map(([k, v]) => `${k}=${String(v)}`).join(", ");
|
|
174
|
+
lines.push(`${pad}${INDENT}${s.dim(argStr)}`);
|
|
175
|
+
}
|
|
176
|
+
if (ix.inner) {
|
|
177
|
+
for (const inner of ix.inner) renderInstruction(inner, lines, s, depth + 1);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function groupBalances(deltas, feePayer) {
|
|
181
|
+
const byAccount = /* @__PURE__ */ new Map();
|
|
182
|
+
for (const d of deltas) {
|
|
183
|
+
const list = byAccount.get(d.account) ?? [];
|
|
184
|
+
list.push(d);
|
|
185
|
+
byAccount.set(d.account, list);
|
|
186
|
+
}
|
|
187
|
+
const out = [];
|
|
188
|
+
for (const [account, list] of byAccount) {
|
|
189
|
+
const text = list.map((d) => d.uiDelta).join(" ");
|
|
190
|
+
const isFee = account === feePayer;
|
|
191
|
+
out.push({ account, label: shortAddr(account, 4, 4) + (isFee ? "" : ""), text });
|
|
192
|
+
}
|
|
193
|
+
return out;
|
|
194
|
+
}
|
|
195
|
+
function colorDelta(text, s) {
|
|
196
|
+
return text.split(" ").map(
|
|
197
|
+
(part) => part.trim().startsWith("-") ? s.red(part) : part.trim().startsWith("+") ? s.green(part) : part
|
|
198
|
+
).join(" ");
|
|
199
|
+
}
|
|
200
|
+
function padRight(str, width) {
|
|
201
|
+
const visible = stripAnsi(str);
|
|
202
|
+
return visible.length >= width ? str : str + " ".repeat(width - visible.length);
|
|
203
|
+
}
|
|
204
|
+
function describeAction(a) {
|
|
205
|
+
switch (a.kind) {
|
|
206
|
+
case "sol-transfer":
|
|
207
|
+
return `Transfer ${a.sol} SOL ${shortAddr(a.from)} \u2192 ${shortAddr(a.to)}`;
|
|
208
|
+
case "token-transfer": {
|
|
209
|
+
const sym = a.symbol ?? shortAddr(a.mint);
|
|
210
|
+
const self = a.from === a.to ? " (self-transfer)" : "";
|
|
211
|
+
return `Transfer ${a.uiAmount} ${sym} ${shortAddr(a.from)} \u2192 ${shortAddr(a.to)}${self}`;
|
|
212
|
+
}
|
|
213
|
+
case "mint":
|
|
214
|
+
return `Mint ${a.uiAmount} of ${shortAddr(a.mint)} \u2192 ${shortAddr(a.to)}`;
|
|
215
|
+
case "burn":
|
|
216
|
+
return `Burn ${a.uiAmount} of ${shortAddr(a.mint)} from ${shortAddr(a.from)}`;
|
|
217
|
+
case "account-created": {
|
|
218
|
+
const as = a.as ? ` (${a.as})` : "";
|
|
219
|
+
return `Create account ${shortAddr(a.address)}${as} owned by ${shortAddr(a.owner)}`;
|
|
220
|
+
}
|
|
221
|
+
case "approval":
|
|
222
|
+
if (a.revoke) return `Revoke delegate on ${shortAddr(a.owner)}`;
|
|
223
|
+
return `Approve ${a.amount === "unlimited" ? "unlimited" : a.amount.toString()} to delegate ${shortAddr(a.delegate)}`;
|
|
224
|
+
case "close-account":
|
|
225
|
+
return `Close account ${shortAddr(a.account)} \u2192 reclaim ${lamportsToSol(a.reclaimedLamports)} SOL to ${shortAddr(a.destination)}`;
|
|
226
|
+
case "memo":
|
|
227
|
+
return `Memo: "${a.text}"`;
|
|
228
|
+
case "compute-budget": {
|
|
229
|
+
const parts = [];
|
|
230
|
+
if (a.unitLimit !== void 0) parts.push(`unit limit ${groupThousands(a.unitLimit.toString())}`);
|
|
231
|
+
if (a.unitPriceMicroLamports !== void 0)
|
|
232
|
+
parts.push(`price ${a.unitPriceMicroLamports.toString()} \xB5-lamports`);
|
|
233
|
+
return `Set compute budget: ${parts.join(", ") || "(no-op)"}`;
|
|
234
|
+
}
|
|
235
|
+
case "program-call": {
|
|
236
|
+
const name = a.program ?? shortAddr(a.programId);
|
|
237
|
+
const note = a.note ? ` \u2014 ${a.note}` : "";
|
|
238
|
+
return `Call ${name}${a.instruction ? `.${a.instruction}` : ""}${note}`;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
function renderMarkdown(result) {
|
|
243
|
+
const lines = [];
|
|
244
|
+
lines.push(`### Solana transaction \u2014 ${result.success ? "\u2705 Success" : "\u274C Failed"}`);
|
|
245
|
+
lines.push("");
|
|
246
|
+
if (result.signature) lines.push(`**Signature:** \`${result.signature}\` `);
|
|
247
|
+
if (result.slot !== void 0) lines.push(`**Slot:** ${formatCount(result.slot)} `);
|
|
248
|
+
const when = formatBlockTime(result.blockTime);
|
|
249
|
+
if (when) lines.push(`**Time:** ${when} `);
|
|
250
|
+
lines.push(`**Fee:** ${lamportsToSol(result.feeLamports)} SOL `);
|
|
251
|
+
if (result.computeUnits !== void 0)
|
|
252
|
+
lines.push(`**Compute:** ${formatCount(result.computeUnits)} units `);
|
|
253
|
+
lines.push("");
|
|
254
|
+
lines.push(`> ${result.summary}`);
|
|
255
|
+
lines.push("");
|
|
256
|
+
if (!result.success && result.error) {
|
|
257
|
+
lines.push(`**Error:** ${result.error.human}`);
|
|
258
|
+
lines.push("");
|
|
259
|
+
}
|
|
260
|
+
if (result.balanceChanges.length > 0) {
|
|
261
|
+
lines.push("#### Balance changes");
|
|
262
|
+
lines.push("");
|
|
263
|
+
lines.push("| Account | Asset | Change |");
|
|
264
|
+
lines.push("| --- | --- | --- |");
|
|
265
|
+
for (const d of result.balanceChanges) {
|
|
266
|
+
const asset = d.asset.kind === "SOL" ? "SOL" : `${d.asset.symbol ?? shortAddr(d.asset.mint)}`;
|
|
267
|
+
lines.push(`| \`${shortAddr(d.account, 6, 6)}\` | ${asset} | ${d.uiDelta} |`);
|
|
268
|
+
}
|
|
269
|
+
lines.push("");
|
|
270
|
+
}
|
|
271
|
+
if (result.actions.length > 0) {
|
|
272
|
+
lines.push("#### Actions");
|
|
273
|
+
lines.push("");
|
|
274
|
+
result.actions.forEach((a, i) => lines.push(`${i + 1}. ${describeAction(a)}`));
|
|
275
|
+
lines.push("");
|
|
276
|
+
}
|
|
277
|
+
if (result.programsInvoked.length > 0) {
|
|
278
|
+
lines.push("#### Programs");
|
|
279
|
+
lines.push("");
|
|
280
|
+
for (const p of result.programsInvoked) {
|
|
281
|
+
lines.push(`- ${p.name ?? `\`${p.programId}\``} \xD7${p.count}`);
|
|
282
|
+
}
|
|
283
|
+
lines.push("");
|
|
284
|
+
}
|
|
285
|
+
if (result.warnings.length > 0) {
|
|
286
|
+
lines.push("#### Warnings");
|
|
287
|
+
lines.push("");
|
|
288
|
+
for (const w of result.warnings) lines.push(`- \u26A0\uFE0F ${w.message} \`(${w.code})\``);
|
|
289
|
+
lines.push("");
|
|
290
|
+
}
|
|
291
|
+
return lines.join("\n").trimEnd() + "\n";
|
|
292
|
+
}
|
|
293
|
+
function renderJson(result, opts) {
|
|
294
|
+
const replacer = (_key, value) => typeof value === "bigint" ? value.toString() : value;
|
|
295
|
+
return JSON.stringify(result, replacer, opts?.pretty ? 2 : void 0);
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
export { createStyler, describeAction, formatBlockTime, formatUnits, lamportsToSol, renderJson, renderMarkdown, renderText, shortAddr, shouldUseColor, signedUi, stripAnsi };
|
|
299
|
+
//# sourceMappingURL=render.js.map
|
|
300
|
+
//# sourceMappingURL=render.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/render/ansi.ts","../src/render/format.ts","../src/render/index.ts"],"names":[],"mappings":"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","file":"render.js","sourcesContent":["/**\n * Tiny hand-rolled ANSI styler (~no deps). Color auto-detection built in:\n * off when not a TTY, when `NO_COLOR` is set, or when explicitly disabled.\n */\n\nconst ESC = `${String.fromCharCode(27)}[`;\nconst RESET = `${ESC}0m`;\n\nconst CODES = {\n bold: `${ESC}1m`,\n dim: `${ESC}2m`,\n red: `${ESC}31m`,\n green: `${ESC}32m`,\n yellow: `${ESC}33m`,\n blue: `${ESC}34m`,\n magenta: `${ESC}35m`,\n cyan: `${ESC}36m`,\n gray: `${ESC}90m`,\n // VTX brand blue (#3182ce) via 256-color approximation.\n brand: `${ESC}38;5;33m`,\n} as const;\n\nexport type StyleName = keyof typeof CODES;\n\nexport interface Styler {\n enabled: boolean;\n bold(s: string): string;\n dim(s: string): string;\n red(s: string): string;\n green(s: string): string;\n yellow(s: string): string;\n blue(s: string): string;\n magenta(s: string): string;\n cyan(s: string): string;\n gray(s: string): string;\n brand(s: string): string;\n}\n\nfunction wrap(enabled: boolean, code: string, s: string): string {\n return enabled ? `${code}${s}${RESET}` : s;\n}\n\nexport function createStyler(enabled: boolean): Styler {\n return {\n enabled,\n bold: (s) => wrap(enabled, CODES.bold, s),\n dim: (s) => wrap(enabled, CODES.dim, s),\n red: (s) => wrap(enabled, CODES.red, s),\n green: (s) => wrap(enabled, CODES.green, s),\n yellow: (s) => wrap(enabled, CODES.yellow, s),\n blue: (s) => wrap(enabled, CODES.blue, s),\n magenta: (s) => wrap(enabled, CODES.magenta, s),\n cyan: (s) => wrap(enabled, CODES.cyan, s),\n gray: (s) => wrap(enabled, CODES.gray, s),\n brand: (s) => wrap(enabled, CODES.brand, s),\n };\n}\n\n/**\n * Decide whether color should be on, given an explicit preference and the\n * environment. Explicit `true`/`false` wins; otherwise auto-detect.\n */\nexport function shouldUseColor(opts: {\n explicit?: boolean;\n isTTY?: boolean;\n env?: NodeJS.ProcessEnv;\n}): boolean {\n if (opts.explicit !== undefined) return opts.explicit;\n const env = opts.env ?? {};\n if (env['NO_COLOR'] !== undefined && env['NO_COLOR'] !== '') return false;\n if (env['FORCE_COLOR'] !== undefined && env['FORCE_COLOR'] !== '0' && env['FORCE_COLOR'] !== '') {\n return true;\n }\n return Boolean(opts.isTTY);\n}\n\nconst ANSI_RE = new RegExp(`${String.fromCharCode(27)}\\[[0-9;]*m`, 'g');\n\n/** Strip ANSI escape codes from a string (for width calc / tests). */\nexport function stripAnsi(s: string): string {\n return s.replace(ANSI_RE, '');\n}\n","/**\n * Pure formatting helpers: lamports→SOL, ui-amount, address shortening,\n * column alignment, number grouping. No I/O, no color.\n */\n\nconst LAMPORTS_PER_SOL = 1_000_000_000n;\n\n/** Group a non-negative integer string with thousands separators. */\nexport function groupThousands(intStr: string): string {\n const neg = intStr.startsWith('-');\n const digits = neg ? intStr.slice(1) : intStr;\n const grouped = digits.replace(/\\B(?=(\\d{3})+(?!\\d))/g, ',');\n return neg ? `-${grouped}` : grouped;\n}\n\n/** Format a base-unit bigint with `decimals` into a trimmed decimal string. */\nexport function formatUnits(amount: bigint, decimals: number): string {\n const neg = amount < 0n;\n const abs = neg ? -amount : amount;\n if (decimals <= 0) {\n return (neg ? '-' : '') + groupThousands(abs.toString());\n }\n const base = 10n ** BigInt(decimals);\n const whole = abs / base;\n const frac = abs % base;\n let fracStr = frac.toString().padStart(decimals, '0').replace(/0+$/, '');\n const wholeStr = groupThousands(whole.toString());\n const sign = neg ? '-' : '';\n return fracStr.length > 0 ? `${sign}${wholeStr}.${fracStr}` : `${sign}${wholeStr}`;\n}\n\n/** Lamports → SOL string (9 decimals, trimmed). */\nexport function lamportsToSol(lamports: bigint): string {\n return formatUnits(lamports, 9);\n}\n\n/** Lamports → SOL number of decimal places preserved; convenience for \"X SOL\". */\nexport function solLabel(lamports: bigint): string {\n return `${lamportsToSol(lamports)} SOL`;\n}\n\nexport { LAMPORTS_PER_SOL };\n\n/** A signed UI delta like `\"+1.5 SOL\"` / `\"-250 USDC\"`. */\nexport function signedUi(delta: bigint, decimals: number, symbol?: string): string {\n const sign = delta > 0n ? '+' : '';\n const body = formatUnits(delta, decimals);\n const unit = symbol ? ` ${symbol}` : '';\n return `${sign}${body}${unit}`;\n}\n\n/** Shorten a base58 address to `abcd…wxyz` (4 + 4 by default). */\nexport function shortAddr(addr: string, head = 4, tail = 4): string {\n if (addr.length <= head + tail + 1) return addr;\n return `${addr.slice(0, head)}…${addr.slice(-tail)}`;\n}\n\n/** Format a Unix seconds timestamp as `YYYY-MM-DD HH:MM UTC`. */\nexport function formatBlockTime(blockTime: number | null | undefined): string | undefined {\n if (blockTime === null || blockTime === undefined) return undefined;\n const d = new Date(blockTime * 1000);\n if (Number.isNaN(d.getTime())) return undefined;\n const pad = (n: number) => n.toString().padStart(2, '0');\n return (\n `${d.getUTCFullYear()}-${pad(d.getUTCMonth() + 1)}-${pad(d.getUTCDate())} ` +\n `${pad(d.getUTCHours())}:${pad(d.getUTCMinutes())} UTC`\n );\n}\n\n/** Pad a visible string to width (ignoring ANSI is the caller's concern). */\nexport function padEndVisible(s: string, width: number): string {\n return s.length >= width ? s : s + ' '.repeat(width - s.length);\n}\n\n/** Format a count with thousands separators. */\nexport function formatCount(n: number): string {\n return groupThousands(Math.trunc(n).toString());\n}\n","/**\n * Pure rendering helpers. No I/O.\n * - renderText: sectioned, aligned, optionally colorized\n * - renderMarkdown: GitHub-flavored markdown (great for issues / PRs)\n * - renderJson: BigInt-safe JSON serializer\n *\n * This module is the `@vtx-labs/solana-explain/render` entry point.\n */\n\nimport type { Action, BalanceDelta, ExplainResult, RenderOptions } from '../types.js';\nimport { createStyler, stripAnsi } from './ansi.js';\nimport {\n formatBlockTime,\n formatCount,\n groupThousands,\n lamportsToSol,\n shortAddr,\n} from './format.js';\n\nexport { shouldUseColor, stripAnsi, createStyler } from './ansi.js';\nexport {\n lamportsToSol,\n formatUnits,\n signedUi,\n shortAddr,\n formatBlockTime,\n} from './format.js';\n\nconst INDENT = ' ';\n\n/** Render the human-readable, optionally colorized report. */\nexport function renderText(result: ExplainResult, opts: RenderOptions = {}): string {\n const s = createStyler(opts.color ?? false);\n const lines: string[] = [];\n\n if (opts.quiet) {\n return result.summary;\n }\n\n // Header line.\n const commitmentNote =\n result.source === 'simulation' ? 'simulation' : (result.commitment ?? 'confirmed');\n const when = formatBlockTime(result.blockTime);\n const headParts = [\n `Solana transaction`,\n commitmentNote,\n result.slot !== undefined ? `slot ${formatCount(result.slot)}` : undefined,\n when,\n ].filter(Boolean);\n lines.push('');\n lines.push(`${INDENT}${s.brand(headParts.join(' · '))}`);\n\n // Signature + status.\n const status = result.success ? s.green('✓ Success') : s.red('✗ Failed');\n if (result.signature) {\n lines.push(`${INDENT}${s.dim('Signature')} ${shortAddr(result.signature, 6, 6)} ${status}`);\n } else {\n lines.push(`${INDENT}${s.dim('Source')} ${result.source} ${status}`);\n }\n lines.push('');\n\n // Summary.\n lines.push(`${INDENT}${s.bold('Summary')} ${result.summary}`);\n\n if (!result.success && result.error) {\n lines.push(`${INDENT}${s.red('Error')} ${result.error.human}`);\n }\n\n // Balance changes.\n if (result.balanceChanges.length > 0) {\n lines.push('');\n lines.push(`${INDENT}${s.bold('Balance changes')}`);\n for (const d of groupBalances(result.balanceChanges, result.feePayer)) {\n const label = d.label;\n const focusTag =\n d.account === result.feePayer ? s.dim(' (fee payer)') : '';\n const colored = colorDelta(d.text, s);\n lines.push(`${INDENT}${INDENT}${padRight(label, 22)}${colored}${focusTag}`);\n }\n }\n\n // Actions.\n if (result.actions.length > 0) {\n lines.push('');\n lines.push(`${INDENT}${s.bold('Actions')}`);\n result.actions.forEach((a, i) => {\n lines.push(`${INDENT}${INDENT}${i + 1}. ${describeAction(a)}`);\n });\n }\n\n // Verbose: instruction tree.\n if (opts.verbose && result.instructions.length > 0) {\n lines.push('');\n lines.push(`${INDENT}${s.bold('Instructions')}`);\n for (const ix of result.instructions) {\n renderInstruction(ix, lines, s, 2);\n }\n }\n\n // Programs.\n if (result.programsInvoked.length > 0) {\n const names = result.programsInvoked\n .map((p) => p.name ?? shortAddr(p.programId))\n .filter((v, idx, arr) => arr.indexOf(v) === idx);\n lines.push('');\n lines.push(`${INDENT}${s.bold('Programs')} ${names.join(' · ')}`);\n }\n\n // Fee + compute.\n const feeStr = `${lamportsToSol(result.feeLamports)} SOL`;\n const computeStr =\n result.computeUnits !== undefined ? `${formatCount(result.computeUnits)} units` : 'n/a';\n lines.push(`${INDENT}${s.bold('Fee')} ${feeStr}${' '.repeat(8)}${s.bold('Compute')} ${computeStr}`);\n\n // Warnings.\n if (result.warnings.length > 0) {\n lines.push('');\n lines.push(`${INDENT}${s.yellow(`⚠ ${result.warnings.length} warning${result.warnings.length > 1 ? 's' : ''}`)}`);\n for (const w of result.warnings) {\n const at = w.instructionIndex !== undefined ? ` [ix #${w.instructionIndex}]` : '';\n lines.push(`${INDENT}${INDENT}${s.dim('·')} ${w.message}${s.dim(at)}`);\n }\n }\n\n lines.push('');\n return lines.join('\\n');\n}\n\nfunction renderInstruction(\n ix: ExplainResult['instructions'][number],\n lines: string[],\n s: ReturnType<typeof createStyler>,\n depth: number,\n): void {\n const pad = INDENT.repeat(depth);\n const name = ix.program ?? shortAddr(ix.programId);\n const type = ix.type ? `.${ix.type}` : '';\n const mark = ix.decoded ? '' : s.dim(' (not decoded)');\n lines.push(`${pad}${s.cyan(`#${ix.index}`)} ${name}${type}${mark}`);\n if (ix.args && Object.keys(ix.args).length > 0) {\n const argStr = Object.entries(ix.args)\n .map(([k, v]) => `${k}=${String(v)}`)\n .join(', ');\n lines.push(`${pad}${INDENT}${s.dim(argStr)}`);\n }\n if (ix.inner) {\n for (const inner of ix.inner) renderInstruction(inner, lines, s, depth + 1);\n }\n}\n\ninterface GroupedBalance {\n account: string;\n label: string;\n text: string;\n}\n\nfunction groupBalances(deltas: BalanceDelta[], feePayer: string): GroupedBalance[] {\n // Group by account; combine SOL + token deltas onto one line per account.\n const byAccount = new Map<string, BalanceDelta[]>();\n for (const d of deltas) {\n const list = byAccount.get(d.account) ?? [];\n list.push(d);\n byAccount.set(d.account, list);\n }\n const out: GroupedBalance[] = [];\n for (const [account, list] of byAccount) {\n const text = list.map((d) => d.uiDelta).join(' ');\n const isFee = account === feePayer;\n out.push({ account, label: shortAddr(account, 4, 4) + (isFee ? '' : ''), text });\n }\n return out;\n}\n\nfunction colorDelta(text: string, s: ReturnType<typeof createStyler>): string {\n return text\n .split(' ')\n .map((part) =>\n part.trim().startsWith('-') ? s.red(part) : part.trim().startsWith('+') ? s.green(part) : part,\n )\n .join(' ');\n}\n\nfunction padRight(str: string, width: number): string {\n const visible = stripAnsi(str);\n return visible.length >= width ? str : str + ' '.repeat(width - visible.length);\n}\n\n/** Human one-liner for an action. */\nexport function describeAction(a: Action): string {\n switch (a.kind) {\n case 'sol-transfer':\n return `Transfer ${a.sol} SOL ${shortAddr(a.from)} → ${shortAddr(a.to)}`;\n case 'token-transfer': {\n const sym = a.symbol ?? shortAddr(a.mint);\n const self = a.from === a.to ? ' (self-transfer)' : '';\n return `Transfer ${a.uiAmount} ${sym} ${shortAddr(a.from)} → ${shortAddr(a.to)}${self}`;\n }\n case 'mint':\n return `Mint ${a.uiAmount} of ${shortAddr(a.mint)} → ${shortAddr(a.to)}`;\n case 'burn':\n return `Burn ${a.uiAmount} of ${shortAddr(a.mint)} from ${shortAddr(a.from)}`;\n case 'account-created': {\n const as = a.as ? ` (${a.as})` : '';\n return `Create account ${shortAddr(a.address)}${as} owned by ${shortAddr(a.owner)}`;\n }\n case 'approval':\n if (a.revoke) return `Revoke delegate on ${shortAddr(a.owner)}`;\n return `Approve ${a.amount === 'unlimited' ? 'unlimited' : a.amount.toString()} to delegate ${shortAddr(a.delegate)}`;\n case 'close-account':\n return `Close account ${shortAddr(a.account)} → reclaim ${lamportsToSol(a.reclaimedLamports)} SOL to ${shortAddr(a.destination)}`;\n case 'memo':\n return `Memo: \"${a.text}\"`;\n case 'compute-budget': {\n const parts: string[] = [];\n if (a.unitLimit !== undefined) parts.push(`unit limit ${groupThousands(a.unitLimit.toString())}`);\n if (a.unitPriceMicroLamports !== undefined)\n parts.push(`price ${a.unitPriceMicroLamports.toString()} µ-lamports`);\n return `Set compute budget: ${parts.join(', ') || '(no-op)'}`;\n }\n case 'program-call': {\n const name = a.program ?? shortAddr(a.programId);\n const note = a.note ? ` — ${a.note}` : '';\n return `Call ${name}${a.instruction ? `.${a.instruction}` : ''}${note}`;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Markdown\n// ---------------------------------------------------------------------------\n\nexport function renderMarkdown(result: ExplainResult): string {\n const lines: string[] = [];\n lines.push(`### Solana transaction — ${result.success ? '✅ Success' : '❌ Failed'}`);\n lines.push('');\n if (result.signature) lines.push(`**Signature:** \\`${result.signature}\\` `);\n if (result.slot !== undefined) lines.push(`**Slot:** ${formatCount(result.slot)} `);\n const when = formatBlockTime(result.blockTime);\n if (when) lines.push(`**Time:** ${when} `);\n lines.push(`**Fee:** ${lamportsToSol(result.feeLamports)} SOL `);\n if (result.computeUnits !== undefined)\n lines.push(`**Compute:** ${formatCount(result.computeUnits)} units `);\n lines.push('');\n lines.push(`> ${result.summary}`);\n lines.push('');\n\n if (!result.success && result.error) {\n lines.push(`**Error:** ${result.error.human}`);\n lines.push('');\n }\n\n if (result.balanceChanges.length > 0) {\n lines.push('#### Balance changes');\n lines.push('');\n lines.push('| Account | Asset | Change |');\n lines.push('| --- | --- | --- |');\n for (const d of result.balanceChanges) {\n const asset =\n d.asset.kind === 'SOL'\n ? 'SOL'\n : `${d.asset.symbol ?? shortAddr(d.asset.mint)}`;\n lines.push(`| \\`${shortAddr(d.account, 6, 6)}\\` | ${asset} | ${d.uiDelta} |`);\n }\n lines.push('');\n }\n\n if (result.actions.length > 0) {\n lines.push('#### Actions');\n lines.push('');\n result.actions.forEach((a, i) => lines.push(`${i + 1}. ${describeAction(a)}`));\n lines.push('');\n }\n\n if (result.programsInvoked.length > 0) {\n lines.push('#### Programs');\n lines.push('');\n for (const p of result.programsInvoked) {\n lines.push(`- ${p.name ?? `\\`${p.programId}\\``} ×${p.count}`);\n }\n lines.push('');\n }\n\n if (result.warnings.length > 0) {\n lines.push('#### Warnings');\n lines.push('');\n for (const w of result.warnings) lines.push(`- ⚠️ ${w.message} \\`(${w.code})\\``);\n lines.push('');\n }\n\n return lines.join('\\n').trimEnd() + '\\n';\n}\n\n// ---------------------------------------------------------------------------\n// JSON (BigInt-safe)\n// ---------------------------------------------------------------------------\n\n/** Serialize an ExplainResult to JSON; BigInts become decimal strings. */\nexport function renderJson(result: ExplainResult, opts?: { pretty?: boolean }): string {\n const replacer = (_key: string, value: unknown): unknown =>\n typeof value === 'bigint' ? value.toString() : value;\n return JSON.stringify(result, replacer, opts?.pretty ? 2 : undefined);\n}\n"]}
|