@net-protocol/cli 0.1.12 → 0.1.14

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/cli/shared.ts","../../src/shared/output.ts","../../src/commands/profile/get.ts","../../src/shared/encode.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"],"names":["chalk","PROFILE_METADATA_STORAGE_KEY","parseProfileMetadata","STORAGE_CONTRACT","privateKeyToAccount","getChainRpcUrls","createWalletClient","base","http","publicActions","StorageClient","getProfileMetadataStorageArgs","PROFILE_CANVAS_STORAGE_KEY","path2","fs2"],"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 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 {\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 { 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 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"]}
package/package.json CHANGED
@@ -1,11 +1,16 @@
1
1
  {
2
2
  "name": "@net-protocol/cli",
3
- "version": "0.1.12",
3
+ "version": "0.1.14",
4
4
  "description": "CLI tool for Net Protocol",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "netp": "./dist/cli/index.mjs"
8
8
  },
9
+ "exports": {
10
+ ".": "./dist/cli/index.mjs",
11
+ "./feed": "./dist/feed/index.mjs",
12
+ "./profile": "./dist/profile/index.mjs"
13
+ },
9
14
  "files": [
10
15
  "dist",
11
16
  "README.md"
@@ -28,8 +33,9 @@
28
33
  "dependencies": {
29
34
  "@net-protocol/bazaar": "^0.1.12",
30
35
  "@net-protocol/core": "^0.1.8",
36
+ "@net-protocol/feeds": "^0.1.12",
31
37
  "@net-protocol/netr": "^0.1.3",
32
- "@net-protocol/profiles": "^0.1.3",
38
+ "@net-protocol/profiles": "^0.1.4",
33
39
  "@net-protocol/relay": "^0.1.3",
34
40
  "@net-protocol/storage": "^0.1.11",
35
41
  "@x402/evm": "^2.1.0",