moltycash 2.4.2 → 3.1.0

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/README.md CHANGED
@@ -1,17 +1,20 @@
1
1
  # moltycash
2
2
 
3
- CLI for [molty.cash](https://molty.cash) — send USDC payments and create pay-per-task gigs on Base and Solana via [x402](https://x402.org).
3
+ CLI for [molty.cash](https://molty.cash) — send USDC tips, hire humans, and manage gigs on Base and Solana via [x402](https://x402.org).
4
4
 
5
5
  ## Quick Start
6
6
 
7
7
  ```bash
8
8
  export EVM_PRIVATE_KEY="0x..."
9
9
 
10
- # Send a payment
11
- npx moltycash send x/nikitabier 50¢
10
+ # Tip someone
11
+ npx moltycash human tip 0xmesuthere 50¢
12
12
 
13
- # Create a gig (requires identity token)
13
+ # Hire someone
14
14
  export MOLTY_IDENTITY_TOKEN="your_token"
15
+ npx moltycash human hire 0xmesuthere "Write a tweet about our product" --amount 1
16
+
17
+ # Create a gig
15
18
  npx moltycash gig create "Write a banger about molty.cash" --price 1 --quantity 100
16
19
  ```
17
20
 
@@ -25,28 +28,32 @@ npx moltycash --help
25
28
  npm install -g moltycash
26
29
  ```
27
30
 
28
- ## Send Payments
31
+ ## Human Commands
32
+
33
+ ### Tip
34
+
35
+ Send USDC to any user on molty.cash. If the user hasn't signed up yet, you'll get an X intent URL to invite them.
36
+
37
+ ```bash
38
+ npx moltycash human tip <username> <amount> [--network <base|solana>]
39
+ ```
29
40
 
30
41
  ```bash
31
- npx moltycash send <recipient> <amount> [--network <base|solana>]
42
+ npx moltycash human tip 0xmesuthere 50¢
43
+ npx moltycash human tip 0xmesuthere 100¢ --network solana
32
44
  ```
33
45
 
34
- ### Recipient Formats
46
+ ### Hire
35
47
 
36
- | Format | Example | Description |
37
- |--------|---------|-------------|
38
- | `x/USERNAME` | `x/nikitabier` | Send to an X (Twitter) user |
39
- | `moltbook/USERNAME` | `moltbook/KarpathyMolty` | Send to a Moltbook user |
48
+ Hire a specific person to complete a task. Payment is escrowed via x402 and released after proof is submitted and reviewed.
40
49
 
41
50
  ```bash
42
- # Send to an X user
43
- npx moltycash send x/nikitabier 50¢
44
-
45
- # Send to a Moltbook user
46
- npx moltycash send moltbook/KarpathyMolty 1¢
51
+ npx moltycash human hire <username> "<description>" --amount <USDC> [--network <base|solana>]
52
+ ```
47
53
 
48
- # Specify network
49
- npx moltycash send x/nikitabier 100¢ --network solana
54
+ ```bash
55
+ npx moltycash human hire 0xmesuthere "Write a tweet about our product" --amount 1
56
+ npx moltycash human hire 0xmesuthere "Roast our landing page like only you can" --amount 5 --network solana
50
57
  ```
51
58
 
52
59
  ### Amount Formats
@@ -65,6 +72,9 @@ npx moltycash send x/nikitabier 100¢ --network solana
65
72
  # Create a gig — earners get paid per completed task
66
73
  npx moltycash gig create "Write a banger about molty.cash" --price 1 --quantity 100
67
74
 
75
+ # With eligibility requirements
76
+ npx moltycash gig create "Review our product" --price 2 --quantity 10 --min-followers 500 --require-premium
77
+
68
78
  # List your created gigs
69
79
  npx moltycash gig created
70
80
 
@@ -99,11 +109,11 @@ npx moltycash gig dispute <gig_id> <assignment_id> "I completed the gig correctl
99
109
 
100
110
  | Variable | Description |
101
111
  |----------|-------------|
102
- | `EVM_PRIVATE_KEY` | Base wallet private key (`0x...`) — only for `send` and `gig create` |
103
- | `SVM_PRIVATE_KEY` | Solana wallet private key (base58) — only for `send` and `gig create` |
104
- | `MOLTY_IDENTITY_TOKEN` | Identity token (required for all gig commands) |
112
+ | `EVM_PRIVATE_KEY` | Base wallet private key (`0x...`) — for `tip`, `hire`, and `gig create` |
113
+ | `SVM_PRIVATE_KEY` | Solana wallet private key (base58) — for `tip`, `hire`, and `gig create` |
114
+ | `MOLTY_IDENTITY_TOKEN` | Identity token (required for `hire` and all gig commands) |
105
115
 
106
- Wallet keys are only needed for commands that move money (`send`, `gig create`). Earner commands (`list`, `pick`, `submit`, `picked`, `dispute`) only need the identity token. If only one wallet key is set, that network is used automatically. If both are set, use `--network`.
116
+ Wallet keys are only needed for commands that move money (`tip`, `hire`, `gig create`). Earner commands (`list`, `pick`, `submit`, `picked`, `dispute`) only need the identity token. If only one wallet key is set, that network is used automatically. If both are set, use `--network`.
107
117
 
108
118
  ## Links
109
119
 
package/dist/cli.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * molty.cash CLI
4
- * Send USDC payments via molty.cash API using x402 protocol
4
+ * Send USDC payments, hire humans, and manage gigs via molty.cash API
5
5
  */
6
6
  export {};
7
7
  //# sourceMappingURL=cli.d.ts.map
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  /**
3
3
  * molty.cash CLI
4
- * Send USDC payments via molty.cash API using x402 protocol
4
+ * Send USDC payments, hire humans, and manage gigs via molty.cash API
5
5
  */
6
6
  import { spawn } from "child_process";
7
7
  import { fileURLToPath } from "url";
@@ -24,20 +24,15 @@ function showHelp() {
24
24
  ║ molty.cash CLI ║
25
25
  ╚════════════════════════════════════════════════════════════╝
26
26
 
27
- Send USDC payments and manage gigs via molty.cash API
27
+ USDC payments, hiring, and gigs via molty.cash API
28
28
 
29
29
  COMMANDS:
30
- send <recipient> <amount> [--network <base|solana>]
31
- gig <subcommand>
30
+ human <tip|hire>
31
+ gig <subcommand>
32
32
 
33
- RECIPIENT FORMATS:
34
- moltbook/USERNAME Send to a Moltbook user
35
- x/USERNAME Send to an X (Twitter) user
36
-
37
- SEND EXAMPLES:
38
- moltycash send moltbook/KarpathyMolty 1¢
39
- moltycash send x/nikitabier 50¢
40
- moltycash send x/nikitabier 100¢ --network solana
33
+ HUMAN SUBCOMMANDS:
34
+ human tip <username> <amount> [--network <base|solana>]
35
+ human hire <username> "<description>" --amount <USDC> [--network <base|solana>]
41
36
 
42
37
  GIG SUBCOMMANDS:
43
38
  gig create "<description>" --price <USDC> [--quantity <n>] [--network <base|solana>] [--min-followers <n>] [--require-premium] [--min-account-age <days>]
@@ -50,11 +45,18 @@ GIG SUBCOMMANDS:
50
45
  gig picked List gigs you've picked
51
46
  gig dispute <gig_id> <assignment_id> ["reason"]
52
47
 
48
+ HUMAN TIP EXAMPLES:
49
+ moltycash human tip 0xmesuthere 50¢
50
+ moltycash human tip 0xmesuthere 100¢ --network solana
51
+
52
+ HUMAN HIRE EXAMPLES:
53
+ moltycash human hire 0xmesuthere "Write a tweet about our product" --amount 1
54
+ moltycash human hire 0xmesuthere "Review our landing page" --amount 5
55
+
53
56
  GIG EXAMPLES:
54
57
  moltycash gig create "Post about molty.cash" --price 0.1 --quantity 5
55
- moltycash gig create "Review our product" --price 2 --quantity 10 --min-followers 500 --require-premium
56
- moltycash gig created
57
- moltycash gig get ppp_123
58
+ moltycash gig list
59
+ moltycash gig pick ppp_123
58
60
 
59
61
  AMOUNT FORMATS:
60
62
  1¢ Cents notation (recommended)
@@ -69,7 +71,7 @@ OPTIONS:
69
71
  ENVIRONMENT VARIABLES:
70
72
  SVM_PRIVATE_KEY Your Solana private key
71
73
  EVM_PRIVATE_KEY Your Base/EVM private key
72
- MOLTY_IDENTITY_TOKEN Identity token (required for gig commands)
74
+ MOLTY_IDENTITY_TOKEN Identity token (required for gig and hire commands)
73
75
 
74
76
  If only one key is set, that network is used automatically.
75
77
  If both are set, you must specify --network.
@@ -104,9 +106,9 @@ function main() {
104
106
  process.exit(0);
105
107
  }
106
108
  const command = args[0];
107
- if (command === "send") {
109
+ if (command === "human") {
108
110
  const commandArgs = args.slice(1);
109
- runCommand("send.js", commandArgs);
111
+ runCommand("human.js", commandArgs);
110
112
  }
111
113
  else if (command === "gig") {
112
114
  const commandArgs = args.slice(1);
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import "dotenv/config";
2
+ //# sourceMappingURL=human.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human.d.ts","sourceRoot":"","sources":["../human.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
package/dist/human.js ADDED
@@ -0,0 +1,345 @@
1
+ import "dotenv/config";
2
+ import minimist from "minimist";
3
+ import axios from "axios";
4
+ import { privateKeyToAccount } from "viem/accounts";
5
+ import { x402Client } from "@x402/core/client";
6
+ import { registerExactEvmScheme } from "@x402/evm/exact/client";
7
+ import { registerExactSvmScheme } from "@x402/svm/exact/client";
8
+ import { createKeyPairSignerFromBytes } from "@solana/kit";
9
+ import bs58 from "bs58";
10
+ const privateKey = process.env.EVM_PRIVATE_KEY;
11
+ const svmPrivateKey = process.env.SVM_PRIVATE_KEY;
12
+ const baseURL = process.env.RESOURCE_SERVER_URL || "https://api.molty.cash";
13
+ const identityToken = process.env.MOLTY_IDENTITY_TOKEN;
14
+ const X402_EXTENSION_URI = "https://github.com/google-a2a/a2a-x402/v0.1";
15
+ // ─── Shared Utilities ────────────────────────────────────────
16
+ function parseAmount(amountStr) {
17
+ const trimmed = amountStr.trim();
18
+ if (trimmed.endsWith("¢")) {
19
+ const cents = parseFloat(trimmed.slice(0, -1));
20
+ if (isNaN(cents))
21
+ throw new Error(`Invalid cents amount: ${amountStr}`);
22
+ return cents / 100;
23
+ }
24
+ if (trimmed.startsWith("$")) {
25
+ const dollarPart = trimmed.slice(1);
26
+ if (/^\d+$/.test(dollarPart)) {
27
+ const dollars = parseInt(dollarPart, 10);
28
+ const cents = dollars * 100;
29
+ throw new Error(`Dollar amounts like $${dollars} can be interpreted as shell variables. Please use ${cents}¢ instead.`);
30
+ }
31
+ const dollars = parseFloat(dollarPart);
32
+ if (isNaN(dollars))
33
+ throw new Error(`Invalid dollar amount: ${amountStr}`);
34
+ return dollars;
35
+ }
36
+ const amount = parseFloat(trimmed);
37
+ if (isNaN(amount))
38
+ throw new Error(`Invalid amount: ${amountStr}`);
39
+ return amount;
40
+ }
41
+ async function setupNetwork(args) {
42
+ const hasEvmKey = !!privateKey;
43
+ const hasSvmKey = !!svmPrivateKey;
44
+ let useSolana;
45
+ if (args.network) {
46
+ if (!["base", "solana"].includes(args.network.toLowerCase())) {
47
+ console.error("Network must be either 'base' or 'solana'");
48
+ process.exit(1);
49
+ }
50
+ useSolana = args.network.toLowerCase() === "solana";
51
+ if (useSolana && !hasSvmKey) {
52
+ console.error("❌ Missing SVM_PRIVATE_KEY environment variable (needed for --network solana)");
53
+ process.exit(1);
54
+ }
55
+ if (!useSolana && !hasEvmKey) {
56
+ console.error("❌ Missing EVM_PRIVATE_KEY environment variable (needed for --network base)");
57
+ process.exit(1);
58
+ }
59
+ }
60
+ else {
61
+ if (hasEvmKey && hasSvmKey) {
62
+ console.error("❌ Both EVM_PRIVATE_KEY and SVM_PRIVATE_KEY are set");
63
+ console.error(" Please specify which network to use with --network <base|solana>");
64
+ process.exit(1);
65
+ }
66
+ else if (hasSvmKey) {
67
+ useSolana = true;
68
+ console.log("ℹ️ Auto-detected network: Solana");
69
+ }
70
+ else if (hasEvmKey) {
71
+ useSolana = false;
72
+ console.log("ℹ️ Auto-detected network: Base");
73
+ }
74
+ else {
75
+ console.error("❌ No private keys found");
76
+ console.error(" Set EVM_PRIVATE_KEY (for Base) or SVM_PRIVATE_KEY (for Solana)");
77
+ process.exit(1);
78
+ }
79
+ }
80
+ const client = new x402Client();
81
+ if (useSolana) {
82
+ console.log("\n🔧 Creating Solana signer...");
83
+ const privateKeyBytes = bs58.decode(svmPrivateKey);
84
+ const solanaSigner = await createKeyPairSignerFromBytes(privateKeyBytes);
85
+ console.log(`✅ Solana signer created: ${solanaSigner.address}`);
86
+ registerExactSvmScheme(client, { signer: solanaSigner });
87
+ }
88
+ else {
89
+ console.log("\n🔧 Creating Base signer...");
90
+ if (!privateKey.startsWith("0x")) {
91
+ console.error("❌ EVM_PRIVATE_KEY must start with '0x'");
92
+ process.exit(1);
93
+ }
94
+ const account = privateKeyToAccount(privateKey);
95
+ console.log(`✅ Base signer created: ${account.address}`);
96
+ registerExactEvmScheme(client, { signer: account });
97
+ }
98
+ return { useSolana: useSolana, client };
99
+ }
100
+ // ─── Tip Subcommand ──────────────────────────────────────────
101
+ async function handleTip(args) {
102
+ if (args._.length < 3) {
103
+ console.error("Usage: moltycash human tip <username> <amount> [--network <base|solana>]");
104
+ console.error("\nExamples:");
105
+ console.error(" moltycash human tip 0xmesuthere 50¢");
106
+ console.error(" moltycash human tip 0xmesuthere 100¢ --network solana");
107
+ console.error("\nAmount formats: 100¢ (cents - recommended), 0.5 (decimal)");
108
+ process.exit(1);
109
+ }
110
+ const username = String(args._[1]);
111
+ let amount;
112
+ try {
113
+ amount = parseAmount(String(args._[2]));
114
+ if (amount <= 0)
115
+ throw new Error("Amount must be greater than 0");
116
+ if (amount > 10)
117
+ throw new Error("Amount must be 10 USDC or less");
118
+ }
119
+ catch (error) {
120
+ console.error(`❌ ${error.message}`);
121
+ process.exit(1);
122
+ }
123
+ // Pre-flight: check if user has an agent on molty.cash
124
+ const agentCardUrl = `${baseURL}/${username}/.well-known/agent-card.json`;
125
+ try {
126
+ await axios.get(agentCardUrl);
127
+ }
128
+ catch (error) {
129
+ if (error.response?.status === 404) {
130
+ console.error(`\n❌ @${username} is not on molty.cash yet.\n`);
131
+ console.error(`Invite them to join so you can tip them USDC:`);
132
+ const tweetText = encodeURIComponent(`Hey @${username}, someone wants to tip you USDC! Sign up at https://molty.cash @moltycash`);
133
+ console.error(`\n https://x.com/intent/tweet?text=${tweetText}\n`);
134
+ process.exit(1);
135
+ }
136
+ // Other errors (network, etc.) — continue and let the tip call fail with a better error
137
+ }
138
+ const { useSolana, client } = await setupNetwork(args);
139
+ const tipEndpoint = `${baseURL}/${username}/a2a`;
140
+ console.log(`\n💸 Tipping @${username} ${amount} USDC...`);
141
+ console.log(` API: ${tipEndpoint}`);
142
+ console.log(` Network: ${useSolana ? "Solana" : "Base"}`);
143
+ if (identityToken)
144
+ console.log(` 🔐 Sending as verified sender`);
145
+ console.log();
146
+ const headers = {
147
+ "Content-Type": "application/json",
148
+ "X-A2A-Extensions": X402_EXTENSION_URI,
149
+ ...(identityToken && { "X-Molty-Identity-Token": identityToken }),
150
+ };
151
+ const tipParams = { amount };
152
+ // Phase 1: Get payment requirements
153
+ console.log("💳 Phase 1: Requesting payment requirements...");
154
+ const phase1Response = await axios.post(tipEndpoint, { jsonrpc: "2.0", id: 1, method: "tip", params: tipParams }, { headers });
155
+ if (phase1Response.data.error) {
156
+ throw new Error(phase1Response.data.error.message || "A2A request failed");
157
+ }
158
+ const phase1Result = phase1Response.data.result;
159
+ if (!phase1Result.id)
160
+ throw new Error("Missing task ID in response");
161
+ const paymentRequired = phase1Result.status?.message?.metadata?.["x402.payment.required"];
162
+ if (!paymentRequired)
163
+ throw new Error("No payment requirements found in response");
164
+ // Phase 2: Sign and submit payment
165
+ console.log("🔐 Phase 2: Signing payment...");
166
+ const signedPayment = await client.createPaymentPayload(paymentRequired);
167
+ console.log("📤 Submitting signed payment...\n");
168
+ const phase2Response = await axios.post(tipEndpoint, {
169
+ jsonrpc: "2.0",
170
+ id: 2,
171
+ method: "tip",
172
+ params: { ...tipParams, taskId: phase1Result.id, payment: signedPayment },
173
+ }, { headers });
174
+ if (phase2Response.data.error) {
175
+ throw new Error(phase2Response.data.error.message || "Payment failed");
176
+ }
177
+ const result = phase2Response.data.result;
178
+ const artifacts = result.artifacts || [];
179
+ for (const artifact of artifacts) {
180
+ if (artifact.data) {
181
+ try {
182
+ const data = JSON.parse(Buffer.from(artifact.data, "base64").toString());
183
+ console.log(`✅ ${data.amount || amount} USDC sent to @${username}`);
184
+ if (data.txn_id)
185
+ console.log(`🔗 TXN: ${data.txn_id}`);
186
+ if (data.network)
187
+ console.log(`💳 Network: ${data.network}`);
188
+ if (data.receipt)
189
+ console.log(`📄 Receipt: ${data.receipt}`);
190
+ return;
191
+ }
192
+ catch {
193
+ // ignore parse errors
194
+ }
195
+ }
196
+ }
197
+ const msg = result.status?.message?.parts
198
+ ?.filter((p) => p.kind === "text")
199
+ .map((p) => p.text)
200
+ .join("\n");
201
+ console.log(`✅ ${msg || `${amount} USDC sent to @${username}`}`);
202
+ }
203
+ // ─── Hire Subcommand ─────────────────────────────────────────
204
+ async function handleHire(args) {
205
+ if (args._.length < 3 || !args.amount) {
206
+ console.error('Usage: moltycash human hire <username> "<description>" --amount <USDC> [--network <base|solana>]');
207
+ console.error("\nExamples:");
208
+ console.error(' moltycash human hire 0xmesuthere "Write a tweet about our product" --amount 1');
209
+ console.error(' moltycash human hire 0xmesuthere "Review our landing page" --amount 5 --network solana');
210
+ process.exit(1);
211
+ }
212
+ const username = String(args._[1]);
213
+ const description = args._.slice(2).join(" ").trim();
214
+ let amount;
215
+ try {
216
+ amount = parseAmount(String(args.amount));
217
+ if (amount <= 0)
218
+ throw new Error("Amount must be greater than 0");
219
+ if (amount > 10)
220
+ throw new Error("Amount must be 10 USDC or less");
221
+ }
222
+ catch (error) {
223
+ console.error(`❌ ${error.message}`);
224
+ process.exit(1);
225
+ }
226
+ if (!description) {
227
+ console.error("❌ Description is required");
228
+ process.exit(1);
229
+ }
230
+ if (description.length > 500) {
231
+ console.error(`❌ Description too long (${description.length} chars). Max 500 characters.`);
232
+ process.exit(1);
233
+ }
234
+ const { useSolana, client } = await setupNetwork(args);
235
+ const hireEndpoint = `${baseURL}/${username}/a2a`;
236
+ console.log(`\n🎯 Hiring @${username} for ${amount} USDC...`);
237
+ console.log(` API: ${hireEndpoint}`);
238
+ console.log(` Network: ${useSolana ? "Solana" : "Base"}`);
239
+ console.log(` Task: ${description}`);
240
+ console.log();
241
+ const headers = {
242
+ "Content-Type": "application/json",
243
+ "X-A2A-Extensions": X402_EXTENSION_URI,
244
+ ...(identityToken && { "X-Molty-Identity-Token": identityToken }),
245
+ };
246
+ const hireParams = { description, amount };
247
+ // Phase 1: Get payment requirements
248
+ console.log("💳 Phase 1: Requesting payment requirements...");
249
+ const phase1Response = await axios.post(hireEndpoint, { jsonrpc: "2.0", id: 1, method: "hire", params: hireParams }, { headers });
250
+ if (phase1Response.data.error) {
251
+ throw new Error(phase1Response.data.error.message || "A2A request failed");
252
+ }
253
+ const phase1Result = phase1Response.data.result;
254
+ if (!phase1Result.id)
255
+ throw new Error("Missing task ID in response");
256
+ const paymentRequired = phase1Result.status?.message?.metadata?.["x402.payment.required"];
257
+ if (!paymentRequired)
258
+ throw new Error("No payment requirements found in response");
259
+ // Phase 2: Sign and submit payment
260
+ console.log("🔐 Phase 2: Signing payment...");
261
+ const signedPayment = await client.createPaymentPayload(paymentRequired);
262
+ console.log("📤 Submitting signed payment...\n");
263
+ const phase2Response = await axios.post(hireEndpoint, {
264
+ jsonrpc: "2.0",
265
+ id: 2,
266
+ method: "hire",
267
+ params: { ...hireParams, taskId: phase1Result.id, payment: signedPayment },
268
+ }, { headers });
269
+ if (phase2Response.data.error) {
270
+ throw new Error(phase2Response.data.error.message || "Hire failed");
271
+ }
272
+ const result = phase2Response.data.result;
273
+ // Try to extract details from artifacts
274
+ const artifacts = result.artifacts || [];
275
+ for (const artifact of artifacts) {
276
+ if (artifact.data) {
277
+ try {
278
+ const data = JSON.parse(Buffer.from(artifact.data, "base64").toString());
279
+ console.log(`✅ @${username} hired!`);
280
+ if (data.gig_id)
281
+ console.log(` Gig: ${data.gig_id}`);
282
+ if (data.assignment_id)
283
+ console.log(` Assignment: ${data.assignment_id}`);
284
+ console.log(` Profile: https://molty.cash/${username}`);
285
+ return;
286
+ }
287
+ catch {
288
+ // ignore
289
+ }
290
+ }
291
+ }
292
+ // Fallback: check for direct result fields
293
+ if (result.gig_id) {
294
+ console.log(`✅ @${username} hired!`);
295
+ console.log(` Gig: ${result.gig_id}`);
296
+ if (result.assignment_id)
297
+ console.log(` Assignment: ${result.assignment_id}`);
298
+ console.log(` Profile: https://molty.cash/${username}`);
299
+ return;
300
+ }
301
+ const msg = result.status?.message?.parts
302
+ ?.filter((p) => p.kind === "text")
303
+ .map((p) => p.text)
304
+ .join("\n");
305
+ console.log(`✅ ${msg || `@${username} hired`}`);
306
+ }
307
+ // ─── Main ────────────────────────────────────────────────────
308
+ const args = minimist(process.argv.slice(2));
309
+ const subcommand = args._[0];
310
+ if (!subcommand) {
311
+ console.error("Usage: moltycash human <tip|hire>");
312
+ console.error("\nSubcommands:");
313
+ console.error(" tip <username> <amount> Tip USDC to a user");
314
+ console.error(' hire <username> "<description>" --amount <USDC> Hire a user for a task');
315
+ console.error("\nExamples:");
316
+ console.error(" moltycash human tip 0xmesuthere 50¢");
317
+ console.error(' moltycash human hire 0xmesuthere "Write a tweet" --amount 1');
318
+ process.exit(1);
319
+ }
320
+ async function main() {
321
+ try {
322
+ switch (subcommand) {
323
+ case "tip":
324
+ await handleTip(args);
325
+ break;
326
+ case "hire":
327
+ await handleHire(args);
328
+ break;
329
+ default:
330
+ console.error(`❌ Unknown subcommand: ${subcommand}`);
331
+ console.error("Available: tip, hire");
332
+ process.exit(1);
333
+ }
334
+ }
335
+ catch (error) {
336
+ const errMsg = error.response?.data?.error?.message || error.response?.data?.msg || error.message;
337
+ console.error(`❌ ${errMsg || "Command failed"}`);
338
+ if (error.response) {
339
+ console.error(" Status:", error.response.status);
340
+ }
341
+ process.exit(1);
342
+ }
343
+ }
344
+ main();
345
+ //# sourceMappingURL=human.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"human.js","sourceRoot":"","sources":["../human.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "moltycash",
3
- "version": "2.4.2",
3
+ "version": "3.1.0",
4
4
  "description": "CLI tool for sending USDC payments and managing gigs via molty.cash using x402 protocol",
5
5
  "type": "module",
6
6
  "bin": {
package/dist/send.d.ts DELETED
@@ -1,2 +0,0 @@
1
- import "dotenv/config";
2
- //# sourceMappingURL=send.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../send.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,CAAC"}
package/dist/send.js DELETED
@@ -1,278 +0,0 @@
1
- import "dotenv/config";
2
- import minimist from "minimist";
3
- import axios from "axios";
4
- import { privateKeyToAccount } from "viem/accounts";
5
- import { x402Client } from "@x402/core/client";
6
- import { registerExactEvmScheme } from "@x402/evm/exact/client";
7
- import { registerExactSvmScheme } from "@x402/svm/exact/client";
8
- import { createKeyPairSignerFromBytes } from "@solana/kit";
9
- import bs58 from "bs58";
10
- const privateKey = process.env.EVM_PRIVATE_KEY;
11
- const svmPrivateKey = process.env.SVM_PRIVATE_KEY;
12
- const baseURL = process.env.RESOURCE_SERVER_URL || "https://api.molty.cash";
13
- const identityToken = process.env.MOLTY_IDENTITY_TOKEN;
14
- const X402_EXTENSION_URI = "https://github.com/google-a2a/a2a-x402/v0.1";
15
- /**
16
- * Parse amount from various formats:
17
- * - "50¢" -> 0.50
18
- * - "$0.5" or "$0.50" -> 0.50
19
- * - "0.5" -> 0.50
20
- */
21
- function parseAmount(amountStr) {
22
- const trimmed = amountStr.trim();
23
- // Handle cents notation (50¢)
24
- if (trimmed.endsWith("¢")) {
25
- const cents = parseFloat(trimmed.slice(0, -1));
26
- if (isNaN(cents)) {
27
- throw new Error(`Invalid cents amount: ${amountStr}`);
28
- }
29
- return cents / 100;
30
- }
31
- // Handle dollar notation ($0.5 or $0.50)
32
- if (trimmed.startsWith("$")) {
33
- const dollarPart = trimmed.slice(1);
34
- // Check if it looks like a shell positional parameter ($1, $2, $10, etc.)
35
- if (/^\d+$/.test(dollarPart)) {
36
- const dollars = parseInt(dollarPart, 10);
37
- const cents = dollars * 100;
38
- throw new Error(`Dollar amounts like $${dollars} can be interpreted as shell variables. Please use ${cents}¢ instead.`);
39
- }
40
- const dollars = parseFloat(dollarPart);
41
- if (isNaN(dollars)) {
42
- throw new Error(`Invalid dollar amount: ${amountStr}`);
43
- }
44
- return dollars;
45
- }
46
- // Handle plain decimal (0.5)
47
- const amount = parseFloat(trimmed);
48
- if (isNaN(amount)) {
49
- throw new Error(`Invalid amount: ${amountStr}`);
50
- }
51
- return amount;
52
- }
53
- function parseRecipient(input) {
54
- const slashIndex = input.indexOf("/");
55
- if (slashIndex === -1) {
56
- console.error(`❌ Invalid recipient format: ${input}`);
57
- console.error(`\nUse one of these formats:`);
58
- console.error(` moltbook/USERNAME Send to a Moltbook user`);
59
- console.error(` x/USERNAME Send to an X (Twitter) user`);
60
- console.error(`\nExamples:`);
61
- console.error(` moltycash send moltbook/KarpathyMolty 1¢`);
62
- console.error(` moltycash send x/nikitabier 50¢`);
63
- process.exit(1);
64
- }
65
- const platform = input.slice(0, slashIndex).toLowerCase();
66
- const username = input.slice(slashIndex + 1);
67
- if (!username) {
68
- throw new Error(`Missing username after "${platform}/"`);
69
- }
70
- const xPrefixes = ["x", "x.com", "twitter", "twitter.com"];
71
- const moltbookPrefixes = ["moltbook", "moltbook.com"];
72
- if (xPrefixes.includes(platform)) {
73
- return { type: "x", username };
74
- }
75
- if (moltbookPrefixes.includes(platform)) {
76
- if (!/^[a-zA-Z0-9_-]{1,30}$/.test(username)) {
77
- throw new Error(`Invalid moltbook username: ${username}. Must be 1-30 alphanumeric characters, underscores, or hyphens.`);
78
- }
79
- return { type: "moltbook", username };
80
- }
81
- throw new Error(`Unknown platform: "${platform}". Use "x/" for X users or "moltbook/" for Moltbook users.`);
82
- }
83
- const args = minimist(process.argv.slice(2));
84
- let recipient;
85
- let amount;
86
- if (args._.length < 2) {
87
- console.error("Usage: moltycash send <recipient> <amount> [--network <base|solana>]");
88
- console.error("\nRecipient formats:");
89
- console.error(" moltbook/USERNAME Send to a Moltbook user");
90
- console.error(" x/USERNAME Send to an X (Twitter) user");
91
- console.error("\nExamples:");
92
- console.error(" moltycash send moltbook/KarpathyMolty 1¢");
93
- console.error(" moltycash send x/nikitabier 50¢");
94
- console.error(" moltycash send x/nikitabier 100¢ --network solana");
95
- console.error("\nAmount formats: 100¢ (cents - recommended), 0.5 (decimal)");
96
- process.exit(1);
97
- }
98
- try {
99
- recipient = parseRecipient(String(args._[0]));
100
- amount = parseAmount(String(args._[1]));
101
- if (amount <= 0) {
102
- throw new Error("Amount must be greater than 0");
103
- }
104
- }
105
- catch (error) {
106
- console.error(`❌ ${error.message}`);
107
- process.exit(1);
108
- }
109
- // Check which private keys are available
110
- const hasEvmKey = !!privateKey;
111
- const hasSvmKey = !!svmPrivateKey;
112
- // Determine network based on provided arg or auto-detect
113
- let useSolana;
114
- const allowedNetworks = ["base", "solana"];
115
- if (args.network) {
116
- if (!allowedNetworks.includes(args.network.toLowerCase())) {
117
- console.error(`Network must be either 'base' or 'solana'`);
118
- process.exit(1);
119
- }
120
- useSolana = args.network.toLowerCase() === "solana";
121
- if (useSolana && !hasSvmKey) {
122
- console.error("❌ Missing SVM_PRIVATE_KEY environment variable (needed for --network solana)");
123
- process.exit(1);
124
- }
125
- if (!useSolana && !hasEvmKey) {
126
- console.error("❌ Missing EVM_PRIVATE_KEY environment variable (needed for --network base)");
127
- process.exit(1);
128
- }
129
- }
130
- else {
131
- // Auto-detect from available keys
132
- if (hasEvmKey && hasSvmKey) {
133
- console.error("❌ Both EVM_PRIVATE_KEY and SVM_PRIVATE_KEY are set");
134
- console.error(" Please specify which network to use with --network <base|solana>");
135
- process.exit(1);
136
- }
137
- else if (hasSvmKey) {
138
- useSolana = true;
139
- console.log("ℹ️ Auto-detected network: Solana");
140
- }
141
- else if (hasEvmKey) {
142
- useSolana = false;
143
- console.log("ℹ️ Auto-detected network: Base");
144
- }
145
- else {
146
- console.error("❌ No private keys found");
147
- console.error(" Set EVM_PRIVATE_KEY (for Base) or SVM_PRIVATE_KEY (for Solana)");
148
- process.exit(1);
149
- }
150
- }
151
- async function main() {
152
- // Create x402 client
153
- const client = new x402Client();
154
- if (useSolana) {
155
- console.log("\n🔧 Creating Solana signer...");
156
- const privateKeyBytes = bs58.decode(svmPrivateKey);
157
- const solanaSigner = await createKeyPairSignerFromBytes(privateKeyBytes);
158
- console.log(`✅ Solana signer created: ${solanaSigner.address}`);
159
- registerExactSvmScheme(client, { signer: solanaSigner });
160
- }
161
- else {
162
- console.log("\n🔧 Creating Base signer...");
163
- if (!privateKey.startsWith("0x")) {
164
- console.error("❌ EVM_PRIVATE_KEY must start with '0x'");
165
- process.exit(1);
166
- }
167
- const account = privateKeyToAccount(privateKey);
168
- console.log(`✅ Base signer created: ${account.address}`);
169
- registerExactEvmScheme(client, { signer: account });
170
- }
171
- const recipientLabel = recipient.type === "moltbook"
172
- ? `@${recipient.username}`
173
- : `x/@${recipient.username}`;
174
- console.log(`\n💸 Sending ${amount} USDC to ${recipientLabel}...`);
175
- console.log(` API: ${baseURL}/a2a`);
176
- console.log(` Network: ${useSolana ? "Solana" : "Base"}`);
177
- if (identityToken) {
178
- console.log(` 🔐 Sending as verified sender`);
179
- }
180
- console.log();
181
- const headers = {
182
- "Content-Type": "application/json",
183
- "X-A2A-Extensions": X402_EXTENSION_URI,
184
- ...(identityToken && { "X-Molty-Identity-Token": identityToken }),
185
- };
186
- const payParams = {
187
- ...(recipient.type === "moltbook" && { molty: recipient.username }),
188
- ...(recipient.type === "x" && { x_handle: recipient.username }),
189
- amount,
190
- description: `Payment via moltycash-cli (${useSolana ? "Solana" : "Base"})`,
191
- meta: { agent_name: "moltycash-cli" },
192
- };
193
- try {
194
- // Phase 1: Get payment requirements
195
- console.log("💳 Phase 1: Requesting payment requirements...");
196
- const phase1Response = await axios.post(`${baseURL}/a2a`, {
197
- jsonrpc: "2.0",
198
- id: 1,
199
- method: "molty.send",
200
- params: payParams,
201
- }, { headers });
202
- if (phase1Response.data.error) {
203
- throw new Error(phase1Response.data.error.message || "A2A request failed");
204
- }
205
- const phase1Result = phase1Response.data.result;
206
- if (!phase1Result.id) {
207
- throw new Error("Missing task ID in response");
208
- }
209
- const paymentRequired = phase1Result.status?.message?.metadata?.["x402.payment.required"];
210
- if (!paymentRequired) {
211
- throw new Error("No payment requirements found in response");
212
- }
213
- // Phase 2: Sign and submit payment
214
- console.log("🔐 Phase 2: Signing payment...");
215
- const signedPayment = await client.createPaymentPayload(paymentRequired);
216
- console.log("📤 Submitting signed payment...\n");
217
- const phase2Response = await axios.post(`${baseURL}/a2a`, {
218
- jsonrpc: "2.0",
219
- id: 2,
220
- method: "molty.send",
221
- params: {
222
- ...payParams,
223
- taskId: phase1Result.id,
224
- payment: signedPayment,
225
- },
226
- }, { headers });
227
- if (phase2Response.data.error) {
228
- throw new Error(phase2Response.data.error.message || "Payment failed");
229
- }
230
- const result = phase2Response.data.result;
231
- // Extract details from task artifacts
232
- const artifacts = result.artifacts || [];
233
- for (const artifact of artifacts) {
234
- if (artifact.data) {
235
- try {
236
- const data = JSON.parse(Buffer.from(artifact.data, "base64").toString());
237
- const displayName = data.molty ? `@${data.molty}` : data.x_handle ? `x/@${data.x_handle}` : recipientLabel;
238
- console.log(`✅ ${data.amount} USDC sent to ${displayName}`);
239
- if (data.txn_id) {
240
- console.log(`🔗 TXN: ${data.txn_id}`);
241
- }
242
- if (data.network) {
243
- console.log(`💳 Network: ${data.network}`);
244
- }
245
- if (data.receipt) {
246
- console.log(`📄 Receipt: ${data.receipt}`);
247
- }
248
- if (data.x_handle) {
249
- console.log(`🐦 X: @${data.x_handle}`);
250
- }
251
- return;
252
- }
253
- catch {
254
- // ignore parse errors
255
- }
256
- }
257
- }
258
- // Fallback: print status message
259
- const msg = result.status?.message?.parts
260
- ?.filter((p) => p.kind === "text")
261
- .map((p) => p.text)
262
- .join("\n");
263
- console.log(`✅ ${msg || "Payment sent"}`);
264
- }
265
- catch (error) {
266
- const errMsg = error.response?.data?.error?.message || error.response?.data?.msg || error.message;
267
- console.error(`❌ ${errMsg || "Payment failed"}`);
268
- if (error.response) {
269
- console.error(" Status:", error.response.status);
270
- }
271
- else if (error.message && !errMsg) {
272
- console.error(" Error:", error.message);
273
- }
274
- process.exit(1);
275
- }
276
- }
277
- main();
278
- //# sourceMappingURL=send.js.map
package/dist/send.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"send.js","sourceRoot":"","sources":["../send.ts"],"names":[],"mappings":"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"}