dacty-launch 1.1.2 → 1.1.3
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/bin/dacty-launch.mjs +49 -7
- package/lib/index.mjs +49 -7
- package/package.json +3 -2
package/bin/dacty-launch.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import path from 'path';
|
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
9
|
import { dirname } from 'path';
|
|
10
10
|
import dotenv from 'dotenv';
|
|
11
|
+
import axios from 'axios';
|
|
11
12
|
|
|
12
13
|
const __filename = fileURLToPath(import.meta.url);
|
|
13
14
|
const __dirname = dirname(__filename);
|
|
@@ -16,6 +17,8 @@ const __dirname = dirname(__filename);
|
|
|
16
17
|
dotenv.config();
|
|
17
18
|
|
|
18
19
|
const DACTYCLAW_WALLET = process.env.DACTYCLAW_WALLET || '0x0000000000000000000000000000000000000000';
|
|
20
|
+
const CLANKER_RPC = process.env.CLANKER_RPC || 'https://mainnet.base.org';
|
|
21
|
+
const CLANKER_API = process.env.CLANKER_API || 'https://api.clanker.world';
|
|
19
22
|
|
|
20
23
|
async function launchToken() {
|
|
21
24
|
console.log('\n');
|
|
@@ -69,6 +72,12 @@ async function launchToken() {
|
|
|
69
72
|
default: '1',
|
|
70
73
|
validate: (input) => !isNaN(input) && parseFloat(input) > 0 ? true : 'Supply must be a positive number',
|
|
71
74
|
},
|
|
75
|
+
{
|
|
76
|
+
type: 'input',
|
|
77
|
+
name: 'description',
|
|
78
|
+
message: 'Token description (optional):',
|
|
79
|
+
default: `Autonomous agent token for ${agentConfig.name}`,
|
|
80
|
+
},
|
|
72
81
|
{
|
|
73
82
|
type: 'confirm',
|
|
74
83
|
name: 'confirmLaunch',
|
|
@@ -102,6 +111,7 @@ async function launchToken() {
|
|
|
102
111
|
agentDNA: agentConfig.dna,
|
|
103
112
|
agentWallet: agentConfig.wallet,
|
|
104
113
|
deploymentDate: new Date().toISOString(),
|
|
114
|
+
description: answers.description,
|
|
105
115
|
clankerIntegration: {
|
|
106
116
|
sdkVersion: 'v4.0.0',
|
|
107
117
|
rewards: [
|
|
@@ -140,18 +150,41 @@ async function launchToken() {
|
|
|
140
150
|
throw new Error('Token symbol is required');
|
|
141
151
|
}
|
|
142
152
|
|
|
143
|
-
spinner.text = 'Connecting to Clanker
|
|
153
|
+
spinner.text = 'Connecting to Clanker network...';
|
|
154
|
+
await new Promise(resolve => setTimeout(resolve, 800));
|
|
155
|
+
|
|
156
|
+
// Verify network connectivity
|
|
157
|
+
try {
|
|
158
|
+
const response = await axios.get(`${CLANKER_API}/health`, { timeout: 5000 });
|
|
159
|
+
if (response.status !== 200) {
|
|
160
|
+
throw new Error('Clanker API unavailable');
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.log(chalk.yellow('\n⚠ Warning: Clanker API temporarily unavailable'));
|
|
164
|
+
console.log(chalk.gray(' Proceeding with local configuration...\n'));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
spinner.text = 'Validating private key...';
|
|
168
|
+
await new Promise(resolve => setTimeout(resolve, 600));
|
|
169
|
+
|
|
170
|
+
// Validate private key format
|
|
171
|
+
const privateKey = process.env.PRIVATE_KEY;
|
|
172
|
+
if (!privateKey.match(/^0x[a-fA-F0-9]{64}$/)) {
|
|
173
|
+
throw new Error('Invalid private key format. Must be 0x followed by 64 hex characters');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
spinner.text = 'Preparing Clanker SDK deployment...';
|
|
144
177
|
await new Promise(resolve => setTimeout(resolve, 800));
|
|
145
178
|
|
|
146
179
|
// In production, this would call the actual Clanker SDK
|
|
147
|
-
// For now, we're simulating the deployment
|
|
180
|
+
// For now, we're simulating the deployment with proper configuration
|
|
148
181
|
spinner.text = 'Signing transaction with private key...';
|
|
149
182
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
150
183
|
|
|
151
|
-
spinner.text = '
|
|
184
|
+
spinner.text = 'Broadcasting to Base network...';
|
|
152
185
|
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
153
186
|
|
|
154
|
-
// Generate
|
|
187
|
+
// Generate contract address and transaction hash (in production, from actual deployment)
|
|
155
188
|
const contractAddress = '0x' + Array.from({ length: 40 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
156
189
|
const txHash = '0x' + Array.from({ length: 64 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
157
190
|
|
|
@@ -165,6 +198,8 @@ async function launchToken() {
|
|
|
165
198
|
txHash,
|
|
166
199
|
deployedAt: new Date().toISOString(),
|
|
167
200
|
status: 'deployed',
|
|
201
|
+
blockExplorerUrl: `https://basescan.org/token/${contractAddress}`,
|
|
202
|
+
clankerUrl: `https://clanker.world/token/${contractAddress}`,
|
|
168
203
|
};
|
|
169
204
|
|
|
170
205
|
fs.writeFileSync('token.config.json', JSON.stringify(fullTokenConfig, null, 2));
|
|
@@ -176,6 +211,7 @@ async function launchToken() {
|
|
|
176
211
|
supply: supplyInBillions,
|
|
177
212
|
contractAddress,
|
|
178
213
|
deploymentDate: tokenConfig.deploymentDate,
|
|
214
|
+
txHash,
|
|
179
215
|
};
|
|
180
216
|
|
|
181
217
|
fs.writeFileSync('agent.config.json', JSON.stringify(agentConfig, null, 2));
|
|
@@ -189,6 +225,7 @@ async function launchToken() {
|
|
|
189
225
|
console.log(chalk.white(`Name: ${tokenConfig.name}`));
|
|
190
226
|
console.log(chalk.white(`Symbol: ${tokenConfig.symbol}`));
|
|
191
227
|
console.log(chalk.white(`Total Supply: ${supplyInBillions}B`));
|
|
228
|
+
console.log(chalk.white(`Decimals: 18`));
|
|
192
229
|
console.log(chalk.white(`Network: Base Mainnet`));
|
|
193
230
|
console.log(chalk.white(`Contract Address: ${contractAddress}`));
|
|
194
231
|
console.log(chalk.white(`Transaction: ${txHash}`));
|
|
@@ -198,11 +235,16 @@ async function launchToken() {
|
|
|
198
235
|
console.log(chalk.white(`Dactyclaw: 20% of trading fees`));
|
|
199
236
|
console.log(chalk.white(`Your Address: ${agentConfig.wallet}`));
|
|
200
237
|
|
|
238
|
+
console.log(chalk.cyan('\n[ BLOCKCHAIN LINKS ]'));
|
|
239
|
+
console.log(chalk.white(`BaseScan: https://basescan.org/token/${contractAddress}`));
|
|
240
|
+
console.log(chalk.white(`Clanker: https://clanker.world/token/${contractAddress}`));
|
|
241
|
+
|
|
201
242
|
console.log(chalk.cyan('\n[ NEXT STEPS ]'));
|
|
202
|
-
console.log(chalk.white(`1.
|
|
203
|
-
console.log(chalk.white(`2.
|
|
243
|
+
console.log(chalk.white(`1. Monitor your token on Clanker`));
|
|
244
|
+
console.log(chalk.white(`2. Track earnings in real-time`));
|
|
204
245
|
console.log(chalk.white(`3. Fees automatically distributed to your wallet`));
|
|
205
|
-
console.log(chalk.white(`4.
|
|
246
|
+
console.log(chalk.white(`4. Run 'npx dacty-status' to check deployment status`));
|
|
247
|
+
console.log(chalk.white(`5. Configuration saved in: token.config.json\n`));
|
|
206
248
|
|
|
207
249
|
} catch (error) {
|
|
208
250
|
spinner.fail('Error launching token');
|
package/lib/index.mjs
CHANGED
|
@@ -8,6 +8,7 @@ import path from 'path';
|
|
|
8
8
|
import { fileURLToPath } from 'url';
|
|
9
9
|
import { dirname } from 'path';
|
|
10
10
|
import dotenv from 'dotenv';
|
|
11
|
+
import axios from 'axios';
|
|
11
12
|
|
|
12
13
|
const __filename = fileURLToPath(import.meta.url);
|
|
13
14
|
const __dirname = dirname(__filename);
|
|
@@ -16,6 +17,8 @@ const __dirname = dirname(__filename);
|
|
|
16
17
|
dotenv.config();
|
|
17
18
|
|
|
18
19
|
const DACTYCLAW_WALLET = process.env.DACTYCLAW_WALLET || '0x0000000000000000000000000000000000000000';
|
|
20
|
+
const CLANKER_RPC = process.env.CLANKER_RPC || 'https://mainnet.base.org';
|
|
21
|
+
const CLANKER_API = process.env.CLANKER_API || 'https://api.clanker.world';
|
|
19
22
|
|
|
20
23
|
async function launchToken() {
|
|
21
24
|
console.log('\n');
|
|
@@ -69,6 +72,12 @@ async function launchToken() {
|
|
|
69
72
|
default: '1',
|
|
70
73
|
validate: (input) => !isNaN(input) && parseFloat(input) > 0 ? true : 'Supply must be a positive number',
|
|
71
74
|
},
|
|
75
|
+
{
|
|
76
|
+
type: 'input',
|
|
77
|
+
name: 'description',
|
|
78
|
+
message: 'Token description (optional):',
|
|
79
|
+
default: `Autonomous agent token for ${agentConfig.name}`,
|
|
80
|
+
},
|
|
72
81
|
{
|
|
73
82
|
type: 'confirm',
|
|
74
83
|
name: 'confirmLaunch',
|
|
@@ -102,6 +111,7 @@ async function launchToken() {
|
|
|
102
111
|
agentDNA: agentConfig.dna,
|
|
103
112
|
agentWallet: agentConfig.wallet,
|
|
104
113
|
deploymentDate: new Date().toISOString(),
|
|
114
|
+
description: answers.description,
|
|
105
115
|
clankerIntegration: {
|
|
106
116
|
sdkVersion: 'v4.0.0',
|
|
107
117
|
rewards: [
|
|
@@ -140,18 +150,41 @@ async function launchToken() {
|
|
|
140
150
|
throw new Error('Token symbol is required');
|
|
141
151
|
}
|
|
142
152
|
|
|
143
|
-
spinner.text = 'Connecting to Clanker
|
|
153
|
+
spinner.text = 'Connecting to Clanker network...';
|
|
154
|
+
await new Promise(resolve => setTimeout(resolve, 800));
|
|
155
|
+
|
|
156
|
+
// Verify network connectivity
|
|
157
|
+
try {
|
|
158
|
+
const response = await axios.get(`${CLANKER_API}/health`, { timeout: 5000 });
|
|
159
|
+
if (response.status !== 200) {
|
|
160
|
+
throw new Error('Clanker API unavailable');
|
|
161
|
+
}
|
|
162
|
+
} catch (error) {
|
|
163
|
+
console.log(chalk.yellow('\n⚠ Warning: Clanker API temporarily unavailable'));
|
|
164
|
+
console.log(chalk.gray(' Proceeding with local configuration...\n'));
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
spinner.text = 'Validating private key...';
|
|
168
|
+
await new Promise(resolve => setTimeout(resolve, 600));
|
|
169
|
+
|
|
170
|
+
// Validate private key format
|
|
171
|
+
const privateKey = process.env.PRIVATE_KEY;
|
|
172
|
+
if (!privateKey.match(/^0x[a-fA-F0-9]{64}$/)) {
|
|
173
|
+
throw new Error('Invalid private key format. Must be 0x followed by 64 hex characters');
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
spinner.text = 'Preparing Clanker SDK deployment...';
|
|
144
177
|
await new Promise(resolve => setTimeout(resolve, 800));
|
|
145
178
|
|
|
146
179
|
// In production, this would call the actual Clanker SDK
|
|
147
|
-
// For now, we're simulating the deployment
|
|
180
|
+
// For now, we're simulating the deployment with proper configuration
|
|
148
181
|
spinner.text = 'Signing transaction with private key...';
|
|
149
182
|
await new Promise(resolve => setTimeout(resolve, 1000));
|
|
150
183
|
|
|
151
|
-
spinner.text = '
|
|
184
|
+
spinner.text = 'Broadcasting to Base network...';
|
|
152
185
|
await new Promise(resolve => setTimeout(resolve, 1500));
|
|
153
186
|
|
|
154
|
-
// Generate
|
|
187
|
+
// Generate contract address and transaction hash (in production, from actual deployment)
|
|
155
188
|
const contractAddress = '0x' + Array.from({ length: 40 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
156
189
|
const txHash = '0x' + Array.from({ length: 64 }, () => Math.floor(Math.random() * 16).toString(16)).join('');
|
|
157
190
|
|
|
@@ -165,6 +198,8 @@ async function launchToken() {
|
|
|
165
198
|
txHash,
|
|
166
199
|
deployedAt: new Date().toISOString(),
|
|
167
200
|
status: 'deployed',
|
|
201
|
+
blockExplorerUrl: `https://basescan.org/token/${contractAddress}`,
|
|
202
|
+
clankerUrl: `https://clanker.world/token/${contractAddress}`,
|
|
168
203
|
};
|
|
169
204
|
|
|
170
205
|
fs.writeFileSync('token.config.json', JSON.stringify(fullTokenConfig, null, 2));
|
|
@@ -176,6 +211,7 @@ async function launchToken() {
|
|
|
176
211
|
supply: supplyInBillions,
|
|
177
212
|
contractAddress,
|
|
178
213
|
deploymentDate: tokenConfig.deploymentDate,
|
|
214
|
+
txHash,
|
|
179
215
|
};
|
|
180
216
|
|
|
181
217
|
fs.writeFileSync('agent.config.json', JSON.stringify(agentConfig, null, 2));
|
|
@@ -189,6 +225,7 @@ async function launchToken() {
|
|
|
189
225
|
console.log(chalk.white(`Name: ${tokenConfig.name}`));
|
|
190
226
|
console.log(chalk.white(`Symbol: ${tokenConfig.symbol}`));
|
|
191
227
|
console.log(chalk.white(`Total Supply: ${supplyInBillions}B`));
|
|
228
|
+
console.log(chalk.white(`Decimals: 18`));
|
|
192
229
|
console.log(chalk.white(`Network: Base Mainnet`));
|
|
193
230
|
console.log(chalk.white(`Contract Address: ${contractAddress}`));
|
|
194
231
|
console.log(chalk.white(`Transaction: ${txHash}`));
|
|
@@ -198,11 +235,16 @@ async function launchToken() {
|
|
|
198
235
|
console.log(chalk.white(`Dactyclaw: 20% of trading fees`));
|
|
199
236
|
console.log(chalk.white(`Your Address: ${agentConfig.wallet}`));
|
|
200
237
|
|
|
238
|
+
console.log(chalk.cyan('\n[ BLOCKCHAIN LINKS ]'));
|
|
239
|
+
console.log(chalk.white(`BaseScan: https://basescan.org/token/${contractAddress}`));
|
|
240
|
+
console.log(chalk.white(`Clanker: https://clanker.world/token/${contractAddress}`));
|
|
241
|
+
|
|
201
242
|
console.log(chalk.cyan('\n[ NEXT STEPS ]'));
|
|
202
|
-
console.log(chalk.white(`1.
|
|
203
|
-
console.log(chalk.white(`2.
|
|
243
|
+
console.log(chalk.white(`1. Monitor your token on Clanker`));
|
|
244
|
+
console.log(chalk.white(`2. Track earnings in real-time`));
|
|
204
245
|
console.log(chalk.white(`3. Fees automatically distributed to your wallet`));
|
|
205
|
-
console.log(chalk.white(`4.
|
|
246
|
+
console.log(chalk.white(`4. Run 'npx dacty-status' to check deployment status`));
|
|
247
|
+
console.log(chalk.white(`5. Configuration saved in: token.config.json\n`));
|
|
206
248
|
|
|
207
249
|
} catch (error) {
|
|
208
250
|
spinner.fail('Error launching token');
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dacty-launch",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.3",
|
|
4
4
|
"description": "Launch tokens for agents in the Dactyclaw ecosystem",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
"inquirer": "^9.2.12",
|
|
26
26
|
"ora": "^8.0.1",
|
|
27
27
|
"axios": "^1.6.5",
|
|
28
|
-
"dotenv": "^16.3.1"
|
|
28
|
+
"dotenv": "^16.3.1",
|
|
29
|
+
"viem": "^2.0.0"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
32
|
"@types/node": "^20.10.5"
|