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 +318 -0
- package/dist/commands/connect.d.ts +7 -0
- package/dist/commands/connect.d.ts.map +1 -0
- package/dist/commands/connect.js +80 -0
- package/dist/commands/connect.js.map +1 -0
- package/dist/commands/facilitator.d.ts +40 -0
- package/dist/commands/facilitator.d.ts.map +1 -0
- package/dist/commands/facilitator.js +208 -0
- package/dist/commands/facilitator.js.map +1 -0
- package/dist/commands/pay.d.ts +14 -0
- package/dist/commands/pay.d.ts.map +1 -0
- package/dist/commands/pay.js +155 -0
- package/dist/commands/pay.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +99 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/api.d.ts +42 -0
- package/dist/utils/api.d.ts.map +1 -0
- package/dist/utils/api.js +145 -0
- package/dist/utils/api.js.map +1 -0
- package/dist/utils/config.d.ts +25 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +64 -0
- package/dist/utils/config.js.map +1 -0
- package/package.json +43 -0
- package/src/commands/connect.ts +84 -0
- package/src/commands/facilitator.ts +256 -0
- package/src/commands/pay.ts +179 -0
- package/src/index.ts +108 -0
- package/src/utils/api.ts +164 -0
- package/src/utils/config.ts +67 -0
- package/tsconfig.json +20 -0
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 @@
|
|
|
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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"}
|