@net-protocol/cli 0.1.13 → 0.1.15

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cli/shared.ts","../../src/commands/storage/storage/check.ts","../../src/commands/storage/utils.ts","../../src/commands/storage/transactions/prep.ts","../../src/commands/storage/transactions/filter.ts","../../src/commands/storage/transactions/send.ts","../../src/commands/storage/core/upload.ts","../../src/commands/storage/relay/recheckStorage.ts","../../src/commands/storage/relay/retry.ts","../../src/commands/storage/core/uploadRelay.ts","../../src/commands/storage/core/preview.ts","../../src/shared/output.ts","../../src/commands/storage/core/read.ts","../../src/shared/encode.ts","../../src/commands/storage/core/encode.ts","../../src/commands/storage/index.ts","../../src/shared/client.ts","../../src/commands/message/send.ts","../../src/commands/message/types.ts","../../src/commands/message/read.ts","../../src/commands/message/count.ts","../../src/commands/message/index.ts","../../src/commands/chains/index.ts","../../src/commands/info/index.ts","../../src/commands/token/deploy.ts","../../src/commands/token/info.ts","../../src/commands/token/index.ts","../../src/commands/profile/get.ts","../../src/commands/profile/set-picture.ts","../../src/commands/profile/utils.ts","../../src/commands/profile/set-username.ts","../../src/commands/profile/set-bio.ts","../../src/commands/profile/set-token-address.ts","../../src/commands/profile/set-canvas.ts","../../src/commands/profile/get-canvas.ts","../../src/commands/profile/index.ts","../../src/commands/bazaar/format.ts","../../src/commands/bazaar/list-listings.ts","../../src/commands/bazaar/list-offers.ts","../../src/commands/bazaar/list-sales.ts","../../src/commands/bazaar/create-listing.ts","../../src/commands/bazaar/create-offer.ts","../../src/commands/bazaar/submit-listing.ts","../../src/commands/bazaar/submit-offer.ts","../../src/commands/bazaar/buy-listing.ts","../../src/commands/bazaar/accept-offer.ts","../../src/commands/bazaar/owned-nfts.ts","../../src/commands/bazaar/index.ts","../../src/cli/index.ts"],"names":["chalk","hexToString","STORAGE_CONTRACT","StorageClient","getStorageKeyBytes","retryFailedTransactionsPackage","failedIndexes","backendWalletAddress","readFileSync","detectFileTypeFromBase64","base64ToDataUri","privateKeyToAccount","getPublicClient","getChainRpcUrls","createWalletClient","http","shouldSuggestXmlStorage","stringToHex","fs","program","NetClient","Command","executeEncodeOnly","encodeFunctionData","isNetrSupportedChain","NetrClient","PROFILE_METADATA_STORAGE_KEY","parseProfileMetadata","base","publicActions","getProfileMetadataStorageArgs","PROFILE_CANVAS_STORAGE_KEY","CHUNKED_STORAGE_CONTRACT","path2","fs3","BazaarClient","parseEther","executeKeylessMode","bigintReplacer","calldata","require"],"mappings":"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","file":"index.mjs","sourcesContent":["import chalk from \"chalk\";\nimport type { CommonOptions, ReadOnlyOptions } from \"../shared/types\";\n\n/**\n * Get chain ID from option or environment variable, exit if not found\n */\nfunction getRequiredChainId(optionValue?: number): number {\n const chainId =\n optionValue ||\n (process.env.NET_CHAIN_ID\n ? parseInt(process.env.NET_CHAIN_ID, 10)\n : undefined);\n\n if (!chainId) {\n console.error(\n chalk.red(\n \"Error: Chain ID is required. Provide via --chain-id flag or NET_CHAIN_ID environment variable\"\n )\n );\n process.exit(1);\n }\n\n return chainId;\n}\n\n/**\n * Get RPC URL from option or environment variable\n */\nfunction getRpcUrl(optionValue?: string): string | undefined {\n return optionValue || process.env.NET_RPC_URL;\n}\n\n/**\n * Parse and validate common options shared across all commands.\n * Extracts private key, chain ID, and RPC URL from command options or environment variables.\n * @param options - Command options\n * @param supportsEncodeOnly - If true, mention --encode-only in error messages as an alternative\n */\nexport function parseCommonOptions(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or NET_PRIVATE_KEY/PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using NET_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse and validate read-only options for commands that don't need a private key.\n * Extracts chain ID and RPC URL from command options or environment variables.\n */\nexport function parseReadOnlyOptions(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n StorageCheckResult,\n CheckNormalStorageExistsParams,\n CheckChunkedStorageExistsParams,\n CheckXmlChunksExistParams,\n CheckXmlMetadataExistsParams,\n} from \"../types\";\n\n/**\n * Check if normal storage data exists and matches content\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function checkNormalStorageExists(\n params: CheckNormalStorageExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedContent } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n // Compare content\n const storedContent = hexToString(existing.value as `0x${string}`);\n const matches = storedContent === expectedContent;\n\n return { exists: true, matches };\n}\n\n/**\n * Check if ChunkedStorage data exists\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkChunkedStorageExists(\n params: CheckChunkedStorageExistsParams\n): Promise<boolean> {\n const { storageClient, chunkedHash, operatorAddress } = params;\n const meta = await storageClient.getChunkedMetadata({\n key: chunkedHash,\n operator: operatorAddress,\n });\n\n return meta !== null && meta.chunkCount > 0;\n}\n\n/**\n * Check which XML chunks already exist in ChunkedStorage\n * Returns Set of chunkedStorage hashes that exist\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlChunksExist(\n params: CheckXmlChunksExistParams\n): Promise<Set<string>> {\n const { storageClient, chunkedHashes, operatorAddress } = params;\n const existing = new Set<string>();\n\n // Check each chunk in parallel for efficiency\n await Promise.all(\n chunkedHashes.map(async (hash) => {\n const exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: hash,\n operatorAddress,\n });\n if (exists) {\n existing.add(hash);\n }\n })\n );\n\n return existing;\n}\n\n/**\n * Check if XML metadata exists and matches expected metadata\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlMetadataExists(\n params: CheckXmlMetadataExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedMetadata } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n const storedMetadata = hexToString(existing.value as `0x${string}`);\n const matches = storedMetadata === expectedMetadata;\n\n return { exists: true, matches };\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { encodeStorageKeyForUrl } from \"@net-protocol/storage\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlMetadataExists,\n} from \"./storage/check\";\nimport type {\n TransactionWithId,\n StorageTransactionArgs,\n CheckTransactionExistsParams,\n} from \"./types\";\n\n/**\n * Convert typed args to array (for viem compatibility)\n */\nexport function typedArgsToArray(\n args: StorageTransactionArgs\n): readonly unknown[] {\n if (args.type === \"normal\" || args.type === \"metadata\") {\n return [args.args.key, args.args.text, args.args.value];\n } else {\n return [args.args.hash, args.args.text, args.args.chunks];\n }\n}\n\n/**\n * Extract typed args from WriteTransactionConfig\n */\nexport function extractTypedArgsFromTransaction(\n tx: WriteTransactionConfig,\n type: \"normal\" | \"chunked\" | \"metadata\"\n): StorageTransactionArgs {\n if (type === \"normal\" || type === \"metadata\") {\n return {\n type,\n args: {\n key: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n value: tx.args[2] as `0x${string}`,\n },\n };\n } else {\n return {\n type: \"chunked\",\n args: {\n hash: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n chunks: tx.args[2] as `0x${string}`[],\n },\n };\n }\n}\n\n/**\n * Extract content string from transaction typed args\n * Helper to eliminate duplication of hexToString pattern\n */\nexport function extractContentFromTransaction(\n tx: TransactionWithId\n): string {\n if (tx.typedArgs.type === \"normal\" || tx.typedArgs.type === \"metadata\") {\n return hexToString(tx.typedArgs.args.value);\n } else {\n // For chunked transactions, return empty string (no content to extract)\n return \"\";\n }\n}\n\n/**\n * Generate storage URL for displaying to user\n * Centralizes URL generation logic\n */\nexport function generateStorageUrl(\n operatorAddress: string | undefined,\n chainId: number,\n storageKey: string\n): string | undefined {\n if (!operatorAddress) return undefined;\n return `https://storedon.net/net/${chainId}/storage/load/${\n operatorAddress\n }/${encodeStorageKeyForUrl(storageKey)}`;\n}\n\n/**\n * Check if a transaction's data already exists (idempotency check)\n * Consolidates existence check logic used in both filtering and sending\n * Accepts JSON object as parameter\n */\nexport async function checkTransactionExists(\n params: CheckTransactionExistsParams\n): Promise<boolean> {\n const { storageClient, tx, operatorAddress } = params;\n if (tx.type === \"normal\") {\n // Extract expected content from typed args\n if (tx.typedArgs.type === \"normal\") {\n const expectedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n return check.exists && check.matches === true;\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: hash existence = content match (deterministic hash)\n return await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: extract and compare content\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n return check.exists && check.matches === true;\n }\n }\n return false;\n}\n\n","import { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { StorageClient, getStorageKeyBytes } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n TransactionWithId,\n NormalStorageArgs,\n PrepareXmlStorageTransactionsParams,\n} from \"../types\";\nimport { extractTypedArgsFromTransaction, typedArgsToArray } from \"../utils\";\n\n/**\n * Prepare normal storage transaction with ID\n * Uses StorageClient.preparePut() from net-public\n * Accepts typed JSON args object instead of individual parameters\n */\nexport function prepareNormalStorageTransaction(\n storageClient: StorageClient,\n args: NormalStorageArgs,\n originalStorageKey: string // Original string key needed for preparePut\n): TransactionWithId {\n // Use StorageClient.preparePut() from net-public\n // preparePut needs the original string key, not bytes32\n const content = hexToString(args.value);\n \n const transaction = storageClient.preparePut({\n key: originalStorageKey,\n text: args.text,\n value: content,\n });\n\n const typedArgs = {\n type: \"normal\" as const,\n args,\n };\n\n return {\n id: args.key,\n type: \"normal\",\n transaction,\n typedArgs,\n };\n}\n\n/**\n * Prepare XML storage transactions with IDs\n * Returns array: [metadata transaction, ...chunk transactions]\n * Uses StorageClient.prepareXmlStorage() from net-public\n * Accepts JSON object as parameter\n */\nexport function prepareXmlStorageTransactions(\n params: PrepareXmlStorageTransactionsParams\n): TransactionWithId[] {\n const { storageClient, storageKey, text, content, operatorAddress } = params;\n const storageKeyBytes = getStorageKeyBytes(storageKey) as `0x${string}`;\n\n // Use StorageClient.prepareXmlStorage() from net-public\n // This handles all the chunking, ChunkedStorage preparation, and metadata generation\n // Pass storageKey as string - prepareXmlStorage will convert it internally\n const result = storageClient.prepareXmlStorage({\n data: content,\n operatorAddress: operatorAddress as `0x${string}`,\n storageKey: storageKey, // Pass as string, not bytes32\n filename: text,\n useChunkedStorageBackend: true, // Use ChunkedStorage backend (default)\n });\n\n // Map WriteTransactionConfig[] to TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const transactions: TransactionWithId[] = result.transactionConfigs.map(\n (tx, index) => {\n if (index === 0) {\n // First transaction is metadata - use our storageKeyBytes for ID\n const typedArgs = extractTypedArgsFromTransaction(tx, \"metadata\");\n return {\n id: storageKeyBytes,\n type: \"metadata\",\n transaction: tx,\n typedArgs,\n };\n } else {\n // Rest are ChunkedStorage transactions\n // Extract typed args and get hash from typed args\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const chunkedHash = typedArgs.args.hash;\n return {\n id: chunkedHash,\n type: \"chunked\",\n transaction: tx,\n typedArgs,\n };\n }\n // This should never happen, but TypeScript needs it\n throw new Error(\"Invalid chunked transaction\");\n }\n }\n );\n\n return transactions;\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport {\n STORAGE_CONTRACT,\n CHUNKED_STORAGE_CONTRACT,\n} from \"@net-protocol/storage\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlChunksExist,\n checkXmlMetadataExists,\n} from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport type {\n TransactionWithId,\n FilterExistingTransactionsParams,\n FilterXmlStorageTransactionsParams,\n} from \"../types\";\n\n/**\n * Filter transactions to only those that need to be sent\n * Checks existence for each transaction and filters out already-stored ones\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function filterExistingTransactions(\n params: FilterExistingTransactionsParams\n): Promise<{\n toSend: TransactionWithId[];\n skipped: TransactionWithId[];\n}> {\n const { storageClient, transactions, operatorAddress, expectedContent } =\n params;\n const toSend: TransactionWithId[] = [];\n const skipped: TransactionWithId[] = [];\n\n for (const tx of transactions) {\n let exists = false;\n\n if (tx.type === \"normal\") {\n // Normal storage: always check if exists AND matches content\n if (expectedContent) {\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n exists = check.exists && check.matches === true;\n } else {\n // Extract content from typed args if not provided\n if (tx.typedArgs.type === \"normal\") {\n const storedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent: storedContent,\n });\n exists = check.exists && check.matches === true;\n }\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: check if metadata exists\n exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: check if exists\n // Extract expected metadata from typed args (it's hex-encoded)\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n exists = check.exists && check.matches === true;\n }\n }\n\n if (exists) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n\n return { toSend, skipped };\n}\n\n/**\n * Filter XML storage transactions more efficiently\n * Checks all chunks in parallel, then filters\n * Accepts WriteTransactionConfig[] directly and derives chunkedHashes internally\n * Accepts JSON object as parameter\n */\nexport async function filterXmlStorageTransactions(\n params: FilterXmlStorageTransactionsParams\n): Promise<{\n toSend: WriteTransactionConfig[];\n skipped: WriteTransactionConfig[];\n}> {\n const { storageClient, transactions, operatorAddress } = params;\n\n // Separate metadata and chunk transactions by contract address\n const metadataTx = transactions.find(\n (tx) => tx.to.toLowerCase() === STORAGE_CONTRACT.address.toLowerCase()\n );\n const chunkTxs = transactions.filter(\n (tx) => tx.to.toLowerCase() === CHUNKED_STORAGE_CONTRACT.address.toLowerCase()\n );\n\n // Derive chunkedHashes internally from WriteTransactionConfig[] args\n const chunkedHashes: string[] = [];\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash); // Content-based hash (keccak256(xmlChunk))\n }\n }\n\n const toSend: WriteTransactionConfig[] = [];\n const skipped: WriteTransactionConfig[] = [];\n\n // Check which chunks exist (parallel check)\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress,\n });\n\n // Filter chunk transactions\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (existingChunks.has(hash)) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n }\n\n // Check metadata (if all chunks exist and match, skip metadata too)\n if (metadataTx) {\n const allChunksExist = chunkedHashes.length > 0 && chunkedHashes.every((hash) =>\n existingChunks.has(hash)\n );\n if (allChunksExist) {\n // Verify metadata matches\n try {\n const typedArgs = extractTypedArgsFromTransaction(metadataTx, \"metadata\");\n if (typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: typedArgs.args.key,\n operatorAddress,\n expectedMetadata,\n });\n if (check.exists && check.matches) {\n skipped.push(metadataTx);\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n } catch {\n // If we can't extract metadata args, include in toSend\n toSend.unshift(metadataTx);\n }\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n\n return { toSend, skipped };\n}\n","import { createWalletClient, http, WalletClient, defineChain, PublicClient } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport {\n getPublicClient,\n getChainRpcUrls,\n} from \"@net-protocol/core\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { checkTransactionExists, typedArgsToArray } from \"../utils\";\nimport type {\n TransactionWithId,\n UploadResult,\n CreateWalletClientParams,\n SendTransactionsParams,\n} from \"../types\";\n\n/**\n * Create wallet client from private key\n * Accepts JSON object as parameter\n */\nexport function createWalletClientFromPrivateKey(\n params: CreateWalletClientParams\n): {\n walletClient: WalletClient;\n publicClient: PublicClient;\n operatorAddress: `0x${string}`;\n} {\n const { privateKey, chainId, rpcUrl } = params;\n const account = privateKeyToAccount(privateKey);\n const publicClient = getPublicClient({ chainId, rpcUrl });\n\n // Get RPC URLs for the chain\n const rpcUrls = getChainRpcUrls({ chainId, rpcUrl });\n\n // Create wallet client with the same chain configuration\n const chain = publicClient.chain\n ? defineChain({\n id: chainId,\n name: publicClient.chain.name,\n nativeCurrency: publicClient.chain.nativeCurrency,\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n blockExplorers: publicClient.chain.blockExplorers,\n })\n : defineChain({\n id: chainId,\n name: `Chain ${chainId}`,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(),\n });\n\n return {\n walletClient,\n publicClient,\n operatorAddress: account.address,\n };\n}\n\n/**\n * Send transactions sequentially with idempotency checks\n * Checks existence before each transaction (handles partial retries)\n * Accepts JSON object as parameter\n */\nexport async function sendTransactionsWithIdempotency(\n params: SendTransactionsParams\n): Promise<UploadResult> {\n const { storageClient, walletClient, publicClient, transactions, operatorAddress } = params;\n let sent = 0;\n let skipped = 0;\n let failed = 0;\n let finalHash: string | undefined;\n const errorMessages: string[] = [];\n\n for (let i = 0; i < transactions.length; i++) {\n const tx = transactions[i];\n\n try {\n // Check if this transaction's data already exists (idempotency)\n // Always compare content, not just check existence\n const exists = await checkTransactionExists({\n storageClient,\n tx,\n operatorAddress,\n });\n\n if (exists) {\n console.log(\n `⏭️ Transaction ${i + 1}/${\n transactions.length\n } skipped (already stored): ${tx.id}`\n );\n skipped++;\n continue;\n }\n\n // Send transaction\n console.log(\n `📤 Sending transaction ${i + 1}/${transactions.length}: ${tx.id}`\n );\n // Convert typed args to array for viem compatibility\n const args = typedArgsToArray(tx.typedArgs);\n if (!walletClient.account) {\n throw new Error(\"Wallet client must have an account\");\n }\n const hash = await walletClient.writeContract({\n account: walletClient.account,\n address: tx.transaction.to as `0x${string}`,\n abi: tx.transaction.abi,\n functionName: tx.transaction.functionName as string,\n args,\n value: tx.transaction.value,\n chain: null,\n });\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n console.log(\n `✓ Transaction ${i + 1} confirmed in block ${\n receipt.blockNumber\n } (hash: ${hash})`\n );\n\n sent++;\n finalHash = hash;\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error);\n console.error(`✗ Transaction ${i + 1} failed: ${errorMsg}`);\n errorMessages.push(errorMsg);\n failed++;\n // Continue with remaining transactions (don't fail entire upload)\n }\n }\n\n return {\n success: failed === 0,\n skipped: skipped > 0,\n transactionsSent: sent,\n transactionsSkipped: skipped,\n transactionsFailed: failed,\n finalHash,\n error: errorMessages.length > 0 ? errorMessages.join(\"; \") : undefined,\n };\n}\n\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport {\n createWalletClientFromPrivateKey,\n sendTransactionsWithIdempotency,\n} from \"../transactions/send\";\nimport type {\n UploadOptions,\n UploadResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Main upload function - orchestrates the entire upload process\n */\nexport async function uploadFile(\n options: UploadOptions\n): Promise<UploadResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client\n const { walletClient, publicClient, operatorAddress } =\n createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let skippedCount = 0;\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n skippedCount = filteredSkipped.length;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n skippedCount = filtered.skipped.length;\n }\n\n // 7. Check if all transactions were skipped\n if (transactionsToSend.length === 0) {\n return {\n success: true,\n skipped: true,\n transactionsSent: 0,\n transactionsSkipped: skippedCount,\n transactionsFailed: 0,\n operatorAddress,\n storageType,\n };\n }\n\n // 8. Send transactions\n const result = await sendTransactionsWithIdempotency({\n storageClient,\n walletClient,\n publicClient,\n transactions: transactionsToSend,\n operatorAddress,\n });\n\n // Add skipped count from filtering step\n result.transactionsSkipped += skippedCount;\n\n // Add operator address and storage type to result\n result.operatorAddress = operatorAddress;\n result.storageType = storageType;\n\n return result;\n}\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport { checkXmlChunksExist } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\n\n/**\n * Storage-specific recheck function for retry logic\n *\n * Re-checks failed transactions on-chain before retry to filter out\n * transactions that have succeeded since the last attempt.\n *\n * This is storage-specific because it uses checkXmlChunksExist and\n * extractTypedArgsFromTransaction which understand storage transaction types.\n *\n * @param failedIndexes - Indexes of failed transactions\n * @param transactions - Original transaction configs\n * @param backendWalletAddress - Backend wallet address (operator for storage checks)\n * @returns Array of transaction indexes that still need to be retried\n */\nexport async function recheckFailedTransactionsStorage(\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n storageClient: StorageClient,\n backendWalletAddress: Address\n): Promise<number[]> {\n if (failedIndexes.length === 0) {\n return [];\n }\n\n // Extract chunked hashes from failed transactions\n const failedTransactions = failedIndexes.map((idx) => transactions[idx]);\n const chunkedHashes: string[] = [];\n\n for (const tx of failedTransactions) {\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash);\n }\n } catch {\n // Not a chunked transaction, skip\n }\n }\n\n if (chunkedHashes.length === 0) {\n // No chunked transactions to check, return all failed indexes\n return failedIndexes;\n }\n\n // Check which chunks exist on-chain\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress: backendWalletAddress,\n });\n\n // Filter out indexes where the transaction has succeeded\n const stillFailed: number[] = [];\n\n for (const failedIdx of failedIndexes) {\n const tx = transactions[failedIdx];\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (!existingChunks.has(hash)) {\n // Transaction still hasn't succeeded\n stillFailed.push(failedIdx);\n }\n // If hash exists, transaction succeeded, skip retry\n } else {\n // Non-chunked transaction, always retry\n stillFailed.push(failedIdx);\n }\n } catch {\n // Can't determine type, retry to be safe\n stillFailed.push(failedIdx);\n }\n }\n\n return stillFailed;\n}\n\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport type { RetryConfig, RelaySubmitResult } from \"@net-protocol/relay\";\nimport type { RetryFailedTransactionsParams } from \"./types\";\nimport { retryFailedTransactions as retryFailedTransactionsPackage } from \"@net-protocol/relay\";\nimport { recheckFailedTransactionsStorage } from \"./recheckStorage\";\n\n/**\n * Retry failed transactions with exponential backoff\n *\n * This is a wrapper around the package retryFailedTransactions that adds\n * storage-specific recheck logic.\n *\n * @param params - Retry parameters\n * @returns Final success/failure status after retries\n */\nexport async function retryFailedTransactions(\n params: RetryFailedTransactionsParams\n): Promise<RelaySubmitResult> {\n const {\n storageClient,\n backendWalletAddress,\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n config,\n sessionToken,\n } = params;\n\n // Use storage-specific recheck function\n return retryFailedTransactionsPackage({\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n backendWalletAddress,\n config,\n sessionToken,\n recheckFunction: async (\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n backendWalletAddress: Address\n ) => {\n return recheckFailedTransactionsStorage(\n failedIndexes,\n transactions,\n storageClient,\n backendWalletAddress\n );\n },\n });\n}\n","import { readFileSync } from \"fs\";\nimport {\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { http, createWalletClient } from \"viem\";\nimport { getPublicClient, getChainRpcUrls } from \"@net-protocol/core\";\nimport type { Address, Hash } from \"viem\";\nimport { filterXmlStorageTransactions } from \"../transactions/filter\";\nimport { checkXmlMetadataExists } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport {\n createRelayX402Client,\n fundBackendWallet,\n checkBackendWalletBalance,\n submitTransactionsViaRelay,\n waitForConfirmations,\n createRelaySession,\n batchTransactions,\n} from \"@net-protocol/relay\";\nimport { retryFailedTransactions } from \"../relay/retry\";\nimport type {\n UploadWithRelayOptions,\n UploadWithRelayResult,\n} from \"../relay/types\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Main upload function with relay - orchestrates the entire relay upload process\n *\n * Flow:\n * 1. Read file\n * 2. Fund backend wallet (x402 payment)\n * 3. Prepare transactions with backendWalletAddress as operator\n * 4. Split transactions (metadata vs chunks)\n * 5. Filter existing transactions (idempotency)\n * 6. Submit chunks via relay (backend wallet pays gas)\n * 7. Retry failed chunks\n * 8. Submit metadata directly (user pays gas)\n * 9. Wait for confirmations\n * 10. Return result\n */\nexport async function uploadFileWithRelay(\n options: UploadWithRelayOptions\n): Promise<UploadWithRelayResult> {\n const errors: Error[] = [];\n\n // 1. Read file\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n const base64String = fileBuffer.toString(\"base64\");\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n fileContent = base64ToDataUri(base64String);\n } else {\n fileContent = base64String;\n }\n } else {\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n // Note: Relay upload always uses XML storage format, regardless of file size\n // prepareXmlStorage() handles small files by creating a single chunk with XML metadata\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 4. Create user wallet client\n const userAccount = privateKeyToAccount(options.privateKey);\n const userAddress = userAccount.address;\n const publicClient = getPublicClient({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const rpcUrls = getChainRpcUrls({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const userWalletClient = createWalletClient({\n account: userAccount,\n chain: publicClient.chain!,\n transport: http(rpcUrls[0]), // Use first RPC URL\n });\n\n // 5. Setup x402 client\n const { fetchWithPayment, httpClient } = createRelayX402Client(\n userAccount,\n options.chainId\n );\n\n // 5.5. Create relay session token (sign once, reuse for all batches)\n // Session token is required for all submit requests\n const sessionResult = await createRelaySession({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n account: userAccount,\n expiresIn: 3600, // 1 hour - should be enough for most uploads\n });\n const sessionToken = sessionResult.sessionToken;\n console.log(\"✓ Session token created (valid for 1 hour)\");\n\n // 6. Check backend wallet balance and fund if needed\n // Check balance first to avoid unnecessary payments\n let backendWalletAddress: Address | undefined;\n let shouldFund = true;\n\n try {\n const balanceResult = await checkBackendWalletBalance({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n });\n backendWalletAddress = balanceResult.backendWalletAddress;\n\n // Only fund if balance is insufficient\n shouldFund = !balanceResult.sufficientBalance;\n } catch (error) {\n // If balance check fails, fall back to funding (for backwards compatibility)\n // This handles cases where the balance endpoint might not be available\n shouldFund = true;\n }\n\n // Fund backend wallet only if balance is insufficient\n // This ensures backendWalletAddress is always set\n if (shouldFund) {\n const fundResult = await fundBackendWallet({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n fetchWithPayment,\n httpClient,\n });\n backendWalletAddress = fundResult.backendWalletAddress;\n }\n\n // TypeScript assertion: backendWalletAddress is guaranteed to be set at this point\n // (either from balance check or fund call)\n if (!backendWalletAddress) {\n throw new Error(\"Failed to determine backend wallet address\");\n }\n\n // backendWalletAddress is now guaranteed to be set (either from balance check or fund call)\n\n // 7. Prepare chunks with backendWalletAddress as operator (chunks submitted via relay)\n // Use StorageClient.prepareXmlStorage() to get chunk transactions\n const chunkPrepareResult = storageClient.prepareXmlStorage({\n data: fileContent,\n operatorAddress: backendWalletAddress,\n storageKey: options.storageKey,\n filename: options.text,\n useChunkedStorageBackend: true,\n });\n\n const chunkTxs = chunkPrepareResult.transactionConfigs.slice(1); // Skip metadata, get chunks\n const topLevelHash = chunkPrepareResult.topLevelHash;\n const chunkMetadata = chunkPrepareResult.metadata; // XML metadata referencing backend wallet chunks\n\n // 8. Prepare metadata transaction separately with userAddress as operator\n // Metadata is submitted directly by user, so it should use userAddress\n // We use the same XML metadata string (which references chunks stored by backend wallet)\n const metadataTx = storageClient.preparePut({\n key: topLevelHash,\n text: options.text,\n value: chunkMetadata, // Use the XML metadata from chunk preparation\n });\n\n // 9. Filter existing chunks (idempotency check with backendWalletAddress)\n const filteredChunks = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTxs,\n operatorAddress: backendWalletAddress,\n });\n\n const chunksToSend = filteredChunks.toSend;\n const chunksSkipped = filteredChunks.skipped.length;\n\n // 10. Check if metadata already exists (with userAddress as operator)\n // Extract metadata args from the prepared transaction\n const metadataStorageKey = metadataTx.args[0] as `0x${string}`;\n const expectedMetadata = hexToString(metadataTx.args[2] as `0x${string}`);\n let metadataNeedsSubmission = true;\n\n const metadataCheck = await checkXmlMetadataExists({\n storageClient,\n storageKey: metadataStorageKey,\n operatorAddress: userAddress, // User is operator for metadata\n expectedMetadata,\n });\n if (metadataCheck.exists && metadataCheck.matches) {\n metadataNeedsSubmission = false;\n }\n\n // 11. Batch and submit chunks via relay (if any)\n let chunkTransactionHashes: Hash[] = [];\n let chunksSent = 0;\n\n if (chunksToSend.length > 0) {\n try {\n // Batch chunks to respect server limits (100 transactions, 1MB per request)\n const batches = batchTransactions(chunksToSend);\n const totalBatches = batches.length;\n\n if (totalBatches > 1) {\n console.log(\n `📦 Splitting ${chunksToSend.length} chunks into ${totalBatches} batch(es)`\n );\n }\n\n // Submit batches sequentially\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {\n const batch = batches[batchIndex];\n\n if (totalBatches > 1) {\n console.log(\n `📤 Sending batch ${batchIndex + 1}/${totalBatches} (${\n batch.length\n } transactions)...`\n );\n }\n\n const submitResult = await submitTransactionsViaRelay({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n transactions: batch,\n sessionToken,\n });\n\n chunkTransactionHashes.push(...submitResult.transactionHashes);\n chunksSent += submitResult.successfulIndexes.length;\n\n // Check if ALL transactions in this batch failed\n if (submitResult.failedIndexes.length === batch.length) {\n // All transactions failed - likely due to insufficient funds or network issues\n // Don't retry (would waste app fees) and stop processing subsequent batches\n const errorMessage =\n `Batch ${batchIndex + 1}: All ${\n batch.length\n } transactions failed. ` +\n `Likely due to insufficient backend wallet balance or network issues. ` +\n `Stopping batch processing to avoid wasting app fees.`;\n\n console.error(`❌ ${errorMessage}`);\n errors.push(new Error(errorMessage));\n\n // Stop processing subsequent batches\n break;\n }\n\n // 12. Retry failed chunks in this batch if any (only if some succeeded - partial failure)\n if (\n submitResult.failedIndexes.length > 0 &&\n submitResult.successfulIndexes.length > 0\n ) {\n // Map failed indexes to actual transactions from this batch\n const failedTxs = submitResult.failedIndexes.map((idx) => batch[idx]);\n\n try {\n const retryResult = await retryFailedTransactions({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n failedIndexes: submitResult.failedIndexes,\n originalTransactions: failedTxs,\n storageClient,\n backendWalletAddress,\n sessionToken,\n });\n\n // Merge retry results\n chunkTransactionHashes.push(...retryResult.transactionHashes);\n chunksSent += retryResult.successfulIndexes.length;\n\n if (retryResult.failedIndexes.length > 0) {\n errors.push(\n new Error(\n `Batch ${batchIndex + 1}: ${\n retryResult.failedIndexes.length\n } transactions failed after retries`\n )\n );\n }\n } catch (retryError) {\n errors.push(\n retryError instanceof Error\n ? retryError\n : new Error(\n `Batch ${batchIndex + 1} retry failed: ${String(\n retryError\n )}`\n )\n );\n }\n }\n\n // Optional: Wait for batch confirmations before next batch\n // This ensures we don't overwhelm the network and provides progress feedback\n if (\n batchIndex < batches.length - 1 &&\n chunkTransactionHashes.length > 0\n ) {\n // Get the hashes from this batch\n const batchHashes = chunkTransactionHashes.slice(\n -submitResult.successfulIndexes.length\n );\n if (batchHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: batchHashes,\n confirmations: 1, // Just 1 confirmation between batches\n timeout: 30000, // 30 second timeout per batch\n });\n } catch (confirmationError) {\n // Log but don't fail - we'll wait for all confirmations later\n console.warn(\n `⚠️ Batch ${\n batchIndex + 1\n } confirmation timeout (continuing...)`\n );\n }\n }\n }\n }\n } catch (submitError) {\n errors.push(\n submitError instanceof Error\n ? submitError\n : new Error(`Chunk submission failed: ${String(submitError)}`)\n );\n }\n }\n\n // 13. Wait for chunk transaction confirmations\n if (chunkTransactionHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: chunkTransactionHashes,\n confirmations: 1,\n timeout: 60000,\n });\n } catch (confirmationError) {\n errors.push(\n confirmationError instanceof Error\n ? confirmationError\n : new Error(`Chunk confirmation failed: ${String(confirmationError)}`)\n );\n }\n }\n\n // 14. Submit metadata directly (user pays gas)\n let metadataTransactionHash: Hash | undefined;\n if (metadataNeedsSubmission) {\n try {\n metadataTransactionHash = await userWalletClient.writeContract({\n address: metadataTx.to as Address,\n abi: metadataTx.abi,\n functionName: metadataTx.functionName,\n args: metadataTx.args,\n value:\n metadataTx.value !== undefined && metadataTx.value > BigInt(0)\n ? metadataTx.value\n : undefined,\n });\n\n // Wait for metadata confirmation\n await waitForConfirmations({\n publicClient,\n transactionHashes: [metadataTransactionHash],\n confirmations: 1,\n timeout: 60000,\n });\n } catch (metadataError) {\n errors.push(\n metadataError instanceof Error\n ? metadataError\n : new Error(`Metadata submission failed: ${String(metadataError)}`)\n );\n }\n }\n\n // 15. Return result\n return {\n success: errors.length === 0,\n topLevelHash,\n chunksSent,\n chunksSkipped,\n metadataSubmitted:\n metadataNeedsSubmission && metadataTransactionHash !== undefined,\n chunkTransactionHashes,\n metadataTransactionHash,\n backendWalletAddress,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport { createWalletClientFromPrivateKey } from \"../transactions/send\";\nimport type {\n UploadOptions,\n PreviewResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Preview function - performs all prep steps but doesn't submit transactions\n * Returns statistics about what would be uploaded\n */\nexport async function previewFile(\n options: UploadOptions\n): Promise<PreviewResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client (needed for operator address)\n const { operatorAddress } = createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let transactionsSkipped: TransactionWithId[];\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n transactionsSkipped = filteredSkipped;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n transactionsSkipped = filtered.skipped;\n }\n\n // Calculate statistics\n if (useXmlStorage) {\n // XML storage: separate chunks from metadata\n const chunkTransactions = transactions.filter(\n (tx) => tx.type === \"chunked\"\n );\n const metadataTransaction = transactions.find(\n (tx) => tx.type === \"metadata\"\n );\n\n const totalChunks = chunkTransactions.length;\n const alreadyStoredChunks = transactionsSkipped.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const needToStoreChunks = transactionsToSend.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const metadataNeedsStorage = metadataTransaction\n ? transactionsToSend.some((tx) => tx.type === \"metadata\")\n : false;\n\n return {\n storageType: \"xml\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n metadataNeedsStorage,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n } else {\n // Normal storage: single transaction counts as 1 chunk\n const totalChunks = 1;\n const alreadyStoredChunks = transactionsSkipped.length;\n const needToStoreChunks = transactionsToSend.length;\n\n return {\n storageType: \"normal\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n }\n}\n","import chalk from \"chalk\";\nimport type { NetMessage } from \"@net-protocol/core\";\n\n/**\n * Format a message for human-readable output\n */\nexport function formatMessage(\n message: NetMessage,\n index: number\n): string {\n const timestamp = new Date(Number(message.timestamp) * 1000).toISOString();\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${message.sender}`,\n ` ${chalk.white(\"App:\")} ${message.app}`,\n ];\n\n if (message.topic) {\n lines.push(` ${chalk.white(\"Topic:\")} ${message.topic}`);\n }\n\n lines.push(` ${chalk.white(\"Text:\")} ${message.text}`);\n\n if (message.data && message.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${message.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a message for JSON output\n */\nexport function messageToJson(\n message: NetMessage,\n index: number\n): Record<string, unknown> {\n return {\n index,\n sender: message.sender,\n app: message.app,\n timestamp: Number(message.timestamp),\n text: message.text,\n topic: message.topic,\n data: message.data,\n };\n}\n\n/**\n * Print messages in human-readable or JSON format\n */\nexport function printMessages(\n messages: NetMessage[],\n startIndex: number,\n json: boolean\n): void {\n if (json) {\n const output = messages.map((msg, i) => messageToJson(msg, startIndex + i));\n console.log(JSON.stringify(output, null, 2));\n } else {\n if (messages.length === 0) {\n console.log(chalk.yellow(\"No messages found\"));\n return;\n }\n\n messages.forEach((msg, i) => {\n console.log(formatMessage(msg, startIndex + i));\n if (i < messages.length - 1) {\n console.log(); // Empty line between messages\n }\n });\n }\n}\n\n/**\n * Print a count result\n */\nexport function printCount(\n count: number,\n label: string,\n json: boolean\n): void {\n if (json) {\n console.log(JSON.stringify({ count }, null, 2));\n } else {\n console.log(`${chalk.white(label)} ${chalk.cyan(count)}`);\n }\n}\n\n/**\n * Print an error message and exit\n */\nexport function exitWithError(message: string): never {\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { parseReadOnlyOptions } from \"../../../cli/shared\";\nimport { exitWithError } from \"../../../shared/output\";\n\nexport interface StorageReadOptions {\n key: string;\n operator: string;\n chainId?: number;\n rpcUrl?: string;\n index?: number;\n json?: boolean;\n raw?: boolean;\n}\n\n/**\n * Execute the storage read command\n */\nexport async function executeStorageRead(\n options: StorageReadOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Use readStorageData which handles XML resolution\n const result = await client.readStorageData({\n key: options.key,\n operator: options.operator,\n index: options.index,\n });\n\n if (options.json) {\n const output = {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n text: result.text,\n data: options.raw ? result.data : result.data,\n isXml: result.isXml,\n ...(options.index !== undefined && { index: options.index }),\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nStorage Value:\\n\"));\n console.log(` ${chalk.cyan(\"Key:\")} ${options.key}`);\n console.log(` ${chalk.cyan(\"Operator:\")} ${options.operator}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n if (options.index !== undefined) {\n console.log(` ${chalk.cyan(\"Index:\")} ${options.index}`);\n }\n console.log(` ${chalk.cyan(\"Text:\")} ${result.text || \"(empty)\"}`);\n console.log(` ${chalk.cyan(\"Is XML:\")} ${result.isXml ? \"Yes\" : \"No\"}`);\n\n // For data, show a preview if it's long\n const dataPreview =\n result.data.length > 500\n ? result.data.substring(0, 500) + \"... (truncated)\"\n : result.data;\n\n console.log(` ${chalk.cyan(\"Data:\")}`);\n if (result.data) {\n console.log(chalk.gray(` ${dataPreview.split(\"\\n\").join(\"\\n \")}`));\n } else {\n console.log(chalk.gray(\" (empty)\"));\n }\n console.log();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage === \"StoredDataNotFound\") {\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n error: \"Not found\",\n },\n null,\n 2\n )\n );\n process.exit(1);\n }\n exitWithError(\n `No data found for key \"${options.key}\" and operator \"${options.operator}\"`\n );\n }\n\n exitWithError(`Failed to read storage: ${errorMessage}`);\n }\n}\n","import { encodeFunctionData } from \"viem\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { EncodedTransaction } from \"./types\";\n\nexport type { EncodedTransaction };\n\n/**\n * Encode a write transaction config into transaction data\n * Used for --encode-only mode where we output transaction data instead of executing\n */\nexport function encodeTransaction(\n config: WriteTransactionConfig,\n chainId: number\n): EncodedTransaction {\n const calldata = encodeFunctionData({\n abi: config.abi,\n functionName: config.functionName,\n args: config.args,\n });\n\n return {\n to: config.to,\n data: calldata,\n chainId,\n value: config.value?.toString() ?? \"0\",\n };\n}\n","import * as fs from \"fs\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { parseReadOnlyOptions, parseCommonOptions } from \"../../../cli/shared\";\nimport { encodeTransaction } from \"../../../shared/encode\";\nimport type { EncodedTransaction } from \"../../../shared/types\";\n\nexport interface StorageEncodeOptions {\n filePath: string;\n storageKey: string;\n text: string;\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n}\n\ninterface EncodedStorageResult {\n storageKey: string;\n storageType: \"normal\" | \"xml\";\n operatorAddress: string;\n transactions: EncodedTransaction[];\n topLevelHash?: string;\n}\n\nconst XML_STORAGE_THRESHOLD = 20 * 1024; // 20KB\n\n/**\n * Encode storage upload transactions without executing them\n */\nexport async function encodeStorageUpload(\n options: StorageEncodeOptions\n): Promise<EncodedStorageResult> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Get operator address from private key if provided\n let operatorAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n operatorAddress = account.address;\n } else {\n // Use a zero address placeholder when no private key is provided\n operatorAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n // Read file\n const fileContent = fs.readFileSync(options.filePath, \"utf-8\");\n const fileSize = Buffer.byteLength(fileContent, \"utf-8\");\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n });\n\n // Determine storage type based on size\n const useXmlStorage = fileSize > XML_STORAGE_THRESHOLD;\n\n if (useXmlStorage) {\n // XML Storage - multiple transactions\n const { transactionConfigs, topLevelHash, metadata } =\n client.prepareXmlStorage({\n data: fileContent,\n operatorAddress,\n storageKey: options.storageKey,\n filename: options.text,\n });\n\n const encodedTransactions = transactionConfigs.map((config) =>\n encodeTransaction(config, readOnlyOptions.chainId)\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"xml\",\n operatorAddress,\n transactions: encodedTransactions,\n topLevelHash,\n };\n } else {\n // Normal Storage - single transaction\n const config = client.preparePut({\n key: options.storageKey,\n text: options.text,\n value: fileContent,\n });\n\n const encodedTransaction = encodeTransaction(\n config,\n readOnlyOptions.chainId\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"normal\",\n operatorAddress,\n transactions: [encodedTransaction],\n };\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { uploadFile } from \"./core/upload\";\nimport { uploadFileWithRelay } from \"./core/uploadRelay\";\nimport { previewFile } from \"./core/preview\";\nimport { executeStorageRead } from \"./core/read\";\nimport { encodeStorageUpload } from \"./core/encode\";\nimport { generateStorageUrl } from \"./utils\";\nimport type { UploadOptions } from \"./types\";\nimport type { UploadWithRelayOptions } from \"./relay/types\";\n\n/**\n * Register the storage command with the commander program\n */\nexport function registerStorageCommand(program: Command): void {\n // Command group - no options, no action\n const storageCommand = program\n .command(\"storage\")\n .description(\"Storage operations\");\n\n // Upload subcommand (current storage functionality)\n const uploadCommand = new Command(\"upload\")\n .description(\"Upload files to Net Storage\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n // Handle encode-only mode\n if (options.encodeOnly) {\n try {\n const result = await encodeStorageUpload({\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n console.log(JSON.stringify(result, null, 2));\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Encode failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n return;\n }\n\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const uploadOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await uploadFile(uploadOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n if (result.skipped && result.transactionsSent === 0) {\n console.log(\n chalk.green(\n `✓ All data already stored - skipping upload\\n Storage Key: ${\n options.key\n }\\n Skipped: ${result.transactionsSkipped} transaction(s)${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n }\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully!\\n Storage Key: ${\n options.key\n }\\n Storage Type: ${\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n }\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Final Transaction Hash: ${result.finalHash || \"N/A\"}${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Transactions Failed: ${\n result.transactionsFailed\n }\\n Error: ${result.error || \"Unknown error\"}`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Preview subcommand\n const previewCommand = new Command(\"preview\")\n .description(\"Preview storage upload without submitting transactions\")\n .requiredOption(\"--file <path>\", \"Path to file to preview\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const previewOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await previewFile(previewOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n // Display preview results\n console.log(chalk.cyan(\"\\n📊 Storage Preview:\"));\n console.log(` Storage Key: ${chalk.white(result.storageKey)}`);\n console.log(\n ` Storage Type: ${chalk.white(\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n )}`\n );\n console.log(` Total Chunks: ${chalk.white(result.totalChunks)}`);\n console.log(\n ` Already Stored: ${chalk.green(result.alreadyStoredChunks)}`\n );\n console.log(\n ` Need to Store: ${chalk.yellow(result.needToStoreChunks)}`\n );\n\n if (result.storageType === \"xml\" && result.metadataNeedsStorage) {\n console.log(` Metadata: ${chalk.yellow(\"Needs Storage\")}`);\n } else if (result.storageType === \"xml\") {\n console.log(` Metadata: ${chalk.green(\"Already Stored\")}`);\n }\n\n console.log(\n ` Total Transactions: ${chalk.white(result.totalTransactions)}`\n );\n console.log(\n ` Transactions to Send: ${chalk.yellow(result.transactionsToSend)}`\n );\n console.log(\n ` Transactions Skipped: ${chalk.green(result.transactionsSkipped)}`\n );\n console.log(\n ` Operator Address: ${chalk.gray(result.operatorAddress)}`\n );\n\n if (storageUrl) {\n console.log(` Storage URL: ${chalk.cyan(storageUrl)}`);\n }\n\n if (result.needToStoreChunks === 0 && !result.metadataNeedsStorage) {\n console.log(\n chalk.green(\"\\n✓ All data is already stored - no upload needed\")\n );\n } else {\n console.log(\n chalk.yellow(\n `\\n⚠ ${result.transactionsToSend} transaction(s) would be sent`\n )\n );\n }\n\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Preview failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Upload-relay subcommand (relay upload via x402)\n const uploadRelayCommand = new Command(\"upload-relay\")\n .description(\"Upload files to Net Storage via x402 relay (backend pays gas for chunks)\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .requiredOption(\n \"--api-url <url>\",\n \"Backend API URL (e.g., http://localhost:3000)\"\n )\n .requiredOption(\n \"--secret-key <key>\",\n \"Secret key for backend wallet derivation. Can also be set via X402_SECRET_KEY env var\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Parse secret key from options or env\n const secretKey =\n options.secretKey || process.env.X402_SECRET_KEY;\n if (!secretKey) {\n console.error(\n chalk.red(\n \"Error: --secret-key is required or set X402_SECRET_KEY environment variable\"\n )\n );\n process.exit(1);\n }\n\n const uploadRelayOptions: UploadWithRelayOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n apiUrl: options.apiUrl,\n secretKey,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n console.log(chalk.blue(`🔗 Using relay API: ${options.apiUrl}`));\n const result = await uploadFileWithRelay(uploadRelayOptions);\n\n // Generate storage URL (using user address, not backend wallet)\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n const userAccount = privateKeyToAccount(commonOptions.privateKey);\n const storageUrl = generateStorageUrl(\n userAccount.address,\n commonOptions.chainId,\n options.key\n );\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully via relay!\\n Storage Key: ${\n options.key\n }\\n Top-Level Hash: ${result.topLevelHash}\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No (already exists)\"\n }\\n Backend Wallet: ${result.backendWalletAddress}\\n Chunk Transaction Hashes: ${\n result.chunkTransactionHashes.length > 0\n ? result.chunkTransactionHashes.join(\", \")\n : \"None\"\n }${\n result.metadataTransactionHash\n ? `\\n Metadata Transaction Hash: ${result.metadataTransactionHash}`\n : \"\"\n }${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No\"\n }\\n Errors: ${\n result.errors\n ? result.errors.map((e) => e.message).join(\", \")\n : \"Unknown error\"\n }`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload via relay failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read data from Net Storage\")\n .requiredOption(\"--key <key>\", \"Storage key to read\")\n .requiredOption(\"--operator <address>\", \"Operator address (wallet that stored the data)\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--index <n>\",\n \"Historical version index (0 = oldest). Omit for latest.\",\n (value) => parseInt(value, 10)\n )\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--raw\", \"Output raw data without truncation (use with --json)\")\n .action(async (options) => {\n await executeStorageRead({\n key: options.key,\n operator: options.operator,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n index: options.index,\n json: options.json,\n raw: options.raw,\n });\n });\n\n storageCommand.addCommand(uploadCommand);\n storageCommand.addCommand(previewCommand);\n storageCommand.addCommand(uploadRelayCommand);\n storageCommand.addCommand(readCommand);\n}\n","import { NetClient } from \"@net-protocol/core\";\nimport type { ReadOnlyOptions } from \"./types\";\n\n/**\n * Create a NetClient from read-only options\n */\nexport function createNetClient(options: ReadOnlyOptions): NetClient {\n return new NetClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetClient, getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { MessageSendOptions } from \"./types\";\n\nfunction prepareMessageConfig(client: NetClient, options: MessageSendOptions) {\n return client.prepareSendMessage({\n text: options.text,\n topic: options.topic ?? \"\",\n data: options.data as `0x${string}` | undefined,\n });\n}\n\n/**\n * Execute the message send command\n */\nexport async function executeSend(options: MessageSendOptions): Promise<void> {\n if (options.encodeOnly) {\n executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createNetClient(commonOptions);\n const txConfig = prepareMessageConfig(client, options);\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Sending message...\"));\n\n try {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n chain: null,\n });\n\n const topicLine = options.topic ? `\\n Topic: ${options.topic}` : \"\";\n console.log(\n chalk.green(\n `Message sent successfully!\\n Transaction: ${hash}\\n Text: ${options.text}${topicLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n\n/**\n * Execute encode-only mode - output transaction data as JSON\n */\nfunction executeEncodeOnly(options: MessageSendOptions): void {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new NetClient({ chainId: readOnlyOptions.chainId });\n const txConfig = prepareMessageConfig(client, options);\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\n/**\n * Common filter options shared by read and count commands\n */\nexport interface FilterOptions {\n app?: string;\n topic?: string;\n sender?: string;\n}\n\n/**\n * Options for the message send command\n */\nexport interface MessageSendOptions {\n text: string;\n topic?: string;\n data?: string;\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Options for the message read command\n */\nexport interface MessageReadOptions extends FilterOptions {\n start?: number;\n end?: number;\n index?: number;\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Options for the message count command\n */\nexport interface MessageCountOptions extends FilterOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Build a NetMessageFilter from command options.\n * Returns undefined if no app address is provided.\n */\nexport function buildFilter(options: FilterOptions): NetMessageFilter | undefined {\n if (!options.app) {\n return undefined;\n }\n\n return {\n appAddress: options.app as `0x${string}`,\n topic: options.topic,\n maker: options.sender as `0x${string}` | undefined,\n };\n}\n\n/**\n * Warn if topic/sender filters are provided without --app\n */\nexport function warnIgnoredFilters(options: FilterOptions): void {\n if (options.app || (!options.topic && !options.sender)) {\n return;\n }\n\n const ignored: string[] = [];\n if (options.topic) ignored.push(\"--topic\");\n if (options.sender) ignored.push(\"--sender\");\n\n console.warn(\n chalk.yellow(\n `Warning: ${ignored.join(\" and \")} ignored because --app is required for filtering`\n )\n );\n}\n","import chalk from \"chalk\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printMessages, exitWithError } from \"../../shared/output\";\nimport type { MessageReadOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\n\nfunction printEmptyResult(message: string, json: boolean): void {\n if (json) {\n console.log(JSON.stringify([], null, 2));\n } else {\n console.log(chalk.yellow(message));\n }\n}\n\n/**\n * Execute the message read command\n */\nexport async function executeRead(options: MessageReadOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n const json = options.json ?? false;\n\n warnIgnoredFilters(options);\n\n try {\n // Handle single message by index\n if (options.index !== undefined) {\n const message = await client.getMessageAtIndex({\n messageIndex: options.index,\n appAddress: filter?.appAddress,\n topic: filter?.topic,\n maker: filter?.maker,\n });\n\n if (!message) {\n exitWithError(`No message found at index ${options.index}`);\n }\n\n printMessages([message], options.index, json);\n return;\n }\n\n // Get total count for range calculation\n const count = await client.getMessageCount({ filter });\n\n if (count === 0) {\n printEmptyResult(\"No messages found\", json);\n return;\n }\n\n // Determine range\n const hasExplicitRange = options.start !== undefined || options.end !== undefined;\n let startIndex: number;\n let endIndex: number;\n\n if (hasExplicitRange) {\n startIndex = options.start ?? 0;\n endIndex = options.end ?? count;\n } else {\n const limit = options.limit ?? 10;\n startIndex = Math.max(0, count - limit);\n endIndex = count;\n }\n\n // Clamp to valid range\n startIndex = Math.max(0, startIndex);\n endIndex = Math.min(endIndex, count);\n\n if (startIndex >= endIndex) {\n printEmptyResult(\"No messages in specified range\", json);\n return;\n }\n\n const messages = await client.getMessagesBatch({\n filter,\n startIndex,\n endIndex,\n });\n\n printMessages(messages, startIndex, json);\n } catch (error) {\n exitWithError(\n `Failed to read messages: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printCount, exitWithError } from \"../../shared/output\";\nimport type { MessageCountOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\nfunction buildCountLabel(filter: NetMessageFilter | undefined): string {\n if (!filter) {\n return \"Total messages:\";\n }\n\n const parts: string[] = [];\n if (filter.appAddress) parts.push(`app=${filter.appAddress}`);\n if (filter.topic) parts.push(`topic=\"${filter.topic}\"`);\n if (filter.maker) parts.push(`sender=${filter.maker}`);\n\n return `Messages (${parts.join(\", \")}):`;\n}\n\n/**\n * Execute the message count command\n */\nexport async function executeCount(options: MessageCountOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n\n warnIgnoredFilters(options);\n\n try {\n const count = await client.getMessageCount({ filter });\n printCount(count, buildCountLabel(filter), options.json ?? false);\n } catch (error) {\n exitWithError(\n `Failed to get message count: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeSend } from \"./send\";\nimport { executeRead } from \"./read\";\nimport { executeCount } from \"./count\";\n\n/**\n * Register the message command with the commander program\n */\nexport function registerMessageCommand(program: Command): void {\n const messageCommand = program\n .command(\"message\")\n .description(\"Message operations\");\n\n // Send subcommand\n const sendCommand = new Command(\"send\")\n .description(\"Send a message to Net Protocol\")\n .requiredOption(\"--text <text>\", \"Message text\")\n .option(\"--topic <topic>\", \"Message topic\", \"\")\n .option(\"--data <hex>\", \"Additional hex data\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeSend({\n text: options.text,\n topic: options.topic,\n data: options.data,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read messages from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--start <n>\",\n \"Start index (inclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--end <n>\",\n \"End index (exclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--index <n>\",\n \"Single message at index\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--limit <n>\",\n \"Number of latest messages (default: 10)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeRead({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n start: options.start,\n end: options.end,\n index: options.index,\n limit: options.limit,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Count subcommand\n const countCommand = new Command(\"count\")\n .description(\"Get message count from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeCount({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n messageCommand.addCommand(sendCommand);\n messageCommand.addCommand(readCommand);\n messageCommand.addCommand(countCommand);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\n\n/**\n * Supported chains configuration\n * Note: This mirrors the chainConfig in net-core but is kept here to avoid\n * exposing internal configuration details from the core package\n */\nconst SUPPORTED_CHAINS = [\n { id: 8453, name: \"Base\", type: \"mainnet\" },\n { id: 1, name: \"Ethereum\", type: \"mainnet\" },\n { id: 666666666, name: \"Degen\", type: \"mainnet\" },\n { id: 5112, name: \"Ham\", type: \"mainnet\" },\n { id: 57073, name: \"Ink\", type: \"mainnet\" },\n { id: 130, name: \"Unichain\", type: \"mainnet\" },\n { id: 999, name: \"HyperEVM\", type: \"mainnet\" },\n { id: 9745, name: \"Plasma\", type: \"mainnet\" },\n { id: 143, name: \"Monad\", type: \"mainnet\" },\n { id: 84532, name: \"Base Sepolia\", type: \"testnet\" },\n { id: 11155111, name: \"Sepolia\", type: \"testnet\" },\n] as const;\n\n/**\n * Register the chains command with the commander program\n */\nexport function registerChainsCommand(program: Command): void {\n program\n .command(\"chains\")\n .description(\"List supported chains\")\n .option(\"--json\", \"Output in JSON format\")\n .action((options) => {\n if (options.json) {\n console.log(JSON.stringify(SUPPORTED_CHAINS, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Supported Chains:\\n\"));\n\n // Mainnets\n console.log(chalk.cyan(\"Mainnets:\"));\n SUPPORTED_CHAINS.filter((c) => c.type === \"mainnet\").forEach((chain) => {\n console.log(` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.id})`)}`);\n });\n\n // Testnets\n console.log(chalk.cyan(\"\\nTestnets:\"));\n SUPPORTED_CHAINS.filter((c) => c.type === \"testnet\").forEach((chain) => {\n console.log(` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.id})`)}`);\n });\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getNetContract, getChainName } from \"@net-protocol/core\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface InfoOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Register the info command with the commander program\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show contract info and stats\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options: InfoOptions) => {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n try {\n const client = createNetClient(readOnlyOptions);\n\n const contract = getNetContract(readOnlyOptions.chainId);\n const chainName = getChainName({ chainId: readOnlyOptions.chainId });\n const totalMessages = await client.getMessageCount({});\n\n const info = {\n chain: {\n id: readOnlyOptions.chainId,\n name: chainName || \"Unknown\",\n },\n contract: {\n address: contract.address,\n },\n stats: {\n totalMessages,\n },\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Net Protocol Info\\n\"));\n console.log(chalk.cyan(\"Chain:\"));\n console.log(` Name: ${chalk.white(info.chain.name)}`);\n console.log(` ID: ${chalk.white(info.chain.id)}`);\n console.log(chalk.cyan(\"\\nContract:\"));\n console.log(` Address: ${chalk.white(info.contract.address)}`);\n console.log(chalk.cyan(\"\\nStats:\"));\n console.log(` Total Messages: ${chalk.white(info.stats.totalMessages)}`);\n } catch (error) {\n exitWithError(\n `Failed to get info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n });\n}\n","import chalk from \"chalk\";\nimport { encodeFunctionData, createWalletClient, http, parseEther } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { TokenDeployOptions } from \"./types\";\nimport type { EncodedTransaction } from \"../../shared/types\";\n\ninterface EncodedDeployResult {\n predictedAddress: string;\n salt: string;\n transaction: EncodedTransaction;\n config: {\n name: string;\n symbol: string;\n image: string;\n deployer: string;\n initialBuy?: string;\n };\n}\n\n/**\n * Execute encode-only mode - output deployment transaction data as JSON\n */\nasync function executeEncodeOnly(options: TokenDeployOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for token deployment`\n );\n }\n\n // Get deployer address from private key if provided\n let deployerAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n deployerAddress = account.address;\n } else {\n // Use a placeholder address when no private key is provided\n deployerAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n // Encode the transaction\n const calldata = encodeFunctionData({\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n });\n\n const result: EncodedDeployResult = {\n predictedAddress: saltResult.predictedAddress,\n salt: saltResult.salt,\n transaction: {\n to: txConfig.address,\n data: calldata,\n chainId: readOnlyOptions.chainId,\n value: txConfig.value?.toString() ?? \"0\",\n },\n config: {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n deployer: deployerAddress,\n ...(options.initialBuy && { initialBuy: options.initialBuy }),\n },\n };\n\n console.log(JSON.stringify(result, null, 2));\n}\n\n/**\n * Execute the token deploy command\n */\nexport async function executeTokenDeploy(\n options: TokenDeployOptions\n): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n if (!isNetrSupportedChain(commonOptions.chainId)) {\n exitWithError(\n `Chain ${commonOptions.chainId} is not supported for token deployment. Supported: Base (8453), Plasma (9745), Monad (143), HyperEVM (999)`\n );\n }\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const client = new NetrClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n\n console.log(chalk.blue(\"Generating salt and predicting token address...\"));\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n console.log(\n chalk.cyan(`Predicted token address: ${saltResult.predictedAddress}`)\n );\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n if (options.initialBuy) {\n console.log(chalk.blue(`Deploying token with ${options.initialBuy} ETH initial buy...`));\n } else {\n console.log(chalk.blue(\"Deploying token...\"));\n }\n\n try {\n // Use sendTransaction with encoded calldata to support payable functions\n const calldata = encodeFunctionData({\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: txConfig.address,\n data: calldata,\n chain: null,\n value: txConfig.value,\n });\n\n const initialBuyLine = options.initialBuy\n ? `\\n Initial Buy: ${options.initialBuy} ETH`\n : \"\";\n\n console.log(\n chalk.green(\n `Token deployed successfully!\\n Transaction: ${hash}\\n Token Address: ${saltResult.predictedAddress}\\n Name: ${options.name}\\n Symbol: ${options.symbol}${initialBuyLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to deploy token: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { TokenInfoOptions } from \"./types\";\n\n/**\n * Execute the token info command\n */\nexport async function executeTokenInfo(options: TokenInfoOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for Netr tokens`\n );\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n const tokenAddress = options.address as `0x${string}`;\n\n try {\n // Fetch token data in parallel\n const [token, storageData, price] = await Promise.all([\n client.getToken(tokenAddress),\n client.getStorageData(tokenAddress),\n client.getPrice(tokenAddress),\n ]);\n\n if (!token) {\n exitWithError(`Token not found at address ${tokenAddress}`);\n return;\n }\n\n // Fetch locker data if available\n let locker = null;\n if (storageData?.lockerAddress) {\n locker = await client.getLocker(storageData.lockerAddress);\n }\n\n if (options.json) {\n const output = {\n address: tokenAddress,\n chainId: readOnlyOptions.chainId,\n token: {\n name: token.name,\n symbol: token.symbol,\n deployer: token.deployer,\n image: token.image,\n animation: token.animation || null,\n fid: token.fid.toString(),\n totalSupply: token.totalSupply.toString(),\n decimals: token.decimals,\n extraStringData: token.extraStringData || null,\n },\n pool: storageData?.poolAddress || null,\n locker: storageData?.lockerAddress || null,\n price: price\n ? {\n priceInEth: price.priceInEth,\n priceInWeth: price.priceInWeth,\n tick: price.tick,\n }\n : null,\n lockerInfo: locker\n ? {\n owner: locker.owner,\n duration: locker.duration.toString(),\n endTimestamp: locker.endTimestamp.toString(),\n version: locker.version,\n }\n : null,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nToken Info:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${tokenAddress}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(` ${chalk.cyan(\"Name:\")} ${token.name}`);\n console.log(` ${chalk.cyan(\"Symbol:\")} ${token.symbol}`);\n console.log(` ${chalk.cyan(\"Deployer:\")} ${token.deployer}`);\n console.log(` ${chalk.cyan(\"FID:\")} ${token.fid.toString()}`);\n console.log(` ${chalk.cyan(\"Image:\")} ${token.image}`);\n if (token.animation) {\n console.log(` ${chalk.cyan(\"Animation:\")} ${token.animation}`);\n }\n if (token.extraStringData) {\n console.log(` ${chalk.cyan(\"Extra Data:\")} ${token.extraStringData}`);\n }\n\n if (storageData?.poolAddress) {\n console.log(` ${chalk.cyan(\"Pool:\")} ${storageData.poolAddress}`);\n }\n\n if (storageData?.lockerAddress) {\n console.log(` ${chalk.cyan(\"Locker:\")} ${storageData.lockerAddress}`);\n }\n\n if (price) {\n console.log(` ${chalk.cyan(\"Price:\")} ${price.priceInEth} ETH`);\n }\n\n if (locker) {\n const endDate = new Date(Number(locker.endTimestamp) * 1000);\n console.log(\n ` ${chalk.cyan(\"Lock Ends:\")} ${endDate.toLocaleDateString()}`\n );\n }\n\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to get token info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeTokenDeploy } from \"./deploy\";\nimport { executeTokenInfo } from \"./info\";\n\n/**\n * Register the token command with the commander program\n */\nexport function registerTokenCommand(program: Command): void {\n const tokenCommand = program\n .command(\"token\")\n .description(\"Token operations (Netr/Banger)\");\n\n // Deploy subcommand\n const deployCommand = new Command(\"deploy\")\n .description(\"Deploy a new Netr token\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--image <url>\", \"Token image URL\")\n .option(\"--animation <url>\", \"Token animation URL\")\n .option(\"--fid <number>\", \"Farcaster ID\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--mint-price <wei>\", \"Mint price in wei for NFT drop\")\n .option(\"--mint-end-timestamp <timestamp>\", \"Unix timestamp when minting ends\")\n .option(\"--max-mint-supply <amount>\", \"Maximum mint supply for NFT drop\")\n .option(\"--metadata-address <address>\", \"Dynamic metadata contract address\")\n .option(\"--extra-string-data <data>\", \"Extra string data to store with token\")\n .option(\"--initial-buy <eth>\", \"ETH amount to swap for tokens on deploy (e.g., '0.001')\")\n .action(async (options) => {\n await executeTokenDeploy({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n fid: options.fid,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n mintPrice: options.mintPrice,\n mintEndTimestamp: options.mintEndTimestamp,\n maxMintSupply: options.maxMintSupply,\n metadataAddress: options.metadataAddress,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy,\n });\n });\n\n // Info subcommand\n const infoCommand = new Command(\"info\")\n .description(\"Get information about a Netr token\")\n .requiredOption(\"--address <address>\", \"Token address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeTokenInfo({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n tokenCommand.addCommand(deployCommand);\n tokenCommand.addCommand(infoCommand);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport {\n PROFILE_PICTURE_STORAGE_KEY,\n PROFILE_METADATA_STORAGE_KEY,\n PROFILE_CANVAS_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetOptions } from \"./types\";\n\n/**\n * Execute the profile get command - reads profile data for an address\n */\nexport async function executeProfileGet(\n options: ProfileGetOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Fetch profile picture\n let profilePicture: string | undefined;\n try {\n const pictureResult = await client.readStorageData({\n key: PROFILE_PICTURE_STORAGE_KEY,\n operator: options.address,\n });\n if (pictureResult.data) {\n profilePicture = pictureResult.data;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile metadata (X username, bio, token address)\n let xUsername: string | undefined;\n let bio: string | undefined;\n let tokenAddress: string | undefined;\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: options.address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n xUsername = metadata?.x_username;\n bio = metadata?.bio;\n tokenAddress = metadata?.token_address;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile canvas\n let canvasSize: number | undefined;\n let canvasIsDataUri = false;\n try {\n const canvasResult = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n if (canvasResult.data) {\n canvasSize = canvasResult.data.length;\n canvasIsDataUri = canvasResult.data.startsWith(\"data:\");\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n }\n\n const hasProfile = profilePicture || xUsername || bio || tokenAddress || canvasSize;\n\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n profilePicture: profilePicture || null,\n xUsername: xUsername || null,\n bio: bio || null,\n tokenAddress: tokenAddress || null,\n canvas: canvasSize\n ? { size: canvasSize, isDataUri: canvasIsDataUri }\n : null,\n hasProfile,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nProfile:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${options.address}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(\n ` ${chalk.cyan(\"Profile Picture:\")} ${\n profilePicture || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"X Username:\")} ${\n xUsername ? `@${xUsername}` : chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Bio:\")} ${bio || chalk.gray(\"(not set)\")}`\n );\n console.log(\n ` ${chalk.cyan(\"Token Address:\")} ${\n tokenAddress || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Canvas:\")} ${\n canvasSize\n ? `${canvasSize} bytes${canvasIsDataUri ? \" (data URI)\" : \"\"}`\n : chalk.gray(\"(not set)\")\n }`\n );\n\n if (!hasProfile) {\n console.log(chalk.yellow(\"\\n No profile data found for this address.\"));\n }\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to read profile: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfilePictureStorageArgs,\n isValidUrl,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetPictureOptions } from \"./types\";\n\n/**\n * Execute the profile set-picture command\n */\nexport async function executeProfileSetPicture(\n options: ProfileSetPictureOptions\n): Promise<void> {\n // Validate URL\n if (!isValidUrl(options.url)) {\n exitWithError(\n `Invalid URL: \"${options.url}\". Please provide a valid URL (e.g., https://example.com/image.jpg)`\n );\n }\n\n // Get storage args\n const storageArgs = getProfilePictureStorageArgs(options.url);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`📷 Setting profile picture...`));\n console.log(chalk.gray(` URL: ${options.url}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`⏳ Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\n✓ Profile picture updated successfully!\\n Transaction: ${hash}\\n URL: ${options.url}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set profile picture: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { StorageClient } from \"@net-protocol/storage\";\nimport {\n PROFILE_METADATA_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\n\ninterface ExistingMetadata {\n x_username?: string;\n bio?: string;\n display_name?: string;\n token_address?: string;\n}\n\n/**\n * Read existing profile metadata for an address.\n * Returns parsed metadata fields, or empty object if not found.\n */\nexport async function readExistingMetadata(\n address: string,\n client: StorageClient\n): Promise<ExistingMetadata> {\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n return {\n x_username: metadata?.x_username,\n bio: metadata?.bio,\n display_name: metadata?.display_name,\n token_address: metadata?.token_address,\n };\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n return {};\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidXUsername,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetUsernameOptions } from \"./types\";\n\n/**\n * Execute the profile set-username command\n */\nexport async function executeProfileSetUsername(\n options: ProfileSetUsernameOptions\n): Promise<void> {\n // Validate username\n if (!isValidXUsername(options.username)) {\n exitWithError(\n `Invalid X username: \"${options.username}\". Usernames must be 1-15 characters, alphanumeric and underscores only.`\n );\n }\n\n // Normalize username (strip @ if present for storage)\n const usernameForStorage = options.username.startsWith(\"@\")\n ? options.username.slice(1)\n : options.username;\n const displayUsername = `@${usernameForStorage}`;\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting X username...`));\n console.log(chalk.gray(` Username: ${displayUsername}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update x_username, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n bio: existing.bio,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nX username updated successfully!\\n Transaction: ${hash}\\n Username: ${displayUsername}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set X username: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidBio,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetBioOptions } from \"./types\";\n\n/**\n * Execute the profile set-bio command\n */\nexport async function executeProfileSetBio(\n options: ProfileSetBioOptions\n): Promise<void> {\n // Validate bio\n if (!isValidBio(options.bio)) {\n exitWithError(\n `Invalid bio: \"${options.bio}\". Bio must be 1-280 characters and cannot contain control characters.`\n );\n }\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const storageArgs = getProfileMetadataStorageArgs({ bio: options.bio });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile bio...`));\n console.log(chalk.gray(` Bio: ${options.bio}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update bio, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n bio: options.bio,\n x_username: existing.x_username,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nBio updated successfully!\\n Transaction: ${hash}\\n Bio: ${options.bio}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set bio: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidTokenAddress,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetTokenAddressOptions } from \"./types\";\n\n/**\n * Execute the profile set-token-address command\n */\nexport async function executeProfileSetTokenAddress(\n options: ProfileSetTokenAddressOptions\n): Promise<void> {\n // Validate token address\n if (!isValidTokenAddress(options.tokenAddress)) {\n exitWithError(\n `Invalid token address: \"${options.tokenAddress}\". Must be a valid EVM address (0x-prefixed, 40 hex characters).`\n );\n }\n\n // Store as lowercase\n const normalizedAddress = options.tokenAddress.toLowerCase();\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile token address...`));\n console.log(chalk.gray(` Token Address: ${normalizedAddress}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update token_address, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n x_username: existing.x_username,\n bio: existing.bio,\n display_name: existing.display_name,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nToken address updated successfully!\\n Transaction: ${hash}\\n Token Address: ${normalizedAddress}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set token address: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n PROFILE_CANVAS_STORAGE_KEY,\n PROFILE_CANVAS_TOPIC,\n} from \"@net-protocol/profiles\";\nimport {\n CHUNKED_STORAGE_CONTRACT,\n chunkDataForStorage,\n} from \"@net-protocol/storage\";\nimport { toBytes32 } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetCanvasOptions } from \"./types\";\n\nconst MAX_CANVAS_SIZE = 60 * 1024; // 60KB\nconst CANVAS_FILENAME = \"profile-compressed.html\";\n\n/**\n * Check if a buffer contains binary data (non-text)\n */\nfunction isBinaryContent(buffer: Buffer): boolean {\n // Check for null bytes or other non-text characters in the first 8KB\n const sampleSize = Math.min(buffer.length, 8192);\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i];\n // Null byte is a strong indicator of binary\n if (byte === 0) return true;\n // Control characters (except tab, newline, carriage return)\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) return true;\n }\n return false;\n}\n\n/**\n * Get MIME type from file extension\n */\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".pdf\": \"application/pdf\",\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n}\n\n/**\n * Convert binary buffer to data URI\n */\nfunction bufferToDataUri(buffer: Buffer, mimeType: string): string {\n const base64 = buffer.toString(\"base64\");\n return `data:${mimeType};base64,${base64}`;\n}\n\n/**\n * Execute the profile set-canvas command\n */\nexport async function executeProfileSetCanvas(\n options: ProfileSetCanvasOptions\n): Promise<void> {\n // Validate: must provide --file or --content, but not both\n if (!options.file && !options.content) {\n exitWithError(\n \"Must provide either --file or --content to set canvas content.\"\n );\n }\n\n if (options.file && options.content) {\n exitWithError(\"Cannot provide both --file and --content. Choose one.\");\n }\n\n let canvasContent: string;\n\n // Read content from file or use provided content\n if (options.file) {\n const filePath = path.resolve(options.file);\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n exitWithError(`File not found: ${filePath}`);\n }\n\n // Read file as buffer to detect binary content\n const buffer = fs.readFileSync(filePath);\n\n // Check file size\n if (buffer.length > MAX_CANVAS_SIZE) {\n exitWithError(\n `File too large: ${buffer.length} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n\n // Handle binary files (convert to data URI)\n if (isBinaryContent(buffer)) {\n const mimeType = getMimeType(filePath);\n canvasContent = bufferToDataUri(buffer, mimeType);\n } else {\n canvasContent = buffer.toString(\"utf-8\");\n }\n } else {\n // Use provided content\n canvasContent = options.content!;\n\n // Check content size\n const contentSize = Buffer.byteLength(canvasContent, \"utf-8\");\n if (contentSize > MAX_CANVAS_SIZE) {\n exitWithError(\n `Content too large: ${contentSize} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n }\n\n // Prepare storage key as bytes32\n const bytesKey = toBytes32(PROFILE_CANVAS_STORAGE_KEY) as `0x${string}`;\n\n // Chunk and compress data for storage\n const chunks = chunkDataForStorage(canvasContent);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: CHUNKED_STORAGE_CONTRACT.address,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile canvas...`));\n console.log(\n chalk.gray(` Content size: ${Buffer.byteLength(canvasContent)} bytes`)\n );\n console.log(chalk.gray(` Chunks: ${chunks.length}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction to ChunkedStorage\n const hash = await client.writeContract({\n address: CHUNKED_STORAGE_CONTRACT.address as `0x${string}`,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nCanvas updated successfully!\\n Transaction: ${hash}\\n Content size: ${Buffer.byteLength(canvasContent)} bytes\\n Chunks: ${chunks.length}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { PROFILE_CANVAS_STORAGE_KEY } from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetCanvasOptions } from \"./types\";\n\n/**\n * Check if content is a data URI\n */\nfunction isDataUri(content: string): boolean {\n return content.startsWith(\"data:\");\n}\n\n/**\n * Parse a data URI and return the buffer and mime type\n */\nfunction parseDataUri(dataUri: string): { buffer: Buffer; mimeType: string } {\n const match = dataUri.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new Error(\"Invalid data URI format\");\n }\n const mimeType = match[1];\n const base64Data = match[2];\n const buffer = Buffer.from(base64Data, \"base64\");\n return { buffer, mimeType };\n}\n\n/**\n * Get file extension from mime type\n */\nfunction getExtensionFromMimeType(mimeType: string): string {\n const extensions: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"application/pdf\": \".pdf\",\n \"text/html\": \".html\",\n \"text/css\": \".css\",\n \"application/javascript\": \".js\",\n \"application/json\": \".json\",\n \"text/plain\": \".txt\",\n \"application/octet-stream\": \".bin\",\n };\n return extensions[mimeType] || \".bin\";\n}\n\n/**\n * Execute the profile get-canvas command - reads canvas data for an address\n */\nexport async function executeProfileGetCanvas(\n options: ProfileGetCanvasOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Read canvas from chunked storage\n let canvasContent: string | undefined;\n let canvasText: string | undefined;\n\n try {\n const result = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n\n if (result.data) {\n canvasContent = result.data;\n canvasText = result.text;\n }\n } catch (error) {\n // Check for \"not found\" type errors\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n // No canvas exists - that's okay\n }\n\n // Handle JSON output\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n canvas: canvasContent || null,\n filename: canvasText || null,\n hasCanvas: !!canvasContent,\n isDataUri: canvasContent ? isDataUri(canvasContent) : false,\n contentLength: canvasContent ? canvasContent.length : 0,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // No canvas found\n if (!canvasContent) {\n exitWithError(`No canvas found for address: ${options.address}`);\n }\n\n // Handle output to file\n if (options.output) {\n const outputPath = path.resolve(options.output);\n\n // Check if content is a data URI (binary)\n if (isDataUri(canvasContent)) {\n const { buffer, mimeType } = parseDataUri(canvasContent);\n\n // If output path doesn't have extension, add one based on mime type\n let finalPath = outputPath;\n if (!path.extname(outputPath)) {\n finalPath = outputPath + getExtensionFromMimeType(mimeType);\n }\n\n fs.writeFileSync(finalPath, buffer);\n console.log(\n chalk.green(`Canvas written to: ${finalPath} (${buffer.length} bytes)`)\n );\n } else {\n // Text content\n fs.writeFileSync(outputPath, canvasContent, \"utf-8\");\n console.log(\n chalk.green(\n `Canvas written to: ${outputPath} (${canvasContent.length} bytes)`\n )\n );\n }\n return;\n }\n\n // Output to stdout\n // For binary content (data URI), output as-is since stdout can't handle raw binary\n console.log(canvasContent);\n } catch (error) {\n exitWithError(\n `Failed to read canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeProfileGet } from \"./get\";\nimport { executeProfileSetPicture } from \"./set-picture\";\nimport { executeProfileSetUsername } from \"./set-username\";\nimport { executeProfileSetBio } from \"./set-bio\";\nimport { executeProfileSetTokenAddress } from \"./set-token-address\";\nimport { executeProfileSetCanvas } from \"./set-canvas\";\nimport { executeProfileGetCanvas } from \"./get-canvas\";\n\n/**\n * Register the profile command with the commander program\n */\nexport function registerProfileCommand(program: Command): void {\n // Command group\n const profileCommand = program\n .command(\"profile\")\n .description(\"User profile operations\");\n\n // Get subcommand (read-only)\n const getCommand = new Command(\"get\")\n .description(\"Get profile data for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get profile for\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGet({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Set-picture subcommand (write)\n const setPictureCommand = new Command(\"set-picture\")\n .description(\"Set your profile picture URL\")\n .requiredOption(\"--url <url>\", \"Image URL for profile picture\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetPicture({\n url: options.url,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-x-username subcommand (write)\n const setUsernameCommand = new Command(\"set-x-username\")\n .description(\"Set your X (Twitter) username for your profile\")\n .requiredOption(\n \"--username <username>\",\n \"Your X (Twitter) username (with or without @)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetUsername({\n username: options.username,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-bio subcommand (write)\n const setBioCommand = new Command(\"set-bio\")\n .description(\"Set your profile bio\")\n .requiredOption(\"--bio <bio>\", \"Your profile bio (max 280 characters)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetBio({\n bio: options.bio,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-token-address subcommand (write)\n const setTokenAddressCommand = new Command(\"set-token-address\")\n .description(\"Set your profile token address (ERC-20 token that represents you)\")\n .requiredOption(\n \"--token-address <address>\",\n \"ERC-20 token contract address (0x-prefixed)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetTokenAddress({\n tokenAddress: options.tokenAddress,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-canvas subcommand (write)\n const setCanvasCommand = new Command(\"set-canvas\")\n .description(\"Set your profile canvas (HTML content)\")\n .option(\"--file <path>\", \"Path to file containing canvas content\")\n .option(\"--content <html>\", \"HTML content for canvas (inline)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetCanvas({\n file: options.file,\n content: options.content,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Get-canvas subcommand (read-only)\n const getCanvasCommand = new Command(\"get-canvas\")\n .description(\"Get profile canvas for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get canvas for\")\n .option(\"--output <path>\", \"Write canvas content to file instead of stdout\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGetCanvas({\n address: options.address,\n output: options.output,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n profileCommand.addCommand(getCommand);\n profileCommand.addCommand(setPictureCommand);\n profileCommand.addCommand(setUsernameCommand);\n profileCommand.addCommand(setBioCommand);\n profileCommand.addCommand(setTokenAddressCommand);\n profileCommand.addCommand(setCanvasCommand);\n profileCommand.addCommand(getCanvasCommand);\n}\n","/**\n * Format a price number for display (removes trailing zeros)\n */\nexport function formatEthPrice(price: number): string {\n return price.toFixed(6).replace(/\\.?0+$/, \"\");\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListListingsOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListListings(options: ListListingsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}` | undefined,\n });\n\n if (options.json) {\n const output = listings.map((l) => ({\n orderHash: l.orderHash,\n maker: l.maker,\n nftAddress: l.nftAddress,\n tokenId: l.tokenId,\n price: l.price,\n priceWei: l.priceWei.toString(),\n currency: l.currency,\n expirationDate: l.expirationDate,\n orderStatus: l.orderStatus,\n ...(l.targetFulfiller ? { targetFulfiller: l.targetFulfiller } : {}),\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (listings.length === 0) {\n console.log(chalk.yellow(\"No active listings found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nListings (${listings.length}):\\n`));\n\n for (const listing of listings) {\n const expiry = new Date(listing.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${listing.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${listing.maker}`);\n console.log(` ${chalk.cyan(\"NFT:\")} ${listing.nftAddress} #${listing.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(listing.price)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n if (listing.targetFulfiller) {\n console.log(` ${chalk.cyan(\"Private (for):\")} ${listing.targetFulfiller}`);\n }\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch listings: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListOffersOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListOffers(options: ListOffersOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = offers.map((o) => ({\n orderHash: o.orderHash,\n maker: o.maker,\n nftAddress: o.nftAddress,\n price: o.price,\n priceWei: o.priceWei.toString(),\n currency: o.currency,\n expirationDate: o.expirationDate,\n orderStatus: o.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (offers.length === 0) {\n console.log(chalk.yellow(\"No active collection offers found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nCollection Offers (${offers.length}):\\n`));\n\n for (const offer of offers) {\n const expiry = new Date(offer.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${offer.orderHash}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${offer.maker}`);\n console.log(` ${chalk.cyan(\"Collection:\")} ${offer.nftAddress}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(offer.price)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch offers: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListSalesOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListSales(options: ListSalesOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const sales = await bazaarClient.getSales({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = sales.map((s) => ({\n orderHash: s.orderHash,\n seller: s.seller,\n buyer: s.buyer,\n tokenAddress: s.tokenAddress,\n tokenId: s.tokenId,\n amount: s.amount.toString(),\n price: s.price,\n priceWei: s.priceWei.toString(),\n currency: s.currency,\n timestamp: s.timestamp,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (sales.length === 0) {\n console.log(chalk.yellow(\"No sales found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nSales (${sales.length}):\\n`));\n\n for (const sale of sales) {\n const date = new Date(sale.timestamp * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${sale.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${sale.seller}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${sale.buyer}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${sale.tokenAddress} #${sale.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(sale.price)} ${sale.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Date:\")} ${date}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch sales: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateListingOptions } from \"./types\";\n\nexport async function executeCreateListing(options: CreateListingOptions): Promise<void> {\n // Dual mode: with private key = full flow, without = output EIP-712 data\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing listing...\"));\n\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: account.address,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if needed\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing order...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the listing\n console.log(chalk.blue(\"Submitting listing...\"));\n const submitTx = bazaarClient.prepareSubmitListing(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Listing created successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateListingOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateOfferOptions } from \"./types\";\n\nexport async function executeCreateOffer(options: CreateOfferOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing collection offer...\"));\n\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if needed (WETH approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing offer...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the offer\n console.log(chalk.blue(\"Submitting offer...\"));\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Collection offer created successfully!\\n Transaction: ${hash}\\n Collection: ${options.nftAddress}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateOfferOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitListingOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitListing(options: SubmitListingOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Submitting listing...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Listing submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitListingOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitOfferOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitOffer(options: SubmitOfferOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Submitting offer...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Offer submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitOfferOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { BuyListingOptions } from \"./types\";\n\nexport async function executeBuyListing(options: BuyListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching listing...\"));\n\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, account.address);\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if any\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Listing fulfilled successfully!\\n Transaction: ${hash}\\n NFT: ${listing.nftAddress} #${listing.tokenId}\\n Price: ${listing.price} ${listing.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: BuyListingOptions): Promise<void> {\n if (!options.buyer) {\n exitWithError(\"--buyer is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const buyerAddress = options.buyer as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, buyerAddress);\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { AcceptOfferOptions } from \"./types\";\n\nexport async function executeAcceptOffer(options: AcceptOfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching offers...\"));\n\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n account.address\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if any (ERC721 approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Offer accepted successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: AcceptOfferOptions): Promise<void> {\n if (!options.seller) {\n exitWithError(\"--seller is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const sellerAddress = options.seller as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n sellerAddress\n );\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { OwnedNftsOptions } from \"./types\";\n\nexport async function executeOwnedNfts(options: OwnedNftsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const startTokenId = options.startTokenId ? BigInt(options.startTokenId) : undefined;\n const endTokenId = options.endTokenId ? BigInt(options.endTokenId) : undefined;\n\n try {\n const tokenIds = await bazaarClient.getOwnedTokens({\n nftAddress: options.nftAddress as `0x${string}`,\n ownerAddress: options.owner as `0x${string}`,\n startTokenId,\n endTokenId,\n });\n\n if (options.json) {\n const output = {\n nftAddress: options.nftAddress,\n owner: options.owner,\n tokenIds: tokenIds.map((id) => id.toString()),\n count: tokenIds.length,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (tokenIds.length === 0) {\n console.log(chalk.yellow(\"No owned tokens found in the specified range\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nOwned Tokens (${tokenIds.length}):\\n`));\n console.log(` ${chalk.cyan(\"Collection:\")} ${options.nftAddress}`);\n console.log(` ${chalk.cyan(\"Owner:\")} ${options.owner}`);\n console.log(` ${chalk.cyan(\"Token IDs:\")} ${tokenIds.map((id) => id.toString()).join(\", \")}`);\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to fetch owned tokens: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeListListings } from \"./list-listings\";\nimport { executeListOffers } from \"./list-offers\";\nimport { executeListSales } from \"./list-sales\";\nimport { executeCreateListing } from \"./create-listing\";\nimport { executeCreateOffer } from \"./create-offer\";\nimport { executeSubmitListing } from \"./submit-listing\";\nimport { executeSubmitOffer } from \"./submit-offer\";\nimport { executeBuyListing } from \"./buy-listing\";\nimport { executeAcceptOffer } from \"./accept-offer\";\nimport { executeOwnedNfts } from \"./owned-nfts\";\n\nconst chainIdOption = [\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value: string) => parseInt(value, 10),\n] as const;\n\nconst rpcUrlOption = [\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\",\n] as const;\n\nconst privateKeyOption = [\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\",\n] as const;\n\nexport function registerBazaarCommand(program: Command): void {\n const bazaarCommand = program\n .command(\"bazaar\")\n .description(\"Bazaar NFT trading operations\");\n\n const listListingsCommand = new Command(\"list-listings\")\n .description(\"List active NFT listings\")\n .option(\"--nft-address <address>\", \"NFT contract address (optional for cross-collection)\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListListings({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listOffersCommand = new Command(\"list-offers\")\n .description(\"List active collection offers\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListOffers({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listSalesCommand = new Command(\"list-sales\")\n .description(\"List recent sales\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListSales({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const createListingCommand = new Command(\"create-listing\")\n .description(\"Create an NFT listing (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to list\")\n .requiredOption(\"--price <eth>\", \"Price in ETH (e.g., 0.1)\")\n .option(\"--target-fulfiller <address>\", \"Make a private listing for this address\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateListing({\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n price: options.price,\n targetFulfiller: options.targetFulfiller,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const createOfferCommand = new Command(\"create-offer\")\n .description(\"Create a collection offer (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--price <eth>\", \"Offer price in ETH (e.g., 0.1)\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateOffer({\n nftAddress: options.nftAddress,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const submitListingCommand = new Command(\"submit-listing\")\n .description(\"Submit a signed listing (follow-up to create-listing without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-listing output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitListing({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const submitOfferCommand = new Command(\"submit-offer\")\n .description(\"Submit a signed offer (follow-up to create-offer without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-offer output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitOffer({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const buyListingCommand = new Command(\"buy-listing\")\n .description(\"Buy an NFT listing\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to buy\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(\"--buyer <address>\", \"Buyer address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeBuyListing({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n buyer: options.buyer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const acceptOfferCommand = new Command(\"accept-offer\")\n .description(\"Accept a collection offer by selling your NFT\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to accept\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to sell\")\n .option(\"--seller <address>\", \"Seller address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeAcceptOffer({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n seller: options.seller,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const ownedNftsCommand = new Command(\"owned-nfts\")\n .description(\"List NFTs owned by an address\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--owner <address>\", \"Owner address to check\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--start-token-id <id>\", \"Start of token ID range (default: 0)\")\n .option(\"--end-token-id <id>\", \"End of token ID range (default: 10000)\")\n .action(async (options) => {\n await executeOwnedNfts({\n nftAddress: options.nftAddress,\n owner: options.owner,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n startTokenId: options.startTokenId,\n endTokenId: options.endTokenId,\n });\n });\n\n bazaarCommand.addCommand(listListingsCommand);\n bazaarCommand.addCommand(listOffersCommand);\n bazaarCommand.addCommand(listSalesCommand);\n bazaarCommand.addCommand(createListingCommand);\n bazaarCommand.addCommand(createOfferCommand);\n bazaarCommand.addCommand(submitListingCommand);\n bazaarCommand.addCommand(submitOfferCommand);\n bazaarCommand.addCommand(buyListingCommand);\n bazaarCommand.addCommand(acceptOfferCommand);\n bazaarCommand.addCommand(ownedNftsCommand);\n}\n","#!/usr/bin/env node\n\n// Configure proxy support before any network requests\nimport { ProxyAgent, setGlobalDispatcher } from \"undici\";\n\nconst proxyUrl = process.env.https_proxy || process.env.HTTPS_PROXY;\nif (proxyUrl) {\n const agent = new ProxyAgent(proxyUrl);\n setGlobalDispatcher(agent);\n}\n\nimport \"dotenv/config\";\nimport { Command } from \"commander\";\nimport { createRequire } from \"module\";\nimport { registerStorageCommand } from \"../commands/storage\";\nimport { registerMessageCommand } from \"../commands/message\";\nimport { registerChainsCommand } from \"../commands/chains\";\nimport { registerInfoCommand } from \"../commands/info\";\nimport { registerTokenCommand } from \"../commands/token\";\nimport { registerProfileCommand } from \"../commands/profile\";\nimport { registerBazaarCommand } from \"../commands/bazaar\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../../package.json\");\n\nconst program = new Command();\n\nprogram\n .name(\"netp\")\n .description(\"CLI tool for Net Protocol\")\n .version(version);\n\n// Register commands\nregisterStorageCommand(program);\nregisterMessageCommand(program);\nregisterChainsCommand(program);\nregisterInfoCommand(program);\nregisterTokenCommand(program);\nregisterProfileCommand(program);\nregisterBazaarCommand(program);\n\nprogram.parse();\n"]}
1
+ {"version":3,"sources":["../../src/cli/shared.ts","../../src/commands/storage/storage/check.ts","../../src/commands/storage/utils.ts","../../src/commands/storage/transactions/prep.ts","../../src/commands/storage/transactions/filter.ts","../../src/commands/storage/transactions/send.ts","../../src/commands/storage/core/upload.ts","../../src/commands/storage/relay/recheckStorage.ts","../../src/commands/storage/relay/retry.ts","../../src/commands/storage/core/uploadRelay.ts","../../src/commands/storage/core/preview.ts","../../src/shared/output.ts","../../src/commands/storage/core/read.ts","../../src/shared/encode.ts","../../src/commands/storage/core/encode.ts","../../src/commands/storage/index.ts","../../src/shared/client.ts","../../src/commands/message/send.ts","../../src/commands/message/types.ts","../../src/commands/message/read.ts","../../src/commands/message/count.ts","../../src/commands/message/index.ts","../../src/commands/chains/index.ts","../../src/commands/info/index.ts","../../src/commands/token/deploy.ts","../../src/commands/token/info.ts","../../src/commands/token/index.ts","../../src/commands/profile/get.ts","../../src/commands/profile/set-picture.ts","../../src/commands/profile/utils.ts","../../src/commands/profile/set-username.ts","../../src/commands/profile/set-bio.ts","../../src/commands/profile/set-token-address.ts","../../src/commands/profile/set-canvas.ts","../../src/commands/profile/get-canvas.ts","../../src/commands/profile/index.ts","../../src/commands/bazaar/format.ts","../../src/commands/bazaar/list-listings.ts","../../src/commands/bazaar/list-offers.ts","../../src/commands/bazaar/list-sales.ts","../../src/commands/bazaar/create-listing.ts","../../src/commands/bazaar/create-offer.ts","../../src/commands/bazaar/submit-listing.ts","../../src/commands/bazaar/submit-offer.ts","../../src/commands/bazaar/buy-listing.ts","../../src/commands/bazaar/accept-offer.ts","../../src/commands/bazaar/owned-nfts.ts","../../src/commands/bazaar/list-erc20-listings.ts","../../src/commands/bazaar/list-erc20-offers.ts","../../src/commands/bazaar/create-erc20-listing.ts","../../src/commands/bazaar/create-erc20-offer.ts","../../src/commands/bazaar/submit-erc20-listing.ts","../../src/commands/bazaar/submit-erc20-offer.ts","../../src/commands/bazaar/buy-erc20-listing.ts","../../src/commands/bazaar/accept-erc20-offer.ts","../../src/commands/bazaar/index.ts","../../src/commands/feed/format.ts","../../src/commands/feed/list.ts","../../src/shared/state.ts","../../src/commands/feed/types.ts","../../src/commands/feed/read.ts","../../src/shared/wallet.ts","../../src/commands/feed/post.ts","../../src/shared/postId.ts","../../src/commands/feed/comment-write.ts","../../src/commands/feed/comment-read.ts","../../src/commands/feed/register.ts","../../src/commands/feed/replies.ts","../../src/commands/feed/posts.ts","../../src/commands/feed/confirm.ts","../../src/commands/feed/config.ts","../../src/commands/feed/history.ts","../../src/commands/feed/index.ts","../../src/cli/index.ts"],"names":["chalk","hexToString","STORAGE_CONTRACT","StorageClient","getStorageKeyBytes","retryFailedTransactionsPackage","failedIndexes","backendWalletAddress","readFileSync","detectFileTypeFromBase64","base64ToDataUri","privateKeyToAccount","getPublicClient","getChainRpcUrls","createWalletClient","http","shouldSuggestXmlStorage","stringToHex","fs","program","NetClient","Command","executeEncodeOnly","encodeFunctionData","isNetrSupportedChain","NetrClient","PROFILE_METADATA_STORAGE_KEY","parseProfileMetadata","base","publicActions","getProfileMetadataStorageArgs","fs2","PROFILE_CANVAS_STORAGE_KEY","CHUNKED_STORAGE_CONTRACT","path2","fs3","BazaarClient","parseEther","executeKeylessMode","bigintReplacer","calldata","path3","senderNote","client","txConfig","MAX_MESSAGE_LENGTH","resolve","require"],"mappings":"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","file":"index.mjs","sourcesContent":["import chalk from \"chalk\";\nimport type { CommonOptions, ReadOnlyOptions } from \"../shared/types\";\n\n/**\n * Default chain ID (Base mainnet) - used by feed commands\n */\nexport const DEFAULT_CHAIN_ID = 8453;\n\n/**\n * Get chain ID from option or environment variable, exit if not found\n */\nfunction getRequiredChainId(optionValue?: number): number {\n const chainId =\n optionValue ||\n (process.env.NET_CHAIN_ID\n ? parseInt(process.env.NET_CHAIN_ID, 10)\n : undefined);\n\n if (!chainId) {\n console.error(\n chalk.red(\n \"Error: Chain ID is required. Provide via --chain-id flag or NET_CHAIN_ID environment variable\"\n )\n );\n process.exit(1);\n }\n\n return chainId;\n}\n\n/**\n * Get chain ID from option or environment variable, defaulting to Base (8453)\n * Also checks BOTCHAN_* env vars for backward compat\n */\nfunction getChainIdWithDefault(optionValue?: number): number {\n if (optionValue) {\n return optionValue;\n }\n\n const envChainId =\n process.env.BOTCHAN_CHAIN_ID || process.env.NET_CHAIN_ID;\n\n if (envChainId) {\n return parseInt(envChainId, 10);\n }\n\n return DEFAULT_CHAIN_ID;\n}\n\n/**\n * Get RPC URL from option or environment variable\n */\nfunction getRpcUrl(optionValue?: string): string | undefined {\n return optionValue || process.env.NET_RPC_URL;\n}\n\n/**\n * Get RPC URL from option or environment variable, also checking BOTCHAN_* env vars.\n * Used only by feed commands for backward compat.\n */\nfunction getRpcUrlWithBotchanFallback(optionValue?: string): string | undefined {\n return optionValue || process.env.BOTCHAN_RPC_URL || process.env.NET_RPC_URL;\n}\n\n/**\n * Parse and validate common options shared across all commands.\n * Extracts private key, chain ID, and RPC URL from command options or environment variables.\n * @param options - Command options\n * @param supportsEncodeOnly - If true, mention --encode-only in error messages as an alternative\n */\nexport function parseCommonOptions(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or NET_PRIVATE_KEY/PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using NET_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse and validate read-only options for commands that don't need a private key.\n * Extracts chain ID and RPC URL from command options or environment variables.\n */\nexport function parseReadOnlyOptions(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getRequiredChainId(options.chainId),\n rpcUrl: getRpcUrl(options.rpcUrl),\n };\n}\n\n/**\n * Parse read-only options with a default chain ID (8453/Base).\n * Used by feed commands where chain ID is optional.\n * Also checks BOTCHAN_* env vars for backward compat.\n */\nexport function parseReadOnlyOptionsWithDefault(options: {\n chainId?: number;\n rpcUrl?: string;\n}): ReadOnlyOptions {\n return {\n chainId: getChainIdWithDefault(options.chainId),\n rpcUrl: getRpcUrlWithBotchanFallback(options.rpcUrl),\n };\n}\n\n/**\n * Parse common options with a default chain ID (8453/Base).\n * Used by feed write commands where chain ID is optional.\n * Also checks BOTCHAN_* env vars for backward compat.\n */\nexport function parseCommonOptionsWithDefault(\n options: {\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n },\n supportsEncodeOnly = false\n): CommonOptions {\n const privateKey =\n options.privateKey ||\n process.env.BOTCHAN_PRIVATE_KEY ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY;\n\n if (!privateKey) {\n const encodeOnlyHint = supportsEncodeOnly\n ? \", or use --encode-only to output transaction data without submitting\"\n : \"\";\n console.error(\n chalk.red(\n `Error: Private key is required. Provide via --private-key flag or NET_PRIVATE_KEY/BOTCHAN_PRIVATE_KEY environment variable${encodeOnlyHint}`\n )\n );\n process.exit(1);\n }\n\n if (!privateKey.startsWith(\"0x\") || privateKey.length !== 66) {\n console.error(\n chalk.red(\n \"Error: Invalid private key format (must be 0x-prefixed, 66 characters)\"\n )\n );\n process.exit(1);\n }\n\n if (options.privateKey) {\n console.warn(\n chalk.yellow(\n \"Warning: Private key provided via command line. Consider using NET_PRIVATE_KEY environment variable instead.\"\n )\n );\n }\n\n return {\n privateKey: privateKey as `0x${string}`,\n chainId: getChainIdWithDefault(options.chainId),\n rpcUrl: getRpcUrlWithBotchanFallback(options.rpcUrl),\n };\n}\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n StorageCheckResult,\n CheckNormalStorageExistsParams,\n CheckChunkedStorageExistsParams,\n CheckXmlChunksExistParams,\n CheckXmlMetadataExistsParams,\n} from \"../types\";\n\n/**\n * Check if normal storage data exists and matches content\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function checkNormalStorageExists(\n params: CheckNormalStorageExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedContent } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n // Compare content\n const storedContent = hexToString(existing.value as `0x${string}`);\n const matches = storedContent === expectedContent;\n\n return { exists: true, matches };\n}\n\n/**\n * Check if ChunkedStorage data exists\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkChunkedStorageExists(\n params: CheckChunkedStorageExistsParams\n): Promise<boolean> {\n const { storageClient, chunkedHash, operatorAddress } = params;\n const meta = await storageClient.getChunkedMetadata({\n key: chunkedHash,\n operator: operatorAddress,\n });\n\n return meta !== null && meta.chunkCount > 0;\n}\n\n/**\n * Check which XML chunks already exist in ChunkedStorage\n * Returns Set of chunkedStorage hashes that exist\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlChunksExist(\n params: CheckXmlChunksExistParams\n): Promise<Set<string>> {\n const { storageClient, chunkedHashes, operatorAddress } = params;\n const existing = new Set<string>();\n\n // Check each chunk in parallel for efficiency\n await Promise.all(\n chunkedHashes.map(async (hash) => {\n const exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: hash,\n operatorAddress,\n });\n if (exists) {\n existing.add(hash);\n }\n })\n );\n\n return existing;\n}\n\n/**\n * Check if XML metadata exists and matches expected metadata\n * Pure function - uses StorageClient\n * Accepts JSON object as parameter\n */\nexport async function checkXmlMetadataExists(\n params: CheckXmlMetadataExistsParams\n): Promise<StorageCheckResult> {\n const { storageClient, storageKey, operatorAddress, expectedMetadata } = params;\n const existing = await storageClient.get({\n key: storageKey,\n operator: operatorAddress,\n });\n\n if (!existing) {\n return { exists: false };\n }\n\n const storedMetadata = hexToString(existing.value as `0x${string}`);\n const matches = storedMetadata === expectedMetadata;\n\n return { exists: true, matches };\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { encodeStorageKeyForUrl } from \"@net-protocol/storage\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlMetadataExists,\n} from \"./storage/check\";\nimport type {\n TransactionWithId,\n StorageTransactionArgs,\n CheckTransactionExistsParams,\n} from \"./types\";\n\n/**\n * Convert typed args to array (for viem compatibility)\n */\nexport function typedArgsToArray(\n args: StorageTransactionArgs\n): readonly unknown[] {\n if (args.type === \"normal\" || args.type === \"metadata\") {\n return [args.args.key, args.args.text, args.args.value];\n } else {\n return [args.args.hash, args.args.text, args.args.chunks];\n }\n}\n\n/**\n * Extract typed args from WriteTransactionConfig\n */\nexport function extractTypedArgsFromTransaction(\n tx: WriteTransactionConfig,\n type: \"normal\" | \"chunked\" | \"metadata\"\n): StorageTransactionArgs {\n if (type === \"normal\" || type === \"metadata\") {\n return {\n type,\n args: {\n key: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n value: tx.args[2] as `0x${string}`,\n },\n };\n } else {\n return {\n type: \"chunked\",\n args: {\n hash: tx.args[0] as `0x${string}`,\n text: tx.args[1] as string,\n chunks: tx.args[2] as `0x${string}`[],\n },\n };\n }\n}\n\n/**\n * Extract content string from transaction typed args\n * Helper to eliminate duplication of hexToString pattern\n */\nexport function extractContentFromTransaction(\n tx: TransactionWithId\n): string {\n if (tx.typedArgs.type === \"normal\" || tx.typedArgs.type === \"metadata\") {\n return hexToString(tx.typedArgs.args.value);\n } else {\n // For chunked transactions, return empty string (no content to extract)\n return \"\";\n }\n}\n\n/**\n * Generate storage URL for displaying to user\n * Centralizes URL generation logic\n */\nexport function generateStorageUrl(\n operatorAddress: string | undefined,\n chainId: number,\n storageKey: string\n): string | undefined {\n if (!operatorAddress) return undefined;\n return `https://storedon.net/net/${chainId}/storage/load/${\n operatorAddress\n }/${encodeStorageKeyForUrl(storageKey)}`;\n}\n\n/**\n * Check if a transaction's data already exists (idempotency check)\n * Consolidates existence check logic used in both filtering and sending\n * Accepts JSON object as parameter\n */\nexport async function checkTransactionExists(\n params: CheckTransactionExistsParams\n): Promise<boolean> {\n const { storageClient, tx, operatorAddress } = params;\n if (tx.type === \"normal\") {\n // Extract expected content from typed args\n if (tx.typedArgs.type === \"normal\") {\n const expectedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n return check.exists && check.matches === true;\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: hash existence = content match (deterministic hash)\n return await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: extract and compare content\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n return check.exists && check.matches === true;\n }\n }\n return false;\n}\n\n","import { WriteTransactionConfig } from \"@net-protocol/core\";\nimport { StorageClient, getStorageKeyBytes } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport type {\n TransactionWithId,\n NormalStorageArgs,\n PrepareXmlStorageTransactionsParams,\n} from \"../types\";\nimport { extractTypedArgsFromTransaction, typedArgsToArray } from \"../utils\";\n\n/**\n * Prepare normal storage transaction with ID\n * Uses StorageClient.preparePut() from net-public\n * Accepts typed JSON args object instead of individual parameters\n */\nexport function prepareNormalStorageTransaction(\n storageClient: StorageClient,\n args: NormalStorageArgs,\n originalStorageKey: string // Original string key needed for preparePut\n): TransactionWithId {\n // Use StorageClient.preparePut() from net-public\n // preparePut needs the original string key, not bytes32\n const content = hexToString(args.value);\n \n const transaction = storageClient.preparePut({\n key: originalStorageKey,\n text: args.text,\n value: content,\n });\n\n const typedArgs = {\n type: \"normal\" as const,\n args,\n };\n\n return {\n id: args.key,\n type: \"normal\",\n transaction,\n typedArgs,\n };\n}\n\n/**\n * Prepare XML storage transactions with IDs\n * Returns array: [metadata transaction, ...chunk transactions]\n * Uses StorageClient.prepareXmlStorage() from net-public\n * Accepts JSON object as parameter\n */\nexport function prepareXmlStorageTransactions(\n params: PrepareXmlStorageTransactionsParams\n): TransactionWithId[] {\n const { storageClient, storageKey, text, content, operatorAddress } = params;\n const storageKeyBytes = getStorageKeyBytes(storageKey) as `0x${string}`;\n\n // Use StorageClient.prepareXmlStorage() from net-public\n // This handles all the chunking, ChunkedStorage preparation, and metadata generation\n // Pass storageKey as string - prepareXmlStorage will convert it internally\n const result = storageClient.prepareXmlStorage({\n data: content,\n operatorAddress: operatorAddress as `0x${string}`,\n storageKey: storageKey, // Pass as string, not bytes32\n filename: text,\n useChunkedStorageBackend: true, // Use ChunkedStorage backend (default)\n });\n\n // Map WriteTransactionConfig[] to TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const transactions: TransactionWithId[] = result.transactionConfigs.map(\n (tx, index) => {\n if (index === 0) {\n // First transaction is metadata - use our storageKeyBytes for ID\n const typedArgs = extractTypedArgsFromTransaction(tx, \"metadata\");\n return {\n id: storageKeyBytes,\n type: \"metadata\",\n transaction: tx,\n typedArgs,\n };\n } else {\n // Rest are ChunkedStorage transactions\n // Extract typed args and get hash from typed args\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const chunkedHash = typedArgs.args.hash;\n return {\n id: chunkedHash,\n type: \"chunked\",\n transaction: tx,\n typedArgs,\n };\n }\n // This should never happen, but TypeScript needs it\n throw new Error(\"Invalid chunked transaction\");\n }\n }\n );\n\n return transactions;\n}\n\n","import { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { WriteTransactionConfig } from \"@net-protocol/core\";\nimport {\n STORAGE_CONTRACT,\n CHUNKED_STORAGE_CONTRACT,\n} from \"@net-protocol/storage\";\nimport {\n checkNormalStorageExists,\n checkChunkedStorageExists,\n checkXmlChunksExist,\n checkXmlMetadataExists,\n} from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport type {\n TransactionWithId,\n FilterExistingTransactionsParams,\n FilterXmlStorageTransactionsParams,\n} from \"../types\";\n\n/**\n * Filter transactions to only those that need to be sent\n * Checks existence for each transaction and filters out already-stored ones\n * Pure function - uses StorageClient, no side effects\n * Accepts JSON object as parameter\n */\nexport async function filterExistingTransactions(\n params: FilterExistingTransactionsParams\n): Promise<{\n toSend: TransactionWithId[];\n skipped: TransactionWithId[];\n}> {\n const { storageClient, transactions, operatorAddress, expectedContent } =\n params;\n const toSend: TransactionWithId[] = [];\n const skipped: TransactionWithId[] = [];\n\n for (const tx of transactions) {\n let exists = false;\n\n if (tx.type === \"normal\") {\n // Normal storage: always check if exists AND matches content\n if (expectedContent) {\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent,\n });\n exists = check.exists && check.matches === true;\n } else {\n // Extract content from typed args if not provided\n if (tx.typedArgs.type === \"normal\") {\n const storedContent = hexToString(tx.typedArgs.args.value);\n const check = await checkNormalStorageExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedContent: storedContent,\n });\n exists = check.exists && check.matches === true;\n }\n }\n } else if (tx.type === \"chunked\") {\n // ChunkedStorage: check if metadata exists\n exists = await checkChunkedStorageExists({\n storageClient,\n chunkedHash: tx.id,\n operatorAddress,\n });\n } else if (tx.type === \"metadata\") {\n // XML metadata: check if exists\n // Extract expected metadata from typed args (it's hex-encoded)\n if (tx.typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(tx.typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: tx.id,\n operatorAddress,\n expectedMetadata,\n });\n exists = check.exists && check.matches === true;\n }\n }\n\n if (exists) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n\n return { toSend, skipped };\n}\n\n/**\n * Filter XML storage transactions more efficiently\n * Checks all chunks in parallel, then filters\n * Accepts WriteTransactionConfig[] directly and derives chunkedHashes internally\n * Accepts JSON object as parameter\n */\nexport async function filterXmlStorageTransactions(\n params: FilterXmlStorageTransactionsParams\n): Promise<{\n toSend: WriteTransactionConfig[];\n skipped: WriteTransactionConfig[];\n}> {\n const { storageClient, transactions, operatorAddress } = params;\n\n // Separate metadata and chunk transactions by contract address\n const metadataTx = transactions.find(\n (tx) => tx.to.toLowerCase() === STORAGE_CONTRACT.address.toLowerCase()\n );\n const chunkTxs = transactions.filter(\n (tx) => tx.to.toLowerCase() === CHUNKED_STORAGE_CONTRACT.address.toLowerCase()\n );\n\n // Derive chunkedHashes internally from WriteTransactionConfig[] args\n const chunkedHashes: string[] = [];\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash); // Content-based hash (keccak256(xmlChunk))\n }\n }\n\n const toSend: WriteTransactionConfig[] = [];\n const skipped: WriteTransactionConfig[] = [];\n\n // Check which chunks exist (parallel check)\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress,\n });\n\n // Filter chunk transactions\n for (const tx of chunkTxs) {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (existingChunks.has(hash)) {\n skipped.push(tx);\n } else {\n toSend.push(tx);\n }\n }\n }\n\n // Check metadata (if all chunks exist and match, skip metadata too)\n if (metadataTx) {\n const allChunksExist = chunkedHashes.length > 0 && chunkedHashes.every((hash) =>\n existingChunks.has(hash)\n );\n if (allChunksExist) {\n // Verify metadata matches\n try {\n const typedArgs = extractTypedArgsFromTransaction(metadataTx, \"metadata\");\n if (typedArgs.type === \"metadata\") {\n const expectedMetadata = hexToString(typedArgs.args.value);\n const check = await checkXmlMetadataExists({\n storageClient,\n storageKey: typedArgs.args.key,\n operatorAddress,\n expectedMetadata,\n });\n if (check.exists && check.matches) {\n skipped.push(metadataTx);\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n } catch {\n // If we can't extract metadata args, include in toSend\n toSend.unshift(metadataTx);\n }\n } else {\n toSend.unshift(metadataTx); // Metadata first\n }\n }\n\n return { toSend, skipped };\n}\n","import { createWalletClient, http, WalletClient, defineChain, PublicClient } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport {\n getPublicClient,\n getChainRpcUrls,\n} from \"@net-protocol/core\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { checkTransactionExists, typedArgsToArray } from \"../utils\";\nimport type {\n TransactionWithId,\n UploadResult,\n CreateWalletClientParams,\n SendTransactionsParams,\n} from \"../types\";\n\n/**\n * Create wallet client from private key\n * Accepts JSON object as parameter\n */\nexport function createWalletClientFromPrivateKey(\n params: CreateWalletClientParams\n): {\n walletClient: WalletClient;\n publicClient: PublicClient;\n operatorAddress: `0x${string}`;\n} {\n const { privateKey, chainId, rpcUrl } = params;\n const account = privateKeyToAccount(privateKey);\n const publicClient = getPublicClient({ chainId, rpcUrl });\n\n // Get RPC URLs for the chain\n const rpcUrls = getChainRpcUrls({ chainId, rpcUrl });\n\n // Create wallet client with the same chain configuration\n const chain = publicClient.chain\n ? defineChain({\n id: chainId,\n name: publicClient.chain.name,\n nativeCurrency: publicClient.chain.nativeCurrency,\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n blockExplorers: publicClient.chain.blockExplorers,\n })\n : defineChain({\n id: chainId,\n name: `Chain ${chainId}`,\n nativeCurrency: { name: \"Ether\", symbol: \"ETH\", decimals: 18 },\n rpcUrls: {\n default: { http: rpcUrls },\n public: { http: rpcUrls },\n },\n });\n\n const walletClient = createWalletClient({\n account,\n chain,\n transport: http(),\n });\n\n return {\n walletClient,\n publicClient,\n operatorAddress: account.address,\n };\n}\n\n/**\n * Send transactions sequentially with idempotency checks\n * Checks existence before each transaction (handles partial retries)\n * Accepts JSON object as parameter\n */\nexport async function sendTransactionsWithIdempotency(\n params: SendTransactionsParams\n): Promise<UploadResult> {\n const { storageClient, walletClient, publicClient, transactions, operatorAddress } = params;\n let sent = 0;\n let skipped = 0;\n let failed = 0;\n let finalHash: string | undefined;\n const errorMessages: string[] = [];\n\n for (let i = 0; i < transactions.length; i++) {\n const tx = transactions[i];\n\n try {\n // Check if this transaction's data already exists (idempotency)\n // Always compare content, not just check existence\n const exists = await checkTransactionExists({\n storageClient,\n tx,\n operatorAddress,\n });\n\n if (exists) {\n console.log(\n `⏭️ Transaction ${i + 1}/${\n transactions.length\n } skipped (already stored): ${tx.id}`\n );\n skipped++;\n continue;\n }\n\n // Send transaction\n console.log(\n `📤 Sending transaction ${i + 1}/${transactions.length}: ${tx.id}`\n );\n // Convert typed args to array for viem compatibility\n const args = typedArgsToArray(tx.typedArgs);\n if (!walletClient.account) {\n throw new Error(\"Wallet client must have an account\");\n }\n const hash = await walletClient.writeContract({\n account: walletClient.account,\n address: tx.transaction.to as `0x${string}`,\n abi: tx.transaction.abi,\n functionName: tx.transaction.functionName as string,\n args,\n value: tx.transaction.value,\n chain: null,\n });\n\n // Wait for confirmation\n const receipt = await publicClient.waitForTransactionReceipt({ hash });\n console.log(\n `✓ Transaction ${i + 1} confirmed in block ${\n receipt.blockNumber\n } (hash: ${hash})`\n );\n\n sent++;\n finalHash = hash;\n } catch (error) {\n const errorMsg =\n error instanceof Error ? error.message : String(error);\n console.error(`✗ Transaction ${i + 1} failed: ${errorMsg}`);\n errorMessages.push(errorMsg);\n failed++;\n // Continue with remaining transactions (don't fail entire upload)\n }\n }\n\n return {\n success: failed === 0,\n skipped: skipped > 0,\n transactionsSent: sent,\n transactionsSkipped: skipped,\n transactionsFailed: failed,\n finalHash,\n error: errorMessages.length > 0 ? errorMessages.join(\"; \") : undefined,\n };\n}\n\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport {\n createWalletClientFromPrivateKey,\n sendTransactionsWithIdempotency,\n} from \"../transactions/send\";\nimport type {\n UploadOptions,\n UploadResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Main upload function - orchestrates the entire upload process\n */\nexport async function uploadFile(\n options: UploadOptions\n): Promise<UploadResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client\n const { walletClient, publicClient, operatorAddress } =\n createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let skippedCount = 0;\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n skippedCount = filteredSkipped.length;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n skippedCount = filtered.skipped.length;\n }\n\n // 7. Check if all transactions were skipped\n if (transactionsToSend.length === 0) {\n return {\n success: true,\n skipped: true,\n transactionsSent: 0,\n transactionsSkipped: skippedCount,\n transactionsFailed: 0,\n operatorAddress,\n storageType,\n };\n }\n\n // 8. Send transactions\n const result = await sendTransactionsWithIdempotency({\n storageClient,\n walletClient,\n publicClient,\n transactions: transactionsToSend,\n operatorAddress,\n });\n\n // Add skipped count from filtering step\n result.transactionsSkipped += skippedCount;\n\n // Add operator address and storage type to result\n result.operatorAddress = operatorAddress;\n result.storageType = storageType;\n\n return result;\n}\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport { checkXmlChunksExist } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\n\n/**\n * Storage-specific recheck function for retry logic\n *\n * Re-checks failed transactions on-chain before retry to filter out\n * transactions that have succeeded since the last attempt.\n *\n * This is storage-specific because it uses checkXmlChunksExist and\n * extractTypedArgsFromTransaction which understand storage transaction types.\n *\n * @param failedIndexes - Indexes of failed transactions\n * @param transactions - Original transaction configs\n * @param backendWalletAddress - Backend wallet address (operator for storage checks)\n * @returns Array of transaction indexes that still need to be retried\n */\nexport async function recheckFailedTransactionsStorage(\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n storageClient: StorageClient,\n backendWalletAddress: Address\n): Promise<number[]> {\n if (failedIndexes.length === 0) {\n return [];\n }\n\n // Extract chunked hashes from failed transactions\n const failedTransactions = failedIndexes.map((idx) => transactions[idx]);\n const chunkedHashes: string[] = [];\n\n for (const tx of failedTransactions) {\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n chunkedHashes.push(typedArgs.args.hash);\n }\n } catch {\n // Not a chunked transaction, skip\n }\n }\n\n if (chunkedHashes.length === 0) {\n // No chunked transactions to check, return all failed indexes\n return failedIndexes;\n }\n\n // Check which chunks exist on-chain\n const existingChunks = await checkXmlChunksExist({\n storageClient,\n chunkedHashes,\n operatorAddress: backendWalletAddress,\n });\n\n // Filter out indexes where the transaction has succeeded\n const stillFailed: number[] = [];\n\n for (const failedIdx of failedIndexes) {\n const tx = transactions[failedIdx];\n try {\n const typedArgs = extractTypedArgsFromTransaction(tx, \"chunked\");\n if (typedArgs.type === \"chunked\") {\n const hash = typedArgs.args.hash;\n if (!existingChunks.has(hash)) {\n // Transaction still hasn't succeeded\n stillFailed.push(failedIdx);\n }\n // If hash exists, transaction succeeded, skip retry\n } else {\n // Non-chunked transaction, always retry\n stillFailed.push(failedIdx);\n }\n } catch {\n // Can't determine type, retry to be safe\n stillFailed.push(failedIdx);\n }\n }\n\n return stillFailed;\n}\n\n","import type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { StorageClient } from \"@net-protocol/storage\";\nimport type { Address } from \"viem\";\nimport type { RetryConfig, RelaySubmitResult } from \"@net-protocol/relay\";\nimport type { RetryFailedTransactionsParams } from \"./types\";\nimport { retryFailedTransactions as retryFailedTransactionsPackage } from \"@net-protocol/relay\";\nimport { recheckFailedTransactionsStorage } from \"./recheckStorage\";\n\n/**\n * Retry failed transactions with exponential backoff\n *\n * This is a wrapper around the package retryFailedTransactions that adds\n * storage-specific recheck logic.\n *\n * @param params - Retry parameters\n * @returns Final success/failure status after retries\n */\nexport async function retryFailedTransactions(\n params: RetryFailedTransactionsParams\n): Promise<RelaySubmitResult> {\n const {\n storageClient,\n backendWalletAddress,\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n config,\n sessionToken,\n } = params;\n\n // Use storage-specific recheck function\n return retryFailedTransactionsPackage({\n apiUrl,\n chainId,\n operatorAddress,\n secretKey,\n failedIndexes,\n originalTransactions,\n backendWalletAddress,\n config,\n sessionToken,\n recheckFunction: async (\n failedIndexes: number[],\n transactions: WriteTransactionConfig[],\n backendWalletAddress: Address\n ) => {\n return recheckFailedTransactionsStorage(\n failedIndexes,\n transactions,\n storageClient,\n backendWalletAddress\n );\n },\n });\n}\n","import { readFileSync } from \"fs\";\nimport {\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { http, createWalletClient } from \"viem\";\nimport { getPublicClient, getChainRpcUrls } from \"@net-protocol/core\";\nimport type { Address, Hash } from \"viem\";\nimport { filterXmlStorageTransactions } from \"../transactions/filter\";\nimport { checkXmlMetadataExists } from \"../storage/check\";\nimport { extractTypedArgsFromTransaction } from \"../utils\";\nimport {\n createRelayX402Client,\n fundBackendWallet,\n checkBackendWalletBalance,\n submitTransactionsViaRelay,\n waitForConfirmations,\n createRelaySession,\n batchTransactions,\n} from \"@net-protocol/relay\";\nimport { retryFailedTransactions } from \"../relay/retry\";\nimport type {\n UploadWithRelayOptions,\n UploadWithRelayResult,\n} from \"../relay/types\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Main upload function with relay - orchestrates the entire relay upload process\n *\n * Flow:\n * 1. Read file\n * 2. Fund backend wallet (x402 payment)\n * 3. Prepare transactions with backendWalletAddress as operator\n * 4. Split transactions (metadata vs chunks)\n * 5. Filter existing transactions (idempotency)\n * 6. Submit chunks via relay (backend wallet pays gas)\n * 7. Retry failed chunks\n * 8. Submit metadata directly (user pays gas)\n * 9. Wait for confirmations\n * 10. Return result\n */\nexport async function uploadFileWithRelay(\n options: UploadWithRelayOptions\n): Promise<UploadWithRelayResult> {\n const errors: Error[] = [];\n\n // 1. Read file\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n const base64String = fileBuffer.toString(\"base64\");\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n fileContent = base64ToDataUri(base64String);\n } else {\n fileContent = base64String;\n }\n } else {\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n // Note: Relay upload always uses XML storage format, regardless of file size\n // prepareXmlStorage() handles small files by creating a single chunk with XML metadata\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 4. Create user wallet client\n const userAccount = privateKeyToAccount(options.privateKey);\n const userAddress = userAccount.address;\n const publicClient = getPublicClient({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const rpcUrls = getChainRpcUrls({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const userWalletClient = createWalletClient({\n account: userAccount,\n chain: publicClient.chain!,\n transport: http(rpcUrls[0]), // Use first RPC URL\n });\n\n // 5. Setup x402 client\n const { fetchWithPayment, httpClient } = createRelayX402Client(\n userAccount,\n options.chainId\n );\n\n // 5.5. Create relay session token (sign once, reuse for all batches)\n // Session token is required for all submit requests\n const sessionResult = await createRelaySession({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n account: userAccount,\n expiresIn: 3600, // 1 hour - should be enough for most uploads\n });\n const sessionToken = sessionResult.sessionToken;\n console.log(\"✓ Session token created (valid for 1 hour)\");\n\n // 6. Check backend wallet balance and fund if needed\n // Check balance first to avoid unnecessary payments\n let backendWalletAddress: Address | undefined;\n let shouldFund = true;\n\n try {\n const balanceResult = await checkBackendWalletBalance({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n });\n backendWalletAddress = balanceResult.backendWalletAddress;\n\n // Only fund if balance is insufficient\n shouldFund = !balanceResult.sufficientBalance;\n } catch (error) {\n // If balance check fails, fall back to funding (for backwards compatibility)\n // This handles cases where the balance endpoint might not be available\n shouldFund = true;\n }\n\n // Fund backend wallet only if balance is insufficient\n // This ensures backendWalletAddress is always set\n if (shouldFund) {\n const fundResult = await fundBackendWallet({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n fetchWithPayment,\n httpClient,\n });\n backendWalletAddress = fundResult.backendWalletAddress;\n }\n\n // TypeScript assertion: backendWalletAddress is guaranteed to be set at this point\n // (either from balance check or fund call)\n if (!backendWalletAddress) {\n throw new Error(\"Failed to determine backend wallet address\");\n }\n\n // backendWalletAddress is now guaranteed to be set (either from balance check or fund call)\n\n // 7. Prepare chunks with backendWalletAddress as operator (chunks submitted via relay)\n // Use StorageClient.prepareXmlStorage() to get chunk transactions\n const chunkPrepareResult = storageClient.prepareXmlStorage({\n data: fileContent,\n operatorAddress: backendWalletAddress,\n storageKey: options.storageKey,\n filename: options.text,\n useChunkedStorageBackend: true,\n });\n\n const chunkTxs = chunkPrepareResult.transactionConfigs.slice(1); // Skip metadata, get chunks\n const topLevelHash = chunkPrepareResult.topLevelHash;\n const chunkMetadata = chunkPrepareResult.metadata; // XML metadata referencing backend wallet chunks\n\n // 8. Prepare metadata transaction separately with userAddress as operator\n // Metadata is submitted directly by user, so it should use userAddress\n // We use the same XML metadata string (which references chunks stored by backend wallet)\n const metadataTx = storageClient.preparePut({\n key: topLevelHash,\n text: options.text,\n value: chunkMetadata, // Use the XML metadata from chunk preparation\n });\n\n // 9. Filter existing chunks (idempotency check with backendWalletAddress)\n const filteredChunks = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTxs,\n operatorAddress: backendWalletAddress,\n });\n\n const chunksToSend = filteredChunks.toSend;\n const chunksSkipped = filteredChunks.skipped.length;\n\n // 10. Check if metadata already exists (with userAddress as operator)\n // Extract metadata args from the prepared transaction\n const metadataStorageKey = metadataTx.args[0] as `0x${string}`;\n const expectedMetadata = hexToString(metadataTx.args[2] as `0x${string}`);\n let metadataNeedsSubmission = true;\n\n const metadataCheck = await checkXmlMetadataExists({\n storageClient,\n storageKey: metadataStorageKey,\n operatorAddress: userAddress, // User is operator for metadata\n expectedMetadata,\n });\n if (metadataCheck.exists && metadataCheck.matches) {\n metadataNeedsSubmission = false;\n }\n\n // 11. Batch and submit chunks via relay (if any)\n let chunkTransactionHashes: Hash[] = [];\n let chunksSent = 0;\n\n if (chunksToSend.length > 0) {\n try {\n // Batch chunks to respect server limits (100 transactions, 1MB per request)\n const batches = batchTransactions(chunksToSend);\n const totalBatches = batches.length;\n\n if (totalBatches > 1) {\n console.log(\n `📦 Splitting ${chunksToSend.length} chunks into ${totalBatches} batch(es)`\n );\n }\n\n // Submit batches sequentially\n for (let batchIndex = 0; batchIndex < batches.length; batchIndex++) {\n const batch = batches[batchIndex];\n\n if (totalBatches > 1) {\n console.log(\n `📤 Sending batch ${batchIndex + 1}/${totalBatches} (${\n batch.length\n } transactions)...`\n );\n }\n\n const submitResult = await submitTransactionsViaRelay({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n transactions: batch,\n sessionToken,\n });\n\n chunkTransactionHashes.push(...submitResult.transactionHashes);\n chunksSent += submitResult.successfulIndexes.length;\n\n // Check if ALL transactions in this batch failed\n if (submitResult.failedIndexes.length === batch.length) {\n // All transactions failed - likely due to insufficient funds or network issues\n // Don't retry (would waste app fees) and stop processing subsequent batches\n const errorMessage =\n `Batch ${batchIndex + 1}: All ${\n batch.length\n } transactions failed. ` +\n `Likely due to insufficient backend wallet balance or network issues. ` +\n `Stopping batch processing to avoid wasting app fees.`;\n\n console.error(`❌ ${errorMessage}`);\n errors.push(new Error(errorMessage));\n\n // Stop processing subsequent batches\n break;\n }\n\n // 12. Retry failed chunks in this batch if any (only if some succeeded - partial failure)\n if (\n submitResult.failedIndexes.length > 0 &&\n submitResult.successfulIndexes.length > 0\n ) {\n // Map failed indexes to actual transactions from this batch\n const failedTxs = submitResult.failedIndexes.map((idx) => batch[idx]);\n\n try {\n const retryResult = await retryFailedTransactions({\n apiUrl: options.apiUrl,\n chainId: options.chainId,\n operatorAddress: userAddress,\n secretKey: options.secretKey,\n failedIndexes: submitResult.failedIndexes,\n originalTransactions: failedTxs,\n storageClient,\n backendWalletAddress,\n sessionToken,\n });\n\n // Merge retry results\n chunkTransactionHashes.push(...retryResult.transactionHashes);\n chunksSent += retryResult.successfulIndexes.length;\n\n if (retryResult.failedIndexes.length > 0) {\n errors.push(\n new Error(\n `Batch ${batchIndex + 1}: ${\n retryResult.failedIndexes.length\n } transactions failed after retries`\n )\n );\n }\n } catch (retryError) {\n errors.push(\n retryError instanceof Error\n ? retryError\n : new Error(\n `Batch ${batchIndex + 1} retry failed: ${String(\n retryError\n )}`\n )\n );\n }\n }\n\n // Optional: Wait for batch confirmations before next batch\n // This ensures we don't overwhelm the network and provides progress feedback\n if (\n batchIndex < batches.length - 1 &&\n chunkTransactionHashes.length > 0\n ) {\n // Get the hashes from this batch\n const batchHashes = chunkTransactionHashes.slice(\n -submitResult.successfulIndexes.length\n );\n if (batchHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: batchHashes,\n confirmations: 1, // Just 1 confirmation between batches\n timeout: 30000, // 30 second timeout per batch\n });\n } catch (confirmationError) {\n // Log but don't fail - we'll wait for all confirmations later\n console.warn(\n `⚠️ Batch ${\n batchIndex + 1\n } confirmation timeout (continuing...)`\n );\n }\n }\n }\n }\n } catch (submitError) {\n errors.push(\n submitError instanceof Error\n ? submitError\n : new Error(`Chunk submission failed: ${String(submitError)}`)\n );\n }\n }\n\n // 13. Wait for chunk transaction confirmations\n if (chunkTransactionHashes.length > 0) {\n try {\n await waitForConfirmations({\n publicClient,\n transactionHashes: chunkTransactionHashes,\n confirmations: 1,\n timeout: 60000,\n });\n } catch (confirmationError) {\n errors.push(\n confirmationError instanceof Error\n ? confirmationError\n : new Error(`Chunk confirmation failed: ${String(confirmationError)}`)\n );\n }\n }\n\n // 14. Submit metadata directly (user pays gas)\n let metadataTransactionHash: Hash | undefined;\n if (metadataNeedsSubmission) {\n try {\n metadataTransactionHash = await userWalletClient.writeContract({\n address: metadataTx.to as Address,\n abi: metadataTx.abi,\n functionName: metadataTx.functionName,\n args: metadataTx.args,\n value:\n metadataTx.value !== undefined && metadataTx.value > BigInt(0)\n ? metadataTx.value\n : undefined,\n });\n\n // Wait for metadata confirmation\n await waitForConfirmations({\n publicClient,\n transactionHashes: [metadataTransactionHash],\n confirmations: 1,\n timeout: 60000,\n });\n } catch (metadataError) {\n errors.push(\n metadataError instanceof Error\n ? metadataError\n : new Error(`Metadata submission failed: ${String(metadataError)}`)\n );\n }\n }\n\n // 15. Return result\n return {\n success: errors.length === 0,\n topLevelHash,\n chunksSent,\n chunksSkipped,\n metadataSubmitted:\n metadataNeedsSubmission && metadataTransactionHash !== undefined,\n chunkTransactionHashes,\n metadataTransactionHash,\n backendWalletAddress,\n errors: errors.length > 0 ? errors : undefined,\n };\n}\n","import { readFileSync } from \"fs\";\nimport {\n shouldSuggestXmlStorage,\n getStorageKeyBytes,\n detectFileTypeFromBase64,\n base64ToDataUri,\n} from \"@net-protocol/storage\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { stringToHex } from \"viem\";\nimport {\n prepareNormalStorageTransaction,\n prepareXmlStorageTransactions,\n} from \"../transactions/prep\";\nimport {\n filterExistingTransactions,\n filterXmlStorageTransactions,\n} from \"../transactions/filter\";\nimport { createWalletClientFromPrivateKey } from \"../transactions/send\";\nimport type {\n UploadOptions,\n PreviewResult,\n TransactionWithId,\n NormalStorageArgs,\n} from \"../types\";\n\n/**\n * Preview function - performs all prep steps but doesn't submit transactions\n * Returns statistics about what would be uploaded\n */\nexport async function previewFile(\n options: UploadOptions\n): Promise<PreviewResult> {\n // 1. Read file\n // Read file as buffer (binary) first\n const fileBuffer = readFileSync(options.filePath);\n\n // Detect if file is binary\n // Check for null bytes or non-text characters (excluding common whitespace)\n const isBinary = fileBuffer.some(\n (byte) =>\n byte === 0 || (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13)\n );\n\n // Convert based on file type\n let fileContent: string;\n if (isBinary) {\n // Convert binary file to base64 string (valid UTF-8)\n const base64String = fileBuffer.toString(\"base64\");\n\n // Detect file type and add data URI prefix if detected\n const detectedType = detectFileTypeFromBase64(base64String);\n if (detectedType) {\n // Include data URI prefix for better type preservation\n // Format: \"data:audio/mpeg;base64,SUQz...\"\n fileContent = base64ToDataUri(base64String);\n } else {\n // Fallback to raw base64 if detection fails\n fileContent = base64String;\n }\n } else {\n // Read as UTF-8 for text files\n fileContent = fileBuffer.toString(\"utf-8\");\n }\n\n // 2. Create StorageClient\n const storageClient = new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // 3. Create wallet client (needed for operator address)\n const { operatorAddress } = createWalletClientFromPrivateKey({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // 4. Determine storage type\n const useXmlStorage = shouldSuggestXmlStorage(fileContent);\n const storageType: \"normal\" | \"xml\" = useXmlStorage ? \"xml\" : \"normal\";\n\n // 5. Prepare transactions\n let transactions: TransactionWithId[];\n\n if (useXmlStorage) {\n transactions = prepareXmlStorageTransactions({\n storageClient,\n storageKey: options.storageKey,\n text: options.text,\n content: fileContent,\n operatorAddress,\n });\n // No need to extract chunkedHashes - filterXmlStorageTransactions derives them internally\n } else {\n // Build typed args JSON object\n const storageKeyBytes = getStorageKeyBytes(\n options.storageKey\n ) as `0x${string}`;\n const typedArgs: NormalStorageArgs = {\n key: storageKeyBytes,\n text: options.text,\n value: stringToHex(fileContent),\n };\n\n transactions = [\n prepareNormalStorageTransaction(\n storageClient,\n typedArgs,\n options.storageKey // Pass original string key for preparePut\n ),\n ];\n }\n\n // 6. Filter existing transactions (idempotency)\n let transactionsToSend: TransactionWithId[];\n let transactionsSkipped: TransactionWithId[];\n\n if (useXmlStorage) {\n // Extract WriteTransactionConfig[] from TransactionWithId[]\n // First transaction is metadata, rest are chunk transactions\n const chunkTransactions = transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => tx.transaction);\n\n // Create a map from WriteTransactionConfig to TransactionWithId for easy lookup\n const txConfigToTxWithId = new Map(\n transactions\n .filter((tx) => tx.type === \"chunked\")\n .map((tx) => [tx.transaction, tx])\n );\n\n const filtered = await filterXmlStorageTransactions({\n storageClient,\n transactions: chunkTransactions, // Only chunk transactions\n operatorAddress,\n });\n\n // Map filtered WriteTransactionConfig[] back to TransactionWithId[]\n const filteredToSend: TransactionWithId[] = filtered.toSend\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n const filteredSkipped: TransactionWithId[] = filtered.skipped\n .map((txConfig) => txConfigToTxWithId.get(txConfig))\n .filter((tx): tx is TransactionWithId => tx !== undefined);\n\n // Metadata is handled separately - check if it needs to be sent\n const metadataTx = transactions.find((tx) => tx.type === \"metadata\");\n if (metadataTx) {\n // For now, always include metadata in toSend (caller should check separately)\n filteredToSend.unshift(metadataTx);\n }\n\n transactionsToSend = filteredToSend;\n transactionsSkipped = filteredSkipped;\n } else {\n const filtered = await filterExistingTransactions({\n storageClient,\n transactions,\n operatorAddress,\n expectedContent: fileContent,\n });\n transactionsToSend = filtered.toSend;\n transactionsSkipped = filtered.skipped;\n }\n\n // Calculate statistics\n if (useXmlStorage) {\n // XML storage: separate chunks from metadata\n const chunkTransactions = transactions.filter(\n (tx) => tx.type === \"chunked\"\n );\n const metadataTransaction = transactions.find(\n (tx) => tx.type === \"metadata\"\n );\n\n const totalChunks = chunkTransactions.length;\n const alreadyStoredChunks = transactionsSkipped.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const needToStoreChunks = transactionsToSend.filter(\n (tx) => tx.type === \"chunked\"\n ).length;\n const metadataNeedsStorage = metadataTransaction\n ? transactionsToSend.some((tx) => tx.type === \"metadata\")\n : false;\n\n return {\n storageType: \"xml\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n metadataNeedsStorage,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n } else {\n // Normal storage: single transaction counts as 1 chunk\n const totalChunks = 1;\n const alreadyStoredChunks = transactionsSkipped.length;\n const needToStoreChunks = transactionsToSend.length;\n\n return {\n storageType: \"normal\",\n totalChunks,\n alreadyStoredChunks,\n needToStoreChunks,\n operatorAddress,\n storageKey: options.storageKey,\n totalTransactions: transactions.length,\n transactionsToSend: transactionsToSend.length,\n transactionsSkipped: transactionsSkipped.length,\n };\n }\n}\n","import chalk from \"chalk\";\nimport type { NetMessage } from \"@net-protocol/core\";\n\n/**\n * Format a message for human-readable output\n */\nexport function formatMessage(\n message: NetMessage,\n index: number\n): string {\n const timestamp = new Date(Number(message.timestamp) * 1000).toISOString();\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${message.sender}`,\n ` ${chalk.white(\"App:\")} ${message.app}`,\n ];\n\n if (message.topic) {\n lines.push(` ${chalk.white(\"Topic:\")} ${message.topic}`);\n }\n\n lines.push(` ${chalk.white(\"Text:\")} ${message.text}`);\n\n if (message.data && message.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${message.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a message for JSON output\n */\nexport function messageToJson(\n message: NetMessage,\n index: number\n): Record<string, unknown> {\n return {\n index,\n sender: message.sender,\n app: message.app,\n timestamp: Number(message.timestamp),\n text: message.text,\n topic: message.topic,\n data: message.data,\n };\n}\n\n/**\n * Print messages in human-readable or JSON format\n */\nexport function printMessages(\n messages: NetMessage[],\n startIndex: number,\n json: boolean\n): void {\n if (json) {\n const output = messages.map((msg, i) => messageToJson(msg, startIndex + i));\n console.log(JSON.stringify(output, null, 2));\n } else {\n if (messages.length === 0) {\n console.log(chalk.yellow(\"No messages found\"));\n return;\n }\n\n messages.forEach((msg, i) => {\n console.log(formatMessage(msg, startIndex + i));\n if (i < messages.length - 1) {\n console.log(); // Empty line between messages\n }\n });\n }\n}\n\n/**\n * Print a count result\n */\nexport function printCount(\n count: number,\n label: string,\n json: boolean\n): void {\n if (json) {\n console.log(JSON.stringify({ count }, null, 2));\n } else {\n console.log(`${chalk.white(label)} ${chalk.cyan(count)}`);\n }\n}\n\n/**\n * Print an error message and exit\n */\nexport function exitWithError(message: string): never {\n console.error(chalk.red(`Error: ${message}`));\n process.exit(1);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport { parseReadOnlyOptions } from \"../../../cli/shared\";\nimport { exitWithError } from \"../../../shared/output\";\n\nexport interface StorageReadOptions {\n key: string;\n operator: string;\n chainId?: number;\n rpcUrl?: string;\n index?: number;\n json?: boolean;\n raw?: boolean;\n}\n\n/**\n * Execute the storage read command\n */\nexport async function executeStorageRead(\n options: StorageReadOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Use readStorageData which handles XML resolution\n const result = await client.readStorageData({\n key: options.key,\n operator: options.operator,\n index: options.index,\n });\n\n if (options.json) {\n const output = {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n text: result.text,\n data: options.raw ? result.data : result.data,\n isXml: result.isXml,\n ...(options.index !== undefined && { index: options.index }),\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nStorage Value:\\n\"));\n console.log(` ${chalk.cyan(\"Key:\")} ${options.key}`);\n console.log(` ${chalk.cyan(\"Operator:\")} ${options.operator}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n if (options.index !== undefined) {\n console.log(` ${chalk.cyan(\"Index:\")} ${options.index}`);\n }\n console.log(` ${chalk.cyan(\"Text:\")} ${result.text || \"(empty)\"}`);\n console.log(` ${chalk.cyan(\"Is XML:\")} ${result.isXml ? \"Yes\" : \"No\"}`);\n\n // For data, show a preview if it's long\n const dataPreview =\n result.data.length > 500\n ? result.data.substring(0, 500) + \"... (truncated)\"\n : result.data;\n\n console.log(` ${chalk.cyan(\"Data:\")}`);\n if (result.data) {\n console.log(chalk.gray(` ${dataPreview.split(\"\\n\").join(\"\\n \")}`));\n } else {\n console.log(chalk.gray(\" (empty)\"));\n }\n console.log();\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n\n if (errorMessage === \"StoredDataNotFound\") {\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n key: options.key,\n operator: options.operator,\n chainId: readOnlyOptions.chainId,\n error: \"Not found\",\n },\n null,\n 2\n )\n );\n process.exit(1);\n }\n exitWithError(\n `No data found for key \"${options.key}\" and operator \"${options.operator}\"`\n );\n }\n\n exitWithError(`Failed to read storage: ${errorMessage}`);\n }\n}\n","import { encodeFunctionData } from \"viem\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\nimport type { EncodedTransaction } from \"./types\";\n\nexport type { EncodedTransaction };\n\n/**\n * Encode a write transaction config into transaction data\n * Used for --encode-only mode where we output transaction data instead of executing\n */\nexport function encodeTransaction(\n config: WriteTransactionConfig,\n chainId: number\n): EncodedTransaction {\n const calldata = encodeFunctionData({\n abi: config.abi,\n functionName: config.functionName,\n args: config.args,\n });\n\n return {\n to: config.to,\n data: calldata,\n chainId,\n value: config.value?.toString() ?? \"0\",\n };\n}\n","import * as fs from \"fs\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { parseReadOnlyOptions, parseCommonOptions } from \"../../../cli/shared\";\nimport { encodeTransaction } from \"../../../shared/encode\";\nimport type { EncodedTransaction } from \"../../../shared/types\";\n\nexport interface StorageEncodeOptions {\n filePath: string;\n storageKey: string;\n text: string;\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n}\n\ninterface EncodedStorageResult {\n storageKey: string;\n storageType: \"normal\" | \"xml\";\n operatorAddress: string;\n transactions: EncodedTransaction[];\n topLevelHash?: string;\n}\n\nconst XML_STORAGE_THRESHOLD = 20 * 1024; // 20KB\n\n/**\n * Encode storage upload transactions without executing them\n */\nexport async function encodeStorageUpload(\n options: StorageEncodeOptions\n): Promise<EncodedStorageResult> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Get operator address from private key if provided\n let operatorAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n operatorAddress = account.address;\n } else {\n // Use a zero address placeholder when no private key is provided\n operatorAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n // Read file\n const fileContent = fs.readFileSync(options.filePath, \"utf-8\");\n const fileSize = Buffer.byteLength(fileContent, \"utf-8\");\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n });\n\n // Determine storage type based on size\n const useXmlStorage = fileSize > XML_STORAGE_THRESHOLD;\n\n if (useXmlStorage) {\n // XML Storage - multiple transactions\n const { transactionConfigs, topLevelHash, metadata } =\n client.prepareXmlStorage({\n data: fileContent,\n operatorAddress,\n storageKey: options.storageKey,\n filename: options.text,\n });\n\n const encodedTransactions = transactionConfigs.map((config) =>\n encodeTransaction(config, readOnlyOptions.chainId)\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"xml\",\n operatorAddress,\n transactions: encodedTransactions,\n topLevelHash,\n };\n } else {\n // Normal Storage - single transaction\n const config = client.preparePut({\n key: options.storageKey,\n text: options.text,\n value: fileContent,\n });\n\n const encodedTransaction = encodeTransaction(\n config,\n readOnlyOptions.chainId\n );\n\n return {\n storageKey: options.storageKey,\n storageType: \"normal\",\n operatorAddress,\n transactions: [encodedTransaction],\n };\n }\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { uploadFile } from \"./core/upload\";\nimport { uploadFileWithRelay } from \"./core/uploadRelay\";\nimport { previewFile } from \"./core/preview\";\nimport { executeStorageRead } from \"./core/read\";\nimport { encodeStorageUpload } from \"./core/encode\";\nimport { generateStorageUrl } from \"./utils\";\nimport type { UploadOptions } from \"./types\";\nimport type { UploadWithRelayOptions } from \"./relay/types\";\n\n/**\n * Register the storage command with the commander program\n */\nexport function registerStorageCommand(program: Command): void {\n // Command group - no options, no action\n const storageCommand = program\n .command(\"storage\")\n .description(\"Storage operations\");\n\n // Upload subcommand (current storage functionality)\n const uploadCommand = new Command(\"upload\")\n .description(\"Upload files to Net Storage\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n // Handle encode-only mode\n if (options.encodeOnly) {\n try {\n const result = await encodeStorageUpload({\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n console.log(JSON.stringify(result, null, 2));\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Encode failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n return;\n }\n\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const uploadOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await uploadFile(uploadOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n if (result.skipped && result.transactionsSent === 0) {\n console.log(\n chalk.green(\n `✓ All data already stored - skipping upload\\n Storage Key: ${\n options.key\n }\\n Skipped: ${result.transactionsSkipped} transaction(s)${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n }\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully!\\n Storage Key: ${\n options.key\n }\\n Storage Type: ${\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n }\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Final Transaction Hash: ${result.finalHash || \"N/A\"}${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Transactions Sent: ${\n result.transactionsSent\n }\\n Transactions Skipped: ${\n result.transactionsSkipped\n }\\n Transactions Failed: ${\n result.transactionsFailed\n }\\n Error: ${result.error || \"Unknown error\"}`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Preview subcommand\n const previewCommand = new Command(\"preview\")\n .description(\"Preview storage upload without submitting transactions\")\n .requiredOption(\"--file <path>\", \"Path to file to preview\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const previewOptions: UploadOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n const result = await previewFile(previewOptions);\n\n // Generate storage URL\n const storageUrl = generateStorageUrl(\n result.operatorAddress,\n commonOptions.chainId,\n options.key\n );\n\n // Display preview results\n console.log(chalk.cyan(\"\\n📊 Storage Preview:\"));\n console.log(` Storage Key: ${chalk.white(result.storageKey)}`);\n console.log(\n ` Storage Type: ${chalk.white(\n result.storageType === \"xml\" ? \"XML\" : \"Normal\"\n )}`\n );\n console.log(` Total Chunks: ${chalk.white(result.totalChunks)}`);\n console.log(\n ` Already Stored: ${chalk.green(result.alreadyStoredChunks)}`\n );\n console.log(\n ` Need to Store: ${chalk.yellow(result.needToStoreChunks)}`\n );\n\n if (result.storageType === \"xml\" && result.metadataNeedsStorage) {\n console.log(` Metadata: ${chalk.yellow(\"Needs Storage\")}`);\n } else if (result.storageType === \"xml\") {\n console.log(` Metadata: ${chalk.green(\"Already Stored\")}`);\n }\n\n console.log(\n ` Total Transactions: ${chalk.white(result.totalTransactions)}`\n );\n console.log(\n ` Transactions to Send: ${chalk.yellow(result.transactionsToSend)}`\n );\n console.log(\n ` Transactions Skipped: ${chalk.green(result.transactionsSkipped)}`\n );\n console.log(\n ` Operator Address: ${chalk.gray(result.operatorAddress)}`\n );\n\n if (storageUrl) {\n console.log(` Storage URL: ${chalk.cyan(storageUrl)}`);\n }\n\n if (result.needToStoreChunks === 0 && !result.metadataNeedsStorage) {\n console.log(\n chalk.green(\"\\n✓ All data is already stored - no upload needed\")\n );\n } else {\n console.log(\n chalk.yellow(\n `\\n⚠ ${result.transactionsToSend} transaction(s) would be sent`\n )\n );\n }\n\n process.exit(0);\n } catch (error) {\n console.error(\n chalk.red(\n `Preview failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Upload-relay subcommand (relay upload via x402)\n const uploadRelayCommand = new Command(\"upload-relay\")\n .description(\"Upload files to Net Storage via x402 relay (backend pays gas for chunks)\")\n .requiredOption(\"--file <path>\", \"Path to file to upload\")\n .requiredOption(\"--key <key>\", \"Storage key (filename/identifier)\")\n .requiredOption(\"--text <text>\", \"Text description/filename\")\n .requiredOption(\n \"--api-url <url>\",\n \"Backend API URL (e.g., http://localhost:3000)\"\n )\n .requiredOption(\n \"--secret-key <key>\",\n \"Secret key for backend wallet derivation. Can also be set via X402_SECRET_KEY env var\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (8453 for Base, 1 for Ethereum, etc.). Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL (can also be set via NET_RPC_URL env var)\"\n )\n .action(async (options) => {\n // Parse common options (private-key, chain-id, rpc-url)\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Parse secret key from options or env\n const secretKey =\n options.secretKey || process.env.X402_SECRET_KEY;\n if (!secretKey) {\n console.error(\n chalk.red(\n \"Error: --secret-key is required or set X402_SECRET_KEY environment variable\"\n )\n );\n process.exit(1);\n }\n\n const uploadRelayOptions: UploadWithRelayOptions = {\n filePath: options.file,\n storageKey: options.key,\n text: options.text,\n privateKey: commonOptions.privateKey,\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n apiUrl: options.apiUrl,\n secretKey,\n };\n\n try {\n console.log(chalk.blue(`📁 Reading file: ${options.file}`));\n console.log(chalk.blue(`🔗 Using relay API: ${options.apiUrl}`));\n const result = await uploadFileWithRelay(uploadRelayOptions);\n\n // Generate storage URL (using user address, not backend wallet)\n const { privateKeyToAccount } = await import(\"viem/accounts\");\n const userAccount = privateKeyToAccount(commonOptions.privateKey);\n const storageUrl = generateStorageUrl(\n userAccount.address,\n commonOptions.chainId,\n options.key\n );\n\n if (result.success) {\n console.log(\n chalk.green(\n `✓ File uploaded successfully via relay!\\n Storage Key: ${\n options.key\n }\\n Top-Level Hash: ${result.topLevelHash}\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No (already exists)\"\n }\\n Backend Wallet: ${result.backendWalletAddress}\\n Chunk Transaction Hashes: ${\n result.chunkTransactionHashes.length > 0\n ? result.chunkTransactionHashes.join(\", \")\n : \"None\"\n }${\n result.metadataTransactionHash\n ? `\\n Metadata Transaction Hash: ${result.metadataTransactionHash}`\n : \"\"\n }${\n storageUrl ? `\\n Storage URL: ${chalk.cyan(storageUrl)}` : \"\"\n }`\n )\n );\n process.exit(0);\n } else {\n console.error(\n chalk.red(\n `✗ Upload completed with errors\\n Chunks Sent: ${\n result.chunksSent\n }\\n Chunks Skipped: ${\n result.chunksSkipped\n }\\n Metadata Submitted: ${\n result.metadataSubmitted ? \"Yes\" : \"No\"\n }\\n Errors: ${\n result.errors\n ? result.errors.map((e) => e.message).join(\", \")\n : \"Unknown error\"\n }`\n )\n );\n process.exit(1);\n }\n } catch (error) {\n console.error(\n chalk.red(\n `Upload via relay failed: ${\n error instanceof Error ? error.message : String(error)\n }`\n )\n );\n process.exit(1);\n }\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read data from Net Storage\")\n .requiredOption(\"--key <key>\", \"Storage key to read\")\n .requiredOption(\"--operator <address>\", \"Operator address (wallet that stored the data)\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--index <n>\",\n \"Historical version index (0 = oldest). Omit for latest.\",\n (value) => parseInt(value, 10)\n )\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--raw\", \"Output raw data without truncation (use with --json)\")\n .action(async (options) => {\n await executeStorageRead({\n key: options.key,\n operator: options.operator,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n index: options.index,\n json: options.json,\n raw: options.raw,\n });\n });\n\n storageCommand.addCommand(uploadCommand);\n storageCommand.addCommand(previewCommand);\n storageCommand.addCommand(uploadRelayCommand);\n storageCommand.addCommand(readCommand);\n}\n","import { FeedClient, FeedRegistryClient } from \"@net-protocol/feeds\";\nimport { NetClient } from \"@net-protocol/core\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport type { ReadOnlyOptions } from \"./types\";\n\n/**\n * Create a FeedClient from read-only options\n */\nexport function createFeedClient(options: ReadOnlyOptions): FeedClient {\n return new FeedClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a FeedRegistryClient from read-only options\n */\nexport function createFeedRegistryClient(\n options: ReadOnlyOptions\n): FeedRegistryClient {\n return new FeedRegistryClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a NetClient from read-only options\n */\nexport function createNetClient(options: ReadOnlyOptions): NetClient {\n return new NetClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n\n/**\n * Create a StorageClient from read-only options\n */\nexport function createStorageClient(options: ReadOnlyOptions): StorageClient {\n return new StorageClient({\n chainId: options.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetClient, getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { MessageSendOptions } from \"./types\";\n\nfunction prepareMessageConfig(client: NetClient, options: MessageSendOptions) {\n return client.prepareSendMessage({\n text: options.text,\n topic: options.topic ?? \"\",\n data: options.data as `0x${string}` | undefined,\n });\n}\n\n/**\n * Execute the message send command\n */\nexport async function executeSend(options: MessageSendOptions): Promise<void> {\n if (options.encodeOnly) {\n executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createNetClient(commonOptions);\n const txConfig = prepareMessageConfig(client, options);\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Sending message...\"));\n\n try {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n chain: null,\n });\n\n const topicLine = options.topic ? `\\n Topic: ${options.topic}` : \"\";\n console.log(\n chalk.green(\n `Message sent successfully!\\n Transaction: ${hash}\\n Text: ${options.text}${topicLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to send message: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n\n/**\n * Execute encode-only mode - output transaction data as JSON\n */\nfunction executeEncodeOnly(options: MessageSendOptions): void {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new NetClient({ chainId: readOnlyOptions.chainId });\n const txConfig = prepareMessageConfig(client, options);\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\n/**\n * Common filter options shared by read and count commands\n */\nexport interface FilterOptions {\n app?: string;\n topic?: string;\n sender?: string;\n}\n\n/**\n * Options for the message send command\n */\nexport interface MessageSendOptions {\n text: string;\n topic?: string;\n data?: string;\n privateKey?: string;\n chainId?: number;\n rpcUrl?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Options for the message read command\n */\nexport interface MessageReadOptions extends FilterOptions {\n start?: number;\n end?: number;\n index?: number;\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Options for the message count command\n */\nexport interface MessageCountOptions extends FilterOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Build a NetMessageFilter from command options.\n * Returns undefined if no app address is provided.\n */\nexport function buildFilter(options: FilterOptions): NetMessageFilter | undefined {\n if (!options.app) {\n return undefined;\n }\n\n return {\n appAddress: options.app as `0x${string}`,\n topic: options.topic,\n maker: options.sender as `0x${string}` | undefined,\n };\n}\n\n/**\n * Warn if topic/sender filters are provided without --app\n */\nexport function warnIgnoredFilters(options: FilterOptions): void {\n if (options.app || (!options.topic && !options.sender)) {\n return;\n }\n\n const ignored: string[] = [];\n if (options.topic) ignored.push(\"--topic\");\n if (options.sender) ignored.push(\"--sender\");\n\n console.warn(\n chalk.yellow(\n `Warning: ${ignored.join(\" and \")} ignored because --app is required for filtering`\n )\n );\n}\n","import chalk from \"chalk\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printMessages, exitWithError } from \"../../shared/output\";\nimport type { MessageReadOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\n\nfunction printEmptyResult(message: string, json: boolean): void {\n if (json) {\n console.log(JSON.stringify([], null, 2));\n } else {\n console.log(chalk.yellow(message));\n }\n}\n\n/**\n * Execute the message read command\n */\nexport async function executeRead(options: MessageReadOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n const json = options.json ?? false;\n\n warnIgnoredFilters(options);\n\n try {\n // Handle single message by index\n if (options.index !== undefined) {\n const message = await client.getMessageAtIndex({\n messageIndex: options.index,\n appAddress: filter?.appAddress,\n topic: filter?.topic,\n maker: filter?.maker,\n });\n\n if (!message) {\n exitWithError(`No message found at index ${options.index}`);\n }\n\n printMessages([message], options.index, json);\n return;\n }\n\n // Get total count for range calculation\n const count = await client.getMessageCount({ filter });\n\n if (count === 0) {\n printEmptyResult(\"No messages found\", json);\n return;\n }\n\n // Determine range\n const hasExplicitRange = options.start !== undefined || options.end !== undefined;\n let startIndex: number;\n let endIndex: number;\n\n if (hasExplicitRange) {\n startIndex = options.start ?? 0;\n endIndex = options.end ?? count;\n } else {\n const limit = options.limit ?? 10;\n startIndex = Math.max(0, count - limit);\n endIndex = count;\n }\n\n // Clamp to valid range\n startIndex = Math.max(0, startIndex);\n endIndex = Math.min(endIndex, count);\n\n if (startIndex >= endIndex) {\n printEmptyResult(\"No messages in specified range\", json);\n return;\n }\n\n const messages = await client.getMessagesBatch({\n filter,\n startIndex,\n endIndex,\n });\n\n printMessages(messages, startIndex, json);\n } catch (error) {\n exitWithError(\n `Failed to read messages: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { printCount, exitWithError } from \"../../shared/output\";\nimport type { MessageCountOptions } from \"./types\";\nimport { buildFilter, warnIgnoredFilters } from \"./types\";\nimport type { NetMessageFilter } from \"@net-protocol/core\";\n\nfunction buildCountLabel(filter: NetMessageFilter | undefined): string {\n if (!filter) {\n return \"Total messages:\";\n }\n\n const parts: string[] = [];\n if (filter.appAddress) parts.push(`app=${filter.appAddress}`);\n if (filter.topic) parts.push(`topic=\"${filter.topic}\"`);\n if (filter.maker) parts.push(`sender=${filter.maker}`);\n\n return `Messages (${parts.join(\", \")}):`;\n}\n\n/**\n * Execute the message count command\n */\nexport async function executeCount(options: MessageCountOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const filter = buildFilter(options);\n\n warnIgnoredFilters(options);\n\n try {\n const count = await client.getMessageCount({ filter });\n printCount(count, buildCountLabel(filter), options.json ?? false);\n } catch (error) {\n exitWithError(\n `Failed to get message count: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeSend } from \"./send\";\nimport { executeRead } from \"./read\";\nimport { executeCount } from \"./count\";\n\n/**\n * Register the message command with the commander program\n */\nexport function registerMessageCommand(program: Command): void {\n const messageCommand = program\n .command(\"message\")\n .description(\"Message operations\");\n\n // Send subcommand\n const sendCommand = new Command(\"send\")\n .description(\"Send a message to Net Protocol\")\n .requiredOption(\"--text <text>\", \"Message text\")\n .option(\"--topic <topic>\", \"Message topic\", \"\")\n .option(\"--data <hex>\", \"Additional hex data\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeSend({\n text: options.text,\n topic: options.topic,\n data: options.data,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Read subcommand\n const readCommand = new Command(\"read\")\n .description(\"Read messages from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--start <n>\",\n \"Start index (inclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--end <n>\",\n \"End index (exclusive)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--index <n>\",\n \"Single message at index\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--limit <n>\",\n \"Number of latest messages (default: 10)\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeRead({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n start: options.start,\n end: options.end,\n index: options.index,\n limit: options.limit,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Count subcommand\n const countCommand = new Command(\"count\")\n .description(\"Get message count from Net Protocol\")\n .option(\"--app <address>\", \"Filter by app address\")\n .option(\"--topic <topic>\", \"Filter by topic\")\n .option(\"--sender <address>\", \"Filter by sender address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeCount({\n app: options.app,\n topic: options.topic,\n sender: options.sender,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n messageCommand.addCommand(sendCommand);\n messageCommand.addCommand(readCommand);\n messageCommand.addCommand(countCommand);\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\n\n/**\n * Supported chains configuration\n * Note: This mirrors the chainConfig in net-core but is kept here to avoid\n * exposing internal configuration details from the core package\n */\nconst SUPPORTED_CHAINS = [\n { id: 8453, name: \"Base\", type: \"mainnet\" },\n { id: 1, name: \"Ethereum\", type: \"mainnet\" },\n { id: 666666666, name: \"Degen\", type: \"mainnet\" },\n { id: 5112, name: \"Ham\", type: \"mainnet\" },\n { id: 57073, name: \"Ink\", type: \"mainnet\" },\n { id: 130, name: \"Unichain\", type: \"mainnet\" },\n { id: 999, name: \"HyperEVM\", type: \"mainnet\" },\n { id: 9745, name: \"Plasma\", type: \"mainnet\" },\n { id: 143, name: \"Monad\", type: \"mainnet\" },\n { id: 84532, name: \"Base Sepolia\", type: \"testnet\" },\n { id: 11155111, name: \"Sepolia\", type: \"testnet\" },\n] as const;\n\n/**\n * Register the chains command with the commander program\n */\nexport function registerChainsCommand(program: Command): void {\n program\n .command(\"chains\")\n .description(\"List supported chains\")\n .option(\"--json\", \"Output in JSON format\")\n .action((options) => {\n if (options.json) {\n console.log(JSON.stringify(SUPPORTED_CHAINS, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Supported Chains:\\n\"));\n\n // Mainnets\n console.log(chalk.cyan(\"Mainnets:\"));\n SUPPORTED_CHAINS.filter((c) => c.type === \"mainnet\").forEach((chain) => {\n console.log(` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.id})`)}`);\n });\n\n // Testnets\n console.log(chalk.cyan(\"\\nTestnets:\"));\n SUPPORTED_CHAINS.filter((c) => c.type === \"testnet\").forEach((chain) => {\n console.log(` ${chalk.white(chain.name)} ${chalk.gray(`(${chain.id})`)}`);\n });\n });\n}\n","import { Command } from \"commander\";\nimport chalk from \"chalk\";\nimport { getNetContract, getChainName } from \"@net-protocol/core\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\n\ninterface InfoOptions {\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Register the info command with the commander program\n */\nexport function registerInfoCommand(program: Command): void {\n program\n .command(\"info\")\n .description(\"Show contract info and stats\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options: InfoOptions) => {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n try {\n const client = createNetClient(readOnlyOptions);\n\n const contract = getNetContract(readOnlyOptions.chainId);\n const chainName = getChainName({ chainId: readOnlyOptions.chainId });\n const totalMessages = await client.getMessageCount({});\n\n const info = {\n chain: {\n id: readOnlyOptions.chainId,\n name: chainName || \"Unknown\",\n },\n contract: {\n address: contract.address,\n },\n stats: {\n totalMessages,\n },\n };\n\n if (options.json) {\n console.log(JSON.stringify(info, null, 2));\n return;\n }\n\n console.log(chalk.white.bold(\"Net Protocol Info\\n\"));\n console.log(chalk.cyan(\"Chain:\"));\n console.log(` Name: ${chalk.white(info.chain.name)}`);\n console.log(` ID: ${chalk.white(info.chain.id)}`);\n console.log(chalk.cyan(\"\\nContract:\"));\n console.log(` Address: ${chalk.white(info.contract.address)}`);\n console.log(chalk.cyan(\"\\nStats:\"));\n console.log(` Total Messages: ${chalk.white(info.stats.totalMessages)}`);\n } catch (error) {\n exitWithError(\n `Failed to get info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n });\n}\n","import chalk from \"chalk\";\nimport { encodeFunctionData, createWalletClient, http, parseEther } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { TokenDeployOptions } from \"./types\";\nimport type { EncodedTransaction } from \"../../shared/types\";\n\ninterface EncodedDeployResult {\n predictedAddress: string;\n salt: string;\n transaction: EncodedTransaction;\n config: {\n name: string;\n symbol: string;\n image: string;\n deployer: string;\n initialBuy?: string;\n };\n}\n\n/**\n * Execute encode-only mode - output deployment transaction data as JSON\n */\nasync function executeEncodeOnly(options: TokenDeployOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for token deployment`\n );\n }\n\n // Get deployer address from private key if provided\n let deployerAddress: `0x${string}`;\n if (options.privateKey) {\n const account = privateKeyToAccount(options.privateKey as `0x${string}`);\n deployerAddress = account.address;\n } else {\n // Use a placeholder address when no private key is provided\n deployerAddress = \"0x0000000000000000000000000000000000000000\";\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: deployerAddress,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n // Encode the transaction\n const calldata = encodeFunctionData({\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n });\n\n const result: EncodedDeployResult = {\n predictedAddress: saltResult.predictedAddress,\n salt: saltResult.salt,\n transaction: {\n to: txConfig.address,\n data: calldata,\n chainId: readOnlyOptions.chainId,\n value: txConfig.value?.toString() ?? \"0\",\n },\n config: {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n deployer: deployerAddress,\n ...(options.initialBuy && { initialBuy: options.initialBuy }),\n },\n };\n\n console.log(JSON.stringify(result, null, 2));\n}\n\n/**\n * Execute the token deploy command\n */\nexport async function executeTokenDeploy(\n options: TokenDeployOptions\n): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n if (!isNetrSupportedChain(commonOptions.chainId)) {\n exitWithError(\n `Chain ${commonOptions.chainId} is not supported for token deployment. Supported: Base (8453), Plasma (9745), Monad (143), HyperEVM (999)`\n );\n }\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const client = new NetrClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n\n console.log(chalk.blue(\"Generating salt and predicting token address...\"));\n\n // Generate salt and predict address\n const saltResult = await client.generateSalt({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n });\n\n if (!saltResult) {\n exitWithError(\"Failed to generate salt for token deployment\");\n return;\n }\n\n console.log(\n chalk.cyan(`Predicted token address: ${saltResult.predictedAddress}`)\n );\n\n // Build deploy config\n const txConfig = client.buildDeployConfig(\n {\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n deployer: account.address,\n fid: options.fid ? BigInt(options.fid) : undefined,\n mintPrice: options.mintPrice ? BigInt(options.mintPrice) : undefined,\n mintEndTimestamp: options.mintEndTimestamp\n ? BigInt(options.mintEndTimestamp)\n : undefined,\n maxMintSupply: options.maxMintSupply\n ? BigInt(options.maxMintSupply)\n : undefined,\n metadataAddress: options.metadataAddress as `0x${string}` | undefined,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy ? parseEther(options.initialBuy) : undefined,\n },\n saltResult.salt\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n if (options.initialBuy) {\n console.log(chalk.blue(`Deploying token with ${options.initialBuy} ETH initial buy...`));\n } else {\n console.log(chalk.blue(\"Deploying token...\"));\n }\n\n try {\n // Use sendTransaction with encoded calldata to support payable functions\n const calldata = encodeFunctionData({\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: txConfig.address,\n data: calldata,\n chain: null,\n value: txConfig.value,\n });\n\n const initialBuyLine = options.initialBuy\n ? `\\n Initial Buy: ${options.initialBuy} ETH`\n : \"\";\n\n console.log(\n chalk.green(\n `Token deployed successfully!\\n Transaction: ${hash}\\n Token Address: ${saltResult.predictedAddress}\\n Name: ${options.name}\\n Symbol: ${options.symbol}${initialBuyLine}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to deploy token: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { NetrClient, isNetrSupportedChain } from \"@net-protocol/netr\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { TokenInfoOptions } from \"./types\";\n\n/**\n * Execute the token info command\n */\nexport async function executeTokenInfo(options: TokenInfoOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n if (!isNetrSupportedChain(readOnlyOptions.chainId)) {\n exitWithError(\n `Chain ${readOnlyOptions.chainId} is not supported for Netr tokens`\n );\n }\n\n const client = new NetrClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n const tokenAddress = options.address as `0x${string}`;\n\n try {\n // Fetch token data in parallel\n const [token, storageData, price] = await Promise.all([\n client.getToken(tokenAddress),\n client.getStorageData(tokenAddress),\n client.getPrice(tokenAddress),\n ]);\n\n if (!token) {\n exitWithError(`Token not found at address ${tokenAddress}`);\n return;\n }\n\n // Fetch locker data if available\n let locker = null;\n if (storageData?.lockerAddress) {\n locker = await client.getLocker(storageData.lockerAddress);\n }\n\n if (options.json) {\n const output = {\n address: tokenAddress,\n chainId: readOnlyOptions.chainId,\n token: {\n name: token.name,\n symbol: token.symbol,\n deployer: token.deployer,\n image: token.image,\n animation: token.animation || null,\n fid: token.fid.toString(),\n totalSupply: token.totalSupply.toString(),\n decimals: token.decimals,\n extraStringData: token.extraStringData || null,\n },\n pool: storageData?.poolAddress || null,\n locker: storageData?.lockerAddress || null,\n price: price\n ? {\n priceInEth: price.priceInEth,\n priceInWeth: price.priceInWeth,\n tick: price.tick,\n }\n : null,\n lockerInfo: locker\n ? {\n owner: locker.owner,\n duration: locker.duration.toString(),\n endTimestamp: locker.endTimestamp.toString(),\n version: locker.version,\n }\n : null,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nToken Info:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${tokenAddress}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(` ${chalk.cyan(\"Name:\")} ${token.name}`);\n console.log(` ${chalk.cyan(\"Symbol:\")} ${token.symbol}`);\n console.log(` ${chalk.cyan(\"Deployer:\")} ${token.deployer}`);\n console.log(` ${chalk.cyan(\"FID:\")} ${token.fid.toString()}`);\n console.log(` ${chalk.cyan(\"Image:\")} ${token.image}`);\n if (token.animation) {\n console.log(` ${chalk.cyan(\"Animation:\")} ${token.animation}`);\n }\n if (token.extraStringData) {\n console.log(` ${chalk.cyan(\"Extra Data:\")} ${token.extraStringData}`);\n }\n\n if (storageData?.poolAddress) {\n console.log(` ${chalk.cyan(\"Pool:\")} ${storageData.poolAddress}`);\n }\n\n if (storageData?.lockerAddress) {\n console.log(` ${chalk.cyan(\"Locker:\")} ${storageData.lockerAddress}`);\n }\n\n if (price) {\n console.log(` ${chalk.cyan(\"Price:\")} ${price.priceInEth} ETH`);\n }\n\n if (locker) {\n const endDate = new Date(Number(locker.endTimestamp) * 1000);\n console.log(\n ` ${chalk.cyan(\"Lock Ends:\")} ${endDate.toLocaleDateString()}`\n );\n }\n\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to get token info: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeTokenDeploy } from \"./deploy\";\nimport { executeTokenInfo } from \"./info\";\n\n/**\n * Register the token command with the commander program\n */\nexport function registerTokenCommand(program: Command): void {\n const tokenCommand = program\n .command(\"token\")\n .description(\"Token operations (Netr/Banger)\");\n\n // Deploy subcommand\n const deployCommand = new Command(\"deploy\")\n .description(\"Deploy a new Netr token\")\n .requiredOption(\"--name <name>\", \"Token name\")\n .requiredOption(\"--symbol <symbol>\", \"Token symbol\")\n .requiredOption(\"--image <url>\", \"Token image URL\")\n .option(\"--animation <url>\", \"Token animation URL\")\n .option(\"--fid <number>\", \"Farcaster ID\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--mint-price <wei>\", \"Mint price in wei for NFT drop\")\n .option(\"--mint-end-timestamp <timestamp>\", \"Unix timestamp when minting ends\")\n .option(\"--max-mint-supply <amount>\", \"Maximum mint supply for NFT drop\")\n .option(\"--metadata-address <address>\", \"Dynamic metadata contract address\")\n .option(\"--extra-string-data <data>\", \"Extra string data to store with token\")\n .option(\"--initial-buy <eth>\", \"ETH amount to swap for tokens on deploy (e.g., '0.001')\")\n .action(async (options) => {\n await executeTokenDeploy({\n name: options.name,\n symbol: options.symbol,\n image: options.image,\n animation: options.animation,\n fid: options.fid,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n mintPrice: options.mintPrice,\n mintEndTimestamp: options.mintEndTimestamp,\n maxMintSupply: options.maxMintSupply,\n metadataAddress: options.metadataAddress,\n extraStringData: options.extraStringData,\n initialBuy: options.initialBuy,\n });\n });\n\n // Info subcommand\n const infoCommand = new Command(\"info\")\n .description(\"Get information about a Netr token\")\n .requiredOption(\"--address <address>\", \"Token address\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeTokenInfo({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n tokenCommand.addCommand(deployCommand);\n tokenCommand.addCommand(infoCommand);\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { hexToString } from \"viem\";\nimport {\n PROFILE_PICTURE_STORAGE_KEY,\n PROFILE_METADATA_STORAGE_KEY,\n PROFILE_CANVAS_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetOptions } from \"./types\";\n\n/**\n * Execute the profile get command - reads profile data for an address\n */\nexport async function executeProfileGet(\n options: ProfileGetOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Fetch profile picture\n let profilePicture: string | undefined;\n try {\n const pictureResult = await client.readStorageData({\n key: PROFILE_PICTURE_STORAGE_KEY,\n operator: options.address,\n });\n if (pictureResult.data) {\n profilePicture = pictureResult.data;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile metadata (X username, bio, token address)\n let xUsername: string | undefined;\n let bio: string | undefined;\n let tokenAddress: string | undefined;\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: options.address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n xUsername = metadata?.x_username;\n bio = metadata?.bio;\n tokenAddress = metadata?.token_address;\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n\n // Fetch profile canvas\n let canvasSize: number | undefined;\n let canvasIsDataUri = false;\n try {\n const canvasResult = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n if (canvasResult.data) {\n canvasSize = canvasResult.data.length;\n canvasIsDataUri = canvasResult.data.startsWith(\"data:\");\n }\n } catch (error) {\n // Not found is okay\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n }\n\n const hasProfile = profilePicture || xUsername || bio || tokenAddress || canvasSize;\n\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n profilePicture: profilePicture || null,\n xUsername: xUsername || null,\n bio: bio || null,\n tokenAddress: tokenAddress || null,\n canvas: canvasSize\n ? { size: canvasSize, isDataUri: canvasIsDataUri }\n : null,\n hasProfile,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // Human-readable output\n console.log(chalk.white.bold(\"\\nProfile:\\n\"));\n console.log(` ${chalk.cyan(\"Address:\")} ${options.address}`);\n console.log(` ${chalk.cyan(\"Chain ID:\")} ${readOnlyOptions.chainId}`);\n console.log(\n ` ${chalk.cyan(\"Profile Picture:\")} ${\n profilePicture || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"X Username:\")} ${\n xUsername ? `@${xUsername}` : chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Bio:\")} ${bio || chalk.gray(\"(not set)\")}`\n );\n console.log(\n ` ${chalk.cyan(\"Token Address:\")} ${\n tokenAddress || chalk.gray(\"(not set)\")\n }`\n );\n console.log(\n ` ${chalk.cyan(\"Canvas:\")} ${\n canvasSize\n ? `${canvasSize} bytes${canvasIsDataUri ? \" (data URI)\" : \"\"}`\n : chalk.gray(\"(not set)\")\n }`\n );\n\n if (!hasProfile) {\n console.log(chalk.yellow(\"\\n No profile data found for this address.\"));\n }\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to read profile: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfilePictureStorageArgs,\n isValidUrl,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetPictureOptions } from \"./types\";\n\n/**\n * Execute the profile set-picture command\n */\nexport async function executeProfileSetPicture(\n options: ProfileSetPictureOptions\n): Promise<void> {\n // Validate URL\n if (!isValidUrl(options.url)) {\n exitWithError(\n `Invalid URL: \"${options.url}\". Please provide a valid URL (e.g., https://example.com/image.jpg)`\n );\n }\n\n // Get storage args\n const storageArgs = getProfilePictureStorageArgs(options.url);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`📷 Setting profile picture...`));\n console.log(chalk.gray(` URL: ${options.url}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`⏳ Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\n✓ Profile picture updated successfully!\\n Transaction: ${hash}\\n URL: ${options.url}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set profile picture: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { StorageClient } from \"@net-protocol/storage\";\nimport {\n PROFILE_METADATA_STORAGE_KEY,\n parseProfileMetadata,\n} from \"@net-protocol/profiles\";\n\ninterface ExistingMetadata {\n x_username?: string;\n bio?: string;\n display_name?: string;\n token_address?: string;\n}\n\n/**\n * Read existing profile metadata for an address.\n * Returns parsed metadata fields, or empty object if not found.\n */\nexport async function readExistingMetadata(\n address: string,\n client: StorageClient\n): Promise<ExistingMetadata> {\n try {\n const metadataResult = await client.readStorageData({\n key: PROFILE_METADATA_STORAGE_KEY,\n operator: address,\n });\n if (metadataResult.data) {\n const metadata = parseProfileMetadata(metadataResult.data);\n return {\n x_username: metadata?.x_username,\n bio: metadata?.bio,\n display_name: metadata?.display_name,\n token_address: metadata?.token_address,\n };\n }\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (errorMessage !== \"StoredDataNotFound\") {\n throw error;\n }\n }\n return {};\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidXUsername,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetUsernameOptions } from \"./types\";\n\n/**\n * Execute the profile set-username command\n */\nexport async function executeProfileSetUsername(\n options: ProfileSetUsernameOptions\n): Promise<void> {\n // Validate username\n if (!isValidXUsername(options.username)) {\n exitWithError(\n `Invalid X username: \"${options.username}\". Usernames must be 1-15 characters, alphanumeric and underscores only.`\n );\n }\n\n // Normalize username (strip @ if present for storage)\n const usernameForStorage = options.username.startsWith(\"@\")\n ? options.username.slice(1)\n : options.username;\n const displayUsername = `@${usernameForStorage}`;\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting X username...`));\n console.log(chalk.gray(` Username: ${displayUsername}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update x_username, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n x_username: usernameForStorage,\n bio: existing.bio,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nX username updated successfully!\\n Transaction: ${hash}\\n Username: ${displayUsername}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set X username: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidBio,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetBioOptions } from \"./types\";\n\n/**\n * Execute the profile set-bio command\n */\nexport async function executeProfileSetBio(\n options: ProfileSetBioOptions\n): Promise<void> {\n // Validate bio\n if (!isValidBio(options.bio)) {\n exitWithError(\n `Invalid bio: \"${options.bio}\". Bio must be 1-280 characters and cannot contain control characters.`\n );\n }\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const storageArgs = getProfileMetadataStorageArgs({ bio: options.bio });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile bio...`));\n console.log(chalk.gray(` Bio: ${options.bio}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update bio, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n bio: options.bio,\n x_username: existing.x_username,\n display_name: existing.display_name,\n token_address: existing.token_address,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nBio updated successfully!\\n Transaction: ${hash}\\n Bio: ${options.bio}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set bio: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n getProfileMetadataStorageArgs,\n isValidTokenAddress,\n STORAGE_CONTRACT,\n} from \"@net-protocol/profiles\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { readExistingMetadata } from \"./utils\";\nimport type { ProfileSetTokenAddressOptions } from \"./types\";\n\n/**\n * Execute the profile set-token-address command\n */\nexport async function executeProfileSetTokenAddress(\n options: ProfileSetTokenAddressOptions\n): Promise<void> {\n // Validate token address\n if (!isValidTokenAddress(options.tokenAddress)) {\n exitWithError(\n `Invalid token address: \"${options.tokenAddress}\". Must be a valid EVM address (0x-prefixed, 40 hex characters).`\n );\n }\n\n // Store as lowercase\n const normalizedAddress = options.tokenAddress.toLowerCase();\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n });\n const encoded = encodeTransaction(\n {\n to: STORAGE_CONTRACT.address,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile token address...`));\n console.log(chalk.gray(` Token Address: ${normalizedAddress}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Read existing metadata to preserve other fields\n const storageClient = new StorageClient({\n chainId: commonOptions.chainId,\n overrides: commonOptions.rpcUrl\n ? { rpcUrls: [commonOptions.rpcUrl] }\n : undefined,\n });\n const existing = await readExistingMetadata(\n account.address,\n storageClient\n );\n\n // Merge: update token_address, preserve other fields\n const storageArgs = getProfileMetadataStorageArgs({\n token_address: normalizedAddress,\n x_username: existing.x_username,\n bio: existing.bio,\n display_name: existing.display_name,\n });\n\n // Submit transaction\n const hash = await client.writeContract({\n address: STORAGE_CONTRACT.address as `0x${string}`,\n abi: STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [storageArgs.bytesKey, storageArgs.topic, storageArgs.bytesValue],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nToken address updated successfully!\\n Transaction: ${hash}\\n Token Address: ${normalizedAddress}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set token address: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { createWalletClient, http, publicActions } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { base } from \"viem/chains\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n PROFILE_CANVAS_STORAGE_KEY,\n PROFILE_CANVAS_TOPIC,\n} from \"@net-protocol/profiles\";\nimport {\n CHUNKED_STORAGE_CONTRACT,\n chunkDataForStorage,\n} from \"@net-protocol/storage\";\nimport { toBytes32 } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { ProfileSetCanvasOptions } from \"./types\";\n\nconst MAX_CANVAS_SIZE = 60 * 1024; // 60KB\nconst CANVAS_FILENAME = \"profile-compressed.html\";\n\n/**\n * Check if a buffer contains binary data (non-text)\n */\nfunction isBinaryContent(buffer: Buffer): boolean {\n // Check for null bytes or other non-text characters in the first 8KB\n const sampleSize = Math.min(buffer.length, 8192);\n for (let i = 0; i < sampleSize; i++) {\n const byte = buffer[i];\n // Null byte is a strong indicator of binary\n if (byte === 0) return true;\n // Control characters (except tab, newline, carriage return)\n if (byte < 32 && byte !== 9 && byte !== 10 && byte !== 13) return true;\n }\n return false;\n}\n\n/**\n * Get MIME type from file extension\n */\nfunction getMimeType(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n const mimeTypes: Record<string, string> = {\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".svg\": \"image/svg+xml\",\n \".pdf\": \"application/pdf\",\n \".html\": \"text/html\",\n \".htm\": \"text/html\",\n \".css\": \"text/css\",\n \".js\": \"application/javascript\",\n \".json\": \"application/json\",\n \".txt\": \"text/plain\",\n };\n return mimeTypes[ext] || \"application/octet-stream\";\n}\n\n/**\n * Convert binary buffer to data URI\n */\nfunction bufferToDataUri(buffer: Buffer, mimeType: string): string {\n const base64 = buffer.toString(\"base64\");\n return `data:${mimeType};base64,${base64}`;\n}\n\n/**\n * Execute the profile set-canvas command\n */\nexport async function executeProfileSetCanvas(\n options: ProfileSetCanvasOptions\n): Promise<void> {\n // Validate: must provide --file or --content, but not both\n if (!options.file && !options.content) {\n exitWithError(\n \"Must provide either --file or --content to set canvas content.\"\n );\n }\n\n if (options.file && options.content) {\n exitWithError(\"Cannot provide both --file and --content. Choose one.\");\n }\n\n let canvasContent: string;\n\n // Read content from file or use provided content\n if (options.file) {\n const filePath = path.resolve(options.file);\n\n // Check file exists\n if (!fs.existsSync(filePath)) {\n exitWithError(`File not found: ${filePath}`);\n }\n\n // Read file as buffer to detect binary content\n const buffer = fs.readFileSync(filePath);\n\n // Check file size\n if (buffer.length > MAX_CANVAS_SIZE) {\n exitWithError(\n `File too large: ${buffer.length} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n\n // Handle binary files (convert to data URI)\n if (isBinaryContent(buffer)) {\n const mimeType = getMimeType(filePath);\n canvasContent = bufferToDataUri(buffer, mimeType);\n } else {\n canvasContent = buffer.toString(\"utf-8\");\n }\n } else {\n // Use provided content\n canvasContent = options.content!;\n\n // Check content size\n const contentSize = Buffer.byteLength(canvasContent, \"utf-8\");\n if (contentSize > MAX_CANVAS_SIZE) {\n exitWithError(\n `Content too large: ${contentSize} bytes exceeds maximum of ${MAX_CANVAS_SIZE} bytes (60KB).`\n );\n }\n }\n\n // Prepare storage key as bytes32\n const bytesKey = toBytes32(PROFILE_CANVAS_STORAGE_KEY) as `0x${string}`;\n\n // Chunk and compress data for storage\n const chunks = chunkDataForStorage(canvasContent);\n\n // Handle encode-only mode (no private key required)\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n const encoded = encodeTransaction(\n {\n to: CHUNKED_STORAGE_CONTRACT.address,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Parse common options (requires private key for transaction submission)\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n try {\n // Create wallet client\n const account = privateKeyToAccount(commonOptions.privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const client = createWalletClient({\n account,\n chain: base, // TODO: Support other chains\n transport: http(rpcUrls[0]),\n }).extend(publicActions);\n\n console.log(chalk.blue(`Setting profile canvas...`));\n console.log(\n chalk.gray(` Content size: ${Buffer.byteLength(canvasContent)} bytes`)\n );\n console.log(chalk.gray(` Chunks: ${chunks.length}`));\n console.log(chalk.gray(` Address: ${account.address}`));\n\n // Submit transaction to ChunkedStorage\n const hash = await client.writeContract({\n address: CHUNKED_STORAGE_CONTRACT.address as `0x${string}`,\n abi: CHUNKED_STORAGE_CONTRACT.abi,\n functionName: \"put\",\n args: [bytesKey, CANVAS_FILENAME, chunks],\n });\n\n console.log(chalk.blue(`Waiting for confirmation...`));\n\n // Wait for transaction\n const receipt = await client.waitForTransactionReceipt({ hash });\n\n if (receipt.status === \"success\") {\n console.log(\n chalk.green(\n `\\nCanvas updated successfully!\\n Transaction: ${hash}\\n Content size: ${Buffer.byteLength(canvasContent)} bytes\\n Chunks: ${chunks.length}`\n )\n );\n } else {\n exitWithError(`Transaction failed: ${hash}`);\n }\n } catch (error) {\n exitWithError(\n `Failed to set canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import chalk from \"chalk\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { StorageClient } from \"@net-protocol/storage\";\nimport { PROFILE_CANVAS_STORAGE_KEY } from \"@net-protocol/profiles\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ProfileGetCanvasOptions } from \"./types\";\n\n/**\n * Check if content is a data URI\n */\nfunction isDataUri(content: string): boolean {\n return content.startsWith(\"data:\");\n}\n\n/**\n * Parse a data URI and return the buffer and mime type\n */\nfunction parseDataUri(dataUri: string): { buffer: Buffer; mimeType: string } {\n const match = dataUri.match(/^data:([^;]+);base64,(.+)$/);\n if (!match) {\n throw new Error(\"Invalid data URI format\");\n }\n const mimeType = match[1];\n const base64Data = match[2];\n const buffer = Buffer.from(base64Data, \"base64\");\n return { buffer, mimeType };\n}\n\n/**\n * Get file extension from mime type\n */\nfunction getExtensionFromMimeType(mimeType: string): string {\n const extensions: Record<string, string> = {\n \"image/png\": \".png\",\n \"image/jpeg\": \".jpg\",\n \"image/gif\": \".gif\",\n \"image/webp\": \".webp\",\n \"image/svg+xml\": \".svg\",\n \"application/pdf\": \".pdf\",\n \"text/html\": \".html\",\n \"text/css\": \".css\",\n \"application/javascript\": \".js\",\n \"application/json\": \".json\",\n \"text/plain\": \".txt\",\n \"application/octet-stream\": \".bin\",\n };\n return extensions[mimeType] || \".bin\";\n}\n\n/**\n * Execute the profile get-canvas command - reads canvas data for an address\n */\nexport async function executeProfileGetCanvas(\n options: ProfileGetCanvasOptions\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new StorageClient({\n chainId: readOnlyOptions.chainId,\n overrides: options.rpcUrl ? { rpcUrls: [options.rpcUrl] } : undefined,\n });\n\n try {\n // Read canvas from chunked storage\n let canvasContent: string | undefined;\n let canvasText: string | undefined;\n\n try {\n const result = await client.readChunkedStorage({\n key: PROFILE_CANVAS_STORAGE_KEY,\n operator: options.address,\n });\n\n if (result.data) {\n canvasContent = result.data;\n canvasText = result.text;\n }\n } catch (error) {\n // Check for \"not found\" type errors\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n if (\n errorMessage !== \"ChunkedStorage metadata not found\" &&\n !errorMessage.includes(\"not found\")\n ) {\n throw error;\n }\n // No canvas exists - that's okay\n }\n\n // Handle JSON output\n if (options.json) {\n const output = {\n address: options.address,\n chainId: readOnlyOptions.chainId,\n canvas: canvasContent || null,\n filename: canvasText || null,\n hasCanvas: !!canvasContent,\n isDataUri: canvasContent ? isDataUri(canvasContent) : false,\n contentLength: canvasContent ? canvasContent.length : 0,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n // No canvas found\n if (!canvasContent) {\n exitWithError(`No canvas found for address: ${options.address}`);\n }\n\n // Handle output to file\n if (options.output) {\n const outputPath = path.resolve(options.output);\n\n // Check if content is a data URI (binary)\n if (isDataUri(canvasContent)) {\n const { buffer, mimeType } = parseDataUri(canvasContent);\n\n // If output path doesn't have extension, add one based on mime type\n let finalPath = outputPath;\n if (!path.extname(outputPath)) {\n finalPath = outputPath + getExtensionFromMimeType(mimeType);\n }\n\n fs.writeFileSync(finalPath, buffer);\n console.log(\n chalk.green(`Canvas written to: ${finalPath} (${buffer.length} bytes)`)\n );\n } else {\n // Text content\n fs.writeFileSync(outputPath, canvasContent, \"utf-8\");\n console.log(\n chalk.green(\n `Canvas written to: ${outputPath} (${canvasContent.length} bytes)`\n )\n );\n }\n return;\n }\n\n // Output to stdout\n // For binary content (data URI), output as-is since stdout can't handle raw binary\n console.log(canvasContent);\n } catch (error) {\n exitWithError(\n `Failed to read canvas: ${\n error instanceof Error ? error.message : String(error)\n }`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeProfileGet } from \"./get\";\nimport { executeProfileSetPicture } from \"./set-picture\";\nimport { executeProfileSetUsername } from \"./set-username\";\nimport { executeProfileSetBio } from \"./set-bio\";\nimport { executeProfileSetTokenAddress } from \"./set-token-address\";\nimport { executeProfileSetCanvas } from \"./set-canvas\";\nimport { executeProfileGetCanvas } from \"./get-canvas\";\n\n/**\n * Register the profile command with the commander program\n */\nexport function registerProfileCommand(program: Command): void {\n // Command group\n const profileCommand = program\n .command(\"profile\")\n .description(\"User profile operations\");\n\n // Get subcommand (read-only)\n const getCommand = new Command(\"get\")\n .description(\"Get profile data for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get profile for\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGet({\n address: options.address,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n // Set-picture subcommand (write)\n const setPictureCommand = new Command(\"set-picture\")\n .description(\"Set your profile picture URL\")\n .requiredOption(\"--url <url>\", \"Image URL for profile picture\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetPicture({\n url: options.url,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-x-username subcommand (write)\n const setUsernameCommand = new Command(\"set-x-username\")\n .description(\"Set your X (Twitter) username for your profile\")\n .requiredOption(\n \"--username <username>\",\n \"Your X (Twitter) username (with or without @)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetUsername({\n username: options.username,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-bio subcommand (write)\n const setBioCommand = new Command(\"set-bio\")\n .description(\"Set your profile bio\")\n .requiredOption(\"--bio <bio>\", \"Your profile bio (max 280 characters)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetBio({\n bio: options.bio,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-token-address subcommand (write)\n const setTokenAddressCommand = new Command(\"set-token-address\")\n .description(\"Set your profile token address (ERC-20 token that represents you)\")\n .requiredOption(\n \"--token-address <address>\",\n \"ERC-20 token contract address (0x-prefixed)\"\n )\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetTokenAddress({\n tokenAddress: options.tokenAddress,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Set-canvas subcommand (write)\n const setCanvasCommand = new Command(\"set-canvas\")\n .description(\"Set your profile canvas (HTML content)\")\n .option(\"--file <path>\", \"Path to file containing canvas content\")\n .option(\"--content <html>\", \"HTML content for canvas (inline)\")\n .option(\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex, 66 characters). Can also be set via NET_PRIVATE_KEY env var\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (options) => {\n await executeProfileSetCanvas({\n file: options.file,\n content: options.content,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n // Get-canvas subcommand (read-only)\n const getCanvasCommand = new Command(\"get-canvas\")\n .description(\"Get profile canvas for an address\")\n .requiredOption(\"--address <address>\", \"Wallet address to get canvas for\")\n .option(\"--output <path>\", \"Write canvas content to file instead of stdout\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\"\n )\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeProfileGetCanvas({\n address: options.address,\n output: options.output,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n profileCommand.addCommand(getCommand);\n profileCommand.addCommand(setPictureCommand);\n profileCommand.addCommand(setUsernameCommand);\n profileCommand.addCommand(setBioCommand);\n profileCommand.addCommand(setTokenAddressCommand);\n profileCommand.addCommand(setCanvasCommand);\n profileCommand.addCommand(getCanvasCommand);\n}\n","/**\n * Format a price number for display (removes trailing zeros)\n */\nexport function formatEthPrice(price: number): string {\n return price.toFixed(6).replace(/\\.?0+$/, \"\");\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListListingsOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListListings(options: ListListingsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}` | undefined,\n });\n\n if (options.json) {\n const output = listings.map((l) => ({\n orderHash: l.orderHash,\n maker: l.maker,\n nftAddress: l.nftAddress,\n tokenId: l.tokenId,\n price: l.price,\n priceWei: l.priceWei.toString(),\n currency: l.currency,\n expirationDate: l.expirationDate,\n orderStatus: l.orderStatus,\n ...(l.targetFulfiller ? { targetFulfiller: l.targetFulfiller } : {}),\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (listings.length === 0) {\n console.log(chalk.yellow(\"No active listings found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nListings (${listings.length}):\\n`));\n\n for (const listing of listings) {\n const expiry = new Date(listing.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${listing.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${listing.maker}`);\n console.log(` ${chalk.cyan(\"NFT:\")} ${listing.nftAddress} #${listing.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(listing.price)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n if (listing.targetFulfiller) {\n console.log(` ${chalk.cyan(\"Private (for):\")} ${listing.targetFulfiller}`);\n }\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch listings: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListOffersOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListOffers(options: ListOffersOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = offers.map((o) => ({\n orderHash: o.orderHash,\n maker: o.maker,\n nftAddress: o.nftAddress,\n price: o.price,\n priceWei: o.priceWei.toString(),\n currency: o.currency,\n expirationDate: o.expirationDate,\n orderStatus: o.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (offers.length === 0) {\n console.log(chalk.yellow(\"No active collection offers found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nCollection Offers (${offers.length}):\\n`));\n\n for (const offer of offers) {\n const expiry = new Date(offer.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${offer.orderHash}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${offer.maker}`);\n console.log(` ${chalk.cyan(\"Collection:\")} ${offer.nftAddress}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(offer.price)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch offers: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListSalesOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListSales(options: ListSalesOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const sales = await bazaarClient.getSales({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = sales.map((s) => ({\n orderHash: s.orderHash,\n seller: s.seller,\n buyer: s.buyer,\n tokenAddress: s.tokenAddress,\n tokenId: s.tokenId,\n amount: s.amount.toString(),\n price: s.price,\n priceWei: s.priceWei.toString(),\n currency: s.currency,\n timestamp: s.timestamp,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (sales.length === 0) {\n console.log(chalk.yellow(\"No sales found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nSales (${sales.length}):\\n`));\n\n for (const sale of sales) {\n const date = new Date(sale.timestamp * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${sale.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${sale.seller}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${sale.buyer}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${sale.tokenAddress} #${sale.tokenId}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(sale.price)} ${sale.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Date:\")} ${date}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch sales: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateListingOptions } from \"./types\";\n\nexport async function executeCreateListing(options: CreateListingOptions): Promise<void> {\n // Dual mode: with private key = full flow, without = output EIP-712 data\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing listing...\"));\n\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: account.address,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if needed\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing order...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the listing\n console.log(chalk.blue(\"Submitting listing...\"));\n const submitTx = bazaarClient.prepareSubmitListing(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Listing created successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateListingOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateListing({\n nftAddress: options.nftAddress as `0x${string}`,\n tokenId: options.tokenId,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n targetFulfiller: options.targetFulfiller as `0x${string}` | undefined,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateOfferOptions } from \"./types\";\n\nexport async function executeCreateOffer(options: CreateOfferOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n console.log(chalk.blue(\"Preparing collection offer...\"));\n\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if needed (WETH approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing offer...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the offer\n console.log(chalk.blue(\"Submitting offer...\"));\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `Collection offer created successfully!\\n Transaction: ${hash}\\n Collection: ${options.nftAddress}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateOfferOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n\n try {\n const prepared = await bazaarClient.prepareCreateCollectionOffer({\n nftAddress: options.nftAddress as `0x${string}`,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitListingOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitListing(options: SubmitListingOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Submitting listing...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Listing submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitListingOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitListing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitListing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitOfferOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitOffer(options: SubmitOfferOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Submitting offer...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`Offer submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitOfferOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitCollectionOffer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitCollectionOffer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { BuyListingOptions } from \"./types\";\n\nexport async function executeBuyListing(options: BuyListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching listing...\"));\n\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, account.address);\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if any\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Listing fulfilled successfully!\\n Transaction: ${hash}\\n NFT: ${listing.nftAddress} #${listing.tokenId}\\n Price: ${listing.price} ${listing.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: BuyListingOptions): Promise<void> {\n if (!options.buyer) {\n exitWithError(\"--buyer is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const buyerAddress = options.buyer as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getListings({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`Listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillListing(listing, buyerAddress);\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode buy listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { AcceptOfferOptions } from \"./types\";\n\nexport async function executeAcceptOffer(options: AcceptOfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching offers...\"));\n\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n account.address\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if any (ERC721 approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `Offer accepted successfully!\\n Transaction: ${hash}\\n NFT: ${options.nftAddress} #${options.tokenId}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: AcceptOfferOptions): Promise<void> {\n if (!options.seller) {\n exitWithError(\"--seller is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const sellerAddress = options.seller as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getCollectionOffers({\n nftAddress: options.nftAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`Offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillCollectionOffer(\n offer,\n options.tokenId,\n sellerAddress\n );\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode accept offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { OwnedNftsOptions } from \"./types\";\n\nexport async function executeOwnedNfts(options: OwnedNftsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const startTokenId = options.startTokenId ? BigInt(options.startTokenId) : undefined;\n const endTokenId = options.endTokenId ? BigInt(options.endTokenId) : undefined;\n\n try {\n const tokenIds = await bazaarClient.getOwnedTokens({\n nftAddress: options.nftAddress as `0x${string}`,\n ownerAddress: options.owner as `0x${string}`,\n startTokenId,\n endTokenId,\n });\n\n if (options.json) {\n const output = {\n nftAddress: options.nftAddress,\n owner: options.owner,\n tokenIds: tokenIds.map((id) => id.toString()),\n count: tokenIds.length,\n };\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (tokenIds.length === 0) {\n console.log(chalk.yellow(\"No owned tokens found in the specified range\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nOwned Tokens (${tokenIds.length}):\\n`));\n console.log(` ${chalk.cyan(\"Collection:\")} ${options.nftAddress}`);\n console.log(` ${chalk.cyan(\"Owner:\")} ${options.owner}`);\n console.log(` ${chalk.cyan(\"Token IDs:\")} ${tokenIds.map((id) => id.toString()).join(\", \")}`);\n console.log();\n } catch (error) {\n exitWithError(\n `Failed to fetch owned tokens: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListErc20ListingsOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListErc20Listings(options: ListErc20ListingsOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = listings.map((l) => ({\n orderHash: l.orderHash,\n maker: l.maker,\n tokenAddress: l.tokenAddress,\n tokenAmount: l.tokenAmount.toString(),\n price: l.price,\n priceWei: l.priceWei.toString(),\n pricePerToken: l.pricePerToken,\n pricePerTokenWei: l.pricePerTokenWei.toString(),\n currency: l.currency,\n expirationDate: l.expirationDate,\n orderStatus: l.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (listings.length === 0) {\n console.log(chalk.yellow(\"No active ERC-20 listings found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nERC-20 Listings (${listings.length}):\\n`));\n\n for (const listing of listings) {\n const expiry = new Date(listing.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${listing.orderHash}`);\n console.log(` ${chalk.cyan(\"Seller:\")} ${listing.maker}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${listing.tokenAddress}`);\n console.log(` ${chalk.cyan(\"Amount:\")} ${listing.tokenAmount.toString()}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(listing.price)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Price/Token:\")} ${formatEthPrice(listing.pricePerToken)} ${listing.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch ERC-20 listings: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { ListErc20OffersOptions } from \"./types\";\nimport { formatEthPrice } from \"./format\";\n\nexport async function executeListErc20Offers(options: ListErc20OffersOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n if (options.json) {\n const output = offers.map((o) => ({\n orderHash: o.orderHash,\n maker: o.maker,\n tokenAddress: o.tokenAddress,\n tokenAmount: o.tokenAmount.toString(),\n price: o.price,\n priceWei: o.priceWei.toString(),\n pricePerToken: o.pricePerToken,\n pricePerTokenWei: o.pricePerTokenWei.toString(),\n currency: o.currency,\n expirationDate: o.expirationDate,\n orderStatus: o.orderStatus,\n }));\n console.log(JSON.stringify(output, null, 2));\n return;\n }\n\n if (offers.length === 0) {\n console.log(chalk.yellow(\"No active ERC-20 offers found\"));\n return;\n }\n\n console.log(chalk.white.bold(`\\nERC-20 Offers (${offers.length}):\\n`));\n\n for (const offer of offers) {\n const expiry = new Date(offer.expirationDate * 1000).toLocaleString();\n console.log(` ${chalk.cyan(\"Order Hash:\")} ${offer.orderHash}`);\n console.log(` ${chalk.cyan(\"Buyer:\")} ${offer.maker}`);\n console.log(` ${chalk.cyan(\"Token:\")} ${offer.tokenAddress}`);\n console.log(` ${chalk.cyan(\"Amount:\")} ${offer.tokenAmount.toString()}`);\n console.log(` ${chalk.cyan(\"Price:\")} ${formatEthPrice(offer.price)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Price/Token:\")} ${formatEthPrice(offer.pricePerToken)} ${offer.currency.toUpperCase()}`);\n console.log(` ${chalk.cyan(\"Expires:\")} ${expiry}`);\n console.log();\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch ERC-20 offers: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateErc20ListingOptions } from \"./types\";\n\nexport async function executeCreateErc20Listing(options: CreateErc20ListingOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n console.log(chalk.blue(\"Preparing ERC-20 listing...\"));\n\n const prepared = await bazaarClient.prepareCreateErc20Listing({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if needed\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing order...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the listing\n console.log(chalk.blue(\"Submitting ERC-20 listing...\"));\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 listing created successfully!\\n Transaction: ${hash}\\n Token: ${options.tokenAddress}\\n Amount: ${options.tokenAmount}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateErc20ListingOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n const prepared = await bazaarClient.prepareCreateErc20Listing({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport {\n createWalletClient,\n http,\n parseEther,\n encodeFunctionData,\n} from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport type { CreateErc20OfferOptions } from \"./types\";\n\nexport async function executeCreateErc20Offer(options: CreateErc20OfferOptions): Promise<void> {\n const hasPrivateKey = !!(\n options.privateKey ||\n process.env.NET_PRIVATE_KEY ||\n process.env.PRIVATE_KEY\n );\n\n if (!hasPrivateKey) {\n await executeKeylessMode(options);\n return;\n }\n\n const commonOptions = parseCommonOptions({\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n console.log(chalk.blue(\"Preparing ERC-20 offer...\"));\n\n const prepared = await bazaarClient.prepareCreateErc20Offer({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: account.address,\n });\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if needed (WETH approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Sign the EIP-712 typed data\n console.log(chalk.blue(\"Signing offer...\"));\n const signature = await walletClient.signTypedData({\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n });\n\n // Submit the offer\n console.log(chalk.blue(\"Submitting ERC-20 offer...\"));\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n prepared.eip712.orderParameters,\n prepared.eip712.counter,\n signature as `0x${string}`\n );\n\n const submitCalldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: submitCalldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 offer created successfully!\\n Transaction: ${hash}\\n Token: ${options.tokenAddress}\\n Amount: ${options.tokenAmount}\\n Price: ${options.price} ETH`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to create ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeKeylessMode(options: CreateErc20OfferOptions): Promise<void> {\n if (!options.offerer) {\n exitWithError(\"--offerer is required when not providing --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const priceWei = parseEther(options.price);\n const tokenAmount = BigInt(options.tokenAmount);\n\n try {\n const prepared = await bazaarClient.prepareCreateErc20Offer({\n tokenAddress: options.tokenAddress as `0x${string}`,\n tokenAmount,\n priceWei,\n offerer: options.offerer as `0x${string}`,\n });\n\n const output = {\n eip712: {\n domain: prepared.eip712.domain,\n types: prepared.eip712.types,\n primaryType: prepared.eip712.primaryType,\n message: prepared.eip712.message,\n },\n orderParameters: prepared.eip712.orderParameters,\n counter: prepared.eip712.counter.toString(),\n approvals: prepared.approvals.map((a) => ({\n to: a.to,\n data: encodeFunctionData({\n abi: a.abi,\n functionName: a.functionName,\n args: a.args,\n }),\n description: `Approve ${a.functionName}`,\n })),\n };\n\n console.log(JSON.stringify(output, bigintReplacer, 2));\n } catch (error) {\n exitWithError(\n `Failed to prepare ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nfunction bigintReplacer(_key: string, value: unknown): unknown {\n if (typeof value === \"bigint\") {\n return value.toString();\n }\n return value;\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitErc20ListingOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitErc20Listing(options: SubmitErc20ListingOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Listing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Submitting ERC-20 listing...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`ERC-20 listing submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitErc20ListingOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitErc20Listing(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Listing>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { SubmitErc20OfferOptions } from \"./types\";\nimport { readFileSync } from \"fs\";\n\nexport async function executeSubmitErc20Offer(options: SubmitErc20OfferOptions): Promise<void> {\n // Read order data from file\n let orderData: { orderParameters: unknown; counter: string };\n try {\n const raw = readFileSync(options.orderData, \"utf-8\");\n orderData = JSON.parse(raw);\n } catch (error) {\n exitWithError(\n `Failed to read order data file: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n\n if (options.encodeOnly) {\n await executeEncodeOnly(options, orderData);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Offer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Submitting ERC-20 offer...\"));\n\n const calldata = encodeFunctionData({\n abi: submitTx.abi,\n functionName: submitTx.functionName,\n args: submitTx.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: submitTx.to,\n data: calldata,\n chain: null,\n value: submitTx.value,\n });\n\n console.log(chalk.green(`ERC-20 offer submitted successfully!\\n Transaction: ${hash}`));\n } catch (error) {\n exitWithError(\n `Failed to submit ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(\n options: SubmitErc20OfferOptions,\n orderData: { orderParameters: unknown; counter: string }\n): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n const submitTx = bazaarClient.prepareSubmitErc20Offer(\n orderData.orderParameters as Parameters<typeof bazaarClient.prepareSubmitErc20Offer>[0],\n BigInt(orderData.counter),\n options.signature as `0x${string}`\n );\n\n const encoded = encodeTransaction(\n { to: submitTx.to, functionName: submitTx.functionName, args: submitTx.args, abi: submitTx.abi, value: submitTx.value },\n readOnlyOptions.chainId\n );\n console.log(JSON.stringify(encoded, null, 2));\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { BuyErc20ListingOptions } from \"./types\";\n\nexport async function executeBuyErc20Listing(options: BuyErc20ListingOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC-20 listing...\"));\n\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`ERC-20 listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillErc20Listing(listing, account.address);\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if any\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 listing fulfilled successfully!\\n Transaction: ${hash}\\n Token: ${listing.tokenAddress}\\n Amount: ${listing.tokenAmount.toString()}\\n Price: ${listing.price} ${listing.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to buy ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: BuyErc20ListingOptions): Promise<void> {\n if (!options.buyer) {\n exitWithError(\"--buyer is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const buyerAddress = options.buyer as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const listings = await bazaarClient.getErc20Listings({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const listing = listings.find(\n (l) => l.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!listing) {\n exitWithError(`ERC-20 listing with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillErc20Listing(listing, buyerAddress);\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode buy ERC-20 listing: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import chalk from \"chalk\";\nimport { createWalletClient, http, encodeFunctionData } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { BazaarClient } from \"@net-protocol/bazaar\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport { parseCommonOptions, parseReadOnlyOptions } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport type { AcceptErc20OfferOptions } from \"./types\";\n\nexport async function executeAcceptErc20Offer(options: AcceptErc20OfferOptions): Promise<void> {\n if (options.encodeOnly) {\n await executeEncodeOnly(options);\n return;\n }\n\n const commonOptions = parseCommonOptions(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const account = privateKeyToAccount(commonOptions.privateKey);\n\n const bazaarClient = new BazaarClient({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n try {\n console.log(chalk.blue(\"Fetching ERC-20 offers...\"));\n\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`ERC-20 offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n console.log(chalk.blue(\"Preparing fulfillment...\"));\n\n const prepared = await bazaarClient.prepareFulfillErc20Offer(\n offer,\n account.address\n );\n\n const rpcUrls = getChainRpcUrls({\n chainId: commonOptions.chainId,\n rpcUrl: commonOptions.rpcUrl,\n });\n\n const walletClient = createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n\n // Send approval txs if any (ERC20 approval)\n for (const approval of prepared.approvals) {\n console.log(chalk.blue(\"Sending approval transaction...\"));\n const calldata = encodeFunctionData({\n abi: approval.abi,\n functionName: approval.functionName,\n args: approval.args,\n });\n const approvalHash = await walletClient.sendTransaction({\n to: approval.to,\n data: calldata,\n chain: null,\n value: approval.value,\n });\n console.log(chalk.green(`Approval tx: ${approvalHash}`));\n }\n\n // Send fulfillment tx\n console.log(chalk.blue(\"Sending fulfillment transaction...\"));\n const calldata = encodeFunctionData({\n abi: prepared.fulfillment.abi,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n });\n\n const hash = await walletClient.sendTransaction({\n to: prepared.fulfillment.to,\n data: calldata,\n chain: null,\n value: prepared.fulfillment.value,\n });\n\n console.log(\n chalk.green(\n `ERC-20 offer accepted successfully!\\n Transaction: ${hash}\\n Token: ${offer.tokenAddress}\\n Amount: ${offer.tokenAmount.toString()}\\n Price: ${offer.price} ${offer.currency.toUpperCase()}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to accept ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nasync function executeEncodeOnly(options: AcceptErc20OfferOptions): Promise<void> {\n if (!options.seller) {\n exitWithError(\"--seller is required when using --encode-only without --private-key\");\n }\n\n const readOnlyOptions = parseReadOnlyOptions({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const sellerAddress = options.seller as `0x${string}`;\n\n const bazaarClient = new BazaarClient({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n\n try {\n const offers = await bazaarClient.getErc20Offers({\n tokenAddress: options.tokenAddress as `0x${string}`,\n });\n\n const offer = offers.find(\n (o) => o.orderHash.toLowerCase() === options.orderHash.toLowerCase()\n );\n\n if (!offer) {\n exitWithError(`ERC-20 offer with order hash ${options.orderHash} not found or no longer active`);\n }\n\n const prepared = await bazaarClient.prepareFulfillErc20Offer(\n offer,\n sellerAddress\n );\n\n const result = {\n approvals: prepared.approvals.map((a) =>\n encodeTransaction(\n { to: a.to, functionName: a.functionName, args: a.args, abi: a.abi, value: a.value },\n readOnlyOptions.chainId\n )\n ),\n fulfillment: encodeTransaction(\n {\n to: prepared.fulfillment.to,\n functionName: prepared.fulfillment.functionName,\n args: prepared.fulfillment.args,\n abi: prepared.fulfillment.abi,\n value: prepared.fulfillment.value,\n },\n readOnlyOptions.chainId\n ),\n };\n\n console.log(JSON.stringify(result, null, 2));\n } catch (error) {\n exitWithError(\n `Failed to encode accept ERC-20 offer: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n","import { Command } from \"commander\";\nimport { executeListListings } from \"./list-listings\";\nimport { executeListOffers } from \"./list-offers\";\nimport { executeListSales } from \"./list-sales\";\nimport { executeCreateListing } from \"./create-listing\";\nimport { executeCreateOffer } from \"./create-offer\";\nimport { executeSubmitListing } from \"./submit-listing\";\nimport { executeSubmitOffer } from \"./submit-offer\";\nimport { executeBuyListing } from \"./buy-listing\";\nimport { executeAcceptOffer } from \"./accept-offer\";\nimport { executeOwnedNfts } from \"./owned-nfts\";\nimport { executeListErc20Listings } from \"./list-erc20-listings\";\nimport { executeListErc20Offers } from \"./list-erc20-offers\";\nimport { executeCreateErc20Listing } from \"./create-erc20-listing\";\nimport { executeCreateErc20Offer } from \"./create-erc20-offer\";\nimport { executeSubmitErc20Listing } from \"./submit-erc20-listing\";\nimport { executeSubmitErc20Offer } from \"./submit-erc20-offer\";\nimport { executeBuyErc20Listing } from \"./buy-erc20-listing\";\nimport { executeAcceptErc20Offer } from \"./accept-erc20-offer\";\n\nconst chainIdOption = [\n \"--chain-id <id>\",\n \"Chain ID. Can also be set via NET_CHAIN_ID env var\",\n (value: string) => parseInt(value, 10),\n] as const;\n\nconst rpcUrlOption = [\n \"--rpc-url <url>\",\n \"Custom RPC URL. Can also be set via NET_RPC_URL env var\",\n] as const;\n\nconst privateKeyOption = [\n \"--private-key <key>\",\n \"Private key (0x-prefixed hex). Can also be set via NET_PRIVATE_KEY env var\",\n] as const;\n\nexport function registerBazaarCommand(program: Command): void {\n const bazaarCommand = program\n .command(\"bazaar\")\n .description(\"Bazaar NFT trading operations\");\n\n const listListingsCommand = new Command(\"list-listings\")\n .description(\"List active NFT listings\")\n .option(\"--nft-address <address>\", \"NFT contract address (optional for cross-collection)\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListListings({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listOffersCommand = new Command(\"list-offers\")\n .description(\"List active collection offers\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListOffers({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listSalesCommand = new Command(\"list-sales\")\n .description(\"List recent sales\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListSales({\n nftAddress: options.nftAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const createListingCommand = new Command(\"create-listing\")\n .description(\"Create an NFT listing (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to list\")\n .requiredOption(\"--price <eth>\", \"Price in ETH (e.g., 0.1)\")\n .option(\"--target-fulfiller <address>\", \"Make a private listing for this address\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateListing({\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n price: options.price,\n targetFulfiller: options.targetFulfiller,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const createOfferCommand = new Command(\"create-offer\")\n .description(\"Create a collection offer (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--price <eth>\", \"Offer price in ETH (e.g., 0.1)\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateOffer({\n nftAddress: options.nftAddress,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const submitListingCommand = new Command(\"submit-listing\")\n .description(\"Submit a signed listing (follow-up to create-listing without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-listing output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitListing({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const submitOfferCommand = new Command(\"submit-offer\")\n .description(\"Submit a signed offer (follow-up to create-offer without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-offer output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitOffer({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const buyListingCommand = new Command(\"buy-listing\")\n .description(\"Buy an NFT listing\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to buy\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .option(\"--buyer <address>\", \"Buyer address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeBuyListing({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n buyer: options.buyer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const acceptOfferCommand = new Command(\"accept-offer\")\n .description(\"Accept a collection offer by selling your NFT\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to accept\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--token-id <id>\", \"Token ID to sell\")\n .option(\"--seller <address>\", \"Seller address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeAcceptOffer({\n orderHash: options.orderHash,\n nftAddress: options.nftAddress,\n tokenId: options.tokenId,\n seller: options.seller,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const ownedNftsCommand = new Command(\"owned-nfts\")\n .description(\"List NFTs owned by an address\")\n .requiredOption(\"--nft-address <address>\", \"NFT contract address\")\n .requiredOption(\"--owner <address>\", \"Owner address to check\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .option(\"--start-token-id <id>\", \"Start of token ID range (default: 0)\")\n .option(\"--end-token-id <id>\", \"End of token ID range (default: 10000)\")\n .action(async (options) => {\n await executeOwnedNfts({\n nftAddress: options.nftAddress,\n owner: options.owner,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n startTokenId: options.startTokenId,\n endTokenId: options.endTokenId,\n });\n });\n\n // ERC-20 commands\n\n const listErc20ListingsCommand = new Command(\"list-erc20-listings\")\n .description(\"List active ERC-20 token listings\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListErc20Listings({\n tokenAddress: options.tokenAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const listErc20OffersCommand = new Command(\"list-erc20-offers\")\n .description(\"List active ERC-20 token offers\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeListErc20Offers({\n tokenAddress: options.tokenAddress,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n json: options.json,\n });\n });\n\n const createErc20ListingCommand = new Command(\"create-erc20-listing\")\n .description(\"Create an ERC-20 token listing (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .requiredOption(\"--token-amount <amount>\", \"Token amount in raw units (bigint string)\")\n .requiredOption(\"--price <eth>\", \"Total price in ETH for the token amount\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateErc20Listing({\n tokenAddress: options.tokenAddress,\n tokenAmount: options.tokenAmount,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const createErc20OfferCommand = new Command(\"create-erc20-offer\")\n .description(\"Create an ERC-20 token offer (with --private-key: full flow; without: output EIP-712 data)\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .requiredOption(\"--token-amount <amount>\", \"Token amount in raw units (bigint string)\")\n .requiredOption(\"--price <eth>\", \"Total price in ETH for the token amount\")\n .option(\"--offerer <address>\", \"Offerer address (required without --private-key)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .action(async (options) => {\n await executeCreateErc20Offer({\n tokenAddress: options.tokenAddress,\n tokenAmount: options.tokenAmount,\n price: options.price,\n offerer: options.offerer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n });\n\n const submitErc20ListingCommand = new Command(\"submit-erc20-listing\")\n .description(\"Submit a signed ERC-20 listing (follow-up to create-erc20-listing without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-erc20-listing output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitErc20Listing({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const submitErc20OfferCommand = new Command(\"submit-erc20-offer\")\n .description(\"Submit a signed ERC-20 offer (follow-up to create-erc20-offer without --private-key)\")\n .requiredOption(\"--order-data <path>\", \"Path to order JSON file from create-erc20-offer output\")\n .requiredOption(\"--signature <sig>\", \"EIP-712 signature (0x-prefixed)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeSubmitErc20Offer({\n orderData: options.orderData,\n signature: options.signature,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const buyErc20ListingCommand = new Command(\"buy-erc20-listing\")\n .description(\"Buy an ERC-20 token listing\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the listing to buy\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--buyer <address>\", \"Buyer address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeBuyErc20Listing({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n buyer: options.buyer,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n const acceptErc20OfferCommand = new Command(\"accept-erc20-offer\")\n .description(\"Accept an ERC-20 token offer by selling your tokens\")\n .requiredOption(\"--order-hash <hash>\", \"Order hash of the offer to accept\")\n .requiredOption(\"--token-address <address>\", \"ERC-20 token contract address\")\n .option(\"--seller <address>\", \"Seller address (required with --encode-only)\")\n .option(...privateKeyOption)\n .option(...chainIdOption)\n .option(...rpcUrlOption)\n .option(\"--encode-only\", \"Output transaction data as JSON instead of executing\")\n .action(async (options) => {\n await executeAcceptErc20Offer({\n orderHash: options.orderHash,\n tokenAddress: options.tokenAddress,\n seller: options.seller,\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n encodeOnly: options.encodeOnly,\n });\n });\n\n bazaarCommand.addCommand(listListingsCommand);\n bazaarCommand.addCommand(listOffersCommand);\n bazaarCommand.addCommand(listSalesCommand);\n bazaarCommand.addCommand(createListingCommand);\n bazaarCommand.addCommand(createOfferCommand);\n bazaarCommand.addCommand(submitListingCommand);\n bazaarCommand.addCommand(submitOfferCommand);\n bazaarCommand.addCommand(buyListingCommand);\n bazaarCommand.addCommand(acceptOfferCommand);\n bazaarCommand.addCommand(ownedNftsCommand);\n bazaarCommand.addCommand(listErc20ListingsCommand);\n bazaarCommand.addCommand(listErc20OffersCommand);\n bazaarCommand.addCommand(createErc20ListingCommand);\n bazaarCommand.addCommand(createErc20OfferCommand);\n bazaarCommand.addCommand(submitErc20ListingCommand);\n bazaarCommand.addCommand(submitErc20OfferCommand);\n bazaarCommand.addCommand(buyErc20ListingCommand);\n bazaarCommand.addCommand(acceptErc20OfferCommand);\n}\n","import chalk from \"chalk\";\nimport type { NetMessage, RegisteredFeed } from \"@net-protocol/feeds\";\n\n/**\n * Truncate an address for display\n */\nexport function truncateAddress(address: string): string {\n if (address.length <= 12) return address;\n return `${address.slice(0, 6)}...${address.slice(-4)}`;\n}\n\n/**\n * Format a timestamp as ISO date string\n */\nexport function formatTimestamp(timestamp: number | bigint): string {\n return new Date(Number(timestamp) * 1000).toISOString().replace(\"T\", \" \").slice(0, 19);\n}\n\n/** Parse topic to get clean feed name and whether it's a comment */\nfunction parseTopic(topic: string): { feedName: string; isComment: boolean } {\n const commentMatch = topic.match(/^(.+?):comments:/);\n if (commentMatch) {\n return { feedName: commentMatch[1], isComment: true };\n }\n return { feedName: topic, isComment: false };\n}\n\ninterface FormatPostOptions {\n commentCount?: number;\n showTopic?: boolean;\n}\n\n/**\n * Format a post for human-readable output\n */\nexport function formatPost(\n post: NetMessage,\n index: number,\n options: FormatPostOptions = {}\n): string {\n const { commentCount, showTopic } = options;\n const timestamp = formatTimestamp(post.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.gray(timestamp)}`,\n ` ${chalk.white(\"Sender:\")} ${post.sender}`,\n ` ${chalk.white(\"Text:\")} ${post.text}`,\n ];\n\n if (showTopic && post.topic) {\n const { feedName, isComment } = parseTopic(post.topic);\n const prefix = isComment ? \"Comment on\" : \"Feed\";\n lines.push(` ${chalk.white(prefix + \":\")} ${chalk.magenta(feedName)}`);\n }\n\n if (commentCount !== undefined) {\n lines.push(` ${chalk.white(\"Comments:\")} ${commentCount}`);\n }\n\n if (post.data && post.data !== \"0x\") {\n lines.push(` ${chalk.white(\"Data:\")} ${post.data}`);\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a feed for human-readable output\n */\nexport function formatFeed(feed: RegisteredFeed, index: number): string {\n const timestamp = formatTimestamp(feed.timestamp);\n const lines = [\n chalk.cyan(`[${index}]`) + ` ${chalk.white(feed.feedName)}`,\n ` ${chalk.gray(\"Registrant:\")} ${feed.registrant}`,\n ` ${chalk.gray(\"Registered:\")} ${timestamp}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Format a comment for human-readable output with indentation\n */\nexport function formatComment(\n comment: NetMessage,\n depth: number\n): string {\n const indent = \" \".repeat(depth + 1);\n const timestamp = formatTimestamp(comment.timestamp);\n const lines = [\n `${indent}${chalk.gray(timestamp)} ${chalk.blue(truncateAddress(comment.sender))}`,\n `${indent}${comment.text}`,\n ];\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert a post to JSON format\n */\nexport function postToJson(\n post: NetMessage,\n index: number,\n commentCount?: number\n): Record<string, unknown> {\n const result: Record<string, unknown> = {\n index,\n sender: post.sender,\n text: post.text,\n timestamp: Number(post.timestamp),\n topic: post.topic,\n };\n\n if (commentCount !== undefined) {\n result.commentCount = commentCount;\n }\n\n if (post.data && post.data !== \"0x\") {\n result.data = post.data;\n }\n\n return result;\n}\n\n/**\n * Convert a feed to JSON format\n */\nexport function feedToJson(\n feed: RegisteredFeed,\n index: number\n): Record<string, unknown> {\n return {\n index,\n feedName: feed.feedName,\n registrant: feed.registrant,\n timestamp: feed.timestamp,\n };\n}\n\n/**\n * Convert a comment to JSON format\n */\nexport function commentToJson(\n comment: NetMessage,\n depth: number\n): Record<string, unknown> {\n return {\n sender: comment.sender,\n text: comment.text,\n timestamp: Number(comment.timestamp),\n depth,\n data: comment.data !== \"0x\" ? comment.data : undefined,\n };\n}\n\n/**\n * Print JSON data to stdout\n */\nexport function printJson(data: unknown): void {\n console.log(JSON.stringify(data, null, 2));\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedRegistryClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatFeed, feedToJson, printJson } from \"./format\";\n\ninterface ListOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed list command\n */\nasync function executeFeedList(options: ListOptions): Promise<void> {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n\n try {\n const feeds = await client.getRegisteredFeeds({\n maxFeeds: options.limit ?? 50,\n });\n\n if (options.json) {\n printJson(feeds.map((feed, i) => feedToJson(feed, i)));\n } else {\n if (feeds.length === 0) {\n console.log(chalk.yellow(\"No registered feeds found\"));\n return;\n }\n\n console.log(chalk.white(`Found ${feeds.length} registered feed(s):\\n`));\n feeds.forEach((feed, i) => {\n console.log(formatFeed(feed, i));\n if (i < feeds.length - 1) {\n console.log(); // Empty line between feeds\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch feeds: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed list subcommand\n */\nexport function registerFeedListCommand(parent: Command, commandName = \"list\"): void {\n parent\n .command(commandName)\n .description(\"List registered feeds\")\n .option(\n \"--limit <n>\",\n \"Maximum number of feeds to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (options) => {\n await executeFeedList(options);\n });\n}\n","import * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\n\ninterface FeedState {\n lastSeenTimestamp: number;\n}\n\nexport type HistoryEntryType = \"post\" | \"comment\" | \"register\";\n\nexport interface HistoryEntry {\n type: HistoryEntryType;\n timestamp: number; // Unix timestamp (local time when action was taken)\n txHash: string;\n chainId: number;\n feed: string;\n sender?: string; // The agent's address (for constructing post IDs)\n text?: string; // Message content (for posts/comments)\n postId?: string; // For comments, the post being replied to\n}\n\ninterface AppState {\n feeds: Record<string, FeedState>;\n myAddress?: string;\n history?: HistoryEntry[];\n}\n\nconst MAX_HISTORY_ENTRIES = 100;\n\n// Keep state directory as ~/.botchan/ for backward compat\nconst STATE_DIR = path.join(os.homedir(), \".botchan\");\nconst STATE_FILE = path.join(STATE_DIR, \"state.json\");\n\nfunction ensureStateDir(): void {\n if (!fs.existsSync(STATE_DIR)) {\n fs.mkdirSync(STATE_DIR, { recursive: true });\n }\n}\n\nfunction loadState(): AppState {\n try {\n if (fs.existsSync(STATE_FILE)) {\n const data = fs.readFileSync(STATE_FILE, \"utf-8\");\n return JSON.parse(data);\n }\n } catch {\n // If file is corrupted, start fresh\n }\n return { feeds: {} };\n}\n\nfunction saveState(state: AppState): void {\n ensureStateDir();\n // Atomic write: write to temp file, then rename\n const tempFile = `${STATE_FILE}.tmp`;\n fs.writeFileSync(tempFile, JSON.stringify(state, null, 2));\n fs.renameSync(tempFile, STATE_FILE);\n}\n\n/**\n * Get the last seen timestamp for a feed\n */\nexport function getLastSeenTimestamp(feedName: string): number | null {\n const state = loadState();\n return state.feeds[feedName]?.lastSeenTimestamp ?? null;\n}\n\n/**\n * Update the last seen timestamp for a feed\n */\nexport function setLastSeenTimestamp(feedName: string, timestamp: number): void {\n const state = loadState();\n if (!state.feeds[feedName]) {\n state.feeds[feedName] = { lastSeenTimestamp: timestamp };\n } else {\n state.feeds[feedName].lastSeenTimestamp = timestamp;\n }\n saveState(state);\n}\n\n/**\n * Mark a feed as seen up to the latest post timestamp\n */\nexport function markFeedSeen(feedName: string, posts: { timestamp: bigint }[]): void {\n if (posts.length === 0) return;\n\n // Find the max timestamp\n const maxTimestamp = posts.reduce(\n (max, post) => (post.timestamp > max ? post.timestamp : max),\n posts[0].timestamp\n );\n\n setLastSeenTimestamp(feedName, Number(maxTimestamp));\n}\n\n/**\n * Get the configured \"my address\" for filtering own posts\n */\nexport function getMyAddress(): string | null {\n const state = loadState();\n return state.myAddress ?? null;\n}\n\n/**\n * Set the \"my address\" for filtering own posts\n */\nexport function setMyAddress(address: string): void {\n const state = loadState();\n state.myAddress = address.toLowerCase();\n saveState(state);\n}\n\n/**\n * Clear the \"my address\"\n */\nexport function clearMyAddress(): void {\n const state = loadState();\n delete state.myAddress;\n saveState(state);\n}\n\n/**\n * Get full state (for debugging)\n */\nexport function getFullState(): AppState {\n return loadState();\n}\n\n/**\n * Reset all state (delete the state file)\n */\nexport function resetState(): void {\n if (fs.existsSync(STATE_FILE)) {\n fs.unlinkSync(STATE_FILE);\n }\n}\n\n/**\n * Get the state file path (for display purposes)\n */\nexport function getStateFilePath(): string {\n return STATE_FILE;\n}\n\n/**\n * Add an entry to the agent's history\n * Keeps only the most recent MAX_HISTORY_ENTRIES entries\n */\nexport function addHistoryEntry(entry: Omit<HistoryEntry, \"timestamp\">): void {\n const state = loadState();\n const history = state.history ?? [];\n\n const newEntry: HistoryEntry = {\n ...entry,\n timestamp: Math.floor(Date.now() / 1000),\n };\n\n // Add to beginning (most recent first)\n history.unshift(newEntry);\n\n // Trim to max size\n if (history.length > MAX_HISTORY_ENTRIES) {\n history.length = MAX_HISTORY_ENTRIES;\n }\n\n state.history = history;\n saveState(state);\n}\n\n/**\n * Get the agent's history\n * Returns entries in reverse chronological order (most recent first)\n */\nexport function getHistory(limit?: number): HistoryEntry[] {\n const state = loadState();\n const history = state.history ?? [];\n return limit ? history.slice(0, limit) : history;\n}\n\n/**\n * Get history entries of a specific type\n */\nexport function getHistoryByType(\n type: HistoryEntryType,\n limit?: number\n): HistoryEntry[] {\n const history = getHistory();\n const filtered = history.filter((entry) => entry.type === type);\n return limit ? filtered.slice(0, limit) : filtered;\n}\n\n/**\n * Clear all history\n */\nexport function clearHistory(): void {\n const state = loadState();\n state.history = [];\n saveState(state);\n}\n\n/**\n * Get history count\n */\nexport function getHistoryCount(): number {\n const state = loadState();\n return state.history?.length ?? 0;\n}\n\n/**\n * Check if a feed name is a wallet address (i.e., a direct message)\n */\nexport function isWalletAddress(feed: string): boolean {\n return /^0x[a-fA-F0-9]{40}$/.test(feed);\n}\n\n/**\n * Contact info derived from history\n */\nexport interface Contact {\n address: string;\n lastInteraction: number;\n interactionCount: number;\n firstInteraction: number;\n}\n\n/**\n * Get contacts - wallet addresses you've posted to (DMs)\n * Returns contacts sorted by last interaction (most recent first)\n */\nexport function getContacts(): Contact[] {\n const history = getHistory();\n const contactMap = new Map<string, Contact>();\n\n // Only look at posts (not comments) to wallet addresses\n for (const entry of history) {\n if (entry.type === \"post\" && isWalletAddress(entry.feed)) {\n const address = entry.feed.toLowerCase();\n const existing = contactMap.get(address);\n\n if (existing) {\n existing.interactionCount++;\n // Update first/last interaction times\n if (entry.timestamp > existing.lastInteraction) {\n existing.lastInteraction = entry.timestamp;\n }\n if (entry.timestamp < existing.firstInteraction) {\n existing.firstInteraction = entry.timestamp;\n }\n } else {\n contactMap.set(address, {\n address,\n lastInteraction: entry.timestamp,\n firstInteraction: entry.timestamp,\n interactionCount: 1,\n });\n }\n }\n }\n\n // Sort by last interaction (most recent first)\n return Array.from(contactMap.values()).sort(\n (a, b) => b.lastInteraction - a.lastInteraction\n );\n}\n\n/**\n * Feed activity info derived from history\n */\nexport interface FeedActivity {\n feed: string;\n postCount: number;\n commentCount: number;\n lastActivity: number;\n firstActivity: number;\n}\n\n/**\n * Get feeds the agent has been active in\n * Returns feeds sorted by last activity (most recent first)\n * Excludes wallet addresses (those are contacts, not feeds)\n */\nexport function getActiveFeeds(): FeedActivity[] {\n const history = getHistory();\n const feedMap = new Map<string, FeedActivity>();\n\n for (const entry of history) {\n // Skip wallet addresses - those are contacts\n if (isWalletAddress(entry.feed)) continue;\n // Skip feed registrations - only count actual posts/comments\n if (entry.type === \"register\") continue;\n\n const feedName = entry.feed.toLowerCase();\n const existing = feedMap.get(feedName);\n\n if (existing) {\n if (entry.type === \"post\") existing.postCount++;\n if (entry.type === \"comment\") existing.commentCount++;\n if (entry.timestamp > existing.lastActivity) {\n existing.lastActivity = entry.timestamp;\n }\n if (entry.timestamp < existing.firstActivity) {\n existing.firstActivity = entry.timestamp;\n }\n } else {\n feedMap.set(feedName, {\n feed: feedName,\n postCount: entry.type === \"post\" ? 1 : 0,\n commentCount: entry.type === \"comment\" ? 1 : 0,\n lastActivity: entry.timestamp,\n firstActivity: entry.timestamp,\n });\n }\n }\n\n // Sort by last activity (most recent first)\n return Array.from(feedMap.values()).sort(\n (a, b) => b.lastActivity - a.lastActivity\n );\n}\n","/**\n * Normalize a feed name to lowercase for consistency.\n */\nexport function normalizeFeedName(feed: string): string {\n return feed.toLowerCase();\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { getLastSeenTimestamp, markFeedSeen, getMyAddress } from \"../../shared/state\";\nimport { formatPost, postToJson, printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface ReadOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n sender?: string;\n unseen?: boolean;\n markSeen?: boolean;\n}\n\n/**\n * Execute the feed read command\n */\nasync function executeFeedRead(feed: string, options: ReadOptions): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"`));\n }\n return;\n }\n\n // Fetch more posts if filtering by sender (we need to find enough matches)\n const fetchLimit = options.sender ? Math.max(limit * 5, 100) : limit;\n\n let posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: fetchLimit,\n });\n\n // Filter by sender if specified\n if (options.sender) {\n const senderLower = options.sender.toLowerCase();\n posts = posts.filter(\n (post) => post.sender.toLowerCase() === senderLower\n );\n // Apply limit after filtering\n posts = posts.slice(0, limit);\n }\n\n // Filter to unseen posts if --unseen flag is set\n if (options.unseen) {\n const lastSeen = getLastSeenTimestamp(normalizedFeed);\n const myAddress = getMyAddress();\n\n posts = posts.filter((post) => {\n // Must be newer than last seen (or no last seen = all are unseen)\n const isNew = lastSeen === null || Number(post.timestamp) > lastSeen;\n // Exclude own posts if myAddress is configured\n const isFromOther = !myAddress || post.sender.toLowerCase() !== myAddress;\n return isNew && isFromOther;\n });\n }\n\n // Mark feed as seen if --mark-seen flag is set\n // Use the original unfiltered posts to get the true latest timestamp\n if (options.markSeen) {\n const allPosts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 1, // Just need the latest\n });\n if (allPosts.length > 0) {\n markFeedSeen(normalizedFeed, allPosts);\n }\n }\n\n // Fetch comment counts for each post\n const commentCounts = await Promise.all(\n posts.map((post) => client.getCommentCount(post))\n );\n\n if (options.json) {\n printJson(\n posts.map((post, i) => postToJson(post, i, commentCounts[i]))\n );\n } else {\n if (posts.length === 0) {\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(chalk.yellow(`No posts found in feed \"${normalizedFeed}\"${senderNote}`));\n return;\n }\n\n const senderNote = options.sender ? ` by ${options.sender}` : \"\";\n console.log(\n chalk.white(`Found ${posts.length} post(s) in feed \"${normalizedFeed}\"${senderNote}:\\n`)\n );\n posts.forEach((post, i) => {\n console.log(formatPost(post, i, { commentCount: commentCounts[i] }));\n if (i < posts.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to read feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed read subcommand\n */\nexport function registerFeedReadCommand(parent: Command): void {\n parent\n .command(\"read <feed>\")\n .description(\"Read posts from a feed\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--sender <address>\", \"Filter posts by sender address\")\n .option(\"--unseen\", \"Only show posts not yet seen (newer than last --mark-seen)\")\n .option(\"--mark-seen\", \"Mark the feed as seen up to the latest post\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, options) => {\n await executeFeedRead(feed, options);\n });\n}\n","import { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport type { WriteTransactionConfig } from \"@net-protocol/core\";\n\n/**\n * Create a wallet client from a private key\n */\nexport function createWallet(\n privateKey: `0x${string}`,\n chainId: number,\n rpcUrl?: string\n) {\n const account = privateKeyToAccount(privateKey);\n const rpcUrls = getChainRpcUrls({\n chainId,\n rpcUrl: rpcUrl,\n });\n\n return createWalletClient({\n account,\n transport: http(rpcUrls[0]),\n });\n}\n\n/**\n * Execute a transaction using a wallet client\n */\nexport async function executeTransaction(\n walletClient: ReturnType<typeof createWallet>,\n txConfig: WriteTransactionConfig\n): Promise<`0x${string}`> {\n const hash = await walletClient.writeContract({\n address: txConfig.to,\n abi: txConfig.abi,\n functionName: txConfig.functionName,\n args: txConfig.args,\n value: txConfig.value,\n chain: null,\n } as Parameters<typeof walletClient.writeContract>[0]);\n\n return hash;\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface PostOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n data?: string;\n body?: string;\n}\n\nconst MAX_MESSAGE_LENGTH = 4000;\n\n/**\n * Execute the feed post command\n */\nasync function executeFeedPost(\n feed: string,\n message: string,\n options: PostOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Message cannot be empty\");\n }\n\n // If --body is provided, format as title + body\n // The message argument becomes the title, --body becomes the body\n const fullMessage = options.body\n ? `${message}\\n\\n${options.body}`\n : message;\n\n if (fullMessage.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Message too long (${fullMessage.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedClient(commonOptions);\n const txConfig = client.preparePostToFeed({\n topic: normalizedFeed,\n text: fullMessage,\n data: options.data,\n });\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Posting to feed \"${normalizedFeed}\"...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n const senderAddress = walletClient.account.address;\n\n // Try to fetch the post to get its actual post ID\n let postId: string | undefined;\n try {\n const posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 10,\n });\n // Find our post (most recent from our sender with matching text)\n const ourPost = posts.find(\n (p) =>\n p.sender.toLowerCase() === senderAddress.toLowerCase() &&\n p.text === fullMessage\n );\n if (ourPost) {\n postId = `${ourPost.sender}:${ourPost.timestamp}`;\n }\n } catch {\n // Non-fatal: we can still record history without the post ID\n }\n\n // Record in history with the actual post ID\n addHistoryEntry({\n type: \"post\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: normalizedFeed,\n sender: senderAddress,\n text: fullMessage,\n postId, // Now we have the actual post ID for checking comments later\n });\n\n const displayText = options.body\n ? `${message} (+ body)`\n : message;\n\n const postIdInfo = postId ? `\\n Post ID: ${postId}` : \"\";\n console.log(\n chalk.green(\n `Message posted successfully!\\n Transaction: ${hash}\\n Feed: ${normalizedFeed}${postIdInfo}\\n Text: ${displayText}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to post message: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed post subcommand\n */\nexport function registerFeedPostCommand(parent: Command): void {\n parent\n .command(\"post <feed> <message>\")\n .description(\"Post a message to a feed\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .option(\"--data <data>\", \"Optional data to attach to the post\")\n .option(\"--body <text>\", \"Post body (message becomes the title)\")\n .action(async (feed, message, options) => {\n await executeFeedPost(feed, message, options);\n });\n}\n","import type { NetMessage } from \"@net-protocol/feeds\";\n\n/**\n * Create a post ID from a message\n * Format: {sender}:{timestamp}\n */\nexport function createPostId(post: NetMessage): string {\n return `${post.sender}:${post.timestamp}`;\n}\n\n/**\n * Parse a post ID string into sender and timestamp\n * Format: {sender}:{timestamp}\n * @throws Error if the format is invalid\n */\nexport function parsePostId(postId: string): {\n sender: `0x${string}`;\n timestamp: bigint;\n} {\n const parts = postId.split(\":\");\n if (parts.length !== 2) {\n throw new Error(\n `Invalid post ID format. Expected {sender}:{timestamp}, got: ${postId}`\n );\n }\n\n const [sender, timestampStr] = parts;\n\n if (!sender.startsWith(\"0x\") || sender.length !== 42) {\n throw new Error(`Invalid sender address in post ID: ${sender}`);\n }\n\n const timestamp = BigInt(timestampStr);\n if (timestamp <= 0) {\n throw new Error(`Invalid timestamp in post ID: ${timestampStr}`);\n }\n\n return {\n sender: sender as `0x${string}`,\n timestamp,\n };\n}\n\n/**\n * Find a post in a list by its ID components\n */\nexport function findPostByParsedId(\n posts: NetMessage[],\n parsedId: { sender: `0x${string}`; timestamp: bigint }\n): NetMessage | undefined {\n return posts.find(\n (p) =>\n p.sender.toLowerCase() === parsedId.sender.toLowerCase() &&\n p.timestamp === parsedId.timestamp\n );\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parsePostId, findPostByParsedId } from \"../../shared/postId\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface CommentWriteOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\nconst MAX_MESSAGE_LENGTH = 4000;\n\n/**\n * Execute the feed comment-write command\n */\nasync function executeFeedCommentWrite(\n feed: string,\n postId: string,\n message: string,\n options: CommentWriteOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n\n if (message.length === 0) {\n exitWithError(\"Comment cannot be empty\");\n }\n\n if (message.length > MAX_MESSAGE_LENGTH) {\n exitWithError(\n `Comment too long (${message.length} chars). Maximum is ${MAX_MESSAGE_LENGTH} characters.`\n );\n }\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n // Determine options based on encode-only mode\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch the target post to get its full data (needed to generate comment topic hash)\n const posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 100, // Fetch enough to find the post\n });\n\n const targetPost = findPostByParsedId(posts, parsedId);\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n\n const txConfig = client.prepareComment({\n post: targetPost,\n text: message,\n });\n\n // For encode-only mode, just output the transaction data\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Commenting on post ${postId}...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n // Record in history\n addHistoryEntry({\n type: \"comment\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: normalizedFeed,\n sender: walletClient.account.address,\n text: message,\n postId: postId,\n });\n\n console.log(\n chalk.green(\n `Comment posted successfully!\\n Transaction: ${hash}\\n Post: ${postId}\\n Comment: ${message}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to post comment: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed comment-write subcommand\n */\nexport function registerFeedCommentWriteCommand(parent: Command): void {\n parent\n .command(\"comment <feed> <post-id> <message>\")\n .description(\n \"Comment on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (feed, postId, message, options) => {\n await executeFeedCommentWrite(feed, postId, message, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { parsePostId, findPostByParsedId } from \"../../shared/postId\";\nimport { formatComment, commentToJson, printJson } from \"./format\";\nimport { normalizeFeedName } from \"./types\";\n\ninterface CommentReadOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed comment-read command\n */\nasync function executeFeedCommentRead(\n feed: string,\n postId: string,\n options: CommentReadOptions\n): Promise<void> {\n const normalizedFeed = normalizeFeedName(feed);\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n // Parse post ID\n let parsedId: { sender: `0x${string}`; timestamp: bigint };\n try {\n parsedId = parsePostId(postId);\n } catch (error) {\n exitWithError(\n error instanceof Error ? error.message : \"Invalid post ID format\"\n );\n }\n\n try {\n // First check if the feed has any posts\n const count = await client.getFeedPostCount(normalizedFeed);\n\n if (count === 0) {\n exitWithError(\n `Feed \"${normalizedFeed}\" has no posts. Cannot find post ${postId}.`\n );\n }\n\n // Fetch posts to find the target post\n const posts = await client.getFeedPosts({\n topic: normalizedFeed,\n maxPosts: 100, // Fetch enough to find the post\n });\n\n const targetPost = findPostByParsedId(posts, parsedId);\n if (!targetPost) {\n exitWithError(\n `Post not found with ID ${postId} in feed \"${normalizedFeed}\". Make sure the sender and timestamp are correct.`\n );\n }\n\n // Check comment count first\n const commentCount = await client.getCommentCount(targetPost);\n\n if (commentCount === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n }\n return;\n }\n\n // Fetch comments for the post\n const comments = await client.getComments({\n post: targetPost,\n maxComments: options.limit ?? 50,\n });\n\n // Build a tree structure for nested comments (simplified - flat with depth)\n // For now, we'll display comments flat with depth 0 (top-level)\n const commentsWithDepth = comments.map((comment) => ({\n comment,\n depth: 0,\n }));\n\n if (options.json) {\n printJson(\n commentsWithDepth.map(({ comment, depth }) =>\n commentToJson(comment, depth)\n )\n );\n } else {\n if (comments.length === 0) {\n console.log(chalk.yellow(`No comments found for post ${postId}`));\n return;\n }\n\n console.log(\n chalk.white(`Found ${comments.length} comment(s) for post ${postId}:\\n`)\n );\n commentsWithDepth.forEach(({ comment, depth }, i) => {\n console.log(formatComment(comment, depth));\n if (i < commentsWithDepth.length - 1) {\n console.log(); // Empty line between comments\n }\n });\n }\n } catch (error) {\n if ((error as Error).message?.includes(\"Post not found\")) {\n throw error;\n }\n exitWithError(\n `Failed to fetch comments: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed comments subcommand\n */\nexport function registerFeedCommentReadCommand(parent: Command): void {\n parent\n .command(\"comments <feed> <post-id>\")\n .description(\n \"Read comments on a post. Post ID format: {sender}:{timestamp}\"\n )\n .option(\n \"--limit <n>\",\n \"Maximum number of comments to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (feed, postId, options) => {\n await executeFeedCommentRead(feed, postId, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault, parseCommonOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedRegistryClient } from \"../../shared/client\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { addHistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\n\ninterface RegisterOptions {\n chainId?: number;\n rpcUrl?: string;\n privateKey?: string;\n encodeOnly?: boolean;\n}\n\n/**\n * Execute the feed register command\n */\nasync function executeFeedRegister(\n feedName: string,\n options: RegisterOptions\n): Promise<void> {\n // Validate feed name length\n if (feedName.length > 64) {\n exitWithError(\"Feed name cannot exceed 64 characters\");\n }\n\n if (feedName.length === 0) {\n exitWithError(\"Feed name cannot be empty\");\n }\n\n // For encode-only mode, we don't need a private key\n if (options.encodeOnly) {\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedRegistryClient(readOnlyOptions);\n const txConfig = client.prepareRegisterFeed({ feedName });\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n\n printJson(encoded);\n return;\n }\n\n // For actual execution, we need a private key\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true // supports --encode-only\n );\n\n const client = createFeedRegistryClient(commonOptions);\n\n // Check if feed is already registered\n const isRegistered = await client.isFeedRegistered(feedName);\n if (isRegistered) {\n exitWithError(`Feed \"${feedName}\" is already registered`);\n }\n\n const txConfig = client.prepareRegisterFeed({ feedName });\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(chalk.blue(`Registering feed \"${feedName}\"...`));\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n // Record in history\n addHistoryEntry({\n type: \"register\",\n txHash: hash,\n chainId: commonOptions.chainId,\n feed: feedName,\n sender: walletClient.account.address,\n });\n\n console.log(\n chalk.green(\n `Feed registered successfully!\\n Transaction: ${hash}\\n Feed: ${feedName}`\n )\n );\n } catch (error) {\n exitWithError(\n `Failed to register feed: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed register subcommand\n */\nexport function registerFeedRegisterCommand(parent: Command): void {\n parent\n .command(\"register <feed-name>\")\n .description(\"Register a new feed\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--private-key <key>\", \"Private key (0x-prefixed)\")\n .option(\n \"--encode-only\",\n \"Output transaction data as JSON instead of executing\"\n )\n .action(async (feedName, options) => {\n await executeFeedRegister(feedName, options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createFeedClient } from \"../../shared/client\";\nimport { getHistoryByType, type HistoryEntry } from \"../../shared/state\";\nimport { printJson } from \"./format\";\nimport { formatTimestamp } from \"./format\";\n\ninterface RepliesOptions {\n chainId?: number;\n rpcUrl?: string;\n limit?: number;\n json?: boolean;\n}\n\ninterface PostWithReplies {\n feed: string;\n postId: string;\n text: string;\n postedAt: number;\n commentCount: number;\n}\n\n/**\n * Truncate text for display\n */\nfunction truncateText(text: string, maxLen: number): string {\n if (text.length <= maxLen) return text;\n return text.slice(0, maxLen) + \"...\";\n}\n\n/**\n * Execute the feed replies command\n */\nasync function executeFeedReplies(options: RepliesOptions): Promise<void> {\n // Get recent posts from history that have post IDs\n const postHistory = getHistoryByType(\"post\", options.limit ?? 10);\n const postsWithIds = postHistory.filter(\n (entry): entry is HistoryEntry & { postId: string } => !!entry.postId\n );\n\n if (postsWithIds.length === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.gray(\"No posts with trackable IDs found in history.\"));\n console.log(\n chalk.gray(\"Post IDs are captured when you post with a wallet.\")\n );\n }\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createFeedClient(readOnlyOptions);\n\n console.log(chalk.blue(`Checking replies on ${postsWithIds.length} posts...\\n`));\n\n const results: PostWithReplies[] = [];\n\n for (const entry of postsWithIds) {\n try {\n // Parse post ID to get sender and timestamp\n const [sender, timestampStr] = entry.postId.split(\":\");\n const timestamp = BigInt(timestampStr);\n\n // Get comment count for this post\n // Construct a minimal post object for the comment count query\n const postObj = {\n sender: sender as `0x${string}`,\n timestamp,\n text: entry.text ?? \"\",\n topic: entry.feed,\n app: \"\" as `0x${string}`,\n data: \"0x\" as `0x${string}`,\n };\n const commentCount = await client.getCommentCount(postObj);\n\n results.push({\n feed: entry.feed,\n postId: entry.postId,\n text: entry.text ?? \"\",\n postedAt: entry.timestamp,\n commentCount: Number(commentCount),\n });\n } catch {\n // Skip posts we can't check (e.g., if feed no longer exists)\n }\n }\n\n if (options.json) {\n printJson(results);\n return;\n }\n\n // Display results\n const postsWithReplies = results.filter((r) => r.commentCount > 0);\n const totalReplies = results.reduce((sum, r) => sum + r.commentCount, 0);\n\n console.log(\n chalk.cyan(\n `Found ${totalReplies} total replies across ${postsWithReplies.length} posts\\n`\n )\n );\n\n if (results.length === 0) {\n console.log(chalk.gray(\"Could not check any posts.\"));\n return;\n }\n\n // Sort by comment count (most replies first)\n results.sort((a, b) => b.commentCount - a.commentCount);\n\n for (const post of results) {\n const timeAgo = formatTimestamp(post.postedAt);\n const replyText =\n post.commentCount === 0\n ? chalk.gray(\"no replies\")\n : post.commentCount === 1\n ? chalk.green(\"1 reply\")\n : chalk.green(`${post.commentCount} replies`);\n\n console.log(\n `${chalk.white(post.feed)} ${chalk.gray(\"•\")} ${replyText} ${chalk.gray(`• ${timeAgo}`)}`\n );\n console.log(` ${chalk.gray(truncateText(post.text, 60))}`);\n\n if (post.commentCount > 0) {\n console.log(\n chalk.blue(` → netp feed comments ${post.feed} ${post.postId}`)\n );\n }\n console.log(\"\");\n }\n}\n\n/**\n * Register the feed replies subcommand\n */\nexport function registerFeedRepliesCommand(parent: Command): void {\n parent\n .command(\"replies\")\n .description(\"Check for replies on your recent posts\")\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--limit <n>\", \"Number of recent posts to check (default: 10)\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--json\", \"Output as JSON\")\n .action(async (options) => {\n await executeFeedReplies(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { NULL_ADDRESS } from \"@net-protocol/core\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { createNetClient } from \"../../shared/client\";\nimport { exitWithError } from \"../../shared/output\";\nimport { formatPost, postToJson, printJson } from \"./format\";\n\ninterface PostsOptions {\n limit?: number;\n chainId?: number;\n rpcUrl?: string;\n json?: boolean;\n}\n\n/**\n * Execute the feed posts command\n */\nasync function executeFeedPosts(\n address: string,\n options: PostsOptions\n): Promise<void> {\n // Validate address format\n if (!address.startsWith(\"0x\") || address.length !== 42) {\n exitWithError(\"Invalid address format. Must be 0x-prefixed, 42 characters\");\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = createNetClient(readOnlyOptions);\n const limit = options.limit ?? 20;\n\n try {\n // Get message count for this user from feeds (app = NULL_ADDRESS)\n const count = await client.getMessageCount({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n });\n\n if (count === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.yellow(`No posts found for address ${address}`));\n }\n return;\n }\n\n // Calculate range for fetching\n const startIndex = count > limit ? count - limit : 0;\n\n const messages = await client.getMessages({\n filter: {\n appAddress: NULL_ADDRESS as `0x${string}`,\n maker: address as `0x${string}`,\n },\n startIndex,\n endIndex: count,\n });\n\n if (options.json) {\n printJson(messages.map((msg, i) => postToJson(msg, i)));\n } else {\n console.log(\n chalk.white(`Found ${messages.length} post(s) by ${address}:\\n`)\n );\n messages.forEach((msg, i) => {\n console.log(formatPost(msg, i, { showTopic: true }));\n if (i < messages.length - 1) {\n console.log(); // Empty line between posts\n }\n });\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch posts: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\n/**\n * Register the feed posts subcommand\n */\nexport function registerFeedPostsCommand(parent: Command): void {\n parent\n .command(\"posts <address>\")\n .description(\"View posts by an address\")\n .option(\n \"--limit <n>\",\n \"Maximum number of posts to display\",\n (value) => parseInt(value, 10)\n )\n .option(\n \"--chain-id <id>\",\n \"Chain ID (default: 8453 for Base)\",\n (value) => parseInt(value, 10)\n )\n .option(\"--rpc-url <url>\", \"Custom RPC URL\")\n .option(\"--json\", \"Output in JSON format\")\n .action(async (address, options) => {\n await executeFeedPosts(address, options);\n });\n}\n","import * as readline from \"readline\";\n\n/**\n * Prompt user for confirmation\n */\nexport async function confirm(message: string): Promise<boolean> {\n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n return new Promise((resolve) => {\n rl.question(`${message} (y/N): `, (answer) => {\n rl.close();\n resolve(answer.toLowerCase() === \"y\" || answer.toLowerCase() === \"yes\");\n });\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n getMyAddress,\n setMyAddress,\n clearMyAddress,\n getFullState,\n resetState,\n getStateFilePath,\n getHistoryCount,\n getContacts,\n getActiveFeeds,\n} from \"../../shared/state\";\nimport { formatTimestamp } from \"./format\";\nimport { confirm } from \"./confirm\";\n\ninterface ConfigOptions {\n myAddress?: string;\n clearAddress?: boolean;\n show?: boolean;\n reset?: boolean;\n force?: boolean;\n}\n\n/**\n * Execute the feed config command\n */\nasync function executeFeedConfig(options: ConfigOptions): Promise<void> {\n // Handle --reset\n if (options.reset) {\n const statePath = getStateFilePath();\n console.log(chalk.yellow(`This will delete all stored state at:`));\n console.log(chalk.white(` ${statePath}`));\n console.log(chalk.yellow(`\\nThis includes:`));\n console.log(chalk.white(` - All \"last seen\" timestamps for feeds`));\n console.log(chalk.white(` - Your configured address`));\n console.log(chalk.white(` - Your activity history`));\n\n if (!options.force) {\n const confirmed = await confirm(chalk.red(\"\\nAre you sure you want to reset?\"));\n if (!confirmed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n resetState();\n console.log(chalk.green(\"State reset successfully.\"));\n return;\n }\n\n // Handle --my-address\n if (options.myAddress) {\n // Basic validation\n if (!options.myAddress.match(/^0x[a-fA-F0-9]{40}$/)) {\n console.error(chalk.red(\"Invalid address format. Expected 0x followed by 40 hex characters.\"));\n process.exit(1);\n }\n setMyAddress(options.myAddress);\n console.log(chalk.green(`Set my address to: ${options.myAddress}`));\n return;\n }\n\n // Handle --clear-address\n if (options.clearAddress) {\n clearMyAddress();\n console.log(chalk.green(\"Cleared my address.\"));\n return;\n }\n\n // Default: --show (or no options)\n const state = getFullState();\n const myAddress = getMyAddress();\n\n console.log(chalk.cyan(\"Feed Configuration\\n\"));\n console.log(chalk.white(`State file: ${getStateFilePath()}`));\n console.log(chalk.white(`My address: ${myAddress ?? chalk.gray(\"(not set)\")}`));\n\n const feedCount = Object.keys(state.feeds).length;\n console.log(chalk.white(`Tracked feeds: ${feedCount}`));\n\n const historyCount = getHistoryCount();\n console.log(chalk.white(`History entries: ${historyCount}`));\n\n if (feedCount > 0 && feedCount <= 20) {\n console.log(chalk.gray(\"\\nLast seen timestamps:\"));\n for (const [feed, data] of Object.entries(state.feeds)) {\n const date = new Date(data.lastSeenTimestamp * 1000);\n console.log(chalk.gray(` ${feed}: ${date.toLocaleString()}`));\n }\n } else if (feedCount > 20) {\n console.log(chalk.gray(`\\n(${feedCount} feeds tracked, use --json for full list)`));\n }\n\n // Show active feeds (topics the agent has participated in)\n const activeFeeds = getActiveFeeds();\n if (activeFeeds.length > 0) {\n console.log(chalk.cyan(\"\\nActive Feeds:\"));\n const displayFeeds = activeFeeds.slice(0, 10);\n for (const feed of displayFeeds) {\n const activity = [];\n if (feed.postCount > 0) activity.push(`${feed.postCount} post${feed.postCount !== 1 ? \"s\" : \"\"}`);\n if (feed.commentCount > 0) activity.push(`${feed.commentCount} comment${feed.commentCount !== 1 ? \"s\" : \"\"}`);\n const lastActive = formatTimestamp(feed.lastActivity);\n console.log(chalk.white(` ${feed.feed}`) + chalk.gray(` • ${activity.join(\", \")} • ${lastActive}`));\n }\n if (activeFeeds.length > 10) {\n console.log(chalk.gray(` ... and ${activeFeeds.length - 10} more`));\n }\n }\n\n // Show contacts (wallet addresses the agent has DM'd)\n const contacts = getContacts();\n if (contacts.length > 0) {\n console.log(chalk.cyan(\"\\nRecent Contacts (DMs):\"));\n const displayContacts = contacts.slice(0, 10);\n for (const contact of displayContacts) {\n const truncAddr = `${contact.address.slice(0, 6)}...${contact.address.slice(-4)}`;\n const msgCount = contact.interactionCount;\n const lastActive = formatTimestamp(contact.lastInteraction);\n console.log(\n chalk.white(` ${truncAddr}`) +\n chalk.gray(` • ${msgCount} message${msgCount !== 1 ? \"s\" : \"\"} • ${lastActive}`)\n );\n }\n if (contacts.length > 10) {\n console.log(chalk.gray(` ... and ${contacts.length - 10} more`));\n }\n }\n}\n\n/**\n * Register the feed config subcommand\n */\nexport function registerFeedConfigCommand(parent: Command): void {\n parent\n .command(\"config\")\n .description(\"View or modify feed configuration\")\n .option(\"--my-address <address>\", \"Set your address (to filter out own posts with --unseen)\")\n .option(\"--clear-address\", \"Clear your configured address\")\n .option(\"--show\", \"Show current configuration (default)\")\n .option(\"--reset\", \"Reset all state (clears last-seen timestamps and address)\")\n .option(\"--force\", \"Skip confirmation prompt for --reset\")\n .action(async (options) => {\n await executeFeedConfig(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport {\n getHistory,\n getHistoryByType,\n clearHistory,\n getHistoryCount,\n type HistoryEntry,\n type HistoryEntryType,\n} from \"../../shared/state\";\nimport { formatTimestamp, printJson, truncateAddress } from \"./format\";\nimport { confirm } from \"./confirm\";\n\ninterface HistoryOptions {\n limit?: number;\n type?: string;\n json?: boolean;\n clear?: boolean;\n force?: boolean;\n}\n\n/**\n * Format a history entry for human-readable output\n */\nfunction formatHistoryEntry(entry: HistoryEntry, index: number): string {\n const timestamp = formatTimestamp(entry.timestamp);\n const typeColor =\n entry.type === \"post\"\n ? chalk.green\n : entry.type === \"comment\"\n ? chalk.blue\n : chalk.yellow;\n\n const lines = [\n chalk.cyan(`[${index}]`) +\n ` ${chalk.gray(timestamp)} ` +\n typeColor(entry.type.toUpperCase()),\n ` ${chalk.white(\"Feed:\")} ${entry.feed}`,\n ` ${chalk.white(\"Tx:\")} ${entry.txHash}`,\n ];\n\n if (entry.sender) {\n lines.push(` ${chalk.white(\"Sender:\")} ${truncateAddress(entry.sender)}`);\n }\n\n if (entry.text) {\n const truncatedText =\n entry.text.length > 80 ? entry.text.slice(0, 80) + \"...\" : entry.text;\n lines.push(` ${chalk.white(\"Text:\")} ${truncatedText}`);\n }\n\n // Show postId context based on entry type\n if (entry.type === \"post\" && entry.postId) {\n lines.push(` ${chalk.white(\"Post ID:\")} ${entry.postId}`);\n } else if (entry.type === \"comment\" && entry.postId) {\n lines.push(` ${chalk.white(\"Reply to:\")} ${entry.postId}`);\n }\n\n // Show follow-up hint\n if (entry.type === \"post\" && entry.postId) {\n lines.push(\n chalk.gray(` → Check replies: netp feed comments ${entry.feed} ${entry.postId}`)\n );\n } else if (entry.type === \"post\" && entry.sender) {\n lines.push(\n chalk.gray(` → Find post: netp feed read ${entry.feed} --sender ${entry.sender} --json`)\n );\n } else if (entry.type === \"comment\" && entry.postId) {\n lines.push(\n chalk.gray(` → See thread: netp feed comments ${entry.feed} ${entry.postId}`)\n );\n }\n\n return lines.join(\"\\n\");\n}\n\n/**\n * Convert a history entry to JSON format\n */\nfunction historyEntryToJson(\n entry: HistoryEntry,\n index: number\n): Record<string, unknown> {\n const result: Record<string, unknown> = {\n index,\n type: entry.type,\n timestamp: entry.timestamp,\n txHash: entry.txHash,\n chainId: entry.chainId,\n feed: entry.feed,\n };\n\n if (entry.sender) {\n result.sender = entry.sender;\n }\n\n if (entry.text) {\n result.text = entry.text;\n }\n\n if (entry.postId) {\n result.postId = entry.postId;\n }\n\n return result;\n}\n\n/**\n * Validate history type option\n */\nfunction validateType(type: string): HistoryEntryType {\n const validTypes = [\"post\", \"comment\", \"register\"];\n if (!validTypes.includes(type)) {\n console.error(\n chalk.red(\n `Invalid type \"${type}\". Must be one of: ${validTypes.join(\", \")}`\n )\n );\n process.exit(1);\n }\n return type as HistoryEntryType;\n}\n\n/**\n * Execute the feed history command\n */\nasync function executeFeedHistory(options: HistoryOptions): Promise<void> {\n // Handle --clear\n if (options.clear) {\n const count = getHistoryCount();\n if (count === 0) {\n console.log(chalk.gray(\"History is already empty.\"));\n return;\n }\n\n console.log(chalk.yellow(`This will delete ${count} history entries.`));\n\n if (!options.force) {\n const confirmed = await confirm(\n chalk.red(\"\\nAre you sure you want to clear history?\")\n );\n if (!confirmed) {\n console.log(chalk.gray(\"Cancelled.\"));\n return;\n }\n }\n\n clearHistory();\n console.log(chalk.green(\"History cleared.\"));\n return;\n }\n\n // Get history entries\n let entries: HistoryEntry[];\n if (options.type) {\n const validType = validateType(options.type);\n entries = getHistoryByType(validType, options.limit);\n } else {\n entries = getHistory(options.limit);\n }\n\n if (entries.length === 0) {\n if (options.json) {\n printJson([]);\n } else {\n console.log(chalk.gray(\"No history entries found.\"));\n console.log(\n chalk.gray(\n \"History is recorded when you post, comment, or register feeds.\"\n )\n );\n }\n return;\n }\n\n // Output\n if (options.json) {\n const jsonEntries = entries.map((entry, idx) =>\n historyEntryToJson(entry, idx)\n );\n printJson(jsonEntries);\n } else {\n const totalCount = getHistoryCount();\n const typeFilter = options.type ? ` (type: ${options.type})` : \"\";\n console.log(\n chalk.cyan(`Feed History${typeFilter} (${entries.length} of ${totalCount})\\n`)\n );\n\n for (let i = 0; i < entries.length; i++) {\n console.log(formatHistoryEntry(entries[i], i));\n if (i < entries.length - 1) {\n console.log(\"\");\n }\n }\n }\n}\n\n/**\n * Register the feed history subcommand\n */\nexport function registerFeedHistoryCommand(parent: Command): void {\n parent\n .command(\"history\")\n .description(\"View feed activity history (posts, comments, registrations)\")\n .option(\"--limit <n>\", \"Limit number of entries\", (value) =>\n parseInt(value, 10)\n )\n .option(\"--type <type>\", \"Filter by type: post, comment, or register\")\n .option(\"--json\", \"Output as JSON\")\n .option(\"--clear\", \"Clear all history\")\n .option(\"--force\", \"Skip confirmation prompt for --clear\")\n .action(async (options) => {\n await executeFeedHistory(options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerFeedListCommand } from \"./list\";\nimport { registerFeedReadCommand } from \"./read\";\nimport { registerFeedPostCommand } from \"./post\";\nimport { registerFeedCommentWriteCommand } from \"./comment-write\";\nimport { registerFeedCommentReadCommand } from \"./comment-read\";\nimport { registerFeedRegisterCommand } from \"./register\";\nimport { registerFeedRepliesCommand } from \"./replies\";\nimport { registerFeedPostsCommand } from \"./posts\";\nimport { registerFeedConfigCommand } from \"./config\";\nimport { registerFeedHistoryCommand } from \"./history\";\n\n/**\n * Register the feed command group with the commander program\n */\nexport function registerFeedCommand(program: Command): void {\n const feedCommand = program\n .command(\"feed\")\n .description(\"Feed operations (read/write posts, comments, manage feeds)\");\n\n registerFeedListCommand(feedCommand);\n registerFeedReadCommand(feedCommand);\n registerFeedPostCommand(feedCommand);\n registerFeedCommentWriteCommand(feedCommand);\n registerFeedCommentReadCommand(feedCommand);\n registerFeedRegisterCommand(feedCommand);\n registerFeedRepliesCommand(feedCommand);\n registerFeedPostsCommand(feedCommand);\n registerFeedConfigCommand(feedCommand);\n registerFeedHistoryCommand(feedCommand);\n}\n\n// Re-export individual command registrations for botchan wrapper\nexport { registerFeedListCommand } from \"./list\";\nexport { registerFeedReadCommand } from \"./read\";\nexport { registerFeedPostCommand } from \"./post\";\nexport { registerFeedCommentWriteCommand } from \"./comment-write\";\nexport { registerFeedCommentReadCommand } from \"./comment-read\";\nexport { registerFeedRegisterCommand } from \"./register\";\nexport { registerFeedRepliesCommand } from \"./replies\";\nexport { registerFeedPostsCommand } from \"./posts\";\nexport { registerFeedConfigCommand } from \"./config\";\nexport { registerFeedHistoryCommand } from \"./history\";\n","#!/usr/bin/env node\n\n// Configure proxy support before any network requests\nimport { ProxyAgent, setGlobalDispatcher } from \"undici\";\n\nconst proxyUrl = process.env.https_proxy || process.env.HTTPS_PROXY;\nif (proxyUrl) {\n const agent = new ProxyAgent(proxyUrl);\n setGlobalDispatcher(agent);\n}\n\nimport \"dotenv/config\";\nimport { Command } from \"commander\";\nimport { createRequire } from \"module\";\nimport { registerStorageCommand } from \"../commands/storage\";\nimport { registerMessageCommand } from \"../commands/message\";\nimport { registerChainsCommand } from \"../commands/chains\";\nimport { registerInfoCommand } from \"../commands/info\";\nimport { registerTokenCommand } from \"../commands/token\";\nimport { registerProfileCommand } from \"../commands/profile\";\nimport { registerBazaarCommand } from \"../commands/bazaar\";\nimport { registerFeedCommand } from \"../commands/feed\";\n\nconst require = createRequire(import.meta.url);\nconst { version } = require(\"../../package.json\");\n\nconst program = new Command();\n\nprogram\n .name(\"netp\")\n .description(\"CLI tool for Net Protocol\")\n .version(version);\n\n// Register commands\nregisterStorageCommand(program);\nregisterMessageCommand(program);\nregisterChainsCommand(program);\nregisterInfoCommand(program);\nregisterTokenCommand(program);\nregisterProfileCommand(program);\nregisterBazaarCommand(program);\nregisterFeedCommand(program);\n\nprogram.parse();\n"]}