@net-protocol/cli 0.1.34 → 0.1.36
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chat/index.d.ts +18 -0
- package/dist/chat/index.mjs +293 -0
- package/dist/chat/index.mjs.map +1 -0
- package/dist/cli/index.mjs +166 -3
- package/dist/cli/index.mjs.map +1 -1
- package/dist/feed/index.mjs +1 -0
- package/dist/feed/index.mjs.map +1 -1
- package/dist/upvote/index.d.ts +5 -1
- package/dist/upvote/index.mjs +166 -4
- package/dist/upvote/index.mjs.map +1 -1
- package/package.json +6 -1
package/dist/upvote/index.d.ts
CHANGED
|
@@ -4,6 +4,10 @@ declare function registerUpvoteTokenCommand(parent: Command, commandName?: strin
|
|
|
4
4
|
|
|
5
5
|
declare function registerGetUpvotesCommand(parent: Command, commandName?: string): void;
|
|
6
6
|
|
|
7
|
+
declare function registerUpvoteUserCommand(parent: Command, commandName?: string): void;
|
|
8
|
+
|
|
9
|
+
declare function registerGetUserUpvotesCommand(parent: Command, commandName?: string): void;
|
|
10
|
+
|
|
7
11
|
declare function registerUpvoteCommand(program: Command): void;
|
|
8
12
|
|
|
9
|
-
export { registerGetUpvotesCommand, registerUpvoteCommand, registerUpvoteTokenCommand };
|
|
13
|
+
export { registerGetUpvotesCommand, registerGetUserUpvotesCommand, registerUpvoteCommand, registerUpvoteTokenCommand, registerUpvoteUserCommand };
|
package/dist/upvote/index.mjs
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import chalk3 from 'chalk';
|
|
2
|
-
import { createPublicClient, http, parseEther, encodeFunctionData, concat, createWalletClient } from 'viem';
|
|
2
|
+
import { createPublicClient, http, parseEther, formatEther, encodeFunctionData, concat, createWalletClient } from 'viem';
|
|
3
3
|
import { privateKeyToAccount } from 'viem/accounts';
|
|
4
4
|
import { getChainRpcUrls, getBaseDataSuffix } from '@net-protocol/core';
|
|
5
|
-
import { discoverTokenPool, PURE_ALPHA_STRATEGY, UNIV234_POOLS_STRATEGY, encodePoolKey, DYNAMIC_SPLIT_STRATEGY, getTokenScoreKey, UPVOTE_PRICE_ETH, UPVOTE_APP, ScoreClient, ALL_STRATEGY_ADDRESSES } from '@net-protocol/score';
|
|
5
|
+
import { discoverTokenPool, PURE_ALPHA_STRATEGY, UNIV234_POOLS_STRATEGY, encodePoolKey, DYNAMIC_SPLIT_STRATEGY, getTokenScoreKey, UPVOTE_PRICE_ETH, UPVOTE_APP, ScoreClient, ALL_STRATEGY_ADDRESSES, NULL_ADDRESS, UserUpvoteClient, calculateUpvoteCost, USER_UPVOTE_CONTRACT } from '@net-protocol/score';
|
|
6
6
|
|
|
7
7
|
// src/commands/upvote/upvote-token.ts
|
|
8
8
|
var DEFAULT_CHAIN_ID = 8453;
|
|
@@ -313,14 +313,176 @@ function registerGetUpvotesCommand(parent, commandName = "info") {
|
|
|
313
313
|
await executeGetUpvotes(options);
|
|
314
314
|
});
|
|
315
315
|
}
|
|
316
|
+
async function executeUpvoteUser(options) {
|
|
317
|
+
const count = parseInt(options.count, 10);
|
|
318
|
+
if (isNaN(count) || count <= 0) {
|
|
319
|
+
exitWithError("Count must be a positive integer");
|
|
320
|
+
return;
|
|
321
|
+
}
|
|
322
|
+
const userAddress = options.address;
|
|
323
|
+
if (!userAddress.startsWith("0x") || userAddress.length !== 42) {
|
|
324
|
+
exitWithError(
|
|
325
|
+
"Invalid address format (must be 0x-prefixed, 42 characters)"
|
|
326
|
+
);
|
|
327
|
+
return;
|
|
328
|
+
}
|
|
329
|
+
const token = options.token ?? NULL_ADDRESS;
|
|
330
|
+
const feeTier = options.feeTier ? parseInt(options.feeTier, 10) : 0;
|
|
331
|
+
const readOnlyOptions = parseReadOnlyOptionsWithDefault({
|
|
332
|
+
chainId: options.chainId,
|
|
333
|
+
rpcUrl: options.rpcUrl
|
|
334
|
+
});
|
|
335
|
+
const client = new UserUpvoteClient({
|
|
336
|
+
chainId: readOnlyOptions.chainId,
|
|
337
|
+
overrides: readOnlyOptions.rpcUrl ? { rpcUrls: [readOnlyOptions.rpcUrl] } : void 0
|
|
338
|
+
});
|
|
339
|
+
let upvotePrice;
|
|
340
|
+
try {
|
|
341
|
+
upvotePrice = await client.getUpvotePrice();
|
|
342
|
+
} catch (error) {
|
|
343
|
+
exitWithError(
|
|
344
|
+
`Failed to fetch upvote price: ${error instanceof Error ? error.message : String(error)}`
|
|
345
|
+
);
|
|
346
|
+
return;
|
|
347
|
+
}
|
|
348
|
+
const totalCost = calculateUpvoteCost(count, upvotePrice);
|
|
349
|
+
if (options.encodeOnly) {
|
|
350
|
+
const txConfig = {
|
|
351
|
+
to: USER_UPVOTE_CONTRACT.address,
|
|
352
|
+
abi: USER_UPVOTE_CONTRACT.abi,
|
|
353
|
+
functionName: "upvoteUser",
|
|
354
|
+
args: [userAddress, token, BigInt(count), BigInt(feeTier)],
|
|
355
|
+
value: totalCost
|
|
356
|
+
};
|
|
357
|
+
const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);
|
|
358
|
+
console.log(JSON.stringify(encoded, null, 2));
|
|
359
|
+
return;
|
|
360
|
+
}
|
|
361
|
+
const commonOptions = parseCommonOptionsWithDefault(
|
|
362
|
+
{
|
|
363
|
+
privateKey: options.privateKey,
|
|
364
|
+
chainId: options.chainId,
|
|
365
|
+
rpcUrl: options.rpcUrl
|
|
366
|
+
},
|
|
367
|
+
true
|
|
368
|
+
);
|
|
369
|
+
const walletClient = createWallet(
|
|
370
|
+
commonOptions.privateKey,
|
|
371
|
+
commonOptions.chainId,
|
|
372
|
+
commonOptions.rpcUrl
|
|
373
|
+
);
|
|
374
|
+
console.log(
|
|
375
|
+
chalk3.blue(`Submitting ${count} profile upvote(s) for ${userAddress}...`)
|
|
376
|
+
);
|
|
377
|
+
try {
|
|
378
|
+
const hash = await client.upvoteUser({
|
|
379
|
+
walletClient,
|
|
380
|
+
userToUpvote: userAddress,
|
|
381
|
+
token,
|
|
382
|
+
numUpvotes: count,
|
|
383
|
+
feeTier,
|
|
384
|
+
value: totalCost
|
|
385
|
+
});
|
|
386
|
+
console.log(chalk3.green("Profile upvote submitted successfully!"));
|
|
387
|
+
console.log(chalk3.white(` Transaction: ${hash}`));
|
|
388
|
+
console.log(chalk3.white(` User: ${userAddress}`));
|
|
389
|
+
console.log(chalk3.white(` Count: ${count}`));
|
|
390
|
+
console.log(chalk3.white(` Value: ${formatEther(totalCost)} ETH`));
|
|
391
|
+
if (token !== NULL_ADDRESS) {
|
|
392
|
+
console.log(chalk3.white(` Token: ${token}`));
|
|
393
|
+
}
|
|
394
|
+
} catch (error) {
|
|
395
|
+
exitWithError(
|
|
396
|
+
`Failed to submit profile upvote: ${error instanceof Error ? error.message : String(error)}`
|
|
397
|
+
);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
function registerUpvoteUserCommand(parent, commandName = "user") {
|
|
401
|
+
parent.command(commandName).description("Upvote a user's profile on Net Protocol").requiredOption("--address <address>", "User address to upvote").requiredOption("--count <n>", "Number of upvotes").option("--token <address>", "Token address (default: null address)").option("--fee-tier <tier>", "Fee tier (default: 0)").option(
|
|
402
|
+
"--chain-id <id>",
|
|
403
|
+
"Chain ID (default: 8453 for Base)",
|
|
404
|
+
(value) => parseInt(value, 10)
|
|
405
|
+
).option("--rpc-url <url>", "Custom RPC URL").option("--private-key <key>", "Private key (0x-prefixed)").option(
|
|
406
|
+
"--encode-only",
|
|
407
|
+
"Output transaction data as JSON instead of executing"
|
|
408
|
+
).action(async (options) => {
|
|
409
|
+
await executeUpvoteUser(options);
|
|
410
|
+
});
|
|
411
|
+
}
|
|
412
|
+
async function executeGetUserUpvotes(options) {
|
|
413
|
+
const userAddress = options.address;
|
|
414
|
+
if (!userAddress.startsWith("0x") || userAddress.length !== 42) {
|
|
415
|
+
exitWithError(
|
|
416
|
+
"Invalid address format (must be 0x-prefixed, 42 characters)"
|
|
417
|
+
);
|
|
418
|
+
return;
|
|
419
|
+
}
|
|
420
|
+
const readOnlyOptions = parseReadOnlyOptionsWithDefault({
|
|
421
|
+
chainId: options.chainId,
|
|
422
|
+
rpcUrl: options.rpcUrl
|
|
423
|
+
});
|
|
424
|
+
const client = new UserUpvoteClient({
|
|
425
|
+
chainId: readOnlyOptions.chainId,
|
|
426
|
+
overrides: readOnlyOptions.rpcUrl ? { rpcUrls: [readOnlyOptions.rpcUrl] } : void 0
|
|
427
|
+
});
|
|
428
|
+
try {
|
|
429
|
+
const [given, received, upvotePrice] = await Promise.all([
|
|
430
|
+
client.getUserUpvotesGiven({
|
|
431
|
+
user: userAddress
|
|
432
|
+
}),
|
|
433
|
+
client.getUserUpvotesReceived({
|
|
434
|
+
user: userAddress
|
|
435
|
+
}),
|
|
436
|
+
client.getUpvotePrice()
|
|
437
|
+
]);
|
|
438
|
+
if (options.json) {
|
|
439
|
+
console.log(
|
|
440
|
+
JSON.stringify(
|
|
441
|
+
{
|
|
442
|
+
address: userAddress,
|
|
443
|
+
chainId: readOnlyOptions.chainId,
|
|
444
|
+
upvotesGiven: Number(given),
|
|
445
|
+
upvotesReceived: Number(received),
|
|
446
|
+
upvotePriceWei: upvotePrice.toString(),
|
|
447
|
+
upvotePriceEth: formatEther(upvotePrice)
|
|
448
|
+
},
|
|
449
|
+
null,
|
|
450
|
+
2
|
|
451
|
+
)
|
|
452
|
+
);
|
|
453
|
+
} else {
|
|
454
|
+
console.log(chalk3.white(`Profile upvotes for ${userAddress}:`));
|
|
455
|
+
console.log(chalk3.cyan(` Upvotes Given: ${given}`));
|
|
456
|
+
console.log(chalk3.cyan(` Upvotes Received: ${received}`));
|
|
457
|
+
console.log(
|
|
458
|
+
chalk3.white(` Upvote Price: ${formatEther(upvotePrice)} ETH`)
|
|
459
|
+
);
|
|
460
|
+
}
|
|
461
|
+
} catch (error) {
|
|
462
|
+
exitWithError(
|
|
463
|
+
`Failed to fetch user upvotes: ${error instanceof Error ? error.message : String(error)}`
|
|
464
|
+
);
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
function registerGetUserUpvotesCommand(parent, commandName = "user-info") {
|
|
468
|
+
parent.command(commandName).description("Get profile upvote stats for a user").requiredOption("--address <address>", "User address to look up").option(
|
|
469
|
+
"--chain-id <id>",
|
|
470
|
+
"Chain ID (default: 8453 for Base)",
|
|
471
|
+
(value) => parseInt(value, 10)
|
|
472
|
+
).option("--rpc-url <url>", "Custom RPC URL").option("--json", "Output in JSON format").action(async (options) => {
|
|
473
|
+
await executeGetUserUpvotes(options);
|
|
474
|
+
});
|
|
475
|
+
}
|
|
316
476
|
|
|
317
477
|
// src/commands/upvote/index.ts
|
|
318
478
|
function registerUpvoteCommand(program) {
|
|
319
|
-
const upvoteCommand = program.command("upvote").description("Upvote tokens on Net Protocol");
|
|
479
|
+
const upvoteCommand = program.command("upvote").description("Upvote tokens and users on Net Protocol");
|
|
320
480
|
registerUpvoteTokenCommand(upvoteCommand);
|
|
321
481
|
registerGetUpvotesCommand(upvoteCommand);
|
|
482
|
+
registerUpvoteUserCommand(upvoteCommand);
|
|
483
|
+
registerGetUserUpvotesCommand(upvoteCommand);
|
|
322
484
|
}
|
|
323
485
|
|
|
324
|
-
export { registerGetUpvotesCommand, registerUpvoteCommand, registerUpvoteTokenCommand };
|
|
486
|
+
export { registerGetUpvotesCommand, registerGetUserUpvotesCommand, registerUpvoteCommand, registerUpvoteTokenCommand, registerUpvoteUserCommand };
|
|
325
487
|
//# sourceMappingURL=index.mjs.map
|
|
326
488
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/cli/shared.ts","../../src/shared/wallet.ts","../../src/shared/encode.ts","../../src/shared/output.ts","../../src/commands/upvote/upvote-token.ts","../../src/commands/upvote/get-upvotes.ts","../../src/commands/upvote/index.ts"],"names":["chalk","getBaseDataSuffix","getChainRpcUrls","http","PURE_ALPHA_STRATEGY","UNIV234_POOLS_STRATEGY","DYNAMIC_SPLIT_STRATEGY","getTokenScoreKey"],"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 { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { getChainRpcUrls, getBaseDataSuffix } 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 dataSuffix: getBaseDataSuffix(chainId),\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 { encodeFunctionData, concat } from \"viem\";\nimport { getBaseDataSuffix } from \"@net-protocol/core\";\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 const suffix = getBaseDataSuffix(chainId);\n const data = suffix ? concat([calldata, suffix]) : calldata;\n\n return {\n to: config.to,\n data,\n chainId,\n value: config.value?.toString() ?? \"0\",\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 { Command } from \"commander\";\nimport { createPublicClient, http, parseEther } from \"viem\";\nimport {\n parseReadOnlyOptionsWithDefault,\n parseCommonOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n discoverTokenPool,\n getTokenScoreKey,\n encodePoolKey,\n UPVOTE_APP,\n PURE_ALPHA_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n UPVOTE_PRICE_ETH,\n} from \"@net-protocol/score\";\nimport type { UpvoteTokenOptions } from \"./types\";\n\nasync function executeUpvoteToken(options: UpvoteTokenOptions): Promise<void> {\n const count = parseInt(options.count, 10);\n if (isNaN(count) || count <= 0) {\n exitWithError(\"Count must be a positive integer\");\n return;\n }\n\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n // Read-only options for pool discovery (always needed)\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Create public client for pool discovery\n const rpcUrls = getChainRpcUrls({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n const publicClient = createPublicClient({\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Discovering Uniswap pool for token...\"));\n\n let poolResult;\n try {\n poolResult = await discoverTokenPool({\n publicClient,\n tokenAddress,\n chainId: readOnlyOptions.chainId,\n });\n } catch (error) {\n exitWithError(\n `Failed to discover token pool: ${error instanceof Error ? error.message : String(error)}`\n );\n return;\n }\n\n // Determine strategy\n let strategyAddress: `0x${string}`;\n let storedContext: `0x${string}`;\n\n if (!poolResult || !poolResult.poolKey) {\n // No pool found → pure alpha\n strategyAddress = PURE_ALPHA_STRATEGY.address;\n storedContext = \"0x\";\n console.log(chalk.yellow(\"No pool found — using Pure Alpha strategy\"));\n } else if (options.splitType === \"50/50\") {\n // Pool found + 50/50 override → UNIV234_POOLS_STRATEGY\n strategyAddress = UNIV234_POOLS_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using 50/50 Pools strategy`\n )\n );\n } else {\n // Pool found + default/dynamic → DYNAMIC_SPLIT_STRATEGY\n strategyAddress = DYNAMIC_SPLIT_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using Dynamic Split strategy`\n )\n );\n }\n\n // Build transaction config\n const scoreKey = getTokenScoreKey(tokenAddress);\n const value = parseEther((count * UPVOTE_PRICE_ETH).toString());\n\n const txConfig = {\n to: UPVOTE_APP.address,\n abi: UPVOTE_APP.abi,\n functionName: \"upvote\" as const,\n args: [strategyAddress, scoreKey, count, storedContext, \"0x\"],\n value,\n };\n\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Execute transaction\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(\n chalk.blue(`Submitting ${count} upvote(s) for ${tokenAddress}...`)\n );\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n console.log(chalk.green(`Upvote submitted successfully!`));\n console.log(chalk.white(` Transaction: ${hash}`));\n console.log(chalk.white(` Token: ${tokenAddress}`));\n console.log(chalk.white(` Count: ${count}`));\n console.log(\n chalk.white(` Value: ${(count * UPVOTE_PRICE_ETH).toFixed(6)} ETH`)\n );\n } catch (error) {\n exitWithError(\n `Failed to submit upvote: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerUpvoteTokenCommand(\n parent: Command,\n commandName = \"token\"\n): void {\n parent\n .command(commandName)\n .description(\"Upvote a token on Net Protocol\")\n .requiredOption(\n \"--token-address <address>\",\n \"Token contract address to upvote\"\n )\n .requiredOption(\"--count <n>\", \"Number of upvotes\")\n .option(\n \"--split-type <type>\",\n 'Strategy split type: \"dynamic\" (default) or \"50/50\"'\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n 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 (options) => {\n await executeUpvoteToken(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n ScoreClient,\n getTokenScoreKey,\n ALL_STRATEGY_ADDRESSES,\n PURE_ALPHA_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n} from \"@net-protocol/score\";\nimport type { GetUpvotesOptions } from \"./types\";\n\nfunction getStrategyName(address: string): string {\n const lower = address.toLowerCase();\n if (lower === PURE_ALPHA_STRATEGY.address.toLowerCase()) return \"Pure Alpha\";\n if (lower === UNIV234_POOLS_STRATEGY.address.toLowerCase())\n return \"50/50 Pools\";\n if (lower === DYNAMIC_SPLIT_STRATEGY.address.toLowerCase())\n return \"Dynamic Split\";\n return address;\n}\n\nasync function executeGetUpvotes(options: GetUpvotesOptions): Promise<void> {\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new ScoreClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n const scoreKey = getTokenScoreKey(tokenAddress);\n\n try {\n // getUpvotesWithLegacy returns one aggregated count per scoreKey\n // (summing legacy + all specified strategies). To get per-strategy\n // counts, use getStrategyKeyScores for each strategy individually.\n const [totalCounts, ...perStrategyCounts] = await Promise.all([\n client.getUpvotesWithLegacy({\n scoreKeys: [scoreKey],\n strategies: ALL_STRATEGY_ADDRESSES,\n }),\n ...ALL_STRATEGY_ADDRESSES.map((strategy) =>\n client.getStrategyKeyScores({\n strategy,\n scoreKeys: [scoreKey],\n })\n ),\n ]);\n\n const total = totalCounts[0] ?? 0;\n const strategyCounts = ALL_STRATEGY_ADDRESSES.map((addr, i) => ({\n strategy: getStrategyName(addr),\n address: addr,\n count: perStrategyCounts[i]?.[0] ?? 0,\n }));\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n tokenAddress,\n scoreKey,\n total,\n strategies: strategyCounts.map((s) => ({\n name: s.strategy,\n address: s.address,\n count: s.count,\n })),\n },\n null,\n 2\n )\n );\n } else {\n console.log(chalk.white(`Upvotes for ${tokenAddress}:`));\n console.log(chalk.cyan(` Total: ${total}`));\n console.log();\n for (const s of strategyCounts) {\n if (s.count > 0) {\n console.log(chalk.white(` ${s.strategy}: ${s.count}`));\n }\n }\n if (total === 0) {\n console.log(chalk.yellow(\" No upvotes found\"));\n }\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch upvotes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerGetUpvotesCommand(\n parent: Command,\n commandName = \"info\"\n): void {\n parent\n .command(commandName)\n .description(\"Get upvote counts for a token\")\n .requiredOption(\"--token-address <address>\", \"Token contract address\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n 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 executeGetUpvotes(options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerUpvoteTokenCommand } from \"./upvote-token\";\nimport { registerGetUpvotesCommand } from \"./get-upvotes\";\n\nexport function registerUpvoteCommand(program: Command): void {\n const upvoteCommand = program\n .command(\"upvote\")\n .description(\"Upvote tokens on Net Protocol\");\n\n registerUpvoteTokenCommand(upvoteCommand);\n registerGetUpvotesCommand(upvoteCommand);\n}\n\n// Re-exports for botchan\nexport { registerUpvoteTokenCommand } from \"./upvote-token\";\nexport { registerGetUpvotesCommand } from \"./get-upvotes\";\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/cli/shared.ts","../../src/shared/wallet.ts","../../src/shared/encode.ts","../../src/shared/output.ts","../../src/commands/upvote/upvote-token.ts","../../src/commands/upvote/get-upvotes.ts","../../src/commands/upvote/upvote-user.ts","../../src/commands/upvote/get-user-upvotes.ts","../../src/commands/upvote/index.ts"],"names":["chalk","getBaseDataSuffix","getChainRpcUrls","http","PURE_ALPHA_STRATEGY","UNIV234_POOLS_STRATEGY","DYNAMIC_SPLIT_STRATEGY","getTokenScoreKey","UserUpvoteClient","formatEther"],"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 { createWalletClient, http } from \"viem\";\nimport { privateKeyToAccount } from \"viem/accounts\";\nimport { getChainRpcUrls, getBaseDataSuffix } 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 dataSuffix: getBaseDataSuffix(chainId),\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 { encodeFunctionData, concat } from \"viem\";\nimport { getBaseDataSuffix } from \"@net-protocol/core\";\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 const suffix = getBaseDataSuffix(chainId);\n const data = suffix ? concat([calldata, suffix]) : calldata;\n\n return {\n to: config.to,\n data,\n chainId,\n value: config.value?.toString() ?? \"0\",\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 { Command } from \"commander\";\nimport { createPublicClient, http, parseEther } from \"viem\";\nimport {\n parseReadOnlyOptionsWithDefault,\n parseCommonOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { createWallet, executeTransaction } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport { getChainRpcUrls } from \"@net-protocol/core\";\nimport {\n discoverTokenPool,\n getTokenScoreKey,\n encodePoolKey,\n UPVOTE_APP,\n PURE_ALPHA_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n UPVOTE_PRICE_ETH,\n} from \"@net-protocol/score\";\nimport type { UpvoteTokenOptions } from \"./types\";\n\nasync function executeUpvoteToken(options: UpvoteTokenOptions): Promise<void> {\n const count = parseInt(options.count, 10);\n if (isNaN(count) || count <= 0) {\n exitWithError(\"Count must be a positive integer\");\n return;\n }\n\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n // Read-only options for pool discovery (always needed)\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n // Create public client for pool discovery\n const rpcUrls = getChainRpcUrls({\n chainId: readOnlyOptions.chainId,\n rpcUrl: readOnlyOptions.rpcUrl,\n });\n const publicClient = createPublicClient({\n transport: http(rpcUrls[0]),\n });\n\n console.log(chalk.blue(\"Discovering Uniswap pool for token...\"));\n\n let poolResult;\n try {\n poolResult = await discoverTokenPool({\n publicClient,\n tokenAddress,\n chainId: readOnlyOptions.chainId,\n });\n } catch (error) {\n exitWithError(\n `Failed to discover token pool: ${error instanceof Error ? error.message : String(error)}`\n );\n return;\n }\n\n // Determine strategy\n let strategyAddress: `0x${string}`;\n let storedContext: `0x${string}`;\n\n if (!poolResult || !poolResult.poolKey) {\n // No pool found → pure alpha\n strategyAddress = PURE_ALPHA_STRATEGY.address;\n storedContext = \"0x\";\n console.log(chalk.yellow(\"No pool found — using Pure Alpha strategy\"));\n } else if (options.splitType === \"50/50\") {\n // Pool found + 50/50 override → UNIV234_POOLS_STRATEGY\n strategyAddress = UNIV234_POOLS_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using 50/50 Pools strategy`\n )\n );\n } else {\n // Pool found + default/dynamic → DYNAMIC_SPLIT_STRATEGY\n strategyAddress = DYNAMIC_SPLIT_STRATEGY.address;\n storedContext = encodePoolKey(poolResult.poolKey);\n console.log(\n chalk.green(\n `Pool found (fee: ${poolResult.fee}) — using Dynamic Split strategy`\n )\n );\n }\n\n // Build transaction config\n const scoreKey = getTokenScoreKey(tokenAddress);\n const value = parseEther((count * UPVOTE_PRICE_ETH).toString());\n\n const txConfig = {\n to: UPVOTE_APP.address,\n abi: UPVOTE_APP.abi,\n functionName: \"upvote\" as const,\n args: [strategyAddress, scoreKey, count, storedContext, \"0x\"],\n value,\n };\n\n if (options.encodeOnly) {\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n // Execute transaction\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(\n chalk.blue(`Submitting ${count} upvote(s) for ${tokenAddress}...`)\n );\n\n try {\n const hash = await executeTransaction(walletClient, txConfig);\n\n console.log(chalk.green(`Upvote submitted successfully!`));\n console.log(chalk.white(` Transaction: ${hash}`));\n console.log(chalk.white(` Token: ${tokenAddress}`));\n console.log(chalk.white(` Count: ${count}`));\n console.log(\n chalk.white(` Value: ${(count * UPVOTE_PRICE_ETH).toFixed(6)} ETH`)\n );\n } catch (error) {\n exitWithError(\n `Failed to submit upvote: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerUpvoteTokenCommand(\n parent: Command,\n commandName = \"token\"\n): void {\n parent\n .command(commandName)\n .description(\"Upvote a token on Net Protocol\")\n .requiredOption(\n \"--token-address <address>\",\n \"Token contract address to upvote\"\n )\n .requiredOption(\"--count <n>\", \"Number of upvotes\")\n .option(\n \"--split-type <type>\",\n 'Strategy split type: \"dynamic\" (default) or \"50/50\"'\n )\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n 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 (options) => {\n await executeUpvoteToken(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n ScoreClient,\n getTokenScoreKey,\n ALL_STRATEGY_ADDRESSES,\n PURE_ALPHA_STRATEGY,\n UNIV234_POOLS_STRATEGY,\n DYNAMIC_SPLIT_STRATEGY,\n} from \"@net-protocol/score\";\nimport type { GetUpvotesOptions } from \"./types\";\n\nfunction getStrategyName(address: string): string {\n const lower = address.toLowerCase();\n if (lower === PURE_ALPHA_STRATEGY.address.toLowerCase()) return \"Pure Alpha\";\n if (lower === UNIV234_POOLS_STRATEGY.address.toLowerCase())\n return \"50/50 Pools\";\n if (lower === DYNAMIC_SPLIT_STRATEGY.address.toLowerCase())\n return \"Dynamic Split\";\n return address;\n}\n\nasync function executeGetUpvotes(options: GetUpvotesOptions): Promise<void> {\n const tokenAddress = options.tokenAddress;\n if (!tokenAddress.startsWith(\"0x\") || tokenAddress.length !== 42) {\n exitWithError(\n \"Invalid token address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new ScoreClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n const scoreKey = getTokenScoreKey(tokenAddress);\n\n try {\n // getUpvotesWithLegacy returns one aggregated count per scoreKey\n // (summing legacy + all specified strategies). To get per-strategy\n // counts, use getStrategyKeyScores for each strategy individually.\n const [totalCounts, ...perStrategyCounts] = await Promise.all([\n client.getUpvotesWithLegacy({\n scoreKeys: [scoreKey],\n strategies: ALL_STRATEGY_ADDRESSES,\n }),\n ...ALL_STRATEGY_ADDRESSES.map((strategy) =>\n client.getStrategyKeyScores({\n strategy,\n scoreKeys: [scoreKey],\n })\n ),\n ]);\n\n const total = totalCounts[0] ?? 0;\n const strategyCounts = ALL_STRATEGY_ADDRESSES.map((addr, i) => ({\n strategy: getStrategyName(addr),\n address: addr,\n count: perStrategyCounts[i]?.[0] ?? 0,\n }));\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n tokenAddress,\n scoreKey,\n total,\n strategies: strategyCounts.map((s) => ({\n name: s.strategy,\n address: s.address,\n count: s.count,\n })),\n },\n null,\n 2\n )\n );\n } else {\n console.log(chalk.white(`Upvotes for ${tokenAddress}:`));\n console.log(chalk.cyan(` Total: ${total}`));\n console.log();\n for (const s of strategyCounts) {\n if (s.count > 0) {\n console.log(chalk.white(` ${s.strategy}: ${s.count}`));\n }\n }\n if (total === 0) {\n console.log(chalk.yellow(\" No upvotes found\"));\n }\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch upvotes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerGetUpvotesCommand(\n parent: Command,\n commandName = \"info\"\n): void {\n parent\n .command(commandName)\n .description(\"Get upvote counts for a token\")\n .requiredOption(\"--token-address <address>\", \"Token contract address\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n 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 executeGetUpvotes(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { formatEther } from \"viem\";\nimport {\n parseReadOnlyOptionsWithDefault,\n parseCommonOptionsWithDefault,\n} from \"../../cli/shared\";\nimport { createWallet } from \"../../shared/wallet\";\nimport { encodeTransaction } from \"../../shared/encode\";\nimport { exitWithError } from \"../../shared/output\";\nimport {\n UserUpvoteClient,\n USER_UPVOTE_CONTRACT,\n NULL_ADDRESS,\n calculateUpvoteCost,\n} from \"@net-protocol/score\";\nimport type { UpvoteUserOptions } from \"./types\";\n\nexport async function executeUpvoteUser(\n options: UpvoteUserOptions\n): Promise<void> {\n const count = parseInt(options.count, 10);\n if (isNaN(count) || count <= 0) {\n exitWithError(\"Count must be a positive integer\");\n return;\n }\n\n const userAddress = options.address;\n if (!userAddress.startsWith(\"0x\") || userAddress.length !== 42) {\n exitWithError(\n \"Invalid address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const token = (options.token ?? NULL_ADDRESS) as `0x${string}`;\n const feeTier = options.feeTier ? parseInt(options.feeTier, 10) : 0;\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new UserUpvoteClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n // Fetch current upvote price from contract\n let upvotePrice: bigint;\n try {\n upvotePrice = await client.getUpvotePrice();\n } catch (error) {\n exitWithError(\n `Failed to fetch upvote price: ${error instanceof Error ? error.message : String(error)}`\n );\n return;\n }\n\n const totalCost = calculateUpvoteCost(count, upvotePrice);\n\n if (options.encodeOnly) {\n const txConfig = {\n to: USER_UPVOTE_CONTRACT.address,\n abi: USER_UPVOTE_CONTRACT.abi,\n functionName: \"upvoteUser\" as const,\n args: [userAddress as `0x${string}`, token, BigInt(count), BigInt(feeTier)],\n value: totalCost,\n };\n const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);\n console.log(JSON.stringify(encoded, null, 2));\n return;\n }\n\n const commonOptions = parseCommonOptionsWithDefault(\n {\n privateKey: options.privateKey,\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n },\n true\n );\n\n const walletClient = createWallet(\n commonOptions.privateKey,\n commonOptions.chainId,\n commonOptions.rpcUrl\n );\n\n console.log(\n chalk.blue(`Submitting ${count} profile upvote(s) for ${userAddress}...`)\n );\n\n try {\n const hash = await client.upvoteUser({\n walletClient,\n userToUpvote: userAddress as `0x${string}`,\n token,\n numUpvotes: count,\n feeTier,\n value: totalCost,\n });\n\n console.log(chalk.green(\"Profile upvote submitted successfully!\"));\n console.log(chalk.white(` Transaction: ${hash}`));\n console.log(chalk.white(` User: ${userAddress}`));\n console.log(chalk.white(` Count: ${count}`));\n console.log(chalk.white(` Value: ${formatEther(totalCost)} ETH`));\n if (token !== NULL_ADDRESS) {\n console.log(chalk.white(` Token: ${token}`));\n }\n } catch (error) {\n exitWithError(\n `Failed to submit profile upvote: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerUpvoteUserCommand(\n parent: Command,\n commandName = \"user\"\n): void {\n parent\n .command(commandName)\n .description(\"Upvote a user's profile on Net Protocol\")\n .requiredOption(\"--address <address>\", \"User address to upvote\")\n .requiredOption(\"--count <n>\", \"Number of upvotes\")\n .option(\"--token <address>\", \"Token address (default: null address)\")\n .option(\"--fee-tier <tier>\", \"Fee tier (default: 0)\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n 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 (options) => {\n await executeUpvoteUser(options);\n });\n}\n","import chalk from \"chalk\";\nimport { Command } from \"commander\";\nimport { formatEther } from \"viem\";\nimport { parseReadOnlyOptionsWithDefault } from \"../../cli/shared\";\nimport { exitWithError } from \"../../shared/output\";\nimport { UserUpvoteClient } from \"@net-protocol/score\";\nimport type { GetUserUpvotesOptions } from \"./types\";\n\nexport async function executeGetUserUpvotes(\n options: GetUserUpvotesOptions\n): Promise<void> {\n const userAddress = options.address;\n if (!userAddress.startsWith(\"0x\") || userAddress.length !== 42) {\n exitWithError(\n \"Invalid address format (must be 0x-prefixed, 42 characters)\"\n );\n return;\n }\n\n const readOnlyOptions = parseReadOnlyOptionsWithDefault({\n chainId: options.chainId,\n rpcUrl: options.rpcUrl,\n });\n\n const client = new UserUpvoteClient({\n chainId: readOnlyOptions.chainId,\n overrides: readOnlyOptions.rpcUrl\n ? { rpcUrls: [readOnlyOptions.rpcUrl] }\n : undefined,\n });\n\n try {\n const [given, received, upvotePrice] = await Promise.all([\n client.getUserUpvotesGiven({\n user: userAddress as `0x${string}`,\n }),\n client.getUserUpvotesReceived({\n user: userAddress as `0x${string}`,\n }),\n client.getUpvotePrice(),\n ]);\n\n if (options.json) {\n console.log(\n JSON.stringify(\n {\n address: userAddress,\n chainId: readOnlyOptions.chainId,\n upvotesGiven: Number(given),\n upvotesReceived: Number(received),\n upvotePriceWei: upvotePrice.toString(),\n upvotePriceEth: formatEther(upvotePrice),\n },\n null,\n 2\n )\n );\n } else {\n console.log(chalk.white(`Profile upvotes for ${userAddress}:`));\n console.log(chalk.cyan(` Upvotes Given: ${given}`));\n console.log(chalk.cyan(` Upvotes Received: ${received}`));\n console.log(\n chalk.white(` Upvote Price: ${formatEther(upvotePrice)} ETH`)\n );\n }\n } catch (error) {\n exitWithError(\n `Failed to fetch user upvotes: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n}\n\nexport function registerGetUserUpvotesCommand(\n parent: Command,\n commandName = \"user-info\"\n): void {\n parent\n .command(commandName)\n .description(\"Get profile upvote stats for a user\")\n .requiredOption(\"--address <address>\", \"User address to look up\")\n .option(\"--chain-id <id>\", \"Chain ID (default: 8453 for Base)\", (value) =>\n 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 executeGetUserUpvotes(options);\n });\n}\n","import { Command } from \"commander\";\nimport { registerUpvoteTokenCommand } from \"./upvote-token\";\nimport { registerGetUpvotesCommand } from \"./get-upvotes\";\nimport { registerUpvoteUserCommand } from \"./upvote-user\";\nimport { registerGetUserUpvotesCommand } from \"./get-user-upvotes\";\n\nexport function registerUpvoteCommand(program: Command): void {\n const upvoteCommand = program\n .command(\"upvote\")\n .description(\"Upvote tokens and users on Net Protocol\");\n\n registerUpvoteTokenCommand(upvoteCommand);\n registerGetUpvotesCommand(upvoteCommand);\n registerUpvoteUserCommand(upvoteCommand);\n registerGetUserUpvotesCommand(upvoteCommand);\n}\n\n// Re-exports for botchan\nexport { registerUpvoteTokenCommand } from \"./upvote-token\";\nexport { registerGetUpvotesCommand } from \"./get-upvotes\";\nexport { registerUpvoteUserCommand } from \"./upvote-user\";\nexport { registerGetUserUpvotesCommand } from \"./get-user-upvotes\";\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@net-protocol/cli",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"description": "CLI tool for Net Protocol",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -15,6 +15,10 @@
|
|
|
15
15
|
"types": "./dist/feed/index.d.ts",
|
|
16
16
|
"import": "./dist/feed/index.mjs"
|
|
17
17
|
},
|
|
18
|
+
"./chat": {
|
|
19
|
+
"types": "./dist/chat/index.d.ts",
|
|
20
|
+
"import": "./dist/chat/index.mjs"
|
|
21
|
+
},
|
|
18
22
|
"./profile": {
|
|
19
23
|
"types": "./dist/profile/index.d.ts",
|
|
20
24
|
"import": "./dist/profile/index.mjs"
|
|
@@ -45,6 +49,7 @@
|
|
|
45
49
|
},
|
|
46
50
|
"dependencies": {
|
|
47
51
|
"@net-protocol/bazaar": "^0.1.12",
|
|
52
|
+
"@net-protocol/chats": "^0.1.0",
|
|
48
53
|
"@net-protocol/core": "^0.1.9",
|
|
49
54
|
"@net-protocol/feeds": "^0.1.14",
|
|
50
55
|
"@net-protocol/netr": "^0.1.3",
|