├── keys ├── data.json ├── mintWallet.json ├── mint.json └── lut.json ├── constants ├── index.ts └── constants.ts ├── utils ├── index.ts ├── logger.ts ├── swapOnlyAmm.ts └── utils.ts ├── src ├── idl │ ├── index.ts │ ├── pump-fun.ts │ └── pump-fun.json ├── metadata.ts ├── events.ts ├── types.ts ├── uploadToIpfs.ts ├── globalAccount.ts ├── bondingCurveAccount.ts ├── util.ts └── pumpfun.ts ├── image └── 1.jpg ├── tsconfig.json ├── tsconfig.base.json ├── menu └── menu.ts ├── package.json ├── monitor.ts ├── index.ts ├── toExternal.ts ├── executor ├── jito.ts └── legacy.ts ├── README.md ├── gather.ts ├── createBuy.ts ├── pumpfun-IDL.json └── Log └── log.txt /keys/data.json: -------------------------------------------------------------------------------- 1 | [] -------------------------------------------------------------------------------- /keys/mintWallet.json: -------------------------------------------------------------------------------- 1 | "" -------------------------------------------------------------------------------- /keys/mint.json: -------------------------------------------------------------------------------- 1 | [ 2 | "" 3 | ] -------------------------------------------------------------------------------- /constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from './constants'; -------------------------------------------------------------------------------- /keys/lut.json: -------------------------------------------------------------------------------- 1 | "FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc" -------------------------------------------------------------------------------- /utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | export * from './logger'; -------------------------------------------------------------------------------- /src/idl/index.ts: -------------------------------------------------------------------------------- 1 | export { default as IDL } from "./pump-fun.json"; 2 | export { PumpFun } from "./pump-fun"; -------------------------------------------------------------------------------- /image/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/solvolumer/solvolume-solana-pumpfun-volume-sandwich-bundler-bot/HEAD/image/1.jpg -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.base.json", 3 | "compilerOptions": { 4 | "moduleResolution": "node", 5 | "module": "es2022", 6 | "target": "es2022", 7 | "outDir": "dist/esm/", 8 | "rootDir": "", 9 | } 10 | } -------------------------------------------------------------------------------- /src/metadata.ts: -------------------------------------------------------------------------------- 1 | const metadata = { 2 | "name": "TrustPump", 3 | "symbol": "TrustPump", 4 | "description": "pumpfun bundler test", 5 | "image": "", 6 | "showName": true, 7 | "createdOn": "https://pump.fun", 8 | "twitter": "https://x.com/TrustPump", 9 | "telegram": "https://t.me/TrustPump", 10 | "website": "https://www.TrustPump.com" 11 | } 12 | 13 | export default metadata; -------------------------------------------------------------------------------- /tsconfig.base.json: -------------------------------------------------------------------------------- 1 | { 2 | "include": ["./src/**/*", "./src/**/*.json"], 3 | "compilerOptions": { 4 | "sourceMap": true, 5 | "declaration": true, 6 | "declarationMap": true, 7 | "allowSyntheticDefaultImports": true, 8 | "experimentalDecorators": true, 9 | "emitDecoratorMetadata": true, 10 | "noImplicitAny": false, 11 | "strictNullChecks": true, 12 | "esModuleInterop": true, 13 | "resolveJsonModule": true, 14 | "skipLibCheck": true 15 | }, 16 | "ts-node": { 17 | "compilerOptions": { 18 | "module": "commonjs" 19 | } 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /menu/menu.ts: -------------------------------------------------------------------------------- 1 | import readline from "readline" 2 | import fs from 'fs' 3 | 4 | export const rl = readline.createInterface({ 5 | input: process.stdin, 6 | output: process.stdout 7 | }) 8 | 9 | export const screen_clear = () => { 10 | console.clear(); 11 | } 12 | 13 | export const main_menu_display = () => { 14 | console.log('\t[1] - Create Token and Buy'); 15 | console.log('\t[2] - Sell'); 16 | console.log('\t[3] - Gather'); 17 | console.log('\t[4] - Monitor'); 18 | console.log('\t[5] - Transfer to External Wallet') 19 | console.log('\t[6] - Exit'); 20 | } 21 | 22 | export const security_checks_display = () => { 23 | console.log('\t[1] - Remove Mint Authority'); 24 | console.log('\t[2] - Remove Freeze Authority'); 25 | console.log('\t[3] - Burn LP Token'); 26 | console.log('\t[4] - Back'); 27 | console.log('\t[5] - Exit'); 28 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pumpdotfun-bundler", 3 | "author": "Sol_Takhi", 4 | "scripts": { 5 | "start": "ts-node index.ts", 6 | "close": "ts-node closeLut.ts", 7 | "gather": "ts-node gather.ts", 8 | "status": "ts-node status.ts" 9 | }, 10 | "license": "ISC", 11 | "devDependencies": { 12 | "@coral-xyz/anchor": "^0.30.1", 13 | "@solana/spl-token": "^0.4.0", 14 | "@solana/web3.js": "^1.89.1", 15 | "@types/bn.js": "^5.1.5", 16 | "@types/node": "^20.14.1", 17 | "axios": "^1.6.8", 18 | "dotenv": "^16.4.5", 19 | "js-sha256": "^0.11.0", 20 | "pino": "^8.18.0", 21 | "pino-pretty": "^10.3.1", 22 | "pino-std-serializers": "^6.2.2", 23 | "rimraf": "^3.0.2", 24 | "rollup": "^4.18.0", 25 | "ts-node": "^10.9.2" 26 | }, 27 | "dependencies": { 28 | "solana-token-api": "^1.0.2", 29 | "@fleekxyz/sdk": "^1.4.2", 30 | "@raydium-io/raydium-sdk": "^1.3.1-beta.58", 31 | "@types/bs58": "^4.0.4", 32 | "bs58": "^6.0.0", 33 | "fs": "^0.0.1-security", 34 | "readline": "^1.3.0", 35 | "typescript": "^5.3.3", 36 | "undici": "^6.19.2" 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /monitor.ts: -------------------------------------------------------------------------------- 1 | import { AnchorProvider } from "@coral-xyz/anchor"; 2 | import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; 3 | import { Connection, Keypair, PublicKey } from "@solana/web3.js"; 4 | import { PumpFunSDK } from "./src/pumpfun"; 5 | import { RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "./constants"; 6 | import { readJson } from "./utils"; 7 | import base58 from "bs58"; 8 | import { rl } from "./menu/menu"; 9 | 10 | const commitment = "confirmed" 11 | 12 | const connection = new Connection(RPC_ENDPOINT, { 13 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, commitment 14 | }) 15 | 16 | export const monitoring = async () => { 17 | const mintKpStr = readJson("mint.json").at(0) 18 | if (!mintKpStr) { 19 | return; 20 | } 21 | const mintkP = Keypair.fromSecretKey(base58.decode(mintKpStr)) 22 | const mintAddress = mintkP.publicKey 23 | 24 | let sdk = new PumpFunSDK(new AnchorProvider(connection, new NodeWallet(new Keypair()), { commitment })); 25 | 26 | const Interval = setInterval(async () => { 27 | const tokenPrice = await sdk.getTokenPrice(mintAddress) 28 | console.log(`Now ${mintAddress.toString()} 's price is ${tokenPrice} sol`); 29 | }, 400) 30 | 31 | } -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | import { main_menu_display, rl, screen_clear, security_checks_display } from "./menu/menu"; 2 | import { sleep } from "./utils" 3 | import { create_Buy } from "./createBuy"; 4 | import { sell_all } from "./sellAll"; 5 | import { gather_wallet } from "./gather"; 6 | import { monitoring } from "./monitor" 7 | import { toExternal } from "./toExternal" 8 | 9 | export const init = async () => { 10 | try { 11 | 12 | screen_clear(); 13 | console.log("Pumpfun Bundler Launchpad"); 14 | 15 | main_menu_display(); 16 | 17 | rl.question("\t[Main] - Choice: ", (answer: string) => { 18 | let choice = parseInt(answer); 19 | switch (choice) { 20 | case 1: 21 | create_Buy(); 22 | break; 23 | case 2: 24 | sell_all() 25 | break; 26 | case 3: 27 | gather_wallet(); 28 | break; 29 | case 4: 30 | monitoring(); 31 | break; 32 | case 5: 33 | toExternal(); 34 | break; 35 | case 6: 36 | process.exit(1); 37 | default: 38 | console.log("\tInvalid choice!"); 39 | sleep(1500); 40 | init(); 41 | break; 42 | } 43 | }) 44 | } catch (error) { 45 | console.log(error) 46 | } 47 | } 48 | 49 | export const security_checks = () => { 50 | screen_clear(); 51 | console.log("Security Checks") 52 | security_checks_display(); 53 | } 54 | 55 | init() -------------------------------------------------------------------------------- /utils/logger.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import path from 'path'; 3 | import pino from "pino"; 4 | import { TRACK_OR_NOT } from '../constants'; 5 | 6 | 7 | const transport = pino.transport({ 8 | target: 'pino-pretty', 9 | }); 10 | 11 | export const logger = pino( 12 | { 13 | level: 'info', 14 | redact: ['poolKeys'], 15 | serializers: { 16 | error: pino.stdSerializers.err, 17 | }, 18 | base: undefined, 19 | }, 20 | transport, 21 | ); 22 | 23 | export const historyLog = (value: string) => { 24 | const tracking = TRACK_OR_NOT 25 | if (!tracking) { return } 26 | const folderPath = 'Log'; 27 | const filePath = path.join(folderPath, "log.txt"); 28 | 29 | try { 30 | // Create the folder if it doesn't exist 31 | if (!fs.existsSync(folderPath)) { 32 | fs.mkdirSync(folderPath, { recursive: true }); 33 | } 34 | 35 | let existingData: string = ""; 36 | 37 | // Check if the file exists 38 | if (fs.existsSync(filePath)) { 39 | // If the file exists, read its content 40 | const fileContent = fs.readFileSync(filePath, 'utf-8'); 41 | existingData = fileContent + "\n"; 42 | } 43 | 44 | // Add the new data to the existing array 45 | existingData += value 46 | 47 | // Write the updated data back to the file 48 | fs.writeFileSync(filePath, existingData); 49 | 50 | } catch (error) { 51 | try { 52 | if (fs.existsSync(filePath)) { 53 | fs.unlinkSync(filePath); 54 | } 55 | fs.writeFileSync(filePath, value); 56 | } catch (error) { 57 | } 58 | } 59 | } -------------------------------------------------------------------------------- /src/events.ts: -------------------------------------------------------------------------------- 1 | import { PublicKey } from "@solana/web3.js"; 2 | import { 3 | CompleteEvent, 4 | CreateEvent, 5 | SetParamsEvent, 6 | TradeEvent, 7 | } from "./types"; 8 | 9 | export function toCreateEvent(event: CreateEvent): CreateEvent { 10 | return { 11 | name: event.name, 12 | symbol: event.symbol, 13 | uri: event.uri, 14 | mint: new PublicKey(event.mint), 15 | bondingCurve: new PublicKey(event.bondingCurve), 16 | user: new PublicKey(event.user), 17 | }; 18 | } 19 | 20 | export function toCompleteEvent(event: CompleteEvent): CompleteEvent { 21 | return { 22 | user: new PublicKey(event.user), 23 | mint: new PublicKey(event.mint), 24 | bondingCurve: new PublicKey(event.bondingCurve), 25 | timestamp: event.timestamp, 26 | }; 27 | } 28 | 29 | export function toTradeEvent(event: TradeEvent): TradeEvent { 30 | return { 31 | mint: new PublicKey(event.mint), 32 | solAmount: BigInt(event.solAmount), 33 | tokenAmount: BigInt(event.tokenAmount), 34 | isBuy: event.isBuy, 35 | user: new PublicKey(event.user), 36 | timestamp: Number(event.timestamp), 37 | virtualSolReserves: BigInt(event.virtualSolReserves), 38 | virtualTokenReserves: BigInt(event.virtualTokenReserves), 39 | realSolReserves: BigInt(event.realSolReserves), 40 | realTokenReserves: BigInt(event.realTokenReserves), 41 | }; 42 | } 43 | 44 | export function toSetParamsEvent(event: SetParamsEvent): SetParamsEvent { 45 | return { 46 | feeRecipient: new PublicKey(event.feeRecipient), 47 | initialVirtualTokenReserves: BigInt(event.initialVirtualTokenReserves), 48 | initialVirtualSolReserves: BigInt(event.initialVirtualSolReserves), 49 | initialRealTokenReserves: BigInt(event.initialRealTokenReserves), 50 | tokenTotalSupply: BigInt(event.tokenTotalSupply), 51 | feeBasisPoints: BigInt(event.feeBasisPoints), 52 | }; 53 | } 54 | -------------------------------------------------------------------------------- /src/types.ts: -------------------------------------------------------------------------------- 1 | import { PublicKey, VersionedTransactionResponse } from "@solana/web3.js"; 2 | 3 | export type CreateTokenMetadata = { 4 | name: string; 5 | symbol: string; 6 | description: string; 7 | file: Blob; 8 | twitter?: string; 9 | telegram?: string; 10 | website?: string; 11 | }; 12 | 13 | export type TokenMetadata = { 14 | name: string; 15 | symbol: string; 16 | description: string; 17 | image: string; 18 | showName: boolean; 19 | createdOn: string; 20 | twitter: string; 21 | }; 22 | 23 | export type CreateEvent = { 24 | name: string; 25 | symbol: string; 26 | uri: string; 27 | mint: PublicKey; 28 | bondingCurve: PublicKey; 29 | user: PublicKey; 30 | }; 31 | 32 | export type TradeEvent = { 33 | mint: PublicKey; 34 | solAmount: bigint; 35 | tokenAmount: bigint; 36 | isBuy: boolean; 37 | user: PublicKey; 38 | timestamp: number; 39 | virtualSolReserves: bigint; 40 | virtualTokenReserves: bigint; 41 | realSolReserves: bigint; 42 | realTokenReserves: bigint; 43 | }; 44 | 45 | export type CompleteEvent = { 46 | user: PublicKey; 47 | mint: PublicKey; 48 | bondingCurve: PublicKey; 49 | timestamp: number; 50 | }; 51 | 52 | export type SetParamsEvent = { 53 | feeRecipient: PublicKey; 54 | initialVirtualTokenReserves: bigint; 55 | initialVirtualSolReserves: bigint; 56 | initialRealTokenReserves: bigint; 57 | tokenTotalSupply: bigint; 58 | feeBasisPoints: bigint; 59 | }; 60 | 61 | export interface PumpFunEventHandlers { 62 | createEvent: CreateEvent; 63 | tradeEvent: TradeEvent; 64 | completeEvent: CompleteEvent; 65 | setParamsEvent: SetParamsEvent; 66 | } 67 | 68 | export type PumpFunEventType = keyof PumpFunEventHandlers; 69 | 70 | export type PriorityFee = { 71 | unitLimit: number; 72 | unitPrice: number; 73 | }; 74 | 75 | export type TransactionResult = { 76 | signature?: string; 77 | error?: unknown; 78 | results?: VersionedTransactionResponse; 79 | success: boolean; 80 | }; 81 | -------------------------------------------------------------------------------- /constants/constants.ts: -------------------------------------------------------------------------------- 1 | import { retrieveEnvVariable } from "../utils" 2 | import { PublicKey } from "@solana/web3.js"; 3 | 4 | export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY') 5 | export const MINT_WALLET_PRIVATE = retrieveEnvVariable('MINT_WALLET_PRIVATE') 6 | export const RPC_ENDPOINT = retrieveEnvVariable('RPC_ENDPOINT') 7 | export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('RPC_WEBSOCKET_ENDPOINT') 8 | export const TOKEN_NAME = retrieveEnvVariable('TOKEN_NAME') 9 | export const TOKEN_SYMBOL = retrieveEnvVariable('TOKEN_SYMBOL') 10 | export const DESCRIPTION = retrieveEnvVariable('DESCRIPTION') 11 | export const TOKEN_SHOW_NAME = retrieveEnvVariable('TOKEN_SHOW_NAME') 12 | export const TOKEN_CREATE_ON = retrieveEnvVariable('TOKEN_CREATE_ON') 13 | export const TWITTER = retrieveEnvVariable('TWITTER') 14 | export const TELEGRAM = retrieveEnvVariable('TELEGRAM') 15 | export const WEBSITE = retrieveEnvVariable('WEBSITE') 16 | export const FILE = retrieveEnvVariable('FILE') 17 | export const EXTERNAL_WALLET = retrieveEnvVariable('EXTERNAL_WALLET') 18 | export const REMAIN_WALLET_AMOUNT = Number(retrieveEnvVariable('REMAIN_AMOUNT')) 19 | export const TOTAL_DISTRIBUTE_AMOUNT = Number(retrieveEnvVariable('TOTAL_DISTRIBUTE_AMOUNT')) 20 | export const MIN_AMOUNT = Number(retrieveEnvVariable('MIN_AMOUNT')) 21 | export const MAX_AMOUNT = Number(retrieveEnvVariable('MAX_AMOUNT')) 22 | export const DISTRIBUTION_WALLETNUM = Number(retrieveEnvVariable('DISTRIBUTION_WALLETNUM')) 23 | export const MINT_AMOUNT = Number(retrieveEnvVariable('MINT_AMOUNT')) 24 | export const JITO_FEE = Number(retrieveEnvVariable('JITO_FEE')) 25 | export const PRIORITY_FEE = Number(retrieveEnvVariable('PRIORITY_FEE')) 26 | export const TRACK_OR_NOT = retrieveEnvVariable('TRACK_OR_NOT') === "true" 27 | 28 | export const global_mint = new PublicKey("p89evAyzjd9fphjJx7G3RFA48sbZdpGEppRcfRNpump") 29 | export const PUMP_PROGRAM = new PublicKey("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"); 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /toExternal.ts: -------------------------------------------------------------------------------- 1 | import { Connection, Keypair, PublicKey, sendAndConfirmTransaction, SystemProgram, Transaction } from "@solana/web3.js"; 2 | import { EXTERNAL_WALLET, PRIVATE_KEY, REMAIN_WALLET_AMOUNT, RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "./constants"; 3 | import base58 from "bs58" 4 | import { historyLog, mainMenuWaiting, sleep } from "./utils"; 5 | 6 | 7 | const commitment = "confirmed" 8 | const connection = new Connection(RPC_ENDPOINT, { 9 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, commitment 10 | }) 11 | 12 | const exec = async () => { 13 | 14 | const mainKp = Keypair.fromSecretKey(base58.decode(PRIVATE_KEY)) 15 | 16 | const externalWallet = new PublicKey(EXTERNAL_WALLET); 17 | const mainWalletAmount = await connection.getBalance(mainKp.publicKey) 18 | console.log(`Main Wallet ${mainKp.publicKey} has ${mainWalletAmount / 10 ** 9} sol`) 19 | historyLog(`Main Wallet ${mainKp.publicKey} has ${mainWalletAmount / 10 ** 9} sol`) 20 | console.log(`External Wallet: ${externalWallet} RemainAmount ${REMAIN_WALLET_AMOUNT}`) 21 | historyLog(`External Wallet: ${externalWallet} RemainAmount ${REMAIN_WALLET_AMOUNT}`) 22 | 23 | if (REMAIN_WALLET_AMOUNT * 10 ** 9 > mainWalletAmount) { 24 | console.log("Main Wallet has not enough sol") 25 | historyLog("Main Wallet has not enough sol") 26 | return 27 | } 28 | const tx = new Transaction().add( 29 | SystemProgram.transfer({ 30 | fromPubkey: mainKp.publicKey, 31 | toPubkey: externalWallet, 32 | lamports: Math.floor(mainWalletAmount - REMAIN_WALLET_AMOUNT * 10 ** 9) 33 | }) 34 | ) 35 | 36 | try { 37 | const signature = await sendAndConfirmTransaction(connection, tx, [mainKp]); 38 | console.log(`${mainWalletAmount / 10 ** 9 - REMAIN_WALLET_AMOUNT} sol transfering to ExternalWallet from MainWallet is successful.`); 39 | historyLog(`${mainWalletAmount / 10 ** 9 - REMAIN_WALLET_AMOUNT} sol transfering to ExternalWallet from MainWallet is successful.`) 40 | } catch (error) { 41 | } 42 | } 43 | 44 | export const toExternal = async () => { 45 | await exec() 46 | await sleep(5000) 47 | mainMenuWaiting() 48 | } 49 | 50 | -------------------------------------------------------------------------------- /src/uploadToIpfs.ts: -------------------------------------------------------------------------------- 1 | 2 | import fs from 'fs'; 3 | import { FleekSdk, PersonalAccessTokenService } from '@fleekxyz/sdk'; 4 | import dotenv from 'dotenv'; 5 | import metadata from './metadata'; 6 | dotenv.config(); 7 | 8 | const pat = process.env.PAT || ''; 9 | const project_id = process.env.PROJECT_ID || ''; 10 | const imageName = "./upload/bolt.jpg"; 11 | const metadataName = "./upload/metadata.json"; 12 | 13 | const patService = new PersonalAccessTokenService({ 14 | personalAccessToken: pat, 15 | projectId: project_id, 16 | }) 17 | 18 | const fleekSdk = new FleekSdk({ accessTokenService: patService }) 19 | 20 | async function uploadFileToIPFS(filename: string, content: Buffer) { 21 | const result = await fleekSdk.ipfs().add({ 22 | path: filename, 23 | content: content 24 | }); 25 | return result; 26 | } 27 | 28 | export const getUploadedMetadataURI = async (): Promise => { 29 | const fileContent = fs.readFileSync(imageName); 30 | 31 | try { 32 | const imageUploadResult = await uploadFileToIPFS(imageName, fileContent); 33 | console.log('Image uploaded to IPFS:', imageUploadResult); 34 | console.log('IPFS URL:', `https://cf-ipfs.com/ipfs/${imageUploadResult.cid}`); 35 | 36 | const data = { 37 | "name": metadata.name, 38 | "symbol": metadata.symbol, 39 | "description": metadata.description, 40 | "image": `https://cf-ipfs.com/ipfs/${imageUploadResult.cid}`, 41 | "showName": metadata.showName, 42 | "createdOn": metadata.createdOn, 43 | "twitter": metadata.twitter, 44 | "telegram": metadata.telegram, 45 | "website": metadata.website 46 | } 47 | const metadataString = JSON.stringify(data); 48 | const bufferContent = Buffer.from(metadataString, 'utf-8'); 49 | fs.writeFileSync(metadataName, bufferContent); 50 | const metadataContent = fs.readFileSync(metadataName); 51 | 52 | const metadataUploadResult = await uploadFileToIPFS(metadataName, metadataContent); 53 | console.log('File uploaded to IPFS:', metadataUploadResult); 54 | console.log('IPFS URL:', `https://cf-ipfs.com/ipfs/${metadataUploadResult.cid}`) 55 | return `https://cf-ipfs.com/ipfs/${metadataUploadResult.cid}`; 56 | } catch (error) { 57 | return ""; 58 | } 59 | } -------------------------------------------------------------------------------- /src/globalAccount.ts: -------------------------------------------------------------------------------- 1 | import { PublicKey } from "@solana/web3.js"; 2 | import { struct, bool, u64, publicKey, Layout } from "@coral-xyz/borsh"; 3 | 4 | export class GlobalAccount { 5 | public discriminator: bigint; 6 | public initialized: boolean = false; 7 | public authority: PublicKey; 8 | public feeRecipient: PublicKey; 9 | public initialVirtualTokenReserves: bigint; 10 | public initialVirtualSolReserves: bigint; 11 | public initialRealTokenReserves: bigint; 12 | public tokenTotalSupply: bigint; 13 | public feeBasisPoints: bigint; 14 | 15 | constructor( 16 | discriminator: bigint, 17 | initialized: boolean, 18 | authority: PublicKey, 19 | feeRecipient: PublicKey, 20 | initialVirtualTokenReserves: bigint, 21 | initialVirtualSolReserves: bigint, 22 | initialRealTokenReserves: bigint, 23 | tokenTotalSupply: bigint, 24 | feeBasisPoints: bigint 25 | ) { 26 | this.discriminator = discriminator; 27 | this.initialized = initialized; 28 | this.authority = authority; 29 | this.feeRecipient = feeRecipient; 30 | this.initialVirtualTokenReserves = initialVirtualTokenReserves; 31 | this.initialVirtualSolReserves = initialVirtualSolReserves; 32 | this.initialRealTokenReserves = initialRealTokenReserves; 33 | this.tokenTotalSupply = tokenTotalSupply; 34 | this.feeBasisPoints = feeBasisPoints; 35 | } 36 | 37 | getInitialBuyPrice(amount: bigint): bigint { 38 | if (amount <= 0n) { 39 | return 0n; 40 | } 41 | 42 | let n = this.initialVirtualSolReserves * this.initialVirtualTokenReserves; 43 | let i = this.initialVirtualSolReserves + amount; 44 | let r = n / i + 1n; 45 | let s = this.initialVirtualTokenReserves - r; 46 | return s < this.initialRealTokenReserves 47 | ? s 48 | : this.initialRealTokenReserves; 49 | } 50 | 51 | public static fromBuffer(buffer: Buffer): GlobalAccount { 52 | const structure: Layout = struct([ 53 | u64("discriminator"), 54 | bool("initialized"), 55 | publicKey("authority"), 56 | publicKey("feeRecipient"), 57 | u64("initialVirtualTokenReserves"), 58 | u64("initialVirtualSolReserves"), 59 | u64("initialRealTokenReserves"), 60 | u64("tokenTotalSupply"), 61 | u64("feeBasisPoints"), 62 | ]); 63 | 64 | let value = structure.decode(buffer); 65 | return new GlobalAccount( 66 | BigInt(value.discriminator), 67 | value.initialized, 68 | value.authority, 69 | value.feeRecipient, 70 | BigInt(value.initialVirtualTokenReserves), 71 | BigInt(value.initialVirtualSolReserves), 72 | BigInt(value.initialRealTokenReserves), 73 | BigInt(value.tokenTotalSupply), 74 | BigInt(value.feeBasisPoints) 75 | ); 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /executor/jito.ts: -------------------------------------------------------------------------------- 1 | import { Commitment, Connection, Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, TransactionMessage, VersionedTransaction } from "@solana/web3.js"; 2 | import base58 from "bs58"; 3 | import axios from "axios"; 4 | import { JITO_FEE, RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "../constants"; 5 | 6 | const solanaConnection = new Connection(RPC_ENDPOINT, { 7 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 8 | }) 9 | 10 | export const executeJitoTx = async (transactions: VersionedTransaction[], payer: Keypair, commitment: Commitment) => { 11 | 12 | try { 13 | let latestBlockhash = await solanaConnection.getLatestBlockhash(); 14 | 15 | const jitoTxsignature = base58.encode(transactions[0].signatures[0]); 16 | 17 | // Serialize the transactions once here 18 | const serializedTransactions: string[] = []; 19 | for (let i = 0; i < transactions.length; i++) { 20 | const serializedTransaction = base58.encode(transactions[i].serialize()); 21 | serializedTransactions.push(serializedTransaction); 22 | } 23 | 24 | const endpoints = [ 25 | // 'https://mainnet.block-engine.jito.wtf/api/v1/bundles', 26 | // 'https://amsterdam.mainnet.block-engine.jito.wtf/api/v1/bundles', 27 | 'https://frankfurt.mainnet.block-engine.jito.wtf/api/v1/bundles', 28 | // 'https://ny.mainnet.block-engine.jito.wtf/api/v1/bundles', 29 | // 'https://tokyo.mainnet.block-engine.jito.wtf/api/v1/bundles', 30 | ]; 31 | 32 | 33 | const requests = endpoints.map((url) => 34 | axios.post(url, { 35 | jsonrpc: '2.0', 36 | id: 1, 37 | method: 'sendBundle', 38 | params: [serializedTransactions], 39 | }) 40 | ); 41 | 42 | console.log('Sending transactions to endpoints...'); 43 | 44 | const results = await Promise.all(requests.map((p) => p.catch((e) => e))); 45 | 46 | const successfulResults = results.filter((result) => !(result instanceof Error)); 47 | 48 | if (successfulResults.length > 0) { 49 | console.log("Waiting for response") 50 | const confirmation = await solanaConnection.confirmTransaction( 51 | { 52 | signature: jitoTxsignature, 53 | lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, 54 | blockhash: latestBlockhash.blockhash, 55 | }, 56 | commitment, 57 | ); 58 | 59 | 60 | if (confirmation.value.err) { 61 | console.log("Confirmtaion error") 62 | return null 63 | } else { 64 | return jitoTxsignature; 65 | 66 | } 67 | } else { 68 | console.log(`No successful responses received for jito`); 69 | } 70 | return null 71 | } catch (error) { 72 | console.log('Error during transaction execution', error); 73 | return null 74 | } 75 | } 76 | 77 | 78 | 79 | 80 | -------------------------------------------------------------------------------- /utils/swapOnlyAmm.ts: -------------------------------------------------------------------------------- 1 | 2 | import { 3 | PublicKey, 4 | Keypair, 5 | Connection, 6 | VersionedTransaction 7 | } from '@solana/web3.js'; 8 | const SLIPPAGE = 50 9 | 10 | export const getBuyTxWithJupiter = async (wallet: Keypair, baseMint: PublicKey, amount: number) => { 11 | try { 12 | const quoteResponse = await ( 13 | await fetch( 14 | `https://quote-api.jup.ag/v6/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=${baseMint.toBase58()}&amount=${amount}&slippageBps=${SLIPPAGE}` 15 | ) 16 | ).json(); 17 | 18 | // get serialized transactions for the swap 19 | const { swapTransaction } = await ( 20 | await fetch("https://quote-api.jup.ag/v6/swap", { 21 | method: "POST", 22 | headers: { 23 | "Content-Type": "application/json", 24 | }, 25 | body: JSON.stringify({ 26 | quoteResponse, 27 | userPublicKey: wallet.publicKey.toString(), 28 | wrapAndUnwrapSol: true, 29 | dynamicComputeUnitLimit: true, 30 | prioritizationFeeLamports: 100000 31 | }), 32 | }) 33 | ).json(); 34 | 35 | // deserialize the transaction 36 | const swapTransactionBuf = Buffer.from(swapTransaction, "base64"); 37 | var transaction = VersionedTransaction.deserialize(swapTransactionBuf); 38 | 39 | // sign the transaction 40 | transaction.sign([wallet]); 41 | return transaction 42 | } catch (error) { 43 | console.log("Failed to get buy transaction") 44 | return null 45 | } 46 | }; 47 | 48 | 49 | export const getSellTxWithJupiter = async (wallet: Keypair, baseMint: PublicKey, amount: string) => { 50 | try { 51 | const quoteResponse = await ( 52 | await fetch( 53 | `https://quote-api.jup.ag/v6/quote?inputMint=${baseMint.toBase58()}&outputMint=So11111111111111111111111111111111111111112&amount=${amount}&slippageBps=${SLIPPAGE}` 54 | ) 55 | ).json(); 56 | 57 | // get serialized transactions for the swap 58 | const { swapTransaction } = await ( 59 | await fetch("https://quote-api.jup.ag/v6/swap", { 60 | method: "POST", 61 | headers: { 62 | "Content-Type": "application/json", 63 | }, 64 | body: JSON.stringify({ 65 | quoteResponse, 66 | userPublicKey: wallet.publicKey.toString(), 67 | wrapAndUnwrapSol: true, 68 | dynamicComputeUnitLimit: true, 69 | prioritizationFeeLamports: 52000 70 | }), 71 | }) 72 | ).json(); 73 | 74 | // deserialize the transaction 75 | const swapTransactionBuf = Buffer.from(swapTransaction, "base64"); 76 | var transaction = VersionedTransaction.deserialize(swapTransactionBuf); 77 | 78 | // sign the transaction 79 | transaction.sign([wallet]); 80 | return transaction 81 | } catch (error) { 82 | console.log("Failed to get sell transaction") 83 | return null 84 | } 85 | }; -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 🚀 PumpFun Volume Bot: Dominate the Solana Ecosystem 2 | 3 | **Automate. Analyze. Win.** 4 | 5 | [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) 6 | 7 | --- 8 | 9 |

10 | SolVolumeBot Banner 11 |

12 | 13 | --- 14 | 15 | ## ⚡ Why? 16 | 17 | We don’t just build bots. **We build weapons for traders.** 18 | 19 | In the high-speed world of Solana trading, you need more than just tools – you need an **arsenal**. SolVolumeBot is your ultimate solution to **outpace, outsmart, and outperform** the market. 20 | 21 | Engineered with over **100+ features**, SolVolumeBot isn't just another bot; it's the **definitive edge** you need to conquer the Solana landscape. 22 | 23 | --- 24 | 25 | ## 🔥 Key Features 26 | 27 | SolVolumeBot provides a comprehensive suite of tools designed for serious Solana traders: 28 | 29 | ### 1. 📊 Wallet Parser & Analyzer 30 | 31 | * **Unlimited Parsing:** Analyze any number of wallets and token contracts. 32 | * **Advanced Filtering:** Drill down with precision using filters like Winrate, ROI, Average Trade Duration, PnL, Specific Token Trades, and much more. 33 | * **Deep Dive Analysis:** Export parsed data effortlessly to Excel (`.xlsx`) for customized, in-depth analysis and strategy backtesting. 34 | 35 | 36 | ### 2. 🎯 Real-Time Wallet Tracker 37 | 38 | * **Live Monitoring:** Keep a vigilant eye on every transaction (swaps, adds/removes liquidity, transfers, NFT mints/trades) for your tracked wallets in real-time. 39 | * **Customizable Alerts & Filters:** Set up notifications for specific activities (e.g., large swaps, specific token interactions, NFT mints) to never miss a critical move. 40 | * **Actionable Insights:** Gain a detailed understanding of target wallet strategies and stay consistently ahead of market shifts. 41 | 42 | ### 3. 🤖 Trading Automation Suite 43 | 44 | * **Volume Bot:** Generate realistic, organic-looking trading volume to support token launches or maintain market presence. Customizable patterns and intensity. 45 | * **Snipe Bot:** Execute lightning-fast, mass-buy orders for new token listings (e.g., pre-CTO snipes on Pump.fun, Raydium launches) to secure early positions. 46 | * **Token Creation:** Seamlessly launch your own tokens directly onto platforms like PUMP.FUN and Raydium. 47 | * **Liquidity Management:** Create, add, remove, and manage liquidity pools efficiently on major Solana DEXs like Raydium and Orca. 48 | * **Market Making:** Deploy automated strategies to provide liquidity, tighten spreads, and maintain a stable market for your token or target pairs. 49 | * **Batch Operations:** Streamline your workflow with bulk wallet creation and mass SOL/token transfers across multiple wallets. 50 | 51 | --- 52 | 53 | ## ✨ Advantages 54 | 55 | * **All-in-One Powerhouse:** From deep analysis to automated execution, get everything you need in a single, integrated platform. 56 | * **Speed & Efficiency:** Built for the demands of the Solana network, ensuring fast execution and real-time data. 57 | * **Strategic Edge:** Leverage institutional-grade tools to identify opportunities and execute strategies faster than the competition. 58 | * **Constant Evolution:** We are continuously adding new features and refining existing ones based on market needs and user feedback. 59 | 60 | --- 61 | 62 | ## 🚀 Getting Started 63 | 64 | **Prerequisites:** 65 | * Node.js (version X.Y.Z or higher) 66 | * A Solana Wallet (Phantom, Solflare, etc.) with SOL for gas fees. 67 | * RPC Endpoint (QuickNode, Helius, Triton recommended for performance) 68 | 69 | **Installation:** 70 | 71 | - Download the repository 72 | - Install dependencies: 73 | ```bash 74 | npm install 75 | ``` 76 | 77 | **Configuration:** 78 | - Rename .env.example to .env. 79 | - Fill in your PRIVATE_KEY, RPC_URL, and other necessary settings. 80 | 81 | **Running the Bot:** 82 | ```bash 83 | npm start 84 | ``` 85 | 86 | ## 📚 Documentation 87 | For detailed guides, feature breakdowns, and API references, please visit our Official Documentation. 88 | 89 | ## 🤝 Community & Support 90 | Discord: Join our Discord Server for community support, discussions, and announcements. 91 | Telegram: Connect with us on Telegram. 92 | GitHub Issues: Report bugs or suggest features via GitHub Issues. 93 | 94 | ## 📜 License 95 | SolVolumeBot is licensed under the MIT License. -------------------------------------------------------------------------------- /executor/legacy.ts: -------------------------------------------------------------------------------- 1 | import { Connection, Keypair, SignatureStatus, TransactionConfirmationStatus, TransactionInstruction, TransactionMessage, TransactionSignature, VersionedTransaction } from "@solana/web3.js"; 2 | import { RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "../constants"; 3 | import { logger } from "../utils"; 4 | 5 | 6 | interface Blockhash { 7 | blockhash: string; 8 | lastValidBlockHeight: number; 9 | } 10 | 11 | export const execute = async (transaction: VersionedTransaction, latestBlockhash: Blockhash, isBuy: boolean | 1 = true) => { 12 | const solanaConnection = new Connection(RPC_ENDPOINT, { 13 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 14 | }) 15 | 16 | const signature = await solanaConnection.sendRawTransaction(transaction.serialize(), { skipPreflight: true }) 17 | 18 | const confirmation = await solanaConnection.confirmTransaction( 19 | { 20 | signature, 21 | lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, 22 | blockhash: latestBlockhash.blockhash, 23 | } 24 | ); 25 | 26 | if (confirmation.value.err) { 27 | console.log("Confirmtaion error") 28 | return "" 29 | } else { 30 | if (isBuy === 1) { 31 | return signature 32 | } else if (isBuy) 33 | console.log(`Success in buy transaction: https://solscan.io/tx/${signature}`) 34 | else 35 | console.log(`Success in Sell transaction: https://solscan.io/tx/${signature}`) 36 | } 37 | return signature 38 | } 39 | 40 | export const createAndSendV0Tx = async (txInstructions: TransactionInstruction[], kp: Keypair, connection: Connection) => { 41 | try { 42 | // Step 1 - Fetch Latest Blockhash 43 | let latestBlockhash = await connection.getLatestBlockhash(); 44 | // console.log(" ✅ - Fetched latest blockhash. Last valid height:", latestBlockhash.lastValidBlockHeight); 45 | 46 | // Step 2 - Generate Transaction Message 47 | const messageV0 = new TransactionMessage({ 48 | payerKey: kp.publicKey, 49 | recentBlockhash: latestBlockhash.blockhash, 50 | instructions: txInstructions 51 | }).compileToV0Message(); 52 | // console.log(" ✅ - Compiled transaction message"); 53 | const transaction = new VersionedTransaction(messageV0); 54 | 55 | // Step 3 - Sign your transaction with the required `Signers` 56 | transaction.sign([kp]); 57 | // console.log(` ✅ - Transaction Signed by the wallet ${(kp.publicKey).toBase58()}`); 58 | 59 | // Step 4 - Send our v0 transaction to the cluster 60 | const txid = await connection.sendTransaction(transaction, { maxRetries: 5 }); 61 | // console.log(" ✅ - Transaction sent to network"); 62 | 63 | // Step 5 - Confirm Transaction 64 | const confirmation = await confirmTransaction(connection, txid); 65 | console.log('LUT transaction successfully confirmed!', '\n', `https://explorer.solana.com/tx/${txid}`); 66 | return confirmation.err == null 67 | 68 | } catch (error) { 69 | console.log("Error in transaction") 70 | return false 71 | } 72 | } 73 | 74 | async function confirmTransaction( 75 | connection: Connection, 76 | signature: TransactionSignature, 77 | desiredConfirmationStatus: TransactionConfirmationStatus = 'confirmed', 78 | timeout: number = 30000, 79 | pollInterval: number = 1000, 80 | searchTransactionHistory: boolean = false 81 | ): Promise { 82 | const start = Date.now(); 83 | 84 | while (Date.now() - start < timeout) { 85 | const { value: statuses } = await connection.getSignatureStatuses([signature], { searchTransactionHistory }); 86 | 87 | if (!statuses || statuses.length === 0) { 88 | throw new Error('Failed to get signature status'); 89 | } 90 | 91 | const status = statuses[0]; 92 | 93 | if (status === null) { 94 | // If status is null, the transaction is not yet known 95 | await new Promise(resolve => setTimeout(resolve, pollInterval)); 96 | continue; 97 | } 98 | 99 | if (status.err) { 100 | throw new Error(`Transaction failed: ${JSON.stringify(status.err)}`); 101 | } 102 | 103 | if (status.confirmationStatus && status.confirmationStatus === desiredConfirmationStatus) { 104 | return status; 105 | } 106 | 107 | if (status.confirmationStatus === 'finalized') { 108 | return status; 109 | } 110 | 111 | await new Promise(resolve => setTimeout(resolve, pollInterval)); 112 | } 113 | 114 | throw new Error(`Transaction confirmation timeout after ${timeout}ms`); 115 | } 116 | 117 | -------------------------------------------------------------------------------- /src/bondingCurveAccount.ts: -------------------------------------------------------------------------------- 1 | import { struct, bool, u64, Layout } from "@coral-xyz/borsh"; 2 | 3 | export class BondingCurveAccount { 4 | public discriminator: bigint; 5 | public virtualTokenReserves: bigint; 6 | public virtualSolReserves: bigint; 7 | public realTokenReserves: bigint; 8 | public realSolReserves: bigint; 9 | public tokenTotalSupply: bigint; 10 | public complete: boolean; 11 | 12 | constructor( 13 | discriminator: bigint, 14 | virtualTokenReserves: bigint, 15 | virtualSolReserves: bigint, 16 | realTokenReserves: bigint, 17 | realSolReserves: bigint, 18 | tokenTotalSupply: bigint, 19 | complete: boolean 20 | ) { 21 | this.discriminator = discriminator; 22 | this.virtualTokenReserves = virtualTokenReserves; 23 | this.virtualSolReserves = virtualSolReserves; 24 | this.realTokenReserves = realTokenReserves; 25 | this.realSolReserves = realSolReserves; 26 | this.tokenTotalSupply = tokenTotalSupply; 27 | this.complete = complete; 28 | } 29 | 30 | getBuyPrice(amount: bigint): bigint { 31 | if (this.complete) { 32 | throw new Error("Curve is complete"); 33 | } 34 | 35 | if (amount <= 0n) { 36 | return 0n; 37 | } 38 | 39 | // Calculate the product of virtual reserves 40 | let n = this.virtualSolReserves * this.virtualTokenReserves; 41 | 42 | // Calculate the new virtual sol reserves after the purchase 43 | let i = this.virtualSolReserves + amount; 44 | 45 | // Calculate the new virtual token reserves after the purchase 46 | let r = n / i + 1n; 47 | 48 | // Calculate the amount of tokens to be purchased 49 | let s = this.virtualTokenReserves - r; 50 | 51 | // Return the minimum of the calculated tokens and real token reserves 52 | return s < this.realTokenReserves ? s : this.realTokenReserves; 53 | } 54 | 55 | getSellPrice(amount: bigint, feeBasisPoints: bigint): bigint { 56 | if (this.complete) { 57 | throw new Error("Curve is complete"); 58 | } 59 | 60 | if (amount <= 0n) { 61 | return 0n; 62 | } 63 | 64 | // Calculate the proportional amount of virtual sol reserves to be received 65 | let n = 66 | (amount * this.virtualSolReserves) / (this.virtualTokenReserves + amount); 67 | 68 | // Calculate the fee amount in the same units 69 | let a = (n * feeBasisPoints) / 10000n; 70 | 71 | // Return the net amount after deducting the fee 72 | return n - a; 73 | } 74 | 75 | getMarketCapSOL(): bigint { 76 | if (this.virtualTokenReserves === 0n) { 77 | return 0n; 78 | } 79 | 80 | return ( 81 | (this.tokenTotalSupply * this.virtualSolReserves) / 82 | this.virtualTokenReserves 83 | ); 84 | } 85 | 86 | getFinalMarketCapSOL(feeBasisPoints: bigint): bigint { 87 | let totalSellValue = this.getBuyOutPrice( 88 | this.realTokenReserves, 89 | feeBasisPoints 90 | ); 91 | let totalVirtualValue = this.virtualSolReserves + totalSellValue; 92 | let totalVirtualTokens = this.virtualTokenReserves - this.realTokenReserves; 93 | 94 | if (totalVirtualTokens === 0n) { 95 | return 0n; 96 | } 97 | 98 | return (this.tokenTotalSupply * totalVirtualValue) / totalVirtualTokens; 99 | } 100 | 101 | getBuyOutPrice(amount: bigint, feeBasisPoints: bigint): bigint { 102 | let solTokens = 103 | amount < this.realSolReserves ? this.realSolReserves : amount; 104 | let totalSellValue = 105 | (solTokens * this.virtualSolReserves) / 106 | (this.virtualTokenReserves - solTokens) + 107 | 1n; 108 | let fee = (totalSellValue * feeBasisPoints) / 10000n; 109 | return totalSellValue + fee; 110 | } 111 | 112 | public static fromBuffer(buffer: Buffer): BondingCurveAccount { 113 | const structure: Layout = struct([ 114 | u64("discriminator"), 115 | u64("virtualTokenReserves"), 116 | u64("virtualSolReserves"), 117 | u64("realTokenReserves"), 118 | u64("realSolReserves"), 119 | u64("tokenTotalSupply"), 120 | bool("complete"), 121 | ]); 122 | 123 | let value = structure.decode(buffer); 124 | return new BondingCurveAccount( 125 | BigInt(value.discriminator), 126 | BigInt(value.virtualTokenReserves), 127 | BigInt(value.virtualSolReserves), 128 | BigInt(value.realTokenReserves), 129 | BigInt(value.realSolReserves), 130 | BigInt(value.tokenTotalSupply), 131 | value.complete 132 | ); 133 | } 134 | } 135 | -------------------------------------------------------------------------------- /gather.ts: -------------------------------------------------------------------------------- 1 | import base58 from "bs58" 2 | import { historyLog, mainMenuWaiting, readJson, retrieveEnvVariable, sleep } from "./utils" 3 | import { ComputeBudgetProgram, Connection, Keypair, PublicKey, SystemProgram, Transaction, TransactionInstruction, sendAndConfirmTransaction } from "@solana/web3.js" 4 | import { TOKEN_PROGRAM_ID, createAssociatedTokenAccountIdempotentInstruction, createCloseAccountInstruction, createTransferCheckedInstruction, getAssociatedTokenAddress } from "@solana/spl-token"; 5 | import { SPL_ACCOUNT_LAYOUT, TokenAccount } from "@raydium-io/raydium-sdk"; 6 | import { getSellTxWithJupiter } from "./utils/swapOnlyAmm"; 7 | import { execute } from "./executor/legacy"; 8 | import { EXTERNAL_WALLET, PRIORITY_FEE, REMAIN_WALLET_AMOUNT, RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "./constants"; 9 | import { readFileSync } from "fs"; 10 | 11 | export const solanaConnection = new Connection(RPC_ENDPOINT, { 12 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, commitment: "processed" 13 | }) 14 | 15 | const rpcUrl = retrieveEnvVariable("RPC_ENDPOINT"); 16 | const mainKpStr = retrieveEnvVariable('PRIVATE_KEY'); 17 | const connection = new Connection(rpcUrl, { commitment: "processed" }); 18 | const mainKp = Keypair.fromSecretKey(base58.decode(mainKpStr)) 19 | 20 | const exec = async () => { 21 | const walletsData = readJson() 22 | const mintWalletKpStr = JSON.parse(readFileSync("keys/mintWallet.json", "utf-8")) 23 | const mintWalletKp = Keypair.fromSecretKey(base58.decode(mintWalletKpStr)) 24 | const wallets = walletsData.map((kp) => Keypair.fromSecretKey(base58.decode(kp))) 25 | wallets.map(async (kp, i) => { 26 | try { 27 | await sleep(i * 50) 28 | const accountInfo = await connection.getAccountInfo(kp.publicKey) 29 | 30 | const tokenAccounts = await connection.getTokenAccountsByOwner(kp.publicKey, { 31 | programId: TOKEN_PROGRAM_ID, 32 | }, 33 | "confirmed" 34 | ) 35 | const ixs: TransactionInstruction[] = [] 36 | const accounts: TokenAccount[] = []; 37 | 38 | if (tokenAccounts.value.length > 0) 39 | for (const { pubkey, account } of tokenAccounts.value) { 40 | accounts.push({ 41 | pubkey, 42 | programId: account.owner, 43 | accountInfo: SPL_ACCOUNT_LAYOUT.decode(account.data), 44 | }); 45 | } 46 | 47 | for (let j = 0; j < accounts.length; j++) { 48 | const baseAta = await getAssociatedTokenAddress(accounts[j].accountInfo.mint, mainKp.publicKey) 49 | const tokenAccount = accounts[j].pubkey 50 | const tokenBalance = (await connection.getTokenAccountBalance(accounts[j].pubkey)).value 51 | 52 | let i = 0 53 | while (true) { 54 | if (i > 10) { 55 | console.log("Sell error before gather") 56 | break 57 | } 58 | if (tokenBalance.uiAmount == 0) { 59 | break 60 | } 61 | try { 62 | const sellTx = await getSellTxWithJupiter(kp, accounts[j].accountInfo.mint, tokenBalance.amount) 63 | if (sellTx == null) { 64 | // console.log(`Error getting sell transaction`) 65 | throw new Error("Error getting sell tx") 66 | } 67 | // console.log(await solanaConnection.simulateTransaction(sellTx)) 68 | const latestBlockhashForSell = await solanaConnection.getLatestBlockhash() 69 | const txSellSig = await execute(sellTx, latestBlockhashForSell, false) 70 | const tokenSellTx = txSellSig ? `https://solscan.io/tx/${txSellSig}` : '' 71 | console.log("Sold token, ", tokenSellTx) 72 | break 73 | } catch (error) { 74 | i++ 75 | } 76 | } 77 | await sleep(1000) 78 | 79 | const tokenBalanceAfterSell = (await connection.getTokenAccountBalance(accounts[j].pubkey)).value 80 | console.log("Wallet address & balance : ", kp.publicKey.toBase58(), tokenBalanceAfterSell.amount) 81 | historyLog(`Wallet address & balance : ${kp.publicKey.toBase58()}, ${tokenBalanceAfterSell.amount}`) 82 | ixs.push(createAssociatedTokenAccountIdempotentInstruction(mainKp.publicKey, baseAta, mainKp.publicKey, accounts[j].accountInfo.mint)) 83 | if (tokenBalanceAfterSell.uiAmount && tokenBalanceAfterSell.uiAmount > 0) 84 | ixs.push(createTransferCheckedInstruction(tokenAccount, accounts[j].accountInfo.mint, baseAta, kp.publicKey, BigInt(tokenBalanceAfterSell.amount), tokenBalance.decimals)) 85 | ixs.push(createCloseAccountInstruction(tokenAccount, mainKp.publicKey, kp.publicKey)) 86 | } 87 | 88 | if (accountInfo) { 89 | const solBal = await connection.getBalance(kp.publicKey) 90 | ixs.push( 91 | SystemProgram.transfer({ 92 | fromPubkey: kp.publicKey, 93 | toPubkey: mainKp.publicKey, 94 | lamports: solBal 95 | }) 96 | ) 97 | } 98 | 99 | if (ixs.length) { 100 | const tx = new Transaction().add( 101 | ComputeBudgetProgram.setComputeUnitLimit({ units: 350_000 }), 102 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: Math.floor((PRIORITY_FEE * 10 ** 9) / 350_000 * 10 ** 6) }), 103 | ...ixs, 104 | ) 105 | tx.feePayer = mainKp.publicKey 106 | tx.recentBlockhash = (await connection.getLatestBlockhash()).blockhash 107 | // console.log(await connection.simulateTransaction(tx)) 108 | const sig = await sendAndConfirmTransaction(connection, tx, [mainKp, kp], { commitment: "confirmed" }) 109 | console.log(`Closed and gathered SOL from bundler wallets ${i} : https://solscan.io/tx/${sig}`) 110 | historyLog(`Closed and gathered SOL from bundler wallets ${i} : https://solscan.io/tx/${sig}`) 111 | return 112 | } 113 | } catch (error) { 114 | console.log("transaction error while gathering", error) 115 | return 116 | } 117 | }) 118 | 119 | } 120 | 121 | export const gather_wallet = async () => { 122 | await exec() 123 | await sleep(5000) 124 | console.log("Gathering sol from bundler wallet completed!") 125 | historyLog("Gathering sol from bundler wallet completed!") 126 | mainMenuWaiting() 127 | } -------------------------------------------------------------------------------- /utils/utils.ts: -------------------------------------------------------------------------------- 1 | import dotenv from 'dotenv'; 2 | import fs from 'fs'; 3 | import path from 'path'; 4 | import { rl } from "../menu/menu" 5 | import { init } from ".." 6 | 7 | dotenv.config(); 8 | 9 | export function generateDistribution( 10 | totalValue: number, 11 | minValue: number, 12 | maxValue: number, 13 | num: number, 14 | mode: string, 15 | ): number[] { 16 | if (mode == "even") { 17 | let element = totalValue / num; 18 | let array: number[] = []; 19 | for (let i = 0; i < num; i++) 20 | array.push(element); 21 | return array 22 | } 23 | // Early checks for impossible scenarios 24 | if (num * minValue > totalValue || num * maxValue < totalValue) { 25 | console.log("🚀 ~ totalValue:", totalValue) 26 | console.log("🚀 ~ maxValue:", maxValue) 27 | console.log("🚀 ~ minValue:", minValue) 28 | console.log("🚀 ~ num:", num) 29 | throw new Error('Impossible to satisfy the constraints with the given values.'); 30 | } 31 | if (minValue <= 0.003) { 32 | console.log("MIN_AMOUNT must be bigger than 0.003") 33 | return [] 34 | } 35 | // Start with an evenly distributed array 36 | let distribution: number[] = new Array(num).fill(minValue); 37 | let currentTotal: number = minValue * num; 38 | // Randomly add to each to reach totalValue 39 | // ensuring values stay within minValue and maxValue 40 | for (let i = 0; currentTotal < totalValue && i < 10000; i++) { 41 | for (let j = 0; j < num; j++) { 42 | // Calculate remaining space to ensure constraints are not broken 43 | const spaceLeft = Math.min(totalValue - currentTotal, maxValue - distribution[j]); 44 | if (spaceLeft <= 0) continue; 45 | // Randomly decide how much to add within the space left 46 | const addValue = Math.floor(Math.random() * (spaceLeft + 1)); 47 | distribution[j] += addValue; 48 | currentTotal += addValue; 49 | // Break early if the target is reached 50 | if (currentTotal === totalValue) break; 51 | } 52 | } 53 | // In cases where distribution cannot reach totalValue due to rounding, adjust the last element 54 | // This is safe due to the initial constraints check ensuring a solution exists 55 | if (currentTotal !== totalValue) { 56 | const difference = totalValue - currentTotal; 57 | for (let i = distribution.length - 1; i >= 0; i--) { 58 | const potentialValue = distribution[i] + difference; 59 | if (potentialValue <= maxValue) { 60 | distribution[i] += difference; 61 | break; 62 | } 63 | } 64 | 65 | } 66 | return distribution; 67 | } 68 | export const retrieveEnvVariable = (variableName: string) => { 69 | const variable = process.env[variableName] || ''; 70 | if (!variable) { 71 | console.log(`${variableName} is not set`); 72 | process.exit(1); 73 | } 74 | return variable; 75 | }; 76 | 77 | // Define the type for the JSON file content 78 | 79 | export const randVal = (min: number, max: number, count: number, total: number, isEven: boolean): number[] => { 80 | 81 | const arr: number[] = Array(count).fill(total / count); 82 | if (isEven) return arr 83 | 84 | if (max * count < total) 85 | throw new Error("Invalid input: max * count must be greater than or equal to total.") 86 | if (min * count > total) 87 | throw new Error("Invalid input: min * count must be less than or equal to total.") 88 | const average = total / count 89 | // Randomize pairs of elements 90 | for (let i = 0; i < count; i += 2) { 91 | // Generate a random adjustment within the range 92 | const adjustment = Math.random() * Math.min(max - average, average - min) 93 | // Add adjustment to one element and subtract from the other 94 | arr[i] += adjustment 95 | arr[i + 1] -= adjustment 96 | } 97 | // if (count % 2) arr.pop() 98 | return arr; 99 | } 100 | 101 | 102 | // export const saveDataToFile = (newData: string[], filePath: string = "data.json") => { 103 | // try { 104 | // let existingData: string[] = []; 105 | 106 | // // Check if the file exists 107 | // if (fs.existsSync(filePath)) { 108 | // // If the file exists, read its content 109 | // const fileContent = fs.readFileSync(filePath, 'utf-8'); 110 | // existingData = JSON.parse(fileContent); 111 | // } 112 | 113 | // // Add the new data to the existing array 114 | // existingData.push(...newData); 115 | 116 | // // Write the updated data back to the file 117 | // fs.writeFileSync(filePath, JSON.stringify(existingData, null, 2)); 118 | 119 | // } catch (error) { 120 | // try { 121 | // if (fs.existsSync(filePath)) { 122 | // fs.unlinkSync(filePath); 123 | // console.log(`File ${filePath} deleted and create new file.`); 124 | // } 125 | // fs.writeFileSync(filePath, JSON.stringify(newData, null, 2)); 126 | // console.log("File is saved successfully.") 127 | // } catch (error) { 128 | // console.log('Error saving data to JSON file:', error); 129 | // } 130 | // } 131 | // }; 132 | 133 | 134 | export const saveDataToFile = (newData: string[], fileName: string = "data.json") => { 135 | const folderPath = 'keys'; 136 | const filePath = path.join(folderPath, fileName); 137 | 138 | try { 139 | // Create the folder if it doesn't exist 140 | if (!fs.existsSync(folderPath)) { 141 | fs.mkdirSync(folderPath, { recursive: true }); 142 | } 143 | 144 | let existingData: string[] = []; 145 | 146 | // Check if the file exists 147 | if (fs.existsSync(filePath)) { 148 | // If the file exists, read its content 149 | const fileContent = fs.readFileSync(filePath, 'utf-8'); 150 | existingData = JSON.parse(fileContent); 151 | } 152 | 153 | // Add the new data to the existing array 154 | existingData.push(...newData); 155 | 156 | // Write the updated data back to the file 157 | fs.writeFileSync(filePath, JSON.stringify(existingData, null, 2)); 158 | 159 | console.log("File is saved successfully."); 160 | 161 | } catch (error) { 162 | try { 163 | if (fs.existsSync(filePath)) { 164 | fs.unlinkSync(filePath); 165 | console.log(`File ${filePath} deleted and will be recreated.`); 166 | } 167 | fs.writeFileSync(filePath, JSON.stringify(newData, null, 2)); 168 | console.log("File is saved successfully."); 169 | } catch (error) { 170 | console.log('Error saving data to JSON file:', error); 171 | } 172 | } 173 | }; 174 | 175 | 176 | export const sleep = async (ms: number) => { 177 | await new Promise((resolve) => setTimeout(resolve, ms)) 178 | } 179 | 180 | // // Function to read JSON file 181 | // export function readJson(filename: string = "data.json"): string[] { 182 | // if (!fs.existsSync(filename)) { 183 | // // If the file does not exist, create an empty array 184 | // fs.writeFileSync(filename, '[]', 'utf-8'); 185 | // } 186 | // const data = fs.readFileSync(filename, 'utf-8'); 187 | // return JSON.parse(data) as string[]; 188 | // } 189 | 190 | // Function to read JSON file from the "keys" folder 191 | export function readJson(fileName: string = "data.json"): string[] { 192 | const folderPath = 'keys'; 193 | const filePath = path.join(folderPath, fileName); 194 | 195 | if (!fs.existsSync(filePath)) { 196 | // If the file does not exist, create an empty array file in the "keys" folder 197 | fs.writeFileSync(filePath, '[]', 'utf-8'); 198 | } 199 | 200 | const data = fs.readFileSync(filePath, 'utf-8'); 201 | return JSON.parse(data) as string[]; 202 | } 203 | 204 | export function deleteConsoleLines(numLines: number) { 205 | for (let i = 0; i < numLines; i++) { 206 | process.stdout.moveCursor(0, -1); // Move cursor up one line 207 | process.stdout.clearLine(-1); // Clear the line 208 | } 209 | } 210 | 211 | export const mainMenuWaiting = () => { 212 | rl.question('press Enter key to continue', (answer: string) => { 213 | init() 214 | }) 215 | } 216 | -------------------------------------------------------------------------------- /createBuy.ts: -------------------------------------------------------------------------------- 1 | import { VersionedTransaction, Keypair, SystemProgram, Transaction, Connection, ComputeBudgetProgram, TransactionInstruction, TransactionMessage, AddressLookupTableProgram, PublicKey, SYSVAR_RENT_PUBKEY } from "@solana/web3.js" 2 | import { ASSOCIATED_TOKEN_PROGRAM_ID, getAssociatedTokenAddressSync, NATIVE_MINT, TOKEN_PROGRAM_ID } from "@solana/spl-token"; 3 | import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; 4 | import { AnchorProvider } from "@coral-xyz/anchor"; 5 | import { openAsBlob, readFileSync, writeFileSync } from "fs"; 6 | import base58 from "bs58" 7 | 8 | import { DESCRIPTION, DISTRIBUTION_WALLETNUM, FILE, global_mint, JITO_FEE, MAX_AMOUNT, MIN_AMOUNT, MINT_AMOUNT, MINT_WALLET_PRIVATE, PRIORITY_FEE, PRIVATE_KEY, PUMP_PROGRAM, RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT, TELEGRAM, TOKEN_CREATE_ON, TOKEN_NAME, TOKEN_SHOW_NAME, TOKEN_SYMBOL, TOTAL_DISTRIBUTE_AMOUNT, TWITTER, WEBSITE } from "./constants" 9 | import { generateDistribution, historyLog, mainMenuWaiting, randVal, saveDataToFile, sleep } from "./utils" 10 | import { createAndSendV0Tx, execute } from "./executor/legacy" 11 | import { BONDING_CURVE_SEED, PumpFunSDK } from "./src/pumpfun"; 12 | import { executeJitoTx } from "./executor/jito"; 13 | import { readFile } from "fs/promises"; 14 | import { rl } from "./menu/menu"; 15 | import { solanaConnection } from "./gather"; 16 | import { connect } from "http2"; 17 | 18 | const commitment = "confirmed" 19 | 20 | const connection = new Connection(RPC_ENDPOINT, { 21 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, commitment 22 | }) 23 | const mainKp = Keypair.fromSecretKey(base58.decode(PRIVATE_KEY)) 24 | 25 | let kps: Keypair[] = [] 26 | const transactions: VersionedTransaction[] = [] 27 | const mintKp = Keypair.generate() 28 | const mintWalletKp = Keypair.fromSecretKey(base58.decode(MINT_WALLET_PRIVATE)) 29 | const mintAddress = mintKp.publicKey 30 | 31 | 32 | 33 | let sdk = new PumpFunSDK(new AnchorProvider(connection, new NodeWallet(new Keypair()), { commitment })); 34 | 35 | const exec = async () => { 36 | console.log(Math.floor((PRIORITY_FEE * 10 ** 9) / 1_000_000 * 10 ** 6)); 37 | 38 | 39 | console.log(await connection.getBalance(mainKp.publicKey) / 10 ** 9, "SOL in main Wallet") 40 | historyLog(`${await connection.getBalance(mainKp.publicKey) / 10 ** 9} Sol in Main Wallet`) 41 | 42 | writeFileSync("keys/mint.json", "") 43 | saveDataToFile([base58.encode(mintKp.secretKey)], "mint.json") 44 | 45 | 46 | console.log("\nDistributing SOL to wallets...") 47 | historyLog("Distributing SOL to wallets...") 48 | console.log(`Mint wallet address: ${mintWalletKp.publicKey.toString()}`) 49 | historyLog(`Mint wallet address: ${mintWalletKp.publicKey.toString()} \n`) 50 | const resDistribute = await distributeSol(connection, mainKp, DISTRIBUTION_WALLETNUM) 51 | if (resDistribute == null) { 52 | console.log("failed to distribute to fund wallets") 53 | historyLog("failed to distribute to fund wallets") 54 | return 55 | } 56 | console.log("\nCreating LUT started") 57 | historyLog("\nCreating LUT started") 58 | 59 | const lutAddress = await createLUT() 60 | // const lutAddress = new PublicKey("FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc"); 61 | if (!lutAddress) { 62 | console.log("Lut creation failed") 63 | historyLog("Lut createion failed") 64 | return 65 | } 66 | writeFileSync("keys/lut.json", JSON.stringify(lutAddress)) 67 | console.log("LUT Address:", lutAddress.toBase58()) 68 | historyLog(`LUT Address: ${lutAddress.toBase58()} \n`) 69 | await addAddressesToTable(lutAddress, mintAddress, kps) 70 | 71 | const buyIxs: TransactionInstruction[] = [] 72 | 73 | for (let i = 0; i < DISTRIBUTION_WALLETNUM; i++) { 74 | const amount = await connection.getBalance(kps[i].publicKey) 75 | const ix = await makeBuyIx(kps[i], Math.floor((amount - 3000000) * 0.99), i) 76 | buyIxs.push(...ix) 77 | } 78 | 79 | const lookupTable = (await connection.getAddressLookupTable(lutAddress)).value; 80 | if (!lookupTable) { 81 | console.log("Lookup table not ready") 82 | return 83 | } 84 | const latestBlockhash = await connection.getLatestBlockhash() 85 | const tokenCreationIxs = await createTokenTx() 86 | 87 | // Token creation part is missing 88 | 89 | tokenCreationTx.sign([mintWalletKp, mintKp]) 90 | 91 | transactions.push(tokenCreationTx) 92 | for (let i = 0; i < Math.ceil(DISTRIBUTION_WALLETNUM / 5); i++) { 93 | const latestBlockhash = await connection.getLatestBlockhash() 94 | const instructions: TransactionInstruction[] = [] 95 | 96 | // Buy transaction part is missing 97 | 98 | } 99 | 100 | transactions.map(async (tx, i) => console.log(i, " | ", tx.serialize().length, "bytes | \n", (await connection.simulateTransaction(tx, { sigVerify: true })))) 101 | 102 | const res = await executeJitoTx(transactions, mainKp, commitment) 103 | 104 | await sleep(5000) 105 | if (res) { 106 | const result = await solanaConnection.getAccountInfo(mintAddress); 107 | console.log(`New Mint Address: https://solscan.io/account/${mintAddress.toString()}`) 108 | console.log(`jito signature: https://explorer.jito.wtf/bundle/${res}`) 109 | historyLog(`New Mint Address: https://solscan.io/account/${mintAddress.toString()}`) 110 | historyLog(`Create token and Buy jito signature: https://explorer.jito.wtf/bundle/${res}`) 111 | } 112 | 113 | } 114 | 115 | const distributeSol = async (connection: Connection, mainKp: Keypair, distritbutionNum: number) => { 116 | try { 117 | const sendSolTx: TransactionInstruction[] = [] 118 | sendSolTx.push( 119 | ComputeBudgetProgram.setComputeUnitLimit({ units: 1_000_000 }), 120 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: Math.floor((PRIORITY_FEE * 10 ** 9) / 1_000_000 * 10 ** 6) }) 121 | ) 122 | const mainSolBal = await connection.getBalance(mainKp.publicKey) 123 | 124 | if (mainSolBal <= (TOTAL_DISTRIBUTE_AMOUNT + JITO_FEE * 2 + 0.003) * 10 ** 9) { 125 | console.log("Main wallet balance is not enough") 126 | historyLog("Main wallet balance is not enough") 127 | return null 128 | } 129 | const mintWalletSolBal = await connection.getBalance(mintWalletKp.publicKey) 130 | if (mintWalletSolBal <= 0.0023) { 131 | console.log("Mint Wallet balance is not enough") 132 | historyLog("Mint Wallet balance is not enough") 133 | return null 134 | } 135 | const amountArray = generateDistribution(TOTAL_DISTRIBUTE_AMOUNT * 1000, MIN_AMOUNT * 1000, MAX_AMOUNT * 1000, DISTRIBUTION_WALLETNUM, "odd") 136 | if (!amountArray) { 137 | return null 138 | } 139 | 140 | for (let i = 0; i < distritbutionNum; i++) { 141 | const solAmount = Math.floor(amountArray[i] / 1000 * 10 ** 9) 142 | 143 | const wallet = Keypair.generate() 144 | kps.push(wallet) 145 | 146 | sendSolTx.push( 147 | SystemProgram.transfer({ 148 | fromPubkey: mainKp.publicKey, 149 | toPubkey: wallet.publicKey, 150 | lamports: solAmount 151 | }) 152 | ) 153 | console.log(wallet.publicKey.toString(), "has", (amountArray[i] / 1000).toString(), "sol") 154 | historyLog(`${wallet.publicKey.toString()} has ${(amountArray[i] / 1000).toString()} sol`) 155 | } 156 | 157 | try { 158 | writeFileSync("keys/data.json", JSON.stringify("")) 159 | saveDataToFile(kps.map(kp => base58.encode(kp.secretKey))) 160 | } 161 | catch (error) { 162 | 163 | } 164 | 165 | let index = 0 166 | while (true) { 167 | try { 168 | if (index > 5) { 169 | console.log("Error in distribution") 170 | return null 171 | } 172 | const siTx = new Transaction().add(...sendSolTx) 173 | const latestBlockhash = await connection.getLatestBlockhash() 174 | siTx.feePayer = mainKp.publicKey 175 | siTx.recentBlockhash = latestBlockhash.blockhash 176 | const messageV0 = new TransactionMessage({ 177 | payerKey: mainKp.publicKey, 178 | recentBlockhash: latestBlockhash.blockhash, 179 | instructions: sendSolTx, 180 | }).compileToV0Message() 181 | const transaction = new VersionedTransaction(messageV0) 182 | transaction.sign([mainKp]) 183 | let txSig = await execute(transaction, latestBlockhash, 1) 184 | 185 | if (txSig) { 186 | const distibuteTx = txSig ? `https://solscan.io/tx/${txSig}` : '' 187 | console.log("SOL for Fund wallet is distributed ", distibuteTx) 188 | break 189 | } 190 | index++ 191 | } catch (error) { 192 | index++ 193 | } 194 | } 195 | 196 | console.log("Success in distribution") 197 | historyLog("Success in distribution") 198 | return kps 199 | } catch (error) { 200 | console.log(`Failed to transfer SOL`, error) 201 | return null 202 | } 203 | } 204 | 205 | // create token instructions 206 | 207 | // make buy instructions 208 | 209 | const createLUT = async () => { 210 | let i = 0 211 | while (true) { 212 | if (i > 5) { 213 | console.log("LUT creation failed, Exiting...") 214 | historyLog("LUT creation failed, Exiting...") 215 | return 216 | } 217 | try { 218 | const [lookupTableInst, lookupTableAddress] = 219 | AddressLookupTableProgram.createLookupTable({ 220 | authority: mainKp.publicKey, 221 | payer: mainKp.publicKey, 222 | recentSlot: await connection.getSlot(), 223 | }); 224 | 225 | // Step 3 - Generate a create transaction and send it to the network 226 | const result = await createAndSendV0Tx([ 227 | ComputeBudgetProgram.setComputeUnitLimit({ units: 60_000 }), 228 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: Math.floor((PRIORITY_FEE * 10 ** 9) / 60_000 * 10 ** 6) }), 229 | lookupTableInst 230 | ], mainKp, connection); 231 | 232 | if (!result) 233 | throw new Error("Lut creation error") 234 | 235 | console.log("Lookup Table Address created successfully!") 236 | historyLog("Lookup Table Address created successfully!") 237 | await sleep(10000) 238 | 239 | return lookupTableAddress 240 | } catch (err) { 241 | console.log("Error in creating Lookuptable. Retrying.") 242 | historyLog("Error in creating Lookuptable. Retrying.") 243 | i++ 244 | } 245 | } 246 | } 247 | 248 | // extending lookupTable part is missing 249 | 250 | export const create_Buy = async () => { 251 | rl.question("\t Do you really want to create new pumpfun token and buy? [y/n]: ", async (answer: string) => { 252 | let choice = answer; 253 | console.log(choice) 254 | switch (choice) { 255 | case 'y': 256 | await exec() 257 | await sleep(5000) 258 | console.log("One token creating and buying process is ended, and go for next step!") 259 | break 260 | case 'n': 261 | break 262 | default: 263 | break 264 | } 265 | mainMenuWaiting() 266 | }) 267 | } 268 | 269 | 270 | 271 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Commitment, 3 | ComputeBudgetProgram, 4 | Connection, 5 | Finality, 6 | Keypair, 7 | PublicKey, 8 | SendTransactionError, 9 | Transaction, 10 | TransactionMessage, 11 | VersionedTransaction, 12 | VersionedTransactionResponse, 13 | LAMPORTS_PER_SOL, 14 | TransactionInstruction, 15 | sendAndConfirmTransaction, 16 | } from "@solana/web3.js"; 17 | import { PriorityFee, TransactionResult } from "./types"; 18 | import fs from "fs" 19 | import bs58 from "bs58"; 20 | import { createAssociatedTokenAccountInstruction, createTransferCheckedInstruction, getAssociatedTokenAddress, getAssociatedTokenAddressSync } from "@solana/spl-token"; 21 | import { sha256 } from "js-sha256"; 22 | import { RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "../constants"; 23 | 24 | 25 | const commitment = "confirmed" 26 | 27 | const connection = new Connection(RPC_ENDPOINT, { 28 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, commitment 29 | }) 30 | 31 | export const DEFAULT_COMMITMENT: Commitment = "finalized"; 32 | export const DEFAULT_FINALITY: Finality = "finalized"; 33 | 34 | export const sleep = async (ms: number) => { 35 | await new Promise((resolve) => setTimeout(resolve, ms)) 36 | } 37 | 38 | export const calculateWithSlippageBuy = ( 39 | amount: bigint, 40 | basisPoints: bigint 41 | ) => { 42 | return amount + (amount * basisPoints) / BigInt(1000); 43 | }; 44 | 45 | export const calculateWithSlippageSell = ( 46 | amount: bigint, 47 | basisPoints: bigint 48 | ) => { 49 | return amount - (amount * basisPoints) / BigInt(1000); 50 | }; 51 | 52 | export async function sendTx( 53 | connection: Connection, 54 | tx: Transaction, 55 | payer: PublicKey, 56 | signers: Keypair[], 57 | priorityFees?: PriorityFee, 58 | commitment: Commitment = DEFAULT_COMMITMENT, 59 | finality: Finality = DEFAULT_FINALITY 60 | ): Promise { 61 | 62 | let newTx = new Transaction(); 63 | 64 | if (priorityFees) { 65 | const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({ 66 | units: priorityFees.unitLimit, 67 | }); 68 | 69 | const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({ 70 | microLamports: priorityFees.unitPrice, 71 | }); 72 | newTx.add(modifyComputeUnits); 73 | newTx.add(addPriorityFee); 74 | } 75 | newTx.add(tx); 76 | let versionedTx = await buildVersionedTx(connection, payer, newTx, commitment); 77 | versionedTx.sign(signers); 78 | try { 79 | console.log((await connection.simulateTransaction(versionedTx, undefined))) 80 | 81 | const sig = await connection.sendTransaction(versionedTx, { 82 | skipPreflight: false, 83 | }); 84 | console.log("Transaction signature: ", `https://solscan.io/tx/${sig}`); 85 | 86 | let txResult = await getTxDetails(connection, sig, commitment, finality); 87 | if (!txResult) { 88 | return { 89 | success: false, 90 | error: "Transaction failed", 91 | }; 92 | } 93 | return { 94 | success: true, 95 | signature: sig, 96 | results: txResult, 97 | }; 98 | } catch (e) { 99 | if (e instanceof SendTransactionError) { 100 | let ste = e as SendTransactionError; 101 | } else { 102 | console.error(e); 103 | } 104 | return { 105 | error: e, 106 | success: false, 107 | }; 108 | } 109 | } 110 | 111 | export async function buildTx( 112 | connection: Connection, 113 | tx: Transaction, 114 | payer: PublicKey, 115 | signers: Keypair[], 116 | priorityFees?: PriorityFee, 117 | commitment: Commitment = DEFAULT_COMMITMENT, 118 | finality: Finality = DEFAULT_FINALITY 119 | ): Promise { 120 | let newTx = new Transaction(); 121 | 122 | if (priorityFees) { 123 | const modifyComputeUnits = ComputeBudgetProgram.setComputeUnitLimit({ 124 | units: priorityFees.unitLimit, 125 | }); 126 | 127 | const addPriorityFee = ComputeBudgetProgram.setComputeUnitPrice({ 128 | microLamports: priorityFees.unitPrice, 129 | }); 130 | newTx.add(modifyComputeUnits); 131 | newTx.add(addPriorityFee); 132 | } 133 | newTx.add(tx); 134 | let versionedTx = await buildVersionedTx(connection, payer, newTx, commitment); 135 | versionedTx.sign(signers); 136 | return versionedTx; 137 | } 138 | 139 | export const buildVersionedTx = async ( 140 | connection: Connection, 141 | payer: PublicKey, 142 | tx: Transaction, 143 | commitment: Commitment = DEFAULT_COMMITMENT 144 | ): Promise => { 145 | const blockHash = (await connection.getLatestBlockhash(commitment)) 146 | .blockhash; 147 | 148 | let messageV0 = new TransactionMessage({ 149 | payerKey: payer, 150 | recentBlockhash: blockHash, 151 | instructions: tx.instructions, 152 | }).compileToV0Message(); 153 | 154 | return new VersionedTransaction(messageV0); 155 | }; 156 | 157 | export const getTxDetails = async ( 158 | connection: Connection, 159 | sig: string, 160 | commitment: Commitment = DEFAULT_COMMITMENT, 161 | finality: Finality = DEFAULT_FINALITY 162 | ): Promise => { 163 | const latestBlockHash = await connection.getLatestBlockhash(); 164 | await connection.confirmTransaction( 165 | { 166 | blockhash: latestBlockHash.blockhash, 167 | lastValidBlockHeight: latestBlockHash.lastValidBlockHeight, 168 | signature: sig, 169 | }, 170 | commitment 171 | ); 172 | 173 | return connection.getTransaction(sig, { 174 | maxSupportedTransactionVersion: 0, 175 | commitment: finality, 176 | }); 177 | }; 178 | 179 | export const getRandomInt = (min: number, max: number): number => { 180 | min = Math.ceil(min); 181 | max = Math.floor(max); 182 | return Math.floor(Math.random() * (max - min + 1)) + min; // The maximum is inclusive, the minimum is inclusive 183 | } 184 | 185 | export const readBuyerWallet = (fileName: string) => { 186 | const filePath = `.keys/${fileName}.txt` 187 | try { 188 | // Check if the file exists 189 | if (fs.existsSync(filePath)) { 190 | // Read the file content 191 | const publicKey = fs.readFileSync(filePath, 'utf-8'); 192 | return publicKey.trim(); // Remove any surrounding whitespace or newlines 193 | } else { 194 | console.log(`File ${filePath} does not exist.`); 195 | return null; // Return null if the file does not exist 196 | } 197 | } catch (error) { 198 | console.log('Error reading public key from file:', error); 199 | return null; // Return null in case of error 200 | } 201 | }; 202 | 203 | export const retrieveEnvVariable = (variableName: string) => { 204 | const variable = process.env[variableName] || '' 205 | if (!variable) { 206 | console.log(`${variableName} is not set`) 207 | process.exit(1) 208 | } 209 | return variable 210 | } 211 | 212 | export function getOrCreateKeypair(dir: string, keyName: string): Keypair { 213 | if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true }); 214 | const authorityKey = dir + "/" + keyName + ".json"; 215 | if (fs.existsSync(authorityKey)) { 216 | const data: { 217 | secretKey: string; 218 | publicKey: string; 219 | } = JSON.parse(fs.readFileSync(authorityKey, "utf-8")); 220 | return Keypair.fromSecretKey(bs58.decode(data.secretKey)); 221 | } else { 222 | const keypair = Keypair.generate(); 223 | keypair.secretKey; 224 | fs.writeFileSync( 225 | authorityKey, 226 | JSON.stringify({ 227 | secretKey: bs58.encode(keypair.secretKey), 228 | publicKey: keypair.publicKey.toBase58(), 229 | }) 230 | ); 231 | return keypair; 232 | } 233 | } 234 | 235 | export const printSOLBalance = async ( 236 | connection: Connection, 237 | pubKey: PublicKey, 238 | info: string = "" 239 | ) => { 240 | const balance = await connection.getBalance(pubKey); 241 | console.log( 242 | `${info ? info + " " : ""}${pubKey.toBase58()}:`, 243 | balance / LAMPORTS_PER_SOL, 244 | `SOL` 245 | ); 246 | }; 247 | 248 | export const getSPLBalance = async ( 249 | connection: Connection, 250 | mintAddress: PublicKey, 251 | pubKey: PublicKey, 252 | allowOffCurve: boolean = false 253 | ) => { 254 | try { 255 | let ata = getAssociatedTokenAddressSync(mintAddress, pubKey, allowOffCurve); 256 | const balance = await connection.getTokenAccountBalance(ata, "processed"); 257 | return balance.value.uiAmount; 258 | } catch (e) { } 259 | return null; 260 | }; 261 | 262 | export const printSPLBalance = async ( 263 | connection: Connection, 264 | mintAddress: PublicKey, 265 | user: PublicKey, 266 | info: string = "" 267 | ) => { 268 | const balance = await getSPLBalance(connection, mintAddress, user); 269 | if (balance === null) { 270 | console.log( 271 | `${info ? info + " " : ""}${user.toBase58()}:`, 272 | "No Account Found" 273 | ); 274 | } else { 275 | console.log(`${info ? info + " " : ""}${user.toBase58()}:`, balance); 276 | } 277 | }; 278 | 279 | export const baseToValue = (base: number, decimals: number): number => { 280 | return base * Math.pow(10, decimals); 281 | }; 282 | 283 | export const valueToBase = (value: number, decimals: number): number => { 284 | return value / Math.pow(10, decimals); 285 | }; 286 | 287 | //i.e. account:BondingCurve 288 | export function getDiscriminator(name: string) { 289 | return sha256.digest(name).slice(0, 8); 290 | } 291 | 292 | // Define the type for the JSON file content 293 | export interface Data { 294 | privateKey: string; 295 | pubkey: string; 296 | } 297 | 298 | interface Blockhash { 299 | blockhash: string; 300 | lastValidBlockHeight: number; 301 | } 302 | 303 | export const execute = async (transaction: VersionedTransaction, latestBlockhash: Blockhash, isBuy: boolean | 1 = true) => { 304 | 305 | const signature = await connection.sendRawTransaction(transaction.serialize(), { skipPreflight: true }) 306 | const confirmation = await connection.confirmTransaction( 307 | { 308 | signature, 309 | lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, 310 | blockhash: latestBlockhash.blockhash, 311 | } 312 | ); 313 | 314 | if (confirmation.value.err) { 315 | console.log("Confirmation error") 316 | return "" 317 | } else { 318 | if (isBuy === 1) { 319 | return signature 320 | } else if (isBuy) 321 | console.log(`Success in buy transaction: https://solscan.io/tx/${signature}`) 322 | else 323 | console.log(`Success in Sell transaction: https://solscan.io/tx/${signature}`) 324 | } 325 | return signature 326 | } 327 | 328 | export const saveHolderWalletsToFile = (newData: Data[], filePath: string = ".keys/holderWallets.json") => { 329 | try { 330 | let existingData: Data[] = []; 331 | 332 | // Check if the file exists 333 | if (fs.existsSync(filePath)) { 334 | // If the file exists, read its content 335 | const fileContent = fs.readFileSync(filePath, 'utf-8'); 336 | existingData = JSON.parse(fileContent); 337 | } 338 | 339 | // Add the new data to the existing array 340 | existingData.push(...newData); 341 | 342 | // Write the updated data back to the file 343 | fs.writeFileSync(filePath, JSON.stringify(existingData, null, 2)); 344 | 345 | } catch (error) { 346 | try { 347 | if (fs.existsSync(filePath)) { 348 | fs.unlinkSync(filePath); 349 | console.log(`File ${filePath} deleted and create new file.`); 350 | } 351 | fs.writeFileSync(filePath, JSON.stringify(newData, null, 2)); 352 | console.log("File is saved successfully.") 353 | } catch (error) { 354 | console.log('Error saving data to JSON file:', error); 355 | } 356 | } 357 | }; 358 | 359 | export async function newSendToken( 360 | walletKeypairs: Keypair[], tokensToSendArr: number[], walletKeypair: Keypair, mintAddress: PublicKey, tokenDecimal: number 361 | ) { 362 | try { 363 | const srcAta = await getAssociatedTokenAddress(mintAddress, walletKeypair.publicKey) 364 | if (tokensToSendArr.length !== walletKeypairs.length) { 365 | console.log("Number of wallets and token amounts array is not matching") 366 | throw new Error("Number of wallets and token amounts array is not matching") 367 | } 368 | 369 | console.log("Token amount of the srcAta: ", (await connection.getTokenAccountBalance(srcAta)).value.amount) 370 | 371 | const insts: TransactionInstruction[] = [] 372 | console.log("Wallet length to distribute: ", walletKeypairs.length) 373 | for (let i = 0; i < walletKeypairs.length; i++) { 374 | const destKp = walletKeypairs[i] 375 | const amount = tokensToSendArr[i] 376 | console.log("token amount ", amount) 377 | 378 | const baseAta = await getAssociatedTokenAddress(mintAddress, destKp.publicKey) 379 | if (!await connection.getAccountInfo(baseAta)) { 380 | insts.push( 381 | createAssociatedTokenAccountInstruction( 382 | walletKeypair.publicKey, 383 | baseAta, 384 | destKp.publicKey, 385 | mintAddress 386 | ) 387 | ) 388 | } 389 | 390 | insts.push( 391 | createTransferCheckedInstruction( 392 | srcAta, 393 | mintAddress, 394 | baseAta, 395 | walletKeypair.publicKey, 396 | Math.floor(amount * 10 ** tokenDecimal), 397 | tokenDecimal 398 | ) 399 | ) 400 | } 401 | 402 | console.log("total number of instructions : ", insts.length) 403 | const txs = await makeTxs(insts, walletKeypair) 404 | if (!txs) { 405 | console.log("Transaction not retrieved from makeTxs function") 406 | throw new Error("Transaction not retrieved from makeTxs function") 407 | } 408 | try { 409 | await Promise.all(txs.map(async (transaction, i) => { 410 | await sleep(i * 200) 411 | // Assuming you have a function to send a transaction 412 | return handleTxs(transaction, walletKeypair) 413 | })); 414 | 415 | } catch (error) { 416 | console.log("Error in transaction confirmation part : ", error) 417 | } 418 | } catch (error) { 419 | console.log("New Send Token function error : ", error) 420 | } 421 | } 422 | 423 | const makeTxs = async (insts: TransactionInstruction[], mainKp: Keypair) => { 424 | try { 425 | 426 | const batchNum = 12 427 | const txNum = Math.ceil(insts.length / batchNum) 428 | const txs: Transaction[] = [] 429 | for (let i = 0; i < txNum; i++) { 430 | const upperIndex = batchNum * (i + 1) 431 | const downIndex = batchNum * i 432 | const tx = new Transaction().add( 433 | ComputeBudgetProgram.setComputeUnitLimit({ units: 200_000 }), 434 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 100_000 }) 435 | ) 436 | 437 | for (let j = downIndex; j < upperIndex; j++) 438 | if (insts[j]) 439 | tx.add(insts[j]) 440 | 441 | tx.recentBlockhash = (await connection.getLatestBlockhash("confirmed")).blockhash 442 | tx.feePayer = mainKp.publicKey 443 | console.log(await connection.simulateTransaction(tx)) 444 | 445 | txs.push(tx) 446 | } 447 | if (txs.length == 0) { 448 | console.log("Empty instructions as input") 449 | throw new Error("Empty instructions as input") 450 | } 451 | return txs 452 | } catch (error) { 453 | console.log("MakeTxs ~ error") 454 | } 455 | 456 | } 457 | 458 | const handleTxs = async (transaction: Transaction, mainKp: Keypair) => { 459 | const sig = await sendAndConfirmTransaction(connection, transaction, [mainKp], { skipPreflight: true }) 460 | console.log(`https://solscan.io/tx/${sig}`); 461 | } -------------------------------------------------------------------------------- /pumpfun-IDL.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "pump", 4 | "instructions": [ 5 | { 6 | "name": "initialize", 7 | "docs": ["Creates the global state."], 8 | "accounts": [ 9 | { 10 | "name": "global", 11 | "isMut": true, 12 | "isSigner": false 13 | }, 14 | { 15 | "name": "user", 16 | "isMut": true, 17 | "isSigner": true 18 | }, 19 | { 20 | "name": "systemProgram", 21 | "isMut": false, 22 | "isSigner": false 23 | } 24 | ], 25 | "args": [] 26 | }, 27 | { 28 | "name": "setParams", 29 | "docs": ["Sets the global state parameters."], 30 | "accounts": [ 31 | { 32 | "name": "global", 33 | "isMut": true, 34 | "isSigner": false 35 | }, 36 | { 37 | "name": "user", 38 | "isMut": true, 39 | "isSigner": true 40 | }, 41 | { 42 | "name": "systemProgram", 43 | "isMut": false, 44 | "isSigner": false 45 | }, 46 | { 47 | "name": "eventAuthority", 48 | "isMut": false, 49 | "isSigner": false 50 | }, 51 | { 52 | "name": "program", 53 | "isMut": false, 54 | "isSigner": false 55 | } 56 | ], 57 | "args": [ 58 | { 59 | "name": "feeRecipient", 60 | "type": "publicKey" 61 | }, 62 | { 63 | "name": "initialVirtualTokenReserves", 64 | "type": "u64" 65 | }, 66 | { 67 | "name": "initialVirtualSolReserves", 68 | "type": "u64" 69 | }, 70 | { 71 | "name": "initialRealTokenReserves", 72 | "type": "u64" 73 | }, 74 | { 75 | "name": "tokenTotalSupply", 76 | "type": "u64" 77 | }, 78 | { 79 | "name": "feeBasisPoints", 80 | "type": "u64" 81 | } 82 | ] 83 | }, 84 | { 85 | "name": "create", 86 | "docs": ["Creates a new coin and bonding curve."], 87 | "accounts": [ 88 | { 89 | "name": "mint", 90 | "isMut": true, 91 | "isSigner": true 92 | }, 93 | { 94 | "name": "mintAuthority", 95 | "isMut": false, 96 | "isSigner": false 97 | }, 98 | { 99 | "name": "bondingCurve", 100 | "isMut": true, 101 | "isSigner": false 102 | }, 103 | { 104 | "name": "associatedBondingCurve", 105 | "isMut": true, 106 | "isSigner": false 107 | }, 108 | { 109 | "name": "global", 110 | "isMut": false, 111 | "isSigner": false 112 | }, 113 | { 114 | "name": "mplTokenMetadata", 115 | "isMut": false, 116 | "isSigner": false 117 | }, 118 | { 119 | "name": "metadata", 120 | "isMut": true, 121 | "isSigner": false 122 | }, 123 | { 124 | "name": "user", 125 | "isMut": true, 126 | "isSigner": true 127 | }, 128 | { 129 | "name": "systemProgram", 130 | "isMut": false, 131 | "isSigner": false 132 | }, 133 | { 134 | "name": "tokenProgram", 135 | "isMut": false, 136 | "isSigner": false 137 | }, 138 | { 139 | "name": "associatedTokenProgram", 140 | "isMut": false, 141 | "isSigner": false 142 | }, 143 | { 144 | "name": "rent", 145 | "isMut": false, 146 | "isSigner": false 147 | }, 148 | { 149 | "name": "eventAuthority", 150 | "isMut": false, 151 | "isSigner": false 152 | }, 153 | { 154 | "name": "program", 155 | "isMut": false, 156 | "isSigner": false 157 | } 158 | ], 159 | "args": [ 160 | { 161 | "name": "name", 162 | "type": "string" 163 | }, 164 | { 165 | "name": "symbol", 166 | "type": "string" 167 | }, 168 | { 169 | "name": "uri", 170 | "type": "string" 171 | } 172 | ] 173 | }, 174 | { 175 | "name": "buy", 176 | "docs": ["Buys tokens from a bonding curve."], 177 | "accounts": [ 178 | { 179 | "name": "global", 180 | "isMut": false, 181 | "isSigner": false 182 | }, 183 | { 184 | "name": "feeRecipient", 185 | "isMut": true, 186 | "isSigner": false 187 | }, 188 | { 189 | "name": "mint", 190 | "isMut": false, 191 | "isSigner": false 192 | }, 193 | { 194 | "name": "bondingCurve", 195 | "isMut": true, 196 | "isSigner": false 197 | }, 198 | { 199 | "name": "associatedBondingCurve", 200 | "isMut": true, 201 | "isSigner": false 202 | }, 203 | { 204 | "name": "associatedUser", 205 | "isMut": true, 206 | "isSigner": false 207 | }, 208 | { 209 | "name": "user", 210 | "isMut": true, 211 | "isSigner": true 212 | }, 213 | { 214 | "name": "systemProgram", 215 | "isMut": false, 216 | "isSigner": false 217 | }, 218 | { 219 | "name": "tokenProgram", 220 | "isMut": false, 221 | "isSigner": false 222 | }, 223 | { 224 | "name": "rent", 225 | "isMut": false, 226 | "isSigner": false 227 | }, 228 | { 229 | "name": "eventAuthority", 230 | "isMut": false, 231 | "isSigner": false 232 | }, 233 | { 234 | "name": "program", 235 | "isMut": false, 236 | "isSigner": false 237 | } 238 | ], 239 | "args": [ 240 | { 241 | "name": "amount", 242 | "type": "u64" 243 | }, 244 | { 245 | "name": "maxSolCost", 246 | "type": "u64" 247 | } 248 | ] 249 | }, 250 | { 251 | "name": "sell", 252 | "docs": ["Sells tokens into a bonding curve."], 253 | "accounts": [ 254 | { 255 | "name": "global", 256 | "isMut": false, 257 | "isSigner": false 258 | }, 259 | { 260 | "name": "feeRecipient", 261 | "isMut": true, 262 | "isSigner": false 263 | }, 264 | { 265 | "name": "mint", 266 | "isMut": false, 267 | "isSigner": false 268 | }, 269 | { 270 | "name": "bondingCurve", 271 | "isMut": true, 272 | "isSigner": false 273 | }, 274 | { 275 | "name": "associatedBondingCurve", 276 | "isMut": true, 277 | "isSigner": false 278 | }, 279 | { 280 | "name": "associatedUser", 281 | "isMut": true, 282 | "isSigner": false 283 | }, 284 | { 285 | "name": "user", 286 | "isMut": true, 287 | "isSigner": true 288 | }, 289 | { 290 | "name": "systemProgram", 291 | "isMut": false, 292 | "isSigner": false 293 | }, 294 | { 295 | "name": "associatedTokenProgram", 296 | "isMut": false, 297 | "isSigner": false 298 | }, 299 | { 300 | "name": "tokenProgram", 301 | "isMut": false, 302 | "isSigner": false 303 | }, 304 | { 305 | "name": "eventAuthority", 306 | "isMut": false, 307 | "isSigner": false 308 | }, 309 | { 310 | "name": "program", 311 | "isMut": false, 312 | "isSigner": false 313 | } 314 | ], 315 | "args": [ 316 | { 317 | "name": "amount", 318 | "type": "u64" 319 | }, 320 | { 321 | "name": "minSolOutput", 322 | "type": "u64" 323 | } 324 | ] 325 | }, 326 | { 327 | "name": "withdraw", 328 | "docs": [ 329 | "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" 330 | ], 331 | "accounts": [ 332 | { 333 | "name": "global", 334 | "isMut": false, 335 | "isSigner": false 336 | }, 337 | { 338 | "name": "mint", 339 | "isMut": false, 340 | "isSigner": false 341 | }, 342 | { 343 | "name": "bondingCurve", 344 | "isMut": true, 345 | "isSigner": false 346 | }, 347 | { 348 | "name": "associatedBondingCurve", 349 | "isMut": true, 350 | "isSigner": false 351 | }, 352 | { 353 | "name": "associatedUser", 354 | "isMut": true, 355 | "isSigner": false 356 | }, 357 | { 358 | "name": "user", 359 | "isMut": true, 360 | "isSigner": true 361 | }, 362 | { 363 | "name": "systemProgram", 364 | "isMut": false, 365 | "isSigner": false 366 | }, 367 | { 368 | "name": "tokenProgram", 369 | "isMut": false, 370 | "isSigner": false 371 | }, 372 | { 373 | "name": "rent", 374 | "isMut": false, 375 | "isSigner": false 376 | }, 377 | { 378 | "name": "eventAuthority", 379 | "isMut": false, 380 | "isSigner": false 381 | }, 382 | { 383 | "name": "program", 384 | "isMut": false, 385 | "isSigner": false 386 | } 387 | ], 388 | "args": [] 389 | } 390 | ], 391 | "accounts": [ 392 | { 393 | "name": "Global", 394 | "type": { 395 | "kind": "struct", 396 | "fields": [ 397 | { 398 | "name": "initialized", 399 | "type": "bool" 400 | }, 401 | { 402 | "name": "authority", 403 | "type": "publicKey" 404 | }, 405 | { 406 | "name": "feeRecipient", 407 | "type": "publicKey" 408 | }, 409 | { 410 | "name": "initialVirtualTokenReserves", 411 | "type": "u64" 412 | }, 413 | { 414 | "name": "initialVirtualSolReserves", 415 | "type": "u64" 416 | }, 417 | { 418 | "name": "initialRealTokenReserves", 419 | "type": "u64" 420 | }, 421 | { 422 | "name": "tokenTotalSupply", 423 | "type": "u64" 424 | }, 425 | { 426 | "name": "feeBasisPoints", 427 | "type": "u64" 428 | } 429 | ] 430 | } 431 | }, 432 | { 433 | "name": "BondingCurve", 434 | "type": { 435 | "kind": "struct", 436 | "fields": [ 437 | { 438 | "name": "virtualTokenReserves", 439 | "type": "u64" 440 | }, 441 | { 442 | "name": "virtualSolReserves", 443 | "type": "u64" 444 | }, 445 | { 446 | "name": "realTokenReserves", 447 | "type": "u64" 448 | }, 449 | { 450 | "name": "realSolReserves", 451 | "type": "u64" 452 | }, 453 | { 454 | "name": "tokenTotalSupply", 455 | "type": "u64" 456 | }, 457 | { 458 | "name": "complete", 459 | "type": "bool" 460 | } 461 | ] 462 | } 463 | } 464 | ], 465 | "events": [ 466 | { 467 | "name": "CreateEvent", 468 | "fields": [ 469 | { 470 | "name": "name", 471 | "type": "string", 472 | "index": false 473 | }, 474 | { 475 | "name": "symbol", 476 | "type": "string", 477 | "index": false 478 | }, 479 | { 480 | "name": "uri", 481 | "type": "string", 482 | "index": false 483 | }, 484 | { 485 | "name": "mint", 486 | "type": "publicKey", 487 | "index": false 488 | }, 489 | { 490 | "name": "bondingCurve", 491 | "type": "publicKey", 492 | "index": false 493 | }, 494 | { 495 | "name": "user", 496 | "type": "publicKey", 497 | "index": false 498 | } 499 | ] 500 | }, 501 | { 502 | "name": "TradeEvent", 503 | "fields": [ 504 | { 505 | "name": "mint", 506 | "type": "publicKey", 507 | "index": false 508 | }, 509 | { 510 | "name": "solAmount", 511 | "type": "u64", 512 | "index": false 513 | }, 514 | { 515 | "name": "tokenAmount", 516 | "type": "u64", 517 | "index": false 518 | }, 519 | { 520 | "name": "isBuy", 521 | "type": "bool", 522 | "index": false 523 | }, 524 | { 525 | "name": "user", 526 | "type": "publicKey", 527 | "index": false 528 | }, 529 | { 530 | "name": "timestamp", 531 | "type": "i64", 532 | "index": false 533 | }, 534 | { 535 | "name": "virtualSolReserves", 536 | "type": "u64", 537 | "index": false 538 | }, 539 | { 540 | "name": "virtualTokenReserves", 541 | "type": "u64", 542 | "index": false 543 | } 544 | ] 545 | }, 546 | { 547 | "name": "CompleteEvent", 548 | "fields": [ 549 | { 550 | "name": "user", 551 | "type": "publicKey", 552 | "index": false 553 | }, 554 | { 555 | "name": "mint", 556 | "type": "publicKey", 557 | "index": false 558 | }, 559 | { 560 | "name": "bondingCurve", 561 | "type": "publicKey", 562 | "index": false 563 | }, 564 | { 565 | "name": "timestamp", 566 | "type": "i64", 567 | "index": false 568 | } 569 | ] 570 | }, 571 | { 572 | "name": "SetParamsEvent", 573 | "fields": [ 574 | { 575 | "name": "feeRecipient", 576 | "type": "publicKey", 577 | "index": false 578 | }, 579 | { 580 | "name": "initialVirtualTokenReserves", 581 | "type": "u64", 582 | "index": false 583 | }, 584 | { 585 | "name": "initialVirtualSolReserves", 586 | "type": "u64", 587 | "index": false 588 | }, 589 | { 590 | "name": "initialRealTokenReserves", 591 | "type": "u64", 592 | "index": false 593 | }, 594 | { 595 | "name": "tokenTotalSupply", 596 | "type": "u64", 597 | "index": false 598 | }, 599 | { 600 | "name": "feeBasisPoints", 601 | "type": "u64", 602 | "index": false 603 | } 604 | ] 605 | } 606 | ], 607 | "errors": [ 608 | { 609 | "code": 6000, 610 | "name": "NotAuthorized", 611 | "msg": "The given account is not authorized to execute this instruction." 612 | }, 613 | { 614 | "code": 6001, 615 | "name": "AlreadyInitialized", 616 | "msg": "The program is already initialized." 617 | }, 618 | { 619 | "code": 6002, 620 | "name": "TooMuchSolRequired", 621 | "msg": "slippage: Too much SOL required to buy the given amount of tokens." 622 | }, 623 | { 624 | "code": 6003, 625 | "name": "TooLittleSolReceived", 626 | "msg": "slippage: Too little SOL received to sell the given amount of tokens." 627 | }, 628 | { 629 | "code": 6004, 630 | "name": "MintDoesNotMatchBondingCurve", 631 | "msg": "The mint does not match the bonding curve." 632 | }, 633 | { 634 | "code": 6005, 635 | "name": "BondingCurveComplete", 636 | "msg": "The bonding curve has completed and liquidity migrated to raydium." 637 | }, 638 | { 639 | "code": 6006, 640 | "name": "BondingCurveNotComplete", 641 | "msg": "The bonding curve has not completed." 642 | }, 643 | { 644 | "code": 6007, 645 | "name": "NotInitialized", 646 | "msg": "The program is not initialized." 647 | } 648 | ], 649 | "metadata": { 650 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" 651 | } 652 | } 653 | -------------------------------------------------------------------------------- /src/pumpfun.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Commitment, 3 | Connection, 4 | Finality, 5 | Keypair, 6 | PublicKey, 7 | Transaction, 8 | VersionedTransaction, 9 | } from "@solana/web3.js"; 10 | import { Program, Provider } from "@coral-xyz/anchor"; 11 | import { setGlobalDispatcher, Agent } from 'undici' 12 | import { GlobalAccount } from "./globalAccount"; 13 | import { 14 | CompleteEvent, 15 | CreateEvent, 16 | CreateTokenMetadata, 17 | PriorityFee, 18 | PumpFunEventHandlers, 19 | PumpFunEventType, 20 | SetParamsEvent, 21 | TradeEvent, 22 | TransactionResult, 23 | } from "./types"; 24 | import { 25 | toCompleteEvent, 26 | toCreateEvent, 27 | toSetParamsEvent, 28 | toTradeEvent, 29 | } from "./events"; 30 | import { 31 | ASSOCIATED_TOKEN_PROGRAM_ID, 32 | createAssociatedTokenAccountInstruction, 33 | getAccount, 34 | getAssociatedTokenAddress, 35 | getAssociatedTokenAddressSync, 36 | TOKEN_PROGRAM_ID, 37 | } from "@solana/spl-token"; 38 | import { BondingCurveAccount } from "./bondingCurveAccount"; 39 | import { BN } from "bn.js"; 40 | import { 41 | DEFAULT_COMMITMENT, 42 | DEFAULT_FINALITY, 43 | buildTx, 44 | calculateWithSlippageBuy, 45 | calculateWithSlippageSell, 46 | getRandomInt, 47 | sendTx, 48 | } from "./util"; 49 | import { PumpFun, IDL } from "./idl/index"; 50 | import { global_mint } from "../constants"; 51 | import { TransactionInstruction } from "@solana/web3.js"; 52 | 53 | const PROGRAM_ID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 54 | const MPL_TOKEN_METADATA_PROGRAM_ID = 55 | "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"; 56 | 57 | export const GLOBAL_ACCOUNT_SEED = "global"; 58 | export const MINT_AUTHORITY_SEED = "mint-authority"; 59 | export const BONDING_CURVE_SEED = "bonding-curve"; 60 | export const METADATA_SEED = "metadata"; 61 | 62 | export const DEFAULT_DECIMALS = 6; 63 | let buyTotalSolBal: bigint = 0n; 64 | 65 | export class PumpFunSDK { 66 | public program: Program; 67 | public connection: Connection; 68 | constructor(provider?: Provider) { 69 | this.program = new Program(IDL as PumpFun, provider); 70 | this.connection = this.program.provider.connection; 71 | } 72 | 73 | // async buy( 74 | // buyer: Keypair, 75 | // mint: PublicKey, 76 | // buyAmountSol: bigint, 77 | // slippageBasisPoints: bigint = BigInt(500), 78 | // priorityFees?: PriorityFee, 79 | // commitment: Commitment = DEFAULT_COMMITMENT, 80 | // finality: Finality = DEFAULT_FINALITY 81 | // ): Promise { 82 | // let buyTx = await this.getBuyInstructionsBySolAmount( 83 | // buyer.publicKey, 84 | // mint, 85 | // buyAmountSol, 86 | // slippageBasisPoints, 87 | // commitment 88 | // ); 89 | 90 | // let buyResults = await sendTx( 91 | // this.connection, 92 | // buyTx, 93 | // buyer.publicKey, 94 | // [buyer], 95 | // priorityFees, 96 | // commitment, 97 | // finality 98 | // ); 99 | // return buyResults; 100 | // } 101 | 102 | async sell( 103 | seller: Keypair, 104 | mint: PublicKey, 105 | sellTokenAmount: bigint, 106 | slippageBasisPoints: bigint = BigInt(500), 107 | priorityFees?: PriorityFee, 108 | commitment: Commitment = DEFAULT_COMMITMENT, 109 | finality: Finality = DEFAULT_FINALITY 110 | ): Promise { 111 | let sellTx = await this.getSellInstructionsByTokenAmount( 112 | seller.publicKey, 113 | mint, 114 | sellTokenAmount, 115 | slippageBasisPoints, 116 | commitment 117 | ); 118 | 119 | let sellResults = await sendTx( 120 | this.connection, 121 | sellTx, 122 | seller.publicKey, 123 | [seller], 124 | priorityFees, 125 | commitment, 126 | finality 127 | ); 128 | return sellResults; 129 | } 130 | 131 | //create token instructions 132 | async getCreateInstructions( 133 | creator: PublicKey, 134 | name: string, 135 | symbol: string, 136 | uri: string, 137 | mint: Keypair 138 | ) { 139 | const mplTokenMetadata = new PublicKey(MPL_TOKEN_METADATA_PROGRAM_ID); 140 | 141 | const [metadataPDA] = PublicKey.findProgramAddressSync( 142 | [ 143 | Buffer.from(METADATA_SEED), 144 | mplTokenMetadata.toBuffer(), 145 | mint.publicKey.toBuffer(), 146 | ], 147 | mplTokenMetadata 148 | ); 149 | 150 | const associatedBondingCurve = await getAssociatedTokenAddress( 151 | mint.publicKey, 152 | this.getBondingCurvePDA(mint.publicKey), 153 | true 154 | ); 155 | 156 | return this.program.methods 157 | .create(name, symbol, uri) 158 | .accounts({ 159 | mint: mint.publicKey, 160 | associatedBondingCurve: associatedBondingCurve, 161 | metadata: metadataPDA, 162 | user: creator, 163 | }) 164 | .signers([mint]) 165 | .instruction(); 166 | } 167 | 168 | async getTokenPrice(mint: PublicKey) { 169 | const commitment = "confirmed" 170 | let bondingCurveAccount = await this.getBondingCurveAccount(mint, commitment) 171 | if (!bondingCurveAccount) { 172 | throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); 173 | } 174 | return Number(bondingCurveAccount.virtualSolReserves) / Number(bondingCurveAccount.virtualTokenReserves) 175 | } 176 | 177 | async getBuyInstructionsBySolAmount( 178 | buyer: PublicKey, 179 | mint: PublicKey, 180 | buyAmountSol: bigint, 181 | index: number 182 | // slippageBasisPoints: bigint = BigInt(500), 183 | // commitment: Commitment = DEFAULT_COMMITMENT 184 | ) { 185 | const commitment = "confirmed" 186 | let bondingCurveAccount = await this.getBondingCurveAccount( 187 | global_mint, 188 | commitment 189 | ); 190 | if (!bondingCurveAccount) { 191 | throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); 192 | } 193 | let buyAmount: bigint 194 | 195 | if (index == 0) { 196 | buyTotalSolBal = buyTotalSolBal + buyAmountSol 197 | buyAmount = bondingCurveAccount.getBuyPrice(buyTotalSolBal); 198 | } 199 | else { 200 | let currentbuyAmount = bondingCurveAccount.getBuyPrice(buyTotalSolBal) 201 | buyTotalSolBal = buyTotalSolBal + buyAmountSol 202 | buyAmount = bondingCurveAccount.getBuyPrice(buyTotalSolBal) - currentbuyAmount 203 | } 204 | 205 | // let buyAmountWithSlippage = calculateWithSlippageBuy( 206 | // buyAmountSol, 207 | // slippageBasisPoints 208 | // ); 209 | 210 | let buyAmountWithSlippage = await this.connection.getBalance(buyer) 211 | let globalAccount = await this.getGlobalAccount(commitment); 212 | 213 | return await this.getBuyInstructions( 214 | buyer, 215 | mint, 216 | globalAccount.feeRecipient, 217 | buyAmount, 218 | BigInt(buyAmountWithSlippage - 10 ** 6) 219 | ); 220 | } 221 | 222 | //buy 223 | async getBuyInstructions( 224 | buyer: PublicKey, 225 | mint: PublicKey, 226 | feeRecipient: PublicKey, 227 | amount: bigint, 228 | solAmount: bigint, 229 | commitment: Commitment = DEFAULT_COMMITMENT, 230 | ) { 231 | const associatedBondingCurve = await getAssociatedTokenAddress( 232 | mint, 233 | this.getBondingCurvePDA(mint), 234 | true 235 | ); 236 | const associatedUser = await getAssociatedTokenAddress(mint, buyer, false, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID); 237 | 238 | // transaction.add( 239 | return [ 240 | createAssociatedTokenAccountInstruction(buyer, associatedUser, buyer, mint, TOKEN_PROGRAM_ID, ASSOCIATED_TOKEN_PROGRAM_ID), 241 | await this.program.methods 242 | .buy(new BN(amount.toString()), new BN(solAmount.toString())) 243 | // .buy(new BN(amount.toString()), new BN(3 * 10 ** 9)) 244 | .accounts({ 245 | feeRecipient: feeRecipient, 246 | mint: mint, 247 | associatedBondingCurve: associatedBondingCurve, 248 | associatedUser: associatedUser, 249 | user: buyer, 250 | }) 251 | .instruction() 252 | ] 253 | // ); 254 | 255 | } 256 | 257 | 258 | async getBuyIxsBySolAmount( 259 | buyer: PublicKey, 260 | mint: PublicKey, 261 | buyAmountSol: bigint, 262 | slippageBasisPoints: bigint = BigInt(500), 263 | commitment: Commitment = DEFAULT_COMMITMENT 264 | ) { 265 | let bondingCurveAccount = await this.getBondingCurveAccount( 266 | global_mint, 267 | commitment 268 | ); 269 | if (!bondingCurveAccount) { 270 | throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); 271 | } 272 | 273 | let buyAmount = bondingCurveAccount.getBuyPrice(buyAmountSol); 274 | let buyAmountWithSlippage = calculateWithSlippageBuy( 275 | buyAmountSol, 276 | slippageBasisPoints 277 | ); 278 | let globalAccount = await this.getGlobalAccount(commitment); 279 | 280 | return await this.getBuyIxs( 281 | buyer, 282 | mint, 283 | globalAccount.feeRecipient, 284 | buyAmount, 285 | buyAmountWithSlippage, 286 | ); 287 | } 288 | 289 | //buy 290 | async getBuyIxs( 291 | buyer: PublicKey, 292 | mint: PublicKey, 293 | feeRecipient: PublicKey, 294 | amount: bigint, 295 | solAmount: bigint, 296 | commitment: Commitment = DEFAULT_COMMITMENT, 297 | ) { 298 | const associatedBondingCurve = await getAssociatedTokenAddress( 299 | mint, 300 | this.getBondingCurvePDA(mint), 301 | true 302 | ); 303 | 304 | const associatedUser = await getAssociatedTokenAddress(mint, buyer, false); 305 | 306 | let ixs: TransactionInstruction[] = []; 307 | 308 | try { 309 | await getAccount(this.connection, associatedUser, commitment); 310 | } catch (e) { 311 | ixs.push( 312 | createAssociatedTokenAccountInstruction( 313 | buyer, 314 | associatedUser, 315 | buyer, 316 | mint 317 | ) 318 | ); 319 | } 320 | 321 | ixs.push( 322 | await this.program.methods 323 | .buy(new BN(amount.toString()), new BN(solAmount.toString())) 324 | .accounts({ 325 | feeRecipient: feeRecipient, 326 | mint: mint, 327 | associatedBondingCurve: associatedBondingCurve, 328 | associatedUser: associatedUser, 329 | user: buyer, 330 | }) 331 | .instruction() 332 | ); 333 | 334 | return ixs; 335 | } 336 | 337 | //sell 338 | async getSellInstructionsByTokenAmount( 339 | seller: PublicKey, 340 | mint: PublicKey, 341 | sellTokenAmount: bigint, 342 | slippageBasisPoints: bigint = BigInt(500), 343 | commitment: Commitment = DEFAULT_COMMITMENT 344 | ) { 345 | let bondingCurveAccount = await this.getBondingCurveAccount( 346 | mint, 347 | commitment 348 | ); 349 | if (!bondingCurveAccount) { 350 | throw new Error(`Bonding curve account not found: ${mint.toBase58()}`); 351 | } 352 | 353 | let globalAccount = await this.getGlobalAccount(commitment); 354 | 355 | let minSolOutput = bondingCurveAccount.getSellPrice( 356 | sellTokenAmount, 357 | globalAccount.feeBasisPoints 358 | ); 359 | 360 | let sellAmountWithSlippage = calculateWithSlippageSell( 361 | BigInt(0), 362 | slippageBasisPoints 363 | ); 364 | 365 | return await this.getSellInstructions( 366 | seller, 367 | mint, 368 | globalAccount.feeRecipient, 369 | sellTokenAmount, 370 | sellAmountWithSlippage 371 | ); 372 | } 373 | 374 | async getSellInstructions( 375 | seller: PublicKey, 376 | mint: PublicKey, 377 | feeRecipient: PublicKey, 378 | amount: bigint, 379 | minSolOutput: bigint 380 | ) { 381 | const associatedBondingCurve = await getAssociatedTokenAddress( 382 | mint, 383 | this.getBondingCurvePDA(mint), 384 | true 385 | ); 386 | 387 | const associatedUser = await getAssociatedTokenAddress(mint, seller, false); 388 | 389 | let transaction = new Transaction(); 390 | 391 | transaction.add( 392 | await this.program.methods 393 | .sell(new BN(amount.toString()), new BN(minSolOutput.toString())) 394 | .accounts({ 395 | feeRecipient: feeRecipient, 396 | mint: mint, 397 | associatedBondingCurve: associatedBondingCurve, 398 | associatedUser: associatedUser, 399 | user: seller, 400 | }) 401 | .transaction() 402 | ); 403 | 404 | return transaction; 405 | } 406 | 407 | async getBondingCurveAccount( 408 | mint: PublicKey, 409 | commitment: Commitment = DEFAULT_COMMITMENT 410 | ) { 411 | const tokenAccount = await this.connection.getAccountInfo( 412 | this.getBondingCurvePDA(mint), 413 | commitment 414 | ); 415 | if (!tokenAccount) { 416 | return null; 417 | } 418 | return BondingCurveAccount.fromBuffer(tokenAccount!.data); 419 | } 420 | 421 | async getGlobalAccount(commitment: Commitment = DEFAULT_COMMITMENT) { 422 | const [globalAccountPDA] = PublicKey.findProgramAddressSync( 423 | [Buffer.from(GLOBAL_ACCOUNT_SEED)], 424 | new PublicKey(PROGRAM_ID) 425 | ); 426 | 427 | const tokenAccount = await this.connection.getAccountInfo( 428 | globalAccountPDA, 429 | commitment 430 | ); 431 | 432 | return GlobalAccount.fromBuffer(tokenAccount!.data); 433 | } 434 | 435 | getBondingCurvePDA(mint: PublicKey) { 436 | return PublicKey.findProgramAddressSync( 437 | [Buffer.from(BONDING_CURVE_SEED), mint.toBuffer()], 438 | this.program.programId 439 | )[0]; 440 | } 441 | 442 | async createTokenMetadata(create: CreateTokenMetadata) { 443 | let formData = new FormData(); 444 | formData.append("file", create.file), 445 | formData.append("name", create.name), 446 | formData.append("symbol", create.symbol), 447 | formData.append("description", create.description), 448 | formData.append("twitter", create.twitter || ""), 449 | formData.append("telegram", create.telegram || ""), 450 | formData.append("website", create.website || ""), 451 | formData.append("showName", "true"); 452 | 453 | setGlobalDispatcher(new Agent({ connect: { timeout: 60_000 } })) 454 | let request = await fetch("https://pump.fun/api/ipfs", { 455 | method: "POST", 456 | headers: { 457 | "Host": "www.pump.fun", 458 | "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:126.0) Gecko/20100101 Firefox/126.0", 459 | "Accept": "*/*", 460 | "Accept-Language": "en-US,en;q=0.5", 461 | "Accept-Encoding": "gzip, deflate, br, zstd", 462 | "Referer": "https://www.pump.fun/create", 463 | "Origin": "https://www.pump.fun", 464 | "Connection": "keep-alive", 465 | "Sec-Fetch-Dest": "empty", 466 | "Sec-Fetch-Mode": "cors", 467 | "Sec-Fetch-Site": "same-origin", 468 | "Priority": "u=1", 469 | "TE": "trailers" 470 | }, 471 | body: formData, 472 | }); 473 | return request.json(); 474 | } 475 | 476 | //EVENTS 477 | addEventListener( 478 | eventType: T, 479 | callback: ( 480 | event: PumpFunEventHandlers[T], 481 | slot: number, 482 | signature: string 483 | ) => void 484 | ) { 485 | return this.program.addEventListener( 486 | eventType, 487 | (event: any, slot: number, signature: string) => { 488 | let processedEvent; 489 | switch (eventType) { 490 | case "createEvent": 491 | processedEvent = toCreateEvent(event as CreateEvent); 492 | callback( 493 | processedEvent as PumpFunEventHandlers[T], 494 | slot, 495 | signature 496 | ); 497 | break; 498 | case "tradeEvent": 499 | processedEvent = toTradeEvent(event as TradeEvent); 500 | callback( 501 | processedEvent as PumpFunEventHandlers[T], 502 | slot, 503 | signature 504 | ); 505 | break; 506 | case "completeEvent": 507 | processedEvent = toCompleteEvent(event as CompleteEvent); 508 | callback( 509 | processedEvent as PumpFunEventHandlers[T], 510 | slot, 511 | signature 512 | ); 513 | console.log("completeEvent", event, slot, signature); 514 | break; 515 | case "setParamsEvent": 516 | processedEvent = toSetParamsEvent(event as SetParamsEvent); 517 | callback( 518 | processedEvent as PumpFunEventHandlers[T], 519 | slot, 520 | signature 521 | ); 522 | break; 523 | default: 524 | console.error("Unhandled event type:", eventType); 525 | } 526 | } 527 | ); 528 | } 529 | 530 | removeEventListener(eventId: number) { 531 | this.program.removeEventListener(eventId); 532 | } 533 | } 534 | -------------------------------------------------------------------------------- /src/idl/pump-fun.ts: -------------------------------------------------------------------------------- 1 | export type PumpFun = { 2 | address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 3 | metadata: { 4 | name: "pump"; 5 | version: "0.1.0"; 6 | spec: "0.1.0"; 7 | }; 8 | instructions: [ 9 | { 10 | name: "initialize"; 11 | discriminator: [175, 175, 109, 31, 13, 152, 155, 237]; 12 | docs: ["Creates the global state."]; 13 | accounts: [ 14 | { 15 | name: "global"; 16 | writable: true; 17 | pda: { 18 | seeds: [ 19 | { 20 | kind: "const"; 21 | value: [103, 108, 111, 98, 97, 108]; 22 | } 23 | ]; 24 | }; 25 | }, 26 | { 27 | name: "user"; 28 | writable: true; 29 | signer: true; 30 | }, 31 | { 32 | name: "systemProgram"; 33 | address: "11111111111111111111111111111111"; 34 | } 35 | ]; 36 | args: []; 37 | }, 38 | { 39 | name: "setParams"; 40 | discriminator: [165, 31, 134, 53, 189, 180, 130, 255]; 41 | docs: ["Sets the global state parameters."]; 42 | accounts: [ 43 | { 44 | name: "global"; 45 | writable: true; 46 | pda: { 47 | seeds: [ 48 | { 49 | kind: "const"; 50 | value: [103, 108, 111, 98, 97, 108]; 51 | } 52 | ]; 53 | }; 54 | }, 55 | { 56 | name: "user"; 57 | writable: true; 58 | signer: true; 59 | }, 60 | { 61 | name: "systemProgram"; 62 | address: "11111111111111111111111111111111"; 63 | }, 64 | { 65 | name: "eventAuthority"; 66 | address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; 67 | }, 68 | { 69 | name: "program"; 70 | address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 71 | } 72 | ]; 73 | args: [ 74 | { 75 | name: "feeRecipient"; 76 | type: "pubkey"; 77 | }, 78 | { 79 | name: "initialVirtualTokenReserves"; 80 | type: "u64"; 81 | }, 82 | { 83 | name: "initialVirtualSolReserves"; 84 | type: "u64"; 85 | }, 86 | { 87 | name: "initialRealTokenReserves"; 88 | type: "u64"; 89 | }, 90 | { 91 | name: "tokenTotalSupply"; 92 | type: "u64"; 93 | }, 94 | { 95 | name: "feeBasisPoints"; 96 | type: "u64"; 97 | } 98 | ]; 99 | }, 100 | { 101 | name: "create"; 102 | discriminator: [24, 30, 200, 40, 5, 28, 7, 119]; 103 | docs: ["Creates a new coin and bonding curve."]; 104 | accounts: [ 105 | { 106 | name: "mint"; 107 | writable: true; 108 | signer: true; 109 | }, 110 | { 111 | name: "mint_authority"; 112 | pda: { 113 | seeds: [ 114 | { 115 | kind: "const"; 116 | value: [ 117 | 109, 118 | 105, 119 | 110, 120 | 116, 121 | 45, 122 | 97, 123 | 117, 124 | 116, 125 | 104, 126 | 111, 127 | 114, 128 | 105, 129 | 116, 130 | 121 131 | ]; 132 | } 133 | ]; 134 | }; 135 | }, 136 | { 137 | name: "bondingCurve"; 138 | writable: true; 139 | pda: { 140 | seeds: [ 141 | { 142 | kind: "const"; 143 | value: [ 144 | 98, 145 | 111, 146 | 110, 147 | 100, 148 | 105, 149 | 110, 150 | 103, 151 | 45, 152 | 99, 153 | 117, 154 | 114, 155 | 118, 156 | 101 157 | ]; 158 | }, 159 | { 160 | kind: "account"; 161 | path: "mint"; 162 | } 163 | ]; 164 | }; 165 | }, 166 | { 167 | name: "associatedBondingCurve"; 168 | writable: true; 169 | signer: false; 170 | }, 171 | { 172 | name: "global"; 173 | writable: false; 174 | pda: { 175 | seeds: [ 176 | { 177 | kind: "const"; 178 | value: [103, 108, 111, 98, 97, 108]; 179 | } 180 | ]; 181 | }; 182 | }, 183 | { 184 | name: "mplTokenMetadata"; 185 | address: "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s"; 186 | }, 187 | { 188 | name: "metadata"; 189 | writable: true; 190 | signer: false; 191 | }, 192 | { 193 | name: "user"; 194 | isMut: true; 195 | isSigner: true; 196 | }, 197 | { 198 | name: "systemProgram"; 199 | address: "11111111111111111111111111111111"; 200 | }, 201 | { 202 | name: "tokenProgram"; 203 | address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; 204 | }, 205 | { 206 | name: "associatedTokenProgram"; 207 | address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; 208 | }, 209 | { 210 | name: "rent"; 211 | address: "SysvarRent111111111111111111111111111111111"; 212 | }, 213 | { 214 | name: "eventAuthority"; 215 | address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; 216 | }, 217 | { 218 | name: "program"; 219 | address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 220 | } 221 | ]; 222 | args: [ 223 | { 224 | name: "name"; 225 | type: "string"; 226 | }, 227 | { 228 | name: "symbol"; 229 | type: "string"; 230 | }, 231 | { 232 | name: "uri"; 233 | type: "string"; 234 | } 235 | ]; 236 | }, 237 | { 238 | name: "buy"; 239 | discriminator: [102, 6, 61, 18, 1, 218, 235, 234]; 240 | docs: ["Buys tokens from a bonding curve."]; 241 | accounts: [ 242 | { 243 | name: "global"; 244 | pda: { 245 | seeds: [ 246 | { 247 | kind: "const"; 248 | value: [103, 108, 111, 98, 97, 108]; 249 | } 250 | ]; 251 | }; 252 | }, 253 | { 254 | name: "feeRecipient"; 255 | writable: true; 256 | signer: false; 257 | }, 258 | { 259 | name: "mint"; 260 | writable: false; 261 | signer: false; 262 | }, 263 | { 264 | name: "bondingCurve"; 265 | writable: true; 266 | pda: { 267 | seeds: [ 268 | { 269 | kind: "const"; 270 | value: [ 271 | 98, 272 | 111, 273 | 110, 274 | 100, 275 | 105, 276 | 110, 277 | 103, 278 | 45, 279 | 99, 280 | 117, 281 | 114, 282 | 118, 283 | 101 284 | ]; 285 | }, 286 | { 287 | kind: "account"; 288 | path: "mint"; 289 | } 290 | ]; 291 | }; 292 | }, 293 | { 294 | name: "associatedBondingCurve"; 295 | writable: true; 296 | signer: false; 297 | }, 298 | { 299 | name: "associatedUser"; 300 | writable: true; 301 | signer: false; 302 | }, 303 | { 304 | name: "user"; 305 | writable: true; 306 | signer: true; 307 | }, 308 | { 309 | name: "systemProgram"; 310 | address: "11111111111111111111111111111111"; 311 | }, 312 | { 313 | name: "tokenProgram"; 314 | address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; 315 | }, 316 | { 317 | name: "rent"; 318 | address: "SysvarRent111111111111111111111111111111111"; 319 | }, 320 | { 321 | name: "eventAuthority"; 322 | address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; 323 | }, 324 | { 325 | name: "program"; 326 | address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 327 | } 328 | ]; 329 | args: [ 330 | { 331 | name: "amount"; 332 | type: "u64"; 333 | }, 334 | { 335 | name: "maxSolCost"; 336 | type: "u64"; 337 | } 338 | ]; 339 | }, 340 | { 341 | name: "sell"; 342 | discriminator: [51, 230, 133, 164, 1, 127, 131, 173]; 343 | docs: ["Sells tokens into a bonding curve."]; 344 | accounts: [ 345 | { 346 | name: "global"; 347 | writable: false; 348 | pda: { 349 | seeds: [ 350 | { 351 | kind: "const"; 352 | value: [103, 108, 111, 98, 97, 108]; 353 | } 354 | ]; 355 | }; 356 | }, 357 | { 358 | name: "feeRecipient"; 359 | writable: true; 360 | signer: false; 361 | }, 362 | { 363 | name: "mint"; 364 | writable: false; 365 | signer: false; 366 | }, 367 | { 368 | name: "bondingCurve"; 369 | writable: true; 370 | pda: { 371 | seeds: [ 372 | { 373 | kind: "const"; 374 | value: [ 375 | 98, 376 | 111, 377 | 110, 378 | 100, 379 | 105, 380 | 110, 381 | 103, 382 | 45, 383 | 99, 384 | 117, 385 | 114, 386 | 118, 387 | 101 388 | ]; 389 | }, 390 | { 391 | kind: "account"; 392 | path: "mint"; 393 | } 394 | ]; 395 | }; 396 | }, 397 | { 398 | name: "associatedBondingCurve"; 399 | writable: true; 400 | signer: false; 401 | }, 402 | { 403 | name: "associatedUser"; 404 | writable: true; 405 | signer: false; 406 | }, 407 | { 408 | name: "user"; 409 | writable: true; 410 | signer: true; 411 | }, 412 | { 413 | name: "systemProgram"; 414 | address: "11111111111111111111111111111111"; 415 | }, 416 | { 417 | name: "associatedTokenProgram"; 418 | address: "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL"; 419 | }, 420 | { 421 | name: "tokenProgram"; 422 | address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; 423 | }, 424 | { 425 | name: "eventAuthority"; 426 | address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; 427 | }, 428 | { 429 | name: "program"; 430 | address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 431 | } 432 | ]; 433 | args: [ 434 | { 435 | name: "amount"; 436 | type: "u64"; 437 | }, 438 | { 439 | name: "minSolOutput"; 440 | type: "u64"; 441 | } 442 | ]; 443 | }, 444 | { 445 | name: "withdraw"; 446 | discriminator: [183, 18, 70, 156, 148, 109, 161, 34]; 447 | docs: [ 448 | "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" 449 | ]; 450 | accounts: [ 451 | { 452 | name: "global"; 453 | writable: false; 454 | pda: { 455 | seeds: [ 456 | { 457 | kind: "const"; 458 | value: [103, 108, 111, 98, 97, 108]; 459 | } 460 | ]; 461 | }; 462 | }, 463 | { 464 | name: "lastWithdraw"; 465 | writable: true; 466 | signer: false; 467 | }, 468 | { 469 | name: "mint"; 470 | writable: false; 471 | signer: false; 472 | }, 473 | { 474 | name: "bondingCurve"; 475 | writable: true; 476 | pda: { 477 | seeds: [ 478 | { 479 | kind: "const"; 480 | value: [ 481 | 98, 482 | 111, 483 | 110, 484 | 100, 485 | 105, 486 | 110, 487 | 103, 488 | 45, 489 | 99, 490 | 117, 491 | 114, 492 | 118, 493 | 101 494 | ]; 495 | }, 496 | { 497 | kind: "account"; 498 | path: "mint"; 499 | } 500 | ]; 501 | }; 502 | }, 503 | { 504 | name: "associatedBondingCurve"; 505 | writable: true; 506 | signer: false; 507 | }, 508 | { 509 | name: "associatedUser"; 510 | writable: true; 511 | signer: false; 512 | }, 513 | { 514 | name: "user"; 515 | writable: true; 516 | signer: true; 517 | }, 518 | { 519 | name: "system_program"; 520 | address: "11111111111111111111111111111111"; 521 | }, 522 | { 523 | name: "tokenProgram"; 524 | address: "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA"; 525 | }, 526 | { 527 | name: "rent"; 528 | address: "SysvarRent111111111111111111111111111111111"; 529 | }, 530 | { 531 | name: "eventAuthority"; 532 | address: "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; 533 | }, 534 | { 535 | name: "program"; 536 | address: "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 537 | } 538 | ]; 539 | args: []; 540 | } 541 | ]; 542 | accounts: [ 543 | { 544 | name: "bondingCurve"; 545 | discriminator: [23, 183, 248, 55, 96, 216, 172, 96]; 546 | }, 547 | { 548 | name: "global"; 549 | discriminator: [167, 232, 232, 177, 200, 108, 114, 127]; 550 | } 551 | ]; 552 | events: [ 553 | { 554 | name: "createEvent"; 555 | discriminator: [27, 114, 169, 77, 222, 235, 99, 118]; 556 | }, 557 | { 558 | name: "tradeEvent"; 559 | discriminator: [189, 219, 127, 211, 78, 230, 97, 238]; 560 | }, 561 | { 562 | name: "completeEvent"; 563 | discriminator: [95, 114, 97, 156, 212, 46, 152, 8]; 564 | }, 565 | { 566 | name: "setParamsEvent"; 567 | discriminator: [223, 195, 159, 246, 62, 48, 143, 131]; 568 | } 569 | ]; 570 | types: [ 571 | { 572 | name: "global"; 573 | type: { 574 | kind: "struct"; 575 | fields: [ 576 | { 577 | name: "initialized"; 578 | type: "bool"; 579 | }, 580 | { 581 | name: "authority"; 582 | type: "pubkey"; 583 | }, 584 | { 585 | name: "feeRecipient"; 586 | type: "pubkey"; 587 | }, 588 | { 589 | name: "initialVirtualTokenReserves"; 590 | type: "u64"; 591 | }, 592 | { 593 | name: "initialVirtualSolReserves"; 594 | type: "u64"; 595 | }, 596 | { 597 | name: "initialRealTokenReserves"; 598 | type: "u64"; 599 | }, 600 | { 601 | name: "tokenTotalSupply"; 602 | type: "u64"; 603 | }, 604 | { 605 | name: "feeBasisPoints"; 606 | type: "u64"; 607 | } 608 | ]; 609 | }; 610 | }, 611 | { 612 | name: "lastWithdraw"; 613 | type: { 614 | kind: "struct"; 615 | fields: [ 616 | { 617 | name: "lastWithdrawTimestamp"; 618 | type: "i64"; 619 | } 620 | ]; 621 | }; 622 | }, 623 | { 624 | name: "bondingCurve"; 625 | type: { 626 | kind: "struct"; 627 | fields: [ 628 | { 629 | name: "virtualTokenReserves"; 630 | type: "u64"; 631 | }, 632 | { 633 | name: "virtualSolReserves"; 634 | type: "u64"; 635 | }, 636 | { 637 | name: "realTokenReserves"; 638 | type: "u64"; 639 | }, 640 | { 641 | name: "realSolReserves"; 642 | type: "u64"; 643 | }, 644 | { 645 | name: "tokenTotalSupply"; 646 | type: "u64"; 647 | }, 648 | { 649 | name: "complete"; 650 | type: "bool"; 651 | } 652 | ]; 653 | }; 654 | }, 655 | { 656 | name: "createEvent"; 657 | type: { 658 | kind: "struct"; 659 | fields: [ 660 | { 661 | name: "name"; 662 | type: "string"; 663 | index: false; 664 | }, 665 | { 666 | name: "symbol"; 667 | type: "string"; 668 | index: false; 669 | }, 670 | { 671 | name: "uri"; 672 | type: "string"; 673 | index: false; 674 | }, 675 | { 676 | name: "mint"; 677 | type: "pubkey"; 678 | index: false; 679 | }, 680 | { 681 | name: "bondingCurve"; 682 | type: "pubkey"; 683 | index: false; 684 | }, 685 | { 686 | name: "user"; 687 | type: "pubkey"; 688 | index: false; 689 | } 690 | ]; 691 | }; 692 | }, 693 | { 694 | name: "tradeEvent"; 695 | type: { 696 | kind: "struct"; 697 | fields: [ 698 | { 699 | name: "mint"; 700 | type: "pubkey"; 701 | index: false; 702 | }, 703 | { 704 | name: "solAmount"; 705 | type: "u64"; 706 | index: false; 707 | }, 708 | { 709 | name: "tokenAmount"; 710 | type: "u64"; 711 | index: false; 712 | }, 713 | { 714 | name: "isBuy"; 715 | type: "bool"; 716 | index: false; 717 | }, 718 | { 719 | name: "user"; 720 | type: "pubkey"; 721 | index: false; 722 | }, 723 | { 724 | name: "timestamp"; 725 | type: "i64"; 726 | index: false; 727 | }, 728 | { 729 | name: "virtualSolReserves"; 730 | type: "u64"; 731 | index: false; 732 | }, 733 | { 734 | name: "virtualTokenReserves"; 735 | type: "u64"; 736 | index: false; 737 | }, 738 | { 739 | name: "realSolReserves"; 740 | type: "u64"; 741 | index: false; 742 | }, 743 | { 744 | name: "realTokenReserves"; 745 | type: "u64"; 746 | index: false; 747 | } 748 | ]; 749 | }; 750 | }, 751 | { 752 | name: "completeEvent"; 753 | type: { 754 | kind: "struct"; 755 | fields: [ 756 | { 757 | name: "user"; 758 | type: "pubkey"; 759 | index: false; 760 | }, 761 | { 762 | name: "mint"; 763 | type: "pubkey"; 764 | index: false; 765 | }, 766 | { 767 | name: "bondingCurve"; 768 | type: "pubkey"; 769 | index: false; 770 | }, 771 | { 772 | name: "timestamp"; 773 | type: "i64"; 774 | index: false; 775 | } 776 | ]; 777 | }; 778 | }, 779 | { 780 | name: "setParamsEvent"; 781 | type: { 782 | kind: "struct"; 783 | fields: [ 784 | { 785 | name: "feeRecipient"; 786 | type: "pubkey"; 787 | index: false; 788 | }, 789 | { 790 | name: "initialVirtualTokenReserves"; 791 | type: "u64"; 792 | index: false; 793 | }, 794 | { 795 | name: "initialVirtualSolReserves"; 796 | type: "u64"; 797 | index: false; 798 | }, 799 | { 800 | name: "initialRealTokenReserves"; 801 | type: "u64"; 802 | index: false; 803 | }, 804 | { 805 | name: "tokenTotalSupply"; 806 | type: "u64"; 807 | index: false; 808 | }, 809 | { 810 | name: "feeBasisPoints"; 811 | type: "u64"; 812 | index: false; 813 | } 814 | ]; 815 | }; 816 | } 817 | ]; 818 | errors: [ 819 | { 820 | code: 6000; 821 | name: "NotAuthorized"; 822 | msg: "The given account is not authorized to execute this instruction."; 823 | }, 824 | { 825 | code: 6001; 826 | name: "AlreadyInitialized"; 827 | msg: "The program is already initialized."; 828 | }, 829 | { 830 | code: 6002; 831 | name: "TooMuchSolRequired"; 832 | msg: "slippage: Too much SOL required to buy the given amount of tokens."; 833 | }, 834 | { 835 | code: 6003; 836 | name: "TooLittleSolReceived"; 837 | msg: "slippage: Too little SOL received to sell the given amount of tokens."; 838 | }, 839 | { 840 | code: 6004; 841 | name: "MintDoesNotMatchBondingCurve"; 842 | msg: "The mint does not match the bonding curve."; 843 | }, 844 | { 845 | code: 6005; 846 | name: "BondingCurveComplete"; 847 | msg: "The bonding curve has completed and liquidity migrated to raydium."; 848 | }, 849 | { 850 | code: 6006; 851 | name: "BondingCurveNotComplete"; 852 | msg: "The bonding curve has not completed."; 853 | }, 854 | { 855 | code: 6007; 856 | name: "NotInitialized"; 857 | msg: "The program is not initialized."; 858 | }, 859 | { 860 | code: 6008; 861 | name: "WithdrawTooFrequent"; 862 | msg: "Withdraw too frequent"; 863 | } 864 | ]; 865 | }; -------------------------------------------------------------------------------- /src/idl/pump-fun.json: -------------------------------------------------------------------------------- 1 | { 2 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P", 3 | "metadata": { 4 | "name": "pump", 5 | "version": "0.1.0", 6 | "spec": "0.1.0" 7 | }, 8 | "instructions": [ 9 | { 10 | "name": "initialize", 11 | "discriminator": [175, 175, 109, 31, 13, 152, 155, 237], 12 | "docs": ["Creates the global state."], 13 | "accounts": [ 14 | { 15 | "name": "global", 16 | "writable": true, 17 | "pda": { 18 | "seeds": [ 19 | { 20 | "kind": "const", 21 | "value": [ 22 | 103, 23 | 108, 24 | 111, 25 | 98, 26 | 97, 27 | 108 28 | ] 29 | } 30 | ] 31 | } 32 | }, 33 | { 34 | "name": "user", 35 | "writable": true, 36 | "signer": true 37 | }, 38 | { 39 | "name": "system_program", 40 | "address": "11111111111111111111111111111111" 41 | } 42 | ], 43 | "args": [] 44 | }, 45 | { 46 | "name": "setParams", 47 | "discriminator": [165, 31, 134, 53, 189, 180, 130, 255], 48 | "docs": ["Sets the global state parameters."], 49 | "accounts": [ 50 | { 51 | "name": "global", 52 | "writable": true, 53 | "pda": { 54 | "seeds": [ 55 | { 56 | "kind": "const", 57 | "value": [ 58 | 103, 59 | 108, 60 | 111, 61 | 98, 62 | 97, 63 | 108 64 | ] 65 | } 66 | ] 67 | } 68 | }, 69 | { 70 | "name": "user", 71 | "writable": true, 72 | "signer": true 73 | }, 74 | { 75 | "name": "system_program", 76 | "address": "11111111111111111111111111111111" 77 | }, 78 | { 79 | "name": "event_authority", 80 | "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" 81 | }, 82 | { 83 | "name": "program", 84 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" 85 | } 86 | ], 87 | "args": [ 88 | { 89 | "name": "feeRecipient", 90 | "type": "pubkey" 91 | }, 92 | { 93 | "name": "initialVirtualTokenReserves", 94 | "type": "u64" 95 | }, 96 | { 97 | "name": "initialVirtualSolReserves", 98 | "type": "u64" 99 | }, 100 | { 101 | "name": "initialRealTokenReserves", 102 | "type": "u64" 103 | }, 104 | { 105 | "name": "tokenTotalSupply", 106 | "type": "u64" 107 | }, 108 | { 109 | "name": "feeBasisPoints", 110 | "type": "u64" 111 | } 112 | ] 113 | }, 114 | { 115 | "name": "create", 116 | "discriminator": [24, 30, 200, 40, 5, 28, 7, 119], 117 | "docs": ["Creates a new coin and bonding curve."], 118 | "accounts": [ 119 | { 120 | "name": "mint", 121 | "writable": true, 122 | "signer": true 123 | }, 124 | { 125 | "name": "mint_authority", 126 | "pda": { 127 | "seeds": [ 128 | { 129 | "kind": "const", 130 | "value": [ 131 | 109, 132 | 105, 133 | 110, 134 | 116, 135 | 45, 136 | 97, 137 | 117, 138 | 116, 139 | 104, 140 | 111, 141 | 114, 142 | 105, 143 | 116, 144 | 121 145 | ] 146 | } 147 | ] 148 | } 149 | }, 150 | { 151 | "name": "bonding_curve", 152 | "writable": true, 153 | "pda": { 154 | "seeds": [ 155 | { 156 | "kind": "const", 157 | "value": [ 158 | 98, 159 | 111, 160 | 110, 161 | 100, 162 | 105, 163 | 110, 164 | 103, 165 | 45, 166 | 99, 167 | 117, 168 | 114, 169 | 118, 170 | 101 171 | ] 172 | }, 173 | { 174 | "kind": "account", 175 | "path": "mint" 176 | } 177 | ] 178 | } 179 | }, 180 | { 181 | "name": "associated_bonding_curve", 182 | "writable": true, 183 | "signer": false 184 | }, 185 | { 186 | "name": "global", 187 | "writable": false, 188 | "pda": { 189 | "seeds": [ 190 | { 191 | "kind": "const", 192 | "value": [ 193 | 103, 194 | 108, 195 | 111, 196 | 98, 197 | 97, 198 | 108 199 | ] 200 | } 201 | ] 202 | } 203 | }, 204 | { 205 | "name": "mpl_token_metadata", 206 | "address": "metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s" 207 | }, 208 | { 209 | "name": "metadata", 210 | "writable": true, 211 | "signer": false 212 | }, 213 | { 214 | "name": "user", 215 | "isMut": true, 216 | "isSigner": true 217 | }, 218 | { 219 | "name": "system_program", 220 | "address": "11111111111111111111111111111111" 221 | }, 222 | { 223 | "name": "token_program", 224 | "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" 225 | }, 226 | { 227 | "name": "associated_token_program", 228 | "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" 229 | }, 230 | { 231 | "name": "rent", 232 | "address": "SysvarRent111111111111111111111111111111111" 233 | }, 234 | { 235 | "name": "event_authority", 236 | "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" 237 | }, 238 | { 239 | "name": "program", 240 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" 241 | } 242 | ], 243 | "args": [ 244 | { 245 | "name": "name", 246 | "type": "string" 247 | }, 248 | { 249 | "name": "symbol", 250 | "type": "string" 251 | }, 252 | { 253 | "name": "uri", 254 | "type": "string" 255 | } 256 | ] 257 | }, 258 | { 259 | "name": "buy", 260 | "discriminator": [102, 6, 61, 18, 1, 218, 235, 234], 261 | "docs": ["Buys tokens from a bonding curve."], 262 | "accounts": [ 263 | { 264 | "name": "global", 265 | "pda": { 266 | "seeds": [ 267 | { 268 | "kind": "const", 269 | "value": [ 270 | 103, 271 | 108, 272 | 111, 273 | 98, 274 | 97, 275 | 108 276 | ] 277 | } 278 | ] 279 | } 280 | }, 281 | { 282 | "name": "fee_recipient", 283 | "writable": true, 284 | "signer": false 285 | }, 286 | { 287 | "name": "mint", 288 | "writable": false, 289 | "signer": false 290 | }, 291 | { 292 | "name": "bonding_curve", 293 | "writable": true, 294 | "pda": { 295 | "seeds": [ 296 | { 297 | "kind": "const", 298 | "value": [ 299 | 98, 300 | 111, 301 | 110, 302 | 100, 303 | 105, 304 | 110, 305 | 103, 306 | 45, 307 | 99, 308 | 117, 309 | 114, 310 | 118, 311 | 101 312 | ] 313 | }, 314 | { 315 | "kind": "account", 316 | "path": "mint" 317 | } 318 | ] 319 | } 320 | }, 321 | { 322 | "name": "associated_bonding_curve", 323 | "writable": true, 324 | "signer": false 325 | }, 326 | { 327 | "name": "associated_user", 328 | "writable": true, 329 | "signer": false 330 | }, 331 | { 332 | "name": "user", 333 | "writable": true, 334 | "signer": true 335 | }, 336 | { 337 | "name": "system_program", 338 | "address": "11111111111111111111111111111111" 339 | }, 340 | { 341 | "name": "token_program", 342 | "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" 343 | }, 344 | { 345 | "name": "rent", 346 | "address": "SysvarRent111111111111111111111111111111111" 347 | }, 348 | { 349 | "name": "event_authority", 350 | "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" 351 | }, 352 | { 353 | "name": "program", 354 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" 355 | } 356 | ], 357 | "args": [ 358 | { 359 | "name": "amount", 360 | "type": "u64" 361 | }, 362 | { 363 | "name": "maxSolCost", 364 | "type": "u64" 365 | } 366 | ] 367 | }, 368 | { 369 | "name": "sell", 370 | "discriminator": [51, 230, 133, 164, 1, 127, 131, 173], 371 | "docs": ["Sells tokens into a bonding curve."], 372 | "accounts": [ 373 | { 374 | "name": "global", 375 | "writable": false, 376 | "pda": { 377 | "seeds": [ 378 | { 379 | "kind": "const", 380 | "value": [ 381 | 103, 382 | 108, 383 | 111, 384 | 98, 385 | 97, 386 | 108 387 | ] 388 | } 389 | ] 390 | } 391 | }, 392 | { 393 | "name": "feeRecipient", 394 | "writable": true, 395 | "signer": false 396 | }, 397 | { 398 | "name": "mint", 399 | "writable": false, 400 | "signer": false 401 | }, 402 | { 403 | "name": "bonding_curve", 404 | "writable": true, 405 | "pda": { 406 | "seeds": [ 407 | { 408 | "kind": "const", 409 | "value": [ 410 | 98, 411 | 111, 412 | 110, 413 | 100, 414 | 105, 415 | 110, 416 | 103, 417 | 45, 418 | 99, 419 | 117, 420 | 114, 421 | 118, 422 | 101 423 | ] 424 | }, 425 | { 426 | "kind": "account", 427 | "path": "mint" 428 | } 429 | ] 430 | } 431 | }, 432 | { 433 | "name": "associatedBondingCurve", 434 | "writable": true, 435 | "signer": false 436 | }, 437 | { 438 | "name": "associatedUser", 439 | "writable": true, 440 | "signer": false 441 | }, 442 | { 443 | "name": "user", 444 | "writable": true, 445 | "signer": true 446 | }, 447 | { 448 | "name": "system_program", 449 | "address": "11111111111111111111111111111111" 450 | }, 451 | { 452 | "name": "associated_token_program", 453 | "address": "ATokenGPvbdGVxr1b2hvZbsiqW5xWH25efTNsLJA8knL" 454 | }, 455 | { 456 | "name": "token_program", 457 | "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" 458 | }, 459 | { 460 | "name": "event_authority", 461 | "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" 462 | }, 463 | { 464 | "name": "program", 465 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" 466 | } 467 | ], 468 | "args": [ 469 | { 470 | "name": "amount", 471 | "type": "u64" 472 | }, 473 | { 474 | "name": "minSolOutput", 475 | "type": "u64" 476 | } 477 | ] 478 | }, 479 | { 480 | "name": "withdraw", 481 | "discriminator": [183, 18, 70, 156, 148, 109, 161, 34], 482 | "docs": [ 483 | "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" 484 | ], 485 | "accounts": [ 486 | { 487 | "name": "global", 488 | "writable": false, 489 | "pda": { 490 | "seeds": [ 491 | { 492 | "kind": "const", 493 | "value": [ 494 | 103, 495 | 108, 496 | 111, 497 | 98, 498 | 97, 499 | 108 500 | ] 501 | } 502 | ] 503 | } 504 | }, 505 | { 506 | "name": "lastWithdraw", 507 | "writable": true, 508 | "signer": false 509 | }, 510 | { 511 | "name": "mint", 512 | "writable": false, 513 | "signer": false 514 | }, 515 | { 516 | "name": "bonding_curve", 517 | "writable": true, 518 | "pda": { 519 | "seeds": [ 520 | { 521 | "kind": "const", 522 | "value": [ 523 | 98, 524 | 111, 525 | 110, 526 | 100, 527 | 105, 528 | 110, 529 | 103, 530 | 45, 531 | 99, 532 | 117, 533 | 114, 534 | 118, 535 | 101 536 | ] 537 | }, 538 | { 539 | "kind": "account", 540 | "path": "mint" 541 | } 542 | ] 543 | } 544 | }, 545 | { 546 | "name": "associatedBondingCurve", 547 | "writable": true, 548 | "signer": false 549 | }, 550 | { 551 | "name": "associatedUser", 552 | "writable": true, 553 | "signer": false 554 | }, 555 | { 556 | "name": "user", 557 | "writable": true, 558 | "signer": true 559 | }, 560 | { 561 | "name": "system_program", 562 | "address": "11111111111111111111111111111111" 563 | }, 564 | { 565 | "name": "token_program", 566 | "address": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA" 567 | }, 568 | { 569 | "name": "rent", 570 | "address": "SysvarRent111111111111111111111111111111111" 571 | }, 572 | { 573 | "name": "event_authority", 574 | "address": "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1" 575 | }, 576 | { 577 | "name": "program", 578 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" 579 | } 580 | ], 581 | "args": [] 582 | } 583 | ], 584 | "accounts": [ 585 | { 586 | "name": "BondingCurve", 587 | "discriminator": [ 588 | 23, 589 | 183, 590 | 248, 591 | 55, 592 | 96, 593 | 216, 594 | 172, 595 | 96 596 | ] 597 | }, 598 | { 599 | "name": "Global", 600 | "discriminator": [ 601 | 167, 602 | 232, 603 | 232, 604 | 177, 605 | 200, 606 | 108, 607 | 114, 608 | 127 609 | ] 610 | } 611 | ], 612 | "events": [ 613 | { 614 | "name": "CreateEvent", 615 | "discriminator": [27, 114, 169, 77, 222, 235, 99, 118] 616 | }, 617 | { 618 | "name": "TradeEvent", 619 | "discriminator": [189, 219, 127, 211, 78, 230, 97, 238] 620 | }, 621 | { 622 | "name": "CompleteEvent", 623 | "discriminator": [95, 114, 97, 156, 212, 46, 152, 8] 624 | }, 625 | { 626 | "name": "SetParamsEvent", 627 | "discriminator": [223, 195, 159, 246, 62, 48, 143, 131] 628 | } 629 | ], 630 | "types": [ 631 | { 632 | "name": "Global", 633 | "type": { 634 | "kind": "struct", 635 | "fields": [ 636 | { 637 | "name": "initialized", 638 | "type": "bool" 639 | }, 640 | { 641 | "name": "authority", 642 | "type": "pubkey" 643 | }, 644 | { 645 | "name": "feeRecipient", 646 | "type": "pubkey" 647 | }, 648 | { 649 | "name": "initialVirtualTokenReserves", 650 | "type": "u64" 651 | }, 652 | { 653 | "name": "initialVirtualSolReserves", 654 | "type": "u64" 655 | }, 656 | { 657 | "name": "initialRealTokenReserves", 658 | "type": "u64" 659 | }, 660 | { 661 | "name": "tokenTotalSupply", 662 | "type": "u64" 663 | }, 664 | { 665 | "name": "feeBasisPoints", 666 | "type": "u64" 667 | } 668 | ] 669 | } 670 | }, 671 | { 672 | "name": "LastWithdraw", 673 | "type": { 674 | "kind": "struct", 675 | "fields": [ 676 | { 677 | "name": "lastWithdrawTimestamp", 678 | "type": "i64" 679 | } 680 | ] 681 | } 682 | }, 683 | { 684 | "name": "BondingCurve", 685 | "type": { 686 | "kind": "struct", 687 | "fields": [ 688 | { 689 | "name": "virtualTokenReserves", 690 | "type": "u64" 691 | }, 692 | { 693 | "name": "virtualSolReserves", 694 | "type": "u64" 695 | }, 696 | { 697 | "name": "realTokenReserves", 698 | "type": "u64" 699 | }, 700 | { 701 | "name": "realSolReserves", 702 | "type": "u64" 703 | }, 704 | { 705 | "name": "tokenTotalSupply", 706 | "type": "u64" 707 | }, 708 | { 709 | "name": "complete", 710 | "type": "bool" 711 | } 712 | ] 713 | } 714 | }, 715 | { 716 | "name": "CreateEvent", 717 | "type": { 718 | "kind": "struct", 719 | "fields": [ 720 | { 721 | "name": "name", 722 | "type": "string", 723 | "index": false 724 | }, 725 | { 726 | "name": "symbol", 727 | "type": "string", 728 | "index": false 729 | }, 730 | { 731 | "name": "uri", 732 | "type": "string", 733 | "index": false 734 | }, 735 | { 736 | "name": "mint", 737 | "type": "pubkey", 738 | "index": false 739 | }, 740 | { 741 | "name": "bondingCurve", 742 | "type": "pubkey", 743 | "index": false 744 | }, 745 | { 746 | "name": "user", 747 | "type": "pubkey", 748 | "index": false 749 | } 750 | ] 751 | } 752 | }, 753 | { 754 | "name": "TradeEvent", 755 | "type": { 756 | "kind": "struct", 757 | "fields": [ 758 | { 759 | "name": "mint", 760 | "type": "pubkey", 761 | "index": false 762 | }, 763 | { 764 | "name": "solAmount", 765 | "type": "u64", 766 | "index": false 767 | }, 768 | { 769 | "name": "tokenAmount", 770 | "type": "u64", 771 | "index": false 772 | }, 773 | { 774 | "name": "isBuy", 775 | "type": "bool", 776 | "index": false 777 | }, 778 | { 779 | "name": "user", 780 | "type": "pubkey", 781 | "index": false 782 | }, 783 | { 784 | "name": "timestamp", 785 | "type": "i64", 786 | "index": false 787 | }, 788 | { 789 | "name": "virtualSolReserves", 790 | "type": "u64", 791 | "index": false 792 | }, 793 | { 794 | "name": "virtualTokenReserves", 795 | "type": "u64", 796 | "index": false 797 | }, 798 | { 799 | "name": "realSolReserves", 800 | "type": "u64", 801 | "index": false 802 | }, 803 | { 804 | "name": "realTokenReserves", 805 | "type": "u64", 806 | "index": false 807 | } 808 | ] 809 | } 810 | }, 811 | { 812 | "name": "CompleteEvent", 813 | "type": { 814 | "kind": "struct", 815 | "fields": [ 816 | { 817 | "name": "user", 818 | "type": "pubkey", 819 | "index": false 820 | }, 821 | { 822 | "name": "mint", 823 | "type": "pubkey", 824 | "index": false 825 | }, 826 | { 827 | "name": "bondingCurve", 828 | "type": "pubkey", 829 | "index": false 830 | }, 831 | { 832 | "name": "timestamp", 833 | "type": "i64", 834 | "index": false 835 | } 836 | ] 837 | } 838 | }, 839 | { 840 | "name": "SetParamsEvent", 841 | "type": { 842 | "kind": "struct", 843 | "fields": [ 844 | { 845 | "name": "feeRecipient", 846 | "type": "pubkey", 847 | "index": false 848 | }, 849 | { 850 | "name": "initialVirtualTokenReserves", 851 | "type": "u64", 852 | "index": false 853 | }, 854 | { 855 | "name": "initialVirtualSolReserves", 856 | "type": "u64", 857 | "index": false 858 | }, 859 | { 860 | "name": "initialRealTokenReserves", 861 | "type": "u64", 862 | "index": false 863 | }, 864 | { 865 | "name": "tokenTotalSupply", 866 | "type": "u64", 867 | "index": false 868 | }, 869 | { 870 | "name": "feeBasisPoints", 871 | "type": "u64", 872 | "index": false 873 | } 874 | ] 875 | } 876 | } 877 | ], 878 | "errors": [ 879 | { 880 | "code": 6000, 881 | "name": "NotAuthorized", 882 | "msg": "The given account is not authorized to execute this instruction." 883 | }, 884 | { 885 | "code": 6001, 886 | "name": "AlreadyInitialized", 887 | "msg": "The program is already initialized." 888 | }, 889 | { 890 | "code": 6002, 891 | "name": "TooMuchSolRequired", 892 | "msg": "slippage: Too much SOL required to buy the given amount of tokens." 893 | }, 894 | { 895 | "code": 6003, 896 | "name": "TooLittleSolReceived", 897 | "msg": "slippage: Too little SOL received to sell the given amount of tokens." 898 | }, 899 | { 900 | "code": 6004, 901 | "name": "MintDoesNotMatchBondingCurve", 902 | "msg": "The mint does not match the bonding curve." 903 | }, 904 | { 905 | "code": 6005, 906 | "name": "BondingCurveComplete", 907 | "msg": "The bonding curve has completed and liquidity migrated to raydium." 908 | }, 909 | { 910 | "code": 6006, 911 | "name": "BondingCurveNotComplete", 912 | "msg": "The bonding curve has not completed." 913 | }, 914 | { 915 | "code": 6007, 916 | "name": "NotInitialized", 917 | "msg": "The program is not initialized." 918 | }, 919 | { 920 | "code": 6008, 921 | "name": "WithdrawTooFrequent", 922 | "msg": "Withdraw too frequent" 923 | } 924 | ] 925 | } 926 | -------------------------------------------------------------------------------- /Log/log.txt: -------------------------------------------------------------------------------- 1 | 2 | 1.000015002 Sol in Main Wallet 3 | Distributing SOL to wallets... 4 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 5 | 6 | EH7fShMoQWsbCpJ3BBGGn7ejxQMLNAdTLU1CXiQVcYzH has 0.057 sol 7 | FPAbKsHmYJqdPNRNYNtPs71hzb4TvAk7LY7ggRheKtGz has 0.037 sol 8 | 7Jt3xVVyrF4TAhFWmLe1cfdmeKCRG9Ks4wBFaWiT3K8F has 0.058 sol 9 | BS1oVJFVfDUQsNczbjFjhvHTdPkLEjvMJTewEspz8p7b has 0.058 sol 10 | GNviZMgARq5d8cGPyRbNW5gxoaoazkCRDVdSZKx9QLUM has 0.054 sol 11 | 3Dx9JmH2PHFsw3Rrz9J56Crd4KFiw9JHuoQkMa7RQEds has 0.05 sol 12 | J2pTZqcsTEFRWd9P3j7w56GiE2ZYarujL6PnR4T7mYwP has 0.043 sol 13 | G8FAf2pBCevK1DCCtVdd3oFYUTurs5XFtzzo1t7bcSV7 has 0.028 sol 14 | 72Z2ZTdajn1o4GNAQasUzxuEvYjCfe4mzJaxGFsvWcv1 has 0.045 sol 15 | 6vo4WcSbtHsymwVee5DrdQ7y1xrdh6nrqMSkiz3mo3sy has 0.048 sol 16 | DzDCmfSxZKQB5MWY7FHnzs8eDyYgpKgeSnMSj88m711f has 0.06 sol 17 | Dm3VVVnSxmk5XUGgzUye7dVjjN8CpVeupbhcsfM79mck has 0.036 sol 18 | H4jcL899jDh57UTNzRNdWDCUyVfKPjDhK7KXp9ZE3QeU has 0.044 sol 19 | 5PL78CbgJZDFgjSLngoADBY8hg55i3GdFjCUQEu1gGox has 0.018 sol 20 | FnxZjp7QTgeskzLrpCTN8ZdEPtdcBp1amKqLhZUwKwpc has 0.031 sol 21 | DKFVJN7tDcuQkNR9AKhfDZ75j3iqkzGCYwTu8aakKQ7s has 0.053 sol 22 | AZgJN8tDn8diwWqTMJCmjqBy4ApkKPAJT7Gxs43YdjEb has 0.058 sol 23 | 1R9jbeBMqwDMY1zcncCS3Eyk8jTcAia6xYvBwa1aoSX has 0.057 sol 24 | FPzG2CQeK68pmvrRcb24JUD2wXtq1anNPWhxEMwf7No5 has 0.024 sol 25 | 4rZagzKmfvLbfaYb2hHmb6XHBihYBDbt5531kDLWDTcR has 0.041 sol 26 | Success in distribution 27 | 28 | Creating LUT started 29 | Lookup Table Address created successfully! 30 | Please wait for about 10 seconds 31 | LUT Address: 6Kc6ox8W7YmbmSUSsGdZ5N83iLLjFp5613ExFHrHeAKA 32 | 33 | Successfully added wallet addresses. 34 | Adding atas for the token 3wkyVCBSt1pA9soATYcxC3WKbQJqP8qzd85aoW8Q17zK 35 | Base atas address num to extend: 20 36 | Successfully added base ata addresses. 37 | Successfully added main wallet address. 38 | Lookup Table Address extended successfully! 39 | Lookup Table Entries: https://explorer.solana.com/address/6Kc6ox8W7YmbmSUSsGdZ5N83iLLjFp5613ExFHrHeAKA/entries 40 | New Mint Address: https://solscan.io/account/3wkyVCBSt1pA9soATYcxC3WKbQJqP8qzd85aoW8Q17zK 41 | Create token and Buy jito signature: https://explorer.jito.wtf/bundle/2bRsLaZLiUY2xLThFczvzX5aJoHnhB2zg9cGyZowhmnTqSraw1CpcFrFEdCBfKXK1EN5PQvkUWH48ozW2dDLfnCQ 42 | Gathering wallets processing is ended! 43 | Gathering wallets processing is ended! 44 | Sell jito signature: https://explorer.jito.wtf/bundle/2qcjV5WPEZ8ufYeXqWHTLugwumXfMrkg7tbEwsj8QJyHoAXrFCvnMEr3h41suTNLBnutzUYjBTKkvpaP2pqvs7yW 45 | Wallet address & balance : FPAbKsHmYJqdPNRNYNtPs71hzb4TvAk7LY7ggRheKtGz, 0 46 | Wallet address & balance : EH7fShMoQWsbCpJ3BBGGn7ejxQMLNAdTLU1CXiQVcYzH, 0 47 | Wallet address & balance : 7Jt3xVVyrF4TAhFWmLe1cfdmeKCRG9Ks4wBFaWiT3K8F, 0 48 | Wallet address & balance : BS1oVJFVfDUQsNczbjFjhvHTdPkLEjvMJTewEspz8p7b, 0 49 | Wallet address & balance : GNviZMgARq5d8cGPyRbNW5gxoaoazkCRDVdSZKx9QLUM, 0 50 | Wallet address & balance : J2pTZqcsTEFRWd9P3j7w56GiE2ZYarujL6PnR4T7mYwP, 0 51 | Wallet address & balance : 3Dx9JmH2PHFsw3Rrz9J56Crd4KFiw9JHuoQkMa7RQEds, 0 52 | Wallet address & balance : G8FAf2pBCevK1DCCtVdd3oFYUTurs5XFtzzo1t7bcSV7, 0 53 | Wallet address & balance : 72Z2ZTdajn1o4GNAQasUzxuEvYjCfe4mzJaxGFsvWcv1, 0 54 | Wallet address & balance : 6vo4WcSbtHsymwVee5DrdQ7y1xrdh6nrqMSkiz3mo3sy, 0 55 | Wallet address & balance : DzDCmfSxZKQB5MWY7FHnzs8eDyYgpKgeSnMSj88m711f, 0 56 | Wallet address & balance : Dm3VVVnSxmk5XUGgzUye7dVjjN8CpVeupbhcsfM79mck, 0 57 | Wallet address & balance : H4jcL899jDh57UTNzRNdWDCUyVfKPjDhK7KXp9ZE3QeU, 0 58 | Wallet address & balance : 5PL78CbgJZDFgjSLngoADBY8hg55i3GdFjCUQEu1gGox, 0 59 | Wallet address & balance : FnxZjp7QTgeskzLrpCTN8ZdEPtdcBp1amKqLhZUwKwpc, 0 60 | Wallet address & balance : DKFVJN7tDcuQkNR9AKhfDZ75j3iqkzGCYwTu8aakKQ7s, 0 61 | Wallet address & balance : AZgJN8tDn8diwWqTMJCmjqBy4ApkKPAJT7Gxs43YdjEb, 0 62 | Wallet address & balance : 1R9jbeBMqwDMY1zcncCS3Eyk8jTcAia6xYvBwa1aoSX, 0 63 | Wallet address & balance : 4rZagzKmfvLbfaYb2hHmb6XHBihYBDbt5531kDLWDTcR, 0 64 | Wallet address & balance : FPzG2CQeK68pmvrRcb24JUD2wXtq1anNPWhxEMwf7No5, 0 65 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/5WrYE8QVsAooQiPQqyQkypJPv7ad5oQxd7tDdKwVfKJkck2eQCghi4gCBDC7rLZMgZszNYZL4qkihgkYxHrSLFQk 66 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/5qR7qVrGCt31m16K13KVE6UQr1kFxf1yropj9YnWZmrj7Gr9fB4XfVjGLaoQHWJ2UxCPLPTQ5UsrFPsnCfX8UpJn 67 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/2D3JjY1Ph3a9HcwCzwCL2u5xDxm89QLZ7c7w1ec2y4WYTww6Zf2Sa2kCW9KV1SnnV31rp73mk8SJyAUqbFhugWrA 68 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/3zGoUPFdNNrcuUnmm76Zmvd9zaCYRQ9rnKMfeDQCfdsJwpXMyaVQHak1v1bmmXJxwbC3Fi7V5JL1MWTSEQxF2cG8 69 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/2m7s2WgxPhkFTzHgtVSXAtZ4X3wPZEeFiUJpvhqX1mTXKQHMntjojomEThyZxXFGCKkq7iqgjKiKr56ZMw9iVkGX 70 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/L1YuYxWGbKoyL5LDsqKNF417wH8zbPUPgaz5rU8JWETQkswS37V9uJXKPz6ur96JYeFYwkvyJ6VaxCAqyESbkTQ 71 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/Dg1g9RThhJUv9NpvJd3XZCtkLK4N5z7x7Fj4X3JjYhxWBwdpbwUe9RzLGuHZzGDnSWn6BbjH4oqS4Uusga9wzD4 72 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/3w522BecdeveatMN6Aakro3Ff3SXFVG4L3Q32TuTFRWnqNockH9tthLrtcrSx6SxCSE6GzqrocSw78m2Nj2LVpKe 73 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/27gX35N1cGtHAJAnTYkGQR1aBSB2EW41aVmapQsg2cWLGiqs8jn7FTqRgTmjv78yffQdRo5PNAAaX3f4qAPjRz87 74 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/84JLPjwUKQKXiZhFF6p8p5mRwnoutvNG23DLT7Czx3hZLc4sFgtfepHeNAfNRFXCaRXbJCZoLmLaXwPvusEahy7 75 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/5ZgLJ45Luv9QbvzuKPFgszqbDjYAurXTBfCN6ZuMKinjb5yf2ohoh6WwQgEHGDVkei6YupLPMocrTBapAbUfqaos 76 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/5XJYLVe3nazdc1LpPdGRfmv8rJWfJv4onASWFMXjYcY9w8y2io4cBxmFhZ8TQYsB3N7FFXe46ZnzsuEswybqeMPy 77 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/2UK8GeV5Z6LXXoywh3ERPHZfSufwzHGVwrqT6BYDkbGhN6BU6eDkCGvW6NpZgE8rfENycQHS2Z1tjJvrBf4HMjey 78 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/3YFrxXNARyGPFkEubebT5yVfWVvbNmmznM92Pt2RZhKRTD35cmsLWEXw2wMpriURtqgGCZFuFDzyDR6LZ4KAuRc6 79 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/4oz1KokuYwsF6QKhFjEP8ri3fpBjBoAduPFxaFHMm7N2yqPiZrFVRLjZoBMYqjJdgM6v3YSHF8u5fgAB4bvFuFyz 80 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/2qVcMRtxRmkvVTbH4ZbPwQcmAW8yW1bAhSuuEpCGfqXMJsuQdbsy4nFe9EeTqz7jjcq8gX3ePGALmGgnDKuzyn7C 81 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/2NqKhwZdnoYiRS83XCX6bkNdgstv6jByknDyXoZ559xKJM5NYgsS4BWYeadhnozgi1iFLeVncBL2djR3XdfAHStY 82 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/3hwYvRMU4s28up7o2fPPHRrMx7G3wTEuL4oniMTDsMCHGtr4tj1qhx3XfnaogZvVi577Lqsq9ZrczaGaZfVnkBK2 83 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/MzrsVTpyV5NKWJNvRVHUHFJ3aY31SKLDni9QH1Vvj5XUndsBsYyvwbrQgfgxii87mNWjncYcqr2cwc9VqEEmcwA 84 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/61P9tDBK134Faf9m71rnK4oVuBbjXLnd1RGca2AJ9Mio9P6LrJ8SE6KnpSAyt2ioVmzoFbTZWjvC9SBX2g4zqkfq 85 | Gathering wallets processing is ended! 86 | Gathering wallets processing is ended! 87 | Gathering wallets processing is ended! 88 | 0.2 Sol in Main Wallet 89 | Distributing SOL to wallets... 90 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 91 | 92 | 9pAxbe7XiGxkuiZham5uvrEGAff4pa5RR6EJ3jwehNm5 has 0.009 sol 93 | DM51bsrgLtCaVkwWrVgyHs9BmAc44eo56Biz2KaqMstL has 0.007 sol 94 | F2PTvWmENU4Xy43uZy5rmSRi5EcnYXWsKqF9YiKSa51P has 0.009 sol 95 | EUBATZYKkPgf2VN6mU3PMv7TdjLSuGpuyL4xCyiQBAes has 0.005 sol 96 | BswQbLmuKBC9n1Pc28RfZWvioWs3obrAhBZUf7nrVCCj has 0.007 sol 97 | G82VJ3BFdazXykMWZa56xcaiM1REDvrMMtaf7bU7iX2Y has 0.009 sol 98 | 2Z6NjRY7UsNn6z9TtawUcLcZas8hx2uMco6w2RhuTwGv has 0.007 sol 99 | 3XuPf9edqrBwN2PjVSdHBKV923FX5r9GWFWMiCTFkkWm has 0.009 sol 100 | Cd6Y94P4AXs9GYkLWWn2782tiu7y54AQW4N2TD1HM8Dp has 0.009 sol 101 | 7ySdvERpamNZHMiJWRThZxWuJRG5wCVfLY9oWcpHsbub has 0.009 sol 102 | 9MqcAvHWhU3puHyULHjgkEWU3HevcBGSseu3RE8TG4A4 has 0.008 sol 103 | H4FXHBQubNMpoCir62UTdbE7m4stWd8fbXrQ8qTjNvAE has 0.009 sol 104 | B4UfSxwFyLeQwBKkihLLx3d3eRq1x8CsTyyB4DwkKuo4 has 0.006 sol 105 | CcJgQh6GtS1NYUS2sENKWdAbvJrqpE5eNe1DMHEFkzpm has 0.009 sol 106 | 6NFErd7RxVQExgM6Rxb4UpnXGwWqCRigMWWhJ1ADGkjJ has 0.007 sol 107 | 5j14ssmrMrARK8ZGHSYv668SkrGSMZ9LL8E7p5nzgmnz has 0.009 sol 108 | 9aJJD3tHbd97vLTWtAoeJJjVFbp6giDsvNUxGJouSjme has 0.009 sol 109 | 7XHv74aSBEjpmDZjhvti2Zj3DyA1boRbaVtFUQwgz8Gu has 0.009 sol 110 | DBz8jHZKsWFYpGxszeuNDPt1qpkLfCkeizDkC5FUqkSS has 0.008 sol 111 | BsA9ooLm2MunWQyuKymfwPNcHinkHhAyzwTkNiasopDj has 0.006 sol 112 | Success in distribution 113 | 114 | Creating LUT started 115 | Error in creating Lookuptable. Retrying. 116 | Error in creating Lookuptable. Retrying. 117 | Error in creating Lookuptable. Retrying. 118 | Error in creating Lookuptable. Retrying. 119 | Error in creating Lookuptable. Retrying. 120 | Error in creating Lookuptable. Retrying. 121 | LUT creation failed, Exiting... 122 | Lut createion failed 123 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/5kSQEHX82nQFHSyTdcJcbMpKZMRNQSWY2yLz6Bpt6RWcHik7KkY91s3BaLNWxESFU7qgRsmMGZcnh6RXhBv9RBfd 124 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/5na5pTNDR9Z3cNvoC8HBsQu4nuDghB1EwpsxDsR35J3dE94mZC1DRAdwzP3H9RicXRG3p5qtyfMBj6eAktQzsXyS 125 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/cPTJCdmv6SqYJd5bRxmcHjr9YFc3Fgnpga5xveZw8yVD3bLSKep7sR469RASkUfHv72S1xUzVxDLcmosPyHYAZk 126 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/4ZpwKMgq8ZBSVRZRQaiupX6uEbqoh4hjvj4AadnSorzhWD5rX2qwwpwD8ruqVYt5SSjNzvRaRrhHonmNPeWSUdpj 127 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/5LjUuy2pmdRmpTuNx6pwPmFZPMUwcuyLKjcgpZK89KanNQWXGHBczvBzmweLFmASYL4vxhfDyTN9La5yKTFq1Nfq 128 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/5FT9sew5LzQ7hnaVYYmdojqBzjpWL6agXbrukurtye13BdtZWWkTgQwRtS8CEDjGi5bNw8MWUgxwdyGZjr1ZjLeb 129 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/YkYEtMkUrWwYucuEBLrzH3YHWdizugoQTQmk8rDZsJK5Ms6NBCSMtPJea9jM2EjtLrFaRe8J6NZmUnePD63kjF2 130 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/5uMwYnun5PXEnaNTADbbo5o4Nb6N3WEKQQMEVNLznopfzeNiUD7269w4Fn7koP4UiPcrCZLEMJyoXKoCZbhpnJUB 131 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/43m45DoXxHkdksibxMFG9kPQvZNvjEZNWjUP5FSouTkB1XUHbYwekZNnQwivHUhfhDGQmpm6wLchPc1VMkz5Vu4A 132 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/2B79XDefcAs3UkDvLCY2bWPhe4Tcyxbv1sf51u4TL8MKGy2VsDTiz7CAvWyEQ4obU9P3MnYSBa3VHhu1CgEgnjZ5 133 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/4coBWCkhDK3LpwNGDLpGy4AGpkX13xHsdXSZ3Hkt5vUeXAsVMmR4M7YLCMEGMjW35SpjWpgqhS7UBqP56ZGd5e1F 134 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/5gmKR8ftrXp6xD9h9bQQURPHpZSYboCKvrvhhfsmK6ei4DyPyL8YpV6Kayz8vwDbteRDXohd5S9Evkn3cAyiHZCv 135 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/2d2H7Vt2Q9qcUR2D4HBZPQXbmbzzH811ozLMTvDE77qhWfE2tb8jAjJWPcB7MjaZbeDc31Z64CRzFbVj98ciYYxv 136 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/23VdcWm8pHLb31oDyo5797dsrxxoq7RkfeKgQJBxWiz8xqL1z4bLBsrHWvTJDNcaHg1UZaemmzWEYPcvbYhgiWnj 137 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/61xmZCiiHhVkq5zfb1ThSBg5Nbe9z9awfhugX3kKUj8gjTUaYqLdjNh6vmmPP7Sfwd9qtcaLVKTu5P8LiezBGoPu 138 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/3TypSybVzphcoN5ghiiyt7D8o55f33peMeWga15mPy9X5b57ZjVvAJLoWzo3RCXdd9S82vnesL6iynrjyq9wBMe 139 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/KDh17qwPhkrtGNKM7NV2v9DJetRQAYV3vxD5QFK5FsND384974ND7n2ADGafWkgPB3bFjh8uacAe6QgSsWt3r7k 140 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/3gGm7ZycincSNug5Bpx3mJPX9hpxa3uBDq454VmXCHGvPARtMewSwcum2T6n9VLTWnnqHMDqAks3PWVkxBDSy3gT 141 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/2K4HREJdd7RcgKec6NN7qYjCNgYQ515Znm78YvvQaHFPVzwkSthW7dYess5zifgcMLhTqr1Y6mtB74Y4E6wtkTge 142 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/36o7esDGHjXHj6gBqNzmiWBUT8de3tXW5MiD71aA2JFxZFdVskTnSUF4LVTuEB5yTLzEcX6626Yu4xHc7JSKUphe 143 | Gathering wallets processing is ended! 144 | Main Wallet 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc has 0.198171666 sol 145 | External Wallet: x5sxY9LXBe7TefWVpD1iXpoBUoJoynmRW3vubzhoqCB RemainAmount 0.1 146 | 0.09817166599999999 sol transfering to ExternalWallet from MainWallet is successful. 147 | 0.198095 Sol in Main Wallet 148 | Distributing SOL to wallets... 149 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 150 | 151 | CsuQYVuFrJh1NBhsDppZ8Mh7Gi1unVg7pZEZcHZRaerM has 0.008 sol 152 | FhUaXbqS12Qm9KM3mDuEETZRaaj9gvK5ErriGvUpfLHt has 0.009 sol 153 | CtazEwftnZ7dY1ABdcVmE4G8vBZSjaE8BdvYLrwGNMvZ has 0.009 sol 154 | 5KHwVZFPmwUwnZhTmWNQimFqorVfx1HggpN49hxodmPF has 0.008 sol 155 | D9HGN6qo8m2TtWDYowrZHrZ6Vzgho5a9e5zW6rPZgK3R has 0.008 sol 156 | EoXx17g8xzAdU1opngoujGQ2bpfQKgvhdQhPWR6Wn145 has 0.005 sol 157 | AzUPgev4A78AfgFxJ7MBdL7zkdx2YbdLNCxfTgQf4NoG has 0.006 sol 158 | 2y5MAmnfLU9edAQqSnZ7QdB4WggfXCNCw1ZeJnxGB9sR has 0.009 sol 159 | 4eG7yhLuoGbkKwVn4LS1gW2TbWCCmKQgeyx76RAcW3qd has 0.009 sol 160 | HrESDutYEHN2ePstX3XF7iYwytDKRHg2uS7sjG8PMymY has 0.009 sol 161 | 7a45wmZggMHR2QPPk8iYapRcn7eK11wmcBYhBV9QXyJ8 has 0.009 sol 162 | 6BGUMEqts4cQ2kJm74RysJCKvUnQQZAEWfZ4wz9YoMXf has 0.008 sol 163 | 3Ps1C8GRcC2ctBHWVDCRNMzf6amJfdnnnzqfcRtfqGDq has 0.009 sol 164 | BcmS3szpw8CYMrb5NCjMSap3WPjuuRqEXQW3uPkY6hDT has 0.007 sol 165 | DLbMXn5tax4vwypyHFNtf7rP7bjdaUr6foCkR3757GSP has 0.008 sol 166 | C4Db2UYRQEGE7D5NdH2u781NbtemPf3xeNyKhEfKREkJ has 0.007 sol 167 | AjxeshXMQerrGUCqASYb6HhPc8YP4Br5Z1YyrHu79hWU has 0.007 sol 168 | Ajr5qZLeqBcB97DKPDQ9bwMZHWydGHNCK81xhCPHxUPv has 0.007 sol 169 | 73X9ctcNBL2oMQ3h8NUkVeMwcR343DJaoX7wZLtqxQQ4 has 0.009 sol 170 | C4yzL51EQZdKZkwq8iKyi7DPB8kuphNjkuxCANYjQxBp has 0.009 sol 171 | Success in distribution 172 | 173 | Creating LUT started 174 | Error in creating Lookuptable. Retrying. 175 | Error in creating Lookuptable. Retrying. 176 | Lookup Table Address created successfully! 177 | LUT Address: 45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy 178 | 179 | Successfully added wallet addresses. 180 | Adding atas for the token 7KTApLGwZ4wkeUtbnLYQrFZ4KkbmYwc3AVk8oj4LPBAr 181 | Base atas address num to extend: 20 182 | Successfully added base ata addresses. 183 | Successfully added main wallet address. 184 | Lookup Table Address extended successfully! 185 | Lookup Table Entries: https://explorer.solana.com/address/45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy/entries 186 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/3NVZ5Wr7tpEnYeJ4yknUV2SG6tafNmgWRSD6Si14YCx55kNAKkxxyfeuCx3KsoYi99ZKAp2wxh5hr56nDFPYjddL 187 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/5JqFW6zrvuya9kgLYmuXYooZNWzTxhVkcDfKbRFcbT5sMXJW9ZC74VH1AN95ukeEuLZxtoKgFjgMvqJbudLDzVRS 188 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/3JYcb6rVDYNh7sqEdpRmE5LwMCYmLSVowHVUs181LR4DVwwhNPE72nXhL4iTeiHCMvd5aJWiNLLwqB9m4GvER9qQ 189 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/4Qh4SKkzN4FWVU1QtPtH5S5nSQRih4FcACe3qLeFhfjaAMycscmzkTRf6m47BbESyW1GDaH3kccdfz94KL9SnigH 190 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/4wXT8Xb3dwMQcdY6tvzMHDDD9cGENy3NfHbm3KGDA8LxEaYTJdyZL8mAX8aWe1xbQtEMh2AsWKhZdhnzCBxG7T7 191 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/5EzryWavr7n1RTGxXzopNxtiHsPNtgebJ6mr2pLtKoMACNuoZX7gQQC8i9XLL5iC41VsZxfPV7RoQ8HcHpKSoFi5 192 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/2BT8uiKjFEGmbG1pKS93zRvgUyUTkiriiq5pBx1McQSKrLoXHXzP4b1XLUjhJXreKA9Dpmawb64VNM2xpRwYDF9x 193 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/4B1UsnX95BzLhfA8f5FiUdjA1nSatLgNZtLGdLShLGvwnEPTrow5rhK7ajdRsSX9BSLuxxDWNikLNh8TvE1qdHe9 194 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/4147LhYhz3dTPk4zZa7ooAKMQVcVnuXr1hrm8p8mg9KYuvVWtbeUzCVRv5EPKoecuJHWrhAVRo9LkKMmiUup8jV3 195 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/58os5WdREuvvcKWoMYsVwk6N7VyjRvrqPTNsisyRPqw7b24Htxy3Eduopt2VFY3nHvLKRpTeAhWqDaUu9Jp7LGqG 196 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/xexsw3Qk9TkvEPi5UQWRyqg7UX5fzNzN3GKoqw7Ttv5P1d2ceaeREhiD3Js11YLKFZVW5NAydCHRkvg5xud9oyR 197 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/2wBGtk1xAQZbTLiTku6jHXdjrYvsQqzyfKyBeap9aLYESm2DHyYb9idwLmzNpumQ5S5RQsRxqsXRWkyUDfuLdN6U 198 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/586CoMjM4GNqLgwRy8JgwVAoKZWDojry8ozpGBJEBfk2fS8noj4buoBDfgA7dxYVVA4ixuh3GodSbU7ZqkZ8hjWe 199 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/5J66Vy4TuKCEtzKrTs1JrZa8up3FhgEXctyVpSRoor2HsUf47dvwa6CAzRHA4Hr5TwnhAhUuoVudo96e2jLZDvDU 200 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/4E922th6pS6a68PSnDcZkLBhPQdkyk8Ki16Jin4cYaMcwRFZhcqU4iBdjCiSNu9rS5Fa4HjzY7ZwDgjDwnQcpFDo 201 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/gh4ZEaaBEqqzZieJHPVfBBbXhwgYGutkS9XyoMwLz9TXufK54sG5gy9XEjBCThEmZefnrBtyhQYuRimiLFAZvzT 202 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/GwQtV9dseV48wkZKu8zP66Vji2vdXNUZg3p1tM5ozwmuGMwYnb4JouzUBi8fR2LgRDqsPirVSDo692zyQERU59C 203 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/3Z9tEx5BpQEwtfKHHAwREnWjSYfJpugg3AoADGRFwN1GKnu9NuCMJZ3tMmHaWQCURVCrCpAMymbAbrjDbwwrJgGt 204 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/QtbpxhLDVWs8VwrQPnyVW1YohW95pfNEQSWR1AzV1VGiawL8ymkGLTpPvioXCzhSpjmhotdy2N7cwH3xm9BMVbX 205 | Gathering wallets processing is ended! 206 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/4bWPVAkgdZF57cMjyfJKGrMypSYs4gTKHbMfZucs53AwfJ4DsNpBDW2VTqnSopqC7FZYZjfyPjovEZKQbgo6z9rG 207 | Gathering wallets processing is ended! 208 | 0.183302745 Sol in Main Wallet 209 | Distributing SOL to wallets... 210 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 211 | 212 | Dix34fXs7M2Y3j3pGTaMHsVm8C3kZmfE2p6yYimeLZ6s has 0.008 sol 213 | J9xoHPiWLJRh9nanktzj2BJPEfFUYq15B35Tu8nyAw3v has 0.009 sol 214 | BM2WHEgeuvUsPgF1dTZKePKmS3Y5i6TmeKJZ5eAjpPCb has 0.009 sol 215 | 2ijZbVSCSoXAQCdJhzJQJvoSkYcv595i7PbjfprYe25h has 0.009 sol 216 | FzgYfeoJsmZdgsQAEyDwzqb9khsTVYS8aQwfAgdgqhVR has 0.005 sol 217 | 8TkrDvGpn9iJpVdUShgGMbyXxuBFXY4VwnKxXNCRTZhF has 0.009 sol 218 | GGd8uthCRZzZqtTZDGMhvj6rBhhFL1E5JFNWw8ED5EPg has 0.009 sol 219 | 9kR9eAgpmUovLSNU3HMcuGW7mcPtShAQeLSXG5EsPNXv has 0.008 sol 220 | 3KVnUYCyoeWckQUBu9ttdNCTmtzmWUfAPnawzUGvNzmJ has 0.008 sol 221 | 9VeW7eof19VwcGxKkHvS97UgtHuT3GP5FsiyYxG1L4r6 has 0.009 sol 222 | Eag1GR1H6V2z4iVBfTZfP7r8qzcrS8iVdvoJKxsaDVEw has 0.009 sol 223 | 63AQk61JKYgR97DWJ4Gjxqwg5uNTkd7nPWLvALYrtCmZ has 0.008 sol 224 | GRjZBu8DZmEjrmmgD2X8woWCagnn9kXkyvjy2yss9psr has 0.005 sol 225 | ESGdrVDMHrjtGJ1aUswLYKdMKr5JGSnEdSww3MKt686B has 0.008 sol 226 | 639VpmMSApN6YfLi1veqD8PsVEjyBpH6X5oT6ucVxAWv has 0.009 sol 227 | Gbip7XHNttgtexyfJGxeYiCPy3ZtgavMgn8kpcub2tdF has 0.006 sol 228 | 85mw2aMF4c9EUbTqZ5kQTqGdNDKPgn4AFDVCJToX39mf has 0.005 sol 229 | 5tJtGspEat71rJBMUUTxom7L6PgYvuUrcqwVkpMNGMrx has 0.007 sol 230 | HnmkYexgWH2JzQwgy34zQbzud7gdPpPbzkGy1hFUr3Fr has 0.006 sol 231 | CLXARxsm1VJqbdBYwmKZ5dxH5bLuMNFWMc9jdJ7Q6ABq has 0.004 sol 232 | Success in distribution 233 | 234 | Creating LUT started 235 | LUT Address: 45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy 236 | 237 | Successfully added wallet addresses. 238 | Adding atas for the token HME2Z9d4SMVFfesFysFPiuZyvS9gn5epaMgk98zKyfrE 239 | Base atas address num to extend: 20 240 | Successfully added base ata addresses. 241 | Successfully added main wallet address. 242 | Lookup Table Address extended successfully! 243 | Lookup Table Entries: https://explorer.solana.com/address/45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy/entries 244 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/24Z6EwP5G582CQbL8hScy6KvBWMg7AKRY1wzrxj331Wb1bxoHnVWL6wCdkPMduWdu6XdGy6BYRZM8PErkCAgJ6dy 245 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/47QxnJRg6sCrrcDcff6QbAR7miS2eztjiJF8dXn3JcaDuPbGJUvjBpo4EoKnmG6tD73Uo3cyi2g2xjRJnkYfN2Rd 246 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/3SZhsNjMFnZDAXuz2gKFGAc1Tj8vjYiydFPg2bAkAV6T5C7vgWTozavRWgykzWpPhX527Xa55y8RbiQFKK2MkAMk 247 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/523Pdzuk49hSv4j837tQzbgYiNNZoWiFhLiXFnyNmJjdU6c9oxNyjDF2t8o2bSSRTFgaVyUTnq8jaThA54UzVUxr 248 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/3XfoZX42QVMH5kHuXJwvqwdbC1oXRSQigN9ixv2xoNxVNhKFR3JTE8YqrSFAiW2HioxRHksyzishgbYGE5BU77fy 249 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/519dbd2KKiEn3XQyvq7U7abovdHRcUPvy3yF1kkN7f4MEKMnpWWRTSw63Ba4YxupesthRynpeVeJosKpBXAgG8cu 250 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/632urYRikFFi6c4LLtFWxsqYV4nNkiuGZefbo3VSgECuM5sY5ENkXdsbJBg5jk22F8WHd8BCR3Hf76odqhFoLdLG 251 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/2rGW81ycv218LyisHj8BkXS9ojp1or3ckQ34ZAPeQyTaw2RfEMqZv6BTf671Qx8zuGvEe9rqKf8N7fJda2mgKjWN 252 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/3kJYv1e1uW2nxyJPYwJy6R6GW26WbFMruJ6JL2wrc9FQ14FVUiWbNnSpu5raTVvLDEWvPqt7ZrVU2AWBQatWKgUv 253 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/5NCv3ppLf7ERn4eMbRDtrJsKEDrD5j1s3xNqeDsjweKALkP4PAT1tL9sWRaK5GpWfVhpseWUiJNqvTL3Hiss1NBr 254 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/3vjAqqhvRyt8kp7FZbSymQnazwE3RqSzQwnxV2kHi6f7Cr5XAKkvmVkCogn2ArPgd5brGqZvCopG4m8tdaXdK19d 255 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/25N3SeCo7w5HJ1vuax3zJ9PfMckWzvQmBjwVcNFzJm9DUuSTLL8KxtqT71v6SjYwYhX3RKNZZzpWY7ctWEjDFGgn 256 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/5rZU8i4z2YPbk1bY19S5AKcDKH35ZsJPeujchD2tTT1p92af7aGo19QqsGKKz6VbDgpSMQMmDCU9s33EJpieF7NB 257 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/jstR4dUphYbCisexaQWapvDHC9VZsmL3uYjMcUnwJDeQgCX2X3Ys724Pj2ikbfLhwBdudJHr7YqizoLzGHv2mUA 258 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/tAwXpcEuSh9wwKdFP5WjBDcDKedcB6GE4Mgen4goQQDgXz3a8tfrWYSqC6y7VEeGcb4Rj4MHUDEGoKMPXviGBr5 259 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/3Yk7cvgSqbwwp64XWiMu86ftZWrRKUqReGX8qtCuXMVawPj7bbeFkaqHGQw8HahpJDFuoD5ToKPdLJyzWFFhFEpe 260 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/5j44ai9mGyNASVJNutCceGCVSWMtrB5RdGrtvrHMMbYD7HxrYmkvQs98L7pgUsszFd5yj6ny1nXLhnmYrXEEayPM 261 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/3dfj71Br9vQnn8eQvYwJ4Dau8FcSXpQbd9CnC746vXmEckeemFhrCDNJ5bGQurrXWDPTEgdT386sCsj5z1ma5PUW 262 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/5itYf8zxcPzHS1uU487eyGyRsK2hCTW1YejWA4eAKwa9qDCTx93raej2biBvSDSAHB6v2vux3xsjj9pTtpryLbJ8 263 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/2VJffE3BukbYw46NKePQCWyxLEDevBSzM5Y3qWGtDFcGjpfXbswXYrADvivBLmnELsZxonhdmPR9cea9LrS59zrC 264 | Gathering wallets processing is ended! 265 | Gathering wallets processing is ended! 266 | 0.169962797 Sol in Main Wallet 267 | Distributing SOL to wallets... 268 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 269 | 270 | 7a7hPawtisFJHPKiwyDpXT4AaeD2U5raPmGpb8wtQ9fB has 0.007 sol 271 | GzPh7HWHmLC5dfHE4QAenxufhoFJA8oGXvX4AhkbL2yR has 0.008 sol 272 | BesotgP17w93i1pipA3YwBTR339yhsjeSHRUUMWAQmGd has 0.007 sol 273 | AgtQJEaYC1Y2rxyyLJKgnmMHUJMWNemrCtPq8veRAP8R has 0.009 sol 274 | 4pyBVpJpZMbxfSrCyyzPwyJQYr536uo945Uzpz4YLnZG has 0.007 sol 275 | 23GQWWfqATU96omnh2hFFEnhjgM6sLFisuR44miJ6n7j has 0.009 sol 276 | EUT4vAScR9qWnaKSLPyg5jNN1pMPe64EBHMsFMMEoBoK has 0.007 sol 277 | 3zyUypUgBmeuLPmHjVhSnMRzQjutwhG2RDu8VMjso5EA has 0.009 sol 278 | 2pUYWg2PZkkSZMWnFxdtQLsLsndbwuV6p1AUaXpW2u4M has 0.005 sol 279 | 7d4d5UCtUSAmcnEC7XiUWCFFE9ZrxAGtxHLzkhRiwFog has 0.009 sol 280 | FbhwJCx49ErWNVQ2HpiD21Q4y8S52yKCcu5GUrGDsygZ has 0.008 sol 281 | iMuRDErsBS63oMLRYULVr5txUMmQCqFhUwZjSyf9gJ2 has 0.008 sol 282 | GoArSiybYCmotWBVkZqi8k9XyX3on7eGhjNiCTfEMLuq has 0.008 sol 283 | GHK9rsiF7QogMwwEQhayShCUu2Dx4zWYKvMGDr9PoNTW has 0.008 sol 284 | 3Sw4HxmvYD7ZyBUGN5RA6ndRwME38faHf2QddmTcoJsM has 0.007 sol 285 | AjhnvigVrEnGj7rJfLhejDNaHykTDsEu4TjbQFqMDYgX has 0.007 sol 286 | 2rTYxXxJXDATrBQMaXwaD9RWYhrwWSnGQ6Mu7o2CuBYr has 0.009 sol 287 | Jo8en4H8CyXTaR8ksHUkyZ1dHsGAtb7SJGC8mP6VH5A has 0.006 sol 288 | 6besq7A7oCpgVi77x9xucNBBosEqCkJ7pQYtcsVHyMMv has 0.008 sol 289 | 4CMRiGg96QUhRP6Cay5DxQ61Ut1X7T2cCUaAL9wRBdD2 has 0.004 sol 290 | Success in distribution 291 | 292 | Creating LUT started 293 | LUT Address: 45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy 294 | 295 | Successfully added wallet addresses. 296 | Adding atas for the token 6ZHH9SAqJnast4KDpZj9nkfAnqdEB5ScN6eA7rrzn62k 297 | Base atas address num to extend: 20 298 | Successfully added base ata addresses. 299 | Successfully added main wallet address. 300 | Lookup Table Address extended successfully! 301 | Lookup Table Entries: https://explorer.solana.com/address/45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy/entries 302 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/vV9mrRdrqqjashWRjb15M82h9gXRtCAqYfD8mZ4PNV14JaokgUVTe41w7KTPdoiNXzpj8vbKv1DTwztR4p3w7xE 303 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/2eDhHGtKVNASCk8cfRD3SdS2FJVUZfzhzPZcuBpNXkrcDRuUhNsxnZsWbPNYFMqS1jMiNGRmpZ4T5NdmpJErv6r9 304 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/3ZVveieaU5BKgG7nKxm2y5cutE2Zwt4xcRsLUAH3mQV3VNMUPz2badsaqNEMQmkouq5CGKZxbmzJL729zVXVhQeq 305 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/5hP46nYregvy5HFqhhiqbVDsxHeBJuKeQV2HZGj5MApzKataTzbCE33BaLvaAFrGuZKyhgCCbEiv3mgTUHQ6L3jF 306 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/2xNsPsWaaN3suK5wYd4kLNC1mZ8wNKAz1oodTo6gFEvoXduPFumo2tREm1fEYZKTmPFT5ZwpsGaL3Gezbq4e3xbW 307 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/3fdpkWRvXbP3UnCrJwx7P5t13T9t71Ci29hvzuXWwScPovuGkpcnCFXkyoBPNwh7x91enZQnuiRbSp7qBj3amRNs 308 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/3qhA63W85fruyGkzgVtT7JbSbemGGpxXHS88KywHhLBtKCVcuMfM8zmSznabB2VYsrERdVZ4NnbzzFtKEpt6khnD 309 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/4KFZGu6FUMnukfo2s7P31dvjV1Bi7CRvAnPvyujaXR85H1MN1QAaHiD6CPcJVkwyHr5pUkSK3jcc7h1yqvuHz5NG 310 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/3vaWsgSHxepjHf7DBKAW8sT7SJEnatqDzuPxKbu1pQU6B5mBw4Yym8jAxZb6wLzBTTRuQzgrqrtZBxM5vvBRzTui 311 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/AuudrdyiUCDRyXv9NLmnNL66fyBaztGxmKr6CfUk3MPagLzk7kNd9hJmMT742bLpqoowBjaKgbnVPxhqBDnK92A 312 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/3tYmgUDB4w8a7dM5bdrbZiPmx7RMYTzQMuAhb76SUBnxhNrwnvmQMDYdFD3vf583Wub2mPSycDacGuPpFPhjxTWH 313 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/3equ7VQ32XdsxVTQBCQr2nVyfEvCFCu45AWLsipNk79YWsUc7ULTNz3VFNrrvUXtpKGuYaX4tZ2Zs4AudgSACT8W 314 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/5d99zXJMVg7uTcPQXyLSBcTznNnUuU2eZ2ZMW6FhtckygEJbvbxTofNoEhfYxY9zAqwU5tfXG2UDmBd4CZsj53yP 315 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/4pwZhbxxQEwxWU6HoRAfUa1RWV1mAAxh5nzLe5Ui8ZY9b1JQCp1XUgRUra6rPpbL3V6Ktr7t6kKxJ8r26Jb6zkWy 316 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/2YxTJwaRDuCdqFCWreRCycVM8vmAM93W95VuQYyNiEpNDCLsnimo1ycww9E1iZZdm5pUC7125oTCEpSsuk7zPoEP 317 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/5p5QRFdRSaU51QziAT7cWUD3X1o6BvsUYvyPFCRFmHLsYshACe6EQscN4oc51z1uQue64Xekf4yDtUVXfh7uwFja 318 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/3y2k748R9qdkxhJ6Lgh8FXK5b5aQXYBLgCquci9UaVzwf5aXVjhCv3namJajAPcFFC5mtudEEC3hwArRueYB81ji 319 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/58o29BB8eYDbb7YQn9RHKYAd7WCFGNqBzVeVC5XAipeVMQusJB9o1srZGBgvZyV5DAuBrfYuvw7Lnd8y2ZHCYPyw 320 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/29Sd8gqPPGHmgQeKvaFNniwMZ8fA8PpfCuFAw1G43TCEDfK9gt38qtiKrEqE9Go6ncVnbsMNMzwBqCpwULRSSkdZ 321 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/4cCutzPDsCJFTQfbiWtCKvXHziJucqsXyrknK4zyB22aDGSs3nd16nUvicHaK7bStbF3ijhSEsaSTJZxKG6Bszau 322 | Gathering wallets processing is ended! 323 | Gathering wallets processing is ended! 324 | 0.183488494 Sol in Main Wallet 325 | Distributing SOL to wallets... 326 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 327 | 328 | Ajku6R5qCmKmTQ8tnWokmaF2hutzYrP3uqJnbw9gjJP2 has 0.009 sol 329 | BYHq8qRNebcAWtVgPLkt9ezM1k7F9m98hrHBgMZkg5Ua has 0.009 sol 330 | 2xYL6i9HMRkYaTzM1PF2p7zp3KG4mY9TSUFRwXhR4CQg has 0.008 sol 331 | Ddy4YAMfx1PuepAXsEoNvnwomiooYTDa5sgL5T1k4BFb has 0.007 sol 332 | 9nGogZ4AtmYCTDMhfMkXDhj4Caft6CDea61PfMr4LJ1w has 0.008 sol 333 | 6W8jmzdTAxa23HGmhvFZPEFsbi6xLNmghFe5CQdzNKJW has 0.004 sol 334 | BwKNJYbMBbTCJVNZjYrz9dpPvXuQKrrUoy74Jg2aEpi6 has 0.007 sol 335 | gVHNJevbXyy22LNiUaebkyYWVXcSen6TEXeBC5JSJy6 has 0.004 sol 336 | 2Zm7m4PNkZDhFuEjRBTyHqShLLRXWqprvjLWKPX7tsq6 has 0.009 sol 337 | GP4DH2fDE9ruczt5KoNs3rPjxwDoSt7fhn5d5PiGgpkN has 0.007 sol 338 | 4SwtjpVBp7AWPcAei1kz812wyutjDGQikh6ZCkUm8Hk4 has 0.006 sol 339 | EhnBnKHLBFJGFYw1dEpNxo5k4UsN2rFqKVenuJATGrsK has 0.008 sol 340 | 6f1yKwyRHsVcsNc9atp2Jx5oyzoZF4trsAWn2cNv8kUE has 0.006 sol 341 | HK9t4ZKcdMHM2Bo3uMyKmAN48gUJkWm1QkxGmLr7mhrx has 0.009 sol 342 | Cvk2JJszWsaBSszRF7o9mdeM64seTNLNxB4MNVV11Kvi has 0.009 sol 343 | 3uanLySpcpoAjvcE7fBziMa1zu1T27ERsiReUnhLjVjw has 0.008 sol 344 | 9mQCqC4HnxHTVgGEnasXzK1yeZfwdMoUEqcjyZZztKMS has 0.006 sol 345 | 9V23Ezss2MQZ84XwGCSqPxYFQC57zGsY8i1wFKwhKsNe has 0.009 sol 346 | FH6TF5Z8JGQ4RbbY87hPgKFxQyWAeXKLVSfFQiberyR8 has 0.009 sol 347 | 2xAMHt9Wp8xXUTZ6F2UtR9w3NnFYZqPSjXGzwFVWqcyi has 0.008 sol 348 | Success in distribution 349 | 350 | Creating LUT started 351 | LUT Address: 45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy 352 | 353 | Successfully added wallet addresses. 354 | Adding atas for the token 6rVZNCkStx1uzn2VHCufCzJN1SaQUgQpQLQ5obnq7ZJc 355 | Base atas address num to extend: 20 356 | Successfully added base ata addresses. 357 | Successfully added main wallet address. 358 | Lookup Table Address extended successfully! 359 | Lookup Table Entries: https://explorer.solana.com/address/45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy/entries 360 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/JPFfRWAdNTTRWuK5HMnYXZntop2Xy9k9ujzKa4NaE7MFviZNJS6p3AhEVbJjEgC1cHudztB2BPywABGxYZcNK4R 361 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/5Gu5q2MESCU7vJw1yhrSSwCQGuawGtfrH1QcNXszxJ6YpXUgyh5GVgnsWkdogERFpiZFx2jfrhy8P9qBiSEhTAs1 362 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/5gAdvoGa3cpr51vLHV9ubyWzsJvzauGtH6EjbMzCmzF6ewteywaWgWyogjn8EcNBAUjpZhhqJtvPSGfkUhRvdnQD 363 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/4t22KNBeLpvyjmCCSXvCUcvcpHy1xDrusQq7ZiGoFSeePf6DHy5MjNuHHNbjehvvhdsUYJ4fNuMviDxvgFpgyQQ7 364 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/2nsHRVj9YywGKa6rPsSnuE6PwC784ESqPfYaKoo8VXrxvmr4hjuMEpacaXaWEN6M3uz8mQF6jBavTKWCAuAK4jia 365 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/dV4PJbn78xkSShbqPoMzia8z5m5jpXRWNXwB2bCPqzRFohttXb1U5Uhi3zt8gCv2YiD7CE4cWDwpTi2ve54Uokk 366 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/EssCJkQzpQtPjoJfbeBBodfLftYaQY45WSj8ytCWgjRDfY6L4fMHMWhoVWqZBnF52movK9mrF9dJmXdLD1xSTix 367 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/2aEtoFNS2HNkZ4SyCJVoZYKwuqoP5seu26HxEYEK5oGvTMs7vakvtEK119c1Gefv58VzhNqPuauJ5pGajgYQsKhK 368 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/3PZ7Gw3z9uWQU8ZhhNgvCJShHhfxv3DRh7tdVZNA7fgqrAY2R3gYwaMiz3e27UL6UV2HJQVPR4Z7gfwXTYtB5kK5 369 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/48UEYsgSzvUMQkRwbRP6sH6HEh93w7WSru6xnuCyuR1JC61Wf8NCCBJ2fhNgF7Yqus2gbqJ5wvYvNHkkVSUcUxWr 370 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/4nabX5aBgzxbPcrnfLchJLuRoDJ6mFhSYdbWevvxsxL17jKJakVzV8siRVfNzKkWysyDXZvfABCiUKwz1SkJa8Md 371 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/2Lqje1quXyZfKHB9sTqSvFd9nQQxMsbsQCrJTh6xjY8ebn3nTzkU7ooyZ7LrXbZdfHSPCg9oG2yfXN8YDKL81wMX 372 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/4xs7Qrr9ZprnEnnCscY99hfc43DRcYsi1nbP6FXxKu5bxBRLBgL8GsM5fngjZBhrcVvyaaVWxe4tAJPhauPfxniw 373 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/3pNd8eCiXRb8jU6bnVZ57FvkXUk7hKeiZivccHoexBBfPs1XQciiUjZu312yScRrS6VSqFa6XA6ZKsdCYyy5nqst 374 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/5QKEkmas8yd4xXEL1Qmd4S7v8amYH1uEAdqR9Ek9xhpSqzh1SAsxwF6pdTFDTKmEgjkmwNVs2dQhNK4Pa1HWxmky 375 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/3E7vLRw5nKVHtZ3fibomGLGjoXQUZ8a5j8iuANZFruPAxqhckn5woyH4w4rrVf9Bxk21xfGjDHQMTfEj5NsYyX8C 376 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/32qDf3KJCKowEkzGqWb9oh2rb7ZeH9fkk21PzNsCt7ys3JTytvCZiG8WMD8cviPTzBgJKagkTPNeMLsbeVfgqBLX 377 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/5T6Fjf72CHcMFHhvHvT9EtHAR6RMmKGpBDnzYz6FZo9HJ9xzuNUzyXCq8P35CHRZSLkUBsmQFpee6gUrL4yG3PBq 378 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/62AzHhg1PSMBcUc6jZnhgB3VKetP5cmEDx4uNLpHF8YLkbYwvRtsDBWSqx17DjZbHA5XtwaBHD1XjPG48UtRSG2m 379 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/36TCoJxcxiRBXCzPb7saAxaJf6ptS9jCT2rg3vRnf4CpY85kdUR2TKrykz5djoAxNwWk75ewXgBESizW6T9PLCme 380 | Gathering wallets processing is ended! 381 | 0.170148546 Sol in Main Wallet 382 | Distributing SOL to wallets... 383 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 384 | 385 | 5HGRwds3ADDvm8YfaSJMaoDzTp7kVLDoS9QvGtoGbnyi has 0.007 sol 386 | 3HA1Gdx4Ab4VKS42tcVgqKJ8nWXYc5TxzuqrGpNr9Ef4 has 0.008 sol 387 | 9FmnvKhTf4K4jEWMCb1geoxiyK8i5ZkjsQtunYW48Lbg has 0.008 sol 388 | 7ydXaVDr7pZKseb6ydR9eohcFphAD97qKR31ETLUP8KN has 0.008 sol 389 | DStVzte2tWEsQTYnMstff7HcFM7MNiDxy5SN2NZ12RwH has 0.007 sol 390 | 8rvS5GrMQM3g5CJrDTCvbtnszyao4NWJsWdNehpMhGU1 has 0.006 sol 391 | 9QZcwoa2gxm5hQMr1H1TNaVAxiVTe7em9xi1Eke1xLJy has 0.006 sol 392 | 5hmRjrUB8Gm75BYnPS42pfzPbZLLhe5qmoVz7NpQDruR has 0.008 sol 393 | fpBMdSu1KCYwu9kjKT3666czU2npfPgBP7jKQkL7z8m has 0.008 sol 394 | 5DFhKGjex5w1YZGzo56tPnbbG1Ft413sGUmJwjrS2Ye3 has 0.008 sol 395 | 6AnipXFukXLAPqqNrHuiGWCxMtmm4DjjEGD29JpaPPdW has 0.007 sol 396 | FKkaj6jGHm19R5B6EDCmf6BRCowZXihRxa9wR8z1XbMM has 0.007 sol 397 | 5TaivLAE3kJGmkkSZdZdLGFuUwKaWfPqbK93ceawdimD has 0.008 sol 398 | 3Y71ZyzHL1ivfe6htHYRBoQbwYfWv1RzdyBDyF9mkKeB has 0.005 sol 399 | CDgSQpwUTsywXWgQy1DVXGNTe8oSN9rWAxc3DizEKBL3 has 0.006 sol 400 | ANcNbz1jFk1Mbhihz9AcaBPxwJGwoB52T4Q5uqnfjKd2 has 0.007 sol 401 | 8JJvkhnX4Q2NfzTBQfhhqFTvDWSxQG4ohdc6xb8GxpmU has 0.007 sol 402 | 8xgqedriibzXSfgCayaGAQn8cWhxZPFT2A3EsWVo1E6T has 0.006 sol 403 | AcEfVt1i5JHXgzLLNX29r3ECzMZcjzGpggZngfWZUYPn has 0.007 sol 404 | Bs5ad38peb9P55GDgCER7a3Rhy4FyaSWFBHimX6N4ucr has 0.006 sol 405 | Success in distribution 406 | 407 | Creating LUT started 408 | LUT Address: 45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy 409 | 410 | Successfully added wallet addresses. 411 | Adding atas for the token FHiqdyRe3CRvQeDChEFTjuwoHGbXCWrjiLyi3Pu9Yv6Y 412 | Base atas address num to extend: 20 413 | Successfully added base ata addresses. 414 | Successfully added main wallet address. 415 | Lookup Table Address extended successfully! 416 | Lookup Table Entries: https://explorer.solana.com/address/45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy/entries 417 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/qK3Q9gpCfqVdShC7zMLzCsXnBVpYkWYcGUfYrwUqxDUG1emDtcHCfC5m8D929WY6M6EJsd1wbKnCTnbMpUAugUZ 418 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/x3gstCEdTSorzNtqR4RznXp71jXWgxSweSy7yjdFy9z4V56VvFxwGKqRinhAhjUKRjGJV2MQvKHAWPaLdPCuTFa 419 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/4RxDfeYwvYC8RFPuDVEp8ccZQMuez9KySABCJTipXYRCTLWysruJ4KNrwKkzEpL29qzjFxQLqYAy2ju94fdK9ie2 420 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/31itGNS6u4RYJoqQTpZmFqdqQ23qjgrZfNbEdpLAxRhRyspwfmQeF2iB4tWvNp93MjDPhqA8XKEi5rmDCEmAtANu 421 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/2js18kLpWxSwGpm5cojAYHHGxccqBtj8WhYxKM4gFHdGMSRGP8FA3YX2fui6RuPsRaLpV7f3dDVZ5XHPMtodAHCT 422 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/3tN6HsYnnphKjEG5noQfqRUXj1XbQuL9XxC7kWFjP7B3vPqBowxMm58jc6ZBf3ZSKqQKzHF3fdZdxdxvWr6CdimQ 423 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/5uHJKXCXDUBdw7NuNquVtn7JCbyn7x5aFixqgHUCMqwi2oMjgTqYp6ZbdFoXwNWxTBa7XkknntUbU1nKQzez5ebM 424 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/23CP6AR8VejttCazhxCMxgQ4dJ54WxCSDT4XPtBV7pwQXekqW7gs1wjTJHUoUGcNGzLPGQpsu6mAVooJXquEzXaW 425 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/5gbRT2XNkXHNYv2CB2DvAyskGZmJ9saCT8qK7Q9tNwU2qnTmPoq9NseFvJf8m8BBVZq5L8rucDC2JAzRubA6GePH 426 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/39GmiQK4tCTZiHxQrYoFVBpVVJg6tmcdmn4UZWX7xt4EA7HB793NTgcinuHUVWsiBx2bGyQGM1ECaVZzJLHncWnz 427 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/25HFLVMy2Ms1bWoyLULuCpUw77642iHzbn4kzyXKqbDYnPQ8yp9f4Ds4iFN8gsfgFBGQkBSrTWxTXav4cKRR5ttn 428 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/58sfMj5QfM8Xwf7GSvs6pNCo3rPe13HXrMppvMiLsNuJZPirhapE6cAyjFwyM4igmsZBg1Mtm5KSA8Z2UiQPYDgr 429 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/2Dfg53JcVCeacwsnBT3wCZTQXvAnDzXRTEqsnmrPz5wxEFULoVzRtFGNmo8RQ1fYQtNQzomU8MKqiS7AsmsnoP8Y 430 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/46thwXtFNajRm4EmqoVcEtVVg6qxGTBJbftswgSscrcP8EzE3mcQfWDurSqXzTQeLJ3JmsQb5VfT68XJe224Njw6 431 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/4kvgQP5LmR2At1N7cnwoTE1JfWgDCm8i6knouyhogUWo8vjb4pbNAeGZgNByKrAE5q8X3VoVwQzVQH3qsCM5iTim 432 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/5U4vvxbtmubSr6mka2okPadjWFRxUD1HrQgNv7HqLqMvqr6fSMR6Nas9wxeRaMHhBvSeXECRD1Qb4GexYSbsUgd6 433 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/a6PvbBR9pix17XRcxx33eBGcDUvUyP7MHzji8CW3EA8G227TpFLjZZGzzTYQySXXCof1i8mHb23oJu6LiDdRvQZ 434 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/3pmhDgG1PKinuwzNuPwD2G5aKsbSxigGPD49JTCrpPkugHzEi11AmmdiZMNxVeMRqGS3YdSp4xwVfckhebtifySU 435 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/4mi3w7fP9StSj5ZQ92VFd7ZrJvQCtcCTDHWPzcWwhS5PgdN5K8p8UTvyZFDDz6pF14DErUuuDJW3SQQ9STxZTtLa 436 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/5MWArnpnXg5GktRHW9XxR6vFubsQ3dDNEZrVJZ3NTgQ2XTqWF592kTUcmbi7AzDoeEVQmRqzwxb725xrygg7r4sg 437 | Gathering wallets processing is ended! 438 | Gathering wallets processing is ended! 439 | 0.207075266 Sol in Main Wallet 440 | Distributing SOL to wallets... 441 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 442 | 443 | 8qjxGNoaoM1djDLnQs8ojV8Wdp2HuXPzDJHgJsdtsxoN has 0.008 sol 444 | 9q6gYiUjhrFvekR2jTTAwxkLpK2f8dq6MYcpXpXQFyF has 0.006 sol 445 | CxoBgMzLnLzci3KXzSodzMKYJ2aBnAr2rf4LCiiTtqnX has 0.007 sol 446 | GBxrn4qPSdSV13V21bnXYB181dcsTtWiWK3dVoXyKR6o has 0.007 sol 447 | 3SEZqYaD8MdZtvgifCBBoQJYkjNNsbhTk5NwJSXHMk3Q has 0.008 sol 448 | FknnAxe4uj3uq8Nq9Kq2GPHSrS1XPVARtB4t3Azm8WEL has 0.008 sol 449 | 4Yo4xUusUw6E1BMN2bvypMjQ2diWaQMdhJoDmwHwfdwW has 0.007 sol 450 | BXhM8Qe6bf6WBt6XsJ3NA9DwKZUVaBGuqPFu1QsWJN7o has 0.006 sol 451 | FiwaH1Lhp3DnxDYnyScy2fPoj4YT5Hogins37W8TRxXZ has 0.008 sol 452 | ECbkx8DVdwd9iBzeH1eznX6VqosUW6engGKjQuipWxwo has 0.008 sol 453 | 5tbgy1qe3HvszvYmzstt5u4HFyU9tWoac5ZxsBuUaEtg has 0.008 sol 454 | 9AL31EqCu5WJBYr2uVPAeceEMMNv4yG1om7VPZfwQqeB has 0.008 sol 455 | 8AQMdnEk12QGKCep4BmL4NoGW1RwQm7aBq1tCtMCKsZW has 0.007 sol 456 | 6LqBQpTC6oxspiC511ucsdP5WDsgh4oXzH3nb1srvpTU has 0.008 sol 457 | 623eYmUtCVX7eLDQSP2wwumeMW7tbcsiVqy5946b5Ah2 has 0.007 sol 458 | CJrQ6iWkMCdmCNiov3YUQ9cUXnQXCF9M22JobKqNvocp has 0.005 sol 459 | 6KsdBeJwbiVVtvwDDF7Nd8uRkkUkfb8eAvwaLcCQFMoF has 0.007 sol 460 | 8ghcStiUjCrWJUi7DqiLCTb5wKqCsLCSHXuGdAip82GN has 0.007 sol 461 | FKWGBwdStZF41TXqZKrGLU5hu2H8UJ6xoLvi6JQwG7U7 has 0.005 sol 462 | E9U2JLuE5mSb9A48xfFbYqoeGJD3j95wttyVZ3qTWnUF has 0.005 sol 463 | Success in distribution 464 | 465 | Creating LUT started 466 | LUT Address: 45dzrA7dbvwiyHm1KJH3YTQhcVH3JP5QGJBq1EoYG2Uy 467 | 468 | Trying again with step 1 469 | Trying again with step 1 470 | Trying again with step 1 471 | Trying again with step 1 472 | Trying again with step 1 473 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/5CJ2jVFCiM6zQfNcvSeBp3rQrARJ4NoqRR7jFAeqYsyLqcS1fBrwQyuK17jFu2yvbMasw2zU2Y3TpgnYkP6mxgEZ 474 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/5XUn8rizAK8m1gC18vpUc6tWhSzadh43D5aSR5WinaWXgfcq5jM7PtbBMTFqbd5e65oefZ5PyCccjFXXwqkGLSy7 475 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/5SYor2GMCSZmdz3bcu11f1b59TUSu3R9uqx3Se2GDjtDjh9QNpPkjG1AWpUoExfg2bCBspq7ZsEAzDYMXhLiybmY 476 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/5DDKq8xBswPfD6ivZ64XPNLZsU8hUKSBigX8c2XV2FoZxZimkzxBcJ5APwiukyd41ehduqmy1cquijaf3xgeW5sr 477 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/25AFdBQgSP4NyDX44Mny4JeMYMFwtDBx2nRFMrbaqJ3ZhfC7t1Kj2Yygn5dEbZh8NW2ne41xUXufwzUfn9PXwUCq 478 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/4qqfsiprDu3AbNs56TrYv3Sru3fdqU42jtqEioxTraFxWaGRumgBugGoQEF9uaHVDQjde7z1tiKdxwic3RwrTPzd 479 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/5bK7MoJWSWted9bAd5ox86reuH3y2KbXQMsYLG6vGBWQGFsDiFKWj8R7uVnpx1q14MXEYM6jeVSQnpfEH4RGBCKh 480 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/26KVBAgx14Mn5h4pU5kzD34NavhTwDVichDoRtsQxaemGsJFPbRsz56XRkMiiYtTWFEucE2dMuKEFBkCB4b8AfDU 481 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/4nphgCRLzMQ4RK1EwdwnuP9o85BKFipA3bnUmbqnCGzs8f36qgeUMFpHCHp18sH2g1yhNMNrruV74RGLTYguzBwb 482 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/knN8715n63JC7bjwgoHTKE9vqPCUmCaBP4bWEY6GGXNCpSQXmhNXDogbSeEMb5SYS8TPNLUdm8iGSEhUKMqdiEp 483 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/2DXLVBSYJPciDyB2YWRh9KS9EQYHsA2AnaboDkfYLDTGvT8MqncGDWXa9mWDCYiyjXAroEgeVpg8BGLmASpytdVG 484 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/4wauesFeM5h4GAy7ucNLBxsQteeVf9XwesuFqRB3C3Pf74KjzdyRLN8GixWJwbryzHHJQtz43tgxeQUYzHFchzBB 485 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/eBC8WmTB2XNCfErHoy5HKQZV4cEew9u12HTXWGRDKc59dUZqSUCGPPa8riKcWnaGqyhYfidvTtv5M2LNaHkWpww 486 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/2XAG9kXi5nUBKKRiheUisMgvn1gdCNDcYQ9YJTfNsCcpYoCVAwkYagZXoi5y7dPuMXgQgpBotSow8H6UYDBAvroS 487 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/2ttPZLZsXBLJJsXugStHnWfaJHa1w2VQ4aSCzZZ6N7CSr5mGQsAMcWuUmUQxYmD9GxLa7T4dE5fB9EQD2UrBBcTZ 488 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/3mGoUGfmJb7URB96vMPPrUXHGsfuJrUoeeMLKkNYTUjGxCZEV7gCrP3owKNyAG5Nd3AbHKQAfdJ31QkFots1PZmf 489 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/3ms6o1Rpyfuai5UiTSP7mzWorYfgTJWFfu5N1xT9T9JCtXvW3RmFX4hu4yk3EpCyPEipdbNMgFZ545evQWrB3T5j 490 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/VmeCnyAxxE7Akf16FFvGDrvfSG2FaPzJXEXBuaSwvLkHDT2Mo4ySkMAQTTEtHDfwwvhgtGTKXxHKCvw9wj87F54 491 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/5j6Zg1P9cUVLP3ifkWLDRWawxeaFLzPyCMUz6QsQ7KMK26Wemig8bhjcrN3UPqrWcdH2Q8gNoYotSMiV5sjtrNRB 492 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/5dBhoUmhpifqnYMKbGDKHFgNbbYcrZt4qHCYkkfPKeg2Ev1RnsDRfuMRt1BiRxCXD7C3jpaRcYVDv8wZnUFJKiLH 493 | Gathering wallets processing is ended! 494 | Gathering wallets processing is ended! 495 | 0.205230266 Sol in Main Wallet 496 | Distributing SOL to wallets... 497 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 498 | 499 | F8cjKSPKgJaHAPNvrqGW4aP8aUwQCQ2BUwwbrSUAG9yK has 0.008 sol 500 | FPwk9diZ1JkrMFCKE3dPHWHdjNvUmEusoNtW62xUnVDd has 0.007 sol 501 | 3udrFS8bZGeH39xYFWz1gJNLqk7cje7XuuW58nexCHNA has 0.008 sol 502 | 92mj3d5UujYFRVJsrHYULmM1YNJNS9RLKD8srnsK749V has 0.005 sol 503 | AQ4kbea5Wy5PV68cg8eXQcEQWCnbRS8efWnbEhXKhKQN has 0.008 sol 504 | 5YMXaRk2okuDwZK42pHGiuX2cQNvXCeoQZsPRGoh3teU has 0.008 sol 505 | 28eYKb2HaVr4DtXXfmdoVZpMXeqfi8YGLnemnesPbdqC has 0.008 sol 506 | 29FV5NDZpicYECN1T1fGPYQqavq1xQjYauMy6iAsmtTi has 0.008 sol 507 | Bq4PhXFZeLrUTYcTKiBCMaUroVE8UW7iayDJggVzvxdx has 0.008 sol 508 | CQUJKpwiu2XM2WPDMAcd7wZUMEJagZhzWPMEF282YfBv has 0.006 sol 509 | 8wWLQnhuAXweetmE3ghUPJ1smWe2DxEqfGmuZn6rvB15 has 0.007 sol 510 | BdNBhZU9g1KDHBCxXaamVvVwrUUAUvaQennpjrmwki8Q has 0.006 sol 511 | 66zoiwexWGjU6iaTKh5EHyrTVpMzHibZYuGSt1M9kt9w has 0.005 sol 512 | DkqZ5ehyWYQcXHCDXKLUAWibhdUVF7caJCzUez7CKjXj has 0.006 sol 513 | AoYEjebWnEYpLYNWKQJVB7wq5dX9dwiyQgQm2amkSa4H has 0.007 sol 514 | H1nC3VUisT9NCHcro4c3disY4aLuAdmfB1mwVazgJ55b has 0.007 sol 515 | 76pjYSo58xEDbqM92duqgftjkMhZCDWsswvnFKxkswds has 0.007 sol 516 | uar19utagrntTS97fMnMA7SqrsiTDdhCFQymQTyLK9H has 0.005 sol 517 | 8LqwW4dJAdRovtxXSngoNeBCoS8nn9PoejWRtFFg38nV has 0.008 sol 518 | 3zr1VHCrHyD78LJDpUY3bFpNyKWsGpZ5tMRwLK5bRiwH has 0.008 sol 519 | Success in distribution 520 | 521 | Creating LUT started 522 | Lookup Table Address created successfully! 523 | LUT Address: FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc 524 | 525 | Successfully added wallet addresses. 526 | Adding atas for the token 5zbC66K6SE4vd6XLg8aKSEW4URK8xeEXoVUrRuBeAVmo 527 | Base atas address num to extend: 20 528 | Successfully added base ata addresses. 529 | Successfully added main wallet address. 530 | Lookup Table Address extended successfully! 531 | Lookup Table Entries: https://explorer.solana.com/address/FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc/entries 532 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/3Tx34Q6VLGRBUMSCaWGfwEd8Wt8e5HJxc5nXj9DrYJijqZW4PBArzz8qEHtkQ52FJq3aRH5ThWbskMCa6rh1g1Pv 533 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/3m8AaDS8vZmBTMWXaGuN6TgL2BcopUTBX4yvCEwjoJxAC87QgkRRJoc8H3vGM2A9uxauPGv8uPo6C6v2vAuwxD64 534 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/2Ku7jbC2cT1UaYTuRrfVQeNgjLFDyWiinyuvAW12nECrTehpUZcA8LTMVga1EFFJuMVAKMuEDyMgz1Mk6TL1chmW 535 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/4kb53dcYHng25iJEj82aUNHkjzuYyDHMBkDpj2Svf7Gjms326WJmaJfmmxaZK726NutUhMqDpnPJ9nFz5QAPhHpg 536 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/4KH46XiFiheesQFfyUQ9C9Q46M8xmEZNQB1VegstFqaTFvmwpPnSf3eKCutF6bHFDFbFDEV1QCJxvDLpS4uTFa93 537 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/4MSTRxiumx6kky4Fmc8bXdmLRu52bqnZmRR4U6HRG2B4m4DGZa4JWJbjbJsDX7HmYzTCYqiKweac7LYTAxRRygTk 538 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/43w5ct6QtQkkpBkvx5jSmUnfrNa7if2XiFGCJ4L5cTNvXsMG2xxoDCASaez2PNqAwkjw75N6rwtJiK918JBnr7Mm 539 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/4Mw2BTMCxyQZWSpj69pxy2Ggkd7tKFRfvfEfqvgvqfJzh9pgpiw9skGSEBP2M95c2UbGP6KAPYwsDmszvGLYNM9G 540 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/nnpb4aZ4JWEPGhXR3ftu1mDQ1fwFGZd8tkDschqk1wX8xc51aaz6SRMEU2qaom68XUVBYY3s4h1orAmvfMWis6i 541 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/3SgenrAZYuZSGQptmPUwhoUu9Lb79H3jSdkkfySsWLGYayeBcX3TymH6WpwV8wSQHU9mjGj5fTMHyfxWcAWfbr84 542 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/56E4x2CDXA5AX5Z6Nc2yWKjAcnh4tbCm1pLR9TZCGQNMTDs9JkdLFLxbY3iJrS9ZXPKmG8t8YDZivxBA1LXYpx7p 543 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/2hfLkdsHUqvbgVXyZk32xeUx3QEPVp5b37p8Ziy2cQB7RbQTkPd4wcJxtwUzgQyKUuXDkdy7vyE3EF9vBG78FYj8 544 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/vAfSoFFubSn3eSnEZXtWceDjszfqvqDUa3e8B8DNv66GXaQuo6KtNrRAMMGXan9Z3DgqerRRQh8wKNJCxv5cmfW 545 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/3rGr3pGaL8NQgA8iUrvMuhPGJj7nCqt5ZTufLeu9RcvgrLGgPwxMdGN8mwefemBTvUj8jM2yauzkK1YyA1CingM6 546 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/4scCAdvPxZWrxccmgWmQbFDrxcVU13qKhMpCvayYgwUoueqdigdeCuzswt4SzfdmDwQB5FE5whAKyq76TMoZu9PG 547 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/5ghC5z9iw4wjtfnqT7b1zSX8Nz1ucR5Jfznn9PHAwPwGZbMmnY2rFAB5KgwfSfskZ1utmdUDYL6eDkb5gV1HkXRc 548 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/4c2uEzJa9FWDgMxGQtXBdMdcaxw2gropLXmvsZxWLD2ToUiLEnLCTtZhXgJQaEfk45xhr3ESp822ZKSXNf2Me8Qn 549 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/3c44nKpA727CwBLvKHdXuzzdDKg8pUVk48EUGULCatYYLLEoqEkQq5uraSzMWTf2n5oV1RYGZFmtMqwyqM2bZjiU 550 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/42e6cQsipxWW9YFXCCLX83rrfv1yFEcVLgpJkW9rn7GEVgvu8UuDSkb7J76ocz1JwfJw4yBRSqMwSv2iVbM3BznY 551 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/5QyaRFvgyG6QPhH8JkcKASXZo9feM3w7urScTa4eHYm5qsqCqXurYVDby1FyiHYLKDwfoUhCo49qPBVp9AopxxbG 552 | Gathering wallets processing is ended! 553 | Gathering wallets processing is ended! 554 | 0.190771346 Sol in Main Wallet 555 | Distributing SOL to wallets... 556 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 557 | 558 | 8NHhoCh3azCNCDjH136jAb2dXHtWKzBCjsrNr69Rh9Ky has 0.006 sol 559 | FZknXRYfcrHK8eSNT8dyVG9JiQiivJy993p4aUJSaTC4 has 0.008 sol 560 | 7i26pw5Yc1AzTMmTicb4m9uZBTPTbDTAGSwuFLqjLABn has 0.008 sol 561 | 9uARDYp5iZyjsMo8cnpL3Eb1rYq2kqYsxhGMSQUpw2rq has 0.007 sol 562 | 3g5ugYw1wDdTebry8KKxE8b8mRpLxVSDsVwsii2S314S has 0.008 sol 563 | 5UEhF5SAXaDB1Pkc4LH7RRekfuhzcBahxJmG8GhDY9wR has 0.007 sol 564 | EQXFGkpLMt9an1nNHGRTLz5MaPPvkGwGT7CfGBAKQ2EC has 0.007 sol 565 | Hcs4SwsSbjCWZLYDeApwRJV5XYYxoLJuvnNrYJroHGds has 0.008 sol 566 | vurLhhWuRFxv4tKcxxQF54PLwiWtUX1zkcwkc3iJYLg has 0.007 sol 567 | 56bDQLR3TimxGBAN5MW5hTqMMRr7Xp4dHqWxGUAUQy2L has 0.007 sol 568 | 55Ww7qeczXPGXnZTg9LGxxUDVDoQQSad1TajMQFtDEhD has 0.008 sol 569 | BWxQcfecuDsTSxSyNyjqbkSequHZb1pPCaEKcdrpaG5n has 0.008 sol 570 | ECsPVwoG9m65iaZRcS3PQu9c7rGdpf9ZrFXrq5T6dzmz has 0.006 sol 571 | FzSwDqXUYJZCHusBA9AvxvaLVY4df5zryyxP6dpgFVUW has 0.007 sol 572 | FBS5yndxMZnDFqKf3YUPnCTVfKWZAX19noW3HiyQ7zSf has 0.006 sol 573 | Hn1vfTQPxUmgHS3dys5VUaYDYXgxD2k74q7UvzAS3KTC has 0.005 sol 574 | GnJio858ukKncu1AXGHEFpq3jk9ZvagjpSccNCvcfuh4 has 0.006 sol 575 | PCr9bdNNyb86JLH5BrypFr5wAP6DNxP6b8uuKz2cuLH has 0.007 sol 576 | B6cvVW1ageHGG6qoBJYRq86cfXqPNW9vPdhh1JqdXtHA has 0.008 sol 577 | HW67c3vXRz1LAQ9qvaCP1FC5E9pwMDsX7CT7yoN1sQJk has 0.006 sol 578 | Success in distribution 579 | 580 | Creating LUT started 581 | LUT Address: FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc 582 | 583 | Successfully added wallet addresses. 584 | Adding atas for the token 8MbAPDckZSMxH4TiJfRbaRuxazY81tnZbmSPxarDYhD1 585 | Base atas address num to extend: 20 586 | Successfully added base ata addresses. 587 | Successfully added main wallet address. 588 | Lookup Table Address extended successfully! 589 | Lookup Table Entries: https://explorer.solana.com/address/FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc/entries 590 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/3BBSdFD1F27J88D7sovystnZ2pQVy2akThNwXN9PfeeedpwdkfsGXtZeRiThSKvrTKQmxnjRGT6P3DxkU5P3zmGe 591 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/3TiP8Qz7N9y7chFcpzFCTGjxPVCfSbbqSnVoE2YqWZrujBjo8WfDXjDLmjntPEoAazDVDBHP4b2ZyNYVukJTznWs 592 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/64n1ZBU4nbrMd9pQbLPBh37i2MqdXHqg1d54g3rE98jfnrQnLHjPHedZCJpD11xiaZBiXPbdzcuoccsWgSmW2zu5 593 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/TP7MViRnYyQ6uAx3VUqxnbx9ZabtZyNx3KUe7dkthMjWHQceRphiFgXA88W2DKEC9qxKoEF6cMgQTCmCLveGFqd 594 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/3gKTyRsaatb66SkJA5uharYWiiEZSvcuZEgBZyfBRN4dvduzFxynfCCPBoNGzsoEap9SvQN8MdKMPa4Mvuzk8ojW 595 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/SW7KGRdAZs8nApzxexGYtjyNNMi4WAv68L8qc1mBHo6HYMnd27gwfjkkG3uJS9BrTXKGxv2pqsQnhuCqC6m2jnj 596 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/BqTfX2u5znpDuA4fF2q5izmenyicLytpPUd7p9oCHq7qdVyupE1D5s28G3NksXEdzA9RS3jeB3VM8QX3eP2sgau 597 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/fWhsCmG7uUgW3w3nD6GUPpE5YgfARe6j8fVwDvko2yYeQ2gDjnHQRgMPr8NydJsQcM9hvibVfknweXVTadbj6uc 598 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/4wMjLbZ3py2AQ7qezHLJNuhTy2mvWQtSxGua58ZbwwayScQg6a1V3AHm961RwjP5XTJzHEbjdeoHeUHJRkAGwKfX 599 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/3sxPr183Ct6MV5LfXUMym6mJetvgS9yHe3S4VCA3Chu13UwRE2wWJAr7q7Hxu37S72WRw14hBgM2UmSaaoZ8NXqw 600 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/PKbNfFh4J4DARb6DYnDqKYtXW3VbYGm44BrYJocncq8zKBquJHFWpWu977eyihTF4zqsfntZeWqDrM59sYgT1ji 601 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/3q1cQtUqCe35eUArwwQtUQYdEZmuLqSAWAMfXmpQzWp6oqbauvLcSqbrqMD1uh6rW5i1FjivnQ9Jad23rf9yHsux 602 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/B9c9Rfs1FSKmfz8XqTsNnuzLGZ6pqBzuKdNoHjCmcgurqrswqiuwQTmCzdPaLFxCd5NKEJBvMxdGcvrxJwKnkUx 603 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/3rfWYea33oShDfQhcpxposqbjBFe3jzqCXRCM8yAjrp73w7eb3PvTowNoSusGtGVmYeSy51mYMosD1TD3Z2W2j7h 604 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/8AjxR2HtupRBhPgY34vrn8JgpjpTEtkeV1wmXepxaXBgbqEcxiZJb452ceN33879f8KKyRCPRAwwGeM3eocQnc4 605 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/2F4fbwm1YRv6a7RZVXS6EcWLXZkJSBfbAsT2uDHoTSGK9rZ8wtkq5PGYHA3Ns6roa19a64z8LFetVvnKfCZrARVU 606 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/2gWMW6dpKDegd4eCd23Ut3VSRtxyc6N93apK7CPSarZMWbA3gnh2BubxJtVwzodsvtUyEFiHaYu8PFeqfzqbpPw3 607 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/25E2q13KJCG1NRAADgKkEyQZzTpbpHji54fSZHgobFKWLAJ92snUjMmf434gFR8Vm6X1bLAzkyyGXMn3QbxPF2m2 608 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/pvgKfHULGnHhesdsY9F3c142Fk4Th8vcz4s6j5XfGbRZpddQ3NZnQd8FJHQHUxaGYqGb61a4mkMqAWTXhqZfxnm 609 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/2sfYVDaKBCEFLkGLdaAcwMF7Rtqy6xrEb3sMy5vfa9yfATeb2P2FkwKjcoWkUiTgRGwvg676sNbdVRa6Zo14Ha1r 610 | Gathering wallets processing is ended! 611 | Gathering wallets processing is ended! 612 | 0.177698466 Sol in Main Wallet 613 | Distributing SOL to wallets... 614 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 615 | 616 | AsrtJBCjxF8T7vCaWwjAiNs3k3rPp1t88ZDBtMbjsVak has 0.008 sol 617 | EPwqVwHLupYvRQ1zRPMtsS1BaFue8nAJiGHSs7kuJVok has 0.008 sol 618 | 2M4U2X9JTyRgSTqdDorjFFnM5nmab8zZC8rCNnFUn6M2 has 0.007 sol 619 | 8rn4NcH1TsvvCoyTCXz98QzZcJE8GCGvHgw4mvxySajm has 0.005 sol 620 | ABZJY5YemnYoa4LHAgB5VorJtiLRFm7sE7GiRPQK3esu has 0.005 sol 621 | 7sRGnTdvXumww2gRx9tuW6cffb7DUMuu5xgiRxpikHsT has 0.008 sol 622 | 7xz3tSLjNag2ZeJSD4Fp1GRUapp8B7K8LCs81w5GiiLA has 0.007 sol 623 | ABskW1wXW8zt6qRciKVX5NePHeLfWySa1CP5Wc1vz7jo has 0.006 sol 624 | 8tHkjqAmsaKJUQq1yQXa9KJ4tQ9LriJeW1hG9gCvNGF2 has 0.008 sol 625 | 3yjZXco72Y8E2UTnfxWZGMv5Xq7Xum5i6Hn9KbtWV5cA has 0.008 sol 626 | BivV7LezbL48jmnsFqVZVaSf1T7nTdwAus9kphiUeXE9 has 0.007 sol 627 | 6QVxhYNYhtBsbJbBDfCzBfgZ81ethoyoFkdTjxHokC6u has 0.008 sol 628 | CfMshwp4SxCxNS48PG5LQ9R15wJ2Q8BSHQ26g9v7JCw1 has 0.008 sol 629 | 2jH4KwRP5Dvy5a87EbCpRFc2TBSsxsVpzfuxXUoMX31c has 0.008 sol 630 | FjVpLsfp1VWYLTU28vLqXWoWwiUEsowgLwpAZXEvH9fW has 0.005 sol 631 | 3uzEVPHkV3GtJYVY1uAwp6GpWDvLt1FF4GJmiT4NCtPF has 0.006 sol 632 | 3RoQAARBPALAD3j2x6hr8v3jP7hJSKddLA2FaXvy6RRA has 0.008 sol 633 | 5vYjD5bhXtSNsZ2iYZ8ZoJmZLS5y8VUVAG3s6TroMpYK has 0.008 sol 634 | 85HM8G1HtWMtz3HVaNitx5BiJ65Jv9pnnkmukBA2H5P1 has 0.005 sol 635 | 2P8yNkmhN6sdBDLrczmk2svR9d3iPVZpmuu5EPymeF1C has 0.007 sol 636 | Success in distribution 637 | 638 | Creating LUT started 639 | LUT Address: FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc 640 | 641 | Successfully added wallet addresses. 642 | Adding atas for the token FdADoPge6mNwHTpjyZJtMkinNmSoX7zKBARGDDePzrds 643 | Base atas address num to extend: 20 644 | Successfully added base ata addresses. 645 | Successfully added main wallet address. 646 | Lookup Table Address extended successfully! 647 | Lookup Table Entries: https://explorer.solana.com/address/FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc/entries 648 | New Mint Address: https://solscan.io/account/FdADoPge6mNwHTpjyZJtMkinNmSoX7zKBARGDDePzrds 649 | Create token and Buy jito signature: https://explorer.jito.wtf/bundle/2Ma9c4HSU3HqYeFQuqDCUKUFJtTqbBQqPiuykp212DPJmRbYdrvffLrZyBnn3Q1KBEGDxK14UVnydEmuFQTfzvwQ 650 | Sell jito signature: https://explorer.jito.wtf/bundle/nxdyDF47mSiTVCSR3LHDtfaA287gk8pfpf644oXV8j6YRBLnpNP4Q7hoqpQhkvNk6APFnzzdQ3y5sUmqF9ZoZ4i 651 | Wallet address & balance : AsrtJBCjxF8T7vCaWwjAiNs3k3rPp1t88ZDBtMbjsVak, 0 652 | Wallet address & balance : EPwqVwHLupYvRQ1zRPMtsS1BaFue8nAJiGHSs7kuJVok, 0 653 | Wallet address & balance : 2M4U2X9JTyRgSTqdDorjFFnM5nmab8zZC8rCNnFUn6M2, 0 654 | Wallet address & balance : 8rn4NcH1TsvvCoyTCXz98QzZcJE8GCGvHgw4mvxySajm, 0 655 | Wallet address & balance : 7sRGnTdvXumww2gRx9tuW6cffb7DUMuu5xgiRxpikHsT, 0 656 | Wallet address & balance : ABZJY5YemnYoa4LHAgB5VorJtiLRFm7sE7GiRPQK3esu, 0 657 | Wallet address & balance : 7xz3tSLjNag2ZeJSD4Fp1GRUapp8B7K8LCs81w5GiiLA, 0 658 | Wallet address & balance : ABskW1wXW8zt6qRciKVX5NePHeLfWySa1CP5Wc1vz7jo, 0 659 | Wallet address & balance : BivV7LezbL48jmnsFqVZVaSf1T7nTdwAus9kphiUeXE9, 0 660 | Wallet address & balance : 8tHkjqAmsaKJUQq1yQXa9KJ4tQ9LriJeW1hG9gCvNGF2, 0 661 | Wallet address & balance : 3yjZXco72Y8E2UTnfxWZGMv5Xq7Xum5i6Hn9KbtWV5cA, 0 662 | Wallet address & balance : 2jH4KwRP5Dvy5a87EbCpRFc2TBSsxsVpzfuxXUoMX31c, 0 663 | Wallet address & balance : 6QVxhYNYhtBsbJbBDfCzBfgZ81ethoyoFkdTjxHokC6u, 0 664 | Wallet address & balance : CfMshwp4SxCxNS48PG5LQ9R15wJ2Q8BSHQ26g9v7JCw1, 0 665 | Wallet address & balance : 3uzEVPHkV3GtJYVY1uAwp6GpWDvLt1FF4GJmiT4NCtPF, 0 666 | Wallet address & balance : FjVpLsfp1VWYLTU28vLqXWoWwiUEsowgLwpAZXEvH9fW, 0 667 | Wallet address & balance : 5vYjD5bhXtSNsZ2iYZ8ZoJmZLS5y8VUVAG3s6TroMpYK, 0 668 | Wallet address & balance : 3RoQAARBPALAD3j2x6hr8v3jP7hJSKddLA2FaXvy6RRA, 0 669 | Wallet address & balance : 85HM8G1HtWMtz3HVaNitx5BiJ65Jv9pnnkmukBA2H5P1, 0 670 | Wallet address & balance : 2P8yNkmhN6sdBDLrczmk2svR9d3iPVZpmuu5EPymeF1C, 0 671 | Closed and gathered SOL from fund wallets 0 : https://solscan.io/tx/9vJDKgcSTE4RqRcSBhTnQ4UPV66rZTRihdSMP8ChzZxUYb3MNFuCQ7jQTamdqEW45yAWnrmyK1PKDoaz4WfL2YX 672 | Closed and gathered SOL from fund wallets 1 : https://solscan.io/tx/31ssZi2kFih8Jw6UL2ZQVQTBDVQeoiLvtzYCb5nZqXHk6Xfk7bJVac4r6cPv3uCT6HjtcdBpdLu7wqB8JaHWw1za 673 | Closed and gathered SOL from fund wallets 2 : https://solscan.io/tx/4UrkQuE8JHoxsrDkQVV5iGkecgN93sfCRKgBs4xWHoPkqQGFMeBCVUBqGZaS8TyykV8CtQnQGqNCVNCRgmUkd1nc 674 | Closed and gathered SOL from fund wallets 5 : https://solscan.io/tx/5XLvKbmrfraNfGG1LbBosir6EbCDk6Ju1rYsEp78rQughpktU8moVXy4dgBoCyV9wKeHMjGkzDnU9t4L4qdJRtTm 675 | Closed and gathered SOL from fund wallets 3 : https://solscan.io/tx/2VqNqdda4zhX85hLaKL2BzTWSexAU7mirEodHsoAVHutXcAWn811WjFVem7D5qyE1QyaAFP4WLNcVfxxDKFu2Yqa 676 | Closed and gathered SOL from fund wallets 4 : https://solscan.io/tx/2zy7cX81qw5wD65dNQ4Ac1iyKYY9DzkJqfVqFz9SmfKTpLuzTtqudzUQtZJqAUpphyXiBfNmmUb8yTWBQEtHQuZz 677 | Closed and gathered SOL from fund wallets 11 : https://solscan.io/tx/3PnrNK22VUZrE5JcJEnhSVJC87dQzM97z8Yp1JPUmCt9PnwYk2SxGurUGBKp8kQ3KLwPjw7QLHpqsKzbkPWYyKjn 678 | Closed and gathered SOL from fund wallets 13 : https://solscan.io/tx/3jTxUhrA99JqsASo5Mt182n4ChqgbYncZBSXbdzbGmJhSB8GFyCfupEAiSed3q6aEea3dngv1spseHDPPaeg9XHW 679 | Closed and gathered SOL from fund wallets 12 : https://solscan.io/tx/CKDqj5uNB5p9qXd4ChGorgGr8aF8CjrHNBmw2VWiKdxYLJQGBMtGvsJcx3vStNZd3PceCcgXAQU5YZ9cGejGjN9 680 | Closed and gathered SOL from fund wallets 15 : https://solscan.io/tx/2qsa2teMSD8YdJVxR8JjLVHmPXyB7yVVcFKYFoUJy9FSe3vSZz5ePbakdgLY6xMa41CrU5srATyTaTSkweom8DGa 681 | Closed and gathered SOL from fund wallets 10 : https://solscan.io/tx/CDyJi99NfxMQc89dTkvnMcoD4AwbDL3gWJTSXziJ7GdekCnvPTstZrUPkykkatNBxD7WkQHbPJ46hVC17axhieF 682 | Closed and gathered SOL from fund wallets 17 : https://solscan.io/tx/4Jpe3zMRKC3dyBmAFGBPSEusFSQTMm6kC2LPHMRcw99hkLWK3EDQGggzhyWsxRUUDzhrHkxWHYpEgbrJfbEBjh84 683 | Closed and gathered SOL from fund wallets 9 : https://solscan.io/tx/3b1JZdZMJ9u9pPPzV5P23szntXdmfna5tBDYef1KAtBrzCEwsKZnYPHuft4YHMeYCW1Z7tgafPNzdomyQkhWeb2i 684 | Closed and gathered SOL from fund wallets 8 : https://solscan.io/tx/4vhhwmjUEtqzSurDg7atsz41Wt9eLFDqVXoX7LTS9JbhpxHhWzw6k5v46sgs5Z5gZHRNAYXuCQ4KgBW6zvzNX8Cp 685 | Closed and gathered SOL from fund wallets 6 : https://solscan.io/tx/3dhdViVuZEvwSCQqGH1JU7bQJzSapr5KkC8DVKxjQTT4x2v4uhhpokj8kVMU2RWV5wNyWoBFFRRUAQuSBzszgmMc 686 | Closed and gathered SOL from fund wallets 7 : https://solscan.io/tx/3BRGELV2u25QXLv1r3N5AgwssE65dvArBNtqs4V5i72ukTp4HMJGp1UcCN1E59jCSaEswPBFd9T4XAhL51rBjugH 687 | Closed and gathered SOL from fund wallets 14 : https://solscan.io/tx/5UKPZVo49Nv8i7XxMQ2qSj1F4CcBwf7xs6bGqsurXo77znsz1DR4rK2CFA1Knm1kFX3PvsH3vsJCqjjsWgjQaZ2o 688 | Closed and gathered SOL from fund wallets 19 : https://solscan.io/tx/3j7gpQrA4HbVBVq7g9EQbeCnAL1UkdmmmgNa7Vd4JECk4cA4v7Uhvf2cZKuK34XBHiLyiVdssvju4fScqoBaXVtF 689 | Closed and gathered SOL from fund wallets 16 : https://solscan.io/tx/4hm6baukPNaaJyueQBgsiFkDXaYR9KsFuU3pP8vKSFL9Ay5zA93PjCo53qv257QzrdiGkizJfRFSKvDkf35z2GAi 690 | Closed and gathered SOL from fund wallets 18 : https://solscan.io/tx/EpAYFqT92isWJqFV5W4o5vf8Q1y5rhq1rQMoPapFyaqGbwrCamz81LGucSoZ9LRqYVW15sZsx1w58SReQu9SMzm 691 | Gathering wallets processing is ended! 692 | Gathering wallets processing is ended! 693 | 0.138945162 Sol in Main Wallet 694 | Distributing SOL to wallets... 695 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 696 | 697 | 698 | Creating LUT started 699 | LUT Address: FQvvcPAXo3cQY1HP46kEEiUAHesMQLC6ZN9dPDsV55sc 700 | 701 | 0.138945162 Sol in Main Wallet 702 | Distributing SOL to wallets... 703 | Mint Wallet is created. Mint wallet address: 39jF6GCGWtMXVULmZ3nVkZqXHwqrniRjxBiXP8BhW2xc 704 | 705 | Main wallet balance is not enough 706 | failed to distribute to fund wallets 707 | Gathering wallets processing is ended! 708 | Gathering wallets processing is ended! 709 | Gathering wallets processing is ended! 710 | You don't create token and buy yet. 711 | first you have to go step 1 712 | 713 | Gathering sol from bundler wallet completed! --------------------------------------------------------------------------------