@paylobster/cli 4.0.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.
Files changed (89) hide show
  1. package/BUILD_SUMMARY.md +429 -0
  2. package/CHANGELOG.md +78 -0
  3. package/CONTRIBUTING.md +368 -0
  4. package/EXAMPLES.md +432 -0
  5. package/LICENSE +21 -0
  6. package/QUICKSTART.md +189 -0
  7. package/README.md +377 -0
  8. package/TEST_REPORT.md +191 -0
  9. package/bin/plob.js +9 -0
  10. package/bin/plob.ts +9 -0
  11. package/demo.sh +154 -0
  12. package/dist/bin/plob.d.ts +7 -0
  13. package/dist/bin/plob.d.ts.map +1 -0
  14. package/dist/bin/plob.js +10 -0
  15. package/dist/bin/plob.js.map +1 -0
  16. package/dist/src/commands/auth.d.ts +3 -0
  17. package/dist/src/commands/auth.d.ts.map +1 -0
  18. package/dist/src/commands/auth.js +75 -0
  19. package/dist/src/commands/auth.js.map +1 -0
  20. package/dist/src/commands/config.d.ts +3 -0
  21. package/dist/src/commands/config.d.ts.map +1 -0
  22. package/dist/src/commands/config.js +79 -0
  23. package/dist/src/commands/config.js.map +1 -0
  24. package/dist/src/commands/escrow.d.ts +3 -0
  25. package/dist/src/commands/escrow.d.ts.map +1 -0
  26. package/dist/src/commands/escrow.js +193 -0
  27. package/dist/src/commands/escrow.js.map +1 -0
  28. package/dist/src/commands/mandate.d.ts +8 -0
  29. package/dist/src/commands/mandate.d.ts.map +1 -0
  30. package/dist/src/commands/mandate.js +54 -0
  31. package/dist/src/commands/mandate.js.map +1 -0
  32. package/dist/src/commands/pay.d.ts +6 -0
  33. package/dist/src/commands/pay.d.ts.map +1 -0
  34. package/dist/src/commands/pay.js +77 -0
  35. package/dist/src/commands/pay.js.map +1 -0
  36. package/dist/src/commands/register.d.ts +3 -0
  37. package/dist/src/commands/register.d.ts.map +1 -0
  38. package/dist/src/commands/register.js +51 -0
  39. package/dist/src/commands/register.js.map +1 -0
  40. package/dist/src/commands/reputation.d.ts +3 -0
  41. package/dist/src/commands/reputation.d.ts.map +1 -0
  42. package/dist/src/commands/reputation.js +116 -0
  43. package/dist/src/commands/reputation.js.map +1 -0
  44. package/dist/src/commands/status.d.ts +3 -0
  45. package/dist/src/commands/status.d.ts.map +1 -0
  46. package/dist/src/commands/status.js +82 -0
  47. package/dist/src/commands/status.js.map +1 -0
  48. package/dist/src/index.d.ts +3 -0
  49. package/dist/src/index.d.ts.map +1 -0
  50. package/dist/src/index.js +59 -0
  51. package/dist/src/index.js.map +1 -0
  52. package/dist/src/lib/config.d.ts +26 -0
  53. package/dist/src/lib/config.d.ts.map +1 -0
  54. package/dist/src/lib/config.js +91 -0
  55. package/dist/src/lib/config.js.map +1 -0
  56. package/dist/src/lib/contracts.d.ts +18798 -0
  57. package/dist/src/lib/contracts.d.ts.map +1 -0
  58. package/dist/src/lib/contracts.js +361 -0
  59. package/dist/src/lib/contracts.js.map +1 -0
  60. package/dist/src/lib/display.d.ts +83 -0
  61. package/dist/src/lib/display.d.ts.map +1 -0
  62. package/dist/src/lib/display.js +293 -0
  63. package/dist/src/lib/display.js.map +1 -0
  64. package/dist/src/lib/types.d.ts +49 -0
  65. package/dist/src/lib/types.d.ts.map +1 -0
  66. package/dist/src/lib/types.js +3 -0
  67. package/dist/src/lib/types.js.map +1 -0
  68. package/dist/src/lib/wallet.d.ts +30 -0
  69. package/dist/src/lib/wallet.d.ts.map +1 -0
  70. package/dist/src/lib/wallet.js +143 -0
  71. package/dist/src/lib/wallet.js.map +1 -0
  72. package/jest.config.js +15 -0
  73. package/package.json +55 -0
  74. package/src/__tests__/cli.test.ts +38 -0
  75. package/src/commands/auth.ts +75 -0
  76. package/src/commands/config.ts +84 -0
  77. package/src/commands/escrow.ts +222 -0
  78. package/src/commands/mandate.ts +56 -0
  79. package/src/commands/pay.ts +96 -0
  80. package/src/commands/register.ts +57 -0
  81. package/src/commands/reputation.ts +84 -0
  82. package/src/commands/status.ts +91 -0
  83. package/src/index.ts +63 -0
  84. package/src/lib/config.ts +90 -0
  85. package/src/lib/contracts.ts +392 -0
  86. package/src/lib/display.ts +265 -0
  87. package/src/lib/types.ts +57 -0
  88. package/src/lib/wallet.ts +146 -0
  89. package/tsconfig.json +21 -0
@@ -0,0 +1,293 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.outputJSON = outputJSON;
40
+ exports.success = success;
41
+ exports.error = error;
42
+ exports.warning = warning;
43
+ exports.info = info;
44
+ exports.header = header;
45
+ exports.createTable = createTable;
46
+ exports.printKeyValue = printKeyValue;
47
+ exports.formatAddress = formatAddress;
48
+ exports.formatStatus = formatStatus;
49
+ exports.formatBoolean = formatBoolean;
50
+ exports.formatNumber = formatNumber;
51
+ exports.divider = divider;
52
+ exports.printAgentHeader = printAgentHeader;
53
+ exports.printEscrowTable = printEscrowTable;
54
+ exports.withSpinner = withSpinner;
55
+ exports.formatNetwork = formatNetwork;
56
+ exports.printConfig = printConfig;
57
+ exports.printReputation = printReputation;
58
+ exports.confirm = confirm;
59
+ const chalk_1 = __importDefault(require("chalk"));
60
+ const cli_table3_1 = __importDefault(require("cli-table3"));
61
+ /**
62
+ * Print JSON output if --json flag is set
63
+ */
64
+ function outputJSON(data, options) {
65
+ if (options?.json) {
66
+ console.log(JSON.stringify(data, null, 2));
67
+ return true;
68
+ }
69
+ return false;
70
+ }
71
+ /**
72
+ * Print success message
73
+ */
74
+ function success(message) {
75
+ console.log(chalk_1.default.green('✅ ' + message));
76
+ }
77
+ /**
78
+ * Print error message
79
+ */
80
+ function error(message) {
81
+ console.error(chalk_1.default.red('❌ ' + message));
82
+ }
83
+ /**
84
+ * Print warning message
85
+ */
86
+ function warning(message) {
87
+ console.warn(chalk_1.default.yellow('⚠️ ' + message));
88
+ }
89
+ /**
90
+ * Print info message
91
+ */
92
+ function info(message) {
93
+ console.log(chalk_1.default.blue('ℹ️ ' + message));
94
+ }
95
+ /**
96
+ * Print section header
97
+ */
98
+ function header(text) {
99
+ console.log();
100
+ console.log(chalk_1.default.bold.cyan('🦞 ' + text));
101
+ console.log(chalk_1.default.gray('─'.repeat(text.length + 3)));
102
+ }
103
+ /**
104
+ * Create a table
105
+ */
106
+ function createTable(options) {
107
+ return new cli_table3_1.default({
108
+ chars: {
109
+ top: '─',
110
+ 'top-mid': '┬',
111
+ 'top-left': '┌',
112
+ 'top-right': '┐',
113
+ bottom: '─',
114
+ 'bottom-mid': '┴',
115
+ 'bottom-left': '└',
116
+ 'bottom-right': '┘',
117
+ left: '│',
118
+ 'left-mid': '├',
119
+ mid: '─',
120
+ 'mid-mid': '┼',
121
+ right: '│',
122
+ 'right-mid': '┤',
123
+ middle: '│',
124
+ },
125
+ style: {
126
+ head: ['cyan', 'bold'],
127
+ border: ['gray'],
128
+ },
129
+ ...options,
130
+ });
131
+ }
132
+ /**
133
+ * Print key-value pairs
134
+ */
135
+ function printKeyValue(data) {
136
+ const maxKeyLength = Math.max(...Object.keys(data).map(k => k.length));
137
+ for (const [key, value] of Object.entries(data)) {
138
+ const paddedKey = key.padEnd(maxKeyLength);
139
+ console.log(chalk_1.default.gray(paddedKey + ':'), chalk_1.default.white(value));
140
+ }
141
+ }
142
+ /**
143
+ * Format address (shorten)
144
+ */
145
+ function formatAddress(address) {
146
+ return `${address.slice(0, 6)}...${address.slice(-4)}`;
147
+ }
148
+ /**
149
+ * Format status with color
150
+ */
151
+ function formatStatus(status) {
152
+ const statusMap = {
153
+ 0: { text: 'Pending', color: chalk_1.default.yellow },
154
+ 1: { text: 'Active', color: chalk_1.default.blue },
155
+ 2: { text: 'Released', color: chalk_1.default.green },
156
+ 3: { text: 'Disputed', color: chalk_1.default.red },
157
+ pending: { text: 'Pending', color: chalk_1.default.yellow },
158
+ active: { text: 'Active', color: chalk_1.default.blue },
159
+ released: { text: 'Released', color: chalk_1.default.green },
160
+ disputed: { text: 'Disputed', color: chalk_1.default.red },
161
+ };
162
+ const statusKey = status.toString();
163
+ const statusInfo = statusMap[statusKey] || { text: status.toString(), color: chalk_1.default.white };
164
+ return statusInfo.color(statusInfo.text);
165
+ }
166
+ /**
167
+ * Format boolean as emoji
168
+ */
169
+ function formatBoolean(value) {
170
+ return value ? chalk_1.default.green('✅') : chalk_1.default.red('❌');
171
+ }
172
+ /**
173
+ * Format number with commas
174
+ */
175
+ function formatNumber(num) {
176
+ return Number(num).toLocaleString();
177
+ }
178
+ /**
179
+ * Print a horizontal divider
180
+ */
181
+ function divider() {
182
+ console.log(chalk_1.default.gray('─'.repeat(50)));
183
+ }
184
+ /**
185
+ * Print agent status header
186
+ */
187
+ function printAgentHeader(name, address) {
188
+ console.log();
189
+ console.log(chalk_1.default.bold.cyan('🦞 PayLobster Agent Status'));
190
+ divider();
191
+ console.log(chalk_1.default.gray('Name: ') + chalk_1.default.white.bold(name));
192
+ console.log(chalk_1.default.gray('Address: ') + chalk_1.default.white(address));
193
+ divider();
194
+ }
195
+ /**
196
+ * Print escrow table
197
+ */
198
+ function printEscrowTable(escrows) {
199
+ if (escrows.length === 0) {
200
+ info('No escrows found');
201
+ return;
202
+ }
203
+ const table = createTable({
204
+ head: ['ID', 'From', 'To', 'Amount', 'Status'],
205
+ });
206
+ for (const escrow of escrows) {
207
+ table.push([
208
+ escrow.id,
209
+ formatAddress(escrow.from),
210
+ formatAddress(escrow.to),
211
+ escrow.amount,
212
+ formatStatus(escrow.status),
213
+ ]);
214
+ }
215
+ console.log(table.toString());
216
+ }
217
+ /**
218
+ * Spinner/loading indicator using ora
219
+ */
220
+ async function withSpinner(text, fn) {
221
+ const ora = (await Promise.resolve().then(() => __importStar(require('ora')))).default;
222
+ const spinner = ora(text).start();
223
+ try {
224
+ const result = await fn();
225
+ spinner.succeed();
226
+ return result;
227
+ }
228
+ catch (error) {
229
+ spinner.fail();
230
+ throw error;
231
+ }
232
+ }
233
+ /**
234
+ * Format network name
235
+ */
236
+ function formatNetwork(network) {
237
+ const networkMap = {
238
+ mainnet: 'Base Mainnet',
239
+ sepolia: 'Base Sepolia',
240
+ };
241
+ return networkMap[network] || network;
242
+ }
243
+ /**
244
+ * Print configuration table
245
+ */
246
+ function printConfig(config) {
247
+ const table = createTable({
248
+ head: ['Setting', 'Value'],
249
+ });
250
+ for (const [key, value] of Object.entries(config)) {
251
+ if (key === 'wallet' && typeof value === 'object') {
252
+ table.push([key, value.type || 'env']);
253
+ }
254
+ else {
255
+ table.push([key, value?.toString() || 'not set']);
256
+ }
257
+ }
258
+ console.log(table.toString());
259
+ }
260
+ /**
261
+ * Print reputation score with visual indicator
262
+ */
263
+ function printReputation(score) {
264
+ const stars = Math.floor(score / 20); // Convert 0-100 to 0-5 stars
265
+ const fullStar = '★';
266
+ const emptyStar = '☆';
267
+ const starsStr = fullStar.repeat(stars) + emptyStar.repeat(5 - stars);
268
+ if (score >= 80) {
269
+ return chalk_1.default.green(starsStr + ` ${score}`);
270
+ }
271
+ else if (score >= 60) {
272
+ return chalk_1.default.yellow(starsStr + ` ${score}`);
273
+ }
274
+ else {
275
+ return chalk_1.default.red(starsStr + ` ${score}`);
276
+ }
277
+ }
278
+ /**
279
+ * Confirm action (simple yes/no prompt)
280
+ */
281
+ async function confirm(message) {
282
+ const inquirer = (await Promise.resolve().then(() => __importStar(require('inquirer')))).default;
283
+ const { confirmed } = await inquirer.prompt([
284
+ {
285
+ type: 'confirm',
286
+ name: 'confirmed',
287
+ message,
288
+ default: false,
289
+ },
290
+ ]);
291
+ return confirmed;
292
+ }
293
+ //# sourceMappingURL=display.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../../src/lib/display.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import type { Address } from 'viem';
2
+ export type Network = 'mainnet' | 'sepolia';
3
+ export interface CLIConfig {
4
+ network: Network;
5
+ rpcUrl?: string;
6
+ wallet?: {
7
+ type: 'private-key' | 'keystore' | 'env';
8
+ path?: string;
9
+ };
10
+ indexerUrl?: string;
11
+ }
12
+ export interface AgentInfo {
13
+ name: string;
14
+ tokenId: bigint;
15
+ registered: boolean;
16
+ address: Address;
17
+ }
18
+ export interface Reputation {
19
+ score: bigint;
20
+ trustVector: bigint;
21
+ }
22
+ export interface CreditStatus {
23
+ limit: bigint;
24
+ available: bigint;
25
+ inUse: bigint;
26
+ }
27
+ export interface EscrowInfo {
28
+ sender: Address;
29
+ recipient: Address;
30
+ amount: bigint;
31
+ token: Address;
32
+ status: number;
33
+ }
34
+ export interface Balance {
35
+ usdc: bigint;
36
+ eth: bigint;
37
+ }
38
+ export interface ServiceListing {
39
+ serviceId: string;
40
+ provider: Address;
41
+ name: string;
42
+ category: string;
43
+ price: bigint;
44
+ reputation: number;
45
+ }
46
+ export interface OutputOptions {
47
+ json?: boolean;
48
+ }
49
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAEpC,MAAM,MAAM,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;AAE5C,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,aAAa,GAAG,UAAU,GAAG,KAAK,CAAC;QACzC,IAAI,CAAC,EAAE,MAAM,CAAC;KACf,CAAC;IACF,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,OAAO,CAAC;IACpB,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,OAAO,CAAC;IAChB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,30 @@
1
+ import { type WalletClient, type Account } from 'viem';
2
+ /**
3
+ * Load wallet from configured source
4
+ */
5
+ export declare function loadWallet(): Promise<{
6
+ client: WalletClient;
7
+ account: Account;
8
+ }>;
9
+ /**
10
+ * Save private key to keystore (encrypted)
11
+ * Note: For production, use a proper keystore with password encryption
12
+ */
13
+ export declare function saveToKeystore(privateKey: string, filename?: string): string;
14
+ /**
15
+ * Load private key from keystore
16
+ */
17
+ export declare function loadFromKeystore(filename: string): `0x${string}`;
18
+ /**
19
+ * Delete keystore file
20
+ */
21
+ export declare function deleteKeystore(filename: string): void;
22
+ /**
23
+ * List all keystore files
24
+ */
25
+ export declare function listKeystores(): string[];
26
+ /**
27
+ * Get wallet address without loading full client
28
+ */
29
+ export declare function getWalletAddress(): string;
30
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../../src/lib/wallet.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,YAAY,EAAE,KAAK,OAAO,EAAE,MAAM,MAAM,CAAC;AAQjF;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC;IAAE,MAAM,EAAE,YAAY,CAAC;IAAC,OAAO,EAAE,OAAO,CAAA;CAAE,CAAC,CAsCtF;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAgB5E;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,MAAM,EAAE,CAmBhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAKrD;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,EAAE,CAKxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAsBzC"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.loadWallet = loadWallet;
7
+ exports.saveToKeystore = saveToKeystore;
8
+ exports.loadFromKeystore = loadFromKeystore;
9
+ exports.deleteKeystore = deleteKeystore;
10
+ exports.listKeystores = listKeystores;
11
+ exports.getWalletAddress = getWalletAddress;
12
+ const fs_1 = __importDefault(require("fs"));
13
+ const path_1 = __importDefault(require("path"));
14
+ const os_1 = __importDefault(require("os"));
15
+ const viem_1 = require("viem");
16
+ const accounts_1 = require("viem/accounts");
17
+ const chains_1 = require("viem/chains");
18
+ const config_1 = require("./config");
19
+ const KEYSTORE_DIR = path_1.default.join(os_1.default.homedir(), '.plob', 'keystore');
20
+ /**
21
+ * Load wallet from configured source
22
+ */
23
+ async function loadWallet() {
24
+ const config = (0, config_1.loadConfig)();
25
+ const network = config.network;
26
+ const chain = network === 'mainnet' ? chains_1.base : chains_1.baseSepolia;
27
+ let privateKey;
28
+ // Try different sources in order:
29
+ // 1. Environment variable PRIVATE_KEY or PAYLOBSTER_PRIVATE_KEY
30
+ // 2. Keystore file
31
+ // 3. Config file (not recommended for production)
32
+ if (process.env.PRIVATE_KEY) {
33
+ privateKey = process.env.PRIVATE_KEY;
34
+ }
35
+ else if (process.env.PAYLOBSTER_PRIVATE_KEY) {
36
+ privateKey = process.env.PAYLOBSTER_PRIVATE_KEY;
37
+ }
38
+ else if (config.wallet?.type === 'keystore' && config.wallet.path) {
39
+ privateKey = loadFromKeystore(config.wallet.path);
40
+ }
41
+ else {
42
+ throw new Error('No wallet configured. Run `plob auth --private-key <key>` or set PRIVATE_KEY env var');
43
+ }
44
+ // Validate private key format
45
+ if (!privateKey.startsWith('0x') || privateKey.length !== 66) {
46
+ throw new Error('Invalid private key format. Must be 0x-prefixed 64-character hex string');
47
+ }
48
+ const account = (0, accounts_1.privateKeyToAccount)(privateKey);
49
+ const client = (0, viem_1.createWalletClient)({
50
+ account,
51
+ chain,
52
+ transport: (0, viem_1.http)((0, config_1.getRpcUrl)(network)),
53
+ });
54
+ return { client, account };
55
+ }
56
+ /**
57
+ * Save private key to keystore (encrypted)
58
+ * Note: For production, use a proper keystore with password encryption
59
+ */
60
+ function saveToKeystore(privateKey, filename) {
61
+ try {
62
+ if (!fs_1.default.existsSync(KEYSTORE_DIR)) {
63
+ fs_1.default.mkdirSync(KEYSTORE_DIR, { recursive: true, mode: 0o700 });
64
+ }
65
+ const keystoreFile = filename || 'default.key';
66
+ const keystorePath = path_1.default.join(KEYSTORE_DIR, keystoreFile);
67
+ // WARNING: This is a simple file storage. For production, use proper encryption!
68
+ fs_1.default.writeFileSync(keystorePath, privateKey, { mode: 0o600 });
69
+ return keystorePath;
70
+ }
71
+ catch (error) {
72
+ throw new Error(`Failed to save keystore: ${error}`);
73
+ }
74
+ }
75
+ /**
76
+ * Load private key from keystore
77
+ */
78
+ function loadFromKeystore(filename) {
79
+ try {
80
+ let keystorePath;
81
+ if (path_1.default.isAbsolute(filename)) {
82
+ keystorePath = filename;
83
+ }
84
+ else {
85
+ keystorePath = path_1.default.join(KEYSTORE_DIR, filename);
86
+ }
87
+ if (!fs_1.default.existsSync(keystorePath)) {
88
+ throw new Error(`Keystore file not found: ${keystorePath}`);
89
+ }
90
+ const privateKey = fs_1.default.readFileSync(keystorePath, 'utf-8').trim();
91
+ return privateKey;
92
+ }
93
+ catch (error) {
94
+ throw new Error(`Failed to load keystore: ${error}`);
95
+ }
96
+ }
97
+ /**
98
+ * Delete keystore file
99
+ */
100
+ function deleteKeystore(filename) {
101
+ const keystorePath = path_1.default.join(KEYSTORE_DIR, filename);
102
+ if (fs_1.default.existsSync(keystorePath)) {
103
+ fs_1.default.unlinkSync(keystorePath);
104
+ }
105
+ }
106
+ /**
107
+ * List all keystore files
108
+ */
109
+ function listKeystores() {
110
+ if (!fs_1.default.existsSync(KEYSTORE_DIR)) {
111
+ return [];
112
+ }
113
+ return fs_1.default.readdirSync(KEYSTORE_DIR).filter(file => file.endsWith('.key'));
114
+ }
115
+ /**
116
+ * Get wallet address without loading full client
117
+ */
118
+ function getWalletAddress() {
119
+ try {
120
+ let privateKey;
121
+ if (process.env.PRIVATE_KEY) {
122
+ privateKey = process.env.PRIVATE_KEY;
123
+ }
124
+ else if (process.env.PAYLOBSTER_PRIVATE_KEY) {
125
+ privateKey = process.env.PAYLOBSTER_PRIVATE_KEY;
126
+ }
127
+ else {
128
+ const config = (0, config_1.loadConfig)();
129
+ if (config.wallet?.type === 'keystore' && config.wallet.path) {
130
+ privateKey = loadFromKeystore(config.wallet.path);
131
+ }
132
+ else {
133
+ throw new Error('No wallet configured');
134
+ }
135
+ }
136
+ const account = (0, accounts_1.privateKeyToAccount)(privateKey);
137
+ return account.address;
138
+ }
139
+ catch (error) {
140
+ throw new Error(`Failed to get wallet address: ${error}`);
141
+ }
142
+ }
143
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../../src/lib/wallet.ts"],"names":[],"mappings":"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"}
package/jest.config.js ADDED
@@ -0,0 +1,15 @@
1
+ module.exports = {
2
+ preset: 'ts-jest',
3
+ testEnvironment: 'node',
4
+ roots: ['<rootDir>/src'],
5
+ testMatch: ['**/__tests__/**/*.test.ts'],
6
+ collectCoverageFrom: [
7
+ 'src/**/*.ts',
8
+ '!src/**/*.test.ts',
9
+ '!src/__tests__/**',
10
+ ],
11
+ moduleFileExtensions: ['ts', 'js', 'json'],
12
+ transform: {
13
+ '^.+\\.ts$': 'ts-jest',
14
+ },
15
+ };
package/package.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "name": "@paylobster/cli",
3
+ "version": "4.0.0",
4
+ "description": "PayLobster command-line interface for agent payments and service discovery",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "bin": {
8
+ "plob": "./bin/plob.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx bin/plob.ts",
13
+ "test": "jest",
14
+ "prepublishOnly": "npm run build",
15
+ "link": "npm run build && npm link"
16
+ },
17
+ "keywords": [
18
+ "paylobster",
19
+ "cli",
20
+ "payments",
21
+ "ai-agents",
22
+ "usdc",
23
+ "escrow",
24
+ "base",
25
+ "blockchain"
26
+ ],
27
+ "author": "PayLobster Team",
28
+ "license": "MIT",
29
+ "dependencies": {
30
+ "chalk": "^4.1.2",
31
+ "cli-table3": "^0.6.3",
32
+ "commander": "^11.1.0",
33
+ "viem": "^2.7.0",
34
+ "ora": "^5.4.1",
35
+ "inquirer": "^8.2.5",
36
+ "dotenv": "^16.4.1"
37
+ },
38
+ "devDependencies": {
39
+ "@types/inquirer": "^9.0.7",
40
+ "@types/node": "^20.11.0",
41
+ "tsx": "^4.7.0",
42
+ "typescript": "^5.3.3",
43
+ "jest": "^29.7.0",
44
+ "@types/jest": "^29.5.11"
45
+ },
46
+ "engines": {
47
+ "node": ">=18.0.0"
48
+ },
49
+ "repository": {
50
+ "type": "git",
51
+ "url": "https://github.com/itsGustav/Pay-Lobster.git",
52
+ "directory": "cli"
53
+ },
54
+ "homepage": "https://paylobster.com"
55
+ }
@@ -0,0 +1,38 @@
1
+ import { describe, test, expect } from '@jest/globals';
2
+ import { formatAddress } from '../lib/display';
3
+ import { formatUSDC, formatETH } from '../lib/contracts';
4
+
5
+ describe('Display utilities', () => {
6
+ test('formatAddress shortens addresses correctly', () => {
7
+ const address = '0x742d35Cc6634C0532925a3b844Bc9e7595f0bEb';
8
+ const formatted = formatAddress(address);
9
+ expect(formatted).toBe('0x742d...0bEb');
10
+ });
11
+ });
12
+
13
+ describe('Contract utilities', () => {
14
+ test('formatUSDC formats amounts correctly', () => {
15
+ const amount = BigInt('1000000'); // 1 USDC (6 decimals)
16
+ const formatted = formatUSDC(amount);
17
+ expect(formatted).toBe('1');
18
+ });
19
+
20
+ test('formatETH formats amounts correctly', () => {
21
+ const amount = BigInt('1000000000000000000'); // 1 ETH (18 decimals)
22
+ const formatted = formatETH(amount);
23
+ expect(formatted).toBe('1');
24
+ });
25
+ });
26
+
27
+ describe('Config management', () => {
28
+ test('default config has sepolia network', () => {
29
+ // This would require mocking fs, so skipping for now
30
+ expect(true).toBe(true);
31
+ });
32
+ });
33
+
34
+ // Note: Full integration tests would require:
35
+ // - Mocking wallet provider
36
+ // - Mocking blockchain calls
37
+ // - Test fixtures for contract responses
38
+ // These should be added in a comprehensive test suite