facinet 1.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/README.md ADDED
@@ -0,0 +1,318 @@
1
+ # Facinet CLI
2
+
3
+ > Command-line tool for the x402 Facilitator Network
4
+
5
+ Make payments and manage facilitators on the x402 decentralized payment network powered by Avalanche.
6
+
7
+ ## Features
8
+
9
+ - šŸ’³ **Make Payments** - Pay via x402 using gasless USDC transfers
10
+ - šŸŽ² **Random Facilitator Selection** - Fair distribution across network
11
+ - šŸš€ **Create Facilitators** - Set up your own payment facilitator
12
+ - šŸ“Š **Manage & Monitor** - Check status, balance, and activity
13
+ - šŸ” **Secure** - Local wallet management with encryption
14
+ - ⚔ **Fast** - Built on Avalanche for sub-second finality
15
+
16
+ ## Installation
17
+
18
+ ```bash
19
+ npm install -g facinet
20
+ ```
21
+
22
+ ## Quick Start
23
+
24
+ ### 1. Connect Your Wallet
25
+
26
+ ```bash
27
+ facinet connect
28
+ ```
29
+
30
+ Choose to either:
31
+ - Enter your private key (for testing)
32
+ - Generate a new wallet
33
+
34
+ ### 2. Make a Payment
35
+
36
+ ```bash
37
+ facinet pay --amount 1 --to 0xRecipientAddress
38
+ ```
39
+
40
+ The CLI will automatically:
41
+ - Select a random active facilitator
42
+ - Sign the payment authorization
43
+ - Submit to the facilitator network
44
+ - Show transaction details
45
+
46
+ ### 3. List Active Facilitators
47
+
48
+ ```bash
49
+ facinet facilitator list
50
+ ```
51
+
52
+ See all active facilitators in the network with their stats.
53
+
54
+ ### 4. Check Facilitator Status
55
+
56
+ ```bash
57
+ facinet facilitator status fac_xyz123
58
+ ```
59
+
60
+ View detailed information about a specific facilitator.
61
+
62
+ ## Commands
63
+
64
+ ### Connection
65
+
66
+ #### `facinet connect`
67
+
68
+ Connect your wallet to Facinet. Options:
69
+ - Enter existing private key
70
+ - Generate new wallet
71
+
72
+ Config is saved to `~/.facinet/config.json`
73
+
74
+ ---
75
+
76
+ ### Payment Commands
77
+
78
+ #### `facinet pay`
79
+
80
+ Make a payment via the x402 facilitator network.
81
+
82
+ **Options:**
83
+ - `-a, --amount <amount>` - Payment amount in USDC (default: 1)
84
+ - `-t, --to <address>` - Recipient Ethereum address
85
+ - `-c, --chain <chain>` - Blockchain network (default: avalanche)
86
+ - `-n, --network <url>` - Custom API URL
87
+
88
+ **Examples:**
89
+
90
+ ```bash
91
+ # Pay 1 USDC to recipient
92
+ facinet pay --to 0x123...
93
+
94
+ # Pay custom amount
95
+ facinet pay --amount 5 --to 0x456...
96
+
97
+ # Use custom API endpoint
98
+ facinet pay --to 0x789... --network https://my-api.com
99
+ ```
100
+
101
+ ---
102
+
103
+ ### Facilitator Commands
104
+
105
+ #### `facinet facilitator create`
106
+
107
+ Create a new facilitator (requires 1 USDC registration fee).
108
+
109
+ **Options:**
110
+ - `-n, --name <name>` - Facilitator name
111
+ - `-r, --recipient <address>` - Payment recipient address
112
+ - `-u, --url <url>` - API URL (default: http://localhost:3000)
113
+
114
+ **Example:**
115
+
116
+ ```bash
117
+ facinet facilitator create --name "MyNode" --recipient 0xABC...
118
+ ```
119
+
120
+ **Important:** Save the facilitator wallet private key shown after creation!
121
+
122
+ #### `facinet facilitator list`
123
+
124
+ List all active facilitators in the network.
125
+
126
+ **Options:**
127
+ - `-u, --url <url>` - API URL (default: http://localhost:3000)
128
+
129
+ **Example:**
130
+
131
+ ```bash
132
+ facinet facilitator list
133
+ ```
134
+
135
+ #### `facinet facilitator status <id>`
136
+
137
+ Check the status of a specific facilitator.
138
+
139
+ **Arguments:**
140
+ - `<id>` - Facilitator ID (e.g., fac_xyz123)
141
+
142
+ **Options:**
143
+ - `-u, --url <url>` - API URL
144
+
145
+ **Example:**
146
+
147
+ ```bash
148
+ facinet facilitator status fac_NdIk4EytdaIYHRK1
149
+ ```
150
+
151
+ #### `facinet facilitator balance <id>`
152
+
153
+ Check the AVAX gas balance of a facilitator.
154
+
155
+ **Arguments:**
156
+ - `<id>` - Facilitator ID
157
+
158
+ **Options:**
159
+ - `-u, --url <url>` - API URL
160
+
161
+ **Example:**
162
+
163
+ ```bash
164
+ facinet facilitator balance fac_NdIk4EytdaIYHRK1
165
+ ```
166
+
167
+ ---
168
+
169
+ ## Configuration
170
+
171
+ Facinet stores configuration in `~/.facinet/config.json`:
172
+
173
+ ```json
174
+ {
175
+ "privateKey": "0x...",
176
+ "address": "0x...",
177
+ "network": "avalanche-fuji",
178
+ "apiUrl": "http://localhost:3000"
179
+ }
180
+ ```
181
+
182
+ ## Supported Networks
183
+
184
+ - **Avalanche** (Fuji Testnet) - Default
185
+ - **Ethereum** (Sepolia Testnet)
186
+ - More chains coming soon
187
+
188
+ ## How It Works
189
+
190
+ 1. **Random Selection** - CLI picks a random active facilitator from the network
191
+ 2. **Sign Authorization** - You sign an ERC-3009 payment authorization (gasless for you!)
192
+ 3. **Facilitator Executes** - The facilitator submits the transaction and pays gas
193
+ 4. **Payment Complete** - USDC transferred on-chain, access granted
194
+
195
+ ## Development
196
+
197
+ ### Build from Source
198
+
199
+ ```bash
200
+ # Clone repository
201
+ git clone https://github.com/your-repo/x402.git
202
+ cd x402/packages/facinet
203
+
204
+ # Install dependencies
205
+ npm install
206
+
207
+ # Build
208
+ npm run build
209
+
210
+ # Link for local testing
211
+ npm link
212
+
213
+ # Test commands
214
+ facinet --help
215
+ ```
216
+
217
+ ### Project Structure
218
+
219
+ ```
220
+ facinet/
221
+ ā”œā”€ā”€ src/
222
+ │ ā”œā”€ā”€ commands/
223
+ │ │ ā”œā”€ā”€ connect.ts # Wallet connection
224
+ │ │ ā”œā”€ā”€ pay.ts # Payment processing
225
+ │ │ └── facilitator.ts # Facilitator management
226
+ │ ā”œā”€ā”€ utils/
227
+ │ │ ā”œā”€ā”€ config.ts # Configuration management
228
+ │ │ └── api.ts # API client
229
+ │ └── index.ts # CLI entry point
230
+ ā”œā”€ā”€ package.json
231
+ ā”œā”€ā”€ tsconfig.json
232
+ └── README.md
233
+ ```
234
+
235
+ ## Security
236
+
237
+ - **Private keys** are stored encrypted in `~/.facinet/config.json`
238
+ - **Never share** your private key or config file
239
+ - **Use test wallets** for testnet development
240
+ - **Backup** your private keys securely
241
+
242
+ ## Troubleshooting
243
+
244
+ ### "No wallet connected"
245
+
246
+ Run `facinet connect` first to set up your wallet.
247
+
248
+ ### "No active facilitators available"
249
+
250
+ The network has no active facilitators. Create one with:
251
+ ```bash
252
+ facinet facilitator create
253
+ ```
254
+
255
+ ### "Insufficient USDC"
256
+
257
+ You need USDC in your wallet. On testnet:
258
+ 1. Get AVAX from faucet
259
+ 2. Swap AVAX → USDC
260
+
261
+ ### API connection errors
262
+
263
+ Check that your API URL is correct:
264
+ ```bash
265
+ facinet pay --network https://your-api-url.com
266
+ ```
267
+
268
+ ## Examples
269
+
270
+ ### Complete Payment Flow
271
+
272
+ ```bash
273
+ # 1. Connect wallet
274
+ facinet connect
275
+
276
+ # 2. List available facilitators
277
+ facinet facilitator list
278
+
279
+ # 3. Make payment
280
+ facinet pay --amount 1 --to 0x1234567890123456789012345678901234567890
281
+
282
+ # Output:
283
+ # āœ… Payment processed successfully!
284
+ # Facilitator: Xavier
285
+ # Amount: 1 USDC
286
+ # Recipient: 0x123...
287
+ ```
288
+
289
+ ### Create and Monitor Facilitator
290
+
291
+ ```bash
292
+ # 1. Create facilitator
293
+ facinet facilitator create --name "MyNode"
294
+
295
+ # 2. Fund with AVAX (send to facilitator wallet address)
296
+ # ...
297
+
298
+ # 3. Check status
299
+ facinet facilitator status fac_abc123
300
+
301
+ # 4. Monitor balance
302
+ facinet facilitator balance fac_abc123
303
+ ```
304
+
305
+ ## Resources
306
+
307
+ - [x402 Protocol](https://github.com/x402-rs/x402-rs)
308
+ - [Documentation](https://docs.x402.network)
309
+ - [Avalanche Docs](https://docs.avax.network/)
310
+ - [Report Issues](https://github.com/your-repo/x402/issues)
311
+
312
+ ## License
313
+
314
+ MIT Ā© x402 Team
315
+
316
+ ---
317
+
318
+ **Built with x402 on Avalanche** ⚔
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Connect Command
3
+ *
4
+ * Connect wallet to Facinet CLI
5
+ */
6
+ export declare function connectCommand(): Promise<void>;
7
+ //# sourceMappingURL=connect.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.d.ts","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAQH,wBAAsB,cAAc,kBAuEnC"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ /**
3
+ * Connect Command
4
+ *
5
+ * Connect wallet to Facinet CLI
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.connectCommand = connectCommand;
12
+ const inquirer_1 = __importDefault(require("inquirer"));
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ const ethers_1 = require("ethers");
15
+ const config_1 = require("../utils/config");
16
+ const ora_1 = __importDefault(require("ora"));
17
+ async function connectCommand() {
18
+ console.log(chalk_1.default.cyan('\nšŸ”— Connect Wallet to Facinet\n'));
19
+ const { method } = await inquirer_1.default.prompt([
20
+ {
21
+ type: 'list',
22
+ name: 'method',
23
+ message: 'How would you like to connect?',
24
+ choices: [
25
+ { name: 'Enter Private Key (for testing)', value: 'privateKey' },
26
+ { name: 'Generate New Wallet', value: 'generate' },
27
+ ],
28
+ },
29
+ ]);
30
+ if (method === 'privateKey') {
31
+ const { privateKey } = await inquirer_1.default.prompt([
32
+ {
33
+ type: 'password',
34
+ name: 'privateKey',
35
+ message: 'Enter your private key:',
36
+ mask: '*',
37
+ },
38
+ ]);
39
+ try {
40
+ const wallet = new ethers_1.Wallet(privateKey);
41
+ (0, config_1.saveConfig)({ privateKey, address: wallet.address });
42
+ console.log(chalk_1.default.green('\nāœ… Wallet connected successfully!'));
43
+ console.log(chalk_1.default.gray(`Address: ${wallet.address}`));
44
+ }
45
+ catch (error) {
46
+ console.log(chalk_1.default.red('\nāŒ Invalid private key'));
47
+ process.exit(1);
48
+ }
49
+ }
50
+ else {
51
+ const spinner = (0, ora_1.default)('Generating new wallet...').start();
52
+ const wallet = ethers_1.Wallet.createRandom();
53
+ spinner.succeed('Wallet generated!');
54
+ console.log(chalk_1.default.green('\nāœ… New wallet created!'));
55
+ console.log(chalk_1.default.yellow('\nāš ļø IMPORTANT: Save your private key securely!'));
56
+ console.log(chalk_1.default.gray(`\nAddress: ${wallet.address}`));
57
+ console.log(chalk_1.default.gray(`Private Key: ${wallet.privateKey}`));
58
+ console.log(chalk_1.default.gray(`Mnemonic: ${wallet.mnemonic?.phrase}\n`));
59
+ const { confirm } = await inquirer_1.default.prompt([
60
+ {
61
+ type: 'confirm',
62
+ name: 'confirm',
63
+ message: 'Have you saved your private key?',
64
+ default: false,
65
+ },
66
+ ]);
67
+ if (!confirm) {
68
+ console.log(chalk_1.default.red('\nPlease save your private key before continuing.'));
69
+ process.exit(0);
70
+ }
71
+ (0, config_1.saveConfig)({ privateKey: wallet.privateKey, address: wallet.address });
72
+ console.log(chalk_1.default.green('āœ… Configuration saved!'));
73
+ }
74
+ // Check network
75
+ const config = (0, config_1.getConfig)();
76
+ console.log(chalk_1.default.cyan('\nšŸ“” Network Configuration:'));
77
+ console.log(chalk_1.default.gray(`Network: ${config.network || 'avalanche-fuji'}`));
78
+ console.log(chalk_1.default.gray(`API URL: ${config.apiUrl || 'http://localhost:3000'}\n`));
79
+ }
80
+ //# sourceMappingURL=connect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"connect.js","sourceRoot":"","sources":["../../src/commands/connect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Facilitator Commands
3
+ *
4
+ * Create and manage facilitators
5
+ */
6
+ interface CreateOptions {
7
+ name?: string;
8
+ recipient?: string;
9
+ url: string;
10
+ }
11
+ interface ListOptions {
12
+ url: string;
13
+ }
14
+ interface StatusOptions {
15
+ url: string;
16
+ }
17
+ /**
18
+ * Create a new facilitator
19
+ */
20
+ declare function create(options: CreateOptions): Promise<void>;
21
+ /**
22
+ * List all facilitators
23
+ */
24
+ declare function list(options: ListOptions): Promise<void>;
25
+ /**
26
+ * Check facilitator status
27
+ */
28
+ declare function status(id: string, options: StatusOptions): Promise<void>;
29
+ /**
30
+ * Check facilitator balance
31
+ */
32
+ declare function balance(id: string, options: StatusOptions): Promise<void>;
33
+ export declare const facilitatorCommand: {
34
+ create: typeof create;
35
+ list: typeof list;
36
+ status: typeof status;
37
+ balance: typeof balance;
38
+ };
39
+ export {};
40
+ //# sourceMappingURL=facilitator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facilitator.d.ts","sourceRoot":"","sources":["../../src/commands/facilitator.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAcH,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,WAAW;IACnB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;CACb;AAED;;GAEG;AACH,iBAAe,MAAM,CAAC,OAAO,EAAE,aAAa,iBAoG3C;AAED;;GAEG;AACH,iBAAe,IAAI,CAAC,OAAO,EAAE,WAAW,iBA+BvC;AAED;;GAEG;AACH,iBAAe,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,iBA6BvD;AAED;;GAEG;AACH,iBAAe,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,iBAyBxD;AAeD,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC"}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ /**
3
+ * Facilitator Commands
4
+ *
5
+ * Create and manage facilitators
6
+ */
7
+ var __importDefault = (this && this.__importDefault) || function (mod) {
8
+ return (mod && mod.__esModule) ? mod : { "default": mod };
9
+ };
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.facilitatorCommand = void 0;
12
+ const inquirer_1 = __importDefault(require("inquirer"));
13
+ const chalk_1 = __importDefault(require("chalk"));
14
+ const ora_1 = __importDefault(require("ora"));
15
+ const ethers_1 = require("ethers");
16
+ const config_1 = require("../utils/config");
17
+ const api_1 = require("../utils/api");
18
+ /**
19
+ * Create a new facilitator
20
+ */
21
+ async function create(options) {
22
+ console.log(chalk_1.default.cyan('\nšŸš€ Create New Facilitator\n'));
23
+ // Check if wallet is connected
24
+ const config = (0, config_1.getConfig)();
25
+ if (!config.privateKey) {
26
+ console.log(chalk_1.default.red('āŒ No wallet connected. Run `facinet connect` first.'));
27
+ process.exit(1);
28
+ }
29
+ // Get facilitator details
30
+ const answers = await inquirer_1.default.prompt([
31
+ {
32
+ type: 'input',
33
+ name: 'name',
34
+ message: 'Facilitator name:',
35
+ when: !options.name,
36
+ validate: (input) => {
37
+ if (input.length < 3 || input.length > 50) {
38
+ return 'Name must be between 3 and 50 characters';
39
+ }
40
+ return true;
41
+ },
42
+ },
43
+ {
44
+ type: 'input',
45
+ name: 'recipient',
46
+ message: 'Payment recipient address:',
47
+ when: !options.recipient,
48
+ default: config.address,
49
+ validate: (input) => {
50
+ if (!input.match(/^0x[a-fA-F0-9]{40}$/)) {
51
+ return 'Invalid Ethereum address';
52
+ }
53
+ return true;
54
+ },
55
+ },
56
+ ]);
57
+ const name = options.name || answers.name;
58
+ const recipient = options.recipient || answers.recipient;
59
+ console.log(chalk_1.default.gray(`\nšŸ“‹ Facilitator Details:`));
60
+ console.log(chalk_1.default.gray(` Name: ${name}`));
61
+ console.log(chalk_1.default.gray(` Recipient: ${recipient}`));
62
+ console.log(chalk_1.default.gray(` Creator: ${config.address}\n`));
63
+ const { confirm } = await inquirer_1.default.prompt([
64
+ {
65
+ type: 'confirm',
66
+ name: 'confirm',
67
+ message: 'Create facilitator? (Requires 1 USDC registration fee)',
68
+ default: true,
69
+ },
70
+ ]);
71
+ if (!confirm) {
72
+ console.log(chalk_1.default.yellow('Cancelled.'));
73
+ process.exit(0);
74
+ }
75
+ const spinner = (0, ora_1.default)('Creating facilitator...').start();
76
+ try {
77
+ const wallet = new ethers_1.Wallet(config.privateKey);
78
+ // Generate facilitator wallet
79
+ const facilitatorWallet = ethers_1.Wallet.createRandom();
80
+ spinner.text = 'Registering facilitator...';
81
+ const result = await (0, api_1.createFacilitator)(options.url, {
82
+ name,
83
+ facilitatorWallet: facilitatorWallet.address,
84
+ facilitatorPrivateKey: facilitatorWallet.privateKey,
85
+ paymentRecipient: recipient,
86
+ createdBy: wallet.address,
87
+ });
88
+ spinner.succeed('Facilitator created!');
89
+ console.log(chalk_1.default.green('\nāœ… Facilitator created successfully!'));
90
+ console.log(chalk_1.default.gray(`\nšŸ“„ Details:`));
91
+ console.log(chalk_1.default.gray(` ID: ${result.id}`));
92
+ console.log(chalk_1.default.gray(` Name: ${name}`));
93
+ console.log(chalk_1.default.gray(` Wallet: ${facilitatorWallet.address}`));
94
+ console.log(chalk_1.default.gray(` Status: ${result.status}`));
95
+ console.log(chalk_1.default.yellow(`\nāš ļø IMPORTANT: Save facilitator wallet private key!`));
96
+ console.log(chalk_1.default.gray(` Private Key: ${facilitatorWallet.privateKey}\n`));
97
+ console.log(chalk_1.default.cyan('šŸ’” Next steps:'));
98
+ console.log(chalk_1.default.gray(` 1. Fund facilitator wallet with AVAX for gas`));
99
+ console.log(chalk_1.default.gray(` 2. Check status: facinet facilitator status ${result.id}`));
100
+ console.log(chalk_1.default.gray(` 3. Monitor balance: facinet facilitator balance ${result.id}\n`));
101
+ }
102
+ catch (error) {
103
+ spinner.fail('Failed to create facilitator');
104
+ console.log(chalk_1.default.red(`\nāŒ Error: ${error.message}\n`));
105
+ process.exit(1);
106
+ }
107
+ }
108
+ /**
109
+ * List all facilitators
110
+ */
111
+ async function list(options) {
112
+ console.log(chalk_1.default.cyan('\nšŸ“‹ Active Facilitators\n'));
113
+ const spinner = (0, ora_1.default)('Loading facilitators...').start();
114
+ try {
115
+ const facilitators = await (0, api_1.listFacilitators)(options.url);
116
+ spinner.stop();
117
+ if (facilitators.length === 0) {
118
+ console.log(chalk_1.default.yellow('No active facilitators found.\n'));
119
+ return;
120
+ }
121
+ console.log(chalk_1.default.gray(`Found ${facilitators.length} active facilitator(s):\n`));
122
+ facilitators.forEach((fac, index) => {
123
+ console.log(chalk_1.default.cyan(`${index + 1}. ${fac.name}`));
124
+ console.log(chalk_1.default.gray(` ID: ${fac.id}`));
125
+ console.log(chalk_1.default.gray(` Wallet: ${fac.facilitatorWallet}`));
126
+ console.log(chalk_1.default.gray(` Status: ${getStatusEmoji(fac.status)} ${fac.status.toUpperCase()}`));
127
+ console.log(chalk_1.default.gray(` Payments: ${fac.totalPayments}`));
128
+ console.log(chalk_1.default.gray(` Created by: ${fac.createdBy}`));
129
+ console.log('');
130
+ });
131
+ }
132
+ catch (error) {
133
+ spinner.fail('Failed to load facilitators');
134
+ console.log(chalk_1.default.red(`\nāŒ Error: ${error.message}\n`));
135
+ process.exit(1);
136
+ }
137
+ }
138
+ /**
139
+ * Check facilitator status
140
+ */
141
+ async function status(id, options) {
142
+ console.log(chalk_1.default.cyan(`\nšŸ“Š Facilitator Status\n`));
143
+ const spinner = (0, ora_1.default)('Checking status...').start();
144
+ try {
145
+ const fac = await (0, api_1.getFacilitatorStatus)(options.url, id);
146
+ spinner.stop();
147
+ console.log(chalk_1.default.cyan(`${fac.name}`));
148
+ console.log(chalk_1.default.gray(`ID: ${fac.id}\n`));
149
+ console.log(chalk_1.default.gray(`Status: ${getStatusEmoji(fac.status)} ${chalk_1.default.bold(fac.status.toUpperCase())}`));
150
+ console.log(chalk_1.default.gray(`Wallet: ${fac.facilitatorWallet}`));
151
+ console.log(chalk_1.default.gray(`Recipient: ${fac.paymentRecipient}`));
152
+ console.log(chalk_1.default.gray(`Total Payments: ${fac.totalPayments}`));
153
+ console.log(chalk_1.default.gray(`Gas Balance: ${fac.gasBalance || 'Unknown'} AVAX`));
154
+ console.log(chalk_1.default.gray(`Created: ${new Date(fac.lastUsed).toLocaleString()}\n`));
155
+ if (fac.status === 'needs_funding') {
156
+ console.log(chalk_1.default.yellow('āš ļø Facilitator needs AVAX for gas fees'));
157
+ console.log(chalk_1.default.gray(` Send at least 0.1 AVAX to: ${fac.facilitatorWallet}\n`));
158
+ }
159
+ }
160
+ catch (error) {
161
+ spinner.fail('Failed to get status');
162
+ console.log(chalk_1.default.red(`\nāŒ Error: ${error.message}\n`));
163
+ process.exit(1);
164
+ }
165
+ }
166
+ /**
167
+ * Check facilitator balance
168
+ */
169
+ async function balance(id, options) {
170
+ console.log(chalk_1.default.cyan(`\nšŸ’° Facilitator Balance\n`));
171
+ const spinner = (0, ora_1.default)('Checking balance...').start();
172
+ try {
173
+ const result = await (0, api_1.getFacilitatorBalance)(options.url, id);
174
+ spinner.stop();
175
+ console.log(chalk_1.default.gray(`Facilitator: ${result.name}`));
176
+ console.log(chalk_1.default.gray(`Wallet: ${result.wallet}\n`));
177
+ console.log(chalk_1.default.cyan(`AVAX Balance: ${chalk_1.default.bold(result.balance + ' AVAX')}`));
178
+ console.log(chalk_1.default.gray(`Status: ${getStatusEmoji(result.status)} ${result.status.toUpperCase()}\n`));
179
+ if (parseFloat(result.balance) < 0.1) {
180
+ console.log(chalk_1.default.yellow('āš ļø Low balance! Facilitator may become inactive.'));
181
+ console.log(chalk_1.default.gray(` Recommended: At least 0.1 AVAX\n`));
182
+ }
183
+ }
184
+ catch (error) {
185
+ spinner.fail('Failed to check balance');
186
+ console.log(chalk_1.default.red(`\nāŒ Error: ${error.message}\n`));
187
+ process.exit(1);
188
+ }
189
+ }
190
+ function getStatusEmoji(status) {
191
+ switch (status) {
192
+ case 'active':
193
+ return 'āœ…';
194
+ case 'needs_funding':
195
+ return 'āš ļø';
196
+ case 'inactive':
197
+ return 'āŒ';
198
+ default:
199
+ return 'ā“';
200
+ }
201
+ }
202
+ exports.facilitatorCommand = {
203
+ create,
204
+ list,
205
+ status,
206
+ balance,
207
+ };
208
+ //# sourceMappingURL=facilitator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"facilitator.js","sourceRoot":"","sources":["../../src/commands/facilitator.ts"],"names":[],"mappings":"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"}