@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.
- package/BUILD_SUMMARY.md +429 -0
- package/CHANGELOG.md +78 -0
- package/CONTRIBUTING.md +368 -0
- package/EXAMPLES.md +432 -0
- package/LICENSE +21 -0
- package/QUICKSTART.md +189 -0
- package/README.md +377 -0
- package/TEST_REPORT.md +191 -0
- package/bin/plob.js +9 -0
- package/bin/plob.ts +9 -0
- package/demo.sh +154 -0
- package/dist/bin/plob.d.ts +7 -0
- package/dist/bin/plob.d.ts.map +1 -0
- package/dist/bin/plob.js +10 -0
- package/dist/bin/plob.js.map +1 -0
- package/dist/src/commands/auth.d.ts +3 -0
- package/dist/src/commands/auth.d.ts.map +1 -0
- package/dist/src/commands/auth.js +75 -0
- package/dist/src/commands/auth.js.map +1 -0
- package/dist/src/commands/config.d.ts +3 -0
- package/dist/src/commands/config.d.ts.map +1 -0
- package/dist/src/commands/config.js +79 -0
- package/dist/src/commands/config.js.map +1 -0
- package/dist/src/commands/escrow.d.ts +3 -0
- package/dist/src/commands/escrow.d.ts.map +1 -0
- package/dist/src/commands/escrow.js +193 -0
- package/dist/src/commands/escrow.js.map +1 -0
- package/dist/src/commands/mandate.d.ts +8 -0
- package/dist/src/commands/mandate.d.ts.map +1 -0
- package/dist/src/commands/mandate.js +54 -0
- package/dist/src/commands/mandate.js.map +1 -0
- package/dist/src/commands/pay.d.ts +6 -0
- package/dist/src/commands/pay.d.ts.map +1 -0
- package/dist/src/commands/pay.js +77 -0
- package/dist/src/commands/pay.js.map +1 -0
- package/dist/src/commands/register.d.ts +3 -0
- package/dist/src/commands/register.d.ts.map +1 -0
- package/dist/src/commands/register.js +51 -0
- package/dist/src/commands/register.js.map +1 -0
- package/dist/src/commands/reputation.d.ts +3 -0
- package/dist/src/commands/reputation.d.ts.map +1 -0
- package/dist/src/commands/reputation.js +116 -0
- package/dist/src/commands/reputation.js.map +1 -0
- package/dist/src/commands/status.d.ts +3 -0
- package/dist/src/commands/status.d.ts.map +1 -0
- package/dist/src/commands/status.js +82 -0
- package/dist/src/commands/status.js.map +1 -0
- package/dist/src/index.d.ts +3 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +59 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/lib/config.d.ts +26 -0
- package/dist/src/lib/config.d.ts.map +1 -0
- package/dist/src/lib/config.js +91 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/contracts.d.ts +18798 -0
- package/dist/src/lib/contracts.d.ts.map +1 -0
- package/dist/src/lib/contracts.js +361 -0
- package/dist/src/lib/contracts.js.map +1 -0
- package/dist/src/lib/display.d.ts +83 -0
- package/dist/src/lib/display.d.ts.map +1 -0
- package/dist/src/lib/display.js +293 -0
- package/dist/src/lib/display.js.map +1 -0
- package/dist/src/lib/types.d.ts +49 -0
- package/dist/src/lib/types.d.ts.map +1 -0
- package/dist/src/lib/types.js +3 -0
- package/dist/src/lib/types.js.map +1 -0
- package/dist/src/lib/wallet.d.ts +30 -0
- package/dist/src/lib/wallet.d.ts.map +1 -0
- package/dist/src/lib/wallet.js +143 -0
- package/dist/src/lib/wallet.js.map +1 -0
- package/jest.config.js +15 -0
- package/package.json +55 -0
- package/src/__tests__/cli.test.ts +38 -0
- package/src/commands/auth.ts +75 -0
- package/src/commands/config.ts +84 -0
- package/src/commands/escrow.ts +222 -0
- package/src/commands/mandate.ts +56 -0
- package/src/commands/pay.ts +96 -0
- package/src/commands/register.ts +57 -0
- package/src/commands/reputation.ts +84 -0
- package/src/commands/status.ts +91 -0
- package/src/index.ts +63 -0
- package/src/lib/config.ts +90 -0
- package/src/lib/contracts.ts +392 -0
- package/src/lib/display.ts +265 -0
- package/src/lib/types.ts +57 -0
- package/src/lib/wallet.ts +146 -0
- 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 @@
|
|
|
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
|