@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.
- package/dist/cli/index.mjs +179 -15
- package/dist/cli/index.mjs.map +1 -1
- package/dist/feed/index.mjs +5 -3
- package/dist/feed/index.mjs.map +1 -1
- package/dist/profile/index.mjs +4 -2
- package/dist/profile/index.mjs.map +1 -1
- package/dist/upvote/index.d.ts +5 -1
- package/dist/upvote/index.mjs +169 -5
- package/dist/upvote/index.mjs.map +1 -1
- package/package.json +2 -2
package/dist/cli/index.mjs
CHANGED
|
@@ -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
|
|
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
|
|
2066
|
-
|
|
2067
|
-
|
|
2068
|
-
|
|
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");
|