clawncher 2.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 +302 -0
- package/dist/cli.d.ts +9 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +862 -0
- package/dist/cli.js.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
# clawnch
|
|
2
|
+
|
|
3
|
+
Command-line interface for [Clawnch](https://clawn.ch) - deploy tokens on Base with Uniswap V4 pools.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install -g clawnch
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
## Quick Start
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Configure your private key
|
|
15
|
+
clawnch config --private-key YOUR_PRIVATE_KEY
|
|
16
|
+
|
|
17
|
+
# Deploy a new token
|
|
18
|
+
clawnch deploy --name "My Token" --symbol MYTKN
|
|
19
|
+
|
|
20
|
+
# Show contract addresses
|
|
21
|
+
clawnch addresses
|
|
22
|
+
|
|
23
|
+
# Get token info from chain
|
|
24
|
+
clawnch info 0xTokenAddress
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Commands
|
|
28
|
+
|
|
29
|
+
### Deploy
|
|
30
|
+
|
|
31
|
+
Deploy a new token on Base with Uniswap V4 pool:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
# Basic deployment
|
|
35
|
+
clawnch deploy --name "My Token" --symbol MYTKN
|
|
36
|
+
|
|
37
|
+
# With image and description
|
|
38
|
+
clawnch deploy \
|
|
39
|
+
--name "My Token" \
|
|
40
|
+
--symbol MYTKN \
|
|
41
|
+
--image "https://example.com/logo.png" \
|
|
42
|
+
--description "A great token"
|
|
43
|
+
|
|
44
|
+
# Custom fee recipient
|
|
45
|
+
clawnch deploy --name "My Token" --symbol MYTKN --recipient 0x1234...
|
|
46
|
+
|
|
47
|
+
# 1% LP fee: 80% to deployer (in token by default), 20% protocol
|
|
48
|
+
# Change fee preference to receive in WETH instead:
|
|
49
|
+
clawnch deploy --name "My Token" --symbol MYTKN --fee-preference Paired
|
|
50
|
+
|
|
51
|
+
# With vault allocation
|
|
52
|
+
clawnch deploy \
|
|
53
|
+
--name "My Token" \
|
|
54
|
+
--symbol MYTKN \
|
|
55
|
+
--vault-percent 10 \
|
|
56
|
+
--vault-lockup 30 \
|
|
57
|
+
--vault-recipient 0x1234...
|
|
58
|
+
|
|
59
|
+
# With dev buy (instant purchase at launch)
|
|
60
|
+
clawnch deploy \
|
|
61
|
+
--name "My Token" \
|
|
62
|
+
--symbol MYTKN \
|
|
63
|
+
--dev-buy 0.1 \
|
|
64
|
+
--dev-buy-recipient 0x1234...
|
|
65
|
+
|
|
66
|
+
# With vested dev buy (purchase with lockup + vesting)
|
|
67
|
+
clawnch deploy \
|
|
68
|
+
--name "My Token" \
|
|
69
|
+
--symbol MYTKN \
|
|
70
|
+
--vested-dev-buy 0.5 \
|
|
71
|
+
--vested-dev-buy-recipient 0x1234... \
|
|
72
|
+
--vested-dev-buy-lockup 14 \
|
|
73
|
+
--vested-dev-buy-vesting 90
|
|
74
|
+
|
|
75
|
+
# Deploy to mainnet
|
|
76
|
+
clawnch deploy --name "My Token" --symbol MYTKN --network mainnet
|
|
77
|
+
|
|
78
|
+
# Use custom RPC
|
|
79
|
+
clawnch deploy --name "My Token" --symbol MYTKN --rpc https://my-rpc.com
|
|
80
|
+
|
|
81
|
+
# JSON output
|
|
82
|
+
clawnch deploy --name "My Token" --symbol MYTKN --json
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Info
|
|
86
|
+
|
|
87
|
+
Get token info directly from the blockchain:
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Get token info
|
|
91
|
+
clawnch info 0xTokenAddress
|
|
92
|
+
|
|
93
|
+
# Specify network
|
|
94
|
+
clawnch info 0xTokenAddress --network mainnet
|
|
95
|
+
|
|
96
|
+
# JSON output
|
|
97
|
+
clawnch info 0xTokenAddress --json
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### Fees
|
|
101
|
+
|
|
102
|
+
Check and manage trading fees:
|
|
103
|
+
|
|
104
|
+
```bash
|
|
105
|
+
# Check claimable fees (on-chain)
|
|
106
|
+
clawnch fees check 0xWalletAddress --tokens 0xToken1,0xToken2
|
|
107
|
+
|
|
108
|
+
# Check available fees (via API)
|
|
109
|
+
clawnch fees available 0xWalletAddress
|
|
110
|
+
|
|
111
|
+
# Check specific tokens via API
|
|
112
|
+
clawnch fees available 0xWalletAddress --tokens 0xToken1,0xToken2
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Config
|
|
116
|
+
|
|
117
|
+
Manage CLI configuration:
|
|
118
|
+
|
|
119
|
+
```bash
|
|
120
|
+
# Show current configuration
|
|
121
|
+
clawnch config --show
|
|
122
|
+
|
|
123
|
+
# Set default network
|
|
124
|
+
clawnch config --network sepolia # or mainnet
|
|
125
|
+
|
|
126
|
+
# Set private key
|
|
127
|
+
clawnch config --private-key 0x...
|
|
128
|
+
|
|
129
|
+
# Set custom RPC URLs
|
|
130
|
+
clawnch config --rpc-sepolia https://my-sepolia-rpc.com
|
|
131
|
+
clawnch config --rpc-mainnet https://my-mainnet-rpc.com
|
|
132
|
+
|
|
133
|
+
# Clear all configuration
|
|
134
|
+
clawnch config --clear
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
Configuration is stored in `~/.clawnch/config.json`.
|
|
138
|
+
|
|
139
|
+
### Addresses
|
|
140
|
+
|
|
141
|
+
Show contract addresses for a network:
|
|
142
|
+
|
|
143
|
+
```bash
|
|
144
|
+
# Show sepolia addresses (default)
|
|
145
|
+
clawnch addresses
|
|
146
|
+
|
|
147
|
+
# Show mainnet addresses
|
|
148
|
+
clawnch addresses --network mainnet
|
|
149
|
+
|
|
150
|
+
# JSON output
|
|
151
|
+
clawnch addresses --json
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### API Commands
|
|
155
|
+
|
|
156
|
+
These commands fetch data from the Clawnch API:
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# List all tokens
|
|
160
|
+
clawnch tokens
|
|
161
|
+
clawnch tokens --symbol DOG --limit 10
|
|
162
|
+
|
|
163
|
+
# View launch history
|
|
164
|
+
clawnch launches
|
|
165
|
+
clawnch launches --agent "MyAgent" --source moltbook
|
|
166
|
+
|
|
167
|
+
# Get market statistics
|
|
168
|
+
clawnch stats
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
### About
|
|
172
|
+
|
|
173
|
+
Show Clawnch information and links:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
clawnch about
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## Deploy Options Reference
|
|
180
|
+
|
|
181
|
+
| Option | Description | Example |
|
|
182
|
+
|--------|-------------|---------|
|
|
183
|
+
| `--name` | Token name (required) | `--name "My Token"` |
|
|
184
|
+
| `--symbol` | Token symbol (required) | `--symbol MYTKN` |
|
|
185
|
+
| `--image` | Token image URL | `--image "https://..."` |
|
|
186
|
+
| `--description` | Token description | `--description "A great token"` |
|
|
187
|
+
| `--recipient` | Fee recipient address | `--recipient 0x1234...` |
|
|
188
|
+
| `--fee-preference` | Fee token: Clawnch (default), Paired, Both | `--fee-preference Paired` |
|
|
189
|
+
| `--vault-percent` | Vault allocation (1-90%) | `--vault-percent 10` |
|
|
190
|
+
| `--vault-lockup` | Vault lockup in days | `--vault-lockup 30` |
|
|
191
|
+
| `--vault-vesting` | Vault vesting in days | `--vault-vesting 60` |
|
|
192
|
+
| `--vault-recipient` | Vault recipient address | `--vault-recipient 0x...` |
|
|
193
|
+
| `--dev-buy` | ETH amount for instant dev buy | `--dev-buy 0.1` |
|
|
194
|
+
| `--dev-buy-recipient` | Dev buy recipient address | `--dev-buy-recipient 0x...` |
|
|
195
|
+
| `--vested-dev-buy` | ETH amount for vested dev buy | `--vested-dev-buy 0.5` |
|
|
196
|
+
| `--vested-dev-buy-recipient` | Vested dev buy recipient | `--vested-dev-buy-recipient 0x...` |
|
|
197
|
+
| `--vested-dev-buy-lockup` | Lockup period in days (min 7) | `--vested-dev-buy-lockup 14` |
|
|
198
|
+
| `--vested-dev-buy-vesting` | Vesting period in days (30-365) | `--vested-dev-buy-vesting 90` |
|
|
199
|
+
| `--no-vanity` | Disable vanity address mining | `--no-vanity` |
|
|
200
|
+
| `--vanity-prefix` | Custom vanity prefix (default: ccc) | `--vanity-prefix dead` |
|
|
201
|
+
| `--network` | Network (sepolia/mainnet) | `--network mainnet` |
|
|
202
|
+
| `--rpc` | Custom RPC URL | `--rpc https://...` |
|
|
203
|
+
| `--json` | Output as JSON | `--json` |
|
|
204
|
+
|
|
205
|
+
### Vanity Addresses
|
|
206
|
+
|
|
207
|
+
By default, all tokens are deployed with a **vanity address** starting with `0xccc`. This makes Clawnch tokens easily identifiable on block explorers.
|
|
208
|
+
|
|
209
|
+
```bash
|
|
210
|
+
# Default: mine for 0xccc... address
|
|
211
|
+
clawnch deploy --name "My Token" --symbol MTK
|
|
212
|
+
|
|
213
|
+
# Custom prefix (e.g., 0xdead...)
|
|
214
|
+
clawnch deploy --name "My Token" --symbol MTK --vanity-prefix dead
|
|
215
|
+
|
|
216
|
+
# Disable vanity mining for faster deployment
|
|
217
|
+
clawnch deploy --name "My Token" --symbol MTK --no-vanity
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
Mining time depends on prefix length:
|
|
221
|
+
- `ccc` (3 chars): ~1 second average
|
|
222
|
+
- `cccc` (4 chars): ~5-10 seconds average
|
|
223
|
+
- `ccccc` (5 chars): ~1-2 minutes average
|
|
224
|
+
|
|
225
|
+
### Dev Buy vs Vested Dev Buy
|
|
226
|
+
|
|
227
|
+
**Dev Buy** (`--dev-buy`): Instantly purchases tokens at launch using ETH. Tokens are sent directly to the recipient with no lockup.
|
|
228
|
+
|
|
229
|
+
**Vested Dev Buy** (`--vested-dev-buy`): Purchases tokens at launch but holds them in a vesting contract:
|
|
230
|
+
- **Lockup period**: Tokens are fully locked (minimum 7 days)
|
|
231
|
+
- **Vesting period**: After lockup, tokens vest linearly over time (30-365 days)
|
|
232
|
+
- Recipient can claim vested tokens as they become available
|
|
233
|
+
|
|
234
|
+
## Configuration
|
|
235
|
+
|
|
236
|
+
### Private Key
|
|
237
|
+
|
|
238
|
+
You can provide your private key in three ways (in order of precedence):
|
|
239
|
+
|
|
240
|
+
1. **Command line flag:** `--private-key 0x...`
|
|
241
|
+
2. **Environment variable:** `CLAWNCH_PRIVATE_KEY=0x...`
|
|
242
|
+
3. **Config file:** `clawnch config --private-key 0x...`
|
|
243
|
+
|
|
244
|
+
### Network
|
|
245
|
+
|
|
246
|
+
Default network is `sepolia`. Change with:
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
clawnch config --network mainnet
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
Or per-command:
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
clawnch deploy --network mainnet ...
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### RPC URLs
|
|
259
|
+
|
|
260
|
+
Default RPCs are used if not configured:
|
|
261
|
+
- Sepolia: `https://sepolia.base.org`
|
|
262
|
+
- Mainnet: `https://mainnet.base.org`
|
|
263
|
+
|
|
264
|
+
Configure custom RPCs:
|
|
265
|
+
|
|
266
|
+
```bash
|
|
267
|
+
clawnch config --rpc-sepolia https://my-rpc.com
|
|
268
|
+
clawnch config --rpc-mainnet https://my-rpc.com
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
Or per-command:
|
|
272
|
+
|
|
273
|
+
```bash
|
|
274
|
+
clawnch deploy --rpc https://my-rpc.com ...
|
|
275
|
+
```
|
|
276
|
+
|
|
277
|
+
## Environment Variables
|
|
278
|
+
|
|
279
|
+
- `CLAWNCH_PRIVATE_KEY` - Private key for deployments
|
|
280
|
+
- `CLAWNCH_API_URL` - Override the default API URL (default: https://clawn.ch)
|
|
281
|
+
- `MOLTBOOK_KEY` - Moltbook API key for authenticated API operations
|
|
282
|
+
|
|
283
|
+
## JSON Output
|
|
284
|
+
|
|
285
|
+
All commands support `--json` flag for machine-readable output:
|
|
286
|
+
|
|
287
|
+
```bash
|
|
288
|
+
clawnch deploy --name "Test" --symbol TEST --json | jq '.tokenAddress'
|
|
289
|
+
clawnch info 0x... --json | jq '.symbol'
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
## Related
|
|
293
|
+
|
|
294
|
+
- [Clawnch Website](https://clawn.ch)
|
|
295
|
+
- [Agent Skill Documentation](https://clawn.ch/skill)
|
|
296
|
+
- [Technical Documentation](https://clawn.ch/docs)
|
|
297
|
+
- [OpenAPI Specification](https://clawn.ch/api/openapi)
|
|
298
|
+
- [@clawnch/sdk](https://npmjs.com/package/@clawnch/sdk) - TypeScript SDK
|
|
299
|
+
|
|
300
|
+
## License
|
|
301
|
+
|
|
302
|
+
MIT
|
package/dist/cli.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA;;;;;GAKG"}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,862 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Clawncher CLI v2
|
|
4
|
+
*
|
|
5
|
+
* Command-line interface for deploying tokens on Base with Uniswap V4 pools.
|
|
6
|
+
* Uses ClawnchDeployer from SDK v2 for direct contract deployment.
|
|
7
|
+
*/
|
|
8
|
+
import { Command } from 'commander';
|
|
9
|
+
import chalk from 'chalk';
|
|
10
|
+
import ora from 'ora';
|
|
11
|
+
import Table from 'cli-table3';
|
|
12
|
+
import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
|
|
13
|
+
import { join } from 'path';
|
|
14
|
+
import { homedir } from 'os';
|
|
15
|
+
import { createWalletClient, createPublicClient, http, formatEther, parseEther, } from 'viem';
|
|
16
|
+
import { privateKeyToAccount } from 'viem/accounts';
|
|
17
|
+
import { base, baseSepolia } from 'viem/chains';
|
|
18
|
+
import { ClawnchDeployer, ClawnchReader, ClawnchClient, getAddresses, ClawnchFeeLockerABI, } from '@clawnch/clawncher-sdk';
|
|
19
|
+
const VERSION = '2.0.0';
|
|
20
|
+
const CONFIG_DIR = join(homedir(), '.clawncher');
|
|
21
|
+
const CONFIG_FILE = join(CONFIG_DIR, 'config.json');
|
|
22
|
+
function loadConfig() {
|
|
23
|
+
try {
|
|
24
|
+
if (existsSync(CONFIG_FILE)) {
|
|
25
|
+
return JSON.parse(readFileSync(CONFIG_FILE, 'utf-8'));
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
// Ignore errors, return empty config
|
|
30
|
+
}
|
|
31
|
+
return {};
|
|
32
|
+
}
|
|
33
|
+
function saveConfig(config) {
|
|
34
|
+
if (!existsSync(CONFIG_DIR)) {
|
|
35
|
+
mkdirSync(CONFIG_DIR, { recursive: true, mode: 0o700 });
|
|
36
|
+
}
|
|
37
|
+
writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2), { mode: 0o600 });
|
|
38
|
+
}
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// Helpers
|
|
41
|
+
// ============================================================================
|
|
42
|
+
function isValidAddress(address) {
|
|
43
|
+
return /^0x[0-9a-fA-F]{40}$/.test(address);
|
|
44
|
+
}
|
|
45
|
+
function validateAddress(address, label) {
|
|
46
|
+
if (!isValidAddress(address)) {
|
|
47
|
+
console.error(chalk.red(`Invalid ${label} address: ${address}`));
|
|
48
|
+
console.error(chalk.red('Expected a 42-character hex string starting with 0x'));
|
|
49
|
+
process.exit(1);
|
|
50
|
+
}
|
|
51
|
+
return address;
|
|
52
|
+
}
|
|
53
|
+
function safeParseInt(value, label) {
|
|
54
|
+
const n = parseInt(value, 10);
|
|
55
|
+
if (isNaN(n)) {
|
|
56
|
+
console.error(chalk.red(`Invalid ${label}: "${value}" is not a number`));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
return n;
|
|
60
|
+
}
|
|
61
|
+
function handleError(err) {
|
|
62
|
+
if (err && typeof err === 'object' && 'message' in err) {
|
|
63
|
+
const error = err;
|
|
64
|
+
console.error(chalk.red(`Error: ${error.message}`));
|
|
65
|
+
if (error.errors?.length) {
|
|
66
|
+
error.errors.forEach((e) => console.error(chalk.red(` - ${e}`)));
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.error(chalk.red('An unknown error occurred'));
|
|
71
|
+
}
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
function truncateAddress(address) {
|
|
75
|
+
return `${address.slice(0, 6)}...${address.slice(-4)}`;
|
|
76
|
+
}
|
|
77
|
+
function getPrivateKey(opts) {
|
|
78
|
+
const key = opts.privateKey || process.env.CLAWNCHER_PRIVATE_KEY || loadConfig().privateKey;
|
|
79
|
+
if (!key) {
|
|
80
|
+
console.error(chalk.red('Private key required. Use --private-key, CLAWNCHER_PRIVATE_KEY env var, or `clawncher config --private-key`'));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
return key.startsWith('0x') ? key : `0x${key}`;
|
|
84
|
+
}
|
|
85
|
+
function getNetwork(opts) {
|
|
86
|
+
const network = opts.network || loadConfig().network || 'sepolia';
|
|
87
|
+
if (network !== 'sepolia' && network !== 'mainnet') {
|
|
88
|
+
console.error(chalk.red('Invalid network. Use "sepolia" or "mainnet"'));
|
|
89
|
+
process.exit(1);
|
|
90
|
+
}
|
|
91
|
+
return network;
|
|
92
|
+
}
|
|
93
|
+
function getRpcUrl(network, opts) {
|
|
94
|
+
const config = loadConfig();
|
|
95
|
+
if (opts.rpc)
|
|
96
|
+
return opts.rpc;
|
|
97
|
+
if (network === 'sepolia' && config.rpc?.sepolia)
|
|
98
|
+
return config.rpc.sepolia;
|
|
99
|
+
if (network === 'mainnet' && config.rpc?.mainnet)
|
|
100
|
+
return config.rpc.mainnet;
|
|
101
|
+
// Default public RPCs
|
|
102
|
+
return network === 'mainnet'
|
|
103
|
+
? 'https://mainnet.base.org'
|
|
104
|
+
: 'https://sepolia.base.org';
|
|
105
|
+
}
|
|
106
|
+
function getChain(network) {
|
|
107
|
+
return network === 'mainnet' ? base : baseSepolia;
|
|
108
|
+
}
|
|
109
|
+
function createClients(network, privateKey, rpcUrl) {
|
|
110
|
+
const chain = getChain(network);
|
|
111
|
+
const account = privateKeyToAccount(privateKey);
|
|
112
|
+
const wallet = createWalletClient({
|
|
113
|
+
account,
|
|
114
|
+
chain,
|
|
115
|
+
transport: http(rpcUrl),
|
|
116
|
+
});
|
|
117
|
+
const publicClient = createPublicClient({
|
|
118
|
+
chain,
|
|
119
|
+
transport: http(rpcUrl),
|
|
120
|
+
});
|
|
121
|
+
// Cast to any to avoid viem version mismatch between CLI and SDK
|
|
122
|
+
return { wallet: wallet, publicClient: publicClient, account };
|
|
123
|
+
}
|
|
124
|
+
function getClient(options = {}) {
|
|
125
|
+
return new ClawnchClient({
|
|
126
|
+
baseUrl: options.apiUrl || process.env.CLAWNCHER_API_URL || 'https://clawn.ch',
|
|
127
|
+
moltbookKey: options.moltbookKey || process.env.MOLTBOOK_KEY,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
// ============================================================================
|
|
131
|
+
// Main Program
|
|
132
|
+
// ============================================================================
|
|
133
|
+
const program = new Command();
|
|
134
|
+
program
|
|
135
|
+
.name('clawncher')
|
|
136
|
+
.description('CLI for Clawncher - deploy tokens on Base with Uniswap V4 pools')
|
|
137
|
+
.version(VERSION)
|
|
138
|
+
.option('--api-url <url>', 'API base URL', 'https://clawn.ch')
|
|
139
|
+
.option('--moltbook-key <key>', 'Moltbook API key for authenticated operations');
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Deploy Command
|
|
142
|
+
// ============================================================================
|
|
143
|
+
program
|
|
144
|
+
.command('deploy')
|
|
145
|
+
.description('Deploy a new token on Base with Uniswap V4 pool')
|
|
146
|
+
.requiredOption('--name <name>', 'Token name')
|
|
147
|
+
.requiredOption('--symbol <symbol>', 'Token symbol')
|
|
148
|
+
.option('--image <url>', 'Token image URL')
|
|
149
|
+
.option('--description <text>', 'Token description')
|
|
150
|
+
.option('--recipient <address>', 'Fee recipient address (defaults to deployer)')
|
|
151
|
+
.option('--fee-preference <pref>', 'Fee preference: Clawnch (token), Paired (WETH), or Both', 'Clawnch')
|
|
152
|
+
.option('--vault-percent <n>', 'Vault allocation percentage (1-90)')
|
|
153
|
+
.option('--vault-lockup <days>', 'Vault lockup duration in days', '7')
|
|
154
|
+
.option('--vault-vesting <days>', 'Vault vesting duration in days after lockup (0 = instant)', '0')
|
|
155
|
+
.option('--vault-recipient <address>', 'Vault recipient (defaults to deployer)')
|
|
156
|
+
.option('--dev-buy <eth>', 'Dev buy: ETH amount to spend (instant transfer)')
|
|
157
|
+
.option('--dev-buy-recipient <address>', 'Dev buy recipient (defaults to deployer)')
|
|
158
|
+
.option('--vested-dev-buy <eth>', 'Vested dev buy: ETH amount to spend (with lockup+vesting)')
|
|
159
|
+
.option('--vested-dev-buy-recipient <address>', 'Vested dev buy recipient (defaults to deployer)')
|
|
160
|
+
.option('--vested-dev-buy-lockup <days>', 'Vested dev buy lockup in days (min 7)', '7')
|
|
161
|
+
.option('--vested-dev-buy-vesting <days>', 'Vested dev buy vesting in days (min 30, max 365)', '90')
|
|
162
|
+
.option('--no-vanity', 'Disable vanity address mining (default: enabled for 0xccc prefix)')
|
|
163
|
+
.option('--vanity-prefix <prefix>', 'Custom vanity prefix (default: ccc)', 'ccc')
|
|
164
|
+
.option('--network <network>', 'Network: sepolia or mainnet', 'sepolia')
|
|
165
|
+
.option('--rpc <url>', 'Custom RPC URL')
|
|
166
|
+
.option('--private-key <key>', 'Private key (or use CLAWNCHER_PRIVATE_KEY env)')
|
|
167
|
+
.option('--json', 'Output as JSON')
|
|
168
|
+
.action(async (opts) => {
|
|
169
|
+
const spinner = ora('Preparing deployment...').start();
|
|
170
|
+
try {
|
|
171
|
+
const privateKey = getPrivateKey(opts);
|
|
172
|
+
const network = getNetwork(opts);
|
|
173
|
+
const rpcUrl = getRpcUrl(network, opts);
|
|
174
|
+
const { wallet, publicClient, account } = createClients(network, privateKey, rpcUrl);
|
|
175
|
+
spinner.text = `Deploying ${opts.symbol} on ${network}...`;
|
|
176
|
+
const deployer = new ClawnchDeployer({
|
|
177
|
+
wallet,
|
|
178
|
+
publicClient,
|
|
179
|
+
network,
|
|
180
|
+
});
|
|
181
|
+
if (!deployer.isConfigured()) {
|
|
182
|
+
spinner.stop();
|
|
183
|
+
console.error(chalk.red(`Contracts not deployed on ${network}`));
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
// Parse fee preference (default: Clawnch = receive fees in the token)
|
|
187
|
+
let feePreference = 'Clawnch';
|
|
188
|
+
if (opts.feePreference) {
|
|
189
|
+
const pref = opts.feePreference.toLowerCase();
|
|
190
|
+
if (pref === 'paired')
|
|
191
|
+
feePreference = 'Paired';
|
|
192
|
+
else if (pref === 'both')
|
|
193
|
+
feePreference = 'Both';
|
|
194
|
+
else
|
|
195
|
+
feePreference = 'Clawnch';
|
|
196
|
+
}
|
|
197
|
+
// Build deploy options
|
|
198
|
+
const recipient = opts.recipient ? validateAddress(opts.recipient, 'recipient') : account.address;
|
|
199
|
+
const deployOpts = {
|
|
200
|
+
name: opts.name,
|
|
201
|
+
symbol: opts.symbol,
|
|
202
|
+
tokenAdmin: account.address,
|
|
203
|
+
image: opts.image,
|
|
204
|
+
metadata: opts.description ? { description: opts.description } : undefined,
|
|
205
|
+
rewards: {
|
|
206
|
+
recipients: [{
|
|
207
|
+
recipient,
|
|
208
|
+
admin: recipient,
|
|
209
|
+
bps: 10000, // 100%
|
|
210
|
+
feePreference,
|
|
211
|
+
}],
|
|
212
|
+
},
|
|
213
|
+
};
|
|
214
|
+
// Add vault if specified
|
|
215
|
+
if (opts.vaultPercent) {
|
|
216
|
+
const vaultPercent = safeParseInt(opts.vaultPercent, 'vault percent');
|
|
217
|
+
if (vaultPercent < 1 || vaultPercent > 90) {
|
|
218
|
+
spinner.stop();
|
|
219
|
+
console.error(chalk.red('Vault percent must be between 1 and 90'));
|
|
220
|
+
process.exit(1);
|
|
221
|
+
}
|
|
222
|
+
const lockupDays = safeParseInt(opts.vaultLockup || '7', 'vault lockup days');
|
|
223
|
+
const lockupSeconds = lockupDays * 24 * 60 * 60;
|
|
224
|
+
const vestingDays = safeParseInt(opts.vaultVesting || '0', 'vault vesting days');
|
|
225
|
+
const vestingSeconds = vestingDays * 24 * 60 * 60;
|
|
226
|
+
const vaultRecipient = opts.vaultRecipient ? validateAddress(opts.vaultRecipient, 'vault recipient') : account.address;
|
|
227
|
+
deployOpts.vault = {
|
|
228
|
+
percentage: vaultPercent,
|
|
229
|
+
lockupDuration: lockupSeconds,
|
|
230
|
+
vestingDuration: vestingSeconds,
|
|
231
|
+
recipient: vaultRecipient,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
// Add instant dev buy if specified
|
|
235
|
+
if (opts.devBuy) {
|
|
236
|
+
const ethAmount = parseEther(opts.devBuy);
|
|
237
|
+
if (ethAmount <= 0n) {
|
|
238
|
+
spinner.stop();
|
|
239
|
+
console.error(chalk.red('Dev buy ETH amount must be greater than 0'));
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
242
|
+
const devBuyRecipient = opts.devBuyRecipient ? validateAddress(opts.devBuyRecipient, 'dev buy recipient') : account.address;
|
|
243
|
+
deployOpts.devBuy = {
|
|
244
|
+
ethAmount,
|
|
245
|
+
recipient: devBuyRecipient,
|
|
246
|
+
};
|
|
247
|
+
}
|
|
248
|
+
// Add vested dev buy if specified
|
|
249
|
+
if (opts.vestedDevBuy) {
|
|
250
|
+
const ethAmount = parseEther(opts.vestedDevBuy);
|
|
251
|
+
if (ethAmount <= 0n) {
|
|
252
|
+
spinner.stop();
|
|
253
|
+
console.error(chalk.red('Vested dev buy ETH amount must be greater than 0'));
|
|
254
|
+
process.exit(1);
|
|
255
|
+
}
|
|
256
|
+
const lockupDays = safeParseInt(opts.vestedDevBuyLockup || '7', 'vested dev buy lockup days');
|
|
257
|
+
const vestingDays = safeParseInt(opts.vestedDevBuyVesting || '90', 'vested dev buy vesting days');
|
|
258
|
+
if (lockupDays < 7) {
|
|
259
|
+
spinner.stop();
|
|
260
|
+
console.error(chalk.red('Vested dev buy lockup must be at least 7 days'));
|
|
261
|
+
process.exit(1);
|
|
262
|
+
}
|
|
263
|
+
if (vestingDays < 30 || vestingDays > 365) {
|
|
264
|
+
spinner.stop();
|
|
265
|
+
console.error(chalk.red('Vested dev buy vesting must be between 30 and 365 days'));
|
|
266
|
+
process.exit(1);
|
|
267
|
+
}
|
|
268
|
+
const vestedRecipient = opts.vestedDevBuyRecipient ? validateAddress(opts.vestedDevBuyRecipient, 'vested dev buy recipient') : account.address;
|
|
269
|
+
deployOpts.vestedDevBuy = {
|
|
270
|
+
ethAmount,
|
|
271
|
+
recipient: vestedRecipient,
|
|
272
|
+
lockupDuration: lockupDays * 24 * 60 * 60,
|
|
273
|
+
vestingDuration: vestingDays * 24 * 60 * 60,
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
// Configure vanity mining (default: enabled with 'ccc' prefix)
|
|
277
|
+
const vanityEnabled = opts.vanity !== false; // --no-vanity sets this to false
|
|
278
|
+
if (vanityEnabled) {
|
|
279
|
+
spinner.text = `Mining vanity address (0x${opts.vanityPrefix}...)...`;
|
|
280
|
+
deployOpts.vanity = {
|
|
281
|
+
enabled: true,
|
|
282
|
+
prefix: opts.vanityPrefix || 'ccc',
|
|
283
|
+
onProgress: (attempts, rate) => {
|
|
284
|
+
spinner.text = `Mining vanity address (0x${opts.vanityPrefix}...) - ${attempts.toLocaleString()} attempts, ${rate.toLocaleString()}/sec`;
|
|
285
|
+
},
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
else {
|
|
289
|
+
deployOpts.vanity = { enabled: false };
|
|
290
|
+
}
|
|
291
|
+
const result = await deployer.deploy(deployOpts);
|
|
292
|
+
if (result.error) {
|
|
293
|
+
spinner.stop();
|
|
294
|
+
handleError(result.error);
|
|
295
|
+
}
|
|
296
|
+
spinner.text = 'Waiting for transaction confirmation...';
|
|
297
|
+
const { address } = await result.waitForTransaction();
|
|
298
|
+
spinner.stop();
|
|
299
|
+
if (opts.json) {
|
|
300
|
+
console.log(JSON.stringify({
|
|
301
|
+
success: true,
|
|
302
|
+
txHash: result.txHash,
|
|
303
|
+
tokenAddress: address,
|
|
304
|
+
network,
|
|
305
|
+
name: opts.name,
|
|
306
|
+
symbol: opts.symbol,
|
|
307
|
+
deployer: account.address,
|
|
308
|
+
vanity: result.vanityResult ? {
|
|
309
|
+
attempts: result.vanityResult.attempts,
|
|
310
|
+
timeMs: result.vanityResult.timeMs,
|
|
311
|
+
} : null,
|
|
312
|
+
}, null, 2));
|
|
313
|
+
return;
|
|
314
|
+
}
|
|
315
|
+
console.log(chalk.green.bold('\n Token deployed successfully!\n'));
|
|
316
|
+
console.log(` ${chalk.cyan('Transaction:')} ${result.txHash}`);
|
|
317
|
+
console.log(` ${chalk.cyan('Token:')} ${address || 'Pending...'}`);
|
|
318
|
+
console.log(` ${chalk.cyan('Network:')} ${network}`);
|
|
319
|
+
console.log(` ${chalk.cyan('Name:')} ${opts.name}`);
|
|
320
|
+
console.log(` ${chalk.cyan('Symbol:')} ${opts.symbol}`);
|
|
321
|
+
console.log(` ${chalk.cyan('Deployer:')} ${account.address}`);
|
|
322
|
+
console.log(` ${chalk.cyan('Fee Recipient:')} ${recipient}`);
|
|
323
|
+
if (result.vanityResult) {
|
|
324
|
+
console.log(` ${chalk.cyan('Vanity:')} Found in ${result.vanityResult.attempts.toLocaleString()} attempts (${result.vanityResult.timeMs}ms)`);
|
|
325
|
+
}
|
|
326
|
+
if (opts.vaultPercent) {
|
|
327
|
+
console.log(` ${chalk.cyan('Vault:')} ${opts.vaultPercent}% locked for ${opts.vaultLockup || 7} days`);
|
|
328
|
+
}
|
|
329
|
+
const chain = getChain(network);
|
|
330
|
+
const explorerUrl = network === 'mainnet'
|
|
331
|
+
? `https://basescan.org/tx/${result.txHash}`
|
|
332
|
+
: `https://sepolia.basescan.org/tx/${result.txHash}`;
|
|
333
|
+
console.log();
|
|
334
|
+
console.log(` ${chalk.gray('Explorer:')} ${explorerUrl}`);
|
|
335
|
+
console.log();
|
|
336
|
+
}
|
|
337
|
+
catch (err) {
|
|
338
|
+
spinner.stop();
|
|
339
|
+
handleError(err);
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
// ============================================================================
|
|
343
|
+
// Info Command (Read from chain)
|
|
344
|
+
// ============================================================================
|
|
345
|
+
program
|
|
346
|
+
.command('info')
|
|
347
|
+
.description('Get full token details from chain (deployment, vault, MEV, rewards)')
|
|
348
|
+
.argument('<address>', 'Token contract address')
|
|
349
|
+
.option('--network <network>', 'Network: sepolia or mainnet', 'sepolia')
|
|
350
|
+
.option('--rpc <url>', 'Custom RPC URL')
|
|
351
|
+
.option('--json', 'Output as JSON')
|
|
352
|
+
.action(async (address, opts) => {
|
|
353
|
+
const spinner = ora('Fetching token details...').start();
|
|
354
|
+
try {
|
|
355
|
+
const tokenAddress = validateAddress(address, 'token');
|
|
356
|
+
const network = getNetwork(opts);
|
|
357
|
+
const rpcUrl = getRpcUrl(network, opts);
|
|
358
|
+
const chain = getChain(network);
|
|
359
|
+
const publicClient = createPublicClient({
|
|
360
|
+
chain,
|
|
361
|
+
transport: http(rpcUrl),
|
|
362
|
+
});
|
|
363
|
+
const reader = new ClawnchReader({
|
|
364
|
+
publicClient,
|
|
365
|
+
network,
|
|
366
|
+
});
|
|
367
|
+
const details = await reader.getTokenDetails(tokenAddress);
|
|
368
|
+
spinner.stop();
|
|
369
|
+
if (!details) {
|
|
370
|
+
// Fall back to basic ERC20 info if not a Clawncher token
|
|
371
|
+
const info = await reader.getTokenInfo(tokenAddress);
|
|
372
|
+
console.log(chalk.yellow(`\n ${info.symbol} is not a Clawncher token (no deployment info found)\n`));
|
|
373
|
+
console.log(` ${chalk.cyan('Address:')} ${address}`);
|
|
374
|
+
console.log(` ${chalk.cyan('Name:')} ${info.name}`);
|
|
375
|
+
console.log(` ${chalk.cyan('Symbol:')} ${info.symbol}`);
|
|
376
|
+
console.log(` ${chalk.cyan('Total Supply:')} ${formatEther(info.totalSupply)}`);
|
|
377
|
+
console.log(` ${chalk.cyan('Network:')} ${network}`);
|
|
378
|
+
console.log();
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
381
|
+
if (opts.json) {
|
|
382
|
+
// Serialize bigints for JSON output
|
|
383
|
+
const serializable = JSON.parse(JSON.stringify(details, (_, v) => typeof v === 'bigint' ? v.toString() : v));
|
|
384
|
+
console.log(JSON.stringify(serializable, null, 2));
|
|
385
|
+
return;
|
|
386
|
+
}
|
|
387
|
+
console.log(chalk.bold.green(`\n ${details.symbol} Token Info\n`));
|
|
388
|
+
console.log(` ${chalk.cyan('Address:')} ${details.address}`);
|
|
389
|
+
console.log(` ${chalk.cyan('Name:')} ${details.name}`);
|
|
390
|
+
console.log(` ${chalk.cyan('Symbol:')} ${details.symbol}`);
|
|
391
|
+
console.log(` ${chalk.cyan('Total Supply:')} ${formatEther(details.totalSupply)}`);
|
|
392
|
+
console.log(` ${chalk.cyan('Admin:')} ${details.tokenAdmin}`);
|
|
393
|
+
console.log(` ${chalk.cyan('Network:')} ${network}`);
|
|
394
|
+
if (details.image) {
|
|
395
|
+
console.log(` ${chalk.cyan('Image:')} ${details.image}`);
|
|
396
|
+
}
|
|
397
|
+
// Deployment
|
|
398
|
+
console.log();
|
|
399
|
+
console.log(chalk.cyan(' Deployment:'));
|
|
400
|
+
console.log(` Hook: ${truncateAddress(details.deployment.hook)}`);
|
|
401
|
+
console.log(` Locker: ${truncateAddress(details.deployment.locker)}`);
|
|
402
|
+
if (details.deployment.extensions.length > 0) {
|
|
403
|
+
console.log(` Extensions: ${details.deployment.extensions.map(truncateAddress).join(', ')}`);
|
|
404
|
+
}
|
|
405
|
+
// Rewards
|
|
406
|
+
if (details.rewards) {
|
|
407
|
+
console.log();
|
|
408
|
+
console.log(chalk.cyan(' Fee Recipients:'));
|
|
409
|
+
for (let i = 0; i < details.rewards.rewardRecipients.length; i++) {
|
|
410
|
+
const bps = details.rewards.rewardBps[i];
|
|
411
|
+
const pct = (bps / 100).toFixed(1);
|
|
412
|
+
console.log(` ${truncateAddress(details.rewards.rewardRecipients[i])} - ${pct}%`);
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
// Vault
|
|
416
|
+
if (details.vault) {
|
|
417
|
+
console.log();
|
|
418
|
+
console.log(chalk.cyan(' Vault:'));
|
|
419
|
+
console.log(` Total: ${formatEther(details.vault.amountTotal)} tokens`);
|
|
420
|
+
console.log(` Claimed: ${formatEther(details.vault.amountClaimed)} tokens`);
|
|
421
|
+
console.log(` Available: ${formatEther(details.vault.amountAvailable)} tokens`);
|
|
422
|
+
console.log(` Unlocked: ${details.vault.isUnlocked ? chalk.green('Yes') : chalk.yellow('No')}`);
|
|
423
|
+
console.log(` Vested: ${details.vault.percentVested}%`);
|
|
424
|
+
console.log(` Admin: ${truncateAddress(details.vault.admin)}`);
|
|
425
|
+
}
|
|
426
|
+
// Vested Dev Buy
|
|
427
|
+
if (details.vestedDevBuy) {
|
|
428
|
+
console.log();
|
|
429
|
+
console.log(chalk.cyan(' Vested Dev Buy:'));
|
|
430
|
+
console.log(` Total: ${formatEther(details.vestedDevBuy.amountTotal)} tokens`);
|
|
431
|
+
console.log(` Claimed: ${formatEther(details.vestedDevBuy.amountClaimed)} tokens`);
|
|
432
|
+
console.log(` Available: ${formatEther(details.vestedDevBuy.amountAvailable)} tokens`);
|
|
433
|
+
console.log(` Unlocked: ${details.vestedDevBuy.isUnlocked ? chalk.green('Yes') : chalk.yellow('No')}`);
|
|
434
|
+
console.log(` Vested: ${details.vestedDevBuy.percentVested}%`);
|
|
435
|
+
}
|
|
436
|
+
// MEV
|
|
437
|
+
if (details.mev) {
|
|
438
|
+
console.log();
|
|
439
|
+
console.log(chalk.cyan(' MEV Protection:'));
|
|
440
|
+
console.log(` Starting Fee: ${(details.mev.startingFee / 10000 * 100).toFixed(2)}%`);
|
|
441
|
+
console.log(` Ending Fee: ${(details.mev.endingFee / 10000 * 100).toFixed(2)}%`);
|
|
442
|
+
console.log(` Current Fee: ${(details.mev.currentFee / 10000 * 100).toFixed(2)}%`);
|
|
443
|
+
console.log(` Decay Done: ${details.mev.isDecayComplete ? chalk.green('Yes') : chalk.yellow('No')}`);
|
|
444
|
+
}
|
|
445
|
+
// Explorer link
|
|
446
|
+
const explorerUrl = network === 'mainnet'
|
|
447
|
+
? `https://basescan.org/address/${address}`
|
|
448
|
+
: `https://sepolia.basescan.org/address/${address}`;
|
|
449
|
+
console.log();
|
|
450
|
+
console.log(` ${chalk.gray('Explorer:')} ${explorerUrl}`);
|
|
451
|
+
console.log();
|
|
452
|
+
}
|
|
453
|
+
catch (err) {
|
|
454
|
+
spinner.stop();
|
|
455
|
+
handleError(err);
|
|
456
|
+
}
|
|
457
|
+
});
|
|
458
|
+
// ============================================================================
|
|
459
|
+
// Fees Commands
|
|
460
|
+
// ============================================================================
|
|
461
|
+
const fees = program.command('fees').description('Manage trading fees');
|
|
462
|
+
fees
|
|
463
|
+
.command('check')
|
|
464
|
+
.description('Check claimable fees for a wallet')
|
|
465
|
+
.argument('<wallet>', 'Wallet address')
|
|
466
|
+
.option('-t, --tokens <addresses>', 'Comma-separated token addresses to check')
|
|
467
|
+
.option('--network <network>', 'Network: sepolia or mainnet', 'sepolia')
|
|
468
|
+
.option('--rpc <url>', 'Custom RPC URL')
|
|
469
|
+
.option('--json', 'Output as JSON')
|
|
470
|
+
.action(async (wallet, opts) => {
|
|
471
|
+
const walletAddr = validateAddress(wallet, 'wallet');
|
|
472
|
+
const spinner = ora('Checking fees...').start();
|
|
473
|
+
try {
|
|
474
|
+
const network = getNetwork(opts);
|
|
475
|
+
const rpcUrl = getRpcUrl(network, opts);
|
|
476
|
+
const chain = getChain(network);
|
|
477
|
+
const publicClient = createPublicClient({
|
|
478
|
+
chain,
|
|
479
|
+
transport: http(rpcUrl),
|
|
480
|
+
});
|
|
481
|
+
const addresses = getAddresses(network);
|
|
482
|
+
// If specific tokens provided, validate and check those
|
|
483
|
+
const tokenAddresses = opts.tokens
|
|
484
|
+
? opts.tokens.split(',').map((t) => validateAddress(t.trim(), 'token'))
|
|
485
|
+
: [];
|
|
486
|
+
const results = [];
|
|
487
|
+
// Check fees for each token in FeeLocker
|
|
488
|
+
for (const tokenAddr of tokenAddresses) {
|
|
489
|
+
try {
|
|
490
|
+
const available = await publicClient.readContract({
|
|
491
|
+
address: addresses.clawnch.feeLocker,
|
|
492
|
+
abi: ClawnchFeeLockerABI,
|
|
493
|
+
functionName: 'availableFees',
|
|
494
|
+
args: [walletAddr, tokenAddr],
|
|
495
|
+
});
|
|
496
|
+
results.push({
|
|
497
|
+
token: tokenAddr,
|
|
498
|
+
wethAvailable: available,
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
catch {
|
|
502
|
+
// Token may not have fees
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
spinner.stop();
|
|
506
|
+
if (opts.json) {
|
|
507
|
+
console.log(JSON.stringify({
|
|
508
|
+
wallet,
|
|
509
|
+
network,
|
|
510
|
+
tokens: results.map(r => ({
|
|
511
|
+
token: r.token,
|
|
512
|
+
wethAvailable: r.wethAvailable.toString(),
|
|
513
|
+
wethFormatted: formatEther(r.wethAvailable),
|
|
514
|
+
})),
|
|
515
|
+
}, null, 2));
|
|
516
|
+
return;
|
|
517
|
+
}
|
|
518
|
+
console.log(chalk.bold.green('\n Claimable Fees\n'));
|
|
519
|
+
console.log(` ${chalk.cyan('Wallet:')} ${wallet}`);
|
|
520
|
+
console.log(` ${chalk.cyan('Network:')} ${network}`);
|
|
521
|
+
console.log();
|
|
522
|
+
if (results.length === 0) {
|
|
523
|
+
if (tokenAddresses.length === 0) {
|
|
524
|
+
console.log(chalk.yellow(' Provide token addresses with --tokens to check fees'));
|
|
525
|
+
}
|
|
526
|
+
else {
|
|
527
|
+
console.log(chalk.yellow(' No claimable fees found'));
|
|
528
|
+
}
|
|
529
|
+
console.log();
|
|
530
|
+
return;
|
|
531
|
+
}
|
|
532
|
+
const table = new Table({
|
|
533
|
+
head: [
|
|
534
|
+
chalk.cyan('Token'),
|
|
535
|
+
chalk.cyan('WETH Available'),
|
|
536
|
+
],
|
|
537
|
+
});
|
|
538
|
+
for (const r of results) {
|
|
539
|
+
table.push([
|
|
540
|
+
truncateAddress(r.token),
|
|
541
|
+
formatEther(r.wethAvailable),
|
|
542
|
+
]);
|
|
543
|
+
}
|
|
544
|
+
console.log(table.toString());
|
|
545
|
+
console.log();
|
|
546
|
+
}
|
|
547
|
+
catch (err) {
|
|
548
|
+
spinner.stop();
|
|
549
|
+
handleError(err);
|
|
550
|
+
}
|
|
551
|
+
});
|
|
552
|
+
fees
|
|
553
|
+
.command('available')
|
|
554
|
+
.description('Check available fees for a wallet (via API)')
|
|
555
|
+
.argument('<wallet>', 'Wallet address')
|
|
556
|
+
.option('-t, --tokens <addresses>', 'Comma-separated token addresses to check')
|
|
557
|
+
.option('--json', 'Output as JSON')
|
|
558
|
+
.action(async (wallet, opts) => {
|
|
559
|
+
const spinner = ora('Checking fees...').start();
|
|
560
|
+
try {
|
|
561
|
+
const client = getClient(program.opts());
|
|
562
|
+
const result = await client.getAvailableFees(wallet, opts.tokens);
|
|
563
|
+
spinner.stop();
|
|
564
|
+
if (opts.json) {
|
|
565
|
+
console.log(JSON.stringify(result, null, 2));
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
console.log(chalk.bold.green('\n Available Fees\n'));
|
|
569
|
+
console.log(` ${chalk.cyan('Wallet:')} ${wallet}`);
|
|
570
|
+
const totalWeth = result.total_weth || result.weth?.available || '0';
|
|
571
|
+
console.log(` ${chalk.cyan('Total WETH:')} ${result.weth?.formatted || formatEther(BigInt(totalWeth))} WETH`);
|
|
572
|
+
console.log();
|
|
573
|
+
if (!result.tokens?.length) {
|
|
574
|
+
console.log(chalk.yellow(' No tokens with claimable fees'));
|
|
575
|
+
return;
|
|
576
|
+
}
|
|
577
|
+
const table = new Table({
|
|
578
|
+
head: [
|
|
579
|
+
chalk.cyan('Symbol'),
|
|
580
|
+
chalk.cyan('Address'),
|
|
581
|
+
chalk.cyan('Available'),
|
|
582
|
+
],
|
|
583
|
+
});
|
|
584
|
+
result.tokens.forEach((t) => {
|
|
585
|
+
table.push([
|
|
586
|
+
chalk.bold(t.symbol),
|
|
587
|
+
truncateAddress(t.address),
|
|
588
|
+
t.formatted || formatEther(BigInt(t.available || '0')),
|
|
589
|
+
]);
|
|
590
|
+
});
|
|
591
|
+
console.log(table.toString());
|
|
592
|
+
console.log();
|
|
593
|
+
}
|
|
594
|
+
catch (err) {
|
|
595
|
+
spinner.stop();
|
|
596
|
+
handleError(err);
|
|
597
|
+
}
|
|
598
|
+
});
|
|
599
|
+
// ============================================================================
|
|
600
|
+
// Config Command
|
|
601
|
+
// ============================================================================
|
|
602
|
+
program
|
|
603
|
+
.command('config')
|
|
604
|
+
.description('Show or set CLI configuration')
|
|
605
|
+
.option('--show', 'Show current configuration')
|
|
606
|
+
.option('--network <network>', 'Set default network (sepolia or mainnet)')
|
|
607
|
+
.option('--private-key <key>', 'Set private key')
|
|
608
|
+
.option('--rpc-sepolia <url>', 'Set Sepolia RPC URL')
|
|
609
|
+
.option('--rpc-mainnet <url>', 'Set Mainnet RPC URL')
|
|
610
|
+
.option('--clear', 'Clear all configuration')
|
|
611
|
+
.action((opts) => {
|
|
612
|
+
const config = loadConfig();
|
|
613
|
+
if (opts.clear) {
|
|
614
|
+
saveConfig({});
|
|
615
|
+
console.log(chalk.green('Configuration cleared'));
|
|
616
|
+
return;
|
|
617
|
+
}
|
|
618
|
+
if (opts.network) {
|
|
619
|
+
if (opts.network !== 'sepolia' && opts.network !== 'mainnet') {
|
|
620
|
+
console.error(chalk.red('Invalid network. Use "sepolia" or "mainnet"'));
|
|
621
|
+
process.exit(1);
|
|
622
|
+
}
|
|
623
|
+
config.network = opts.network;
|
|
624
|
+
}
|
|
625
|
+
if (opts.privateKey) {
|
|
626
|
+
config.privateKey = opts.privateKey.startsWith('0x')
|
|
627
|
+
? opts.privateKey
|
|
628
|
+
: `0x${opts.privateKey}`;
|
|
629
|
+
}
|
|
630
|
+
if (opts.rpcSepolia) {
|
|
631
|
+
config.rpc = config.rpc || {};
|
|
632
|
+
config.rpc.sepolia = opts.rpcSepolia;
|
|
633
|
+
}
|
|
634
|
+
if (opts.rpcMainnet) {
|
|
635
|
+
config.rpc = config.rpc || {};
|
|
636
|
+
config.rpc.mainnet = opts.rpcMainnet;
|
|
637
|
+
}
|
|
638
|
+
// If any option was set, save config
|
|
639
|
+
if (opts.network || opts.privateKey || opts.rpcSepolia || opts.rpcMainnet) {
|
|
640
|
+
saveConfig(config);
|
|
641
|
+
console.log(chalk.green('Configuration saved'));
|
|
642
|
+
}
|
|
643
|
+
// Show config (always, or if --show)
|
|
644
|
+
if (opts.show || (!opts.network && !opts.privateKey && !opts.rpcSepolia && !opts.rpcMainnet && !opts.clear)) {
|
|
645
|
+
console.log(chalk.bold.green('\n Clawncher Configuration\n'));
|
|
646
|
+
console.log(` ${chalk.cyan('Config file:')} ${CONFIG_FILE}`);
|
|
647
|
+
console.log(` ${chalk.cyan('Network:')} ${config.network || 'sepolia (default)'}`);
|
|
648
|
+
console.log(` ${chalk.cyan('Private key:')} ${config.privateKey ? '********' + config.privateKey.slice(-4) : 'Not set'}`);
|
|
649
|
+
console.log(` ${chalk.cyan('RPC Sepolia:')} ${config.rpc?.sepolia || 'Default (https://sepolia.base.org)'}`);
|
|
650
|
+
console.log(` ${chalk.cyan('RPC Mainnet:')} ${config.rpc?.mainnet || 'Default (https://mainnet.base.org)'}`);
|
|
651
|
+
console.log();
|
|
652
|
+
console.log(chalk.gray(' Environment variables:'));
|
|
653
|
+
console.log(` CLAWNCHER_PRIVATE_KEY: ${process.env.CLAWNCHER_PRIVATE_KEY ? 'Set' : 'Not set'}`);
|
|
654
|
+
console.log();
|
|
655
|
+
}
|
|
656
|
+
});
|
|
657
|
+
// ============================================================================
|
|
658
|
+
// Tokens Command (API)
|
|
659
|
+
// ============================================================================
|
|
660
|
+
program
|
|
661
|
+
.command('tokens')
|
|
662
|
+
.description('List all tokens launched via Clawncher (API)')
|
|
663
|
+
.option('-s, --symbol <symbol>', 'Filter by symbol')
|
|
664
|
+
.option('-l, --limit <n>', 'Limit results', '20')
|
|
665
|
+
.option('--json', 'Output as JSON')
|
|
666
|
+
.action(async (opts) => {
|
|
667
|
+
const spinner = ora('Fetching tokens...').start();
|
|
668
|
+
try {
|
|
669
|
+
const client = getClient(program.opts());
|
|
670
|
+
const tokens = await client.getTokens();
|
|
671
|
+
spinner.stop();
|
|
672
|
+
let filtered = tokens;
|
|
673
|
+
if (opts.symbol) {
|
|
674
|
+
filtered = tokens.filter((t) => t.symbol.toLowerCase().includes(opts.symbol.toLowerCase()));
|
|
675
|
+
}
|
|
676
|
+
const limited = filtered.slice(0, safeParseInt(opts.limit, 'limit'));
|
|
677
|
+
if (opts.json) {
|
|
678
|
+
console.log(JSON.stringify(limited, null, 2));
|
|
679
|
+
return;
|
|
680
|
+
}
|
|
681
|
+
if (limited.length === 0) {
|
|
682
|
+
console.log(chalk.yellow('No tokens found'));
|
|
683
|
+
return;
|
|
684
|
+
}
|
|
685
|
+
const table = new Table({
|
|
686
|
+
head: [
|
|
687
|
+
chalk.cyan('Symbol'),
|
|
688
|
+
chalk.cyan('Name'),
|
|
689
|
+
chalk.cyan('Address'),
|
|
690
|
+
chalk.cyan('Agent'),
|
|
691
|
+
],
|
|
692
|
+
});
|
|
693
|
+
limited.forEach((token) => {
|
|
694
|
+
table.push([
|
|
695
|
+
chalk.bold(token.symbol),
|
|
696
|
+
token.name,
|
|
697
|
+
truncateAddress(token.address),
|
|
698
|
+
token.agent || '-',
|
|
699
|
+
]);
|
|
700
|
+
});
|
|
701
|
+
console.log(table.toString());
|
|
702
|
+
console.log(chalk.gray(`\nShowing ${limited.length} of ${filtered.length} tokens`));
|
|
703
|
+
}
|
|
704
|
+
catch (err) {
|
|
705
|
+
spinner.stop();
|
|
706
|
+
handleError(err);
|
|
707
|
+
}
|
|
708
|
+
});
|
|
709
|
+
// ============================================================================
|
|
710
|
+
// Launches Command (API)
|
|
711
|
+
// ============================================================================
|
|
712
|
+
program
|
|
713
|
+
.command('launches')
|
|
714
|
+
.description('View launch history (API)')
|
|
715
|
+
.option('-a, --agent <name>', 'Filter by agent name')
|
|
716
|
+
.option('-s, --source <source>', 'Filter by source (moltbook, 4claw, moltx)')
|
|
717
|
+
.option('-l, --limit <n>', 'Limit results', '20')
|
|
718
|
+
.option('-o, --offset <n>', 'Offset for pagination', '0')
|
|
719
|
+
.option('--json', 'Output as JSON')
|
|
720
|
+
.action(async (opts) => {
|
|
721
|
+
const spinner = ora('Fetching launches...').start();
|
|
722
|
+
try {
|
|
723
|
+
const client = getClient(program.opts());
|
|
724
|
+
const response = await client.getLaunches({
|
|
725
|
+
agent: opts.agent,
|
|
726
|
+
source: opts.source,
|
|
727
|
+
limit: safeParseInt(opts.limit, 'limit'),
|
|
728
|
+
offset: safeParseInt(opts.offset, 'offset'),
|
|
729
|
+
});
|
|
730
|
+
spinner.stop();
|
|
731
|
+
if (opts.json) {
|
|
732
|
+
console.log(JSON.stringify(response, null, 2));
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
if (response.launches.length === 0) {
|
|
736
|
+
console.log(chalk.yellow('No launches found'));
|
|
737
|
+
return;
|
|
738
|
+
}
|
|
739
|
+
const table = new Table({
|
|
740
|
+
head: [
|
|
741
|
+
chalk.cyan('Symbol'),
|
|
742
|
+
chalk.cyan('Agent'),
|
|
743
|
+
chalk.cyan('Source'),
|
|
744
|
+
chalk.cyan('Address'),
|
|
745
|
+
chalk.cyan('Date'),
|
|
746
|
+
],
|
|
747
|
+
});
|
|
748
|
+
response.launches.forEach((launch) => {
|
|
749
|
+
const agent = launch.agent || launch.agentName || '-';
|
|
750
|
+
const address = launch.address || launch.contractAddress || '';
|
|
751
|
+
const date = launch.created_at || launch.launchedAt || '';
|
|
752
|
+
table.push([
|
|
753
|
+
chalk.bold(launch.symbol),
|
|
754
|
+
agent,
|
|
755
|
+
launch.source,
|
|
756
|
+
address ? truncateAddress(address) : '-',
|
|
757
|
+
date ? new Date(date).toLocaleDateString() : '-',
|
|
758
|
+
]);
|
|
759
|
+
});
|
|
760
|
+
console.log(table.toString());
|
|
761
|
+
const total = response.total || response.pagination?.total || response.launches.length;
|
|
762
|
+
console.log(chalk.gray(`\nShowing ${response.launches.length} of ${total} launches`));
|
|
763
|
+
}
|
|
764
|
+
catch (err) {
|
|
765
|
+
spinner.stop();
|
|
766
|
+
handleError(err);
|
|
767
|
+
}
|
|
768
|
+
});
|
|
769
|
+
// ============================================================================
|
|
770
|
+
// Stats Command (API)
|
|
771
|
+
// ============================================================================
|
|
772
|
+
program
|
|
773
|
+
.command('stats')
|
|
774
|
+
.description('Get Clawncher market statistics (API)')
|
|
775
|
+
.option('--json', 'Output as JSON')
|
|
776
|
+
.action(async (opts) => {
|
|
777
|
+
const spinner = ora('Fetching stats...').start();
|
|
778
|
+
try {
|
|
779
|
+
const client = getClient(program.opts());
|
|
780
|
+
const stats = await client.getStats();
|
|
781
|
+
spinner.stop();
|
|
782
|
+
if (opts.json) {
|
|
783
|
+
console.log(JSON.stringify(stats, null, 2));
|
|
784
|
+
return;
|
|
785
|
+
}
|
|
786
|
+
console.log(chalk.bold.green('\n Clawncher Statistics\n'));
|
|
787
|
+
console.log(` ${chalk.cyan('Total Tokens:')} ${(stats.totalTokens || stats.total_tokens || 0).toLocaleString()}`);
|
|
788
|
+
console.log(` ${chalk.cyan('Total Volume:')} ${stats.totalVolume || stats.total_volume || '-'}`);
|
|
789
|
+
console.log(` ${chalk.cyan('$CLAWNCH Price:')} ${stats.clawnchPrice || stats.clawncherPrice || '-'}`);
|
|
790
|
+
console.log(` ${chalk.cyan('Market Cap:')} ${stats.clawnchMarketCap || '-'}`);
|
|
791
|
+
console.log();
|
|
792
|
+
}
|
|
793
|
+
catch (err) {
|
|
794
|
+
spinner.stop();
|
|
795
|
+
handleError(err);
|
|
796
|
+
}
|
|
797
|
+
});
|
|
798
|
+
// ============================================================================
|
|
799
|
+
// Addresses Command
|
|
800
|
+
// ============================================================================
|
|
801
|
+
program
|
|
802
|
+
.command('addresses')
|
|
803
|
+
.description('Show contract addresses for a network')
|
|
804
|
+
.option('--network <network>', 'Network: sepolia or mainnet', 'sepolia')
|
|
805
|
+
.option('--json', 'Output as JSON')
|
|
806
|
+
.action((opts) => {
|
|
807
|
+
const network = getNetwork(opts);
|
|
808
|
+
const addresses = getAddresses(network);
|
|
809
|
+
if (opts.json) {
|
|
810
|
+
console.log(JSON.stringify(addresses, null, 2));
|
|
811
|
+
return;
|
|
812
|
+
}
|
|
813
|
+
console.log(chalk.bold.green(`\n Clawncher Addresses (${network})\n`));
|
|
814
|
+
console.log(chalk.cyan(' Clawncher Contracts:'));
|
|
815
|
+
console.log(` Factory: ${addresses.clawnch.factory}`);
|
|
816
|
+
console.log(` Hook: ${addresses.clawnch.hook}`);
|
|
817
|
+
console.log(` Locker: ${addresses.clawnch.locker}`);
|
|
818
|
+
console.log(` FeeLocker: ${addresses.clawnch.feeLocker}`);
|
|
819
|
+
console.log(` MevModule: ${addresses.clawnch.mevModule}`);
|
|
820
|
+
console.log(` Vault: ${addresses.clawnch.vault}`);
|
|
821
|
+
console.log(` AirdropV2: ${addresses.clawnch.airdropV2}`);
|
|
822
|
+
console.log(` DevBuy: ${addresses.clawnch.devBuy}`);
|
|
823
|
+
console.log();
|
|
824
|
+
console.log(chalk.cyan(' Infrastructure:'));
|
|
825
|
+
console.log(` PoolManager: ${addresses.infrastructure.poolManager}`);
|
|
826
|
+
console.log(` PositionManager: ${addresses.infrastructure.positionManager}`);
|
|
827
|
+
console.log(` UniversalRouter: ${addresses.infrastructure.universalRouter}`);
|
|
828
|
+
console.log(` WETH: ${addresses.infrastructure.weth}`);
|
|
829
|
+
console.log(` Permit2: ${addresses.infrastructure.permit2}`);
|
|
830
|
+
console.log();
|
|
831
|
+
});
|
|
832
|
+
// ============================================================================
|
|
833
|
+
// Help/Info Command
|
|
834
|
+
// ============================================================================
|
|
835
|
+
program
|
|
836
|
+
.command('about')
|
|
837
|
+
.description('Show Clawncher information and links')
|
|
838
|
+
.action(() => {
|
|
839
|
+
console.log(chalk.bold.green(`
|
|
840
|
+
██████╗██╗ █████╗ ██╗ ██╗███╗ ██╗ ██████╗██╗ ██╗███████╗██████╗
|
|
841
|
+
██╔════╝██║ ██╔══██╗██║ ██║████╗ ██║ ██╔════╝██║ ██║██╔════╝██╔══██╗
|
|
842
|
+
██║ ██║ ███████║██║ █╗ ██║██╔██╗ ██║ ██║ ███████║█████╗ ██████╔╝
|
|
843
|
+
██║ ██║ ██╔══██║██║███╗██║██║╚██╗██║ ██║ ██╔══██║██╔══╝ ██╔══██╗
|
|
844
|
+
╚██████╗███████╗ ██║ ██║╚███╔███╔╝██║ ╚████║ ╚██████╗██║ ██║███████╗██║ ██║
|
|
845
|
+
╚═════╝╚══════╝╚═╝ ╚═╝ ╚══╝╚══╝ ╚═╝ ╚═══╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
|
|
846
|
+
`));
|
|
847
|
+
console.log(' Token launcher on Base with Uniswap V4 pools.\n');
|
|
848
|
+
console.log(` ${chalk.cyan('Website:')} https://clawn.ch`);
|
|
849
|
+
console.log(` ${chalk.cyan('Agent Skill:')} https://clawn.ch/skill`);
|
|
850
|
+
console.log(` ${chalk.cyan('Tech Docs:')} https://clawn.ch/docs`);
|
|
851
|
+
console.log(` ${chalk.cyan('OpenAPI:')} https://clawn.ch/api/openapi`);
|
|
852
|
+
console.log(` ${chalk.cyan('SDK:')} npm install @clawnch/clawncher-sdk`);
|
|
853
|
+
console.log(` ${chalk.cyan('CLI:')} npm install -g clawncher`);
|
|
854
|
+
console.log();
|
|
855
|
+
console.log(chalk.gray(' Quick start:'));
|
|
856
|
+
console.log(chalk.gray(' clawncher config --private-key <your-key>'));
|
|
857
|
+
console.log(chalk.gray(' clawncher deploy --name "My Token" --symbol MYTKN'));
|
|
858
|
+
console.log();
|
|
859
|
+
});
|
|
860
|
+
// Parse and run
|
|
861
|
+
program.parse();
|
|
862
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "clawncher",
|
|
3
|
+
"version": "2.0.0",
|
|
4
|
+
"description": "CLI for Clawncher - deploy tokens on Base with Uniswap V4 pools",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"clawncher": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"main": "dist/cli.js",
|
|
10
|
+
"files": [
|
|
11
|
+
"dist",
|
|
12
|
+
"README.md"
|
|
13
|
+
],
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "tsc",
|
|
16
|
+
"dev": "tsc --watch",
|
|
17
|
+
"clean": "rm -rf dist",
|
|
18
|
+
"prepublishOnly": "npm run build"
|
|
19
|
+
},
|
|
20
|
+
"keywords": [
|
|
21
|
+
"clawncher",
|
|
22
|
+
"clawnch",
|
|
23
|
+
"base",
|
|
24
|
+
"memecoin",
|
|
25
|
+
"clanker",
|
|
26
|
+
"ai-agent",
|
|
27
|
+
"crypto",
|
|
28
|
+
"cli",
|
|
29
|
+
"uniswap",
|
|
30
|
+
"v4"
|
|
31
|
+
],
|
|
32
|
+
"author": "Clawncher",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/clawnch/clawncher"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://clawn.ch",
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"dependencies": {
|
|
43
|
+
"@clawnch/clawncher-sdk": "^2.0.0",
|
|
44
|
+
"commander": "^12.1.0",
|
|
45
|
+
"chalk": "^5.3.0",
|
|
46
|
+
"ora": "^8.1.0",
|
|
47
|
+
"cli-table3": "^0.6.5",
|
|
48
|
+
"viem": "^2.21.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@types/node": "^22.10.0",
|
|
52
|
+
"typescript": "^5.7.2"
|
|
53
|
+
}
|
|
54
|
+
}
|