@thawgate/cli 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/commands.ts","../src/config.ts","../src/logger.ts","../src/utils.ts","../src/gate.ts"],"sourcesContent":["/**\n * @module thawgate CLI\n * @description Command-line interface for ThawGate (@thawgate/sdk): Token ACL gate policies, SSS-ACL stablecoins\n * (sss-token is the example issuer) and SAS credentials. Devnet program IDs are the defaults.\n *\n * Usage:\n * thawgate create-stablecoin --name \"USD Stablecoin\" --symbol USDS --blacklist on \\\n * --sas-credential <pubkey> --sas-schema <pubkey> --min-kyc 1 --reserves 1000000000000 --report-uri https://...\n * thawgate explain --mint <pubkey> --wallet <pubkey>\n * thawgate unlock --mint <pubkey> --owner <pubkey>\n * thawgate freeze-if-invalid --token-account <pubkey>\n * thawgate policy show|init|update|setup-extra-metas --mint <pubkey> ...\n * thawgate swap-gate --mint <pubkey> --sas-credential <pubkey> --sas-schema <pubkey> --confirm\n * thawgate sas create-credential|create-schema|attest|revoke ...\n * thawgate mint --mint <pubkey> --recipient <pubkey> --amount 1000000\n * thawgate blacklist --mint <pubkey> --target <wallet> --reason \"...\" [--token-account <pubkey>] --confirm\n * thawgate status --mint <pubkey>\n */\n\nimport { Command } from \"commander\";\nimport { parseGateLogs } from \"@thawgate/sdk\";\nimport { registerCommands } from \"./commands\";\nimport { registerGateCommands } from \"./gate\";\n\nconst program = new Command();\n\nprogram\n .name(\"thawgate\")\n .description(\"ThawGate CLI: Token ACL gate policies, SSS-ACL stablecoins and SAS credentials (devnet IDs by default)\")\n .version(\"0.1.0\")\n .option(\"--rpc-url <url>\", \"Solana RPC endpoint URL (or SSS_RPC_URL; default devnet)\")\n .option(\"--commitment <level>\", \"Commitment level\", \"confirmed\")\n .option(\"--keypair <path>\", \"Path to keypair file (or SSS_KEYPAIR_PATH; default ~/.config/solana/id.json)\")\n .option(\"--json\", \"Output in JSON format (progress lines go to stderr)\")\n .option(\"--verbose\", \"Enable verbose logging\");\n\nregisterGateCommands(program);\nregisterCommands(program);\n\nprogram.parseAsync(process.argv).catch((err) => {\n console.error(\"Error:\", err.message);\n // A refused transaction: show the gate's own decision line if it logged one.\n const logs: string[] | undefined = err?.logs ?? err?.transactionLogs;\n const decision = logs ? parseGateLogs(logs).decision : null;\n if (decision) console.error(`Gate: TG:${decision.kind}:${decision.code}`);\n if (logs && program.opts().verbose) console.error(logs.join(\"\\n\"));\n process.exit(1);\n});\n","/**\n * @module commands\n * @description All CLI command implementations.\n *\n * Fixes applied:\n * HIGH-001: Renamed 'initialize' → 'init', 'info' → 'status'\n * HIGH-002: Added supply, minters, holders, seize, audit-log, config commands\n * HIGH-003: Added --confirm guard to all destructive commands\n * HIGH-004: Added --dry-run flag to mint, burn, freeze, thaw\n * MED-004: Added SSS-2 compliance warning prompt on init\n */\n\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as readline from \"readline\";\nimport { Command } from \"commander\";\nimport { PublicKey, Keypair, Connection, Transaction, sendAndConfirmTransaction } from \"@solana/web3.js\";\nimport { TOKEN_2022_PROGRAM_ID } from \"@solana/spl-token\";\nimport { BN } from \"@coral-xyz/anchor\";\nimport {\n SolanaStablecoin,\n sss1Preset,\n sss2Preset,\n RoleType,\n QuotaPeriod,\n} from \"@thawgate/sdk\";\nimport { loadConfig, loadKeypair, saveConfig } from \"./config\";\nimport { Logger } from \"./logger\";\nimport { simulateTransaction } from \"./utils\";\n\n/**\n * Creates a configured SDK client from CLI options. Program IDs default to the SDK's (the devnet deployments) unless\n * SSS_PROGRAM_ID / SSS_HOOK_PROGRAM_ID or the config file set them.\n */\nexport function createClient(opts: Record<string, unknown>): {\n client: SolanaStablecoin;\n keypair: Keypair;\n logger: Logger;\n connection: Connection;\n} {\n const config = loadConfig({\n rpcUrl: opts.rpcUrl as string | undefined,\n commitment: opts.commitment as \"confirmed\" | undefined,\n keypairPath: opts.keypair as string | undefined,\n });\n\n // Commander passes flags as booleans (a string comparison here kept --json and --verbose off before S11).\n const logger = new Logger(Boolean(opts.verbose), Boolean(opts.json));\n const keypairBytes = loadKeypair(config.keypairPath);\n const keypair = Keypair.fromSecretKey(keypairBytes);\n\n const connection = new Connection(config.rpcUrl, config.commitment);\n const client = SolanaStablecoin.fromConfig(\n {\n rpcUrl: config.rpcUrl,\n commitment: config.commitment,\n programId: config.programId ? new PublicKey(config.programId) : undefined,\n hookProgramId: config.hookProgramId ? new PublicKey(config.hookProgramId) : undefined,\n },\n keypair,\n );\n\n return { client, keypair, logger, connection };\n}\n\n/**\n * Prompts the user to confirm SSS-2 deployment and its irreversible implications.\n * Returns true if the user types 'yes', false otherwise.\n */\nasync function confirmSSS2Warning(): Promise<boolean> {\n const rl = readline.createInterface({ input: process.stdin, output: process.stdout });\n return new Promise(resolve => {\n console.log('\\n⚠️ WARNING: SSS-2 Compliance Notice');\n console.log('─'.repeat(60));\n console.log('SSS-2 enables PERMANENT DELEGATE and TRANSFER HOOK extensions.');\n console.log('These extensions are IMMUTABLE after initialization.');\n console.log('Once enabled, they CANNOT be disabled without migrating');\n console.log('all token holders to a new mint.');\n console.log('');\n console.log('Ensure you understand the compliance implications before');\n console.log('deploying this token in a production environment.');\n console.log('─'.repeat(60));\n rl.question(\"Type 'yes' to continue, anything else to cancel: \", (answer: string) => {\n rl.close();\n resolve(answer.toLowerCase() === 'yes');\n });\n });\n}\n\n/**\n * Writes an entry to the local audit log file.\n */\nfunction auditLog(entry: Record<string, unknown>): void {\n const config = loadConfig({});\n const logPath = (config as unknown as Record<string, string>).auditLogPath || `${os.homedir()}/.thawgate/audit.log`;\n const dir = logPath.substring(0, logPath.lastIndexOf('/'));\n if (dir && !fs.existsSync(dir)) {\n fs.mkdirSync(dir, { recursive: true });\n }\n const line = JSON.stringify({ ...entry, timestamp: new Date().toISOString() }) + '\\n';\n fs.appendFileSync(logPath, line, 'utf-8');\n}\n\n/**\n * Registers all CLI commands.\n */\nexport function registerCommands(program: Command): void {\n // ========================================================================\n // Initialize (HIGH-001: renamed from 'initialize' to 'init')\n // ========================================================================\n program\n .command(\"init\")\n .description(\"Initialize a new SSS stablecoin\")\n .option(\"--name <name>\", \"Stablecoin name (max 32 chars)\")\n .option(\"--symbol <symbol>\", \"Token symbol (max 10 chars)\")\n .option(\"--uri <uri>\", \"Metadata URI\")\n .option(\"--decimals <n>\", \"Decimal places\", \"6\")\n .option(\"--preset <preset>\", \"Preset: sss1 or sss2\", \"sss1\")\n .option(\"--custom <path>\", \"Path to custom config file (.toml or .json)\")\n .option(\"--hook-program <pubkey>\", \"Transfer hook program ID (SSS-2)\")\n .option(\"--confirm\", \"Skip confirmation prompt\")\n .action(async (opts) => {\n // FIX-P4-01: --custom config support\n if (opts.custom && opts.preset && opts.preset !== \"sss1\") {\n console.error(\"❌ Cannot use --custom and --preset together\");\n process.exit(1);\n }\n\n let name = opts.name;\n let symbol = opts.symbol;\n let uri = opts.uri;\n let decimals = parseInt(opts.decimals, 10);\n let preset = opts.preset;\n\n if (opts.custom) {\n // Load config from file\n const { extname } = require(\"path\");\n const raw = fs.readFileSync(opts.custom, \"utf-8\");\n const ext = extname(opts.custom).toLowerCase();\n\n let customConfig: Record<string, any>;\n if (ext === \".toml\") {\n try {\n const toml = require(\"@iarna/toml\");\n customConfig = toml.parse(raw);\n } catch {\n // Fallback: simple TOML key=value parser\n customConfig = {};\n for (const line of raw.split(\"\\n\")) {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\") || trimmed.startsWith(\"[\")) continue;\n const eqIdx = trimmed.indexOf(\"=\");\n if (eqIdx === -1) continue;\n const key = trimmed.slice(0, eqIdx).trim();\n let value = trimmed.slice(eqIdx + 1).trim();\n // Remove quotes\n if ((value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))) {\n value = value.slice(1, -1);\n }\n // Parse booleans and numbers\n if (value === \"true\") customConfig[key] = true;\n else if (value === \"false\") customConfig[key] = false;\n else if (/^\\d+$/.test(value)) customConfig[key] = parseInt(value, 10);\n else customConfig[key] = value;\n }\n }\n } else {\n customConfig = JSON.parse(raw);\n }\n\n console.log(`Loading custom config from ${opts.custom}`);\n console.log(\"Config:\", JSON.stringify(customConfig, null, 2));\n\n // Validate required fields\n if (!customConfig.name || !customConfig.symbol) {\n console.error(\"❌ Custom config must include: name, symbol\");\n process.exit(1);\n }\n\n name = customConfig.name;\n symbol = customConfig.symbol;\n uri = customConfig.uri || opts.uri || \"\";\n decimals = customConfig.decimals ?? decimals;\n if (customConfig.preset) preset = customConfig.preset;\n }\n preset = parsePreset(preset);\n\n if (!name || !symbol) {\n console.error(\"❌ --name and --symbol are required (or provide --custom <path>)\");\n process.exit(1);\n }\n\n // MED-004: SSS-2 compliance warning prompt\n if (preset === \"sss2\" && !opts.confirm) {\n const confirmed = await confirmSSS2Warning();\n if (!confirmed) {\n console.log(\"Initialization cancelled.\");\n process.exit(0);\n }\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n\n const args =\n preset === \"sss2\"\n ? sss2Preset(\n name,\n symbol,\n uri || \"\",\n new PublicKey(opts.hookProgram),\n decimals,\n )\n : sss1Preset(name, symbol, uri || \"\", decimals);\n\n logger.info(`Initializing ${preset.toUpperCase()} stablecoin: ${name}`);\n\n const { instructions, mint, mintKeypair } = await client.initialize(\n keypair.publicKey,\n args,\n );\n\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair, mintKeypair]);\n\n logger.transaction(\"init\", sig, {\n mint: mint.toBase58(),\n preset,\n custom: opts.custom || undefined,\n });\n logger.output({ mint: mint.toBase58(), signature: sig });\n auditLog({ command: 'init', mint: mint.toBase58(), preset, custom: opts.custom, result: sig });\n });\n\n // ========================================================================\n // Mint (HIGH-004: added --dry-run)\n // ========================================================================\n program\n .command(\"mint\")\n .description(\"Mint tokens to a recipient\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--recipient <pubkey>\", \"Recipient wallet address\")\n .requiredOption(\"--amount <amount>\", \"Amount to mint (raw units)\")\n .option(\"--dry-run\", \"Simulate the transaction without submitting\")\n .option(\"--memo <memo>\", \"Optional memo\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n\n const mint = new PublicKey(opts.mint);\n const recipient = new PublicKey(opts.recipient);\n const amount = new BN(opts.amount);\n\n const instructions = await client.mintTokens(mint, keypair.publicKey, recipient, amount);\n const tx = new Transaction().add(...instructions);\n\n if (opts.dryRun) {\n await simulateTransaction(connection, tx, [keypair]);\n return;\n }\n\n logger.info(`Minting ${opts.amount} tokens to ${recipient.toBase58()}`);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"mint\", sig, {\n mint: mint.toBase58(),\n recipient: recipient.toBase58(),\n amount: opts.amount,\n });\n auditLog({ command: 'mint', mint: mint.toBase58(), recipient: recipient.toBase58(), amount: opts.amount, result: sig });\n });\n\n // ========================================================================\n // Burn (HIGH-004: added --dry-run)\n // ========================================================================\n program\n .command(\"burn\")\n .description(\"Burn tokens from your account\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--amount <amount>\", \"Amount to burn (raw units)\")\n .option(\"--dry-run\", \"Simulate the transaction without submitting\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n\n const mint = new PublicKey(opts.mint);\n const amount = new BN(opts.amount);\n\n const instructions = await client.burnTokens(mint, keypair.publicKey, amount);\n const tx = new Transaction().add(...instructions);\n\n if (opts.dryRun) {\n await simulateTransaction(connection, tx, [keypair]);\n return;\n }\n\n logger.info(`Burning ${opts.amount} tokens`);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"burn\", sig, { mint: mint.toBase58(), amount: opts.amount });\n auditLog({ command: 'burn', mint: mint.toBase58(), amount: opts.amount, result: sig });\n });\n\n // ========================================================================\n // Freeze / Thaw (HIGH-003: added --confirm; HIGH-004: added --dry-run)\n // ========================================================================\n program\n .command(\"freeze\")\n .description(\"Freeze a token account\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--target <pubkey>\", \"Target token account to freeze\")\n .option(\"--dry-run\", \"Simulate the transaction without submitting\")\n .option(\"--confirm\", \"Confirm this irreversible action\")\n .action(async (opts) => {\n if (!opts.confirm && !opts.dryRun) {\n console.error(\n `ERROR: Freeze is irreversible.\\nRe-run with --confirm to proceed:\\n thawgate freeze --mint ${opts.mint} --target ${opts.target} --confirm`\n );\n process.exit(1);\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const target = new PublicKey(opts.target);\n\n const instructions = await client.freezeAccount(mint, keypair.publicKey, target);\n const tx = new Transaction().add(...instructions);\n\n if (opts.dryRun) {\n await simulateTransaction(connection, tx, [keypair]);\n return;\n }\n\n logger.info(`Freezing token account ${target.toBase58()}`);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"freeze\", sig, { target: target.toBase58() });\n auditLog({ command: 'freeze', mint: mint.toBase58(), target: target.toBase58(), result: sig });\n });\n\n program\n .command(\"thaw\")\n .description(\"Thaw a frozen token account\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--target <pubkey>\", \"Target token account to thaw\")\n .option(\"--dry-run\", \"Simulate the transaction without submitting\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n\n const mint = new PublicKey(opts.mint);\n const target = new PublicKey(opts.target);\n\n const instructions = await client.thawAccount(mint, keypair.publicKey, target);\n const tx = new Transaction().add(...instructions);\n\n if (opts.dryRun) {\n await simulateTransaction(connection, tx, [keypair]);\n return;\n }\n\n logger.info(`Thawing token account ${target.toBase58()}`);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"thaw\", sig, { target: target.toBase58() });\n auditLog({ command: 'thaw', mint: mint.toBase58(), target: target.toBase58(), result: sig });\n });\n\n // ========================================================================\n // Pause / Unpause\n // ========================================================================\n program\n .command(\"pause\")\n .description(\"Pause all token operations\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n\n logger.info(\"Pausing token operations\");\n\n const instructions = await client.pause(mint, keypair.publicKey);\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"pause\", sig, { mint: mint.toBase58() });\n auditLog({ command: 'pause', mint: mint.toBase58(), result: sig });\n });\n\n program\n .command(\"unpause\")\n .description(\"Resume token operations\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n\n logger.info(\"Resuming token operations\");\n\n const instructions = await client.unpause(mint, keypair.publicKey);\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"unpause\", sig, { mint: mint.toBase58() });\n auditLog({ command: 'unpause', mint: mint.toBase58(), result: sig });\n });\n\n // ========================================================================\n // Roles\n // ========================================================================\n program\n .command(\"grant-role\")\n .description(\"Grant a role to a wallet\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--holder <pubkey>\", \"Wallet to grant role to\")\n .requiredOption(\"--role <role>\", \"Role: minter, burner, pauser, blacklister, seizer\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const holder = new PublicKey(opts.holder);\n const role = parseRoleType(opts.role);\n\n logger.info(`Granting ${opts.role} role to ${holder.toBase58()}`);\n\n const instructions = await client.updateRoles(mint, keypair.publicKey, holder, role, true);\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"grant-role\", sig, {\n holder: holder.toBase58(),\n role: opts.role,\n });\n auditLog({ command: 'grant-role', mint: mint.toBase58(), holder: holder.toBase58(), role: opts.role, result: sig });\n });\n\n program\n .command(\"revoke-role\")\n .description(\"Revoke a role from a wallet\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--holder <pubkey>\", \"Wallet to revoke role from\")\n .requiredOption(\"--role <role>\", \"Role: minter, burner, pauser, blacklister, seizer\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const holder = new PublicKey(opts.holder);\n const role = parseRoleType(opts.role);\n\n logger.info(`Revoking ${opts.role} role from ${holder.toBase58()}`);\n\n const instructions = await client.updateRoles(mint, keypair.publicKey, holder, role, false);\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"revoke-role\", sig, {\n holder: holder.toBase58(),\n role: opts.role,\n });\n auditLog({ command: 'revoke-role', mint: mint.toBase58(), holder: holder.toBase58(), role: opts.role, result: sig });\n });\n\n // ========================================================================\n // Roles (NEW-002: spec-required `roles` parent command with subcommands)\n // Provides thawgate roles grant / thawgate roles revoke interface.\n // The top-level grant-role / revoke-role commands above are kept for\n // backward compatibility.\n // ========================================================================\n const rolesCmd = program\n .command(\"roles\")\n .description(\"Manage roles (grant or revoke). Use: roles grant | roles revoke\");\n\n rolesCmd\n .command(\"grant\")\n .description(\"Grant a role to a wallet\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--holder <pubkey>\", \"Wallet to grant role to\")\n .requiredOption(\"--role <role>\", \"Role: minter, burner, pauser, blacklister, seizer\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const holder = new PublicKey(opts.holder);\n const role = parseRoleType(opts.role);\n\n logger.info(`Granting ${opts.role} role to ${holder.toBase58()}`);\n\n const instructions = await client.updateRoles(mint, keypair.publicKey, holder, role, true);\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"roles grant\", sig, {\n holder: holder.toBase58(),\n role: opts.role,\n });\n auditLog({ command: 'roles grant', mint: mint.toBase58(), holder: holder.toBase58(), role: opts.role, result: sig });\n });\n\n rolesCmd\n .command(\"revoke\")\n .description(\"Revoke a role from a wallet\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--holder <pubkey>\", \"Wallet to revoke role from\")\n .requiredOption(\"--role <role>\", \"Role: minter, burner, pauser, blacklister, seizer\")\n .action(async (opts) => {\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const holder = new PublicKey(opts.holder);\n const role = parseRoleType(opts.role);\n\n logger.info(`Revoking ${opts.role} role from ${holder.toBase58()}`);\n\n const instructions = await client.updateRoles(mint, keypair.publicKey, holder, role, false);\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"roles revoke\", sig, {\n holder: holder.toBase58(),\n role: opts.role,\n });\n auditLog({ command: 'roles revoke', mint: mint.toBase58(), holder: holder.toBase58(), role: opts.role, result: sig });\n });\n\n rolesCmd\n .command(\"list\")\n .description(\"List all active role assignments\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n const { client } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n\n // Fetch all RoleRecord accounts on-chain for this mint\n const allRoles = await (client.program.account as any).roleRecord.all([\n { memcmp: { offset: 8, bytes: mint.toBase58() } },\n ]);\n const active = allRoles\n .map((r: any) => r.account)\n .filter((r: any) => r.active);\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: active, error: null }));\n } else {\n if (active.length === 0) {\n console.log(\"No active role assignments.\");\n } else {\n active.forEach((r: any) => {\n console.log(`${r.holder.toBase58()} role: ${Object.keys(r.role)[0]}`);\n });\n }\n }\n });\n\n program\n .command(\"transfer-authority\")\n .description(\"Transfer MasterAuthority to a new wallet\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--new-authority <pubkey>\", \"New MasterAuthority wallet\")\n .option(\"--confirm\", \"Confirm this irreversible action\")\n .action(async (opts) => {\n // HIGH-003: --confirm guard\n if (!opts.confirm) {\n console.error(\n `ERROR: Transferring authority is irreversible without a follow-up transfer-back.\\nRe-run with --confirm to proceed:\\n thawgate transfer-authority --mint ${opts.mint} --new-authority ${opts.newAuthority} --confirm`\n );\n process.exit(1);\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const newAuthority = new PublicKey(opts.newAuthority);\n\n logger.info(`Transferring authority to ${newAuthority.toBase58()}`);\n\n const instructions = await client.transferAuthority(\n mint,\n keypair.publicKey,\n newAuthority,\n );\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"transfer-authority\", sig, {\n newAuthority: newAuthority.toBase58(),\n });\n auditLog({ command: 'transfer-authority', mint: mint.toBase58(), newAuthority: newAuthority.toBase58(), result: sig });\n });\n\n // ========================================================================\n // Compliance (SSS-2) — HIGH-003: --confirm on blacklist/unblacklist\n // ========================================================================\n program\n .command(\"blacklist\")\n .description(\"Add a wallet to the blacklist (Blacklister role); on Token ACL mints its passed account is frozen too\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--target <pubkey>\", \"Wallet to blacklist\")\n .requiredOption(\"--reason <reason>\", \"Reason for blacklisting\")\n .option(\"--token-account <pubkey>\", \"A token account owned by the target (default: its associated token account)\")\n .option(\"--confirm\", \"Confirm this irreversible action\")\n .action(async (opts) => {\n // HIGH-003: --confirm guard\n if (!opts.confirm) {\n console.error(\n `ERROR: Blacklisting is irreversible without a separate unblacklist operation.\\nRe-run with --confirm to proceed:\\n thawgate blacklist --mint ${opts.mint} --target ${opts.target} --reason \"${opts.reason}\" --confirm`\n );\n process.exit(1);\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const target = new PublicKey(opts.target);\n\n logger.info(`Blacklisting ${target.toBase58()}: ${opts.reason}`);\n\n const compliance = client.compliance(mint);\n const instructions = await compliance.addToBlacklist(\n keypair.publicKey,\n target,\n opts.reason,\n { targetTokenAccount: opts.tokenAccount ? new PublicKey(opts.tokenAccount) : undefined },\n );\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"blacklist\", sig, {\n target: target.toBase58(),\n reason: opts.reason,\n });\n auditLog({ command: 'blacklist', mint: mint.toBase58(), target: target.toBase58(), reason: opts.reason, result: sig });\n });\n\n program\n .command(\"unblacklist\")\n .description(\"Remove a wallet from the blacklist (SSS-2)\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--target <pubkey>\", \"Wallet to remove from blacklist\")\n .option(\"--confirm\", \"Confirm this action\")\n .action(async (opts) => {\n // HIGH-003: --confirm guard\n if (!opts.confirm) {\n console.error(\n `ERROR: Confirm required for this operation.\\nRe-run with --confirm:\\n thawgate unblacklist --mint ${opts.mint} --target ${opts.target} --confirm`\n );\n process.exit(1);\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const target = new PublicKey(opts.target);\n\n logger.info(`Removing ${target.toBase58()} from blacklist`);\n\n const compliance = client.compliance(mint);\n const instructions = await compliance.removeFromBlacklist(\n keypair.publicKey,\n target,\n );\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"unblacklist\", sig, { target: target.toBase58() });\n auditLog({ command: 'unblacklist', mint: mint.toBase58(), target: target.toBase58(), result: sig });\n });\n\n // ========================================================================\n // Seize (HIGH-002: new command)\n // ========================================================================\n program\n .command(\"seize\")\n .description(\"Seize tokens from a blacklisted frozen account (SSS-2 only)\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--source <pubkey>\", \"Source token account (ATA) to seize from\")\n .requiredOption(\"--source-authority <pubkey>\", \"Wallet that owns the source token account (the blacklisted address)\")\n .requiredOption(\"--treasury <pubkey>\", \"Treasury token account (ATA) to receive seized tokens\")\n .option(\"--confirm\", \"Confirm this irreversible action\")\n .action(async (opts) => {\n if (!opts.confirm) {\n console.error(\n `ERROR: Seize is irreversible. Re-run with --confirm to proceed:\\n thawgate seize --mint ${opts.mint} --source ${opts.source} --source-authority ${opts.sourceAuthority} --treasury ${opts.treasury} --confirm`\n );\n process.exit(1);\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const sourceAccount = new PublicKey(opts.source);\n const sourceAuthority = new PublicKey(opts.sourceAuthority);\n const treasuryAccount = new PublicKey(opts.treasury);\n\n logger.info(`Seizing tokens from ${sourceAccount.toBase58()} to ${treasuryAccount.toBase58()}`);\n\n const compliance = client.compliance(mint);\n const instructions = await compliance.seize(\n keypair.publicKey,\n sourceAuthority,\n sourceAccount,\n treasuryAccount,\n );\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n logger.transaction(\"seize\", sig, {\n source: sourceAccount.toBase58(),\n treasury: treasuryAccount.toBase58(),\n });\n auditLog({ command: 'seize', mint: mint.toBase58(), source: sourceAccount.toBase58(), treasury: treasuryAccount.toBase58(), result: sig });\n });\n\n // ========================================================================\n // Supply (HIGH-002: new command)\n // ========================================================================\n program\n .command(\"supply\")\n .description(\"Display the current total token supply\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n const { client, logger } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n\n const config = await client.getConfig(mint);\n const supply = config.totalMinted;\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: { supply: supply.toString(), totalMinted: config.totalMinted.toString(), totalBurned: config.totalBurned.toString() }, error: null }));\n } else {\n console.log(`Total Minted: ${config.totalMinted.toString()}`);\n console.log(`Total Burned: ${config.totalBurned.toString()}`);\n console.log(`Net Supply: ${supply.toString()}`);\n }\n });\n\n // ========================================================================\n // Minters (HIGH-002: new command with subcommands)\n // ========================================================================\n const mintersCmd = program.command(\"minters\").description(\"Manage minter roles\");\n\n mintersCmd\n .command(\"list\")\n .description(\"List all active minters and their quotas\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .option(\"--json\", \"Output as JSON\")\n .action(async (opts) => {\n const { client } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n\n // Fetch all RoleRecord accounts on-chain and filter for active Minters\n const allRoles = await (client.program.account as any).roleRecord.all([\n { memcmp: { offset: 8, bytes: mint.toBase58() } },\n ]);\n const minterRoles = allRoles\n .map((r: any) => r.account)\n .filter((r: any) => r.active && Object.keys(r.role)[0] === 'minter');\n\n if (opts.json) {\n console.log(JSON.stringify({ success: true, data: minterRoles, error: null }));\n } else {\n if (minterRoles.length === 0) {\n console.log(\"No active minters.\");\n } else {\n minterRoles.forEach((m: any) => {\n console.log(`${m.holder.toBase58()} limit: ${m.limit?.toString() || 'unlimited'}`);\n });\n }\n }\n });\n\n mintersCmd\n .command(\"add <address>\")\n .description(\"Add a minter role\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--limit <amount>\", \"Minting quota limit (0 = unlimited)\")\n .option(\"--period <period>\", \"Quota period: daily|weekly|monthly|lifetime\", \"lifetime\")\n .option(\"--confirm\", \"Confirm the action\")\n .action(async (address: string, opts) => {\n if (!opts.confirm) {\n console.error(\"Error: --confirm flag required for this operation\");\n process.exit(1);\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const holder = new PublicKey(address);\n\n const instructions = await client.updateMinter(\n mint,\n keypair.publicKey,\n holder,\n new BN(opts.limit),\n parseQuotaPeriod(opts.period),\n );\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n console.log(`Minter added. TX: ${sig}`);\n auditLog({ command: 'minters add', address, limit: opts.limit, result: sig });\n });\n\n mintersCmd\n .command(\"remove <address>\")\n .description(\"Remove a minter role\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .option(\"--confirm\", \"Confirm the action\")\n .action(async (address: string, opts) => {\n if (!opts.confirm) {\n console.error(\"Error: --confirm flag required for this operation\");\n process.exit(1);\n }\n\n const { client, keypair, logger, connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n const holder = new PublicKey(address);\n\n const instructions = await client.updateRoles(mint, keypair.publicKey, holder, RoleType.Minter, false);\n const tx = new Transaction().add(...instructions);\n const sig = await sendAndConfirmTransaction(connection, tx, [keypair]);\n\n console.log(`Minter removed. TX: ${sig}`);\n auditLog({ command: 'minters remove', address, result: sig });\n });\n\n // ========================================================================\n // Holders (HIGH-002: new command)\n // ========================================================================\n program\n .command(\"holders\")\n .description(\"List token holders\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .option(\"--min-balance <amount>\", \"Minimum balance filter\", \"0\")\n .option(\"--format <format>\", \"Output format: table|json|csv\", \"table\")\n .action(async (opts) => {\n const { connection } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n\n const accounts = await connection.getProgramAccounts(TOKEN_2022_PROGRAM_ID, {\n filters: [\n { dataSize: 165 },\n { memcmp: { offset: 0, bytes: mint.toBase58() } },\n ]\n });\n\n const minBalance = BigInt(opts.minBalance);\n const holders = accounts\n .map(acc => ({\n address: acc.pubkey.toString(),\n balance: BigInt(acc.account.data.readBigUInt64LE ? acc.account.data.readBigUInt64LE(64) : 0),\n }))\n .filter(h => h.balance >= minBalance);\n\n if (opts.format === 'json') {\n console.log(JSON.stringify({ success: true, data: holders.map(h => ({ ...h, balance: h.balance.toString() })), error: null }));\n } else if (opts.format === 'csv') {\n console.log('address,balance');\n holders.forEach(h => console.log(`${h.address},${h.balance}`));\n } else {\n console.table(holders.map(h => ({ ...h, balance: h.balance.toString() })));\n }\n });\n\n // ========================================================================\n // Audit Log (HIGH-002: new command)\n // ========================================================================\n program\n .command(\"audit-log\")\n .description(\"Display the local audit log\")\n .option(\"--action <type>\", \"Filter by action type\")\n .option(\"--from <date>\", \"Start date (ISO 8601)\")\n .option(\"--to <date>\", \"End date (ISO 8601)\")\n .option(\"--format <format>\", \"Output format: json|csv\", \"json\")\n .action((opts) => {\n const config = loadConfig({}) as unknown as Record<string, string>;\n const logPath = config.auditLogPath || `${os.homedir()}/.thawgate/audit.log`;\n\n if (!fs.existsSync(logPath)) {\n console.log(\"No audit log found.\");\n return;\n }\n\n const lines = fs.readFileSync(logPath, 'utf-8')\n .split('\\n')\n .filter(Boolean)\n .map(l => JSON.parse(l));\n\n let filtered = lines;\n if (opts.action) filtered = filtered.filter((e: Record<string, string>) => e.command?.includes(opts.action));\n if (opts.from) filtered = filtered.filter((e: Record<string, string>) => new Date(e.timestamp) >= new Date(opts.from));\n if (opts.to) filtered = filtered.filter((e: Record<string, string>) => new Date(e.timestamp) <= new Date(opts.to));\n\n if (opts.format === 'csv') {\n console.log('timestamp,command,result');\n filtered.forEach((e: Record<string, string>) => console.log(`${e.timestamp},${e.command},${e.result}`));\n } else {\n console.log(JSON.stringify(filtered, null, 2));\n }\n });\n\n // ========================================================================\n // Config (HIGH-002: new command with subcommands)\n // ========================================================================\n const configCmd = program.command(\"config\").description(\"Manage CLI configuration\");\n\n configCmd\n .command(\"show\")\n .description(\"Display current configuration\")\n .action(() => {\n const config = loadConfig({}) as unknown as Record<string, string>;\n // Redact sensitive fields before printing\n const safe = { ...config, keypairPath: config.keypairPath ? '[set]' : '[not set]' };\n console.log(JSON.stringify(safe, null, 2));\n });\n\n configCmd\n .command(\"set\")\n .description(\"Set a configuration value\")\n .option(\"--rpc-url <url>\", \"Solana RPC URL\")\n .option(\"--keypair-path <path>\", \"Path to keypair JSON file\")\n .option(\"--program-id <id>\", \"SSS Token program ID\")\n .option(\"--mint-address <address>\", \"Token mint address\")\n .action((opts) => {\n const updates: Record<string, string> = {};\n if (opts.rpcUrl) updates.rpcUrl = opts.rpcUrl;\n if (opts.keypairPath) updates.keypairPath = opts.keypairPath;\n if (opts.programId) updates.programId = opts.programId;\n if (opts.mintAddress) updates.mintAddress = opts.mintAddress;\n\n if (Object.keys(updates).length === 0) {\n console.error(\"No configuration options provided. Use --help for available options.\");\n process.exit(1);\n }\n\n try {\n saveConfig(updates);\n console.log(\"Configuration saved to ~/.thawgate/config.json\");\n for (const [key, value] of Object.entries(updates)) {\n console.log(` ${key}: ${value}`);\n }\n } catch (err: any) {\n console.error(`Failed to save configuration: ${err.message}`);\n process.exit(1);\n }\n });\n\n // ========================================================================\n // Status (HIGH-001: renamed from 'info' to 'status')\n // ========================================================================\n program\n .command(\"status\")\n .description(\"Display stablecoin configuration and status\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .action(async (opts) => {\n const { client, logger } = createClient(program.opts());\n const mint = new PublicKey(opts.mint);\n\n const config = await client.getConfig(mint);\n const pauseState = await client.getPauseState(mint);\n\n logger.output({\n mint: config.mint.toBase58(),\n name: config.name,\n symbol: config.symbol,\n decimals: config.decimals,\n authority: config.authority.toBase58(),\n paused: pauseState.paused,\n permanentDelegate: config.enablePermanentDelegate,\n transferHook: config.enableTransferHook,\n defaultFrozen: config.defaultAccountFrozen,\n totalMinted: config.totalMinted.toString(),\n totalBurned: config.totalBurned.toString(),\n });\n });\n}\n\n/**\n * Parses a role name string to RoleType enum.\n */\nfunction parseRoleType(role: string): RoleType {\n const map: Record<string, RoleType> = {\n minter: RoleType.Minter,\n burner: RoleType.Burner,\n pauser: RoleType.Pauser,\n blacklister: RoleType.Blacklister,\n seizer: RoleType.Seizer,\n };\n const result = map[role.toLowerCase()];\n if (result === undefined) {\n throw new Error(\n `Invalid role: ${role}. Valid roles: ${Object.keys(map).join(\", \")}`,\n );\n }\n return result;\n}\n\n/**\n * Checks `init`'s preset. Anything but \"sss2\" used to fall through to an SSS-1 mint, so a typo or \"acl\" silently\n * created a different kind of stablecoin (found in S15b).\n */\nexport function parsePreset(preset: string): \"sss1\" | \"sss2\" {\n const p = String(preset).toLowerCase();\n if (p !== \"sss1\" && p !== \"sss2\") {\n throw new Error(`Invalid preset: ${preset}. Valid presets: sss1, sss2 (for an SSS-ACL mint gated by ThawGate, use create-stablecoin)`);\n }\n return p;\n}\n\n/**\n * Parses a quota period name to the QuotaPeriod enum. `minters add` used to pass the string itself, which the SDK\n * can't map (\"Cannot read properties of undefined (reading 'toLowerCase')\"; found in S14).\n */\nfunction parseQuotaPeriod(period: string): QuotaPeriod {\n const map: Record<string, QuotaPeriod> = {\n daily: QuotaPeriod.Daily,\n weekly: QuotaPeriod.Weekly,\n monthly: QuotaPeriod.Monthly,\n lifetime: QuotaPeriod.Lifetime,\n };\n const result = map[period.toLowerCase()];\n if (result === undefined) {\n throw new Error(`Invalid period: ${period}. Valid periods: ${Object.keys(map).join(\", \")}`);\n }\n return result;\n}\n","/**\n * @module config\n * @description Configuration management for the SSS CLI.\n *\n * Precedence: CLI flags > env vars > config file > defaults\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport * as dotenv from \"dotenv\";\n\ndotenv.config();\n\nconst CONFIG_DIR = path.join(os.homedir(), \".thawgate\");\nconst CONFIG_FILE = path.join(CONFIG_DIR, \"config.json\");\n/** Before S11 the binary was `sss-token`; its config file is still read while ~/.thawgate has none. */\nconst LEGACY_CONFIG_FILE = path.join(os.homedir(), \".sss-token\", \"config.json\");\n\n/**\n * CLI configuration options.\n */\nexport interface CLIConfig {\n rpcUrl: string;\n commitment: \"processed\" | \"confirmed\" | \"finalized\";\n programId: string;\n hookProgramId: string;\n keypairPath: string;\n outputFormat: \"text\" | \"json\";\n}\n\n/**\n * Default configuration values. Empty program IDs mean the SDK's defaults: the devnet deployments.\n */\nconst DEFAULTS: CLIConfig = {\n rpcUrl: \"https://api.devnet.solana.com\",\n commitment: \"confirmed\",\n programId: \"\",\n hookProgramId: \"\",\n keypairPath: path.join(os.homedir(), \".config\", \"solana\", \"id.json\"),\n outputFormat: \"text\",\n};\n\n/**\n * Loads configuration with precedence: env vars > config file > defaults.\n */\nexport function loadConfig(overrides?: Partial<CLIConfig>): CLIConfig {\n let fileConfig: Partial<CLIConfig> = {};\n\n // Load from config file if it exists\n const file = fs.existsSync(CONFIG_FILE) ? CONFIG_FILE : fs.existsSync(LEGACY_CONFIG_FILE) ? LEGACY_CONFIG_FILE : undefined;\n if (file) {\n try {\n const raw = fs.readFileSync(file, \"utf-8\");\n fileConfig = JSON.parse(raw);\n } catch {\n // Ignore invalid config file\n }\n }\n\n // Load from environment variables\n const envConfig: Partial<CLIConfig> = {};\n if (process.env.SSS_RPC_URL) envConfig.rpcUrl = process.env.SSS_RPC_URL;\n if (process.env.SSS_COMMITMENT)\n envConfig.commitment = process.env.SSS_COMMITMENT as CLIConfig[\"commitment\"];\n if (process.env.SSS_PROGRAM_ID)\n envConfig.programId = process.env.SSS_PROGRAM_ID;\n if (process.env.SSS_HOOK_PROGRAM_ID)\n envConfig.hookProgramId = process.env.SSS_HOOK_PROGRAM_ID;\n if (process.env.SSS_KEYPAIR_PATH)\n envConfig.keypairPath = process.env.SSS_KEYPAIR_PATH;\n\n // Merge with precedence: overrides > env > file > defaults. An override left undefined (a CLI flag that wasn't\n // given) must not erase the env or file value: createClient always passes rpcUrl and keypairPath.\n const given = Object.fromEntries(Object.entries(overrides ?? {}).filter(([, v]) => v !== undefined)) as Partial<CLIConfig>;\n return {\n ...DEFAULTS,\n ...fileConfig,\n ...envConfig,\n ...given,\n };\n}\n\n/**\n * Saves configuration to the config file.\n */\nexport function saveConfig(config: Partial<CLIConfig>): void {\n if (!fs.existsSync(CONFIG_DIR)) {\n fs.mkdirSync(CONFIG_DIR, { recursive: true });\n }\n const existing = fs.existsSync(CONFIG_FILE)\n ? JSON.parse(fs.readFileSync(CONFIG_FILE, \"utf-8\"))\n : {};\n const merged = { ...existing, ...config };\n fs.writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2));\n}\n\n/**\n * Loads the keypair from the configured path.\n */\nexport function loadKeypair(keypairPath: string): Uint8Array {\n const raw = fs.readFileSync(keypairPath, \"utf-8\");\n return Uint8Array.from(JSON.parse(raw));\n}\n","/**\n * @module logger\n * @description Audit logging for the SSS CLI.\n *\n * All operations are logged to ~/.thawgate/audit.log with timestamps.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\nconst LOG_DIR = path.join(os.homedir(), \".thawgate\");\nconst LOG_FILE = path.join(LOG_DIR, \"audit.log\");\n\nexport enum LogLevel {\n DEBUG = \"DEBUG\",\n INFO = \"INFO\",\n WARN = \"WARN\",\n ERROR = \"ERROR\",\n}\n\n/**\n * Logger class with file and console output.\n */\nexport class Logger {\n private readonly verbose: boolean;\n private readonly jsonOutput: boolean;\n\n constructor(verbose = false, jsonOutput = false) {\n this.verbose = verbose;\n this.jsonOutput = jsonOutput;\n this.ensureLogDir();\n }\n\n private ensureLogDir(): void {\n if (!fs.existsSync(LOG_DIR)) {\n fs.mkdirSync(LOG_DIR, { recursive: true });\n }\n }\n\n /**\n * Formats and writes a log entry.\n */\n private log(level: LogLevel, message: string, data?: Record<string, unknown>): void {\n const timestamp = new Date().toISOString();\n const entry = {\n timestamp,\n level,\n message,\n ...(data ? { data } : {}),\n };\n\n // Always write to audit log file\n const line = JSON.stringify(entry) + \"\\n\";\n try {\n fs.appendFileSync(LOG_FILE, line);\n } catch {\n // Silently fail if we can't write to audit log\n }\n\n // Console output. With --json, progress lines go to stderr so stdout holds only the command's JSON result.\n if (this.jsonOutput) {\n if (level !== LogLevel.DEBUG || this.verbose) console.error(JSON.stringify(entry));\n } else if (level !== LogLevel.DEBUG || this.verbose) {\n const prefix = level === LogLevel.ERROR ? \"✗\" : level === LogLevel.WARN ? \"⚠\" : \"✓\";\n console.log(`${prefix} ${message}`);\n if (data && this.verbose) {\n console.log(\" Data:\", JSON.stringify(data, null, 2));\n }\n }\n }\n\n debug(message: string, data?: Record<string, unknown>): void {\n this.log(LogLevel.DEBUG, message, data);\n }\n\n info(message: string, data?: Record<string, unknown>): void {\n this.log(LogLevel.INFO, message, data);\n }\n\n warn(message: string, data?: Record<string, unknown>): void {\n this.log(LogLevel.WARN, message, data);\n }\n\n error(message: string, data?: Record<string, unknown>): void {\n this.log(LogLevel.ERROR, message, data);\n }\n\n /**\n * Logs a transaction result.\n */\n transaction(action: string, signature: string, details?: Record<string, unknown>): void {\n this.info(`${action}: ${signature}`, details);\n }\n\n /**\n * Outputs structured data (for --json mode).\n */\n output(data: Record<string, unknown>): void {\n if (this.jsonOutput) {\n console.log(JSON.stringify(data, null, 2));\n } else {\n for (const [key, value] of Object.entries(data)) {\n console.log(` ${key}: ${value}`);\n }\n }\n }\n}\n","/**\n * @module utils\n * @description CLI utility functions.\n *\n * HIGH-004: simulateTransaction helper for --dry-run support on write commands.\n */\n\nimport { Connection, Transaction, Keypair } from \"@solana/web3.js\";\n\n/**\n * Simulates a transaction against the RPC without submitting it.\n * Used to implement --dry-run on mint, burn, freeze, thaw commands.\n *\n * @param connection - Active Solana connection\n * @param transaction - The transaction to simulate\n * @param signers - The keypairs that would sign the transaction\n */\nexport async function simulateTransaction(\n connection: Connection,\n transaction: Transaction,\n signers: Keypair[],\n): Promise<void> {\n // Fetch the latest blockhash to satisfy the simulation requirement\n const { blockhash } = await connection.getLatestBlockhash(\"confirmed\");\n transaction.recentBlockhash = blockhash;\n transaction.feePayer = signers[0].publicKey;\n\n // Sign for simulation (required by some RPC endpoints)\n transaction.sign(...signers);\n\n const simulation = await connection.simulateTransaction(transaction);\n\n console.log(\"──────────────────────────────────────────\");\n console.log(\"DRY RUN RESULT (transaction NOT submitted)\");\n console.log(\"──────────────────────────────────────────\");\n\n if (simulation.value.err) {\n console.log(\"Status: ❌ WOULD FAIL\");\n console.log(\"Error: \", JSON.stringify(simulation.value.err));\n } else {\n console.log(\"Status: ✅ WOULD SUCCEED\");\n console.log(\"Units: \", simulation.value.unitsConsumed ?? \"unknown\");\n }\n\n if (simulation.value.logs && simulation.value.logs.length > 0) {\n console.log(\"Program logs:\");\n simulation.value.logs.forEach(log => console.log(\" \", log));\n }\n\n console.log(\"──────────────────────────────────────────\");\n console.log(\"(No transaction submitted — dry run only)\");\n}\n","/**\n * @module gate\n * @description CLI commands for ThawGate, mirroring @thawgate/sdk: the issuer preset (create-stablecoin,\n * enable-token-acl), policies, the holder flows (explain, unlock, freeze-if-invalid), swap-gate, SAS credentials,\n * the issuer allowlist and reserve posts.\n */\n\nimport { Command } from \"commander\";\nimport { BN } from \"@coral-xyz/anchor\";\nimport { PublicKey } from \"@solana/web3.js\";\nimport { AllowlistMode, Explanation, GatePolicy, PolicyInput, sas } from \"@thawgate/sdk\";\nimport { createClient } from \"./commands\";\n\ntype Opts = Record<string, string | boolean | string[] | undefined>;\n\n/** The policy flags shared by create-stablecoin, enable-token-acl, policy init|update and swap-gate. */\nexport interface PolicyFlags {\n blacklist?: string;\n allowlist?: string;\n sasCredential?: string;\n sasSchema?: string;\n minKyc?: string;\n /** `false` when --no-sas was given (commander's negatable option). */\n sas?: boolean;\n}\n\nconst ALLOWLIST_MODES: AllowlistMode[] = [\"off\", \"allowOnly\", \"bypassForPdas\"];\n\nfunction onOff(v: string, flag: string): boolean {\n if (v === \"on\" || v === \"true\") return true;\n if (v === \"off\" || v === \"false\") return false;\n throw new Error(`${flag} takes on or off, not ${v}`);\n}\n\n/**\n * Policy flags → the SDK's PolicyInput. A flag not given stays undefined, so `policy update` changes only what was\n * given. With only --min-kyc, the credential and schema come from `current` (the stored policy).\n */\nexport function policyFromFlags(f: PolicyFlags, current?: Pick<GatePolicy, \"requireSas\" | \"sasCredential\" | \"sasSchema\" | \"minKycLevel\"> | null): PolicyInput {\n const p: PolicyInput = {};\n if (f.blacklist !== undefined) p.checkBlacklist = onOff(f.blacklist, \"--blacklist\");\n if (f.allowlist !== undefined) {\n if (!ALLOWLIST_MODES.includes(f.allowlist as AllowlistMode)) throw new Error(`--allowlist takes ${ALLOWLIST_MODES.join(\", \")}, not ${f.allowlist}`);\n p.allowlistMode = f.allowlist as AllowlistMode;\n }\n const sasGiven = f.sasCredential !== undefined || f.sasSchema !== undefined || f.minKyc !== undefined;\n if (f.sas === false) {\n if (sasGiven) throw new Error(\"--no-sas can't be combined with --sas-credential, --sas-schema or --min-kyc\");\n p.sas = null;\n } else if (sasGiven) {\n const stored = current?.requireSas ? current : undefined;\n const credential = f.sasCredential ? new PublicKey(f.sasCredential) : stored?.sasCredential;\n const schema = f.sasSchema ? new PublicKey(f.sasSchema) : stored?.sasSchema;\n if (!credential || !schema) throw new Error(\"a SAS policy needs both --sas-credential and --sas-schema\");\n const minKycLevel = f.minKyc !== undefined ? Number(f.minKyc) : stored?.minKycLevel ?? 0;\n if (!Number.isInteger(minKycLevel) || minKycLevel < 0 || minKycLevel > 255) throw new Error(\"--min-kyc takes 0-255\");\n p.sas = { credential, schema, minKycLevel };\n }\n return p;\n}\n\nfunction withPolicyFlags(cmd: Command, negatable = false): Command {\n cmd.option(\"--blacklist <on|off>\", \"Deny holders on the issuer blacklist\")\n .option(\"--allowlist <mode>\", `Issuer allowlist: ${ALLOWLIST_MODES.join(\" | \")}`)\n .option(\"--sas-credential <pubkey>\", \"Require a SAS attestation under this credential...\")\n .option(\"--sas-schema <pubkey>\", \"...and this schema (nonce = the holder's wallet)\")\n .option(\"--min-kyc <n>\", \"Minimum kyc_level (the attestation's first byte); 0 = any\");\n if (negatable) cmd.option(\"--no-sas\", \"Turn the SAS requirement off\");\n return cmd;\n}\n\nconst pk = (v: unknown, flag: string): PublicKey => {\n if (typeof v !== \"string\") throw new Error(`${flag} is required`);\n return new PublicKey(v);\n};\n\n/** A whole number that fits a u64 (base units, unix seconds). */\nexport function u64Arg(v: unknown, flag: string): BN {\n if (typeof v !== \"string\" || !/^\\d+$/.test(v)) throw new Error(`${flag} takes a whole number, not ${String(v)}`);\n const n = new BN(v);\n if (n.bitLength() > 64) throw new Error(`${flag} is larger than a u64`);\n return n;\n}\n\n/** The explanation without the raw logs (unless --verbose), with keys as strings. */\nfunction explanationOut(e: Explanation, verbose: boolean): Record<string, unknown> {\n return {\n mint: e.mint.toBase58(),\n wallet: e.wallet.toBase58(),\n tokenAccount: e.tokenAccount.toBase58(),\n account: e.account,\n status: e.status,\n code: e.code,\n reason: e.reason,\n simulated: e.simulated,\n gatingProgram: e.gatingProgram?.toBase58() ?? null,\n ...(verbose ? { logs: e.logs } : {}),\n };\n}\n\nfunction policyOut(p: GatePolicy): Record<string, unknown> {\n return {\n policy: p.address.toBase58(),\n authority: p.authority.toBase58(),\n issuerProgram: p.issuerProgram.toBase58(),\n checkBlacklist: p.checkBlacklist,\n allowlistMode: p.allowlistMode,\n requireSas: p.requireSas,\n sasCredential: p.requireSas ? p.sasCredential.toBase58() : null,\n sasSchema: p.requireSas ? p.sasSchema.toBase58() : null,\n minKycLevel: p.minKycLevel,\n };\n}\n\nexport function registerGateCommands(program: Command): void {\n const ctx = () => createClient(program.opts());\n const verbose = () => Boolean(program.opts().verbose);\n\n // ------------------------------------------------------------------------------------------------\n // Issuer: SSS-ACL stablecoins\n // ------------------------------------------------------------------------------------------------\n withPolicyFlags(\n program\n .command(\"create-stablecoin\")\n .description(\"Create an SSS-ACL stablecoin gated by ThawGate: initialize, enable_token_acl, minter role and reserves (3 txs)\")\n .requiredOption(\"--name <name>\", \"Name (max 32 chars)\")\n .requiredOption(\"--symbol <symbol>\", \"Symbol (max 10 chars)\")\n .option(\"--uri <uri>\", \"Metadata URI\", \"\")\n .option(\"--decimals <n>\", \"Decimals\", \"6\")\n .requiredOption(\"--reserves <amount>\", \"Reserves to post now, in base units (the supply can't exceed them)\")\n .requiredOption(\"--report-uri <uri>\", \"Link to the reserve report (max 200 bytes)\")\n .option(\"--max-staleness <seconds>\", \"Minting stops when the last reserve post is older than this\", \"86400\")\n .option(\"--attestor <pubkey>\", \"Who posts reserves (default: you, and you post --reserves now)\"),\n ).action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const policy = policyFromFlags(opts as PolicyFlags);\n logger.info(`Creating ${opts.symbol} (SSS-ACL, gated by ThawGate)`);\n const created = await client.createStablecoin({\n name: opts.name as string,\n symbol: opts.symbol as string,\n uri: opts.uri as string,\n decimals: Number(opts.decimals),\n policy,\n reserves: {\n amount: opts.reserves as string,\n reportUri: opts.reportUri as string,\n maxStalenessSeconds: Number(opts.maxStaleness),\n attestor: opts.attestor ? pk(opts.attestor, \"--attestor\") : undefined,\n },\n });\n logger.output({ mint: created.mint.toBase58(), ...created.signatures });\n });\n\n withPolicyFlags(\n program\n .command(\"enable-token-acl\")\n .description(\"sss-token enable_token_acl on an Acl-mode mint: Token ACL config + ThawGate policy (MasterAuthority)\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\"),\n ).action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const sig = await client.send(await client.enableTokenAcl(pk(opts.mint, \"--mint\"), policyFromFlags(opts as PolicyFlags)));\n logger.output({ signature: sig });\n });\n\n // ------------------------------------------------------------------------------------------------\n // Policies\n // ------------------------------------------------------------------------------------------------\n const policy = program.command(\"policy\").description(\"A mint's ThawGate policy\");\n\n policy\n .command(\"show\")\n .description(\"Show the policy and the mint's Token ACL config\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const mint = pk(opts.mint, \"--mint\");\n const [p, config] = await Promise.all([client.gate.getPolicy(mint), client.gate.getMintConfig(mint)]);\n logger.output({\n mint: mint.toBase58(),\n gatingProgram: config?.gatingProgram.toBase58() ?? null,\n freezeAuthority: config?.freezeAuthority.toBase58() ?? null,\n permissionlessThaw: config?.enablePermissionlessThaw ?? null,\n permissionlessFreeze: config?.enablePermissionlessFreeze ?? null,\n ...(p ? policyOut(p) : { policy: null }),\n });\n });\n\n withPolicyFlags(\n policy\n .command(\"init\")\n .description(\"Create the policy of a Token ACL mint whose freeze authority is your key (sss-token mints: enable-token-acl)\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .option(\"--authority <pubkey>\", \"Policy admin (default: you)\"),\n ).action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const input = policyFromFlags(opts as PolicyFlags);\n if (opts.authority) input.authority = pk(opts.authority, \"--authority\");\n const sig = await client.send(await client.gate.initPolicy(pk(opts.mint, \"--mint\"), input));\n logger.output({ signature: sig });\n });\n\n withPolicyFlags(\n policy\n .command(\"update\")\n .description(\"Change the policy (only the flags given) and rewrite its extra metas; holders who no longer comply become freezable\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\"),\n true,\n ).action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const mint = pk(opts.mint, \"--mint\");\n const changes = policyFromFlags(opts as PolicyFlags, await client.gate.getPolicy(mint));\n const sig = await client.send(await client.gate.updatePolicy(mint, changes));\n logger.output({ signature: sig, ...policyOut((await client.gate.getPolicy(mint))!) });\n });\n\n policy\n .command(\"setup-extra-metas\")\n .description(\"Rewrite both extra-metas lists from the stored policy (idempotent)\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const sig = await client.send(await client.gate.setupExtraMetas(pk(opts.mint, \"--mint\")));\n logger.output({ signature: sig });\n });\n\n withPolicyFlags(\n program\n .command(\"swap-gate\")\n .description(\"Move an existing Token ACL mint to ThawGate in one tx: policy, set_gating_program, toggles, token_acl metadata\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address (its Token ACL freeze authority is your key)\")\n .option(\"--skip-metadata\", \"Leave the mint's token_acl metadata field as it is\")\n .option(\"--confirm\", \"Confirm: holders are judged by the new policy from this transaction on\"),\n ).action(async (opts: Opts) => {\n const mint = pk(opts.mint, \"--mint\");\n if (!opts.confirm) {\n console.error(`ERROR: swap-gate changes who may hold this token.\\nRe-run with --confirm:\\n thawgate swap-gate --mint ${mint.toBase58()} ... --confirm`);\n process.exit(1);\n }\n const { client, logger } = ctx();\n const ixs = await client.gate.swapGate(mint, policyFromFlags(opts as PolicyFlags), { skipMetadata: Boolean(opts.skipMetadata) });\n const sig = await client.send(ixs);\n logger.output({ signature: sig, instructions: ixs.length });\n });\n\n // ------------------------------------------------------------------------------------------------\n // Holders\n // ------------------------------------------------------------------------------------------------\n program\n .command(\"explain\")\n .description(\"Why may (or can't) this wallet hold the token? Simulates the thaw (or the freeze, if thawed); sends nothing\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--wallet <pubkey>\", \"Holder wallet\")\n .option(\"--token-account <pubkey>\", \"A token account of the wallet (default: its associated token account)\")\n .action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const tokenAccount = opts.tokenAccount ? pk(opts.tokenAccount, \"--token-account\") : undefined;\n const e = await client.gate.explain(pk(opts.mint, \"--mint\"), pk(opts.wallet, \"--wallet\"), { tokenAccount });\n logger.output(explanationOut(e, verbose()));\n });\n\n program\n .command(\"unlock\")\n .description(\"Create the owner's associated token account if needed and thaw it through the gate (you pay; the owner signs nothing)\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .option(\"--owner <pubkey>\", \"Holder wallet (default: you)\")\n .action(async (opts: Opts) => {\n const { client, keypair, logger } = ctx();\n const mint = pk(opts.mint, \"--mint\");\n const owner = opts.owner ? pk(opts.owner, \"--owner\") : keypair.publicKey;\n const e = await client.gate.explain(mint, owner);\n if (e.account === \"thawed\") {\n logger.output({ status: \"already_unlocked\", tokenAccount: e.tokenAccount.toBase58(), reason: e.reason });\n return;\n }\n if (e.status !== \"can_unlock\") {\n logger.output({ status: e.status, code: e.code, reason: e.reason });\n process.exitCode = 1;\n return;\n }\n const sig = await client.send(await client.gate.createAtaAndThaw(mint, owner));\n logger.output({ status: \"unlocked\", tokenAccount: e.tokenAccount.toBase58(), signature: sig, reason: e.reason });\n });\n\n program\n .command(\"freeze-if-invalid\")\n .description(\"Freeze a token account permissionlessly if the policy flags its owner; sends nothing if it complies\")\n .requiredOption(\"--token-account <pubkey>\", \"Token account\")\n .action(async (opts: Opts) => {\n const { client, logger } = ctx();\n const r = await client.gate.freezeIfInvalid(pk(opts.tokenAccount, \"--token-account\"));\n logger.output({ ...r, signature: r.signature ?? null });\n });\n\n // ------------------------------------------------------------------------------------------------\n // SAS credentials (self-issued test KYC; production policies name a KYC provider's credential)\n // ------------------------------------------------------------------------------------------------\n const sasCmd = program.command(\"sas\").description(\"Solana Attestation Service: credentials, the KYC schema, attestations\");\n\n sasCmd\n .command(\"create-credential\")\n .description(\"Create a SAS credential you issue under (a self-issued test credential)\")\n .requiredOption(\"--name <name>\", \"Credential name (1-32 bytes)\")\n .option(\"--signer <pubkey...>\", \"Keys that may attest (default: you)\")\n .action(async (opts: Opts) => {\n const { client, keypair, logger } = ctx();\n const signers = (opts.signer as string[] | undefined)?.map((s) => new PublicKey(s));\n const { instruction, credential } = sas.createCredentialIx({ payer: keypair.publicKey, authority: keypair.publicKey, name: opts.name as string, signers });\n const sig = await client.send([instruction]);\n logger.output({ credential: credential.toBase58(), signature: sig });\n });\n\n sasCmd\n .command(\"create-schema\")\n .description(\"Create the KYC schema ThawGate reads (kyc_level: u8, country: String) under your credential\")\n .requiredOption(\"--credential <pubkey>\", \"Credential\")\n .requiredOption(\"--name <name>\", \"Schema name (1-32 bytes)\")\n .option(\"--description <text>\", \"Description\", \"KYC level and country (ThawGate)\")\n .action(async (opts: Opts) => {\n const { client, keypair, logger } = ctx();\n const { instruction, schema } = sas.createSchemaIx({\n payer: keypair.publicKey,\n authority: keypair.publicKey,\n credential: pk(opts.credential, \"--credential\"),\n name: opts.name as string,\n description: opts.description as string,\n layout: [...sas.KYC_SCHEMA.layout],\n fieldNames: [...sas.KYC_SCHEMA.fieldNames],\n });\n const sig = await client.send([instruction]);\n logger.output({ schema: schema.toBase58(), signature: sig });\n });\n\n sasCmd\n .command(\"attest\")\n .description(\"Attest a wallet's KYC (nonce = the wallet), as a signer of the credential\")\n .requiredOption(\"--credential <pubkey>\", \"Credential\")\n .requiredOption(\"--schema <pubkey>\", \"Schema (the KYC layout)\")\n .requiredOption(\"--wallet <pubkey>\", \"Holder wallet\")\n .requiredOption(\"--kyc-level <n>\", \"kyc_level, 0-255\")\n .option(\"--country <code>\", \"Country\", \"IN\")\n .option(\"--expiry-days <days>\", \"Days until it expires; 0 = never\", \"365\")\n .action(async (opts: Opts) => {\n const { client, keypair, logger } = ctx();\n const days = Number(opts.expiryDays);\n const expiry = days === 0 ? 0 : (await client.clusterTime()) + Math.round(days * 86_400);\n const { instruction, attestation } = sas.createAttestationIx({\n payer: keypair.publicKey,\n authority: keypair.publicKey,\n credential: pk(opts.credential, \"--credential\"),\n schema: pk(opts.schema, \"--schema\"),\n nonce: pk(opts.wallet, \"--wallet\"),\n data: sas.encodeKycData({ kycLevel: Number(opts.kycLevel), country: opts.country as string }),\n expiry,\n });\n const sig = await client.send([instruction]);\n logger.output({ attestation: attestation.toBase58(), expiry, signature: sig });\n });\n\n sasCmd\n .command(\"revoke\")\n .description(\"Close a wallet's attestation; under a SAS policy its accounts become freezable\")\n .requiredOption(\"--credential <pubkey>\", \"Credential\")\n .requiredOption(\"--schema <pubkey>\", \"Schema\")\n .requiredOption(\"--wallet <pubkey>\", \"Holder wallet\")\n .action(async (opts: Opts) => {\n const { client, keypair, logger } = ctx();\n const credential = pk(opts.credential, \"--credential\");\n const attestation = sas.findAttestationPda(credential, pk(opts.schema, \"--schema\"), pk(opts.wallet, \"--wallet\"));\n const sig = await client.send([sas.closeAttestationIx({ payer: keypair.publicKey, authority: keypair.publicKey, credential, attestation })]);\n logger.output({ attestation: attestation.toBase58(), signature: sig });\n });\n\n // ------------------------------------------------------------------------------------------------\n // Issuer allowlist (allowOnly / bypassForPdas policies; the mint needs enable_allowlist)\n // ------------------------------------------------------------------------------------------------\n const allowlist = program.command(\"allowlist\").description(\"The sss-token issuer allowlist (MasterAuthority)\");\n for (const [name, add] of [[\"add\", true], [\"remove\", false]] as const) {\n allowlist\n .command(name)\n .description(add ? \"Add a wallet to the allowlist\" : \"Deactivate a wallet's allowlist entry\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--wallet <pubkey>\", \"Wallet\")\n .action(async (opts: Opts) => {\n const { client, keypair, logger } = ctx();\n const compliance = client.compliance(pk(opts.mint, \"--mint\"));\n const wallet = pk(opts.wallet, \"--wallet\");\n const ixs = add ? await compliance.addToAllowlist(keypair.publicKey, wallet) : await compliance.removeFromAllowlist(keypair.publicKey, wallet);\n logger.output({ signature: await client.send(ixs) });\n });\n }\n\n // ------------------------------------------------------------------------------------------------\n // Reserves (the attestation mint_tokens checks; the MasterAuthority sets the attestor at creation)\n // ------------------------------------------------------------------------------------------------\n const reservesCmd = program.command(\"reserves\").description(\"A mint's reserve attestation: mint_tokens refuses supply past it\");\n\n reservesCmd\n .command(\"post\")\n .description(\"Post the mint's reserves as its attestor (--keypair). Minting may rely on them until as-of + max staleness\")\n .requiredOption(\"--mint <pubkey>\", \"Mint address\")\n .requiredOption(\"--amount <base units>\", \"Reserves in the mint's base units (1.00 of a 6-decimal coin = 1000000)\")\n .option(\"--report-uri <uri>\", \"Link to the reserve report, max 200 bytes (default: the one posted last)\")\n .option(\"--as-of <unix seconds>\", \"When the reserves were measured (default: the cluster's time now)\")\n .action(async (opts: Opts) => {\n const { client, keypair, logger } = ctx();\n const mint = pk(opts.mint, \"--mint\");\n const amount = u64Arg(opts.amount, \"--amount\");\n const reserves = client.reserves(mint);\n const current = await reserves.fetch();\n if (!current) throw new Error(`${mint.toBase58()} has no reserve attestation: its MasterAuthority sets the attestor first (set_reserve_attestor)`);\n if (!current.attestor.equals(keypair.publicKey)) {\n throw new Error(`only the mint's attestor ${current.attestor.toBase58()} can post its reserves (--keypair is ${keypair.publicKey.toBase58()})`);\n }\n const asOf = opts.asOf !== undefined ? u64Arg(opts.asOf, \"--as-of\").toNumber() : await client.clusterTime();\n if (asOf < current.asOf.toNumber()) throw new Error(`--as-of ${asOf} is older than the posted as_of ${current.asOf.toString()}`);\n const reportUri = (opts.reportUri as string | undefined) ?? current.reportUri;\n const signature = await client.send(await reserves.attestReserves(keypair.publicKey, amount, asOf, reportUri));\n const freshUntil = asOf + current.maxStaleness.toNumber();\n logger.output({\n signature,\n mint: mint.toBase58(),\n attestor: keypair.publicKey.toBase58(),\n reserves: amount.toString(),\n asOf,\n freshUntil,\n freshUntilUtc: new Date(freshUntil * 1000).toISOString(),\n reportUri,\n });\n });\n}\n"],"mappings":"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","names":["import_sdk","fs","os","config","fs","path","os","config","program","import_anchor","import_web3","import_sdk","program","policy","config"]}
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@thawgate/cli",
3
+ "version": "0.1.0",
4
+ "description": "ThawGate CLI: Token ACL gate policies, SSS-ACL stablecoins and SAS credentials",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/AryaSingh22/thawgate.git",
9
+ "directory": "cli"
10
+ },
11
+ "homepage": "https://github.com/AryaSingh22/thawgate#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/AryaSingh22/thawgate/issues"
14
+ },
15
+ "bin": {
16
+ "thawgate": "./dist/index.js"
17
+ },
18
+ "engines": {
19
+ "node": ">=20"
20
+ },
21
+ "main": "./dist/index.js",
22
+ "types": "./dist/index.d.ts",
23
+ "files": [
24
+ "dist",
25
+ "README.md"
26
+ ],
27
+ "publishConfig": {
28
+ "access": "public",
29
+ "provenance": true
30
+ },
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "typecheck": "tsc --noEmit",
35
+ "test": "vitest run",
36
+ "test:watch": "vitest",
37
+ "lint": "eslint src --ext .ts"
38
+ },
39
+ "dependencies": {
40
+ "@thawgate/sdk": "0.1.0",
41
+ "@coral-xyz/anchor": "^0.32.1",
42
+ "@solana/spl-token": "^0.4.14",
43
+ "@solana/web3.js": "^1.95.0",
44
+ "commander": "^12.0.0",
45
+ "chalk": "^4.1.2",
46
+ "ora": "^5.4.1",
47
+ "dotenv": "^16.4.0"
48
+ },
49
+ "devDependencies": {
50
+ "typescript": "^5.4.0",
51
+ "@types/node": "^20.0.0",
52
+ "tsup": "^8.0.0",
53
+ "vitest": "^4.0.18"
54
+ }
55
+ }