@claws.fun/cli 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.
Files changed (48) hide show
  1. package/README.md +204 -0
  2. package/dist/commands/buy.d.ts +6 -0
  3. package/dist/commands/buy.d.ts.map +1 -0
  4. package/dist/commands/buy.js +120 -0
  5. package/dist/commands/buy.js.map +1 -0
  6. package/dist/commands/claim.d.ts +6 -0
  7. package/dist/commands/claim.d.ts.map +1 -0
  8. package/dist/commands/claim.js +141 -0
  9. package/dist/commands/claim.js.map +1 -0
  10. package/dist/commands/config.d.ts +6 -0
  11. package/dist/commands/config.d.ts.map +1 -0
  12. package/dist/commands/config.js +107 -0
  13. package/dist/commands/config.js.map +1 -0
  14. package/dist/commands/create.d.ts +6 -0
  15. package/dist/commands/create.d.ts.map +1 -0
  16. package/dist/commands/create.js +174 -0
  17. package/dist/commands/create.js.map +1 -0
  18. package/dist/commands/sell.d.ts +6 -0
  19. package/dist/commands/sell.d.ts.map +1 -0
  20. package/dist/commands/sell.js +134 -0
  21. package/dist/commands/sell.js.map +1 -0
  22. package/dist/commands/status.d.ts +6 -0
  23. package/dist/commands/status.d.ts.map +1 -0
  24. package/dist/commands/status.js +138 -0
  25. package/dist/commands/status.js.map +1 -0
  26. package/dist/index.d.ts +16 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +38 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/utils/config.d.ts +30 -0
  31. package/dist/utils/config.d.ts.map +1 -0
  32. package/dist/utils/config.js +176 -0
  33. package/dist/utils/config.js.map +1 -0
  34. package/dist/utils/contracts.d.ts +15 -0
  35. package/dist/utils/contracts.d.ts.map +1 -0
  36. package/dist/utils/contracts.js +90 -0
  37. package/dist/utils/contracts.js.map +1 -0
  38. package/package.json +48 -0
  39. package/src/commands/buy.ts +136 -0
  40. package/src/commands/claim.ts +152 -0
  41. package/src/commands/config.ts +77 -0
  42. package/src/commands/create.ts +217 -0
  43. package/src/commands/sell.ts +149 -0
  44. package/src/commands/status.ts +148 -0
  45. package/src/index.ts +41 -0
  46. package/src/utils/config.ts +159 -0
  47. package/src/utils/contracts.ts +92 -0
  48. package/tsconfig.json +20 -0
@@ -0,0 +1,159 @@
1
+ /**
2
+ * Configuration management for claws CLI
3
+ */
4
+
5
+ import { ethers } from 'ethers';
6
+ import * as fs from 'fs';
7
+ import * as path from 'path';
8
+ import * as os from 'os';
9
+
10
+ // Contract addresses by network
11
+ export const ADDRESSES: Record<string, Record<string, string>> = {
12
+ sepolia: {
13
+ // V2 deployment - LP to FeeCollector (no Safe approval needed)
14
+ factory: '0x9dA76578Eb1f04d4235be9b9C71853D99E0C2EBE',
15
+ birthCertificate: '0xE0a9212dd519D02f4F70529d78eC5a61b9b4e7b2',
16
+ bondingCurve: '0x4812eacD5e4aAd57ABD9F68C89606E63e4e53BfE',
17
+ feeCollector: '0xD6Bd2Ba272AA89755d5829F4275dc023c9EF5Fa3',
18
+ memoryStorage: '0x0b348d3faF6752BA09Fae5CbF657F4A77Cb86d48',
19
+ swapRouter: '0x3bFA4769FB09eefC5a80d6E87c3B9C650f7Ae48E',
20
+ weth: '0xfff9976782d46cc05630d1f6ebab18b2324d6b14',
21
+ },
22
+ base: {
23
+ factory: 'TBD',
24
+ birthCertificate: 'TBD',
25
+ bondingCurve: 'TBD',
26
+ feeCollector: 'TBD',
27
+ memoryStorage: 'TBD',
28
+ swapRouter: '0x2626664c2603336E57B271c5C0b26F421741e481',
29
+ weth: '0x4200000000000000000000000000000000000006',
30
+ },
31
+ };
32
+
33
+ // RPC endpoints
34
+ export const RPC_URLS: Record<string, string> = {
35
+ sepolia: 'https://rpc.sepolia.org',
36
+ base: 'https://mainnet.base.org',
37
+ };
38
+
39
+ // Simple file-based config storage
40
+ const CONFIG_DIR = path.join(os.homedir(), '.claws');
41
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
42
+
43
+ interface ConfigData {
44
+ network: string;
45
+ privateKey: string;
46
+ rpcUrl: string;
47
+ }
48
+
49
+ function ensureConfigDir(): void {
50
+ if (!fs.existsSync(CONFIG_DIR)) {
51
+ fs.mkdirSync(CONFIG_DIR, { recursive: true });
52
+ }
53
+ }
54
+
55
+ function loadConfigFile(): ConfigData {
56
+ ensureConfigDir();
57
+ if (fs.existsSync(CONFIG_FILE)) {
58
+ try {
59
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf-8'));
60
+ } catch {
61
+ return { network: 'sepolia', privateKey: '', rpcUrl: '' };
62
+ }
63
+ }
64
+ return { network: 'sepolia', privateKey: '', rpcUrl: '' };
65
+ }
66
+
67
+ function saveConfigFile(data: ConfigData): void {
68
+ ensureConfigDir();
69
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(data, null, 2));
70
+ }
71
+
72
+ // Config store wrapper
73
+ const config = {
74
+ get(key: keyof ConfigData): string {
75
+ const data = loadConfigFile();
76
+ return data[key] || '';
77
+ },
78
+ set(key: keyof ConfigData, value: string): void {
79
+ const data = loadConfigFile();
80
+ data[key] = value;
81
+ saveConfigFile(data);
82
+ },
83
+ };
84
+
85
+ export interface CLIConfig {
86
+ network: string;
87
+ privateKey: string;
88
+ rpcUrl: string;
89
+ }
90
+
91
+ export function getConfig(): CLIConfig {
92
+ return {
93
+ network: config.get('network') || 'sepolia',
94
+ privateKey: config.get('privateKey'),
95
+ rpcUrl: config.get('rpcUrl'),
96
+ };
97
+ }
98
+
99
+ export function setConfig(key: keyof ConfigData, value: string): void {
100
+ config.set(key, value);
101
+ }
102
+
103
+ export function getNetworkAddresses(): Record<string, string> {
104
+ const network = config.get('network') || 'sepolia';
105
+ return ADDRESSES[network] || ADDRESSES.sepolia;
106
+ }
107
+
108
+ export function getRpcUrl(): string {
109
+ const customRpc = config.get('rpcUrl');
110
+ if (customRpc) return customRpc;
111
+
112
+ const network = config.get('network') || 'sepolia';
113
+ return RPC_URLS[network] || RPC_URLS.sepolia;
114
+ }
115
+
116
+ export function getProvider(): ethers.JsonRpcProvider {
117
+ return new ethers.JsonRpcProvider(getRpcUrl());
118
+ }
119
+
120
+ export function getWallet(): ethers.Wallet | null {
121
+ const privateKey = config.get('privateKey');
122
+ if (!privateKey) return null;
123
+
124
+ try {
125
+ const provider = getProvider();
126
+ return new ethers.Wallet(privateKey, provider);
127
+ } catch (error) {
128
+ return null;
129
+ }
130
+ }
131
+
132
+ export function hasWallet(): boolean {
133
+ const privateKey = config.get('privateKey');
134
+ return !!privateKey;
135
+ }
136
+
137
+ // Load private key from environment or file
138
+ export function loadPrivateKey(): string | null {
139
+ // 1. Check environment variable
140
+ if (process.env.CLAWS_PRIVATE_KEY) {
141
+ return process.env.CLAWS_PRIVATE_KEY;
142
+ }
143
+
144
+ // 2. Check .env file in current directory
145
+ const envPath = path.join(process.cwd(), '.env');
146
+ if (fs.existsSync(envPath)) {
147
+ const envContent = fs.readFileSync(envPath, 'utf-8');
148
+ const match = envContent.match(/CLAWS_PRIVATE_KEY=(.+)/);
149
+ if (match) return match[1].trim();
150
+ }
151
+
152
+ // 3. Check config
153
+ const configKey = config.get('privateKey');
154
+ if (configKey) return configKey;
155
+
156
+ return null;
157
+ }
158
+
159
+ export { config };
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Contract utilities for claws CLI
3
+ */
4
+
5
+ import { ethers, Contract, Wallet } from 'ethers';
6
+ import { getNetworkAddresses, getWallet, getProvider } from './config';
7
+
8
+ // Minimal ABIs for CLI operations
9
+ export const FACTORY_ABI = [
10
+ 'function createAgent(address agentWallet, address creatorWallet, string name, string symbol, string socialHandle, string memoryCID, string avatarCID, string ensName) external payable returns (address token, uint256 nftId, address pool, uint256 positionId)',
11
+ 'function createAgent(address agentWallet, address creatorWallet, string name, string symbol, string socialHandle, string memoryCID, string avatarCID, string ensName, uint256 initialBuyETH) external payable returns (address token, uint256 nftId, address pool, uint256 positionId)',
12
+ 'function createMicroAgent(address agentWallet, address creatorWallet, string name, string symbol, string socialHandle, string memoryCID, string avatarCID, string ensName, uint256 initialBuyETH) external payable returns (address token, uint256 nftId, address pool, uint256 positionId)',
13
+ 'function tokenByWallet(address) external view returns (address)',
14
+ 'function walletByToken(address) external view returns (address)',
15
+ 'function isAgent(address) external view returns (bool)',
16
+ 'function agentTier(address) external view returns (uint8)',
17
+ 'function PREMIUM_TOTAL() external view returns (uint256)',
18
+ 'function MICRO_TOTAL() external view returns (uint256)',
19
+ 'event AgentBorn(address indexed wallet, address indexed token, address indexed creator, uint256 nftId, address pool, uint256 positionId, string name, uint8 tier, uint256 initialBuyAmount, uint256 timestamp)',
20
+ ];
21
+
22
+ export const TOKEN_ABI = [
23
+ 'function name() external view returns (string)',
24
+ 'function symbol() external view returns (string)',
25
+ 'function decimals() external view returns (uint8)',
26
+ 'function totalSupply() external view returns (uint256)',
27
+ 'function balanceOf(address) external view returns (uint256)',
28
+ 'function transfer(address to, uint256 amount) external returns (bool)',
29
+ 'function approve(address spender, uint256 amount) external returns (bool)',
30
+ 'function agentWallet() external view returns (address)',
31
+ 'function creator() external view returns (address)',
32
+ 'function birthTimestamp() external view returns (uint256)',
33
+ 'function selfCreated() external view returns (bool)',
34
+ 'function launchBlock() external view returns (uint256)',
35
+ 'function getCurrentTaxBps() external view returns (uint256)',
36
+ 'function pool() external view returns (address)',
37
+ 'function feeCollector() external view returns (address)',
38
+ ];
39
+
40
+ export const FEE_COLLECTOR_ABI = [
41
+ 'function collectSingle(address token) external',
42
+ 'function collectBatch(address[] tokens) external',
43
+ 'function manualClaim(address token) external',
44
+ 'function sellTokenTax(address token) external',
45
+ 'function getTotalCollected(address token) external view returns (uint256)',
46
+ 'function getLastCollectionBlock(address token) external view returns (uint256)',
47
+ 'function getPositionId(address token) external view returns (uint256)',
48
+ 'function getFeeSplits(address token) external view returns (uint256 agentPercent, uint256 creatorPercent, uint256 platformPercent, string splitType)',
49
+ 'function getPendingTokenTax(address token) external view returns (uint256)',
50
+ ];
51
+
52
+ export const SWAP_ROUTER_ABI = [
53
+ 'function exactInputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountIn, uint256 amountOutMinimum, uint160 sqrtPriceLimitX96)) external payable returns (uint256 amountOut)',
54
+ 'function exactOutputSingle((address tokenIn, address tokenOut, uint24 fee, address recipient, uint256 amountOut, uint256 amountInMaximum, uint160 sqrtPriceLimitX96)) external payable returns (uint256 amountIn)',
55
+ ];
56
+
57
+ export const WETH_ABI = [
58
+ 'function deposit() external payable',
59
+ 'function withdraw(uint256) external',
60
+ 'function approve(address spender, uint256 amount) external returns (bool)',
61
+ 'function balanceOf(address) external view returns (uint256)',
62
+ ];
63
+
64
+ // Contract getters
65
+ export function getFactoryContract(wallet?: Wallet): Contract {
66
+ const addresses = getNetworkAddresses();
67
+ const signerOrProvider = wallet || getProvider();
68
+ return new Contract(addresses.factory, FACTORY_ABI, signerOrProvider);
69
+ }
70
+
71
+ export function getTokenContract(tokenAddress: string, wallet?: Wallet): Contract {
72
+ const signerOrProvider = wallet || getProvider();
73
+ return new Contract(tokenAddress, TOKEN_ABI, signerOrProvider);
74
+ }
75
+
76
+ export function getFeeCollectorContract(wallet?: Wallet): Contract {
77
+ const addresses = getNetworkAddresses();
78
+ const signerOrProvider = wallet || getProvider();
79
+ return new Contract(addresses.feeCollector, FEE_COLLECTOR_ABI, signerOrProvider);
80
+ }
81
+
82
+ export function getSwapRouterContract(wallet?: Wallet): Contract {
83
+ const addresses = getNetworkAddresses();
84
+ const signerOrProvider = wallet || getProvider();
85
+ return new Contract(addresses.swapRouter, SWAP_ROUTER_ABI, signerOrProvider);
86
+ }
87
+
88
+ export function getWethContract(wallet?: Wallet): Contract {
89
+ const addresses = getNetworkAddresses();
90
+ const signerOrProvider = wallet || getProvider();
91
+ return new Contract(addresses.weth, WETH_ABI, signerOrProvider);
92
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,20 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2020",
4
+ "module": "commonjs",
5
+ "lib": ["ES2020"],
6
+ "outDir": "./dist",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "resolveJsonModule": true,
13
+ "declaration": true,
14
+ "declarationMap": true,
15
+ "sourceMap": true,
16
+ "moduleResolution": "node"
17
+ },
18
+ "include": ["src/**/*"],
19
+ "exclude": ["node_modules", "dist"]
20
+ }