├── dist.bat ├── gather.bat ├── types ├── index.ts └── mint.ts ├── constants ├── index.ts └── constants.ts ├── .prettierrc ├── utils ├── index.ts ├── logger.ts ├── getPoolInfo.ts ├── utils.ts ├── getPoolKeys.ts └── swapOnlyAmm.ts ├── package.json ├── .env.copy ├── executor ├── legacy.ts └── jito.ts ├── gather.ts ├── .gitignore ├── README.md ├── status.ts ├── index.ts ├── tsconfig.json ├── sell.ts └── yarn.lock /dist.bat: -------------------------------------------------------------------------------- 1 | npm start -------------------------------------------------------------------------------- /gather.bat: -------------------------------------------------------------------------------- 1 | npm run gather -------------------------------------------------------------------------------- /types/index.ts: -------------------------------------------------------------------------------- 1 | export * from './mint'; -------------------------------------------------------------------------------- /constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from './constants'; -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all", 4 | "printWidth": 120 5 | } -------------------------------------------------------------------------------- /utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | export * from './logger'; 3 | export * from './getPoolKeys' -------------------------------------------------------------------------------- /utils/logger.ts: -------------------------------------------------------------------------------- 1 | import pino from "pino"; 2 | 3 | const transport = pino.transport({ 4 | target: 'pino-pretty', 5 | }); 6 | 7 | export const logger = pino( 8 | { 9 | level: 'info', 10 | redact: ['poolKeys'], 11 | serializers: { 12 | error: pino.stdSerializers.err, 13 | }, 14 | base: undefined, 15 | }, 16 | transport, 17 | ); 18 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "volume-bot", 3 | "scripts": { 4 | "start": "ts-node index.ts", 5 | "sell": "ts-node sell.ts", 6 | "tsc": "tsc --noEmit", 7 | "gather": "ts-node gather.ts", 8 | "status": "ts-node status.ts", 9 | "massive": "ts-node massiveBuy.ts" 10 | }, 11 | "dependencies": { 12 | "@metaplex-foundation/mpl-token-metadata": "^3.2.1", 13 | "@metaplex-foundation/umi": "^0.9.1", 14 | "@raydium-io/raydium-sdk": "^1.3.1-beta.47", 15 | "@solana/spl-token": "^0.4.0", 16 | "@solana/web3.js": "^1.89.1", 17 | "axios": "^1.6.8", 18 | "bigint-buffer": "^1.1.5", 19 | "bn.js": "^5.2.1", 20 | "bs58": "^5.0.0", 21 | "dotenv": "^16.4.1", 22 | "jito-ts": "^3.0.1", 23 | "pino": "^8.18.0", 24 | "pino-pretty": "^10.3.1", 25 | "pino-std-serializers": "^6.2.2" 26 | }, 27 | "devDependencies": { 28 | "@types/bn.js": "^5.1.5", 29 | "prettier": "^3.2.4", 30 | "ts-node": "^10.9.2", 31 | "typescript": "^5.3.3" 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /.env.copy: -------------------------------------------------------------------------------- 1 | PRIVATE_KEY= 2 | RPC_ENDPOINT= 3 | RPC_WEBSOCKET_ENDPOINT= 4 | 5 | 6 | ####### BUY SETTING ####### 7 | IS_RANDOM=true 8 | DISTRIBUTION_AMOUNT=0.01 9 | BUY_AMOUNT=0.01 10 | BUY_UPPER_AMOUNT=0.002 11 | BUY_LOWER_AMOUNT=0.001 12 | 13 | BUY_INTERVAL_MAX=2000 14 | BUY_INTERVAL_MIN=4000 15 | 16 | CHECK_BAL_INTERVAL=3000 17 | DISTRIBUTE_WALLET_NUM=8 18 | 19 | SWAP_ROUTING=true 20 | 21 | ###### FOR MASSIVE BUY ##### 22 | WALLET_NUM=8 23 | 24 | ########## FOR SELL MODE ########## 25 | SELL_ALL_BY_TIMES=20 # how many time it will take to sell all tokens in subwallets through small buy and sell 26 | SELL_PERCENT=100 # how many percent of token in main wallet will be sold gradually 27 | 28 | #### TOKEN PAIR SETTING #### 29 | #TOKEN_MINT=tgw7RiFwLUsM9dHNGj2mdAZjuivdsk8FH9RESxFX8LX 30 | TOKEN_MINT=6VbEGuqwhjdgV9NxhMhvRkrFqXVNk53CvD7hK3C3yQS9 31 | POOL_ID=null 32 | 33 | TX_FEE=10 34 | ADDITIONAL_FEE=0.006 # should be larger than 0.006SOL 35 | JITO_KEY= 36 | JITO_FEE=120000 37 | BLOCKENGINE_URL=ny.mainnet.block-engine.jito.wtf 38 | 39 | 40 | ###### GENERAL SETTING ###### 41 | LOG_LEVEL=info -------------------------------------------------------------------------------- /executor/legacy.ts: -------------------------------------------------------------------------------- 1 | import { Connection, 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 = 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 | const confirmation = await solanaConnection.confirmTransaction( 18 | { 19 | signature, 20 | lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, 21 | blockhash: latestBlockhash.blockhash, 22 | } 23 | ); 24 | 25 | if (confirmation.value.err) { 26 | console.log("Confrimtaion error") 27 | return "" 28 | } else { 29 | if (isBuy) 30 | console.log(`Success in buy transaction: https://solscan.io/tx/${signature}`) 31 | else 32 | console.log(`Success in Sell transaction: https://solscan.io/tx/${signature}`) 33 | } 34 | return signature 35 | } 36 | -------------------------------------------------------------------------------- /types/mint.ts: -------------------------------------------------------------------------------- 1 | import { struct, u32, u8 } from '@solana/buffer-layout'; 2 | import { bool, publicKey, u64 } from '@solana/buffer-layout-utils'; 3 | import { Commitment, Connection, PublicKey } from '@solana/web3.js'; 4 | 5 | /** Information about a mint */ 6 | export interface Mint { 7 | /** Address of the mint */ 8 | address: PublicKey; 9 | /** 10 | * Optional authority used to mint new tokens. The mint authority may only be provided during mint creation. 11 | * If no mint authority is present then the mint has a fixed supply and no further tokens may be minted. 12 | */ 13 | mintAuthority: PublicKey | null; 14 | /** Total supply of tokens */ 15 | supply: bigint; 16 | /** Number of base 10 digits to the right of the decimal place */ 17 | decimals: number; 18 | /** Is this mint initialized */ 19 | isInitialized: boolean; 20 | /** Optional authority to freeze token accounts */ 21 | freezeAuthority: PublicKey | null; 22 | } 23 | 24 | /** Mint as stored by the program */ 25 | export interface RawMint { 26 | mintAuthorityOption: 1 | 0; 27 | mintAuthority: PublicKey; 28 | supply: bigint; 29 | decimals: number; 30 | isInitialized: boolean; 31 | freezeAuthorityOption: 1 | 0; 32 | freezeAuthority: PublicKey; 33 | } 34 | 35 | /** Buffer layout for de/serializing a mint */ 36 | export const MintLayout = struct([ 37 | u32('mintAuthorityOption'), 38 | publicKey('mintAuthority'), 39 | u64('supply'), 40 | u8('decimals'), 41 | bool('isInitialized'), 42 | u32('freezeAuthorityOption'), 43 | publicKey('freezeAuthority'), 44 | ]); -------------------------------------------------------------------------------- /constants/constants.ts: -------------------------------------------------------------------------------- 1 | import { logger, retrieveEnvVariable } from "../utils" 2 | 3 | export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger) 4 | export const RPC_ENDPOINT = retrieveEnvVariable('RPC_ENDPOINT', logger) 5 | export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('RPC_WEBSOCKET_ENDPOINT', logger) 6 | 7 | export const IS_RANDOM = retrieveEnvVariable('IS_RANDOM', logger) === 'true' 8 | export const SWAP_ROUTING = retrieveEnvVariable('SWAP_ROUTING', logger) === 'true' 9 | export const DISTRIBUTION_AMOUNT = Number(retrieveEnvVariable('DISTRIBUTION_AMOUNT', logger)) 10 | export const BUY_AMOUNT = Number(retrieveEnvVariable('BUY_AMOUNT', logger)) 11 | export const BUY_UPPER_AMOUNT = Number(retrieveEnvVariable('BUY_UPPER_AMOUNT', logger)) 12 | export const BUY_LOWER_AMOUNT = Number(retrieveEnvVariable('BUY_LOWER_AMOUNT', logger)) 13 | 14 | export const BUY_INTERVAL_MIN = Number(retrieveEnvVariable('BUY_INTERVAL_MIN', logger)) 15 | export const BUY_INTERVAL_MAX = Number(retrieveEnvVariable('BUY_INTERVAL_MAX', logger)) 16 | 17 | export const SELL_ALL_BY_TIMES = Number(retrieveEnvVariable('SELL_ALL_BY_TIMES', logger)) 18 | export const SELL_PERCENT = Number(retrieveEnvVariable('SELL_PERCENT', logger)) 19 | 20 | export const DISTRIBUTE_WALLET_NUM = Number(retrieveEnvVariable('DISTRIBUTE_WALLET_NUM', logger)) 21 | // export const CHECK_BAL_INTERVAL = Number(retrieveEnvVariable('CHECK_BAL_INTERVAL', logger)) 22 | 23 | export const WALLET_NUM = Number(retrieveEnvVariable('WALLET_NUM', logger)) 24 | 25 | export const TX_FEE = Number(retrieveEnvVariable('TX_FEE', logger)) 26 | 27 | export const TOKEN_MINT = retrieveEnvVariable('TOKEN_MINT', logger) 28 | export const POOL_ID = retrieveEnvVariable('POOL_ID', logger) 29 | 30 | export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger) 31 | 32 | export const ADDITIONAL_FEE = Number(retrieveEnvVariable('ADDITIONAL_FEE', logger)) 33 | // export const JITO_KEY = retrieveEnvVariable('JITO_KEY', logger) 34 | // export const BLOCKENGINE_URL = retrieveEnvVariable('BLOCKENGINE_URL', logger) 35 | // export const JITO_FEE = Number(retrieveEnvVariable('JITO_FEE', logger)) 36 | 37 | 38 | -------------------------------------------------------------------------------- /gather.ts: -------------------------------------------------------------------------------- 1 | import { 2 | Keypair, 3 | Connection, 4 | Transaction, 5 | SystemProgram, 6 | sendAndConfirmTransaction, 7 | ComputeBudgetProgram, 8 | } from '@solana/web3.js' 9 | import { 10 | PRIVATE_KEY, 11 | RPC_ENDPOINT, 12 | RPC_WEBSOCKET_ENDPOINT, 13 | } from './constants' 14 | import { Data, readJson } from './utils' 15 | import base58 from 'bs58' 16 | 17 | export const solanaConnection = new Connection(RPC_ENDPOINT, { 18 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 19 | }) 20 | const mainKp = Keypair.fromSecretKey(base58.decode(PRIVATE_KEY)) 21 | 22 | const gather = async () => { 23 | const data: Data[] = readJson() 24 | if (data.length == 0) { 25 | console.log("No wallet to gather") 26 | return 27 | } 28 | for (let i = 0; i < data.length; i++) { 29 | try { 30 | const wallet = Keypair.fromSecretKey(base58.decode(data[i].privateKey)) 31 | const balance = await solanaConnection.getBalance(wallet.publicKey) 32 | if (balance == 0) { 33 | console.log("sol balance is 0, skip this wallet") 34 | continue 35 | } 36 | const rent = await solanaConnection.getMinimumBalanceForRentExemption(32); 37 | console.log("🚀 ~ gather ~ minBalance:", rent) 38 | 39 | const transaction = new Transaction().add( 40 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 600_000 }), 41 | ComputeBudgetProgram.setComputeUnitLimit({ units: 20_000}), 42 | SystemProgram.transfer({ 43 | fromPubkey: wallet.publicKey, 44 | toPubkey: mainKp.publicKey, 45 | lamports: balance - 13 * 10 ** 3 - rent 46 | }) 47 | ) 48 | 49 | transaction.recentBlockhash = (await solanaConnection.getLatestBlockhash()).blockhash 50 | transaction.feePayer = wallet.publicKey 51 | console.log(await solanaConnection.simulateTransaction(transaction)) 52 | const sig = await sendAndConfirmTransaction(solanaConnection, transaction, [wallet], { skipPreflight: true }) 53 | console.log({ sig }) 54 | } catch (error) { 55 | console.log("Failed to gather sol in a wallet") 56 | } 57 | } 58 | } 59 | 60 | gather() -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | .pnpm-debug.log* 9 | 10 | # Diagnostic reports (https://nodejs.org/api/report.html) 11 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 12 | 13 | # Runtime data 14 | pids 15 | *.pid 16 | *.seed 17 | *.pid.lock 18 | 19 | # Directory for instrumented libs generated by jscoverage/JSCover 20 | lib-cov 21 | 22 | # Coverage directory used by tools like istanbul 23 | coverage 24 | *.lcov 25 | 26 | # nyc test coverage 27 | .nyc_output 28 | 29 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 30 | .grunt 31 | 32 | # Bower dependency directory (https://bower.io/) 33 | bower_components 34 | 35 | # node-waf configuration 36 | .lock-wscript 37 | 38 | # Compiled binary addons (https://nodejs.org/api/addons.html) 39 | build/Release 40 | 41 | # Dependency directories 42 | node_modules/ 43 | jspm_packages/ 44 | 45 | # Snowpack dependency directory (https://snowpack.dev/) 46 | web_modules/ 47 | 48 | # TypeScript cache 49 | *.tsbuildinfo 50 | 51 | # Optional npm cache directory 52 | .npm 53 | 54 | # Optional eslint cache 55 | .eslintcache 56 | 57 | # Optional stylelint cache 58 | .stylelintcache 59 | 60 | # Microbundle cache 61 | .rpt2_cache/ 62 | .rts2_cache_cjs/ 63 | .rts2_cache_es/ 64 | .rts2_cache_umd/ 65 | 66 | # Optional REPL history 67 | .node_repl_history 68 | 69 | # Output of 'npm pack' 70 | *.tgz 71 | 72 | # Yarn Integrity file 73 | .yarn-integrity 74 | 75 | # dotenv environment variable files 76 | .env 77 | .env.development.local 78 | .env.test.local 79 | .env.production.local 80 | .env.local 81 | 82 | # parcel-bundler cache (https://parceljs.org/) 83 | .cache 84 | .parcel-cache 85 | 86 | # Next.js build output 87 | .next 88 | out 89 | 90 | # Nuxt.js build / generate output 91 | .nuxt 92 | dist 93 | 94 | # Gatsby files 95 | .cache/ 96 | # Comment in the public line in if your project uses Gatsby and not Next.js 97 | # https://nextjs.org/blog/next-9-1#public-directory-support 98 | # public 99 | 100 | # vuepress build output 101 | .vuepress/dist 102 | 103 | # vuepress v2.x temp and cache directory 104 | .temp 105 | .cache 106 | 107 | # Docusaurus cache and generated files 108 | .docusaurus 109 | 110 | # Serverless directories 111 | .serverless/ 112 | 113 | # FuseBox cache 114 | .fusebox/ 115 | 116 | # DynamoDB Local files 117 | .dynamodb/ 118 | 119 | # TernJS port file 120 | .tern-port 121 | 122 | # Stores VSCode versions used for testing VSCode extensions 123 | .vscode-test 124 | 125 | # PNPM 126 | pnpm-lock.yaml 127 | 128 | # yarn v2 129 | .yarn/cache 130 | .yarn/unplugged 131 | .yarn/build-state.yml 132 | .yarn/install-state.gz 133 | .pnp.* 134 | 135 | # JetBrains 136 | .idea 137 | 138 | # Visual Studio Code 139 | *.code-workspace 140 | 141 | data.json -------------------------------------------------------------------------------- /utils/getPoolInfo.ts: -------------------------------------------------------------------------------- 1 | 2 | 3 | import { 4 | Liquidity, 5 | LIQUIDITY_STATE_LAYOUT_V4, 6 | MARKET_STATE_LAYOUT_V3, 7 | SPL_MINT_LAYOUT, 8 | ApiPoolInfoV4, 9 | Market, 10 | } from '@raydium-io/raydium-sdk' 11 | import { NATIVE_MINT } from '@solana/spl-token' 12 | import { 13 | Connection, 14 | PublicKey, 15 | } from '@solana/web3.js' 16 | 17 | async function _formatAmmKeysById(id: string, connection: Connection): Promise { 18 | const account = await connection.getAccountInfo(new PublicKey(id)) 19 | if (account === null) throw Error(' get id info error ') 20 | const info = LIQUIDITY_STATE_LAYOUT_V4.decode(account.data) 21 | 22 | const marketId = info.marketId 23 | const marketAccount = await connection.getAccountInfo(marketId) 24 | if (marketAccount === null) throw Error(' get market info error') 25 | const marketInfo = MARKET_STATE_LAYOUT_V3.decode(marketAccount.data) 26 | 27 | const lpMint = info.lpMint 28 | const lpMintAccount = await connection.getAccountInfo(lpMint) 29 | if (lpMintAccount === null) throw Error(' get lp mint info error') 30 | const lpMintInfo = SPL_MINT_LAYOUT.decode(lpMintAccount.data) 31 | 32 | return { 33 | id, 34 | baseMint: info.baseMint.toString(), 35 | quoteMint: info.quoteMint.toString(), 36 | lpMint: info.lpMint.toString(), 37 | baseDecimals: info.baseDecimal.toNumber(), 38 | quoteDecimals: info.quoteDecimal.toNumber(), 39 | lpDecimals: lpMintInfo.decimals, 40 | version: 4, 41 | programId: account.owner.toString(), 42 | authority: Liquidity.getAssociatedAuthority({ programId: account.owner }).publicKey.toString(), 43 | openOrders: info.openOrders.toString(), 44 | targetOrders: info.targetOrders.toString(), 45 | baseVault: info.baseVault.toString(), 46 | quoteVault: info.quoteVault.toString(), 47 | withdrawQueue: info.withdrawQueue.toString(), 48 | lpVault: info.lpVault.toString(), 49 | marketVersion: 3, 50 | marketProgramId: info.marketProgramId.toString(), 51 | marketId: info.marketId.toString(), 52 | marketAuthority: Market.getAssociatedAuthority({ programId: info.marketProgramId, marketId: info.marketId }).publicKey.toString(), 53 | marketBaseVault: marketInfo.baseVault.toString(), 54 | marketQuoteVault: marketInfo.quoteVault.toString(), 55 | marketBids: marketInfo.bids.toString(), 56 | marketAsks: marketInfo.asks.toString(), 57 | marketEventQueue: marketInfo.eventQueue.toString(), 58 | lookupTableAccount: PublicKey.default.toString() 59 | } 60 | } 61 | 62 | export const getPoolKeys = async (connection: Connection, baseMint: PublicKey) => { 63 | try { 64 | const res = await fetch(`https://api.dexscreener.com/latest/dex/tokens/${baseMint.toBase58()}`, { 65 | method: 'GET', 66 | headers: { 67 | Accept: 'application/json', 68 | 'Content-Type': 'application/json' 69 | } 70 | }) 71 | const data = await res.clone().json() 72 | if (data.pairs.length == 0) { 73 | return null 74 | } else { 75 | const raydiumPairId = data.pairs.filter((pair: any) => pair.dexId === "raydium" && pair.quoteToken.address == NATIVE_MINT.toBase58())[0].pairAddress 76 | const poolState = await _formatAmmKeysById(raydiumPairId, connection) 77 | return poolState 78 | } 79 | } catch (e) { 80 | console.log("error in fetching price of pool", e) 81 | return null 82 | } 83 | } 84 | 85 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # How can I boost the volume of spl token in Raydium? 2 | # Raydium Volume Bot 3 | 4 | This volume bot distribute SOL to multiple wallets and buy and sell with that distributed wallets permanently on the Raydium platform. 5 | 6 | https://x.com/Pio_ne_er/status/1841157402475053090 7 | 8 | You can try version1 with this telegram bot 9 | 10 | https://t.me/@Ifb_volumebot 11 | 12 | This is the video for the users who don't know well about programming to facilitate the running the CLI bots. 13 | I hope this is very helpful for those people. 14 | 15 | ## Contact Info 16 | 17 | Telegram: @hi_3333 18 | 19 | You can always feel free to find me here for my help on other projects. 20 | 21 | ## Features 22 | 23 | - **Automated Wallet Creation**: Create number of wallets automatically to buy and sell the token 24 | - **Automated SOL Distribution**: Distributes SOL to those new wallets. 25 | - **Endless Buy and Sell Swaps**: Buy and Sell with those wallets permanently. 26 | - **Configurable Parameters**: Allows customization of buy amounts, intervals, distribution settings, and more. 27 | 28 | ## Usage 29 | 1. Clone the repository 30 | ``` 31 | git clone https://github.com/pio-ne-er/Solana-raydium-volume-bot.git 32 | cd Solana-raydium-volume-bot 33 | ``` 34 | 2. Install dependencies 35 | ``` 36 | npm install 37 | ``` 38 | 3. Configure the environment variables 39 | 40 | Rename the .env.copy file to .env and set RPC and WSS, main wallet's secret key, and jito auth keypair. 41 | 42 | 4. Run the bot 43 | 44 | ``` 45 | npm run start 46 | ``` 47 | 48 | # Version 2 is developed and it is private repository. 49 | ### What is the main difference between the former volume booster and the updated one? 50 | 51 | https://x.com/Pio_ne_er/status/1831053270737121302 52 | You can see the transactions and bot running in this video. 53 | I hope it will be helpful for you. 54 | 55 | ## 🚀 Last Version's Drawbacks and Improvements 56 | - ❌ **Repetitive buy and sell with one wallet**: The last version of the Raydium Volume Bot used fixed wallets, so it was apparent on DexScreener that some wallets performed repetitive buy and sell actions. 57 | - ✅ **Transferring SOL to new wallet**: After buying and selling in one wallet, it transfers SOL to a newly created wallet and continues buying and selling there. 58 | - ❌ **No increase in the number of makers**: It didn't increase the number of pool makers, only the volume. 59 | - ✅ **Maker increase**: New wallets are created every round of buying and selling, increasing the number of makers. 60 | - ❌ **Gathering token instead of SOL**: When gathering, if there were tokens left, it didn't sell them before gathering. Instead, it just gathered tokens to the main wallet. 61 | - ✅ **Sell before gather**: When gathering, if there are tokens left in the wallet, it sells the tokens first and gathers only SOL (the token account rent of 0.00203 SOL is reclaimed). 62 | - ❌ **Equal number of buys and sells**: One-time buy and one-time sell actions left sell pressure at the end, as there was always a sell at the end of the volume operation. 63 | - ✅ **More buys than sells**: It randomly buys twice with SOL in the wallet and sells all tokens after some time, making the number of buys twice as many as sells, thus creating more buy pressure. 64 | 65 | # Version 3 is also developed. 66 | ### Version 3 is designed for the massive transactions in a very short time. 67 | So, it is making 500 transactions in a minute. 68 | You can see my volume bot version3 working in here. 69 | 70 | https://dexscreener.com/solana/boisf5dnefrbsodmiupkpauglaggx9gdjl1csgmcjqnn 71 | 72 | There is no repeated makers and it is making 20 transactions a second. 73 | 74 | If you increase the volume of each transaction, 1 million in an hour is a piece of cake. 75 | How wonderful it is. 76 | I am proud of my version3. 77 | If you need it, you can contact me. 78 | 79 | -------------------------------------------------------------------------------- /executor/jito.ts: -------------------------------------------------------------------------------- 1 | 2 | // Jito Bundling part 3 | 4 | import { Connection, Keypair, PublicKey, VersionedTransaction } from "@solana/web3.js" 5 | import { BLOCKENGINE_URL, JITO_FEE, JITO_KEY, RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "../constants" 6 | import base58 from "bs58" 7 | import { SearcherClient, searcherClient } from "jito-ts/dist/sdk/block-engine/searcher" 8 | import { Bundle } from "jito-ts/dist/sdk/block-engine/types" 9 | import { isError } from "jito-ts/dist/sdk/block-engine/utils" 10 | 11 | const solanaConnection = new Connection(RPC_ENDPOINT, { 12 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 13 | }) 14 | 15 | export async function bundle(txs: VersionedTransaction[], keypair: Keypair) { 16 | try { 17 | const txNum = Math.ceil(txs.length / 3) 18 | let successNum = 0 19 | for (let i = 0; i < txNum; i++) { 20 | const upperIndex = (i + 1) * 3 21 | const downIndex = i * 3 22 | const newTxs = [] 23 | for (let j = downIndex; j < upperIndex; j++) { 24 | if (txs[j]) newTxs.push(txs[j]) 25 | } 26 | let success = await bull_dozer(newTxs, keypair) 27 | return success 28 | } 29 | if (successNum == txNum) return true 30 | else return false 31 | } catch (error) { 32 | return false 33 | } 34 | } 35 | 36 | export async function bull_dozer(txs: VersionedTransaction[], keypair: Keypair) { 37 | try { 38 | const bundleTransactionLimit = parseInt('4') 39 | const jitoKey = Keypair.fromSecretKey(base58.decode(JITO_KEY)) 40 | const search = searcherClient(BLOCKENGINE_URL, jitoKey) 41 | 42 | await build_bundle( 43 | search, 44 | bundleTransactionLimit, 45 | txs, 46 | keypair 47 | ) 48 | const bundle_result = await onBundleResult(search) 49 | return bundle_result 50 | } catch (error) { 51 | return 0 52 | } 53 | } 54 | 55 | 56 | async function build_bundle( 57 | search: SearcherClient, 58 | bundleTransactionLimit: number, 59 | txs: VersionedTransaction[], 60 | keypair: Keypair 61 | ) { 62 | 63 | const accounts = await search.getTipAccounts() 64 | const _tipAccount = accounts[Math.min(Math.floor(Math.random() * accounts.length), 3)] 65 | const tipAccount = new PublicKey(_tipAccount) 66 | 67 | const bund = new Bundle([], bundleTransactionLimit) 68 | const resp = await solanaConnection.getLatestBlockhash("processed") 69 | bund.addTransactions(...txs) 70 | 71 | let maybeBundle = bund.addTipTx( 72 | keypair, 73 | JITO_FEE, 74 | tipAccount, 75 | resp.blockhash 76 | ) 77 | 78 | if (isError(maybeBundle)) { 79 | throw maybeBundle 80 | } 81 | try { 82 | await search.sendBundle(maybeBundle) 83 | } catch (e) { } 84 | return maybeBundle 85 | } 86 | 87 | export const onBundleResult = (c: SearcherClient): Promise => { 88 | let first = 0 89 | let isResolved = false 90 | 91 | return new Promise((resolve) => { 92 | // Set a timeout to reject the promise if no bundle is accepted within 5 seconds 93 | setTimeout(() => { 94 | resolve(first) 95 | isResolved = true 96 | }, 30000) 97 | 98 | c.onBundleResult( 99 | (result: any) => { 100 | if (isResolved) return first 101 | // clearTimeout(timeout) // Clear the timeout if a bundle is accepted 102 | const isAccepted = result.accepted 103 | const isRejected = result.rejected 104 | if (isResolved == false) { 105 | 106 | if (isAccepted) { 107 | // console.log(`bundle accepted, ID: ${result.bundleId} | Slot: ${result.accepted!.slot}`) 108 | first += 1 109 | isResolved = true 110 | resolve(first) // Resolve with 'first' when a bundle is accepted 111 | } 112 | if (isRejected) { 113 | // Do not resolve or reject the promise here 114 | } 115 | } 116 | }, 117 | (e: any) => { 118 | // Do not reject the promise here 119 | } 120 | ) 121 | }) 122 | } 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /utils/utils.ts: -------------------------------------------------------------------------------- 1 | import { Logger } from 'pino'; 2 | import dotenv from 'dotenv'; 3 | import fs from 'fs'; 4 | 5 | dotenv.config(); 6 | 7 | export const retrieveEnvVariable = (variableName: string, logger: Logger) => { 8 | const variable = process.env[variableName] || ''; 9 | if (!variable) { 10 | console.log(`${variableName} is not set`); 11 | process.exit(1); 12 | } 13 | return variable; 14 | }; 15 | 16 | 17 | // Define the type for the JSON file content 18 | export interface Data { 19 | privateKey: string; 20 | pubkey: string; 21 | solBalance: number | null; 22 | tokenBuyTx: string | null, 23 | tokenSellTx: string | null, 24 | } 25 | 26 | 27 | export const randVal = (min: number, max: number, count: number, total: number, isEven: boolean): number[] => { 28 | 29 | const arr: number[] = Array(count).fill(total / count); 30 | if (isEven) return arr 31 | 32 | if (max * count < total) 33 | throw new Error("Invalid input: max * count must be greater than or equal to total.") 34 | if (min * count > total) 35 | throw new Error("Invalid input: min * count must be less than or equal to total.") 36 | const average = total / count 37 | // Randomize pairs of elements 38 | for (let i = 0; i < count; i += 2) { 39 | // Generate a random adjustment within the range 40 | const adjustment = Math.random() * Math.min(max - average, average - min) 41 | // Add adjustment to one element and subtract from the other 42 | arr[i] += adjustment 43 | arr[i + 1] -= adjustment 44 | } 45 | // if (count % 2) arr.pop() 46 | return arr; 47 | } 48 | 49 | 50 | export const saveDataToFile = (newData: Data[], filePath: string = "data.json") => { 51 | try { 52 | let existingData: Data[] = []; 53 | 54 | // Check if the file exists 55 | if (fs.existsSync(filePath)) { 56 | // If the file exists, read its content 57 | const fileContent = fs.readFileSync(filePath, 'utf-8'); 58 | existingData = JSON.parse(fileContent); 59 | } 60 | 61 | // Add the new data to the existing array 62 | existingData.push(...newData); 63 | 64 | // Write the updated data back to the file 65 | fs.writeFileSync(filePath, JSON.stringify(existingData, null, 2)); 66 | 67 | } catch (error) { 68 | try { 69 | if (fs.existsSync(filePath)) { 70 | fs.unlinkSync(filePath); 71 | console.log(`File ${filePath} deleted and create new file.`); 72 | } 73 | fs.writeFileSync(filePath, JSON.stringify(newData, null, 2)); 74 | console.log("File is saved successfully.") 75 | } catch (error) { 76 | console.log('Error saving data to JSON file:', error); 77 | } 78 | } 79 | }; 80 | 81 | export const sleep = async (ms: number) => { 82 | await new Promise((resolve) => setTimeout(resolve, ms)) 83 | } 84 | 85 | 86 | export function deleteConsoleLines(numLines: number) { 87 | for (let i = 0; i < numLines; i++) { 88 | process.stdout.moveCursor(0, -1); // Move cursor up one line 89 | process.stdout.clearLine(-1); // Clear the line 90 | } 91 | } 92 | 93 | 94 | // Function to read JSON file 95 | export function readJson(filename: string = "data.json"): Data[] { 96 | if (!fs.existsSync(filename)) { 97 | // If the file does not exist, create an empty array 98 | fs.writeFileSync(filename, '[]', 'utf-8'); 99 | } 100 | const data = fs.readFileSync(filename, 'utf-8'); 101 | return JSON.parse(data) as Data[]; 102 | } 103 | 104 | // Function to write JSON file 105 | export function writeJson( data: Data[], filename: string = "data.json",): void { 106 | fs.writeFileSync(filename, JSON.stringify(data, null, 4), 'utf-8'); 107 | } 108 | 109 | // Function to edit JSON file content 110 | export function editJson(newData: Partial, filename: string = "data.json"): void { 111 | if(!newData.pubkey) { 112 | console.log("Pubkey is not prvided as an argument") 113 | return 114 | } 115 | const wallets = readJson(filename); 116 | const index = wallets.findIndex(wallet => wallet.pubkey === newData.pubkey); 117 | if (index !== -1) { 118 | wallets[index] = { ...wallets[index], ...newData }; 119 | writeJson(wallets, filename); 120 | } else { 121 | console.error(`Pubkey ${newData.pubkey} does not exist.`); 122 | } 123 | } 124 | 125 | -------------------------------------------------------------------------------- /status.ts: -------------------------------------------------------------------------------- 1 | import { 2 | LiquidityPoolKeysV4, 3 | } from '@raydium-io/raydium-sdk' 4 | import { 5 | NATIVE_MINT, 6 | } from '@solana/spl-token' 7 | import { 8 | Keypair, 9 | Connection, 10 | PublicKey, 11 | LAMPORTS_PER_SOL, 12 | } from '@solana/web3.js' 13 | import { 14 | BUY_LOWER_AMOUNT, 15 | BUY_UPPER_AMOUNT, 16 | CHECK_BAL_INTERVAL, 17 | DISTRIBUTE_WALLET_NUM, 18 | LOG_LEVEL, 19 | PRIVATE_KEY, 20 | RPC_ENDPOINT, 21 | RPC_WEBSOCKET_ENDPOINT, 22 | TOKEN_MINT, 23 | } from './constants' 24 | import { deleteConsoleLines, logger, PoolKeys, readJson, sleep } from './utils' 25 | import base58 from 'bs58' 26 | 27 | export const solanaConnection = new Connection(RPC_ENDPOINT, { 28 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 29 | }) 30 | 31 | export const mainKp = Keypair.fromSecretKey(base58.decode(PRIVATE_KEY)) 32 | const baseMint = new PublicKey(TOKEN_MINT) 33 | const distritbutionNum = DISTRIBUTE_WALLET_NUM > 20 ? 20 : DISTRIBUTE_WALLET_NUM 34 | let quoteVault: PublicKey | null = null 35 | let poolKeys: LiquidityPoolKeysV4 36 | let sold: number = 0 37 | let bought: number = 0 38 | let totalSolPut: number = 0 39 | let changeAmount = 0 40 | let buyNum = 0 41 | let sellNum = 0 42 | logger.level = LOG_LEVEL 43 | 44 | interface Data { 45 | privateKey: string; 46 | pubkey: string; 47 | solBalance: number | null; 48 | tokenBuyTx: string | null, 49 | tokenSellTx: string | null, 50 | } 51 | 52 | const data: Data[] = readJson() 53 | const walletPks = data.map(data => data.pubkey) 54 | console.log("🚀 ~ walletPks:", walletPks) 55 | 56 | 57 | const main = async () => { 58 | 59 | const solBalance = (await solanaConnection.getBalance(mainKp.publicKey)) / LAMPORTS_PER_SOL 60 | console.log(`Wallet address: ${mainKp.publicKey.toBase58()}`) 61 | console.log(`Pool token mint: ${baseMint.toBase58()}`) 62 | console.log(`Wallet SOL balance: ${solBalance.toFixed(3)}SOL`) 63 | console.log("Check interval: ", CHECK_BAL_INTERVAL, "ms") 64 | 65 | let poolId: PublicKey 66 | poolKeys = await PoolKeys.fetchPoolKeyInfo(solanaConnection, baseMint, NATIVE_MINT) 67 | poolId = poolKeys.id 68 | quoteVault = poolKeys.quoteVault 69 | console.log(`Successfully fetched pool info`) 70 | console.log(`Pool id: ${poolId.toBase58()}`) 71 | 72 | trackWalletOnLog(solanaConnection, quoteVault) 73 | } 74 | 75 | const getPoolStatus = async (poolId: PublicKey) => { 76 | while (true) { 77 | try { 78 | const res = await fetch(`https://api.dexscreener.com/latest/dex/pairs/solana/${poolId?.toBase58()}`, { 79 | method: 'GET', 80 | headers: { 81 | Accept: 'application/json', 82 | 'Content-Type': 'application/json' 83 | } 84 | }) 85 | const data = await res.json() 86 | 87 | const { url, priceNative, priceUsd, txns, volume, priceChange } = data.pair 88 | 89 | // console.log(`\t url: ${url}`) 90 | // console.log(`\t price: ${priceNative} SOL / ${priceUsd} usd`) 91 | // console.log(`\t Volume status => m5: $${volume.m5}\t|\th1: $${volume.h1}\t|\th6: $${volume.h6}\t|\t h24: $${volume.h24}`) 92 | // console.log(`\t Recent buy status (buy / sell) => m5: ${txns.m5.buys} / ${txns.m5.sells}\t\t|\th1: ${txns.h1.buys} / ${txns.h1.sells}\t|\th6: ${txns.h6.buys} / ${txns.h6.sells}\t|\t h24: ${txns.h24.buys} / ${txns.h24.sells}`) 93 | // console.log(`\t volume price change => m5: ${priceChange.m5}%\t\t|\th1: ${priceChange.h1}%\t|\th6: ${priceChange.h6}%\t|\t h24: ${priceChange.h24}%`) 94 | 95 | await sleep(5000) 96 | } catch (error) { 97 | console.log("Error fetching ") 98 | await sleep(2000) 99 | } 100 | } 101 | } 102 | 103 | async function trackWalletOnLog(connection: Connection, quoteVault: PublicKey): Promise { 104 | 105 | const initialWsolBal = (await connection.getTokenAccountBalance(quoteVault)).value.uiAmount 106 | if (!initialWsolBal) { 107 | console.log("Quote vault mismatch") 108 | return 109 | } 110 | 111 | const checkBal = setInterval(async () => { 112 | const bal = (await connection.getTokenAccountBalance(quoteVault)).value.uiAmount 113 | if (!bal) { 114 | console.log("Quote vault mismatch") 115 | return 116 | } 117 | changeAmount = bal - initialWsolBal 118 | deleteConsoleLines(1) 119 | console.log(`Other users bought ${buyNum - bought} times and sold ${sellNum - sold} times, total SOL change is ${changeAmount - totalSolPut}SOL`) 120 | }, CHECK_BAL_INTERVAL) 121 | try { 122 | connection.onLogs( 123 | quoteVault, 124 | async ({ logs, err, signature }) => { 125 | if (err) { } 126 | else { 127 | 128 | const parsedData = await connection.getParsedTransaction(signature, { maxSupportedTransactionVersion: 0, commitment: "confirmed" }) 129 | const signer = parsedData?.transaction.message.accountKeys.filter((elem: any) => { 130 | return elem.signer == true 131 | })[0].pubkey.toBase58() 132 | 133 | // console.log(`\nTransaction success: https://solscan.io/tx/${signature}\n`) 134 | if(!walletPks.includes(signer!)){ 135 | if (Number(parsedData?.meta?.preBalances[0]) > Number(parsedData?.meta?.postBalances[0])) { 136 | buyNum++ 137 | } else { 138 | sellNum++ 139 | } 140 | } 141 | 142 | 143 | } 144 | }, 145 | "confirmed" 146 | ); 147 | } catch (error) { } 148 | } 149 | 150 | 151 | main() -------------------------------------------------------------------------------- /utils/getPoolKeys.ts: -------------------------------------------------------------------------------- 1 | import { Liquidity, LiquidityPoolKeysV4, MARKET_STATE_LAYOUT_V3, Market } from "@raydium-io/raydium-sdk"; 2 | import { Commitment, Connection, PublicKey } from "@solana/web3.js"; 3 | 4 | import dotenv from 'dotenv' 5 | dotenv.config(); 6 | 7 | export class PoolKeys { 8 | static SOLANA_ADDRESS = 'So11111111111111111111111111111111111111112' 9 | static RAYDIUM_POOL_V4_PROGRAM_ID = '675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8'; 10 | static OPENBOOK_ADDRESS = 'srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX'; 11 | static SOL_DECIMALS = 9 12 | 13 | static async fetchMarketId(connection: Connection, baseMint: PublicKey, quoteMint: PublicKey, commitment: Commitment) { 14 | let accounts = await connection.getProgramAccounts( 15 | new PublicKey('srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX'), 16 | { 17 | commitment, 18 | filters: [ 19 | { dataSize: MARKET_STATE_LAYOUT_V3.span }, 20 | { 21 | memcmp: { 22 | offset: MARKET_STATE_LAYOUT_V3.offsetOf("baseMint"), 23 | bytes: baseMint.toBase58(), 24 | }, 25 | }, 26 | { 27 | memcmp: { 28 | offset: MARKET_STATE_LAYOUT_V3.offsetOf("quoteMint"), 29 | bytes: quoteMint.toBase58(), 30 | }, 31 | }, 32 | ], 33 | } 34 | ); 35 | if(!accounts) 36 | accounts = await connection.getProgramAccounts( 37 | new PublicKey('srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX'), 38 | { 39 | commitment, 40 | filters: [ 41 | { dataSize: MARKET_STATE_LAYOUT_V3.span }, 42 | { 43 | memcmp: { 44 | offset: MARKET_STATE_LAYOUT_V3.offsetOf("quoteMint"), 45 | bytes: baseMint.toBase58(), 46 | }, 47 | }, 48 | { 49 | memcmp: { 50 | offset: MARKET_STATE_LAYOUT_V3.offsetOf("baseMint"), 51 | bytes: quoteMint.toBase58(), 52 | }, 53 | }, 54 | ], 55 | } 56 | ); 57 | console.log(accounts) 58 | return accounts.map(({ account }) => MARKET_STATE_LAYOUT_V3.decode(account.data))[0].ownAddress 59 | } 60 | 61 | static async fetchMarketInfo(connection: Connection, marketId: PublicKey) { 62 | const marketAccountInfo = await connection.getAccountInfo(marketId, "processed"); 63 | if (!marketAccountInfo) { 64 | throw new Error('Failed to fetch market info for market id ' + marketId.toBase58()); 65 | } 66 | 67 | return MARKET_STATE_LAYOUT_V3.decode(marketAccountInfo.data); 68 | } 69 | 70 | static async generateV4PoolInfo(baseMint: PublicKey, quoteMint: PublicKey, marketID: PublicKey) { 71 | const poolInfo = Liquidity.getAssociatedPoolKeys({ 72 | version: 4, 73 | marketVersion: 3, 74 | baseMint: baseMint, 75 | quoteMint: quoteMint, 76 | baseDecimals: 0, 77 | quoteDecimals: this.SOL_DECIMALS, 78 | programId: new PublicKey('675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8'), 79 | marketId: marketID, 80 | marketProgramId: new PublicKey('srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX'), 81 | }); 82 | 83 | return { poolInfo } 84 | } 85 | 86 | static async fetchPoolKeyInfo(connection: Connection, baseMint: PublicKey, quoteMint: PublicKey) { 87 | const marketId = await this.fetchMarketId(connection, baseMint, quoteMint, 'confirmed') 88 | 89 | // const marketInfo = await this.fetchMarketInfo(connection, marketId); 90 | // const baseMintInfo = await connection.getParsedAccountInfo(baseMint, "confirmed") as MintInfo; 91 | // const baseDecimals = baseMintInfo.value.data.parsed.info.decimals 92 | 93 | const V4PoolInfo = await this.generateV4PoolInfo(baseMint, quoteMint, marketId) 94 | const lpMintInfo = await connection.getParsedAccountInfo(V4PoolInfo.poolInfo.lpMint, "confirmed") as MintInfo; 95 | 96 | return { 97 | id: V4PoolInfo.poolInfo.id, 98 | marketId: marketId, 99 | baseMint: baseMint, 100 | quoteMint: quoteMint, 101 | baseVault: V4PoolInfo.poolInfo.baseVault, 102 | quoteVault: V4PoolInfo.poolInfo.quoteVault, 103 | lpMint: V4PoolInfo.poolInfo.lpMint, 104 | // baseDecimals: baseDecimals, 105 | quoteDecimals: this.SOL_DECIMALS, 106 | lpDecimals: lpMintInfo.value.data.parsed.info.decimals, 107 | version: 4, 108 | programId: new PublicKey(this.RAYDIUM_POOL_V4_PROGRAM_ID), 109 | authority: V4PoolInfo.poolInfo.authority, 110 | openOrders: V4PoolInfo.poolInfo.openOrders, 111 | targetOrders: V4PoolInfo.poolInfo.targetOrders, 112 | withdrawQueue: new PublicKey("11111111111111111111111111111111"), 113 | lpVault: new PublicKey("11111111111111111111111111111111"), 114 | marketVersion: 3, 115 | marketProgramId: new PublicKey(this.OPENBOOK_ADDRESS), 116 | marketAuthority: Market.getAssociatedAuthority({ programId: new PublicKey(this.OPENBOOK_ADDRESS), marketId: marketId }).publicKey, 117 | // marketBaseVault: marketInfo.baseVault, 118 | // marketQuoteVault: marketInfo.quoteVault, 119 | // marketBids: marketInfo.bids, 120 | // marketAsks: marketInfo.asks, 121 | // marketEventQueue: marketInfo.eventQueue, 122 | lookupTableAccount: PublicKey.default 123 | } 124 | } 125 | } 126 | 127 | interface MintInfo { 128 | value: { 129 | data: { 130 | parsed: { 131 | info: { 132 | decimals: number 133 | } 134 | } 135 | } 136 | } 137 | } -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | import { 2 | NATIVE_MINT, 3 | getAssociatedTokenAddress, 4 | } from '@solana/spl-token' 5 | import { 6 | Keypair, 7 | Connection, 8 | PublicKey, 9 | LAMPORTS_PER_SOL, 10 | SystemProgram, 11 | VersionedTransaction, 12 | TransactionInstruction, 13 | TransactionMessage, 14 | ComputeBudgetProgram, 15 | Transaction 16 | } from '@solana/web3.js' 17 | import { 18 | ADDITIONAL_FEE, 19 | BUY_AMOUNT, 20 | BUY_INTERVAL_MAX, 21 | BUY_INTERVAL_MIN, 22 | BUY_LOWER_AMOUNT, 23 | BUY_UPPER_AMOUNT, 24 | DISTRIBUTE_WALLET_NUM, 25 | DISTRIBUTION_AMOUNT, 26 | IS_RANDOM, 27 | PRIVATE_KEY, 28 | RPC_ENDPOINT, 29 | RPC_WEBSOCKET_ENDPOINT, 30 | TOKEN_MINT, 31 | } from './constants' 32 | import { Data, editJson, readJson, saveDataToFile, sleep } from './utils' 33 | import base58 from 'bs58' 34 | import { getBuyTx, getBuyTxWithJupiter, getSellTx, getSellTxWithJupiter } from './utils/swapOnlyAmm' 35 | import { execute } from './executor/legacy' 36 | import { bundle } from './executor/jito' 37 | import { getPoolKeys } from './utils/getPoolInfo' 38 | import { SWAP_ROUTING } from './constants' 39 | 40 | export const solanaConnection = new Connection(RPC_ENDPOINT, { 41 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 42 | }) 43 | 44 | export const mainKp = Keypair.fromSecretKey(base58.decode(PRIVATE_KEY)) 45 | const baseMint = new PublicKey(TOKEN_MINT) 46 | const distritbutionNum = DISTRIBUTE_WALLET_NUM > 10 ? 10 : DISTRIBUTE_WALLET_NUM 47 | let quoteVault: PublicKey | null = null 48 | let vaultAmount: number = 0 49 | let poolId: PublicKey 50 | let poolKeys = null 51 | let sold: number = 0 52 | let bought: number = 0 53 | let totalSolPut: number = 0 54 | let changeAmount = 0 55 | let buyNum = 0 56 | let sellNum = 0 57 | 58 | 59 | const main = async () => { 60 | 61 | const solBalance = (await solanaConnection.getBalance(mainKp.publicKey)) / LAMPORTS_PER_SOL 62 | console.log(`Volume bot is running`) 63 | console.log(`Wallet address: ${mainKp.publicKey.toBase58()}`) 64 | console.log(`Pool token mint: ${baseMint.toBase58()}`) 65 | console.log(`Wallet SOL balance: ${solBalance.toFixed(3)}SOL`) 66 | console.log(`Buying interval max: ${BUY_INTERVAL_MAX}ms`) 67 | console.log(`Buying interval min: ${BUY_INTERVAL_MIN}ms`) 68 | console.log(`Buy upper limit amount: ${BUY_UPPER_AMOUNT}SOL`) 69 | console.log(`Buy lower limit amount: ${BUY_LOWER_AMOUNT}SOL`) 70 | console.log(`Distribute SOL to ${distritbutionNum} wallets`) 71 | 72 | if (SWAP_ROUTING) { 73 | console.log("Buy and sell with jupiter swap v6 routing") 74 | } else { 75 | poolKeys = await getPoolKeys(solanaConnection, baseMint) 76 | if (poolKeys == null) { 77 | return 78 | } 79 | // poolKeys = await PoolKeys.fetchPoolKeyInfo(solanaConnection, baseMint, NATIVE_MINT) 80 | poolId = new PublicKey(poolKeys.id) 81 | quoteVault = new PublicKey(poolKeys.quoteVault) 82 | console.log(`Successfully fetched pool info`) 83 | console.log(`Pool id: ${poolId.toBase58()}`) 84 | } 85 | 86 | let data: { 87 | kp: Keypair; 88 | buyAmount: number; 89 | }[] | null = null 90 | 91 | if (solBalance < (BUY_LOWER_AMOUNT + ADDITIONAL_FEE) * distritbutionNum) { 92 | console.log("Sol balance is not enough for distribution") 93 | } 94 | 95 | data = await distributeSol(mainKp, distritbutionNum) 96 | if (data === null) { 97 | console.log("Distribution failed") 98 | return 99 | } 100 | 101 | data.map(async ({ kp }, i) => { 102 | await sleep((BUY_INTERVAL_MAX + BUY_INTERVAL_MIN) * i / 2) 103 | while (true) { 104 | // buy part 105 | const BUY_INTERVAL = Math.round(Math.random() * (BUY_INTERVAL_MAX - BUY_INTERVAL_MIN) + BUY_INTERVAL_MIN) 106 | 107 | const solBalance = await solanaConnection.getBalance(kp.publicKey) / LAMPORTS_PER_SOL 108 | 109 | let buyAmount: number 110 | if (IS_RANDOM) 111 | buyAmount = Number((Math.random() * (BUY_UPPER_AMOUNT - BUY_LOWER_AMOUNT) + BUY_LOWER_AMOUNT).toFixed(6)) 112 | else 113 | buyAmount = BUY_AMOUNT 114 | 115 | if (solBalance < ADDITIONAL_FEE) { 116 | console.log("Balance is not enough: ", solBalance, "SOL") 117 | return 118 | } 119 | 120 | // try buying until success 121 | let i = 0 122 | while (true) { 123 | if (i > 10) { 124 | console.log("Error in buy transaction") 125 | return 126 | } 127 | 128 | const result = await buy(kp, baseMint, buyAmount, poolId) 129 | if (result) { 130 | break 131 | } else { 132 | i++ 133 | console.log("Buy failed, try again") 134 | await sleep(2000) 135 | } 136 | } 137 | 138 | await sleep(3000) 139 | 140 | // try selling until success 141 | let j = 0 142 | while (true) { 143 | if (j > 10) { 144 | console.log("Error in sell transaction") 145 | return 146 | } 147 | const result = await sell(poolId, baseMint, kp) 148 | if (result) { 149 | break 150 | } else { 151 | j++ 152 | console.log("Sell failed, try again") 153 | await sleep(2000) 154 | } 155 | } 156 | await sleep(5000 + distritbutionNum * BUY_INTERVAL) 157 | } 158 | }) 159 | } 160 | 161 | const distributeSol = async (mainKp: Keypair, distritbutionNum: number) => { 162 | const data: Data[] = [] 163 | const wallets = [] 164 | try { 165 | const sendSolTx: TransactionInstruction[] = [] 166 | sendSolTx.push( 167 | ComputeBudgetProgram.setComputeUnitLimit({units: 100_000}), 168 | ComputeBudgetProgram.setComputeUnitPrice({microLamports: 250_000}) 169 | ) 170 | for (let i = 0; i < distritbutionNum; i++) { 171 | let solAmount = DISTRIBUTION_AMOUNT 172 | if (DISTRIBUTION_AMOUNT < ADDITIONAL_FEE + BUY_UPPER_AMOUNT) 173 | solAmount = ADDITIONAL_FEE + BUY_UPPER_AMOUNT 174 | 175 | const wallet = Keypair.generate() 176 | wallets.push({ kp: wallet, buyAmount: solAmount }) 177 | 178 | sendSolTx.push( 179 | SystemProgram.transfer({ 180 | fromPubkey: mainKp.publicKey, 181 | toPubkey: wallet.publicKey, 182 | lamports: solAmount * LAMPORTS_PER_SOL 183 | }) 184 | ) 185 | } 186 | let index = 0 187 | while (true) { 188 | try { 189 | if (index > 3) { 190 | console.log("Error in distribution") 191 | return null 192 | } 193 | const siTx = new Transaction().add(...sendSolTx) 194 | const latestBlockhash = await solanaConnection.getLatestBlockhash() 195 | siTx.feePayer = mainKp.publicKey 196 | siTx.recentBlockhash = latestBlockhash.blockhash 197 | const messageV0 = new TransactionMessage({ 198 | payerKey: mainKp.publicKey, 199 | recentBlockhash: latestBlockhash.blockhash, 200 | instructions: sendSolTx, 201 | }).compileToV0Message() 202 | const transaction = new VersionedTransaction(messageV0) 203 | transaction.sign([mainKp]) 204 | const txSig = await execute(transaction, latestBlockhash) 205 | const tokenBuyTx = txSig ? `https://solscan.io/tx/${txSig}` : '' 206 | console.log("SOL distributed ", tokenBuyTx) 207 | break 208 | } catch (error) { 209 | index++ 210 | } 211 | } 212 | 213 | wallets.map((wallet) => { 214 | data.push({ 215 | privateKey: base58.encode(wallet.kp.secretKey), 216 | pubkey: wallet.kp.publicKey.toBase58(), 217 | solBalance: wallet.buyAmount + ADDITIONAL_FEE, 218 | tokenBuyTx: null, 219 | tokenSellTx: null 220 | }) 221 | }) 222 | try { 223 | saveDataToFile(data) 224 | } catch (error) { 225 | 226 | } 227 | console.log("Success in transferring sol") 228 | return wallets 229 | } catch (error) { 230 | console.log(`Failed to transfer SOL`) 231 | return null 232 | } 233 | } 234 | 235 | 236 | const buy = async (newWallet: Keypair, baseMint: PublicKey, buyAmount: number, poolId: PublicKey) => { 237 | let solBalance: number = 0 238 | try { 239 | solBalance = await solanaConnection.getBalance(newWallet.publicKey) 240 | } catch (error) { 241 | console.log("Error getting balance of wallet") 242 | return null 243 | } 244 | if (solBalance == 0) { 245 | return null 246 | } 247 | try { 248 | let tx; 249 | if (SWAP_ROUTING) 250 | tx = await getBuyTxWithJupiter(newWallet, baseMint, buyAmount) 251 | else 252 | tx = await getBuyTx(solanaConnection, newWallet, baseMint, NATIVE_MINT, buyAmount, poolId.toBase58()) 253 | if (tx == null) { 254 | console.log(`Error getting buy transaction`) 255 | return null 256 | } 257 | const latestBlockhash = await solanaConnection.getLatestBlockhash() 258 | const txSig = await execute(tx, latestBlockhash) 259 | const tokenBuyTx = txSig ? `https://solscan.io/tx/${txSig}` : '' 260 | editJson({ 261 | tokenBuyTx, 262 | pubkey: newWallet.publicKey.toBase58(), 263 | solBalance: solBalance / 10 ** 9 - buyAmount, 264 | }) 265 | return tokenBuyTx 266 | } catch (error) { 267 | return null 268 | } 269 | } 270 | 271 | const sell = async (poolId: PublicKey, baseMint: PublicKey, wallet: Keypair) => { 272 | try { 273 | const data: Data[] = readJson() 274 | if (data.length == 0) { 275 | await sleep(1000) 276 | return null 277 | } 278 | 279 | const tokenAta = await getAssociatedTokenAddress(baseMint, wallet.publicKey) 280 | const tokenBalInfo = await solanaConnection.getTokenAccountBalance(tokenAta) 281 | if (!tokenBalInfo) { 282 | console.log("Balance incorrect") 283 | return null 284 | } 285 | const tokenBalance = tokenBalInfo.value.amount 286 | 287 | try { 288 | let sellTx; 289 | if (SWAP_ROUTING) 290 | sellTx = await getSellTxWithJupiter(wallet, baseMint, tokenBalance) 291 | else 292 | sellTx = await getSellTx(solanaConnection, wallet, baseMint, NATIVE_MINT, tokenBalance, poolId.toBase58()) 293 | 294 | if (sellTx == null) { 295 | console.log(`Error getting buy transaction`) 296 | return null 297 | } 298 | 299 | const latestBlockhashForSell = await solanaConnection.getLatestBlockhash() 300 | const txSellSig = await execute(sellTx, latestBlockhashForSell, false) 301 | const tokenSellTx = txSellSig ? `https://solscan.io/tx/${txSellSig}` : '' 302 | const solBalance = await solanaConnection.getBalance(wallet.publicKey) 303 | editJson({ 304 | pubkey: wallet.publicKey.toBase58(), 305 | tokenSellTx, 306 | solBalance 307 | }) 308 | return tokenSellTx 309 | } catch (error) { 310 | return null 311 | } 312 | } catch (error) { 313 | return null 314 | } 315 | } 316 | 317 | 318 | main() 319 | 320 | -------------------------------------------------------------------------------- /utils/swapOnlyAmm.ts: -------------------------------------------------------------------------------- 1 | import assert from 'assert'; 2 | 3 | import { 4 | jsonInfo2PoolKeys, 5 | Liquidity, 6 | LiquidityPoolKeys, 7 | Percent, 8 | Token, 9 | TokenAmount, 10 | ApiPoolInfoV4, 11 | LIQUIDITY_STATE_LAYOUT_V4, 12 | MARKET_STATE_LAYOUT_V3, 13 | Market, 14 | SPL_MINT_LAYOUT, 15 | SPL_ACCOUNT_LAYOUT, 16 | TokenAccount, 17 | TxVersion, 18 | buildSimpleTransaction, 19 | LOOKUP_TABLE_CACHE, 20 | } from '@raydium-io/raydium-sdk'; 21 | 22 | import { 23 | PublicKey, 24 | Keypair, 25 | Connection, 26 | VersionedTransaction 27 | } from '@solana/web3.js'; 28 | 29 | import { TOKEN_PROGRAM_ID, getAssociatedTokenAddress, getMint } from '@solana/spl-token'; 30 | import { logger } from '.'; 31 | import { TOKEN_MINT, TX_FEE } from '../constants'; 32 | import base58 from 'bs58'; 33 | import { BN } from 'bn.js'; 34 | 35 | type WalletTokenAccounts = Awaited> 36 | type TestTxInputInfo = { 37 | outputToken: Token 38 | targetPool: string 39 | inputTokenAmount: TokenAmount 40 | slippage: Percent 41 | walletTokenAccounts: WalletTokenAccounts 42 | wallet: Keypair 43 | } 44 | 45 | async function getWalletTokenAccount(connection: Connection, wallet: PublicKey): Promise { 46 | const walletTokenAccount = await connection.getTokenAccountsByOwner(wallet, { 47 | programId: TOKEN_PROGRAM_ID, 48 | }); 49 | return walletTokenAccount.value.map((i) => ({ 50 | pubkey: i.pubkey, 51 | programId: i.account.owner, 52 | accountInfo: SPL_ACCOUNT_LAYOUT.decode(i.account.data), 53 | })); 54 | } 55 | 56 | 57 | async function swapOnlyAmm(connection: Connection, input: TestTxInputInfo) { 58 | // -------- pre-action: get pool info -------- 59 | const targetPoolInfo = await formatAmmKeysById(connection, input.targetPool) 60 | assert(targetPoolInfo, 'cannot find the target pool') 61 | const poolKeys = jsonInfo2PoolKeys(targetPoolInfo) as LiquidityPoolKeys 62 | 63 | // -------- step 1: coumpute amount out -------- 64 | const { amountOut, minAmountOut } = Liquidity.computeAmountOut({ 65 | poolKeys: poolKeys, 66 | poolInfo: await Liquidity.fetchInfo({ connection, poolKeys }), 67 | amountIn: input.inputTokenAmount, 68 | currencyOut: input.outputToken, 69 | slippage: input.slippage, 70 | }) 71 | 72 | // -------- step 2: create instructions by SDK function -------- 73 | const { innerTransactions } = await Liquidity.makeSwapInstructionSimple({ 74 | connection, 75 | poolKeys, 76 | userKeys: { 77 | tokenAccounts: input.walletTokenAccounts, 78 | owner: input.wallet.publicKey, 79 | }, 80 | amountIn: input.inputTokenAmount, 81 | amountOut: minAmountOut, 82 | fixedSide: 'in', 83 | makeTxVersion: TxVersion.V0, 84 | computeBudgetConfig: { 85 | microLamports: 12_000 * TX_FEE, 86 | units: 100_000 87 | } 88 | }) 89 | return innerTransactions 90 | } 91 | 92 | export async function formatAmmKeysById(connection: Connection, id: string): Promise { 93 | const account = await connection.getAccountInfo(new PublicKey(id)) 94 | if (account === null) throw Error(' get id info error ') 95 | const info = LIQUIDITY_STATE_LAYOUT_V4.decode(account.data) 96 | 97 | const marketId = info.marketId 98 | const marketAccount = await connection.getAccountInfo(marketId) 99 | if (marketAccount === null) throw Error(' get market info error') 100 | const marketInfo = MARKET_STATE_LAYOUT_V3.decode(marketAccount.data) 101 | 102 | const lpMint = info.lpMint 103 | const lpMintAccount = await connection.getAccountInfo(lpMint) 104 | if (lpMintAccount === null) throw Error(' get lp mint info error') 105 | const lpMintInfo = SPL_MINT_LAYOUT.decode(lpMintAccount.data) 106 | 107 | return { 108 | id, 109 | baseMint: info.baseMint.toString(), 110 | quoteMint: info.quoteMint.toString(), 111 | lpMint: info.lpMint.toString(), 112 | baseDecimals: info.baseDecimal.toNumber(), 113 | quoteDecimals: info.quoteDecimal.toNumber(), 114 | lpDecimals: lpMintInfo.decimals, 115 | version: 4, 116 | programId: account.owner.toString(), 117 | authority: Liquidity.getAssociatedAuthority({ programId: account.owner }).publicKey.toString(), 118 | openOrders: info.openOrders.toString(), 119 | targetOrders: info.targetOrders.toString(), 120 | baseVault: info.baseVault.toString(), 121 | quoteVault: info.quoteVault.toString(), 122 | withdrawQueue: info.withdrawQueue.toString(), 123 | lpVault: info.lpVault.toString(), 124 | marketVersion: 3, 125 | marketProgramId: info.marketProgramId.toString(), 126 | marketId: info.marketId.toString(), 127 | marketAuthority: Market.getAssociatedAuthority({ programId: info.marketProgramId, marketId: info.marketId }).publicKey.toString(), 128 | marketBaseVault: marketInfo.baseVault.toString(), 129 | marketQuoteVault: marketInfo.quoteVault.toString(), 130 | marketBids: marketInfo.bids.toString(), 131 | marketAsks: marketInfo.asks.toString(), 132 | marketEventQueue: marketInfo.eventQueue.toString(), 133 | lookupTableAccount: PublicKey.default.toString() 134 | } 135 | } 136 | 137 | export async function getBuyTx(solanaConnection: Connection, wallet: Keypair, baseMint: PublicKey, quoteMint: PublicKey, amount: number, targetPool: string) { 138 | 139 | const baseInfo = await getMint(solanaConnection, baseMint) 140 | if (baseInfo == null) { 141 | return null 142 | } 143 | 144 | const baseDecimal = baseInfo.decimals 145 | 146 | const baseToken = new Token(TOKEN_PROGRAM_ID, baseMint, baseDecimal) 147 | const quoteToken = new Token(TOKEN_PROGRAM_ID, quoteMint, 9) 148 | 149 | const quoteTokenAmount = new TokenAmount(quoteToken, Math.floor(amount * 10 ** 9)) 150 | const slippage = new Percent(100, 100) 151 | const walletTokenAccounts = await getWalletTokenAccount(solanaConnection, wallet.publicKey) 152 | 153 | const instructions = await swapOnlyAmm(solanaConnection, { 154 | outputToken: baseToken, 155 | targetPool, 156 | inputTokenAmount: quoteTokenAmount, 157 | slippage, 158 | walletTokenAccounts, 159 | wallet: wallet, 160 | }) 161 | 162 | const willSendTx = (await buildSimpleTransaction({ 163 | connection: solanaConnection, 164 | makeTxVersion: TxVersion.V0, 165 | payer: wallet.publicKey, 166 | innerTransactions: instructions, 167 | addLookupTableInfo: LOOKUP_TABLE_CACHE 168 | }))[0] 169 | if (willSendTx instanceof VersionedTransaction) { 170 | willSendTx.sign([wallet]) 171 | return willSendTx 172 | } 173 | return null 174 | } 175 | 176 | export async function getSellTx(solanaConnection: Connection, wallet: Keypair, baseMint: PublicKey, quoteMint: PublicKey, amount: string, targetPool: string) { 177 | try { 178 | const tokenAta = await getAssociatedTokenAddress(baseMint, wallet.publicKey) 179 | const tokenBal = await solanaConnection.getTokenAccountBalance(tokenAta) 180 | if (!tokenBal || tokenBal.value.uiAmount == 0) 181 | return null 182 | const balance = tokenBal.value.amount 183 | tokenBal.value.decimals 184 | const baseToken = new Token(TOKEN_PROGRAM_ID, baseMint, tokenBal.value.decimals) 185 | const quoteToken = new Token(TOKEN_PROGRAM_ID, quoteMint, 9) 186 | const baseTokenAmount = new TokenAmount(baseToken, amount) 187 | const slippage = new Percent(99, 100) 188 | const walletTokenAccounts = await getWalletTokenAccount(solanaConnection, wallet.publicKey) 189 | 190 | const instructions = await swapOnlyAmm(solanaConnection, { 191 | outputToken: quoteToken, 192 | targetPool, 193 | inputTokenAmount: baseTokenAmount, 194 | slippage, 195 | walletTokenAccounts, 196 | wallet: wallet, 197 | }) 198 | 199 | const willSendTx = (await buildSimpleTransaction({ 200 | connection: solanaConnection, 201 | makeTxVersion: TxVersion.V0, 202 | payer: wallet.publicKey, 203 | innerTransactions: instructions, 204 | addLookupTableInfo: LOOKUP_TABLE_CACHE 205 | }))[0] 206 | if (willSendTx instanceof VersionedTransaction) { 207 | willSendTx.sign([wallet]) 208 | return willSendTx 209 | } 210 | return null 211 | } catch (error) { 212 | console.log("Error in selling token") 213 | return null 214 | } 215 | } 216 | 217 | 218 | export const getBuyTxWithJupiter = async (wallet: Keypair, baseMint: PublicKey, amount: number) => { 219 | try { 220 | const lamports = Math.floor(amount * 10 ** 9) 221 | const quoteResponse = await ( 222 | await fetch( 223 | `https://quote-api.jup.ag/v6/quote?inputMint=So11111111111111111111111111111111111111112&outputMint=${baseMint.toBase58()}&amount=${lamports}&slippageBps=100` 224 | ) 225 | ).json(); 226 | 227 | // get serialized transactions for the swap 228 | const { swapTransaction } = await ( 229 | await fetch("https://quote-api.jup.ag/v6/swap", { 230 | method: "POST", 231 | headers: { 232 | "Content-Type": "application/json", 233 | }, 234 | body: JSON.stringify({ 235 | quoteResponse, 236 | userPublicKey: wallet.publicKey.toString(), 237 | wrapAndUnwrapSol: true, 238 | dynamicComputeUnitLimit: true, 239 | prioritizationFeeLamports: 52000 240 | }), 241 | }) 242 | ).json(); 243 | 244 | // deserialize the transaction 245 | const swapTransactionBuf = Buffer.from(swapTransaction, "base64"); 246 | var transaction = VersionedTransaction.deserialize(swapTransactionBuf); 247 | 248 | // sign the transaction 249 | transaction.sign([wallet]); 250 | return transaction 251 | } catch (error) { 252 | console.log("Failed to get buy transaction") 253 | return null 254 | } 255 | }; 256 | 257 | 258 | export const getSellTxWithJupiter = async (wallet: Keypair, baseMint: PublicKey, amount: string) => { 259 | try { 260 | const quoteResponse = await ( 261 | await fetch( 262 | `https://quote-api.jup.ag/v6/quote?inputMint=${baseMint.toBase58()}&outputMint=So11111111111111111111111111111111111111112&amount=${amount}&slippageBps=100` 263 | ) 264 | ).json(); 265 | 266 | // get serialized transactions for the swap 267 | const { swapTransaction } = await ( 268 | await fetch("https://quote-api.jup.ag/v6/swap", { 269 | method: "POST", 270 | headers: { 271 | "Content-Type": "application/json", 272 | }, 273 | body: JSON.stringify({ 274 | quoteResponse, 275 | userPublicKey: wallet.publicKey.toString(), 276 | wrapAndUnwrapSol: true, 277 | dynamicComputeUnitLimit: true, 278 | prioritizationFeeLamports: 52000 279 | }), 280 | }) 281 | ).json(); 282 | 283 | // deserialize the transaction 284 | const swapTransactionBuf = Buffer.from(swapTransaction, "base64"); 285 | var transaction = VersionedTransaction.deserialize(swapTransactionBuf); 286 | 287 | // sign the transaction 288 | transaction.sign([wallet]); 289 | return transaction 290 | } catch (error) { 291 | console.log("Failed to get sell transaction") 292 | return null 293 | } 294 | }; -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "es2016", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ 22 | // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ 26 | 27 | /* Modules */ 28 | "module": "commonjs", /* Specify what module code is generated. */ 29 | // "rootDir": "./", /* Specify the root folder within your source files. */ 30 | // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ 31 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 32 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 33 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 34 | // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ 35 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 36 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 37 | // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ 38 | // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ 39 | // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ 40 | // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ 41 | // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ 42 | "resolveJsonModule": true, /* Enable importing .json files. */ 43 | // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ 44 | // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ 45 | 46 | /* JavaScript Support */ 47 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ 48 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 49 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ 50 | 51 | /* Emit */ 52 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 53 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 54 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 55 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 56 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 57 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ 58 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 59 | // "removeComments": true, /* Disable emitting comments. */ 60 | // "noEmit": true, /* Disable emitting files from a compilation. */ 61 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 62 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types. */ 63 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 64 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 65 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 66 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 67 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 68 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 69 | // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ 70 | // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ 71 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 72 | // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ 73 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 74 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 75 | 76 | /* Interop Constraints */ 77 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 78 | // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ 79 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 80 | "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ 81 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 82 | "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ 83 | 84 | /* Type Checking */ 85 | "strict": true, /* Enable all strict type-checking options. */ 86 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ 87 | // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ 88 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 89 | // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ 90 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 91 | // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ 92 | // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ 93 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 94 | // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ 95 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ 96 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 97 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 98 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 99 | // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ 100 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 101 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ 102 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 103 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 104 | 105 | /* Completeness */ 106 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 107 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /sell.ts: -------------------------------------------------------------------------------- 1 | import { 2 | NATIVE_MINT, 3 | createAssociatedTokenAccountInstruction, 4 | createTransferInstruction, 5 | getAssociatedTokenAddress, 6 | transfer, 7 | } from '@solana/spl-token' 8 | import { 9 | Keypair, 10 | Connection, 11 | PublicKey, 12 | LAMPORTS_PER_SOL, 13 | SystemProgram, 14 | VersionedTransaction, 15 | TransactionInstruction, 16 | TransactionMessage, 17 | ComputeBudgetProgram, 18 | Transaction 19 | } from '@solana/web3.js' 20 | import { 21 | ADDITIONAL_FEE, 22 | BUY_AMOUNT, 23 | BUY_INTERVAL_MAX, 24 | BUY_INTERVAL_MIN, 25 | BUY_LOWER_AMOUNT, 26 | BUY_UPPER_AMOUNT, 27 | DISTRIBUTE_WALLET_NUM, 28 | DISTRIBUTION_AMOUNT, 29 | IS_RANDOM, 30 | PRIVATE_KEY, 31 | RPC_ENDPOINT, 32 | RPC_WEBSOCKET_ENDPOINT, 33 | TOKEN_MINT, 34 | WALLET_NUM, 35 | SELL_ALL_BY_TIMES, 36 | SELL_PERCENT 37 | } from './constants' 38 | import { Data, editJson, readJson, saveDataToFile, sleep } from './utils' 39 | import base58 from 'bs58' 40 | import { getBuyTx, getBuyTxWithJupiter, getSellTx, getSellTxWithJupiter } from './utils/swapOnlyAmm' 41 | import { execute } from './executor/legacy' 42 | import { bundle } from './executor/jito' 43 | import { getPoolKeys } from './utils/getPoolInfo' 44 | import { SWAP_ROUTING } from './constants' 45 | import { ApiPoolInfoV4 } from '@raydium-io/raydium-sdk' 46 | import { BN } from 'bn.js' 47 | 48 | export const solanaConnection = new Connection(RPC_ENDPOINT, { 49 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 50 | }) 51 | 52 | export const mainKp = Keypair.fromSecretKey(base58.decode(PRIVATE_KEY)) 53 | const baseMint = new PublicKey(TOKEN_MINT) 54 | const distritbutionNum = DISTRIBUTE_WALLET_NUM > 10 ? 10 : DISTRIBUTE_WALLET_NUM 55 | let quoteVault: PublicKey | null = null 56 | let vaultAmount: number = 0 57 | let poolId: PublicKey 58 | let poolKeys: null | ApiPoolInfoV4 = null 59 | let sold: number = 0 60 | let bought: number = 0 61 | let totalSolPut: number = 0 62 | let changeAmount = 0 63 | let buyNum = 0 64 | let sellNum = 0 65 | 66 | const main = async () => { 67 | 68 | const solBalance = (await solanaConnection.getBalance(mainKp.publicKey)) / LAMPORTS_PER_SOL 69 | console.log(`Volume bot is running`) 70 | console.log(`Wallet address: ${mainKp.publicKey.toBase58()}`) 71 | console.log(`Pool token mint: ${baseMint.toBase58()}`) 72 | console.log(`Wallet SOL balance: ${solBalance.toFixed(3)}SOL`) 73 | console.log(`Buying interval max: ${BUY_INTERVAL_MAX}ms`) 74 | console.log(`Buying interval min: ${BUY_INTERVAL_MIN}ms`) 75 | console.log(`Buy upper limit amount: ${BUY_UPPER_AMOUNT}SOL`) 76 | console.log(`Buy lower limit amount: ${BUY_LOWER_AMOUNT}SOL`) 77 | console.log(`Distribute SOL to ${distritbutionNum} wallets`) 78 | 79 | if (SWAP_ROUTING) { 80 | console.log("Buy and sell with jupiter swap v6 routing") 81 | } else { 82 | poolKeys = await getPoolKeys(solanaConnection, baseMint) 83 | if (poolKeys == null) { 84 | return 85 | } 86 | // poolKeys = await PoolKeys.fetchPoolKeyInfo(solanaConnection, baseMint, NATIVE_MINT) 87 | poolId = new PublicKey(poolKeys.id) 88 | quoteVault = new PublicKey(poolKeys.quoteVault) 89 | console.log(`Successfully fetched pool info`) 90 | console.log(`Pool id: ${poolId.toBase58()}`) 91 | } 92 | 93 | let data: { 94 | kp: Keypair; 95 | buyAmount: number; 96 | }[] | null = null 97 | 98 | if (solBalance < (BUY_LOWER_AMOUNT + ADDITIONAL_FEE) * distritbutionNum) { 99 | console.log("Sol balance is not enough for distribution") 100 | } 101 | 102 | data = await distributeSolAndToken(mainKp, distritbutionNum, baseMint) 103 | if (data === null) { 104 | console.log("Distribution failed") 105 | return 106 | } 107 | 108 | data.map(async ({ kp }, i) => { 109 | await sleep((BUY_INTERVAL_MAX + BUY_INTERVAL_MIN) * i / 2) 110 | 111 | const ata = await getAssociatedTokenAddress(baseMint, kp.publicKey) 112 | const initBalance = (await solanaConnection.getTokenAccountBalance(ata)).value.uiAmount 113 | if(!initBalance || initBalance == 0){ 114 | console.log("Error, distribution didn't work") 115 | return null 116 | } 117 | 118 | let soldIndex = 1 119 | while (true) { 120 | // buy part 121 | const BUY_INTERVAL = Math.round(Math.random() * (BUY_INTERVAL_MAX - BUY_INTERVAL_MIN) + BUY_INTERVAL_MIN) 122 | 123 | const solBalance = await solanaConnection.getBalance(kp.publicKey) / LAMPORTS_PER_SOL 124 | 125 | let buyAmount: number 126 | if (IS_RANDOM) 127 | buyAmount = Number((Math.random() * (BUY_UPPER_AMOUNT - BUY_LOWER_AMOUNT) + BUY_LOWER_AMOUNT).toFixed(6)) 128 | else 129 | buyAmount = BUY_AMOUNT 130 | 131 | if (solBalance < ADDITIONAL_FEE) { 132 | console.log("Balance is not enough: ", solBalance, "SOL") 133 | return 134 | } 135 | 136 | // try buying until success 137 | let i = 0 138 | while (true) { 139 | if (i > 10) { 140 | console.log("Error in buy transaction") 141 | return 142 | } 143 | 144 | const result = await buy(kp, baseMint, buyAmount, poolId) 145 | if (result) { 146 | break 147 | } else { 148 | i++ 149 | console.log("Buy failed, try again") 150 | await sleep(2000) 151 | } 152 | } 153 | 154 | await sleep(1000) 155 | 156 | // try selling until success 157 | let j = 0 158 | while (true) { 159 | if (j > 10) { 160 | console.log("Error in sell transaction") 161 | return 162 | } 163 | const result = await sell(poolId, baseMint, kp, soldIndex, initBalance) 164 | if (result) { 165 | soldIndex++ 166 | break 167 | } else { 168 | j++ 169 | console.log("Sell failed, try again") 170 | await sleep(2000) 171 | } 172 | } 173 | await sleep(5000 + distritbutionNum * BUY_INTERVAL) 174 | } 175 | }) 176 | } 177 | 178 | interface WalletData { 179 | kp: Keypair, 180 | buyAmount: number 181 | } 182 | 183 | const distributeSolAndToken = async (mainKp: Keypair, distritbutionNum: number, baseMint: PublicKey) => { 184 | const data: Data[] = [] 185 | const wallets: WalletData[] = [] 186 | const mainAta = await getAssociatedTokenAddress(baseMint, mainKp.publicKey) 187 | let mainTokenBalance: string | null = null 188 | try { 189 | mainTokenBalance = (await solanaConnection.getTokenAccountBalance(mainAta)).value.amount 190 | } catch (error) { 191 | console.log("Error getting token balance of the main wallet\n Can't continue this mode without token in main wallet") 192 | return null 193 | } 194 | if(!mainTokenBalance || mainTokenBalance == "0" ){ 195 | console.log("Error getting token balance of the main wallet\n Can't continue this mode without token in main wallet") 196 | return null 197 | } 198 | console.log("Main wallet's tokenbalance is ", mainTokenBalance) 199 | try { 200 | let tokenAmountPerWallet = 201 | new BN(mainTokenBalance).div(new BN(WALLET_NUM).mul(new BN(Math.floor(SELL_PERCENT))).div(new BN(100))).toString() 202 | const distributionIx: TransactionInstruction[] = [] 203 | distributionIx.push( 204 | ComputeBudgetProgram.setComputeUnitLimit({units: 800_000}), 205 | ComputeBudgetProgram.setComputeUnitPrice({microLamports: 250_000}) 206 | ) 207 | for (let i = 0; i < distritbutionNum; i++) { 208 | let solAmount = DISTRIBUTION_AMOUNT 209 | if (DISTRIBUTION_AMOUNT < ADDITIONAL_FEE + BUY_UPPER_AMOUNT) 210 | solAmount = ADDITIONAL_FEE + BUY_UPPER_AMOUNT 211 | 212 | const wallet = Keypair.generate() 213 | wallets.push({ kp: wallet, buyAmount: solAmount }) 214 | const destAta = await getAssociatedTokenAddress(baseMint, wallet.publicKey) 215 | 216 | distributionIx.push( 217 | SystemProgram.transfer({ 218 | fromPubkey: mainKp.publicKey, 219 | toPubkey: wallet.publicKey, 220 | lamports: solAmount * LAMPORTS_PER_SOL 221 | }), 222 | createAssociatedTokenAccountInstruction(mainKp.publicKey, destAta, wallet.publicKey, baseMint), 223 | createTransferInstruction(mainAta, destAta, mainKp.publicKey, BigInt(tokenAmountPerWallet)) 224 | ) 225 | } 226 | let index = 0 227 | while (true) { 228 | try { 229 | if (index > 3) { 230 | console.log("Error in distribution") 231 | return null 232 | } 233 | 234 | console.log(tokenAmountPerWallet) 235 | console.log("object") 236 | const transaction1 = new Transaction().add(...distributionIx) 237 | transaction1.feePayer = mainKp.publicKey 238 | transaction1.recentBlockhash = (await solanaConnection.getLatestBlockhash()).blockhash 239 | console.log(await solanaConnection.simulateTransaction(transaction1)) 240 | 241 | const siTx = new Transaction().add(...distributionIx) 242 | const latestBlockhash = await solanaConnection.getLatestBlockhash() 243 | siTx.feePayer = mainKp.publicKey 244 | siTx.recentBlockhash = latestBlockhash.blockhash 245 | const messageV0 = new TransactionMessage({ 246 | payerKey: mainKp.publicKey, 247 | recentBlockhash: latestBlockhash.blockhash, 248 | instructions: distributionIx, 249 | }).compileToV0Message() 250 | const transaction = new VersionedTransaction(messageV0) 251 | transaction.sign([mainKp]) 252 | const txSig = await execute(transaction, latestBlockhash) 253 | const tokenBuyTx = txSig ? `https://solscan.io/tx/${txSig}` : '' 254 | console.log("SOL and token distributed ", tokenBuyTx) 255 | break 256 | } catch (error) { 257 | index++ 258 | console.log(error) 259 | } 260 | } 261 | 262 | wallets.map((wallet) => { 263 | data.push({ 264 | privateKey: base58.encode(wallet.kp.secretKey), 265 | pubkey: wallet.kp.publicKey.toBase58(), 266 | solBalance: wallet.buyAmount + ADDITIONAL_FEE, 267 | tokenBuyTx: null, 268 | tokenSellTx: null 269 | }) 270 | }) 271 | try { 272 | saveDataToFile(data) 273 | } catch (error) { 274 | 275 | } 276 | console.log("Success in transferring sol") 277 | return wallets 278 | } catch (error) { 279 | console.log(`Failed to transfer SOL`) 280 | return null 281 | } 282 | } 283 | 284 | 285 | const buy = async (newWallet: Keypair, baseMint: PublicKey, buyAmount: number, poolId: PublicKey) => { 286 | let solBalance: number = 0 287 | try { 288 | solBalance = await solanaConnection.getBalance(newWallet.publicKey) 289 | } catch (error) { 290 | console.log("Error getting balance of wallet") 291 | return null 292 | } 293 | if (solBalance == 0) { 294 | return null 295 | } 296 | try { 297 | let tx; 298 | if (SWAP_ROUTING) 299 | tx = await getBuyTxWithJupiter(newWallet, baseMint, buyAmount) 300 | else 301 | tx = await getBuyTx(solanaConnection, newWallet, baseMint, NATIVE_MINT, buyAmount, poolId.toBase58()) 302 | if (tx == null) { 303 | console.log(`Error getting buy transaction`) 304 | return null 305 | } 306 | const latestBlockhash = await solanaConnection.getLatestBlockhash() 307 | const txSig = await execute(tx, latestBlockhash) 308 | const tokenBuyTx = txSig ? `https://solscan.io/tx/${txSig}` : '' 309 | editJson({ 310 | tokenBuyTx, 311 | pubkey: newWallet.publicKey.toBase58(), 312 | solBalance: solBalance / 10 ** 9 - buyAmount, 313 | }) 314 | return tokenBuyTx 315 | } catch (error) { 316 | return null 317 | } 318 | } 319 | 320 | const sell = async (poolId: PublicKey, baseMint: PublicKey, wallet: Keypair, index: number, initBalance: number) => { 321 | const amount = initBalance * (SELL_ALL_BY_TIMES - index) / SELL_ALL_BY_TIMES 322 | 323 | try { 324 | const data: Data[] = readJson() 325 | if (data.length == 0) { 326 | await sleep(1000) 327 | return null 328 | } 329 | 330 | const tokenAta = await getAssociatedTokenAddress(baseMint, wallet.publicKey) 331 | const tokenBalInfo = await solanaConnection.getTokenAccountBalance(tokenAta) 332 | if (!tokenBalInfo) { 333 | console.log("Balance incorrect") 334 | return null 335 | } 336 | const tokenBalance = tokenBalInfo.value.uiAmount 337 | if(!tokenBalance) return null 338 | const tokenToSell = new BN(tokenBalance - amount).mul(new BN(10 ** tokenBalInfo.value.decimals)).toString() 339 | try { 340 | let sellTx; 341 | if (SWAP_ROUTING) 342 | sellTx = await getSellTxWithJupiter(wallet, baseMint, tokenToSell) 343 | else 344 | sellTx = await getSellTx(solanaConnection, wallet, baseMint, NATIVE_MINT, tokenToSell, poolId.toBase58()) 345 | 346 | if (sellTx == null) { 347 | console.log(`Error getting buy transaction`) 348 | return null 349 | } 350 | 351 | const latestBlockhashForSell = await solanaConnection.getLatestBlockhash() 352 | const txSellSig = await execute(sellTx, latestBlockhashForSell, false) 353 | const tokenSellTx = txSellSig ? `https://solscan.io/tx/${txSellSig}` : '' 354 | const solBalance = await solanaConnection.getBalance(wallet.publicKey) 355 | editJson({ 356 | pubkey: wallet.publicKey.toBase58(), 357 | tokenSellTx, 358 | solBalance 359 | }) 360 | return tokenSellTx 361 | } catch (error) { 362 | return null 363 | } 364 | } catch (error) { 365 | return null 366 | } 367 | } 368 | 369 | 370 | main() 371 | 372 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.23.4": 6 | version "7.24.4" 7 | resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz" 8 | integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== 9 | dependencies: 10 | regenerator-runtime "^0.14.0" 11 | 12 | "@cspotcode/source-map-support@^0.8.0": 13 | version "0.8.1" 14 | resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" 15 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 16 | dependencies: 17 | "@jridgewell/trace-mapping" "0.3.9" 18 | 19 | "@grpc/grpc-js@^1.8.13": 20 | version "1.10.6" 21 | resolved "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz" 22 | integrity sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA== 23 | dependencies: 24 | "@grpc/proto-loader" "^0.7.10" 25 | "@js-sdsl/ordered-map" "^4.4.2" 26 | 27 | "@grpc/proto-loader@^0.7.10": 28 | version "0.7.12" 29 | resolved "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz" 30 | integrity sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q== 31 | dependencies: 32 | lodash.camelcase "^4.3.0" 33 | long "^5.0.0" 34 | protobufjs "^7.2.4" 35 | yargs "^17.7.2" 36 | 37 | "@jridgewell/resolve-uri@^3.0.3": 38 | version "3.1.2" 39 | resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz" 40 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 41 | 42 | "@jridgewell/sourcemap-codec@^1.4.10": 43 | version "1.4.15" 44 | resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" 45 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 46 | 47 | "@jridgewell/trace-mapping@0.3.9": 48 | version "0.3.9" 49 | resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz" 50 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 51 | dependencies: 52 | "@jridgewell/resolve-uri" "^3.0.3" 53 | "@jridgewell/sourcemap-codec" "^1.4.10" 54 | 55 | "@js-sdsl/ordered-map@^4.4.2": 56 | version "4.4.2" 57 | resolved "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz" 58 | integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== 59 | 60 | "@metaplex-foundation/mpl-token-metadata@^3.2.1": 61 | version "3.2.1" 62 | resolved "https://registry.npmjs.org/@metaplex-foundation/mpl-token-metadata/-/mpl-token-metadata-3.2.1.tgz" 63 | integrity sha512-26W1NhQwDWmLOg/pBRYut7x/vEs/5kFS2sWVEY5/X0f2jJOLhnd4NaZQcq+5u+XZsXvm1jq2AtrRGPNK43oqWQ== 64 | dependencies: 65 | "@metaplex-foundation/mpl-toolbox" "^0.9.4" 66 | 67 | "@metaplex-foundation/mpl-toolbox@^0.9.4": 68 | version "0.9.4" 69 | resolved "https://registry.npmjs.org/@metaplex-foundation/mpl-toolbox/-/mpl-toolbox-0.9.4.tgz" 70 | integrity sha512-fd6JxfoLbj/MM8FG2x91KYVy1U6AjBQw4qjt7+Da3trzQaWnSaYHDcYRG/53xqfvZ9qofY1T2t53GXPlD87lnQ== 71 | 72 | "@metaplex-foundation/umi-options@^0.8.9": 73 | version "0.8.9" 74 | resolved "https://registry.npmjs.org/@metaplex-foundation/umi-options/-/umi-options-0.8.9.tgz" 75 | integrity sha512-jSQ61sZMPSAk/TXn8v8fPqtz3x8d0/blVZXLLbpVbo2/T5XobiI6/MfmlUosAjAUaQl6bHRF8aIIqZEFkJiy4A== 76 | 77 | "@metaplex-foundation/umi-public-keys@^0.8.9": 78 | version "0.8.9" 79 | resolved "https://registry.npmjs.org/@metaplex-foundation/umi-public-keys/-/umi-public-keys-0.8.9.tgz" 80 | integrity sha512-CxMzN7dgVGOq9OcNCJe2casKUpJ3RmTVoOvDFyeoTQuK+vkZ1YSSahbqC1iGuHEtKTLSjtWjKvUU6O7zWFTw3Q== 81 | dependencies: 82 | "@metaplex-foundation/umi-serializers-encodings" "^0.8.9" 83 | 84 | "@metaplex-foundation/umi-serializers-core@^0.8.9": 85 | version "0.8.9" 86 | resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers-core/-/umi-serializers-core-0.8.9.tgz" 87 | integrity sha512-WT82tkiYJ0Qmscp7uTj1Hz6aWQPETwaKLAENAUN5DeWghkuBKtuxyBKVvEOuoXerJSdhiAk0e8DWA4cxcTTQ/w== 88 | 89 | "@metaplex-foundation/umi-serializers-encodings@^0.8.9": 90 | version "0.8.9" 91 | resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers-encodings/-/umi-serializers-encodings-0.8.9.tgz" 92 | integrity sha512-N3VWLDTJ0bzzMKcJDL08U3FaqRmwlN79FyE4BHj6bbAaJ9LEHjDQ9RJijZyWqTm0jE7I750fU7Ow5EZL38Xi6Q== 93 | dependencies: 94 | "@metaplex-foundation/umi-serializers-core" "^0.8.9" 95 | 96 | "@metaplex-foundation/umi-serializers-numbers@^0.8.9": 97 | version "0.8.9" 98 | resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers-numbers/-/umi-serializers-numbers-0.8.9.tgz" 99 | integrity sha512-NtBf1fnVNQJHFQjLFzRu2i9GGnigb9hOm/Gfrk628d0q0tRJB7BOM3bs5C61VAs7kJs4yd+pDNVAERJkknQ7Lg== 100 | dependencies: 101 | "@metaplex-foundation/umi-serializers-core" "^0.8.9" 102 | 103 | "@metaplex-foundation/umi-serializers@^0.9.0": 104 | version "0.9.0" 105 | resolved "https://registry.npmjs.org/@metaplex-foundation/umi-serializers/-/umi-serializers-0.9.0.tgz" 106 | integrity sha512-hAOW9Djl4w4ioKeR4erDZl5IG4iJdP0xA19ZomdaCbMhYAAmG/FEs5khh0uT2mq53/MnzWcXSUPoO8WBN4Q+Vg== 107 | dependencies: 108 | "@metaplex-foundation/umi-options" "^0.8.9" 109 | "@metaplex-foundation/umi-public-keys" "^0.8.9" 110 | "@metaplex-foundation/umi-serializers-core" "^0.8.9" 111 | "@metaplex-foundation/umi-serializers-encodings" "^0.8.9" 112 | "@metaplex-foundation/umi-serializers-numbers" "^0.8.9" 113 | 114 | "@metaplex-foundation/umi@^0.9.1": 115 | version "0.9.1" 116 | resolved "https://registry.npmjs.org/@metaplex-foundation/umi/-/umi-0.9.1.tgz" 117 | integrity sha512-IhHoOvp4vfO/++YL+78+iVuLM53+FDwUOZDYgH6lx0jYXyQ27BeaieeR5i+q3A9dz4KxQo5Nzc5aCA1109QGCQ== 118 | dependencies: 119 | "@metaplex-foundation/umi-options" "^0.8.9" 120 | "@metaplex-foundation/umi-public-keys" "^0.8.9" 121 | "@metaplex-foundation/umi-serializers" "^0.9.0" 122 | 123 | "@noble/curves@^1.0.0", "@noble/curves@^1.2.0": 124 | version "1.4.0" 125 | resolved "https://registry.npmjs.org/@noble/curves/-/curves-1.4.0.tgz" 126 | integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== 127 | dependencies: 128 | "@noble/hashes" "1.4.0" 129 | 130 | "@noble/ed25519@^1.7.1": 131 | version "1.7.3" 132 | resolved "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz" 133 | integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== 134 | 135 | "@noble/hashes@1.4.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.3.3": 136 | version "1.4.0" 137 | resolved "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz" 138 | integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== 139 | 140 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 141 | version "1.1.2" 142 | resolved "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz" 143 | integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== 144 | 145 | "@protobufjs/base64@^1.1.2": 146 | version "1.1.2" 147 | resolved "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz" 148 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 149 | 150 | "@protobufjs/codegen@^2.0.4": 151 | version "2.0.4" 152 | resolved "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz" 153 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 154 | 155 | "@protobufjs/eventemitter@^1.1.0": 156 | version "1.1.0" 157 | resolved "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz" 158 | integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== 159 | 160 | "@protobufjs/fetch@^1.1.0": 161 | version "1.1.0" 162 | resolved "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz" 163 | integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== 164 | dependencies: 165 | "@protobufjs/aspromise" "^1.1.1" 166 | "@protobufjs/inquire" "^1.1.0" 167 | 168 | "@protobufjs/float@^1.0.2": 169 | version "1.0.2" 170 | resolved "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz" 171 | integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== 172 | 173 | "@protobufjs/inquire@^1.1.0": 174 | version "1.1.0" 175 | resolved "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz" 176 | integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== 177 | 178 | "@protobufjs/path@^1.1.2": 179 | version "1.1.2" 180 | resolved "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz" 181 | integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== 182 | 183 | "@protobufjs/pool@^1.1.0": 184 | version "1.1.0" 185 | resolved "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz" 186 | integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== 187 | 188 | "@protobufjs/utf8@^1.1.0": 189 | version "1.1.0" 190 | resolved "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz" 191 | integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== 192 | 193 | "@raydium-io/raydium-sdk@^1.3.1-beta.47": 194 | version "1.3.1-beta.51" 195 | resolved "https://registry.npmjs.org/@raydium-io/raydium-sdk/-/raydium-sdk-1.3.1-beta.51.tgz" 196 | integrity sha512-HtZqK7NBHZLDnuhR9VFrtTM2E7QEtRKIzBI59ZOph+iaU4olgMyoMFYPU279LTip0fRUEO5LLh/8VHXVEKT2uw== 197 | dependencies: 198 | "@solana/buffer-layout" "^4.0.1" 199 | "@solana/spl-token" "^0.3.9" 200 | axios "^1.6.2" 201 | big.js "^6.2.1" 202 | bn.js "^5.2.1" 203 | decimal.js "^10.4.3" 204 | decimal.js-light "^2.5.1" 205 | fecha "^4.2.3" 206 | lodash "^4.17.21" 207 | toformat "^2.0.0" 208 | 209 | "@solana/buffer-layout-utils@^0.2.0": 210 | version "0.2.0" 211 | resolved "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz" 212 | integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== 213 | dependencies: 214 | "@solana/buffer-layout" "^4.0.0" 215 | "@solana/web3.js" "^1.32.0" 216 | bigint-buffer "^1.1.5" 217 | bignumber.js "^9.0.1" 218 | 219 | "@solana/buffer-layout@^4.0.0", "@solana/buffer-layout@^4.0.1": 220 | version "4.0.1" 221 | resolved "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz" 222 | integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== 223 | dependencies: 224 | buffer "~6.0.3" 225 | 226 | "@solana/codecs-core@2.0.0-experimental.8618508": 227 | version "2.0.0-experimental.8618508" 228 | resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz" 229 | integrity sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA== 230 | 231 | "@solana/codecs-core@2.0.0-preview.2": 232 | version "2.0.0-preview.2" 233 | resolved "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz" 234 | integrity sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg== 235 | dependencies: 236 | "@solana/errors" "2.0.0-preview.2" 237 | 238 | "@solana/codecs-data-structures@2.0.0-experimental.8618508": 239 | version "2.0.0-experimental.8618508" 240 | resolved "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz" 241 | integrity sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw== 242 | dependencies: 243 | "@solana/codecs-core" "2.0.0-experimental.8618508" 244 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 245 | 246 | "@solana/codecs-data-structures@2.0.0-preview.2": 247 | version "2.0.0-preview.2" 248 | resolved "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz" 249 | integrity sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg== 250 | dependencies: 251 | "@solana/codecs-core" "2.0.0-preview.2" 252 | "@solana/codecs-numbers" "2.0.0-preview.2" 253 | "@solana/errors" "2.0.0-preview.2" 254 | 255 | "@solana/codecs-numbers@2.0.0-experimental.8618508": 256 | version "2.0.0-experimental.8618508" 257 | resolved "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz" 258 | integrity sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q== 259 | dependencies: 260 | "@solana/codecs-core" "2.0.0-experimental.8618508" 261 | 262 | "@solana/codecs-numbers@2.0.0-preview.2": 263 | version "2.0.0-preview.2" 264 | resolved "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz" 265 | integrity sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw== 266 | dependencies: 267 | "@solana/codecs-core" "2.0.0-preview.2" 268 | "@solana/errors" "2.0.0-preview.2" 269 | 270 | "@solana/codecs-strings@2.0.0-experimental.8618508": 271 | version "2.0.0-experimental.8618508" 272 | resolved "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz" 273 | integrity sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA== 274 | dependencies: 275 | "@solana/codecs-core" "2.0.0-experimental.8618508" 276 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 277 | 278 | "@solana/codecs-strings@2.0.0-preview.2": 279 | version "2.0.0-preview.2" 280 | resolved "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz" 281 | integrity sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g== 282 | dependencies: 283 | "@solana/codecs-core" "2.0.0-preview.2" 284 | "@solana/codecs-numbers" "2.0.0-preview.2" 285 | "@solana/errors" "2.0.0-preview.2" 286 | 287 | "@solana/codecs@2.0.0-preview.2": 288 | version "2.0.0-preview.2" 289 | resolved "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz" 290 | integrity sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA== 291 | dependencies: 292 | "@solana/codecs-core" "2.0.0-preview.2" 293 | "@solana/codecs-data-structures" "2.0.0-preview.2" 294 | "@solana/codecs-numbers" "2.0.0-preview.2" 295 | "@solana/codecs-strings" "2.0.0-preview.2" 296 | "@solana/options" "2.0.0-preview.2" 297 | 298 | "@solana/errors@2.0.0-preview.2": 299 | version "2.0.0-preview.2" 300 | resolved "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz" 301 | integrity sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA== 302 | dependencies: 303 | chalk "^5.3.0" 304 | commander "^12.0.0" 305 | 306 | "@solana/options@2.0.0-experimental.8618508": 307 | version "2.0.0-experimental.8618508" 308 | resolved "https://registry.npmjs.org/@solana/options/-/options-2.0.0-experimental.8618508.tgz" 309 | integrity sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg== 310 | dependencies: 311 | "@solana/codecs-core" "2.0.0-experimental.8618508" 312 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 313 | 314 | "@solana/options@2.0.0-preview.2": 315 | version "2.0.0-preview.2" 316 | resolved "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz" 317 | integrity sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w== 318 | dependencies: 319 | "@solana/codecs-core" "2.0.0-preview.2" 320 | "@solana/codecs-numbers" "2.0.0-preview.2" 321 | 322 | "@solana/spl-token-group@^0.0.2": 323 | version "0.0.2" 324 | resolved "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.2.tgz" 325 | integrity sha512-vLePrFvT9+PfK2KZaddPebTWtRykXUR+060gqomFUcBk/2UPpZtsJGW+xshI9z9Ryrx7FieprZEUCApw34BwrQ== 326 | dependencies: 327 | "@solana/codecs" "2.0.0-preview.2" 328 | "@solana/spl-type-length-value" "0.1.0" 329 | 330 | "@solana/spl-token-metadata@^0.1.2": 331 | version "0.1.2" 332 | resolved "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz" 333 | integrity sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw== 334 | dependencies: 335 | "@solana/codecs-core" "2.0.0-experimental.8618508" 336 | "@solana/codecs-data-structures" "2.0.0-experimental.8618508" 337 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 338 | "@solana/codecs-strings" "2.0.0-experimental.8618508" 339 | "@solana/options" "2.0.0-experimental.8618508" 340 | "@solana/spl-type-length-value" "0.1.0" 341 | 342 | "@solana/spl-token@^0.3.9": 343 | version "0.3.11" 344 | resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz" 345 | integrity sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ== 346 | dependencies: 347 | "@solana/buffer-layout" "^4.0.0" 348 | "@solana/buffer-layout-utils" "^0.2.0" 349 | "@solana/spl-token-metadata" "^0.1.2" 350 | buffer "^6.0.3" 351 | 352 | "@solana/spl-token@^0.4.0": 353 | version "0.4.3" 354 | resolved "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.3.tgz" 355 | integrity sha512-mRjJJE9CIBejsg9WAmDp369pWeObm42K2fwsZ4dkJAMCt1KBPb5Eb1vzM5+AYfV/BUTy3QP2oFx8kV+8Doa1xQ== 356 | dependencies: 357 | "@solana/buffer-layout" "^4.0.0" 358 | "@solana/buffer-layout-utils" "^0.2.0" 359 | "@solana/spl-token-group" "^0.0.2" 360 | "@solana/spl-token-metadata" "^0.1.2" 361 | buffer "^6.0.3" 362 | 363 | "@solana/spl-type-length-value@0.1.0": 364 | version "0.1.0" 365 | resolved "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz" 366 | integrity sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA== 367 | dependencies: 368 | buffer "^6.0.3" 369 | 370 | "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.89.1": 371 | version "1.91.4" 372 | resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.4.tgz" 373 | integrity sha512-zconqecIcBqEF6JiM4xYF865Xc4aas+iWK5qnu7nwKPq9ilRYcn+2GiwpYXqUqqBUe0XCO17w18KO0F8h+QATg== 374 | dependencies: 375 | "@babel/runtime" "^7.23.4" 376 | "@noble/curves" "^1.2.0" 377 | "@noble/hashes" "^1.3.3" 378 | "@solana/buffer-layout" "^4.0.1" 379 | agentkeepalive "^4.5.0" 380 | bigint-buffer "^1.1.5" 381 | bn.js "^5.2.1" 382 | borsh "^0.7.0" 383 | bs58 "^4.0.1" 384 | buffer "6.0.3" 385 | fast-stable-stringify "^1.0.0" 386 | jayson "^4.1.0" 387 | node-fetch "^2.7.0" 388 | rpc-websockets "^7.5.1" 389 | superstruct "^0.14.2" 390 | 391 | "@solana/web3.js@~1.77.3": 392 | version "1.77.4" 393 | resolved "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.77.4.tgz" 394 | integrity sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q== 395 | dependencies: 396 | "@babel/runtime" "^7.12.5" 397 | "@noble/curves" "^1.0.0" 398 | "@noble/hashes" "^1.3.0" 399 | "@solana/buffer-layout" "^4.0.0" 400 | agentkeepalive "^4.2.1" 401 | bigint-buffer "^1.1.5" 402 | bn.js "^5.0.0" 403 | borsh "^0.7.0" 404 | bs58 "^4.0.1" 405 | buffer "6.0.3" 406 | fast-stable-stringify "^1.0.0" 407 | jayson "^4.1.0" 408 | node-fetch "^2.6.7" 409 | rpc-websockets "^7.5.1" 410 | superstruct "^0.14.2" 411 | 412 | "@tsconfig/node10@^1.0.7": 413 | version "1.0.11" 414 | resolved "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz" 415 | integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== 416 | 417 | "@tsconfig/node12@^1.0.7": 418 | version "1.0.11" 419 | resolved "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz" 420 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 421 | 422 | "@tsconfig/node14@^1.0.0": 423 | version "1.0.3" 424 | resolved "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz" 425 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 426 | 427 | "@tsconfig/node16@^1.0.2": 428 | version "1.0.4" 429 | resolved "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz" 430 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 431 | 432 | "@types/bn.js@^5.1.5": 433 | version "5.1.5" 434 | resolved "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz" 435 | integrity sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A== 436 | dependencies: 437 | "@types/node" "*" 438 | 439 | "@types/connect@^3.4.33": 440 | version "3.4.38" 441 | resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz" 442 | integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== 443 | dependencies: 444 | "@types/node" "*" 445 | 446 | "@types/node@*", "@types/node@>=13.7.0": 447 | version "20.12.7" 448 | resolved "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz" 449 | integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== 450 | dependencies: 451 | undici-types "~5.26.4" 452 | 453 | "@types/node@^12.12.54": 454 | version "12.20.55" 455 | resolved "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz" 456 | integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== 457 | 458 | "@types/ws@^7.4.4": 459 | version "7.4.7" 460 | resolved "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz" 461 | integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== 462 | dependencies: 463 | "@types/node" "*" 464 | 465 | JSONStream@^1.3.5: 466 | version "1.3.5" 467 | resolved "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz" 468 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 469 | dependencies: 470 | jsonparse "^1.2.0" 471 | through ">=2.2.7 <3" 472 | 473 | abort-controller@^3.0.0: 474 | version "3.0.0" 475 | resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" 476 | integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg== 477 | dependencies: 478 | event-target-shim "^5.0.0" 479 | 480 | acorn-walk@^8.1.1: 481 | version "8.3.2" 482 | resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz" 483 | integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== 484 | 485 | acorn@^8.4.1: 486 | version "8.11.3" 487 | resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz" 488 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 489 | 490 | agentkeepalive@^4.2.1, agentkeepalive@^4.3.0, agentkeepalive@^4.5.0: 491 | version "4.5.0" 492 | resolved "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz" 493 | integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== 494 | dependencies: 495 | humanize-ms "^1.2.1" 496 | 497 | ansi-regex@^5.0.1: 498 | version "5.0.1" 499 | resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" 500 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 501 | 502 | ansi-styles@^4.0.0: 503 | version "4.3.0" 504 | resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" 505 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 506 | dependencies: 507 | color-convert "^2.0.1" 508 | 509 | arg@^4.1.0: 510 | version "4.1.3" 511 | resolved "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz" 512 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 513 | 514 | asynckit@^0.4.0: 515 | version "0.4.0" 516 | resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" 517 | integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== 518 | 519 | atomic-sleep@^1.0.0: 520 | version "1.0.0" 521 | resolved "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz" 522 | integrity sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ== 523 | 524 | axios@^1.6.2, axios@^1.6.8: 525 | version "1.6.8" 526 | resolved "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz" 527 | integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ== 528 | dependencies: 529 | follow-redirects "^1.15.6" 530 | form-data "^4.0.0" 531 | proxy-from-env "^1.1.0" 532 | 533 | base-x@^3.0.2: 534 | version "3.0.9" 535 | resolved "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz" 536 | integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== 537 | dependencies: 538 | safe-buffer "^5.0.1" 539 | 540 | base-x@^4.0.0: 541 | version "4.0.0" 542 | resolved "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz" 543 | integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== 544 | 545 | base64-js@^1.3.1: 546 | version "1.5.1" 547 | resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" 548 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 549 | 550 | big.js@^6.2.1: 551 | version "6.2.1" 552 | resolved "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz" 553 | integrity sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ== 554 | 555 | bigint-buffer@^1.1.5: 556 | version "1.1.5" 557 | resolved "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz" 558 | integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== 559 | dependencies: 560 | bindings "^1.3.0" 561 | 562 | bignumber.js@^9.0.1: 563 | version "9.1.2" 564 | resolved "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz" 565 | integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== 566 | 567 | bindings@^1.3.0: 568 | version "1.5.0" 569 | resolved "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz" 570 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 571 | dependencies: 572 | file-uri-to-path "1.0.0" 573 | 574 | bn.js@^5.0.0, bn.js@^5.2.0, bn.js@^5.2.1: 575 | version "5.2.1" 576 | resolved "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz" 577 | integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== 578 | 579 | borsh@^0.7.0: 580 | version "0.7.0" 581 | resolved "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz" 582 | integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== 583 | dependencies: 584 | bn.js "^5.2.0" 585 | bs58 "^4.0.0" 586 | text-encoding-utf-8 "^1.0.2" 587 | 588 | bs58@^4.0.0, bs58@^4.0.1: 589 | version "4.0.1" 590 | resolved "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz" 591 | integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== 592 | dependencies: 593 | base-x "^3.0.2" 594 | 595 | bs58@^5.0.0: 596 | version "5.0.0" 597 | resolved "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz" 598 | integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== 599 | dependencies: 600 | base-x "^4.0.0" 601 | 602 | buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: 603 | version "6.0.3" 604 | resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" 605 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 606 | dependencies: 607 | base64-js "^1.3.1" 608 | ieee754 "^1.2.1" 609 | 610 | bufferutil@^4.0.1: 611 | version "4.0.8" 612 | resolved "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz" 613 | integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== 614 | dependencies: 615 | node-gyp-build "^4.3.0" 616 | 617 | chalk@^5.3.0: 618 | version "5.3.0" 619 | resolved "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz" 620 | integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== 621 | 622 | cliui@^8.0.1: 623 | version "8.0.1" 624 | resolved "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz" 625 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 626 | dependencies: 627 | string-width "^4.2.0" 628 | strip-ansi "^6.0.1" 629 | wrap-ansi "^7.0.0" 630 | 631 | color-convert@^2.0.1: 632 | version "2.0.1" 633 | resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" 634 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 635 | dependencies: 636 | color-name "~1.1.4" 637 | 638 | color-name@~1.1.4: 639 | version "1.1.4" 640 | resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" 641 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 642 | 643 | colorette@^2.0.7: 644 | version "2.0.20" 645 | resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" 646 | integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== 647 | 648 | combined-stream@^1.0.8: 649 | version "1.0.8" 650 | resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" 651 | integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== 652 | dependencies: 653 | delayed-stream "~1.0.0" 654 | 655 | commander@^12.0.0: 656 | version "12.0.0" 657 | resolved "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz" 658 | integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== 659 | 660 | commander@^2.20.3: 661 | version "2.20.3" 662 | resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz" 663 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 664 | 665 | create-require@^1.1.0: 666 | version "1.1.1" 667 | resolved "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz" 668 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 669 | 670 | dateformat@^4.6.3: 671 | version "4.6.3" 672 | resolved "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz" 673 | integrity sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA== 674 | 675 | decimal.js-light@^2.5.1: 676 | version "2.5.1" 677 | resolved "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz" 678 | integrity sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg== 679 | 680 | decimal.js@^10.4.3: 681 | version "10.4.3" 682 | resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" 683 | integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== 684 | 685 | delay@^5.0.0: 686 | version "5.0.0" 687 | resolved "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz" 688 | integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== 689 | 690 | delayed-stream@~1.0.0: 691 | version "1.0.0" 692 | resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" 693 | integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== 694 | 695 | diff@^4.0.1: 696 | version "4.0.2" 697 | resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" 698 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 699 | 700 | dotenv@^16.0.3, dotenv@^16.4.1: 701 | version "16.4.5" 702 | resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz" 703 | integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== 704 | 705 | emoji-regex@^8.0.0: 706 | version "8.0.0" 707 | resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" 708 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 709 | 710 | end-of-stream@^1.1.0: 711 | version "1.4.4" 712 | resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz" 713 | integrity sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q== 714 | dependencies: 715 | once "^1.4.0" 716 | 717 | es6-promise@^4.0.3: 718 | version "4.2.8" 719 | resolved "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz" 720 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 721 | 722 | es6-promisify@^5.0.0: 723 | version "5.0.0" 724 | resolved "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz" 725 | integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== 726 | dependencies: 727 | es6-promise "^4.0.3" 728 | 729 | escalade@^3.1.1: 730 | version "3.1.2" 731 | resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz" 732 | integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== 733 | 734 | event-target-shim@^5.0.0: 735 | version "5.0.1" 736 | resolved "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz" 737 | integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ== 738 | 739 | eventemitter3@^4.0.7: 740 | version "4.0.7" 741 | resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" 742 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 743 | 744 | events@^3.3.0: 745 | version "3.3.0" 746 | resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" 747 | integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== 748 | 749 | eyes@^0.1.8: 750 | version "0.1.8" 751 | resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" 752 | integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== 753 | 754 | fast-copy@^3.0.0: 755 | version "3.0.2" 756 | resolved "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz" 757 | integrity sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ== 758 | 759 | fast-redact@^3.1.1: 760 | version "3.5.0" 761 | resolved "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz" 762 | integrity sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A== 763 | 764 | fast-safe-stringify@^2.1.1: 765 | version "2.1.1" 766 | resolved "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz" 767 | integrity sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA== 768 | 769 | fast-stable-stringify@^1.0.0: 770 | version "1.0.0" 771 | resolved "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz" 772 | integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== 773 | 774 | fecha@^4.2.3: 775 | version "4.2.3" 776 | resolved "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz" 777 | integrity sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw== 778 | 779 | file-uri-to-path@1.0.0: 780 | version "1.0.0" 781 | resolved "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" 782 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 783 | 784 | follow-redirects@^1.15.6: 785 | version "1.15.6" 786 | resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz" 787 | integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA== 788 | 789 | form-data@^4.0.0: 790 | version "4.0.0" 791 | resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" 792 | integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== 793 | dependencies: 794 | asynckit "^0.4.0" 795 | combined-stream "^1.0.8" 796 | mime-types "^2.1.12" 797 | 798 | get-caller-file@^2.0.5: 799 | version "2.0.5" 800 | resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" 801 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 802 | 803 | help-me@^5.0.0: 804 | version "5.0.0" 805 | resolved "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz" 806 | integrity sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg== 807 | 808 | humanize-ms@^1.2.1: 809 | version "1.2.1" 810 | resolved "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz" 811 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 812 | dependencies: 813 | ms "^2.0.0" 814 | 815 | ieee754@^1.2.1: 816 | version "1.2.1" 817 | resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" 818 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 819 | 820 | is-fullwidth-code-point@^3.0.0: 821 | version "3.0.0" 822 | resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" 823 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 824 | 825 | isomorphic-ws@^4.0.1: 826 | version "4.0.1" 827 | resolved "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz" 828 | integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== 829 | 830 | jayson@^4.0.0, jayson@^4.1.0: 831 | version "4.1.0" 832 | resolved "https://registry.npmjs.org/jayson/-/jayson-4.1.0.tgz" 833 | integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== 834 | dependencies: 835 | "@types/connect" "^3.4.33" 836 | "@types/node" "^12.12.54" 837 | "@types/ws" "^7.4.4" 838 | JSONStream "^1.3.5" 839 | commander "^2.20.3" 840 | delay "^5.0.0" 841 | es6-promisify "^5.0.0" 842 | eyes "^0.1.8" 843 | isomorphic-ws "^4.0.1" 844 | json-stringify-safe "^5.0.1" 845 | uuid "^8.3.2" 846 | ws "^7.4.5" 847 | 848 | jito-ts@^3.0.1: 849 | version "3.0.1" 850 | resolved "https://registry.npmjs.org/jito-ts/-/jito-ts-3.0.1.tgz" 851 | integrity sha512-TSofF7KqcwyaWGjPaSYC8RDoNBY1TPRNBHdrw24bdIi7mQ5bFEDdYK3D//llw/ml8YDvcZlgd644WxhjLTS9yg== 852 | dependencies: 853 | "@grpc/grpc-js" "^1.8.13" 854 | "@noble/ed25519" "^1.7.1" 855 | "@solana/web3.js" "~1.77.3" 856 | agentkeepalive "^4.3.0" 857 | dotenv "^16.0.3" 858 | jayson "^4.0.0" 859 | node-fetch "^2.6.7" 860 | superstruct "^1.0.3" 861 | 862 | joycon@^3.1.1: 863 | version "3.1.1" 864 | resolved "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz" 865 | integrity sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw== 866 | 867 | json-stringify-safe@^5.0.1: 868 | version "5.0.1" 869 | resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz" 870 | integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== 871 | 872 | jsonparse@^1.2.0: 873 | version "1.3.1" 874 | resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" 875 | integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== 876 | 877 | lodash.camelcase@^4.3.0: 878 | version "4.3.0" 879 | resolved "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz" 880 | integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== 881 | 882 | lodash@^4.17.21: 883 | version "4.17.21" 884 | resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" 885 | integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== 886 | 887 | long@^5.0.0: 888 | version "5.2.3" 889 | resolved "https://registry.npmjs.org/long/-/long-5.2.3.tgz" 890 | integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== 891 | 892 | make-error@^1.1.1: 893 | version "1.3.6" 894 | resolved "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz" 895 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 896 | 897 | mime-db@1.52.0: 898 | version "1.52.0" 899 | resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" 900 | integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== 901 | 902 | mime-types@^2.1.12: 903 | version "2.1.35" 904 | resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" 905 | integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== 906 | dependencies: 907 | mime-db "1.52.0" 908 | 909 | minimist@^1.2.6: 910 | version "1.2.8" 911 | resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" 912 | integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== 913 | 914 | ms@^2.0.0: 915 | version "2.1.3" 916 | resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" 917 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 918 | 919 | node-fetch@^2.6.7, node-fetch@^2.7.0: 920 | version "2.7.0" 921 | resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz" 922 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 923 | dependencies: 924 | whatwg-url "^5.0.0" 925 | 926 | node-gyp-build@^4.3.0: 927 | version "4.8.0" 928 | resolved "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz" 929 | integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== 930 | 931 | on-exit-leak-free@^2.1.0: 932 | version "2.1.2" 933 | resolved "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz" 934 | integrity sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA== 935 | 936 | once@^1.3.1, once@^1.4.0: 937 | version "1.4.0" 938 | resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" 939 | integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== 940 | dependencies: 941 | wrappy "1" 942 | 943 | pino-abstract-transport@^1.0.0, pino-abstract-transport@^1.1.0: 944 | version "1.1.0" 945 | resolved "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz" 946 | integrity sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA== 947 | dependencies: 948 | readable-stream "^4.0.0" 949 | split2 "^4.0.0" 950 | 951 | pino-pretty@^10.3.1: 952 | version "10.3.1" 953 | resolved "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.3.1.tgz" 954 | integrity sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g== 955 | dependencies: 956 | colorette "^2.0.7" 957 | dateformat "^4.6.3" 958 | fast-copy "^3.0.0" 959 | fast-safe-stringify "^2.1.1" 960 | help-me "^5.0.0" 961 | joycon "^3.1.1" 962 | minimist "^1.2.6" 963 | on-exit-leak-free "^2.1.0" 964 | pino-abstract-transport "^1.0.0" 965 | pump "^3.0.0" 966 | readable-stream "^4.0.0" 967 | secure-json-parse "^2.4.0" 968 | sonic-boom "^3.0.0" 969 | strip-json-comments "^3.1.1" 970 | 971 | pino-std-serializers@^6.0.0, pino-std-serializers@^6.2.2: 972 | version "6.2.2" 973 | resolved "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz" 974 | integrity sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA== 975 | 976 | pino@^8.18.0: 977 | version "8.20.0" 978 | resolved "https://registry.npmjs.org/pino/-/pino-8.20.0.tgz" 979 | integrity sha512-uhIfMj5TVp+WynVASaVEJFTncTUe4dHBq6CWplu/vBgvGHhvBvQfxz+vcOrnnBQdORH3izaGEurLfNlq3YxdFQ== 980 | dependencies: 981 | atomic-sleep "^1.0.0" 982 | fast-redact "^3.1.1" 983 | on-exit-leak-free "^2.1.0" 984 | pino-abstract-transport "^1.1.0" 985 | pino-std-serializers "^6.0.0" 986 | process-warning "^3.0.0" 987 | quick-format-unescaped "^4.0.3" 988 | real-require "^0.2.0" 989 | safe-stable-stringify "^2.3.1" 990 | sonic-boom "^3.7.0" 991 | thread-stream "^2.0.0" 992 | 993 | prettier@^3.2.4: 994 | version "3.2.5" 995 | resolved "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz" 996 | integrity sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A== 997 | 998 | process-warning@^3.0.0: 999 | version "3.0.0" 1000 | resolved "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz" 1001 | integrity sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ== 1002 | 1003 | process@^0.11.10: 1004 | version "0.11.10" 1005 | resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz" 1006 | integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A== 1007 | 1008 | protobufjs@^7.2.4: 1009 | version "7.2.6" 1010 | resolved "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz" 1011 | integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw== 1012 | dependencies: 1013 | "@protobufjs/aspromise" "^1.1.2" 1014 | "@protobufjs/base64" "^1.1.2" 1015 | "@protobufjs/codegen" "^2.0.4" 1016 | "@protobufjs/eventemitter" "^1.1.0" 1017 | "@protobufjs/fetch" "^1.1.0" 1018 | "@protobufjs/float" "^1.0.2" 1019 | "@protobufjs/inquire" "^1.1.0" 1020 | "@protobufjs/path" "^1.1.2" 1021 | "@protobufjs/pool" "^1.1.0" 1022 | "@protobufjs/utf8" "^1.1.0" 1023 | "@types/node" ">=13.7.0" 1024 | long "^5.0.0" 1025 | 1026 | proxy-from-env@^1.1.0: 1027 | version "1.1.0" 1028 | resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" 1029 | integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== 1030 | 1031 | pump@^3.0.0: 1032 | version "3.0.0" 1033 | resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" 1034 | integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== 1035 | dependencies: 1036 | end-of-stream "^1.1.0" 1037 | once "^1.3.1" 1038 | 1039 | quick-format-unescaped@^4.0.3: 1040 | version "4.0.4" 1041 | resolved "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz" 1042 | integrity sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg== 1043 | 1044 | readable-stream@^4.0.0: 1045 | version "4.5.2" 1046 | resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz" 1047 | integrity sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g== 1048 | dependencies: 1049 | abort-controller "^3.0.0" 1050 | buffer "^6.0.3" 1051 | events "^3.3.0" 1052 | process "^0.11.10" 1053 | string_decoder "^1.3.0" 1054 | 1055 | real-require@^0.2.0: 1056 | version "0.2.0" 1057 | resolved "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz" 1058 | integrity sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg== 1059 | 1060 | regenerator-runtime@^0.14.0: 1061 | version "0.14.1" 1062 | resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz" 1063 | integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== 1064 | 1065 | require-directory@^2.1.1: 1066 | version "2.1.1" 1067 | resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" 1068 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 1069 | 1070 | rpc-websockets@^7.5.1: 1071 | version "7.9.0" 1072 | resolved "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.9.0.tgz" 1073 | integrity sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw== 1074 | dependencies: 1075 | "@babel/runtime" "^7.17.2" 1076 | eventemitter3 "^4.0.7" 1077 | uuid "^8.3.2" 1078 | ws "^8.5.0" 1079 | optionalDependencies: 1080 | bufferutil "^4.0.1" 1081 | utf-8-validate "^5.0.2" 1082 | 1083 | safe-buffer@^5.0.1, safe-buffer@~5.2.0: 1084 | version "5.2.1" 1085 | resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" 1086 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 1087 | 1088 | safe-stable-stringify@^2.3.1: 1089 | version "2.4.3" 1090 | resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz" 1091 | integrity sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g== 1092 | 1093 | secure-json-parse@^2.4.0: 1094 | version "2.7.0" 1095 | resolved "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz" 1096 | integrity sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw== 1097 | 1098 | sonic-boom@^3.0.0, sonic-boom@^3.7.0: 1099 | version "3.8.1" 1100 | resolved "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.1.tgz" 1101 | integrity sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg== 1102 | dependencies: 1103 | atomic-sleep "^1.0.0" 1104 | 1105 | split2@^4.0.0: 1106 | version "4.2.0" 1107 | resolved "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz" 1108 | integrity sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg== 1109 | 1110 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 1111 | version "4.2.3" 1112 | resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" 1113 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 1114 | dependencies: 1115 | emoji-regex "^8.0.0" 1116 | is-fullwidth-code-point "^3.0.0" 1117 | strip-ansi "^6.0.1" 1118 | 1119 | string_decoder@^1.3.0: 1120 | version "1.3.0" 1121 | resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" 1122 | integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== 1123 | dependencies: 1124 | safe-buffer "~5.2.0" 1125 | 1126 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 1127 | version "6.0.1" 1128 | resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" 1129 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 1130 | dependencies: 1131 | ansi-regex "^5.0.1" 1132 | 1133 | strip-json-comments@^3.1.1: 1134 | version "3.1.1" 1135 | resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" 1136 | integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== 1137 | 1138 | superstruct@^0.14.2: 1139 | version "0.14.2" 1140 | resolved "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz" 1141 | integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== 1142 | 1143 | superstruct@^1.0.3: 1144 | version "1.0.4" 1145 | resolved "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz" 1146 | integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== 1147 | 1148 | text-encoding-utf-8@^1.0.2: 1149 | version "1.0.2" 1150 | resolved "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz" 1151 | integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== 1152 | 1153 | thread-stream@^2.0.0: 1154 | version "2.4.1" 1155 | resolved "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz" 1156 | integrity sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg== 1157 | dependencies: 1158 | real-require "^0.2.0" 1159 | 1160 | "through@>=2.2.7 <3": 1161 | version "2.3.8" 1162 | resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" 1163 | integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== 1164 | 1165 | toformat@^2.0.0: 1166 | version "2.0.0" 1167 | resolved "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz" 1168 | integrity sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ== 1169 | 1170 | tr46@~0.0.3: 1171 | version "0.0.3" 1172 | resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" 1173 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 1174 | 1175 | ts-node@^10.9.2: 1176 | version "10.9.2" 1177 | resolved "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz" 1178 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 1179 | dependencies: 1180 | "@cspotcode/source-map-support" "^0.8.0" 1181 | "@tsconfig/node10" "^1.0.7" 1182 | "@tsconfig/node12" "^1.0.7" 1183 | "@tsconfig/node14" "^1.0.0" 1184 | "@tsconfig/node16" "^1.0.2" 1185 | acorn "^8.4.1" 1186 | acorn-walk "^8.1.1" 1187 | arg "^4.1.0" 1188 | create-require "^1.1.0" 1189 | diff "^4.0.1" 1190 | make-error "^1.1.1" 1191 | v8-compile-cache-lib "^3.0.1" 1192 | yn "3.1.1" 1193 | 1194 | typescript@^5.3.3: 1195 | version "5.4.5" 1196 | resolved "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz" 1197 | integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== 1198 | 1199 | undici-types@~5.26.4: 1200 | version "5.26.5" 1201 | resolved "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz" 1202 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 1203 | 1204 | utf-8-validate@^5.0.2: 1205 | version "5.0.10" 1206 | resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz" 1207 | integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== 1208 | dependencies: 1209 | node-gyp-build "^4.3.0" 1210 | 1211 | uuid@^8.3.2: 1212 | version "8.3.2" 1213 | resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" 1214 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 1215 | 1216 | v8-compile-cache-lib@^3.0.1: 1217 | version "3.0.1" 1218 | resolved "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz" 1219 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 1220 | 1221 | webidl-conversions@^3.0.0: 1222 | version "3.0.1" 1223 | resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" 1224 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 1225 | 1226 | whatwg-url@^5.0.0: 1227 | version "5.0.0" 1228 | resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" 1229 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 1230 | dependencies: 1231 | tr46 "~0.0.3" 1232 | webidl-conversions "^3.0.0" 1233 | 1234 | wrap-ansi@^7.0.0: 1235 | version "7.0.0" 1236 | resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" 1237 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 1238 | dependencies: 1239 | ansi-styles "^4.0.0" 1240 | string-width "^4.1.0" 1241 | strip-ansi "^6.0.0" 1242 | 1243 | wrappy@1: 1244 | version "1.0.2" 1245 | resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" 1246 | integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== 1247 | 1248 | ws@^7.4.5: 1249 | version "7.5.9" 1250 | resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" 1251 | integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== 1252 | 1253 | ws@^8.5.0: 1254 | version "8.16.0" 1255 | resolved "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz" 1256 | integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== 1257 | 1258 | y18n@^5.0.5: 1259 | version "5.0.8" 1260 | resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" 1261 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 1262 | 1263 | yargs-parser@^21.1.1: 1264 | version "21.1.1" 1265 | resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" 1266 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 1267 | 1268 | yargs@^17.7.2: 1269 | version "17.7.2" 1270 | resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" 1271 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 1272 | dependencies: 1273 | cliui "^8.0.1" 1274 | escalade "^3.1.1" 1275 | get-caller-file "^2.0.5" 1276 | require-directory "^2.1.1" 1277 | string-width "^4.2.3" 1278 | y18n "^5.0.5" 1279 | yargs-parser "^21.1.1" 1280 | 1281 | yn@3.1.1: 1282 | version "3.1.1" 1283 | resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" 1284 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 1285 | --------------------------------------------------------------------------------