@net-protocol/cli 0.1.33 → 0.1.35

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.
@@ -7,7 +7,7 @@ import chalk4 from 'chalk';
7
7
  import * as fs6 from 'fs';
8
8
  import { readFileSync, existsSync, mkdirSync, writeFileSync } from 'fs';
9
9
  import { OPTIMAL_CHUNK_SIZE, StorageClient, detectFileTypeFromBase64, base64ToDataUri, shouldSuggestXmlStorage, getStorageKeyBytes, encodeStorageKeyForUrl, chunkDataForStorage, CHUNKED_STORAGE_CONTRACT, STORAGE_CONTRACT as STORAGE_CONTRACT$1 } from '@net-protocol/storage';
10
- import { stringToHex, createWalletClient, http, hexToString, parseEther, encodeFunctionData, publicActions, defineChain, createPublicClient } from 'viem';
10
+ import { stringToHex, createWalletClient, http, hexToString, parseEther, encodeFunctionData, publicActions, concat, defineChain, createPublicClient, formatEther } from 'viem';
11
11
  import { privateKeyToAccount } from 'viem/accounts';
12
12
  import { getNetContract, getChainName, getPublicClient, getChainRpcUrls, getBaseDataSuffix, NetClient, toBytes32, NULL_ADDRESS } from '@net-protocol/core';
13
13
  import { createRelayX402Client, createRelaySession, checkBackendWalletBalance, fundBackendWallet, batchTransactions, submitTransactionsViaRelay, waitForConfirmations, retryFailedTransactions as retryFailedTransactions$1 } from '@net-protocol/relay';
@@ -21,7 +21,7 @@ import { BazaarClient } from '@net-protocol/bazaar';
21
21
  import * as os from 'os';
22
22
  import { homedir } from 'os';
23
23
  import * as readline from 'readline';
24
- 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';
24
+ import { discoverTokenPool, PURE_ALPHA_STRATEGY, UNIV234_POOLS_STRATEGY, encodePoolKey, DYNAMIC_SPLIT_STRATEGY, getTokenScoreKey, UPVOTE_PRICE_ETH, UPVOTE_APP, ScoreClient, ALL_STRATEGY_ADDRESSES, NULL_ADDRESS as NULL_ADDRESS$1, UserUpvoteClient, calculateUpvoteCost, USER_UPVOTE_CONTRACT } from '@net-protocol/score';
25
25
 
26
26
  var DEFAULT_CHAIN_ID = 8453;
27
27
  function getRequiredChainId(optionValue) {
@@ -1236,9 +1236,11 @@ function encodeTransaction(config, chainId) {
1236
1236
  functionName: config.functionName,
1237
1237
  args: config.args
1238
1238
  });
1239
+ const suffix = getBaseDataSuffix(chainId);
1240
+ const data = suffix ? concat([calldata, suffix]) : calldata;
1239
1241
  return {
1240
1242
  to: config.to,
1241
- data: calldata,
1243
+ data,
1242
1244
  chainId,
1243
1245
  value: config.value?.toString() ?? "0"
1244
1246
  };
@@ -2062,20 +2064,20 @@ async function executeEncodeOnly2(options) {
2062
2064
  },
2063
2065
  saltResult.salt
2064
2066
  );
2065
- const calldata = encodeFunctionData({
2066
- abi: txConfig.abi,
2067
- functionName: txConfig.functionName,
2068
- args: txConfig.args
2069
- });
2067
+ const encoded = encodeTransaction(
2068
+ {
2069
+ to: txConfig.address,
2070
+ abi: txConfig.abi,
2071
+ functionName: txConfig.functionName,
2072
+ args: txConfig.args,
2073
+ value: txConfig.value
2074
+ },
2075
+ readOnlyOptions.chainId
2076
+ );
2070
2077
  const result = {
2071
2078
  predictedAddress: saltResult.predictedAddress,
2072
2079
  salt: saltResult.salt,
2073
- transaction: {
2074
- to: txConfig.address,
2075
- data: calldata,
2076
- chainId: readOnlyOptions.chainId,
2077
- value: txConfig.value?.toString() ?? "0"
2078
- },
2080
+ transaction: encoded,
2079
2081
  config: {
2080
2082
  name: options.name,
2081
2083
  symbol: options.symbol,
@@ -7153,12 +7155,174 @@ function registerGetUpvotesCommand(parent, commandName = "info") {
7153
7155
  await executeGetUpvotes(options);
7154
7156
  });
7155
7157
  }
7158
+ async function executeUpvoteUser(options) {
7159
+ const count = parseInt(options.count, 10);
7160
+ if (isNaN(count) || count <= 0) {
7161
+ exitWithError("Count must be a positive integer");
7162
+ return;
7163
+ }
7164
+ const userAddress = options.address;
7165
+ if (!userAddress.startsWith("0x") || userAddress.length !== 42) {
7166
+ exitWithError(
7167
+ "Invalid address format (must be 0x-prefixed, 42 characters)"
7168
+ );
7169
+ return;
7170
+ }
7171
+ const token = options.token ?? NULL_ADDRESS$1;
7172
+ const feeTier = options.feeTier ? parseInt(options.feeTier, 10) : 0;
7173
+ const readOnlyOptions = parseReadOnlyOptionsWithDefault({
7174
+ chainId: options.chainId,
7175
+ rpcUrl: options.rpcUrl
7176
+ });
7177
+ const client = new UserUpvoteClient({
7178
+ chainId: readOnlyOptions.chainId,
7179
+ overrides: readOnlyOptions.rpcUrl ? { rpcUrls: [readOnlyOptions.rpcUrl] } : void 0
7180
+ });
7181
+ let upvotePrice;
7182
+ try {
7183
+ upvotePrice = await client.getUpvotePrice();
7184
+ } catch (error) {
7185
+ exitWithError(
7186
+ `Failed to fetch upvote price: ${error instanceof Error ? error.message : String(error)}`
7187
+ );
7188
+ return;
7189
+ }
7190
+ const totalCost = calculateUpvoteCost(count, upvotePrice);
7191
+ if (options.encodeOnly) {
7192
+ const txConfig = {
7193
+ to: USER_UPVOTE_CONTRACT.address,
7194
+ abi: USER_UPVOTE_CONTRACT.abi,
7195
+ functionName: "upvoteUser",
7196
+ args: [userAddress, token, BigInt(count), BigInt(feeTier)],
7197
+ value: totalCost
7198
+ };
7199
+ const encoded = encodeTransaction(txConfig, readOnlyOptions.chainId);
7200
+ console.log(JSON.stringify(encoded, null, 2));
7201
+ return;
7202
+ }
7203
+ const commonOptions = parseCommonOptionsWithDefault(
7204
+ {
7205
+ privateKey: options.privateKey,
7206
+ chainId: options.chainId,
7207
+ rpcUrl: options.rpcUrl
7208
+ },
7209
+ true
7210
+ );
7211
+ const walletClient = createWallet(
7212
+ commonOptions.privateKey,
7213
+ commonOptions.chainId,
7214
+ commonOptions.rpcUrl
7215
+ );
7216
+ console.log(
7217
+ chalk4.blue(`Submitting ${count} profile upvote(s) for ${userAddress}...`)
7218
+ );
7219
+ try {
7220
+ const hash = await client.upvoteUser({
7221
+ walletClient,
7222
+ userToUpvote: userAddress,
7223
+ token,
7224
+ numUpvotes: count,
7225
+ feeTier,
7226
+ value: totalCost
7227
+ });
7228
+ console.log(chalk4.green("Profile upvote submitted successfully!"));
7229
+ console.log(chalk4.white(` Transaction: ${hash}`));
7230
+ console.log(chalk4.white(` User: ${userAddress}`));
7231
+ console.log(chalk4.white(` Count: ${count}`));
7232
+ console.log(chalk4.white(` Value: ${formatEther(totalCost)} ETH`));
7233
+ if (token !== NULL_ADDRESS$1) {
7234
+ console.log(chalk4.white(` Token: ${token}`));
7235
+ }
7236
+ } catch (error) {
7237
+ exitWithError(
7238
+ `Failed to submit profile upvote: ${error instanceof Error ? error.message : String(error)}`
7239
+ );
7240
+ }
7241
+ }
7242
+ function registerUpvoteUserCommand(parent, commandName = "user") {
7243
+ 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(
7244
+ "--chain-id <id>",
7245
+ "Chain ID (default: 8453 for Base)",
7246
+ (value) => parseInt(value, 10)
7247
+ ).option("--rpc-url <url>", "Custom RPC URL").option("--private-key <key>", "Private key (0x-prefixed)").option(
7248
+ "--encode-only",
7249
+ "Output transaction data as JSON instead of executing"
7250
+ ).action(async (options) => {
7251
+ await executeUpvoteUser(options);
7252
+ });
7253
+ }
7254
+ async function executeGetUserUpvotes(options) {
7255
+ const userAddress = options.address;
7256
+ if (!userAddress.startsWith("0x") || userAddress.length !== 42) {
7257
+ exitWithError(
7258
+ "Invalid address format (must be 0x-prefixed, 42 characters)"
7259
+ );
7260
+ return;
7261
+ }
7262
+ const readOnlyOptions = parseReadOnlyOptionsWithDefault({
7263
+ chainId: options.chainId,
7264
+ rpcUrl: options.rpcUrl
7265
+ });
7266
+ const client = new UserUpvoteClient({
7267
+ chainId: readOnlyOptions.chainId,
7268
+ overrides: readOnlyOptions.rpcUrl ? { rpcUrls: [readOnlyOptions.rpcUrl] } : void 0
7269
+ });
7270
+ try {
7271
+ const [given, received, upvotePrice] = await Promise.all([
7272
+ client.getUserUpvotesGiven({
7273
+ user: userAddress
7274
+ }),
7275
+ client.getUserUpvotesReceived({
7276
+ user: userAddress
7277
+ }),
7278
+ client.getUpvotePrice()
7279
+ ]);
7280
+ if (options.json) {
7281
+ console.log(
7282
+ JSON.stringify(
7283
+ {
7284
+ address: userAddress,
7285
+ chainId: readOnlyOptions.chainId,
7286
+ upvotesGiven: Number(given),
7287
+ upvotesReceived: Number(received),
7288
+ upvotePriceWei: upvotePrice.toString(),
7289
+ upvotePriceEth: formatEther(upvotePrice)
7290
+ },
7291
+ null,
7292
+ 2
7293
+ )
7294
+ );
7295
+ } else {
7296
+ console.log(chalk4.white(`Profile upvotes for ${userAddress}:`));
7297
+ console.log(chalk4.cyan(` Upvotes Given: ${given}`));
7298
+ console.log(chalk4.cyan(` Upvotes Received: ${received}`));
7299
+ console.log(
7300
+ chalk4.white(` Upvote Price: ${formatEther(upvotePrice)} ETH`)
7301
+ );
7302
+ }
7303
+ } catch (error) {
7304
+ exitWithError(
7305
+ `Failed to fetch user upvotes: ${error instanceof Error ? error.message : String(error)}`
7306
+ );
7307
+ }
7308
+ }
7309
+ function registerGetUserUpvotesCommand(parent, commandName = "user-info") {
7310
+ parent.command(commandName).description("Get profile upvote stats for a user").requiredOption("--address <address>", "User address to look up").option(
7311
+ "--chain-id <id>",
7312
+ "Chain ID (default: 8453 for Base)",
7313
+ (value) => parseInt(value, 10)
7314
+ ).option("--rpc-url <url>", "Custom RPC URL").option("--json", "Output in JSON format").action(async (options) => {
7315
+ await executeGetUserUpvotes(options);
7316
+ });
7317
+ }
7156
7318
 
7157
7319
  // src/commands/upvote/index.ts
7158
7320
  function registerUpvoteCommand(program2) {
7159
- const upvoteCommand = program2.command("upvote").description("Upvote tokens on Net Protocol");
7321
+ const upvoteCommand = program2.command("upvote").description("Upvote tokens and users on Net Protocol");
7160
7322
  registerUpvoteTokenCommand(upvoteCommand);
7161
7323
  registerGetUpvotesCommand(upvoteCommand);
7324
+ registerUpvoteUserCommand(upvoteCommand);
7325
+ registerGetUserUpvotesCommand(upvoteCommand);
7162
7326
  }
7163
7327
  var CACHE_DIR = join(homedir(), ".netp");
7164
7328
  var CACHE_FILE = join(CACHE_DIR, "update-check.json");