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 ADDED
@@ -0,0 +1,3 @@
1
+ .env
2
+ .wallet.key
3
+ node_modules/
package/.env.example ADDED
@@ -0,0 +1,2 @@
1
+ HELIUS_RPC_URL=https://mainnet.helius-rpc.com/?api-key=YOUR_KEY
2
+ WALLET_PRIVATE_KEY=your_base58_private_key_here
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
+ }