From 5465d8420e18ebf44a8b5dcc923bd517d207bd0d Mon Sep 17 00:00:00 2001 From: aoikurokawa Date: Wed, 29 Apr 2026 04:19:09 +0900 Subject: [PATCH 1/3] feat: cli log --- clients/js/src/cli/utils.ts | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/clients/js/src/cli/utils.ts b/clients/js/src/cli/utils.ts index a034113..19942b7 100644 --- a/clients/js/src/cli/utils.ts +++ b/clients/js/src/cli/utils.ts @@ -4,6 +4,7 @@ import path from 'path'; import { Account, + AccountRole, Address, address, Commitment, @@ -32,7 +33,7 @@ import { import { Command } from 'commander'; import picocolors from 'picocolors'; import { parse as parseYaml } from 'yaml'; -import { Buffer, DataSource, fetchBuffer, Format, Seed } from '../generated'; +import { Buffer, DataSource, Encoding, fetchBuffer, Format, Seed } from '../generated'; import { createDefaultTransactionPlannerAndExecutor, getPdaDetails, PdaDetails } from '../internals'; import { decodeData, packDirectData, PackedData, packExternalData, packUrlData } from '../packData'; import { logErrorAndExit, logExports, logSuccess, logWarning } from './logs'; @@ -115,18 +116,42 @@ async function exportTransactionPlan( const { value: latestBlockhash } = await client.rpc.getLatestBlockhash().send(); for (let i = 0; i < singleTransactions.length; i++) { - const transaction = pipe( + const message = pipe( singleTransactions[i].message, m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m), m => removeComputeUnitLimitInstruction(m), - compileTransaction, ); + logInstructions(message); + const transaction = compileTransaction(message); const encodedTransaction = decodeData(transactionEncoder.encode(transaction), options.exportEncoding); const prefix = picocolors.yellow(`[Transaction #${i + 1}]`); console.log(`${prefix}\n${encodedTransaction}\n`); } } +function logInstructions(message: TransactionMessage): void { + message.instructions.forEach((ix, i) => { + console.log(picocolors.cyan(`\n------ IX #${i + 1} ------\n`)); + console.log(`${ix.programAddress}\n`); + + (ix.accounts ?? []).forEach(account => { + const isWritable = + account.role === AccountRole.WRITABLE || account.role === AccountRole.WRITABLE_SIGNER; + const isSigner = + account.role === AccountRole.READONLY_SIGNER || account.role === AccountRole.WRITABLE_SIGNER; + const writable = isWritable ? 'W' : ''; + const signer = isSigner ? 'S' : ''; + console.log(`${String(account.address).padEnd(44)} ${writable.padStart(2)} ${signer.padStart(1)}`); + }); + + console.log(''); + + if (ix.data && ix.data.length > 0) { + console.log(`${decodeData(ix.data, Encoding.Base58)}\n`); + } + }); +} + function removeComputeUnitLimitInstruction< TTransactionMessage extends TransactionMessage & TransactionMessageWithFeePayer, >(message: TTransactionMessage): TTransactionMessage { From a15b3cbfe28b6397ce368833bee7aa244daac64d Mon Sep 17 00:00:00 2001 From: aoikurokawa Date: Thu, 30 Apr 2026 04:03:06 +0900 Subject: [PATCH 2/3] fix: update --- clients/js/src/cli/utils.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clients/js/src/cli/utils.ts b/clients/js/src/cli/utils.ts index 19942b7..89633c9 100644 --- a/clients/js/src/cli/utils.ts +++ b/clients/js/src/cli/utils.ts @@ -121,11 +121,12 @@ async function exportTransactionPlan( m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m), m => removeComputeUnitLimitInstruction(m), ); - logInstructions(message); const transaction = compileTransaction(message); const encodedTransaction = decodeData(transactionEncoder.encode(transaction), options.exportEncoding); const prefix = picocolors.yellow(`[Transaction #${i + 1}]`); - console.log(`${prefix}\n${encodedTransaction}\n`); + console.log(`\n${prefix}`); + logInstructions(message); + console.log(`${picocolors.yellow('Encoded:')}\n${encodedTransaction}\n`); } } From 095d4460c40a313252daf7da09d5a848c6f76b70 Mon Sep 17 00:00:00 2001 From: aoikurokawa Date: Sun, 10 May 2026 01:56:56 +0900 Subject: [PATCH 3/3] fix: add new export --- clients/js/src/cli/logs.ts | 22 ++++++++++++++-------- clients/js/src/cli/options.ts | 11 +++++++---- clients/js/src/cli/utils.ts | 16 +++++++++------- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/clients/js/src/cli/logs.ts b/clients/js/src/cli/logs.ts index 3858ffc..7b27df6 100644 --- a/clients/js/src/cli/logs.ts +++ b/clients/js/src/cli/logs.ts @@ -4,6 +4,7 @@ import { Transform } from 'node:stream'; import picocolors from 'picocolors'; import { Encoding } from '../generated'; +import type { ExportEncoding } from './options'; export function logCommand(message: string, data: Record = {}): void { console.log(''); @@ -24,17 +25,22 @@ export function logCommand(message: string, data: Record', - 'Describes how to encode exported transactions.', + 'Describes how to encode exported transactions. Use "instruction-list" to print a human-readable list of instructions instead of the raw transaction bytes.', ) - .choices(['none', 'utf8', 'base58', 'base64']) + .choices(['none', 'utf8', 'base58', 'base64', 'instruction-list']) .default(Encoding.Base64, 'base64') - .argParser(encodingParser); + .argParser( + (value: string): ExportEncoding => (value === 'instruction-list' ? 'instruction-list' : encodingParser(value)), + ); export type WriteOptions = TextOption & UrlOption & diff --git a/clients/js/src/cli/utils.ts b/clients/js/src/cli/utils.ts index 89633c9..f016f5f 100644 --- a/clients/js/src/cli/utils.ts +++ b/clients/js/src/cli/utils.ts @@ -121,12 +121,15 @@ async function exportTransactionPlan( m => setTransactionMessageLifetimeUsingBlockhash(latestBlockhash, m), m => removeComputeUnitLimitInstruction(m), ); - const transaction = compileTransaction(message); - const encodedTransaction = decodeData(transactionEncoder.encode(transaction), options.exportEncoding); const prefix = picocolors.yellow(`[Transaction #${i + 1}]`); - console.log(`\n${prefix}`); - logInstructions(message); - console.log(`${picocolors.yellow('Encoded:')}\n${encodedTransaction}\n`); + if (options.exportEncoding === 'instruction-list') { + console.log(`\n${prefix}`); + logInstructions(message); + } else { + const transaction = compileTransaction(message); + const encodedTransaction = decodeData(transactionEncoder.encode(transaction), options.exportEncoding); + console.log(`${prefix}\n${encodedTransaction}\n`); + } } } @@ -136,8 +139,7 @@ function logInstructions(message: TransactionMessage): void { console.log(`${ix.programAddress}\n`); (ix.accounts ?? []).forEach(account => { - const isWritable = - account.role === AccountRole.WRITABLE || account.role === AccountRole.WRITABLE_SIGNER; + const isWritable = account.role === AccountRole.WRITABLE || account.role === AccountRole.WRITABLE_SIGNER; const isSigner = account.role === AccountRole.READONLY_SIGNER || account.role === AccountRole.WRITABLE_SIGNER; const writable = isWritable ? 'W' : '';