pumpfun-launch 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/.clawignore +3 -0
- package/.env.example +2 -0
- package/README.md +114 -0
- package/SKILL.md +63 -0
- package/bun.lock +278 -0
- package/launch.ts +305 -0
- package/package.json +35 -0
package/.clawignore
ADDED
package/.env.example
ADDED
package/README.md
ADDED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
# š Pump.fun Token Launcher
|
|
2
|
+
|
|
3
|
+
Launch tokens on [pump.fun](https://pump.fun) directly from your AI agent. Zero middleware fees. Direct on-chain.
|
|
4
|
+
|
|
5
|
+
Built as an [OpenClaw](https://openclaw.ai) skill ā works with any OpenClaw agent out of the box.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **Launch tokens** with name, ticker, description, and image
|
|
10
|
+
- **Direct on-chain** via pumpdotfun-sdk ā no PumpPortal, no middleware fees
|
|
11
|
+
- **Encrypted wallet storage** ā AES-256-CBC, password-protected
|
|
12
|
+
- **Auto wallet generation** ā creates a fresh Solana wallet on first run
|
|
13
|
+
- **Dry-run mode** ā validate everything before spending SOL
|
|
14
|
+
- **Token status checker** ā check bonding curve and graduation status
|
|
15
|
+
|
|
16
|
+
## Quick Start
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
# Install dependencies
|
|
20
|
+
bun install
|
|
21
|
+
|
|
22
|
+
# Copy and configure environment
|
|
23
|
+
cp .env.example .env
|
|
24
|
+
# Add your Helius RPC URL (free at https://dev.helius.xyz)
|
|
25
|
+
|
|
26
|
+
# Generate a wallet
|
|
27
|
+
bun run launch.ts --wallet
|
|
28
|
+
|
|
29
|
+
# Fund the wallet with SOL, then launch!
|
|
30
|
+
bun run launch.ts --name "MyToken" --symbol "MTK" --description "My token" --image ./logo.png
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Usage
|
|
34
|
+
|
|
35
|
+
### Launch a Token
|
|
36
|
+
```bash
|
|
37
|
+
bun run launch.ts \
|
|
38
|
+
--name "TokenName" \
|
|
39
|
+
--symbol "TKN" \
|
|
40
|
+
--description "Token description" \
|
|
41
|
+
--image ./logo.png \
|
|
42
|
+
--buy 0.01 # optional initial buy in SOL
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Dry Run (test without spending SOL)
|
|
46
|
+
```bash
|
|
47
|
+
bun run launch.ts --name "Test" --symbol "TST" --description "Testing" --image ./logo.png --dry-run
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Check Token Status
|
|
51
|
+
```bash
|
|
52
|
+
bun run launch.ts --status <MINT_ADDRESS>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Setup Wallet
|
|
56
|
+
```bash
|
|
57
|
+
bun run launch.ts --wallet
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
## Options
|
|
61
|
+
|
|
62
|
+
| Flag | Required | Description |
|
|
63
|
+
|------|----------|-------------|
|
|
64
|
+
| `--name` | ā
| Token name |
|
|
65
|
+
| `--symbol` | ā
| Token ticker |
|
|
66
|
+
| `--description` | ā
| Token description |
|
|
67
|
+
| `--image` | ā
| Path to image file or URL |
|
|
68
|
+
| `--buy` | ā | Initial buy amount in SOL (default: 0) |
|
|
69
|
+
| `--slippage` | ā | Slippage in basis points (default: 500) |
|
|
70
|
+
| `--priority-fee` | ā | Priority fee in micro-lamports (default: 250000) |
|
|
71
|
+
| `--dry-run` | ā | Validate without sending transaction |
|
|
72
|
+
| `--status` | ā | Check token status by mint address |
|
|
73
|
+
| `--wallet` | ā | Setup or check wallet |
|
|
74
|
+
|
|
75
|
+
## Environment
|
|
76
|
+
|
|
77
|
+
Create a `.env` file (see `.env.example`):
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
HELIUS_RPC_URL=https://mainnet.helius-rpc.com/?api-key=YOUR_KEY
|
|
81
|
+
WALLET_PRIVATE_KEY=optional_base58_private_key
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Get a free Helius RPC key at [dev.helius.xyz](https://dev.helius.xyz).
|
|
85
|
+
|
|
86
|
+
If no `WALLET_PRIVATE_KEY` is set, the tool uses an encrypted `.wallet.key` file (generated on first run).
|
|
87
|
+
|
|
88
|
+
## OpenClaw Skill
|
|
89
|
+
|
|
90
|
+
This is an [OpenClaw](https://openclaw.ai) skill. Install it in your workspace:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
# Copy to your skills folder
|
|
94
|
+
cp -r pumpfun-launch ~/.openclaw/workspace/skills/
|
|
95
|
+
|
|
96
|
+
# Install dependencies
|
|
97
|
+
cd ~/.openclaw/workspace/skills/pumpfun-launch && bun install
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Your agent will automatically detect the skill and can launch tokens on command.
|
|
101
|
+
|
|
102
|
+
## Cost
|
|
103
|
+
|
|
104
|
+
- **Token creation:** ~0.02 SOL (rent + transaction fees)
|
|
105
|
+
- **Middleware fees:** None (direct on-chain)
|
|
106
|
+
- **Pump.fun trading fee:** 1% on bonding curve trades (standard, unavoidable)
|
|
107
|
+
|
|
108
|
+
## ā ļø Disclaimer
|
|
109
|
+
|
|
110
|
+
This tool creates real tokens on Solana mainnet that involve real money. Use at your own risk. The vast majority of memecoins go to zero. This is not financial advice.
|
|
111
|
+
|
|
112
|
+
## License
|
|
113
|
+
|
|
114
|
+
MIT
|
package/SKILL.md
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: pumpfun-launch
|
|
3
|
+
description: Launch a token on pump.fun (Solana memecoin platform). Use when the user wants to create/launch/deploy a new token on pump.fun. Handles wallet setup, metadata upload to IPFS, and on-chain token creation. Direct on-chain via pumpdotfun-sdk ā no PumpPortal middleware, no extra fees.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Pump.fun Token Launcher
|
|
7
|
+
|
|
8
|
+
## Setup
|
|
9
|
+
|
|
10
|
+
The skill lives at `skills/pumpfun-launch/`. First run:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
cd skills/pumpfun-launch && bun install
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Environment
|
|
17
|
+
|
|
18
|
+
Create `.env` in the skill folder:
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
HELIUS_RPC_URL=https://mainnet.helius-rpc.com/?api-key=YOUR_KEY
|
|
22
|
+
WALLET_PRIVATE_KEY=base58_encoded_private_key
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
Get a free Helius key at https://dev.helius.xyz/
|
|
26
|
+
|
|
27
|
+
If `WALLET_PRIVATE_KEY` is not set, the script will generate a new wallet and save it to `.wallet.key` (encrypted with a password prompt). Fund the wallet with SOL before launching.
|
|
28
|
+
|
|
29
|
+
## Usage
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
cd skills/pumpfun-launch
|
|
33
|
+
bun run launch.ts --name "TokenName" --symbol "TKN" --description "My token" --image ./logo.png
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Options
|
|
37
|
+
|
|
38
|
+
| Flag | Required | Description |
|
|
39
|
+
|------|----------|-------------|
|
|
40
|
+
| `--name` | ā
| Token name |
|
|
41
|
+
| `--symbol` | ā
| Token ticker |
|
|
42
|
+
| `--description` | ā
| Token description |
|
|
43
|
+
| `--image` | ā
| Path to image file (PNG/JPG) or URL |
|
|
44
|
+
| `--buy` | ā | Initial buy amount in SOL (default: 0) |
|
|
45
|
+
| `--slippage` | ā | Slippage in basis points (default: 500) |
|
|
46
|
+
| `--priority-fee` | ā | Priority fee in micro-lamports (default: 250000) |
|
|
47
|
+
| `--dry-run` | ā | Simulate without sending transaction |
|
|
48
|
+
| `--status` | ā | Check status of a mint address (pass mint pubkey) |
|
|
49
|
+
|
|
50
|
+
### Check Token Status
|
|
51
|
+
|
|
52
|
+
```bash
|
|
53
|
+
bun run launch.ts --status <MINT_ADDRESS>
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## ā ļø IMPORTANT ā Agent Instructions
|
|
57
|
+
|
|
58
|
+
1. **ALWAYS confirm with the user** before running the launch command. Show them the token name, symbol, description, image, and buy amount.
|
|
59
|
+
2. **ALWAYS use `--dry-run` first** to validate parameters before real launch.
|
|
60
|
+
3. **Warn the user** that this creates a REAL token on Solana mainnet and costs real SOL.
|
|
61
|
+
4. Launching costs ~0.02 SOL (rent + fees). Initial buy is additional.
|
|
62
|
+
5. On success, report the mint address and transaction signature to the user.
|
|
63
|
+
6. The pump.fun link will be: `https://pump.fun/<MINT_ADDRESS>`
|
package/bun.lock
ADDED
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
{
|
|
2
|
+
"lockfileVersion": 1,
|
|
3
|
+
"configVersion": 1,
|
|
4
|
+
"workspaces": {
|
|
5
|
+
"": {
|
|
6
|
+
"name": "pumpfun-launch",
|
|
7
|
+
"dependencies": {
|
|
8
|
+
"@coral-xyz/anchor": "^0.30.1",
|
|
9
|
+
"@solana/spl-token": "^0.4.9",
|
|
10
|
+
"@solana/web3.js": "^1.95.8",
|
|
11
|
+
"bs58": "^5.0.0",
|
|
12
|
+
"dotenv": "^16.4.7",
|
|
13
|
+
"pumpdotfun-sdk": "^1.4.2",
|
|
14
|
+
},
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
"packages": {
|
|
18
|
+
"@babel/runtime": ["@babel/runtime@7.28.6", "", {}, "sha512-05WQkdpL9COIMz4LjTxGpPNCdlpyimKppYNoJ5Di5EUObifl8t4tuLuUBBZEpoLYOmfvIWrsp9fCl0HoPRVTdA=="],
|
|
19
|
+
|
|
20
|
+
"@coral-xyz/anchor": ["@coral-xyz/anchor@0.30.1", "", { "dependencies": { "@coral-xyz/anchor-errors": "^0.30.1", "@coral-xyz/borsh": "^0.30.1", "@noble/hashes": "^1.3.1", "@solana/web3.js": "^1.68.0", "bn.js": "^5.1.2", "bs58": "^4.0.1", "buffer-layout": "^1.2.2", "camelcase": "^6.3.0", "cross-fetch": "^3.1.5", "crypto-hash": "^1.3.0", "eventemitter3": "^4.0.7", "pako": "^2.0.3", "snake-case": "^3.0.4", "superstruct": "^0.15.4", "toml": "^3.0.0" } }, "sha512-gDXFoF5oHgpriXAaLpxyWBHdCs8Awgf/gLHIo6crv7Aqm937CNdY+x+6hoj7QR5vaJV7MxWSQ0NGFzL3kPbWEQ=="],
|
|
21
|
+
|
|
22
|
+
"@coral-xyz/anchor-errors": ["@coral-xyz/anchor-errors@0.30.1", "", {}, "sha512-9Mkradf5yS5xiLWrl9WrpjqOrAV+/W2RQHDlbnAZBivoGpOs1ECjoDCkVk4aRG8ZdiFiB8zQEVlxf+8fKkmSfQ=="],
|
|
23
|
+
|
|
24
|
+
"@coral-xyz/borsh": ["@coral-xyz/borsh@0.30.1", "", { "dependencies": { "bn.js": "^5.1.2", "buffer-layout": "^1.2.0" }, "peerDependencies": { "@solana/web3.js": "^1.68.0" } }, "sha512-aaxswpPrCFKl8vZTbxLssA2RvwX2zmKLlRCIktJOwW+VpVwYtXRtlWiIP+c2pPRKneiTiWCN2GEMSH9j1zTlWQ=="],
|
|
25
|
+
|
|
26
|
+
"@noble/curves": ["@noble/curves@1.9.7", "", { "dependencies": { "@noble/hashes": "1.8.0" } }, "sha512-gbKGcRUYIjA3/zCCNaWDciTMFI0dCkvou3TL8Zmy5Nc7sJ47a0jtOeZoTaMxkuqRo9cRhjOdZJXegxYE5FN/xw=="],
|
|
27
|
+
|
|
28
|
+
"@noble/hashes": ["@noble/hashes@1.8.0", "", {}, "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A=="],
|
|
29
|
+
|
|
30
|
+
"@rollup/plugin-json": ["@rollup/plugin-json@6.1.0", "", { "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA=="],
|
|
31
|
+
|
|
32
|
+
"@rollup/pluginutils": ["@rollup/pluginutils@5.3.0", "", { "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q=="],
|
|
33
|
+
|
|
34
|
+
"@solana/buffer-layout": ["@solana/buffer-layout@4.0.1", "", { "dependencies": { "buffer": "~6.0.3" } }, "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA=="],
|
|
35
|
+
|
|
36
|
+
"@solana/buffer-layout-utils": ["@solana/buffer-layout-utils@0.2.0", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/web3.js": "^1.32.0", "bigint-buffer": "^1.1.5", "bignumber.js": "^9.0.1" } }, "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g=="],
|
|
37
|
+
|
|
38
|
+
"@solana/codecs": ["@solana/codecs@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/options": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-qxoR7VybNJixV51L0G1RD2boZTcxmwUWnKCaJJExQ5qNKwbpSyDdWfFJfM5JhGyKe9DnPVOZB+JHWXnpbZBqrQ=="],
|
|
39
|
+
|
|
40
|
+
"@solana/codecs-core": ["@solana/codecs-core@2.3.0", "", { "dependencies": { "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-oG+VZzN6YhBHIoSKgS5ESM9VIGzhWjEHEGNPSibiDTxFhsFWxNaz8LbMDPjBUE69r9wmdGLkrQ+wVPbnJcZPvw=="],
|
|
41
|
+
|
|
42
|
+
"@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-rinCv0RrAVJ9rE/rmaibWJQxMwC5lSaORSZuwjopSUE6T0nb/MVg6Z1siNCXhh/HFTOg0l8bNvZHgBcN/yvXog=="],
|
|
43
|
+
|
|
44
|
+
"@solana/codecs-numbers": ["@solana/codecs-numbers@2.3.0", "", { "dependencies": { "@solana/codecs-core": "2.3.0", "@solana/errors": "2.3.0" }, "peerDependencies": { "typescript": ">=5.3.3" } }, "sha512-jFvvwKJKffvG7Iz9dmN51OGB7JBcy2CJ6Xf3NqD/VP90xak66m/Lg48T01u5IQ/hc15mChVHiBm+HHuOFDUrQg=="],
|
|
45
|
+
|
|
46
|
+
"@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22", "typescript": ">=5" } }, "sha512-9/wPhw8TbGRTt6mHC4Zz1RqOnuPTqq1Nb4EyuvpZ39GW6O2t2Q7Q0XxiB3+BdoEjwA2XgPw6e2iRfvYgqty44g=="],
|
|
47
|
+
|
|
48
|
+
"@solana/errors": ["@solana/errors@2.3.0", "", { "dependencies": { "chalk": "^5.4.1", "commander": "^14.0.0" }, "peerDependencies": { "typescript": ">=5.3.3" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-66RI9MAbwYV0UtP7kGcTBVLxJgUxoZGm8Fbc0ah+lGiAw17Gugco6+9GrJCV83VyF2mDWyYnYM9qdI3yjgpnaQ=="],
|
|
49
|
+
|
|
50
|
+
"@solana/options": ["@solana/options@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/codecs-data-structures": "2.0.0-rc.1", "@solana/codecs-numbers": "2.0.0-rc.1", "@solana/codecs-strings": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-mLUcR9mZ3qfHlmMnREdIFPf9dpMc/Bl66tLSOOWxw4ml5xMT2ohFn7WGqoKcu/UHkT9CrC6+amEdqCNvUqI7AA=="],
|
|
51
|
+
|
|
52
|
+
"@solana/spl-token": ["@solana/spl-token@0.4.14", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-group": "^0.0.7", "@solana/spl-token-metadata": "^0.1.6", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.95.5" } }, "sha512-u09zr96UBpX4U685MnvQsNzlvw9TiY005hk1vJmJr7gMJldoPG1eYU5/wNEyOA5lkMLiR/gOi9SFD4MefOYEsA=="],
|
|
53
|
+
|
|
54
|
+
"@solana/spl-token-group": ["@solana/spl-token-group@0.0.7", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-V1N/iX7Cr7H0uazWUT2uk27TMqlqedpXHRqqAbVO2gvmJyT0E0ummMEAVQeXZ05ZhQ/xF39DLSdBp90XebWEug=="],
|
|
55
|
+
|
|
56
|
+
"@solana/spl-token-metadata": ["@solana/spl-token-metadata@0.1.6", "", { "dependencies": { "@solana/codecs": "2.0.0-rc.1" }, "peerDependencies": { "@solana/web3.js": "^1.95.3" } }, "sha512-7sMt1rsm/zQOQcUWllQX9mD2O6KhSAtY1hFR2hfFwgqfFWzSY9E9GDvFVNYUI1F0iQKcm6HmePU9QbKRXTEBiA=="],
|
|
57
|
+
|
|
58
|
+
"@solana/spl-type-length-value": ["@solana/spl-type-length-value@0.1.0", "", { "dependencies": { "buffer": "^6.0.3" } }, "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA=="],
|
|
59
|
+
|
|
60
|
+
"@solana/web3.js": ["@solana/web3.js@1.98.4", "", { "dependencies": { "@babel/runtime": "^7.25.0", "@noble/curves": "^1.4.2", "@noble/hashes": "^1.4.0", "@solana/buffer-layout": "^4.0.1", "@solana/codecs-numbers": "^2.1.0", "agentkeepalive": "^4.5.0", "bn.js": "^5.2.1", "borsh": "^0.7.0", "bs58": "^4.0.1", "buffer": "6.0.3", "fast-stable-stringify": "^1.0.0", "jayson": "^4.1.1", "node-fetch": "^2.7.0", "rpc-websockets": "^9.0.2", "superstruct": "^2.0.2" } }, "sha512-vv9lfnvjUsRiq//+j5pBdXig0IQdtzA0BRZ3bXEP4KaIyF1CcaydWqgyzQgfZMNIsWNWmG+AUHwPy4AHOD6gpw=="],
|
|
61
|
+
|
|
62
|
+
"@swc/helpers": ["@swc/helpers@0.5.18", "", { "dependencies": { "tslib": "^2.8.0" } }, "sha512-TXTnIcNJQEKwThMMqBXsZ4VGAza6bvN4pa41Rkqoio6QBKMvo+5lexeTMScGCIxtzgQJzElcvIltani+adC5PQ=="],
|
|
63
|
+
|
|
64
|
+
"@types/connect": ["@types/connect@3.4.38", "", { "dependencies": { "@types/node": "*" } }, "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug=="],
|
|
65
|
+
|
|
66
|
+
"@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="],
|
|
67
|
+
|
|
68
|
+
"@types/node": ["@types/node@12.20.55", "", {}, "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ=="],
|
|
69
|
+
|
|
70
|
+
"@types/uuid": ["@types/uuid@8.3.4", "", {}, "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw=="],
|
|
71
|
+
|
|
72
|
+
"@types/ws": ["@types/ws@7.4.7", "", { "dependencies": { "@types/node": "*" } }, "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww=="],
|
|
73
|
+
|
|
74
|
+
"agentkeepalive": ["agentkeepalive@4.6.0", "", { "dependencies": { "humanize-ms": "^1.2.1" } }, "sha512-kja8j7PjmncONqaTsB8fQ+wE2mSU2DJ9D4XKoJ5PFWIdRMa6SLSN1ff4mOr4jCbfRSsxR4keIiySJU0N9T5hIQ=="],
|
|
75
|
+
|
|
76
|
+
"base-x": ["base-x@4.0.1", "", {}, "sha512-uAZ8x6r6S3aUM9rbHGVOIsR15U/ZSc82b3ymnCPsT45Gk1DDvhDPdIgB5MrhirZWt+5K0EEPQH985kNqZgNPFw=="],
|
|
77
|
+
|
|
78
|
+
"base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
|
|
79
|
+
|
|
80
|
+
"bigint-buffer": ["bigint-buffer@1.1.5", "", { "dependencies": { "bindings": "^1.3.0" } }, "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA=="],
|
|
81
|
+
|
|
82
|
+
"bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
|
|
83
|
+
|
|
84
|
+
"bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="],
|
|
85
|
+
|
|
86
|
+
"bn.js": ["bn.js@5.2.2", "", {}, "sha512-v2YAxEmKaBLahNwE1mjp4WON6huMNeuDvagFZW+ASCuA/ku0bXR9hSMw0XpiqMoA3+rmnyck/tPRSFQkoC9Cuw=="],
|
|
87
|
+
|
|
88
|
+
"borsh": ["borsh@0.7.0", "", { "dependencies": { "bn.js": "^5.2.0", "bs58": "^4.0.0", "text-encoding-utf-8": "^1.0.2" } }, "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA=="],
|
|
89
|
+
|
|
90
|
+
"bs58": ["bs58@5.0.0", "", { "dependencies": { "base-x": "^4.0.0" } }, "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ=="],
|
|
91
|
+
|
|
92
|
+
"buffer": ["buffer@6.0.3", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.2.1" } }, "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA=="],
|
|
93
|
+
|
|
94
|
+
"buffer-layout": ["buffer-layout@1.2.2", "", {}, "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA=="],
|
|
95
|
+
|
|
96
|
+
"bufferutil": ["bufferutil@4.1.0", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw=="],
|
|
97
|
+
|
|
98
|
+
"camelcase": ["camelcase@6.3.0", "", {}, "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA=="],
|
|
99
|
+
|
|
100
|
+
"chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="],
|
|
101
|
+
|
|
102
|
+
"commander": ["commander@2.20.3", "", {}, "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="],
|
|
103
|
+
|
|
104
|
+
"cross-fetch": ["cross-fetch@3.2.0", "", { "dependencies": { "node-fetch": "^2.7.0" } }, "sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q=="],
|
|
105
|
+
|
|
106
|
+
"crypto-hash": ["crypto-hash@1.3.0", "", {}, "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg=="],
|
|
107
|
+
|
|
108
|
+
"delay": ["delay@5.0.0", "", {}, "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw=="],
|
|
109
|
+
|
|
110
|
+
"dot-case": ["dot-case@3.0.4", "", { "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w=="],
|
|
111
|
+
|
|
112
|
+
"dotenv": ["dotenv@16.6.1", "", {}, "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow=="],
|
|
113
|
+
|
|
114
|
+
"es6-promise": ["es6-promise@4.2.8", "", {}, "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="],
|
|
115
|
+
|
|
116
|
+
"es6-promisify": ["es6-promisify@5.0.0", "", { "dependencies": { "es6-promise": "^4.0.3" } }, "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ=="],
|
|
117
|
+
|
|
118
|
+
"estree-walker": ["estree-walker@2.0.2", "", {}, "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="],
|
|
119
|
+
|
|
120
|
+
"eventemitter3": ["eventemitter3@4.0.7", "", {}, "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="],
|
|
121
|
+
|
|
122
|
+
"eyes": ["eyes@0.1.8", "", {}, "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ=="],
|
|
123
|
+
|
|
124
|
+
"fast-stable-stringify": ["fast-stable-stringify@1.0.0", "", {}, "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag=="],
|
|
125
|
+
|
|
126
|
+
"fastestsmallesttextencoderdecoder": ["fastestsmallesttextencoderdecoder@1.0.22", "", {}, "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw=="],
|
|
127
|
+
|
|
128
|
+
"file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="],
|
|
129
|
+
|
|
130
|
+
"humanize-ms": ["humanize-ms@1.2.1", "", { "dependencies": { "ms": "^2.0.0" } }, "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ=="],
|
|
131
|
+
|
|
132
|
+
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
|
|
133
|
+
|
|
134
|
+
"isomorphic-ws": ["isomorphic-ws@4.0.1", "", { "peerDependencies": { "ws": "*" } }, "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w=="],
|
|
135
|
+
|
|
136
|
+
"jayson": ["jayson@4.3.0", "", { "dependencies": { "@types/connect": "^3.4.33", "@types/node": "^12.12.54", "@types/ws": "^7.4.4", "commander": "^2.20.3", "delay": "^5.0.0", "es6-promisify": "^5.0.0", "eyes": "^0.1.8", "isomorphic-ws": "^4.0.1", "json-stringify-safe": "^5.0.1", "stream-json": "^1.9.1", "uuid": "^8.3.2", "ws": "^7.5.10" }, "bin": { "jayson": "bin/jayson.js" } }, "sha512-AauzHcUcqs8OBnCHOkJY280VaTiCm57AbuO7lqzcw7JapGj50BisE3xhksye4zlTSR1+1tAz67wLTl8tEH1obQ=="],
|
|
137
|
+
|
|
138
|
+
"json-stringify-safe": ["json-stringify-safe@5.0.1", "", {}, "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA=="],
|
|
139
|
+
|
|
140
|
+
"lower-case": ["lower-case@2.0.2", "", { "dependencies": { "tslib": "^2.0.3" } }, "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg=="],
|
|
141
|
+
|
|
142
|
+
"ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
|
|
143
|
+
|
|
144
|
+
"no-case": ["no-case@3.0.4", "", { "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" } }, "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg=="],
|
|
145
|
+
|
|
146
|
+
"node-fetch": ["node-fetch@2.7.0", "", { "dependencies": { "whatwg-url": "^5.0.0" }, "peerDependencies": { "encoding": "^0.1.0" }, "optionalPeers": ["encoding"] }, "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A=="],
|
|
147
|
+
|
|
148
|
+
"node-gyp-build": ["node-gyp-build@4.8.4", "", { "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ=="],
|
|
149
|
+
|
|
150
|
+
"pako": ["pako@2.1.0", "", {}, "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug=="],
|
|
151
|
+
|
|
152
|
+
"picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="],
|
|
153
|
+
|
|
154
|
+
"pumpdotfun-sdk": ["pumpdotfun-sdk@1.4.2", "", { "dependencies": { "@coral-xyz/anchor": "^0.30.1", "@rollup/plugin-json": "^6.1.0", "@solana/spl-token": "0.4.6", "@solana/web3.js": "^1.92.1" } }, "sha512-DcnA70AfK9z1lnYVjCjM+A7bu7fLqVH9zCOZAo8/Emk6uvG/66dYWKsb2kz6/bqEBhAD0ny7tPg432P7/fDfkA=="],
|
|
155
|
+
|
|
156
|
+
"rpc-websockets": ["rpc-websockets@9.3.3", "", { "dependencies": { "@swc/helpers": "^0.5.11", "@types/uuid": "^8.3.4", "@types/ws": "^8.2.2", "buffer": "^6.0.3", "eventemitter3": "^5.0.1", "uuid": "^8.3.2", "ws": "^8.5.0" }, "optionalDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" } }, "sha512-OkCsBBzrwxX4DoSv4Zlf9DgXKRB0MzVfCFg5MC+fNnf9ktr4SMWjsri0VNZQlDbCnGcImT6KNEv4ZoxktQhdpA=="],
|
|
157
|
+
|
|
158
|
+
"safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
|
|
159
|
+
|
|
160
|
+
"snake-case": ["snake-case@3.0.4", "", { "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" } }, "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg=="],
|
|
161
|
+
|
|
162
|
+
"stream-chain": ["stream-chain@2.2.5", "", {}, "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA=="],
|
|
163
|
+
|
|
164
|
+
"stream-json": ["stream-json@1.9.1", "", { "dependencies": { "stream-chain": "^2.2.5" } }, "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw=="],
|
|
165
|
+
|
|
166
|
+
"superstruct": ["superstruct@0.15.5", "", {}, "sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ=="],
|
|
167
|
+
|
|
168
|
+
"text-encoding-utf-8": ["text-encoding-utf-8@1.0.2", "", {}, "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg=="],
|
|
169
|
+
|
|
170
|
+
"toml": ["toml@3.0.0", "", {}, "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w=="],
|
|
171
|
+
|
|
172
|
+
"tr46": ["tr46@0.0.3", "", {}, "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw=="],
|
|
173
|
+
|
|
174
|
+
"tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
|
|
175
|
+
|
|
176
|
+
"typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="],
|
|
177
|
+
|
|
178
|
+
"utf-8-validate": ["utf-8-validate@5.0.10", "", { "dependencies": { "node-gyp-build": "^4.3.0" } }, "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ=="],
|
|
179
|
+
|
|
180
|
+
"uuid": ["uuid@8.3.2", "", { "bin": { "uuid": "dist/bin/uuid" } }, "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg=="],
|
|
181
|
+
|
|
182
|
+
"webidl-conversions": ["webidl-conversions@3.0.1", "", {}, "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ=="],
|
|
183
|
+
|
|
184
|
+
"whatwg-url": ["whatwg-url@5.0.0", "", { "dependencies": { "tr46": "~0.0.3", "webidl-conversions": "^3.0.0" } }, "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw=="],
|
|
185
|
+
|
|
186
|
+
"ws": ["ws@7.5.10", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": "^5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ=="],
|
|
187
|
+
|
|
188
|
+
"@coral-xyz/anchor/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="],
|
|
189
|
+
|
|
190
|
+
"@solana/codecs/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="],
|
|
191
|
+
|
|
192
|
+
"@solana/codecs/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="],
|
|
193
|
+
|
|
194
|
+
"@solana/codecs-data-structures/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="],
|
|
195
|
+
|
|
196
|
+
"@solana/codecs-data-structures/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="],
|
|
197
|
+
|
|
198
|
+
"@solana/codecs-data-structures/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="],
|
|
199
|
+
|
|
200
|
+
"@solana/codecs-strings/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="],
|
|
201
|
+
|
|
202
|
+
"@solana/codecs-strings/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="],
|
|
203
|
+
|
|
204
|
+
"@solana/codecs-strings/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="],
|
|
205
|
+
|
|
206
|
+
"@solana/errors/commander": ["commander@14.0.3", "", {}, "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw=="],
|
|
207
|
+
|
|
208
|
+
"@solana/options/@solana/codecs-core": ["@solana/codecs-core@2.0.0-rc.1", "", { "dependencies": { "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-bauxqMfSs8EHD0JKESaNmNuNvkvHSuN3bbWAF5RjOfDu2PugxHrvRebmYauvSumZ3cTfQ4HJJX6PG5rN852qyQ=="],
|
|
209
|
+
|
|
210
|
+
"@solana/options/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-rc.1", "", { "dependencies": { "@solana/codecs-core": "2.0.0-rc.1", "@solana/errors": "2.0.0-rc.1" }, "peerDependencies": { "typescript": ">=5" } }, "sha512-J5i5mOkvukXn8E3Z7sGIPxsThRCgSdgTWJDQeZvucQ9PT6Y3HiVXJ0pcWiOWAoQ3RX8e/f4I3IC+wE6pZiJzDQ=="],
|
|
211
|
+
|
|
212
|
+
"@solana/options/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="],
|
|
213
|
+
|
|
214
|
+
"@solana/web3.js/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="],
|
|
215
|
+
|
|
216
|
+
"@solana/web3.js/superstruct": ["superstruct@2.0.2", "", {}, "sha512-uV+TFRZdXsqXTL2pRvujROjdZQ4RAlBUS5BTh9IGm+jTqQntYThciG/qu57Gs69yjnVUSqdxF9YLmSnpupBW9A=="],
|
|
217
|
+
|
|
218
|
+
"borsh/bs58": ["bs58@4.0.1", "", { "dependencies": { "base-x": "^3.0.2" } }, "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw=="],
|
|
219
|
+
|
|
220
|
+
"pumpdotfun-sdk/@solana/spl-token": ["@solana/spl-token@0.4.6", "", { "dependencies": { "@solana/buffer-layout": "^4.0.0", "@solana/buffer-layout-utils": "^0.2.0", "@solana/spl-token-group": "^0.0.4", "@solana/spl-token-metadata": "^0.1.4", "buffer": "^6.0.3" }, "peerDependencies": { "@solana/web3.js": "^1.91.6" } }, "sha512-1nCnUqfHVtdguFciVWaY/RKcQz1IF4b31jnKgAmjU9QVN1q7dRUkTEWJZgTYIEtsULjVnC9jRqlhgGN39WbKKA=="],
|
|
221
|
+
|
|
222
|
+
"rpc-websockets/@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="],
|
|
223
|
+
|
|
224
|
+
"rpc-websockets/eventemitter3": ["eventemitter3@5.0.4", "", {}, "sha512-mlsTRyGaPBjPedk6Bvw+aqbsXDtoAyAzm5MO7JgU+yVRyMQ5O8bD4Kcci7BS85f93veegeCPkL8R4GLClnjLFw=="],
|
|
225
|
+
|
|
226
|
+
"rpc-websockets/ws": ["ws@8.19.0", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg=="],
|
|
227
|
+
|
|
228
|
+
"@coral-xyz/anchor/bs58/base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="],
|
|
229
|
+
|
|
230
|
+
"@solana/codecs-data-structures/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
231
|
+
|
|
232
|
+
"@solana/codecs-strings/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
233
|
+
|
|
234
|
+
"@solana/codecs/@solana/codecs-core/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="],
|
|
235
|
+
|
|
236
|
+
"@solana/codecs/@solana/codecs-numbers/@solana/errors": ["@solana/errors@2.0.0-rc.1", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.1.0" }, "peerDependencies": { "typescript": ">=5" }, "bin": { "errors": "bin/cli.mjs" } }, "sha512-ejNvQ2oJ7+bcFAYWj225lyRkHnixuAeb7RQCixm+5mH4n1IA4Qya/9Bmfy5RAAHQzxK43clu3kZmL5eF9VGtYQ=="],
|
|
237
|
+
|
|
238
|
+
"@solana/options/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
239
|
+
|
|
240
|
+
"@solana/web3.js/bs58/base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="],
|
|
241
|
+
|
|
242
|
+
"borsh/bs58/base-x": ["base-x@3.0.11", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-xz7wQ8xDhdyP7tQxwdteLYeFfS68tSMNCZ/Y37WJ4bhGfKPpqEIlmIyueQHqOyoPhE6xNUqjzRr8ra0eF9VRvA=="],
|
|
243
|
+
|
|
244
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group": ["@solana/spl-token-group@0.0.4", "", { "dependencies": { "@solana/codecs": "2.0.0-preview.2", "@solana/spl-type-length-value": "0.1.0" }, "peerDependencies": { "@solana/web3.js": "^1.91.6" } }, "sha512-7+80nrEMdUKlK37V6kOe024+T7J4nNss0F8LQ9OOPYdWCCfJmsGUzVx2W3oeizZR4IHM6N4yC9v1Xqwc3BTPWw=="],
|
|
245
|
+
|
|
246
|
+
"@solana/codecs/@solana/codecs-core/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
247
|
+
|
|
248
|
+
"@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
249
|
+
|
|
250
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs": ["@solana/codecs@2.0.0-preview.2", "", { "dependencies": { "@solana/codecs-core": "2.0.0-preview.2", "@solana/codecs-data-structures": "2.0.0-preview.2", "@solana/codecs-numbers": "2.0.0-preview.2", "@solana/codecs-strings": "2.0.0-preview.2", "@solana/options": "2.0.0-preview.2" } }, "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA=="],
|
|
251
|
+
|
|
252
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-core": ["@solana/codecs-core@2.0.0-preview.2", "", { "dependencies": { "@solana/errors": "2.0.0-preview.2" } }, "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg=="],
|
|
253
|
+
|
|
254
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-data-structures": ["@solana/codecs-data-structures@2.0.0-preview.2", "", { "dependencies": { "@solana/codecs-core": "2.0.0-preview.2", "@solana/codecs-numbers": "2.0.0-preview.2", "@solana/errors": "2.0.0-preview.2" } }, "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg=="],
|
|
255
|
+
|
|
256
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-numbers": ["@solana/codecs-numbers@2.0.0-preview.2", "", { "dependencies": { "@solana/codecs-core": "2.0.0-preview.2", "@solana/errors": "2.0.0-preview.2" } }, "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw=="],
|
|
257
|
+
|
|
258
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-strings": ["@solana/codecs-strings@2.0.0-preview.2", "", { "dependencies": { "@solana/codecs-core": "2.0.0-preview.2", "@solana/codecs-numbers": "2.0.0-preview.2", "@solana/errors": "2.0.0-preview.2" }, "peerDependencies": { "fastestsmallesttextencoderdecoder": "^1.0.22" } }, "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g=="],
|
|
259
|
+
|
|
260
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/options": ["@solana/options@2.0.0-preview.2", "", { "dependencies": { "@solana/codecs-core": "2.0.0-preview.2", "@solana/codecs-numbers": "2.0.0-preview.2" } }, "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w=="],
|
|
261
|
+
|
|
262
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-core/@solana/errors": ["@solana/errors@2.0.0-preview.2", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.0.0" }, "bin": { "errors": "bin/cli.js" } }, "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA=="],
|
|
263
|
+
|
|
264
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-data-structures/@solana/errors": ["@solana/errors@2.0.0-preview.2", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.0.0" }, "bin": { "errors": "bin/cli.js" } }, "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA=="],
|
|
265
|
+
|
|
266
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-numbers/@solana/errors": ["@solana/errors@2.0.0-preview.2", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.0.0" }, "bin": { "errors": "bin/cli.js" } }, "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA=="],
|
|
267
|
+
|
|
268
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-strings/@solana/errors": ["@solana/errors@2.0.0-preview.2", "", { "dependencies": { "chalk": "^5.3.0", "commander": "^12.0.0" }, "bin": { "errors": "bin/cli.js" } }, "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA=="],
|
|
269
|
+
|
|
270
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-core/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
271
|
+
|
|
272
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-data-structures/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
273
|
+
|
|
274
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-numbers/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
275
|
+
|
|
276
|
+
"pumpdotfun-sdk/@solana/spl-token/@solana/spl-token-group/@solana/codecs/@solana/codecs-strings/@solana/errors/commander": ["commander@12.1.0", "", {}, "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA=="],
|
|
277
|
+
}
|
|
278
|
+
}
|
package/launch.ts
ADDED
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
import dotenv from "dotenv";
|
|
2
|
+
import {
|
|
3
|
+
Connection,
|
|
4
|
+
Keypair,
|
|
5
|
+
LAMPORTS_PER_SOL,
|
|
6
|
+
PublicKey,
|
|
7
|
+
} from "@solana/web3.js";
|
|
8
|
+
import { AnchorProvider } from "@coral-xyz/anchor";
|
|
9
|
+
import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet";
|
|
10
|
+
import { PumpFunSDK } from "pumpdotfun-sdk";
|
|
11
|
+
import bs58 from "bs58";
|
|
12
|
+
import * as fs from "fs";
|
|
13
|
+
import * as path from "path";
|
|
14
|
+
import * as crypto from "crypto";
|
|
15
|
+
import * as readline from "readline";
|
|
16
|
+
|
|
17
|
+
dotenv.config({ path: path.join(import.meta.dir, ".env") });
|
|
18
|
+
|
|
19
|
+
// āā Helpers āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
20
|
+
|
|
21
|
+
function parseArgs(): Record<string, string> {
|
|
22
|
+
const args: Record<string, string> = {};
|
|
23
|
+
const argv = process.argv.slice(2);
|
|
24
|
+
for (let i = 0; i < argv.length; i++) {
|
|
25
|
+
if (argv[i].startsWith("--")) {
|
|
26
|
+
const key = argv[i].slice(2);
|
|
27
|
+
if (key === "dry-run") {
|
|
28
|
+
args["dryRun"] = "true";
|
|
29
|
+
} else if (i + 1 < argv.length && !argv[i + 1].startsWith("--")) {
|
|
30
|
+
args[key] = argv[i + 1];
|
|
31
|
+
i++;
|
|
32
|
+
} else {
|
|
33
|
+
args[key] = "true";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return args;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function prompt(question: string): Promise<string> {
|
|
41
|
+
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
42
|
+
return new Promise((resolve) => rl.question(question, (a) => { rl.close(); resolve(a); }));
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// āā Wallet Management āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
46
|
+
|
|
47
|
+
function encryptKey(privateKey: Uint8Array, password: string): string {
|
|
48
|
+
const salt = crypto.randomBytes(16);
|
|
49
|
+
const key = crypto.scryptSync(password, salt, 32);
|
|
50
|
+
const iv = crypto.randomBytes(16);
|
|
51
|
+
const cipher = crypto.createCipheriv("aes-256-cbc", key, iv);
|
|
52
|
+
const encrypted = Buffer.concat([cipher.update(privateKey), cipher.final()]);
|
|
53
|
+
return JSON.stringify({
|
|
54
|
+
salt: salt.toString("hex"),
|
|
55
|
+
iv: iv.toString("hex"),
|
|
56
|
+
data: encrypted.toString("hex"),
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function decryptKey(encryptedJson: string, password: string): Uint8Array {
|
|
61
|
+
const { salt, iv, data } = JSON.parse(encryptedJson);
|
|
62
|
+
const key = crypto.scryptSync(password, Buffer.from(salt, "hex"), 32);
|
|
63
|
+
const decipher = crypto.createDecipheriv("aes-256-cbc", key, Buffer.from(iv, "hex"));
|
|
64
|
+
return new Uint8Array(Buffer.concat([decipher.update(Buffer.from(data, "hex")), decipher.final()]));
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function loadWallet(): Promise<Keypair> {
|
|
68
|
+
// 1. Environment variable
|
|
69
|
+
if (process.env.WALLET_PRIVATE_KEY) {
|
|
70
|
+
try {
|
|
71
|
+
return Keypair.fromSecretKey(bs58.decode(process.env.WALLET_PRIVATE_KEY));
|
|
72
|
+
} catch {
|
|
73
|
+
throw new Error("Invalid WALLET_PRIVATE_KEY in .env");
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// 2. Encrypted file
|
|
78
|
+
const walletPath = path.join(import.meta.dir, ".wallet.key");
|
|
79
|
+
if (fs.existsSync(walletPath)) {
|
|
80
|
+
const password = await prompt("Wallet password: ");
|
|
81
|
+
try {
|
|
82
|
+
const raw = fs.readFileSync(walletPath, "utf-8");
|
|
83
|
+
return Keypair.fromSecretKey(decryptKey(raw, password));
|
|
84
|
+
} catch {
|
|
85
|
+
throw new Error("Wrong password or corrupted wallet file");
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// 3. Generate new wallet
|
|
90
|
+
console.log("No wallet found. Generating a new one...");
|
|
91
|
+
const kp = Keypair.generate();
|
|
92
|
+
const password = await prompt("Set a password to encrypt your wallet: ");
|
|
93
|
+
fs.writeFileSync(walletPath, encryptKey(kp.secretKey, password));
|
|
94
|
+
console.log(`Wallet saved to .wallet.key`);
|
|
95
|
+
console.log(`Public key: ${kp.publicKey.toBase58()}`);
|
|
96
|
+
console.log(`Fund this wallet with SOL before launching tokens.`);
|
|
97
|
+
return kp;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// āā Provider Setup āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
101
|
+
|
|
102
|
+
function getProvider(): AnchorProvider {
|
|
103
|
+
const rpcUrl = process.env.HELIUS_RPC_URL;
|
|
104
|
+
if (!rpcUrl) throw new Error("Set HELIUS_RPC_URL in .env");
|
|
105
|
+
const connection = new Connection(rpcUrl, "confirmed");
|
|
106
|
+
const wallet = new NodeWallet(Keypair.generate());
|
|
107
|
+
return new AnchorProvider(connection, wallet, { commitment: "confirmed" });
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
// āā Image Loading āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
111
|
+
|
|
112
|
+
async function loadImage(imagePath: string): Promise<Blob> {
|
|
113
|
+
if (imagePath.startsWith("http://") || imagePath.startsWith("https://")) {
|
|
114
|
+
const res = await fetch(imagePath);
|
|
115
|
+
if (!res.ok) throw new Error(`Failed to fetch image: ${res.status}`);
|
|
116
|
+
return await res.blob();
|
|
117
|
+
}
|
|
118
|
+
const resolved = path.resolve(imagePath);
|
|
119
|
+
if (!fs.existsSync(resolved)) throw new Error(`Image not found: ${resolved}`);
|
|
120
|
+
const buffer = fs.readFileSync(resolved);
|
|
121
|
+
const ext = path.extname(resolved).toLowerCase();
|
|
122
|
+
const mime = ext === ".png" ? "image/png" : ext === ".gif" ? "image/gif" : "image/jpeg";
|
|
123
|
+
return new Blob([buffer], { type: mime });
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// āā Token Status Check āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
127
|
+
|
|
128
|
+
async function checkStatus(mintAddress: string) {
|
|
129
|
+
const provider = getProvider();
|
|
130
|
+
const sdk = new PumpFunSDK(provider);
|
|
131
|
+
|
|
132
|
+
console.log(`\nChecking token: ${mintAddress}`);
|
|
133
|
+
const mint = new PublicKey(mintAddress);
|
|
134
|
+
const bondingCurve = await sdk.getBondingCurveAccount(mint);
|
|
135
|
+
|
|
136
|
+
if (!bondingCurve) {
|
|
137
|
+
console.log("ā No bonding curve found ā token may not exist on pump.fun");
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
console.log("ā
Token found on pump.fun");
|
|
142
|
+
console.log(` Virtual SOL reserves: ${Number(bondingCurve.virtualSolReserves) / LAMPORTS_PER_SOL} SOL`);
|
|
143
|
+
console.log(` Virtual token reserves: ${Number(bondingCurve.virtualTokenReserves) / 1e6}`);
|
|
144
|
+
console.log(` Real SOL reserves: ${Number(bondingCurve.realSolReserves) / LAMPORTS_PER_SOL} SOL`);
|
|
145
|
+
console.log(` Real token reserves: ${Number(bondingCurve.realTokenReserves) / 1e6}`);
|
|
146
|
+
console.log(` Complete (graduated): ${bondingCurve.complete}`);
|
|
147
|
+
console.log(` Link: https://pump.fun/${mintAddress}`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// āā Token Launch āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
151
|
+
|
|
152
|
+
async function launch(args: Record<string, string>) {
|
|
153
|
+
const { name, symbol, description, image, buy, slippage, dryRun } = args;
|
|
154
|
+
const priorityFee = parseInt(args["priority-fee"] || "250000");
|
|
155
|
+
|
|
156
|
+
if (!name || !symbol || !description || !image) {
|
|
157
|
+
console.error("Missing required args: --name, --symbol, --description, --image");
|
|
158
|
+
process.exit(1);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
const buyAmountSol = parseFloat(buy || "0");
|
|
162
|
+
const slippageBps = BigInt(parseInt(slippage || "500"));
|
|
163
|
+
|
|
164
|
+
console.log("\nš Pump.fun Token Launch");
|
|
165
|
+
console.log("========================");
|
|
166
|
+
console.log(` Name: ${name}`);
|
|
167
|
+
console.log(` Symbol: ${symbol}`);
|
|
168
|
+
console.log(` Description: ${description}`);
|
|
169
|
+
console.log(` Image: ${image}`);
|
|
170
|
+
console.log(` Buy amount: ${buyAmountSol} SOL`);
|
|
171
|
+
console.log(` Slippage: ${slippageBps} bps`);
|
|
172
|
+
console.log(` Priority: ${priorityFee} micro-lamports`);
|
|
173
|
+
console.log(` Mode: ${dryRun ? "š§Ŗ DRY RUN" : "š“ LIVE"}`);
|
|
174
|
+
console.log();
|
|
175
|
+
|
|
176
|
+
if (dryRun === "true") {
|
|
177
|
+
console.log("ā
Dry run complete ā parameters validated.");
|
|
178
|
+
console.log(" Remove --dry-run to launch for real.");
|
|
179
|
+
|
|
180
|
+
// Still validate image loads
|
|
181
|
+
try {
|
|
182
|
+
const blob = await loadImage(image);
|
|
183
|
+
console.log(` Image loaded: ${blob.size} bytes (${blob.type})`);
|
|
184
|
+
} catch (e: any) {
|
|
185
|
+
console.error(` ā Image error: ${e.message}`);
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
// Load wallet
|
|
191
|
+
const wallet = await loadWallet();
|
|
192
|
+
console.log(`Wallet: ${wallet.publicKey.toBase58()}`);
|
|
193
|
+
|
|
194
|
+
// Check balance
|
|
195
|
+
const provider = getProvider();
|
|
196
|
+
const connection = provider.connection;
|
|
197
|
+
const balance = await connection.getBalance(wallet.publicKey);
|
|
198
|
+
console.log(`Balance: ${balance / LAMPORTS_PER_SOL} SOL`);
|
|
199
|
+
|
|
200
|
+
if (balance < 0.02 * LAMPORTS_PER_SOL) {
|
|
201
|
+
console.error("ā Insufficient balance. Need at least 0.02 SOL for fees.");
|
|
202
|
+
process.exit(1);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Load image
|
|
206
|
+
console.log("Uploading metadata to IPFS...");
|
|
207
|
+
const imageBlob = await loadImage(image);
|
|
208
|
+
|
|
209
|
+
// Create SDK and launch
|
|
210
|
+
const sdk = new PumpFunSDK(provider);
|
|
211
|
+
const mintKeypair = Keypair.generate();
|
|
212
|
+
|
|
213
|
+
console.log(`Mint address: ${mintKeypair.publicKey.toBase58()}`);
|
|
214
|
+
console.log("Sending transaction...");
|
|
215
|
+
|
|
216
|
+
try {
|
|
217
|
+
const result = await sdk.createAndBuy(
|
|
218
|
+
wallet,
|
|
219
|
+
mintKeypair,
|
|
220
|
+
{
|
|
221
|
+
name,
|
|
222
|
+
symbol,
|
|
223
|
+
description,
|
|
224
|
+
file: imageBlob,
|
|
225
|
+
},
|
|
226
|
+
BigInt(Math.floor(buyAmountSol * LAMPORTS_PER_SOL)),
|
|
227
|
+
slippageBps,
|
|
228
|
+
{ unitLimit: 250000, unitPrice: priorityFee }
|
|
229
|
+
);
|
|
230
|
+
|
|
231
|
+
if (result.success) {
|
|
232
|
+
console.log("\nš TOKEN LAUNCHED SUCCESSFULLY!");
|
|
233
|
+
console.log(` Mint: ${mintKeypair.publicKey.toBase58()}`);
|
|
234
|
+
console.log(` Signature: ${result.signature}`);
|
|
235
|
+
console.log(` Link: https://pump.fun/${mintKeypair.publicKey.toBase58()}`);
|
|
236
|
+
console.log(` Solscan: https://solscan.io/tx/${result.signature}`);
|
|
237
|
+
} else {
|
|
238
|
+
console.error("\nā Launch failed:", result.error);
|
|
239
|
+
}
|
|
240
|
+
} catch (e: any) {
|
|
241
|
+
console.error("\nā Error:", e.message);
|
|
242
|
+
if (e.logs) console.error("Logs:", e.logs);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
// āā Wallet Setup (standalone) āāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
247
|
+
|
|
248
|
+
async function setupWallet() {
|
|
249
|
+
const walletPath = path.join(import.meta.dir, ".wallet.key");
|
|
250
|
+
|
|
251
|
+
if (fs.existsSync(walletPath)) {
|
|
252
|
+
console.log("Wallet already exists. Loading...");
|
|
253
|
+
const password = await prompt("Wallet password: ");
|
|
254
|
+
try {
|
|
255
|
+
const raw = fs.readFileSync(walletPath, "utf-8");
|
|
256
|
+
const kp = Keypair.fromSecretKey(decryptKey(raw, password));
|
|
257
|
+
console.log(`\nā
Wallet loaded`);
|
|
258
|
+
console.log(` Address: ${kp.publicKey.toBase58()}`);
|
|
259
|
+
|
|
260
|
+
// Check balance
|
|
261
|
+
const rpcUrl = process.env.HELIUS_RPC_URL;
|
|
262
|
+
if (rpcUrl) {
|
|
263
|
+
const connection = new Connection(rpcUrl, "confirmed");
|
|
264
|
+
const balance = await connection.getBalance(kp.publicKey);
|
|
265
|
+
console.log(` Balance: ${balance / LAMPORTS_PER_SOL} SOL`);
|
|
266
|
+
}
|
|
267
|
+
return;
|
|
268
|
+
} catch {
|
|
269
|
+
throw new Error("Wrong password or corrupted wallet file");
|
|
270
|
+
}
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
console.log("š Generating new Solana wallet...\n");
|
|
274
|
+
const kp = Keypair.generate();
|
|
275
|
+
const password = await prompt("Set a password to encrypt your wallet: ");
|
|
276
|
+
if (!password) {
|
|
277
|
+
console.error("ā Password required.");
|
|
278
|
+
process.exit(1);
|
|
279
|
+
}
|
|
280
|
+
const confirm = await prompt("Confirm password: ");
|
|
281
|
+
if (password !== confirm) {
|
|
282
|
+
console.error("ā Passwords don't match.");
|
|
283
|
+
process.exit(1);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
fs.writeFileSync(walletPath, encryptKey(kp.secretKey, password));
|
|
287
|
+
|
|
288
|
+
console.log(`\nā
Wallet created and encrypted`);
|
|
289
|
+
console.log(` Address: ${kp.publicKey.toBase58()}`);
|
|
290
|
+
console.log(` Saved to: .wallet.key (AES-256 encrypted)`);
|
|
291
|
+
console.log(`\nā” Send SOL to this address to start launching tokens.`);
|
|
292
|
+
console.log(` Minimum ~0.02 SOL for gas, plus whatever you want for initial buys.`);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
// āā Main āāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāāā
|
|
296
|
+
|
|
297
|
+
const args = parseArgs();
|
|
298
|
+
|
|
299
|
+
if (args.wallet || args.setup) {
|
|
300
|
+
await setupWallet();
|
|
301
|
+
} else if (args.status) {
|
|
302
|
+
await checkStatus(args.status);
|
|
303
|
+
} else {
|
|
304
|
+
await launch(args);
|
|
305
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "pumpfun-launch",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Launch tokens on pump.fun from your AI agent. Zero middleware fees. Direct on-chain. OpenClaw skill.",
|
|
6
|
+
"keywords": [
|
|
7
|
+
"pump.fun",
|
|
8
|
+
"pumpfun",
|
|
9
|
+
"solana",
|
|
10
|
+
"memecoin",
|
|
11
|
+
"token-launch",
|
|
12
|
+
"openclaw",
|
|
13
|
+
"ai-agent",
|
|
14
|
+
"mcp",
|
|
15
|
+
"crypto",
|
|
16
|
+
"defi"
|
|
17
|
+
],
|
|
18
|
+
"author": "brandonhay",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"repository": {
|
|
21
|
+
"type": "git",
|
|
22
|
+
"url": "https://github.com/brandonhay/pumpfun-launch"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"launch": "bun run launch.ts"
|
|
26
|
+
},
|
|
27
|
+
"dependencies": {
|
|
28
|
+
"@coral-xyz/anchor": "^0.30.1",
|
|
29
|
+
"@solana/spl-token": "^0.4.9",
|
|
30
|
+
"@solana/web3.js": "^1.95.8",
|
|
31
|
+
"bs58": "^5.0.0",
|
|
32
|
+
"dotenv": "^16.4.7",
|
|
33
|
+
"pumpdotfun-sdk": "^1.4.2"
|
|
34
|
+
}
|
|
35
|
+
}
|