├── .env.copy ├── .gitignore ├── README.md ├── buffer └── buffer.ts ├── constants ├── constants.ts └── index.ts ├── liquidity ├── index.ts └── liquidity.ts ├── market ├── index.ts └── market.ts ├── package-lock.json ├── package.json ├── streaming ├── openbook.ts └── raydium.ts ├── test.ts ├── transaction └── transaction.ts ├── tsconfig.json └── utils ├── index.ts ├── logger.ts └── utils.ts /.env.copy: -------------------------------------------------------------------------------- 1 | PRIVATE_KEY= 2 | RPC_ENDPOINT=http://swqos.solanavibestation.com/?api_key= 3 | RPC_WEBSOCKET_ENDPOINT=ws://swqos.solanavibestation.com/?api_key= 4 | QUOTE_MINT=WSOL 5 | QUOTE_AMOUNT=0.0001 6 | AMOUNT_TO_WSOL=0.005 7 | AUTO_SELL=true 8 | SLIPPAGE=0.005 #0.5% 9 | MAX_RETRY=10 10 | FREEZE_AUTHORITY=true 11 | SELL_TIMER=10000 #set as milliseconds 12 | COMMITMENT_LEVEL=processed 13 | LOG_LEVEL=info -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | public-bundles.json 2 | id-bundles.json 3 | # Logs 4 | logs 5 | *.log 6 | npm-debug.log* 7 | yarn-debug.log* 8 | yarn-error.log* 9 | lerna-debug.log* 10 | .pnpm-debug.log* 11 | 12 | # Diagnostic reports (https://nodejs.org/api/report.html) 13 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 14 | 15 | # Runtime data 16 | pids 17 | *.pid 18 | *.seed 19 | *.pid.lock 20 | 21 | # Directory for instrumented libs generated by jscoverage/JSCover 22 | lib-cov 23 | 24 | # Coverage directory used by tools like istanbul 25 | coverage 26 | *.lcov 27 | 28 | # nyc test coverage 29 | .nyc_output 30 | 31 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 32 | .grunt 33 | 34 | # Bower dependency directory (https://bower.io/) 35 | bower_components 36 | 37 | # node-waf configuration 38 | .lock-wscript 39 | 40 | # Compiled binary addons (https://nodejs.org/api/addons.html) 41 | build/Release 42 | 43 | # Dependency directories 44 | node_modules/ 45 | jspm_packages/ 46 | 47 | # Snowpack dependency directory (https://snowpack.dev/) 48 | web_modules/ 49 | 50 | # TypeScript cache 51 | *.tsbuildinfo 52 | 53 | # Optional npm cache directory 54 | .npm 55 | 56 | # Optional eslint cache 57 | .eslintcache 58 | 59 | # Optional stylelint cache 60 | .stylelintcache 61 | 62 | # Microbundle cache 63 | .rpt2_cache/ 64 | .rts2_cache_cjs/ 65 | .rts2_cache_es/ 66 | .rts2_cache_umd/ 67 | 68 | # Optional REPL history 69 | .node_repl_history 70 | 71 | # Output of 'npm pack' 72 | *.tgz 73 | 74 | # Yarn Integrity file 75 | .yarn-integrity 76 | 77 | # dotenv environment variable files 78 | .env 79 | .env.development.local 80 | .env.test.local 81 | .env.production.local 82 | .env.local 83 | 84 | # parcel-bundler cache (https://parceljs.org/) 85 | .cache 86 | .parcel-cache 87 | 88 | # Next.js build output 89 | .next 90 | out 91 | 92 | # Nuxt.js build / generate output 93 | .nuxt 94 | dist 95 | 96 | # Gatsby files 97 | .cache/ 98 | # Comment in the public line in if your project uses Gatsby and not Next.js 99 | # https://nextjs.org/blog/next-9-1#public-directory-support 100 | # public 101 | 102 | # vuepress build output 103 | .vuepress/dist 104 | 105 | # vuepress v2.x temp and cache directory 106 | .temp 107 | .cache 108 | 109 | # Docusaurus cache and generated files 110 | .docusaurus 111 | 112 | # Serverless directories 113 | .serverless/ 114 | 115 | # FuseBox cache 116 | .fusebox/ 117 | 118 | # DynamoDB Local files 119 | .dynamodb/ 120 | 121 | # TernJS port file 122 | .tern-port 123 | 124 | # Stores VSCode versions used for testing VSCode extensions 125 | .vscode-test 126 | 127 | # yarn v2 128 | .yarn/cache 129 | .yarn/unplugged 130 | .yarn/build-state.yml 131 | .yarn/install-state.gz 132 | .pnp.* 133 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Solana Vibe Station GRPC Ultra-Fast New Token Sniper 2 | 3 | This is a unmaintained and dirty PoC of using GRPC to detect newly launched tokens on Raydium and snipe them with the goal of being the first buy. Please feel free to use this in your own code. 4 | 5 | This program does not have any sell logic. This is not a bot. This is simply example code to demonstrate the capabilities and performance advantages that GRPC has over normal Solana RPC methods such as WebSockets. 6 | 7 | ![image](https://github.com/bigj-SVS/grpc-sniper/assets/173855326/1f4f4f54-d2fc-438e-a603-6aba1b641e1b) 8 | 9 | 10 | # Requirements 11 | - Yellowstone's Dragons Mouth GRPC streaming access (SVS's gRPC service) 12 | - RPC HTTP/WebSocket access (Ideally SVS's Staked RPC for best results) 13 | 14 | 15 | # Instructions 16 | - Run `npm install` 17 | - Rename `.env.copy` to `.env` 18 | - Add Solana Vibe Station API key to both the `RPC_ENDPOINT` and `RPC_WEBSOCKET_ENDPOINT` fields in the .env file 19 | - Add your private key in base64 format which can be exported from either Phantom or derived from your JSON keypair for your wallet. 20 | - Run `npm run test` to start the program 21 | 22 | For anyone looking for RPC node access + GRPC streaming checkout our Discord server below. 23 | 24 | Support us by joining our Discord. 25 | 26 | https://discord.gg/dQ9nmAavkB 27 | -------------------------------------------------------------------------------- /buffer/buffer.ts: -------------------------------------------------------------------------------- 1 | import { MARKET_STATE_LAYOUT_V3 } from '@raydium-io/raydium-sdk'; 2 | import { PublicKey } from '@solana/web3.js'; 3 | import { Buffer } from 'buffer'; 4 | 5 | export class BufferRingBuffer { 6 | private buffer: Array; 7 | private head: number; 8 | private tail: number; 9 | private count: number; 10 | private capacity: number; 11 | 12 | constructor(capacity: number) { 13 | this.capacity = capacity; 14 | this.buffer = new Array(capacity).fill(null); 15 | this.head = 0; 16 | this.tail = 0; 17 | this.count = 0; 18 | } 19 | 20 | isFull(): boolean { 21 | return this.count === this.capacity; 22 | } 23 | 24 | isEmpty(): boolean { 25 | return this.count === 0; 26 | } 27 | 28 | enqueue(item: Buffer): void { 29 | if (this.isFull()) { 30 | this.head = (this.head + 1) % this.capacity; 31 | } else { 32 | this.count++; 33 | } 34 | this.buffer[this.tail] = item; 35 | this.tail = (this.tail + 1) % this.capacity; 36 | } 37 | 38 | dequeue(): Buffer | null { 39 | if (this.isEmpty()) { 40 | return null; 41 | } 42 | const item = this.buffer[this.head]; 43 | this.buffer[this.head] = null; 44 | this.head = (this.head + 1) % this.capacity; 45 | this.count--; 46 | return item; 47 | } 48 | 49 | findPattern(publicKey: PublicKey): Buffer | false { 50 | const publicKeyBuffer = publicKey.toBuffer(); 51 | const baseMintOffset = MARKET_STATE_LAYOUT_V3.offsetOf('baseMint'); 52 | const baseMintEndOffset = baseMintOffset + publicKeyBuffer.length; 53 | 54 | for (let i = this.capacity - 1; i >= 0; i--) { 55 | if (this.buffer[i]) { 56 | const baseMintInBuffer = this.buffer[i]!.slice(baseMintOffset, baseMintEndOffset); 57 | if (baseMintInBuffer.equals(publicKeyBuffer)) { 58 | console.log(i); 59 | return this.buffer[i] as Buffer; // PublicKey found 60 | } 61 | } 62 | } 63 | return false; // PublicKey not found 64 | } 65 | 66 | } 67 | 68 | 69 | -------------------------------------------------------------------------------- /constants/constants.ts: -------------------------------------------------------------------------------- 1 | import { Commitment } from "@solana/web3.js"; 2 | import { logger, retrieveEnvVariable } from "../utils"; 3 | 4 | export const NETWORK = 'mainnet-beta'; 5 | export const COMMITMENT_LEVEL: Commitment = retrieveEnvVariable('COMMITMENT_LEVEL', logger) as Commitment; 6 | export const RPC_ENDPOINT = retrieveEnvVariable('RPC_ENDPOINT', logger); 7 | export const RPC_WEBSOCKET_ENDPOINT = retrieveEnvVariable('RPC_WEBSOCKET_ENDPOINT', logger); 8 | export const LOG_LEVEL = retrieveEnvVariable('LOG_LEVEL', logger); 9 | export const PRIVATE_KEY = retrieveEnvVariable('PRIVATE_KEY', logger); 10 | export const QUOTE_MINT = retrieveEnvVariable('QUOTE_MINT', logger); 11 | export const QUOTE_AMOUNT = retrieveEnvVariable('QUOTE_AMOUNT', logger); 12 | -------------------------------------------------------------------------------- /constants/index.ts: -------------------------------------------------------------------------------- 1 | export * from './constants'; -------------------------------------------------------------------------------- /liquidity/index.ts: -------------------------------------------------------------------------------- 1 | export * from './liquidity'; 2 | -------------------------------------------------------------------------------- /liquidity/liquidity.ts: -------------------------------------------------------------------------------- 1 | import { Commitment, Connection, PublicKey } from '@solana/web3.js'; 2 | import { 3 | Liquidity, 4 | LiquidityPoolKeys, 5 | Market, 6 | TokenAccount, 7 | SPL_ACCOUNT_LAYOUT, 8 | publicKey, 9 | struct, 10 | MAINNET_PROGRAM_ID, 11 | LiquidityStateV4, 12 | } from '@raydium-io/raydium-sdk'; 13 | import { TOKEN_PROGRAM_ID } from '@solana/spl-token'; 14 | import { MinimalMarketLayoutV3 } from '../market'; 15 | 16 | export const RAYDIUM_LIQUIDITY_PROGRAM_ID_V4 = MAINNET_PROGRAM_ID.AmmV4; 17 | export const OPENBOOK_PROGRAM_ID = MAINNET_PROGRAM_ID.OPENBOOK_MARKET; 18 | 19 | export const MINIMAL_MARKET_STATE_LAYOUT_V3 = struct([ 20 | publicKey('eventQueue'), 21 | publicKey('bids'), 22 | publicKey('asks'), 23 | ]); 24 | 25 | export function createPoolKeys( 26 | id: PublicKey, 27 | accountData: LiquidityStateV4, 28 | minimalMarketLayoutV3: MinimalMarketLayoutV3, 29 | ): LiquidityPoolKeys { 30 | return { 31 | id, 32 | baseMint: accountData.baseMint, 33 | quoteMint: accountData.quoteMint, 34 | lpMint: accountData.lpMint, 35 | baseDecimals: accountData.baseDecimal.toNumber(), 36 | quoteDecimals: accountData.quoteDecimal.toNumber(), 37 | lpDecimals: 5, 38 | version: 4, 39 | programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4, 40 | authority: Liquidity.getAssociatedAuthority({ 41 | programId: RAYDIUM_LIQUIDITY_PROGRAM_ID_V4, 42 | }).publicKey, 43 | openOrders: accountData.openOrders, 44 | targetOrders: accountData.targetOrders, 45 | baseVault: accountData.baseVault, 46 | quoteVault: accountData.quoteVault, 47 | marketVersion: 3, 48 | marketProgramId: accountData.marketProgramId, 49 | marketId: accountData.marketId, 50 | marketAuthority: Market.getAssociatedAuthority({ 51 | programId: accountData.marketProgramId, 52 | marketId: accountData.marketId, 53 | }).publicKey, 54 | marketBaseVault: accountData.baseVault, 55 | marketQuoteVault: accountData.quoteVault, 56 | marketBids: minimalMarketLayoutV3.bids, 57 | marketAsks: minimalMarketLayoutV3.asks, 58 | marketEventQueue: minimalMarketLayoutV3.eventQueue, 59 | withdrawQueue: accountData.withdrawQueue, 60 | lpVault: accountData.lpVault, 61 | lookupTableAccount: PublicKey.default, 62 | }; 63 | } 64 | 65 | export async function getTokenAccounts( 66 | connection: Connection, 67 | owner: PublicKey, 68 | commitment?: Commitment, 69 | ) { 70 | const tokenResp = await connection.getTokenAccountsByOwner( 71 | owner, 72 | { 73 | programId: TOKEN_PROGRAM_ID, 74 | }, 75 | commitment, 76 | ); 77 | 78 | const accounts: TokenAccount[] = []; 79 | for (const { pubkey, account } of tokenResp.value) { 80 | accounts.push({ 81 | pubkey, 82 | programId: account.owner, 83 | accountInfo: SPL_ACCOUNT_LAYOUT.decode(account.data), 84 | }); 85 | } 86 | 87 | return accounts; 88 | } 89 | -------------------------------------------------------------------------------- /market/index.ts: -------------------------------------------------------------------------------- 1 | export * from './market'; 2 | -------------------------------------------------------------------------------- /market/market.ts: -------------------------------------------------------------------------------- 1 | import { Commitment, Connection, PublicKey } from '@solana/web3.js'; 2 | import { GetStructureSchema, MARKET_STATE_LAYOUT_V3, LiquidityStateV4, Token, TokenAmount } from '@raydium-io/raydium-sdk'; 3 | import { MINIMAL_MARKET_STATE_LAYOUT_V3 } from '../liquidity'; 4 | import BN from 'bn.js'; 5 | import { logger } from '../utils'; 6 | 7 | export type MinimalMarketStateLayoutV3 = typeof MINIMAL_MARKET_STATE_LAYOUT_V3; 8 | export type MinimalMarketLayoutV3 = 9 | GetStructureSchema; 10 | 11 | export async function getMinimalMarketV3( 12 | connection: Connection, 13 | marketId: PublicKey, 14 | commitment?: Commitment, 15 | ): Promise { 16 | const marketInfo = await connection.getAccountInfo(marketId, { 17 | commitment, 18 | dataSlice: { 19 | offset: MARKET_STATE_LAYOUT_V3.offsetOf('eventQueue'), 20 | length: 32 * 3, 21 | }, 22 | }); 23 | 24 | return MINIMAL_MARKET_STATE_LAYOUT_V3.decode(marketInfo!.data); 25 | } 26 | 27 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test.ts", 3 | "version": "1.0.0", 4 | "lockfileVersion": 3, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "test.ts", 9 | "version": "1.0.0", 10 | "dependencies": { 11 | "@project-serum/serum": "^0.13.65", 12 | "@raydium-io/raydium-sdk": "^1.3.1-beta.47", 13 | "@solana/spl-token": "^0.4.0", 14 | "@solana/web3.js": "^1.89.1", 15 | "@triton-one/yellowstone-grpc": "^0.4.0", 16 | "bigint-buffer": "^1.1.5", 17 | "bn.js": "^5.2.1", 18 | "bs58": "^5.0.0", 19 | "dotenv": "^16.4.1", 20 | "global-agent": "^3.0.0", 21 | "global-tunnel-ng": "^2.7.1", 22 | "http-proxy-agent": "^7.0.2", 23 | "https-proxy-agent": "^7.0.4", 24 | "jito-ts": "latest", 25 | "pino": "^8.18.0", 26 | "pino-pretty": "^10.3.1", 27 | "pino-std-serializers": "^6.2.2" 28 | }, 29 | "devDependencies": { 30 | "@types/bn.js": "^5.1.5", 31 | "@types/global-tunnel-ng": "^2.1.4", 32 | "prettier": "^3.2.4", 33 | "ts-node": "^10.9.2", 34 | "typescript": "^5.3.3" 35 | } 36 | }, 37 | "node_modules/@babel/runtime": { 38 | "version": "7.24.1", 39 | "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.1.tgz", 40 | "integrity": "sha512-+BIznRzyqBf+2wCTxcKE3wDjfGeCoVE61KSHGpkzqrLi8qxqFwBeUFyId2cxkTmm55fzDGnm0+yCxaxygrLUnQ==", 41 | "dependencies": { 42 | "regenerator-runtime": "^0.14.0" 43 | }, 44 | "engines": { 45 | "node": ">=6.9.0" 46 | } 47 | }, 48 | "node_modules/@cspotcode/source-map-support": { 49 | "version": "0.8.1", 50 | "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", 51 | "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", 52 | "dev": true, 53 | "dependencies": { 54 | "@jridgewell/trace-mapping": "0.3.9" 55 | }, 56 | "engines": { 57 | "node": ">=12" 58 | } 59 | }, 60 | "node_modules/@grpc/grpc-js": { 61 | "version": "1.10.6", 62 | "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.10.6.tgz", 63 | "integrity": "sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA==", 64 | "dependencies": { 65 | "@grpc/proto-loader": "^0.7.10", 66 | "@js-sdsl/ordered-map": "^4.4.2" 67 | }, 68 | "engines": { 69 | "node": ">=12.10.0" 70 | } 71 | }, 72 | "node_modules/@grpc/proto-loader": { 73 | "version": "0.7.12", 74 | "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.12.tgz", 75 | "integrity": "sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q==", 76 | "dependencies": { 77 | "lodash.camelcase": "^4.3.0", 78 | "long": "^5.0.0", 79 | "protobufjs": "^7.2.4", 80 | "yargs": "^17.7.2" 81 | }, 82 | "bin": { 83 | "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" 84 | }, 85 | "engines": { 86 | "node": ">=6" 87 | } 88 | }, 89 | "node_modules/@jridgewell/resolve-uri": { 90 | "version": "3.1.2", 91 | "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", 92 | "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", 93 | "dev": true, 94 | "engines": { 95 | "node": ">=6.0.0" 96 | } 97 | }, 98 | "node_modules/@jridgewell/sourcemap-codec": { 99 | "version": "1.4.15", 100 | "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", 101 | "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", 102 | "dev": true 103 | }, 104 | "node_modules/@jridgewell/trace-mapping": { 105 | "version": "0.3.9", 106 | "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", 107 | "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", 108 | "dev": true, 109 | "dependencies": { 110 | "@jridgewell/resolve-uri": "^3.0.3", 111 | "@jridgewell/sourcemap-codec": "^1.4.10" 112 | } 113 | }, 114 | "node_modules/@js-sdsl/ordered-map": { 115 | "version": "4.4.2", 116 | "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", 117 | "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", 118 | "funding": { 119 | "type": "opencollective", 120 | "url": "https://opencollective.com/js-sdsl" 121 | } 122 | }, 123 | "node_modules/@noble/curves": { 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 | "funding": { 131 | "url": "https://paulmillr.com/funding/" 132 | } 133 | }, 134 | "node_modules/@noble/ed25519": { 135 | "version": "1.7.3", 136 | "resolved": "https://registry.npmjs.org/@noble/ed25519/-/ed25519-1.7.3.tgz", 137 | "integrity": "sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ==", 138 | "funding": [ 139 | { 140 | "type": "individual", 141 | "url": "https://paulmillr.com/funding/" 142 | } 143 | ] 144 | }, 145 | "node_modules/@noble/hashes": { 146 | "version": "1.4.0", 147 | "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.4.0.tgz", 148 | "integrity": "sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==", 149 | "engines": { 150 | "node": ">= 16" 151 | }, 152 | "funding": { 153 | "url": "https://paulmillr.com/funding/" 154 | } 155 | }, 156 | "node_modules/@project-serum/anchor": { 157 | "version": "0.11.1", 158 | "resolved": "https://registry.npmjs.org/@project-serum/anchor/-/anchor-0.11.1.tgz", 159 | "integrity": "sha512-oIdm4vTJkUy6GmE6JgqDAuQPKI7XM4TPJkjtoIzp69RZe0iAD9JP2XHx7lV1jLdYXeYHqDXfBt3zcq7W91K6PA==", 160 | "dependencies": { 161 | "@project-serum/borsh": "^0.2.2", 162 | "@solana/web3.js": "^1.17.0", 163 | "base64-js": "^1.5.1", 164 | "bn.js": "^5.1.2", 165 | "bs58": "^4.0.1", 166 | "buffer-layout": "^1.2.0", 167 | "camelcase": "^5.3.1", 168 | "crypto-hash": "^1.3.0", 169 | "eventemitter3": "^4.0.7", 170 | "find": "^0.3.0", 171 | "js-sha256": "^0.9.0", 172 | "pako": "^2.0.3", 173 | "snake-case": "^3.0.4", 174 | "toml": "^3.0.0" 175 | }, 176 | "engines": { 177 | "node": ">=11" 178 | } 179 | }, 180 | "node_modules/@project-serum/anchor/node_modules/base-x": { 181 | "version": "3.0.9", 182 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", 183 | "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", 184 | "dependencies": { 185 | "safe-buffer": "^5.0.1" 186 | } 187 | }, 188 | "node_modules/@project-serum/anchor/node_modules/bs58": { 189 | "version": "4.0.1", 190 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 191 | "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", 192 | "dependencies": { 193 | "base-x": "^3.0.2" 194 | } 195 | }, 196 | "node_modules/@project-serum/borsh": { 197 | "version": "0.2.5", 198 | "resolved": "https://registry.npmjs.org/@project-serum/borsh/-/borsh-0.2.5.tgz", 199 | "integrity": "sha512-UmeUkUoKdQ7rhx6Leve1SssMR/Ghv8qrEiyywyxSWg7ooV7StdpPBhciiy5eB3T0qU1BXvdRNC8TdrkxK7WC5Q==", 200 | "dependencies": { 201 | "bn.js": "^5.1.2", 202 | "buffer-layout": "^1.2.0" 203 | }, 204 | "engines": { 205 | "node": ">=10" 206 | }, 207 | "peerDependencies": { 208 | "@solana/web3.js": "^1.2.0" 209 | } 210 | }, 211 | "node_modules/@project-serum/serum": { 212 | "version": "0.13.65", 213 | "resolved": "https://registry.npmjs.org/@project-serum/serum/-/serum-0.13.65.tgz", 214 | "integrity": "sha512-BHRqsTqPSfFB5p+MgI2pjvMBAQtO8ibTK2fYY96boIFkCI3TTwXDt2gUmspeChKO2pqHr5aKevmexzAcXxrSRA==", 215 | "dependencies": { 216 | "@project-serum/anchor": "^0.11.1", 217 | "@solana/spl-token": "^0.1.6", 218 | "@solana/web3.js": "^1.21.0", 219 | "bn.js": "^5.1.2", 220 | "buffer-layout": "^1.2.0" 221 | }, 222 | "engines": { 223 | "node": ">=10" 224 | } 225 | }, 226 | "node_modules/@project-serum/serum/node_modules/@solana/spl-token": { 227 | "version": "0.1.8", 228 | "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.1.8.tgz", 229 | "integrity": "sha512-LZmYCKcPQDtJgecvWOgT/cnoIQPWjdH+QVyzPcFvyDUiT0DiRjZaam4aqNUyvchLFhzgunv3d9xOoyE34ofdoQ==", 230 | "dependencies": { 231 | "@babel/runtime": "^7.10.5", 232 | "@solana/web3.js": "^1.21.0", 233 | "bn.js": "^5.1.0", 234 | "buffer": "6.0.3", 235 | "buffer-layout": "^1.2.0", 236 | "dotenv": "10.0.0" 237 | }, 238 | "engines": { 239 | "node": ">= 10" 240 | } 241 | }, 242 | "node_modules/@project-serum/serum/node_modules/dotenv": { 243 | "version": "10.0.0", 244 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", 245 | "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", 246 | "engines": { 247 | "node": ">=10" 248 | } 249 | }, 250 | "node_modules/@protobufjs/aspromise": { 251 | "version": "1.1.2", 252 | "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", 253 | "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" 254 | }, 255 | "node_modules/@protobufjs/base64": { 256 | "version": "1.1.2", 257 | "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", 258 | "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" 259 | }, 260 | "node_modules/@protobufjs/codegen": { 261 | "version": "2.0.4", 262 | "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", 263 | "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" 264 | }, 265 | "node_modules/@protobufjs/eventemitter": { 266 | "version": "1.1.0", 267 | "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", 268 | "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" 269 | }, 270 | "node_modules/@protobufjs/fetch": { 271 | "version": "1.1.0", 272 | "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", 273 | "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", 274 | "dependencies": { 275 | "@protobufjs/aspromise": "^1.1.1", 276 | "@protobufjs/inquire": "^1.1.0" 277 | } 278 | }, 279 | "node_modules/@protobufjs/float": { 280 | "version": "1.0.2", 281 | "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", 282 | "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" 283 | }, 284 | "node_modules/@protobufjs/inquire": { 285 | "version": "1.1.0", 286 | "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", 287 | "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" 288 | }, 289 | "node_modules/@protobufjs/path": { 290 | "version": "1.1.2", 291 | "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", 292 | "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" 293 | }, 294 | "node_modules/@protobufjs/pool": { 295 | "version": "1.1.0", 296 | "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", 297 | "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" 298 | }, 299 | "node_modules/@protobufjs/utf8": { 300 | "version": "1.1.0", 301 | "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", 302 | "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" 303 | }, 304 | "node_modules/@raydium-io/raydium-sdk": { 305 | "version": "1.3.1-beta.50", 306 | "resolved": "https://registry.npmjs.org/@raydium-io/raydium-sdk/-/raydium-sdk-1.3.1-beta.50.tgz", 307 | "integrity": "sha512-leYSECA5s1kaJKV3ryLOPaJ0jt8665q08PZ0MmsQYtVUOjwnB9yEBxpOv/KyO+Kx8eOeZ1NQVXGMiKO0/lhCXw==", 308 | "dependencies": { 309 | "@solana/buffer-layout": "^4.0.1", 310 | "@solana/spl-token": "^0.3.9", 311 | "axios": "^1.6.2", 312 | "big.js": "^6.2.1", 313 | "bn.js": "^5.2.1", 314 | "decimal.js": "^10.4.3", 315 | "decimal.js-light": "^2.5.1", 316 | "fecha": "^4.2.3", 317 | "lodash": "^4.17.21", 318 | "toformat": "^2.0.0" 319 | }, 320 | "peerDependencies": { 321 | "@solana/web3.js": "^1.73.0" 322 | } 323 | }, 324 | "node_modules/@raydium-io/raydium-sdk/node_modules/@solana/spl-token": { 325 | "version": "0.3.11", 326 | "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.3.11.tgz", 327 | "integrity": "sha512-bvohO3rIMSVL24Pb+I4EYTJ6cL82eFpInEXD/I8K8upOGjpqHsKUoAempR/RnUlI1qSFNyFlWJfu6MNUgfbCQQ==", 328 | "dependencies": { 329 | "@solana/buffer-layout": "^4.0.0", 330 | "@solana/buffer-layout-utils": "^0.2.0", 331 | "@solana/spl-token-metadata": "^0.1.2", 332 | "buffer": "^6.0.3" 333 | }, 334 | "engines": { 335 | "node": ">=16" 336 | }, 337 | "peerDependencies": { 338 | "@solana/web3.js": "^1.88.0" 339 | } 340 | }, 341 | "node_modules/@solana/buffer-layout": { 342 | "version": "4.0.1", 343 | "resolved": "https://registry.npmjs.org/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz", 344 | "integrity": "sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA==", 345 | "dependencies": { 346 | "buffer": "~6.0.3" 347 | }, 348 | "engines": { 349 | "node": ">=5.10" 350 | } 351 | }, 352 | "node_modules/@solana/buffer-layout-utils": { 353 | "version": "0.2.0", 354 | "resolved": "https://registry.npmjs.org/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz", 355 | "integrity": "sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g==", 356 | "dependencies": { 357 | "@solana/buffer-layout": "^4.0.0", 358 | "@solana/web3.js": "^1.32.0", 359 | "bigint-buffer": "^1.1.5", 360 | "bignumber.js": "^9.0.1" 361 | }, 362 | "engines": { 363 | "node": ">= 10" 364 | } 365 | }, 366 | "node_modules/@solana/codecs": { 367 | "version": "2.0.0-preview.2", 368 | "resolved": "https://registry.npmjs.org/@solana/codecs/-/codecs-2.0.0-preview.2.tgz", 369 | "integrity": "sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA==", 370 | "dependencies": { 371 | "@solana/codecs-core": "2.0.0-preview.2", 372 | "@solana/codecs-data-structures": "2.0.0-preview.2", 373 | "@solana/codecs-numbers": "2.0.0-preview.2", 374 | "@solana/codecs-strings": "2.0.0-preview.2", 375 | "@solana/options": "2.0.0-preview.2" 376 | } 377 | }, 378 | "node_modules/@solana/codecs-core": { 379 | "version": "2.0.0-preview.2", 380 | "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz", 381 | "integrity": "sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg==", 382 | "dependencies": { 383 | "@solana/errors": "2.0.0-preview.2" 384 | } 385 | }, 386 | "node_modules/@solana/codecs-data-structures": { 387 | "version": "2.0.0-preview.2", 388 | "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz", 389 | "integrity": "sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg==", 390 | "dependencies": { 391 | "@solana/codecs-core": "2.0.0-preview.2", 392 | "@solana/codecs-numbers": "2.0.0-preview.2", 393 | "@solana/errors": "2.0.0-preview.2" 394 | } 395 | }, 396 | "node_modules/@solana/codecs-numbers": { 397 | "version": "2.0.0-preview.2", 398 | "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz", 399 | "integrity": "sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw==", 400 | "dependencies": { 401 | "@solana/codecs-core": "2.0.0-preview.2", 402 | "@solana/errors": "2.0.0-preview.2" 403 | } 404 | }, 405 | "node_modules/@solana/codecs-strings": { 406 | "version": "2.0.0-preview.2", 407 | "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz", 408 | "integrity": "sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g==", 409 | "dependencies": { 410 | "@solana/codecs-core": "2.0.0-preview.2", 411 | "@solana/codecs-numbers": "2.0.0-preview.2", 412 | "@solana/errors": "2.0.0-preview.2" 413 | }, 414 | "peerDependencies": { 415 | "fastestsmallesttextencoderdecoder": "^1.0.22" 416 | } 417 | }, 418 | "node_modules/@solana/errors": { 419 | "version": "2.0.0-preview.2", 420 | "resolved": "https://registry.npmjs.org/@solana/errors/-/errors-2.0.0-preview.2.tgz", 421 | "integrity": "sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA==", 422 | "dependencies": { 423 | "chalk": "^5.3.0", 424 | "commander": "^12.0.0" 425 | }, 426 | "bin": { 427 | "errors": "bin/cli.js" 428 | } 429 | }, 430 | "node_modules/@solana/options": { 431 | "version": "2.0.0-preview.2", 432 | "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-preview.2.tgz", 433 | "integrity": "sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w==", 434 | "dependencies": { 435 | "@solana/codecs-core": "2.0.0-preview.2", 436 | "@solana/codecs-numbers": "2.0.0-preview.2" 437 | } 438 | }, 439 | "node_modules/@solana/spl-token": { 440 | "version": "0.4.3", 441 | "resolved": "https://registry.npmjs.org/@solana/spl-token/-/spl-token-0.4.3.tgz", 442 | "integrity": "sha512-mRjJJE9CIBejsg9WAmDp369pWeObm42K2fwsZ4dkJAMCt1KBPb5Eb1vzM5+AYfV/BUTy3QP2oFx8kV+8Doa1xQ==", 443 | "dependencies": { 444 | "@solana/buffer-layout": "^4.0.0", 445 | "@solana/buffer-layout-utils": "^0.2.0", 446 | "@solana/spl-token-group": "^0.0.2", 447 | "@solana/spl-token-metadata": "^0.1.2", 448 | "buffer": "^6.0.3" 449 | }, 450 | "engines": { 451 | "node": ">=16" 452 | }, 453 | "peerDependencies": { 454 | "@solana/web3.js": "^1.91.1" 455 | } 456 | }, 457 | "node_modules/@solana/spl-token-group": { 458 | "version": "0.0.2", 459 | "resolved": "https://registry.npmjs.org/@solana/spl-token-group/-/spl-token-group-0.0.2.tgz", 460 | "integrity": "sha512-vLePrFvT9+PfK2KZaddPebTWtRykXUR+060gqomFUcBk/2UPpZtsJGW+xshI9z9Ryrx7FieprZEUCApw34BwrQ==", 461 | "dependencies": { 462 | "@solana/codecs": "2.0.0-preview.2", 463 | "@solana/spl-type-length-value": "0.1.0" 464 | }, 465 | "engines": { 466 | "node": ">=16" 467 | }, 468 | "peerDependencies": { 469 | "@solana/web3.js": "^1.91.1" 470 | } 471 | }, 472 | "node_modules/@solana/spl-token-metadata": { 473 | "version": "0.1.2", 474 | "resolved": "https://registry.npmjs.org/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz", 475 | "integrity": "sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw==", 476 | "dependencies": { 477 | "@solana/codecs-core": "2.0.0-experimental.8618508", 478 | "@solana/codecs-data-structures": "2.0.0-experimental.8618508", 479 | "@solana/codecs-numbers": "2.0.0-experimental.8618508", 480 | "@solana/codecs-strings": "2.0.0-experimental.8618508", 481 | "@solana/options": "2.0.0-experimental.8618508", 482 | "@solana/spl-type-length-value": "0.1.0" 483 | }, 484 | "engines": { 485 | "node": ">=16" 486 | }, 487 | "peerDependencies": { 488 | "@solana/web3.js": "^1.87.6" 489 | } 490 | }, 491 | "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-core": { 492 | "version": "2.0.0-experimental.8618508", 493 | "resolved": "https://registry.npmjs.org/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz", 494 | "integrity": "sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA==" 495 | }, 496 | "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-data-structures": { 497 | "version": "2.0.0-experimental.8618508", 498 | "resolved": "https://registry.npmjs.org/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz", 499 | "integrity": "sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw==", 500 | "dependencies": { 501 | "@solana/codecs-core": "2.0.0-experimental.8618508", 502 | "@solana/codecs-numbers": "2.0.0-experimental.8618508" 503 | } 504 | }, 505 | "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-numbers": { 506 | "version": "2.0.0-experimental.8618508", 507 | "resolved": "https://registry.npmjs.org/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz", 508 | "integrity": "sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q==", 509 | "dependencies": { 510 | "@solana/codecs-core": "2.0.0-experimental.8618508" 511 | } 512 | }, 513 | "node_modules/@solana/spl-token-metadata/node_modules/@solana/codecs-strings": { 514 | "version": "2.0.0-experimental.8618508", 515 | "resolved": "https://registry.npmjs.org/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz", 516 | "integrity": "sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA==", 517 | "dependencies": { 518 | "@solana/codecs-core": "2.0.0-experimental.8618508", 519 | "@solana/codecs-numbers": "2.0.0-experimental.8618508" 520 | }, 521 | "peerDependencies": { 522 | "fastestsmallesttextencoderdecoder": "^1.0.22" 523 | } 524 | }, 525 | "node_modules/@solana/spl-token-metadata/node_modules/@solana/options": { 526 | "version": "2.0.0-experimental.8618508", 527 | "resolved": "https://registry.npmjs.org/@solana/options/-/options-2.0.0-experimental.8618508.tgz", 528 | "integrity": "sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg==", 529 | "dependencies": { 530 | "@solana/codecs-core": "2.0.0-experimental.8618508", 531 | "@solana/codecs-numbers": "2.0.0-experimental.8618508" 532 | } 533 | }, 534 | "node_modules/@solana/spl-type-length-value": { 535 | "version": "0.1.0", 536 | "resolved": "https://registry.npmjs.org/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz", 537 | "integrity": "sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA==", 538 | "dependencies": { 539 | "buffer": "^6.0.3" 540 | }, 541 | "engines": { 542 | "node": ">=16" 543 | } 544 | }, 545 | "node_modules/@solana/web3.js": { 546 | "version": "1.91.1", 547 | "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.91.1.tgz", 548 | "integrity": "sha512-cPgjZXm688oM9cULvJ8u2VH6Qp5rvptE1N1VODVxn2mAbpZsWrvWNPjmASkMYT/HzyrtqFkPvFdSHg8Xjt7aQA==", 549 | "dependencies": { 550 | "@babel/runtime": "^7.23.4", 551 | "@noble/curves": "^1.2.0", 552 | "@noble/hashes": "^1.3.3", 553 | "@solana/buffer-layout": "^4.0.1", 554 | "agentkeepalive": "^4.5.0", 555 | "bigint-buffer": "^1.1.5", 556 | "bn.js": "^5.2.1", 557 | "borsh": "^0.7.0", 558 | "bs58": "^4.0.1", 559 | "buffer": "6.0.3", 560 | "fast-stable-stringify": "^1.0.0", 561 | "jayson": "^4.1.0", 562 | "node-fetch": "^2.7.0", 563 | "rpc-websockets": "^7.5.1", 564 | "superstruct": "^0.14.2" 565 | } 566 | }, 567 | "node_modules/@solana/web3.js/node_modules/base-x": { 568 | "version": "3.0.9", 569 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", 570 | "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", 571 | "dependencies": { 572 | "safe-buffer": "^5.0.1" 573 | } 574 | }, 575 | "node_modules/@solana/web3.js/node_modules/bs58": { 576 | "version": "4.0.1", 577 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 578 | "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", 579 | "dependencies": { 580 | "base-x": "^3.0.2" 581 | } 582 | }, 583 | "node_modules/@triton-one/yellowstone-grpc": { 584 | "version": "0.4.0", 585 | "resolved": "https://registry.npmjs.org/@triton-one/yellowstone-grpc/-/yellowstone-grpc-0.4.0.tgz", 586 | "integrity": "sha512-YJaX+ByPtN6aG4HiKfd62Yd5NUZIiEMoBmSfxdRLBEgT3J9WWqoCRqVTzS93sWpP7IJ5pkGBfxMpDlugM8zn3g==", 587 | "dependencies": { 588 | "@grpc/grpc-js": "^1.8.0" 589 | } 590 | }, 591 | "node_modules/@tsconfig/node10": { 592 | "version": "1.0.10", 593 | "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.10.tgz", 594 | "integrity": "sha512-PiaIWIoPvO6qm6t114ropMCagj6YAF24j9OkCA2mJDXFnlionEwhsBCJ8yek4aib575BI3OkART/90WsgHgLWw==", 595 | "dev": true 596 | }, 597 | "node_modules/@tsconfig/node12": { 598 | "version": "1.0.11", 599 | "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", 600 | "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", 601 | "dev": true 602 | }, 603 | "node_modules/@tsconfig/node14": { 604 | "version": "1.0.3", 605 | "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", 606 | "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", 607 | "dev": true 608 | }, 609 | "node_modules/@tsconfig/node16": { 610 | "version": "1.0.4", 611 | "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", 612 | "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", 613 | "dev": true 614 | }, 615 | "node_modules/@types/bn.js": { 616 | "version": "5.1.5", 617 | "resolved": "https://registry.npmjs.org/@types/bn.js/-/bn.js-5.1.5.tgz", 618 | "integrity": "sha512-V46N0zwKRF5Q00AZ6hWtN0T8gGmDUaUzLWQvHFo5yThtVwK/VCenFY3wXVbOvNfajEpsTfQM4IN9k/d6gUVX3A==", 619 | "dev": true, 620 | "dependencies": { 621 | "@types/node": "*" 622 | } 623 | }, 624 | "node_modules/@types/bs58": { 625 | "version": "4.0.4", 626 | "resolved": "https://registry.npmjs.org/@types/bs58/-/bs58-4.0.4.tgz", 627 | "integrity": "sha512-0IEpMFXXQi2zXaXl9GJ3sRwQo0uEkD+yFOv+FnAU5lkPtcu6h61xb7jc2CFPEZ5BUOaiP13ThuGc9HD4R8lR5g==", 628 | "dependencies": { 629 | "@types/node": "*", 630 | "base-x": "^3.0.6" 631 | } 632 | }, 633 | "node_modules/@types/bs58/node_modules/base-x": { 634 | "version": "3.0.10", 635 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", 636 | "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", 637 | "dependencies": { 638 | "safe-buffer": "^5.0.1" 639 | } 640 | }, 641 | "node_modules/@types/connect": { 642 | "version": "3.4.38", 643 | "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", 644 | "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", 645 | "dependencies": { 646 | "@types/node": "*" 647 | } 648 | }, 649 | "node_modules/@types/global-tunnel-ng": { 650 | "version": "2.1.4", 651 | "resolved": "https://registry.npmjs.org/@types/global-tunnel-ng/-/global-tunnel-ng-2.1.4.tgz", 652 | "integrity": "sha512-9L/Z4P4kRXYZaorOkeRCLUGiLkba/v2EY0c4f+zIml3BX6xGzj8yCbz24Y9pmWnMY35tih89AzLFTmu42VWkow==", 653 | "dev": true 654 | }, 655 | "node_modules/@types/node": { 656 | "version": "20.11.30", 657 | "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.30.tgz", 658 | "integrity": "sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==", 659 | "dependencies": { 660 | "undici-types": "~5.26.4" 661 | } 662 | }, 663 | "node_modules/@types/ws": { 664 | "version": "7.4.7", 665 | "resolved": "https://registry.npmjs.org/@types/ws/-/ws-7.4.7.tgz", 666 | "integrity": "sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==", 667 | "dependencies": { 668 | "@types/node": "*" 669 | } 670 | }, 671 | "node_modules/abort-controller": { 672 | "version": "3.0.0", 673 | "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", 674 | "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", 675 | "dependencies": { 676 | "event-target-shim": "^5.0.0" 677 | }, 678 | "engines": { 679 | "node": ">=6.5" 680 | } 681 | }, 682 | "node_modules/acorn": { 683 | "version": "8.11.3", 684 | "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", 685 | "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", 686 | "dev": true, 687 | "bin": { 688 | "acorn": "bin/acorn" 689 | }, 690 | "engines": { 691 | "node": ">=0.4.0" 692 | } 693 | }, 694 | "node_modules/acorn-walk": { 695 | "version": "8.3.2", 696 | "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", 697 | "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", 698 | "dev": true, 699 | "engines": { 700 | "node": ">=0.4.0" 701 | } 702 | }, 703 | "node_modules/agent-base": { 704 | "version": "7.1.1", 705 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", 706 | "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", 707 | "dependencies": { 708 | "debug": "^4.3.4" 709 | }, 710 | "engines": { 711 | "node": ">= 14" 712 | } 713 | }, 714 | "node_modules/agentkeepalive": { 715 | "version": "4.5.0", 716 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.5.0.tgz", 717 | "integrity": "sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==", 718 | "dependencies": { 719 | "humanize-ms": "^1.2.1" 720 | }, 721 | "engines": { 722 | "node": ">= 8.0.0" 723 | } 724 | }, 725 | "node_modules/ansi-regex": { 726 | "version": "5.0.1", 727 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", 728 | "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", 729 | "engines": { 730 | "node": ">=8" 731 | } 732 | }, 733 | "node_modules/ansi-styles": { 734 | "version": "4.3.0", 735 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", 736 | "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", 737 | "dependencies": { 738 | "color-convert": "^2.0.1" 739 | }, 740 | "engines": { 741 | "node": ">=8" 742 | }, 743 | "funding": { 744 | "url": "https://github.com/chalk/ansi-styles?sponsor=1" 745 | } 746 | }, 747 | "node_modules/arg": { 748 | "version": "4.1.3", 749 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", 750 | "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", 751 | "dev": true 752 | }, 753 | "node_modules/asynckit": { 754 | "version": "0.4.0", 755 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 756 | "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" 757 | }, 758 | "node_modules/atomic-sleep": { 759 | "version": "1.0.0", 760 | "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", 761 | "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", 762 | "engines": { 763 | "node": ">=8.0.0" 764 | } 765 | }, 766 | "node_modules/axios": { 767 | "version": "1.6.8", 768 | "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.8.tgz", 769 | "integrity": "sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==", 770 | "dependencies": { 771 | "follow-redirects": "^1.15.6", 772 | "form-data": "^4.0.0", 773 | "proxy-from-env": "^1.1.0" 774 | } 775 | }, 776 | "node_modules/base-x": { 777 | "version": "4.0.0", 778 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-4.0.0.tgz", 779 | "integrity": "sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw==" 780 | }, 781 | "node_modules/base64-js": { 782 | "version": "1.5.1", 783 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 784 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 785 | "funding": [ 786 | { 787 | "type": "github", 788 | "url": "https://github.com/sponsors/feross" 789 | }, 790 | { 791 | "type": "patreon", 792 | "url": "https://www.patreon.com/feross" 793 | }, 794 | { 795 | "type": "consulting", 796 | "url": "https://feross.org/support" 797 | } 798 | ] 799 | }, 800 | "node_modules/big.js": { 801 | "version": "6.2.1", 802 | "resolved": "https://registry.npmjs.org/big.js/-/big.js-6.2.1.tgz", 803 | "integrity": "sha512-bCtHMwL9LeDIozFn+oNhhFoq+yQ3BNdnsLSASUxLciOb1vgvpHsIO1dsENiGMgbb4SkP5TrzWzRiLddn8ahVOQ==", 804 | "engines": { 805 | "node": "*" 806 | }, 807 | "funding": { 808 | "type": "opencollective", 809 | "url": "https://opencollective.com/bigjs" 810 | } 811 | }, 812 | "node_modules/bigint-buffer": { 813 | "version": "1.1.5", 814 | "resolved": "https://registry.npmjs.org/bigint-buffer/-/bigint-buffer-1.1.5.tgz", 815 | "integrity": "sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA==", 816 | "hasInstallScript": true, 817 | "dependencies": { 818 | "bindings": "^1.3.0" 819 | }, 820 | "engines": { 821 | "node": ">= 10.0.0" 822 | } 823 | }, 824 | "node_modules/bignumber.js": { 825 | "version": "9.1.2", 826 | "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.1.2.tgz", 827 | "integrity": "sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==", 828 | "engines": { 829 | "node": "*" 830 | } 831 | }, 832 | "node_modules/bindings": { 833 | "version": "1.5.0", 834 | "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", 835 | "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", 836 | "dependencies": { 837 | "file-uri-to-path": "1.0.0" 838 | } 839 | }, 840 | "node_modules/bn.js": { 841 | "version": "5.2.1", 842 | "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.2.1.tgz", 843 | "integrity": "sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==" 844 | }, 845 | "node_modules/boolean": { 846 | "version": "3.2.0", 847 | "resolved": "https://registry.npmjs.org/boolean/-/boolean-3.2.0.tgz", 848 | "integrity": "sha512-d0II/GO9uf9lfUHH2BQsjxzRJZBdsjgsBiW4BvhWk/3qoKwQFjIDVN19PfX8F2D/r9PCMTtLWjYVCFrpeYUzsw==" 849 | }, 850 | "node_modules/borsh": { 851 | "version": "0.7.0", 852 | "resolved": "https://registry.npmjs.org/borsh/-/borsh-0.7.0.tgz", 853 | "integrity": "sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA==", 854 | "dependencies": { 855 | "bn.js": "^5.2.0", 856 | "bs58": "^4.0.0", 857 | "text-encoding-utf-8": "^1.0.2" 858 | } 859 | }, 860 | "node_modules/borsh/node_modules/base-x": { 861 | "version": "3.0.9", 862 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.9.tgz", 863 | "integrity": "sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ==", 864 | "dependencies": { 865 | "safe-buffer": "^5.0.1" 866 | } 867 | }, 868 | "node_modules/borsh/node_modules/bs58": { 869 | "version": "4.0.1", 870 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 871 | "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", 872 | "dependencies": { 873 | "base-x": "^3.0.2" 874 | } 875 | }, 876 | "node_modules/bs58": { 877 | "version": "5.0.0", 878 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-5.0.0.tgz", 879 | "integrity": "sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ==", 880 | "dependencies": { 881 | "base-x": "^4.0.0" 882 | } 883 | }, 884 | "node_modules/buffer": { 885 | "version": "6.0.3", 886 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", 887 | "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", 888 | "funding": [ 889 | { 890 | "type": "github", 891 | "url": "https://github.com/sponsors/feross" 892 | }, 893 | { 894 | "type": "patreon", 895 | "url": "https://www.patreon.com/feross" 896 | }, 897 | { 898 | "type": "consulting", 899 | "url": "https://feross.org/support" 900 | } 901 | ], 902 | "dependencies": { 903 | "base64-js": "^1.3.1", 904 | "ieee754": "^1.2.1" 905 | } 906 | }, 907 | "node_modules/buffer-layout": { 908 | "version": "1.2.2", 909 | "resolved": "https://registry.npmjs.org/buffer-layout/-/buffer-layout-1.2.2.tgz", 910 | "integrity": "sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA==", 911 | "engines": { 912 | "node": ">=4.5" 913 | } 914 | }, 915 | "node_modules/bufferutil": { 916 | "version": "4.0.8", 917 | "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.8.tgz", 918 | "integrity": "sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw==", 919 | "hasInstallScript": true, 920 | "optional": true, 921 | "dependencies": { 922 | "node-gyp-build": "^4.3.0" 923 | }, 924 | "engines": { 925 | "node": ">=6.14.2" 926 | } 927 | }, 928 | "node_modules/camelcase": { 929 | "version": "5.3.1", 930 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", 931 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", 932 | "engines": { 933 | "node": ">=6" 934 | } 935 | }, 936 | "node_modules/chalk": { 937 | "version": "5.3.0", 938 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", 939 | "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", 940 | "engines": { 941 | "node": "^12.17.0 || ^14.13 || >=16.0.0" 942 | }, 943 | "funding": { 944 | "url": "https://github.com/chalk/chalk?sponsor=1" 945 | } 946 | }, 947 | "node_modules/cliui": { 948 | "version": "8.0.1", 949 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", 950 | "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", 951 | "dependencies": { 952 | "string-width": "^4.2.0", 953 | "strip-ansi": "^6.0.1", 954 | "wrap-ansi": "^7.0.0" 955 | }, 956 | "engines": { 957 | "node": ">=12" 958 | } 959 | }, 960 | "node_modules/color-convert": { 961 | "version": "2.0.1", 962 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", 963 | "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", 964 | "dependencies": { 965 | "color-name": "~1.1.4" 966 | }, 967 | "engines": { 968 | "node": ">=7.0.0" 969 | } 970 | }, 971 | "node_modules/color-name": { 972 | "version": "1.1.4", 973 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", 974 | "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" 975 | }, 976 | "node_modules/colorette": { 977 | "version": "2.0.20", 978 | "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", 979 | "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" 980 | }, 981 | "node_modules/combined-stream": { 982 | "version": "1.0.8", 983 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", 984 | "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", 985 | "dependencies": { 986 | "delayed-stream": "~1.0.0" 987 | }, 988 | "engines": { 989 | "node": ">= 0.8" 990 | } 991 | }, 992 | "node_modules/commander": { 993 | "version": "12.0.0", 994 | "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", 995 | "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", 996 | "engines": { 997 | "node": ">=18" 998 | } 999 | }, 1000 | "node_modules/config-chain": { 1001 | "version": "1.1.13", 1002 | "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", 1003 | "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", 1004 | "dependencies": { 1005 | "ini": "^1.3.4", 1006 | "proto-list": "~1.2.1" 1007 | } 1008 | }, 1009 | "node_modules/create-require": { 1010 | "version": "1.1.1", 1011 | "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", 1012 | "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", 1013 | "dev": true 1014 | }, 1015 | "node_modules/crypto-hash": { 1016 | "version": "1.3.0", 1017 | "resolved": "https://registry.npmjs.org/crypto-hash/-/crypto-hash-1.3.0.tgz", 1018 | "integrity": "sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg==", 1019 | "engines": { 1020 | "node": ">=8" 1021 | }, 1022 | "funding": { 1023 | "url": "https://github.com/sponsors/sindresorhus" 1024 | } 1025 | }, 1026 | "node_modules/dateformat": { 1027 | "version": "4.6.3", 1028 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-4.6.3.tgz", 1029 | "integrity": "sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==", 1030 | "engines": { 1031 | "node": "*" 1032 | } 1033 | }, 1034 | "node_modules/debug": { 1035 | "version": "4.3.4", 1036 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", 1037 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", 1038 | "dependencies": { 1039 | "ms": "2.1.2" 1040 | }, 1041 | "engines": { 1042 | "node": ">=6.0" 1043 | }, 1044 | "peerDependenciesMeta": { 1045 | "supports-color": { 1046 | "optional": true 1047 | } 1048 | } 1049 | }, 1050 | "node_modules/debug/node_modules/ms": { 1051 | "version": "2.1.2", 1052 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1053 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1054 | }, 1055 | "node_modules/decimal.js": { 1056 | "version": "10.4.3", 1057 | "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", 1058 | "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" 1059 | }, 1060 | "node_modules/decimal.js-light": { 1061 | "version": "2.5.1", 1062 | "resolved": "https://registry.npmjs.org/decimal.js-light/-/decimal.js-light-2.5.1.tgz", 1063 | "integrity": "sha512-qIMFpTMZmny+MMIitAB6D7iVPEorVw6YQRWkvarTkT4tBeSLLiHzcwj6q0MmYSFCiVpiqPJTJEYIrpcPzVEIvg==" 1064 | }, 1065 | "node_modules/define-data-property": { 1066 | "version": "1.1.4", 1067 | "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", 1068 | "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", 1069 | "dependencies": { 1070 | "es-define-property": "^1.0.0", 1071 | "es-errors": "^1.3.0", 1072 | "gopd": "^1.0.1" 1073 | }, 1074 | "engines": { 1075 | "node": ">= 0.4" 1076 | }, 1077 | "funding": { 1078 | "url": "https://github.com/sponsors/ljharb" 1079 | } 1080 | }, 1081 | "node_modules/define-properties": { 1082 | "version": "1.2.1", 1083 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", 1084 | "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", 1085 | "dependencies": { 1086 | "define-data-property": "^1.0.1", 1087 | "has-property-descriptors": "^1.0.0", 1088 | "object-keys": "^1.1.1" 1089 | }, 1090 | "engines": { 1091 | "node": ">= 0.4" 1092 | }, 1093 | "funding": { 1094 | "url": "https://github.com/sponsors/ljharb" 1095 | } 1096 | }, 1097 | "node_modules/delay": { 1098 | "version": "5.0.0", 1099 | "resolved": "https://registry.npmjs.org/delay/-/delay-5.0.0.tgz", 1100 | "integrity": "sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw==", 1101 | "engines": { 1102 | "node": ">=10" 1103 | }, 1104 | "funding": { 1105 | "url": "https://github.com/sponsors/sindresorhus" 1106 | } 1107 | }, 1108 | "node_modules/delayed-stream": { 1109 | "version": "1.0.0", 1110 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 1111 | "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", 1112 | "engines": { 1113 | "node": ">=0.4.0" 1114 | } 1115 | }, 1116 | "node_modules/detect-node": { 1117 | "version": "2.1.0", 1118 | "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", 1119 | "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" 1120 | }, 1121 | "node_modules/diff": { 1122 | "version": "4.0.2", 1123 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 1124 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 1125 | "dev": true, 1126 | "engines": { 1127 | "node": ">=0.3.1" 1128 | } 1129 | }, 1130 | "node_modules/dot-case": { 1131 | "version": "3.0.4", 1132 | "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", 1133 | "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", 1134 | "dependencies": { 1135 | "no-case": "^3.0.4", 1136 | "tslib": "^2.0.3" 1137 | } 1138 | }, 1139 | "node_modules/dotenv": { 1140 | "version": "16.4.5", 1141 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", 1142 | "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", 1143 | "engines": { 1144 | "node": ">=12" 1145 | }, 1146 | "funding": { 1147 | "url": "https://dotenvx.com" 1148 | } 1149 | }, 1150 | "node_modules/emoji-regex": { 1151 | "version": "8.0.0", 1152 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", 1153 | "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" 1154 | }, 1155 | "node_modules/encodeurl": { 1156 | "version": "1.0.2", 1157 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 1158 | "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", 1159 | "engines": { 1160 | "node": ">= 0.8" 1161 | } 1162 | }, 1163 | "node_modules/end-of-stream": { 1164 | "version": "1.4.4", 1165 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 1166 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 1167 | "dependencies": { 1168 | "once": "^1.4.0" 1169 | } 1170 | }, 1171 | "node_modules/es-define-property": { 1172 | "version": "1.0.0", 1173 | "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", 1174 | "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", 1175 | "dependencies": { 1176 | "get-intrinsic": "^1.2.4" 1177 | }, 1178 | "engines": { 1179 | "node": ">= 0.4" 1180 | } 1181 | }, 1182 | "node_modules/es-errors": { 1183 | "version": "1.3.0", 1184 | "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", 1185 | "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", 1186 | "engines": { 1187 | "node": ">= 0.4" 1188 | } 1189 | }, 1190 | "node_modules/es6-error": { 1191 | "version": "4.1.1", 1192 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz", 1193 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==" 1194 | }, 1195 | "node_modules/es6-promise": { 1196 | "version": "4.2.8", 1197 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", 1198 | "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" 1199 | }, 1200 | "node_modules/es6-promisify": { 1201 | "version": "5.0.0", 1202 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 1203 | "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", 1204 | "dependencies": { 1205 | "es6-promise": "^4.0.3" 1206 | } 1207 | }, 1208 | "node_modules/escalade": { 1209 | "version": "3.1.2", 1210 | "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", 1211 | "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", 1212 | "engines": { 1213 | "node": ">=6" 1214 | } 1215 | }, 1216 | "node_modules/escape-string-regexp": { 1217 | "version": "4.0.0", 1218 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", 1219 | "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", 1220 | "engines": { 1221 | "node": ">=10" 1222 | }, 1223 | "funding": { 1224 | "url": "https://github.com/sponsors/sindresorhus" 1225 | } 1226 | }, 1227 | "node_modules/event-target-shim": { 1228 | "version": "5.0.1", 1229 | "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", 1230 | "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", 1231 | "engines": { 1232 | "node": ">=6" 1233 | } 1234 | }, 1235 | "node_modules/eventemitter3": { 1236 | "version": "4.0.7", 1237 | "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", 1238 | "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" 1239 | }, 1240 | "node_modules/events": { 1241 | "version": "3.3.0", 1242 | "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", 1243 | "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", 1244 | "engines": { 1245 | "node": ">=0.8.x" 1246 | } 1247 | }, 1248 | "node_modules/eyes": { 1249 | "version": "0.1.8", 1250 | "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz", 1251 | "integrity": "sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==", 1252 | "engines": { 1253 | "node": "> 0.1.90" 1254 | } 1255 | }, 1256 | "node_modules/fast-copy": { 1257 | "version": "3.0.2", 1258 | "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", 1259 | "integrity": "sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==" 1260 | }, 1261 | "node_modules/fast-redact": { 1262 | "version": "3.5.0", 1263 | "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.5.0.tgz", 1264 | "integrity": "sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==", 1265 | "engines": { 1266 | "node": ">=6" 1267 | } 1268 | }, 1269 | "node_modules/fast-safe-stringify": { 1270 | "version": "2.1.1", 1271 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", 1272 | "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" 1273 | }, 1274 | "node_modules/fast-stable-stringify": { 1275 | "version": "1.0.0", 1276 | "resolved": "https://registry.npmjs.org/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz", 1277 | "integrity": "sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag==" 1278 | }, 1279 | "node_modules/fastestsmallesttextencoderdecoder": { 1280 | "version": "1.0.22", 1281 | "resolved": "https://registry.npmjs.org/fastestsmallesttextencoderdecoder/-/fastestsmallesttextencoderdecoder-1.0.22.tgz", 1282 | "integrity": "sha512-Pb8d48e+oIuY4MaM64Cd7OW1gt4nxCHs7/ddPPZ/Ic3sg8yVGM7O9wDvZ7us6ScaUupzM+pfBolwtYhN1IxBIw==", 1283 | "peer": true 1284 | }, 1285 | "node_modules/fecha": { 1286 | "version": "4.2.3", 1287 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", 1288 | "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" 1289 | }, 1290 | "node_modules/file-uri-to-path": { 1291 | "version": "1.0.0", 1292 | "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", 1293 | "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" 1294 | }, 1295 | "node_modules/find": { 1296 | "version": "0.3.0", 1297 | "resolved": "https://registry.npmjs.org/find/-/find-0.3.0.tgz", 1298 | "integrity": "sha512-iSd+O4OEYV/I36Zl8MdYJO0xD82wH528SaCieTVHhclgiYNe9y+yPKSwK+A7/WsmHL1EZ+pYUJBXWTL5qofksw==", 1299 | "dependencies": { 1300 | "traverse-chain": "~0.1.0" 1301 | } 1302 | }, 1303 | "node_modules/follow-redirects": { 1304 | "version": "1.15.6", 1305 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", 1306 | "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", 1307 | "funding": [ 1308 | { 1309 | "type": "individual", 1310 | "url": "https://github.com/sponsors/RubenVerborgh" 1311 | } 1312 | ], 1313 | "engines": { 1314 | "node": ">=4.0" 1315 | }, 1316 | "peerDependenciesMeta": { 1317 | "debug": { 1318 | "optional": true 1319 | } 1320 | } 1321 | }, 1322 | "node_modules/form-data": { 1323 | "version": "4.0.0", 1324 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", 1325 | "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", 1326 | "dependencies": { 1327 | "asynckit": "^0.4.0", 1328 | "combined-stream": "^1.0.8", 1329 | "mime-types": "^2.1.12" 1330 | }, 1331 | "engines": { 1332 | "node": ">= 6" 1333 | } 1334 | }, 1335 | "node_modules/function-bind": { 1336 | "version": "1.1.2", 1337 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", 1338 | "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", 1339 | "funding": { 1340 | "url": "https://github.com/sponsors/ljharb" 1341 | } 1342 | }, 1343 | "node_modules/get-caller-file": { 1344 | "version": "2.0.5", 1345 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", 1346 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", 1347 | "engines": { 1348 | "node": "6.* || 8.* || >= 10.*" 1349 | } 1350 | }, 1351 | "node_modules/get-intrinsic": { 1352 | "version": "1.2.4", 1353 | "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", 1354 | "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", 1355 | "dependencies": { 1356 | "es-errors": "^1.3.0", 1357 | "function-bind": "^1.1.2", 1358 | "has-proto": "^1.0.1", 1359 | "has-symbols": "^1.0.3", 1360 | "hasown": "^2.0.0" 1361 | }, 1362 | "engines": { 1363 | "node": ">= 0.4" 1364 | }, 1365 | "funding": { 1366 | "url": "https://github.com/sponsors/ljharb" 1367 | } 1368 | }, 1369 | "node_modules/global-agent": { 1370 | "version": "3.0.0", 1371 | "resolved": "https://registry.npmjs.org/global-agent/-/global-agent-3.0.0.tgz", 1372 | "integrity": "sha512-PT6XReJ+D07JvGoxQMkT6qji/jVNfX/h364XHZOWeRzy64sSFr+xJ5OX7LI3b4MPQzdL4H8Y8M0xzPpsVMwA8Q==", 1373 | "dependencies": { 1374 | "boolean": "^3.0.1", 1375 | "es6-error": "^4.1.1", 1376 | "matcher": "^3.0.0", 1377 | "roarr": "^2.15.3", 1378 | "semver": "^7.3.2", 1379 | "serialize-error": "^7.0.1" 1380 | }, 1381 | "engines": { 1382 | "node": ">=10.0" 1383 | } 1384 | }, 1385 | "node_modules/global-tunnel-ng": { 1386 | "version": "2.7.1", 1387 | "resolved": "https://registry.npmjs.org/global-tunnel-ng/-/global-tunnel-ng-2.7.1.tgz", 1388 | "integrity": "sha512-4s+DyciWBV0eK148wqXxcmVAbFVPqtc3sEtUE/GTQfuU80rySLcMhUmHKSHI7/LDj8q0gDYI1lIhRRB7ieRAqg==", 1389 | "dependencies": { 1390 | "encodeurl": "^1.0.2", 1391 | "lodash": "^4.17.10", 1392 | "npm-conf": "^1.1.3", 1393 | "tunnel": "^0.0.6" 1394 | }, 1395 | "engines": { 1396 | "node": ">=0.10" 1397 | } 1398 | }, 1399 | "node_modules/globalthis": { 1400 | "version": "1.0.3", 1401 | "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", 1402 | "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", 1403 | "dependencies": { 1404 | "define-properties": "^1.1.3" 1405 | }, 1406 | "engines": { 1407 | "node": ">= 0.4" 1408 | }, 1409 | "funding": { 1410 | "url": "https://github.com/sponsors/ljharb" 1411 | } 1412 | }, 1413 | "node_modules/gopd": { 1414 | "version": "1.0.1", 1415 | "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", 1416 | "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", 1417 | "dependencies": { 1418 | "get-intrinsic": "^1.1.3" 1419 | }, 1420 | "funding": { 1421 | "url": "https://github.com/sponsors/ljharb" 1422 | } 1423 | }, 1424 | "node_modules/has-property-descriptors": { 1425 | "version": "1.0.2", 1426 | "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", 1427 | "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", 1428 | "dependencies": { 1429 | "es-define-property": "^1.0.0" 1430 | }, 1431 | "funding": { 1432 | "url": "https://github.com/sponsors/ljharb" 1433 | } 1434 | }, 1435 | "node_modules/has-proto": { 1436 | "version": "1.0.3", 1437 | "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", 1438 | "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", 1439 | "engines": { 1440 | "node": ">= 0.4" 1441 | }, 1442 | "funding": { 1443 | "url": "https://github.com/sponsors/ljharb" 1444 | } 1445 | }, 1446 | "node_modules/has-symbols": { 1447 | "version": "1.0.3", 1448 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", 1449 | "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", 1450 | "engines": { 1451 | "node": ">= 0.4" 1452 | }, 1453 | "funding": { 1454 | "url": "https://github.com/sponsors/ljharb" 1455 | } 1456 | }, 1457 | "node_modules/hasown": { 1458 | "version": "2.0.2", 1459 | "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", 1460 | "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", 1461 | "dependencies": { 1462 | "function-bind": "^1.1.2" 1463 | }, 1464 | "engines": { 1465 | "node": ">= 0.4" 1466 | } 1467 | }, 1468 | "node_modules/help-me": { 1469 | "version": "5.0.0", 1470 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-5.0.0.tgz", 1471 | "integrity": "sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==" 1472 | }, 1473 | "node_modules/http-proxy-agent": { 1474 | "version": "7.0.2", 1475 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", 1476 | "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", 1477 | "dependencies": { 1478 | "agent-base": "^7.1.0", 1479 | "debug": "^4.3.4" 1480 | }, 1481 | "engines": { 1482 | "node": ">= 14" 1483 | } 1484 | }, 1485 | "node_modules/https-proxy-agent": { 1486 | "version": "7.0.4", 1487 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", 1488 | "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", 1489 | "dependencies": { 1490 | "agent-base": "^7.0.2", 1491 | "debug": "4" 1492 | }, 1493 | "engines": { 1494 | "node": ">= 14" 1495 | } 1496 | }, 1497 | "node_modules/humanize-ms": { 1498 | "version": "1.2.1", 1499 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 1500 | "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", 1501 | "dependencies": { 1502 | "ms": "^2.0.0" 1503 | } 1504 | }, 1505 | "node_modules/ieee754": { 1506 | "version": "1.2.1", 1507 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1508 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 1509 | "funding": [ 1510 | { 1511 | "type": "github", 1512 | "url": "https://github.com/sponsors/feross" 1513 | }, 1514 | { 1515 | "type": "patreon", 1516 | "url": "https://www.patreon.com/feross" 1517 | }, 1518 | { 1519 | "type": "consulting", 1520 | "url": "https://feross.org/support" 1521 | } 1522 | ] 1523 | }, 1524 | "node_modules/ini": { 1525 | "version": "1.3.8", 1526 | "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", 1527 | "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" 1528 | }, 1529 | "node_modules/is-fullwidth-code-point": { 1530 | "version": "3.0.0", 1531 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", 1532 | "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", 1533 | "engines": { 1534 | "node": ">=8" 1535 | } 1536 | }, 1537 | "node_modules/isomorphic-ws": { 1538 | "version": "4.0.1", 1539 | "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", 1540 | "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", 1541 | "peerDependencies": { 1542 | "ws": "*" 1543 | } 1544 | }, 1545 | "node_modules/jayson": { 1546 | "version": "4.1.0", 1547 | "resolved": "https://registry.npmjs.org/jayson/-/jayson-4.1.0.tgz", 1548 | "integrity": "sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A==", 1549 | "dependencies": { 1550 | "@types/connect": "^3.4.33", 1551 | "@types/node": "^12.12.54", 1552 | "@types/ws": "^7.4.4", 1553 | "commander": "^2.20.3", 1554 | "delay": "^5.0.0", 1555 | "es6-promisify": "^5.0.0", 1556 | "eyes": "^0.1.8", 1557 | "isomorphic-ws": "^4.0.1", 1558 | "json-stringify-safe": "^5.0.1", 1559 | "JSONStream": "^1.3.5", 1560 | "uuid": "^8.3.2", 1561 | "ws": "^7.4.5" 1562 | }, 1563 | "bin": { 1564 | "jayson": "bin/jayson.js" 1565 | }, 1566 | "engines": { 1567 | "node": ">=8" 1568 | } 1569 | }, 1570 | "node_modules/jayson/node_modules/@types/node": { 1571 | "version": "12.20.55", 1572 | "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.55.tgz", 1573 | "integrity": "sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==" 1574 | }, 1575 | "node_modules/jayson/node_modules/commander": { 1576 | "version": "2.20.3", 1577 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 1578 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" 1579 | }, 1580 | "node_modules/jito-ts": { 1581 | "version": "4.1.1", 1582 | "resolved": "https://registry.npmjs.org/jito-ts/-/jito-ts-4.1.1.tgz", 1583 | "integrity": "sha512-5a/z7AvtitpExcyxYh1RhPoWRfCA4IPopE5hM5Cxw7/zHnV+VBNZL0m4t3fjfPgMnmPkeoTx2xTw+mSD4PDG7w==", 1584 | "dependencies": { 1585 | "@grpc/grpc-js": "^1.8.13", 1586 | "@noble/ed25519": "^1.7.1", 1587 | "@solana/web3.js": "~1.77.3", 1588 | "@types/bs58": "^4.0.4", 1589 | "agentkeepalive": "^4.3.0", 1590 | "bs58": "^6.0.0", 1591 | "dotenv": "^16.0.3", 1592 | "jayson": "^4.0.0", 1593 | "node-fetch": "^2.6.7", 1594 | "superstruct": "^1.0.3" 1595 | } 1596 | }, 1597 | "node_modules/jito-ts/node_modules/@solana/web3.js": { 1598 | "version": "1.77.4", 1599 | "resolved": "https://registry.npmjs.org/@solana/web3.js/-/web3.js-1.77.4.tgz", 1600 | "integrity": "sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q==", 1601 | "dependencies": { 1602 | "@babel/runtime": "^7.12.5", 1603 | "@noble/curves": "^1.0.0", 1604 | "@noble/hashes": "^1.3.0", 1605 | "@solana/buffer-layout": "^4.0.0", 1606 | "agentkeepalive": "^4.2.1", 1607 | "bigint-buffer": "^1.1.5", 1608 | "bn.js": "^5.0.0", 1609 | "borsh": "^0.7.0", 1610 | "bs58": "^4.0.1", 1611 | "buffer": "6.0.3", 1612 | "fast-stable-stringify": "^1.0.0", 1613 | "jayson": "^4.1.0", 1614 | "node-fetch": "^2.6.7", 1615 | "rpc-websockets": "^7.5.1", 1616 | "superstruct": "^0.14.2" 1617 | } 1618 | }, 1619 | "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/base-x": { 1620 | "version": "3.0.10", 1621 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-3.0.10.tgz", 1622 | "integrity": "sha512-7d0s06rR9rYaIWHkpfLIFICM/tkSVdoPC9qYAQRpxn9DdKNWNsKC0uk++akckyLq16Tx2WIinnZ6WRriAt6njQ==", 1623 | "dependencies": { 1624 | "safe-buffer": "^5.0.1" 1625 | } 1626 | }, 1627 | "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/bs58": { 1628 | "version": "4.0.1", 1629 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-4.0.1.tgz", 1630 | "integrity": "sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw==", 1631 | "dependencies": { 1632 | "base-x": "^3.0.2" 1633 | } 1634 | }, 1635 | "node_modules/jito-ts/node_modules/@solana/web3.js/node_modules/superstruct": { 1636 | "version": "0.14.2", 1637 | "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", 1638 | "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" 1639 | }, 1640 | "node_modules/jito-ts/node_modules/base-x": { 1641 | "version": "5.0.0", 1642 | "resolved": "https://registry.npmjs.org/base-x/-/base-x-5.0.0.tgz", 1643 | "integrity": "sha512-sMW3VGSX1QWVFA6l8U62MLKz29rRfpTlYdCqLdpLo1/Yd4zZwSbnUaDfciIAowAqvq7YFnWq9hrhdg1KYgc1lQ==" 1644 | }, 1645 | "node_modules/jito-ts/node_modules/bs58": { 1646 | "version": "6.0.0", 1647 | "resolved": "https://registry.npmjs.org/bs58/-/bs58-6.0.0.tgz", 1648 | "integrity": "sha512-PD0wEnEYg6ijszw/u8s+iI3H17cTymlrwkKhDhPZq+Sokl3AU4htyBFTjAeNAlCCmg0f53g6ih3jATyCKftTfw==", 1649 | "dependencies": { 1650 | "base-x": "^5.0.0" 1651 | } 1652 | }, 1653 | "node_modules/jito-ts/node_modules/superstruct": { 1654 | "version": "1.0.4", 1655 | "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-1.0.4.tgz", 1656 | "integrity": "sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ==", 1657 | "engines": { 1658 | "node": ">=14.0.0" 1659 | } 1660 | }, 1661 | "node_modules/joycon": { 1662 | "version": "3.1.1", 1663 | "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", 1664 | "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", 1665 | "engines": { 1666 | "node": ">=10" 1667 | } 1668 | }, 1669 | "node_modules/js-sha256": { 1670 | "version": "0.9.0", 1671 | "resolved": "https://registry.npmjs.org/js-sha256/-/js-sha256-0.9.0.tgz", 1672 | "integrity": "sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==" 1673 | }, 1674 | "node_modules/json-stringify-safe": { 1675 | "version": "5.0.1", 1676 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 1677 | "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" 1678 | }, 1679 | "node_modules/jsonparse": { 1680 | "version": "1.3.1", 1681 | "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", 1682 | "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", 1683 | "engines": [ 1684 | "node >= 0.2.0" 1685 | ] 1686 | }, 1687 | "node_modules/JSONStream": { 1688 | "version": "1.3.5", 1689 | "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", 1690 | "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", 1691 | "dependencies": { 1692 | "jsonparse": "^1.2.0", 1693 | "through": ">=2.2.7 <3" 1694 | }, 1695 | "bin": { 1696 | "JSONStream": "bin.js" 1697 | }, 1698 | "engines": { 1699 | "node": "*" 1700 | } 1701 | }, 1702 | "node_modules/lodash": { 1703 | "version": "4.17.21", 1704 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", 1705 | "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" 1706 | }, 1707 | "node_modules/lodash.camelcase": { 1708 | "version": "4.3.0", 1709 | "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", 1710 | "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" 1711 | }, 1712 | "node_modules/long": { 1713 | "version": "5.2.3", 1714 | "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", 1715 | "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" 1716 | }, 1717 | "node_modules/lower-case": { 1718 | "version": "2.0.2", 1719 | "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", 1720 | "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", 1721 | "dependencies": { 1722 | "tslib": "^2.0.3" 1723 | } 1724 | }, 1725 | "node_modules/lru-cache": { 1726 | "version": "6.0.0", 1727 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 1728 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 1729 | "dependencies": { 1730 | "yallist": "^4.0.0" 1731 | }, 1732 | "engines": { 1733 | "node": ">=10" 1734 | } 1735 | }, 1736 | "node_modules/make-error": { 1737 | "version": "1.3.6", 1738 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", 1739 | "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", 1740 | "dev": true 1741 | }, 1742 | "node_modules/matcher": { 1743 | "version": "3.0.0", 1744 | "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", 1745 | "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", 1746 | "dependencies": { 1747 | "escape-string-regexp": "^4.0.0" 1748 | }, 1749 | "engines": { 1750 | "node": ">=10" 1751 | } 1752 | }, 1753 | "node_modules/mime-db": { 1754 | "version": "1.52.0", 1755 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", 1756 | "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", 1757 | "engines": { 1758 | "node": ">= 0.6" 1759 | } 1760 | }, 1761 | "node_modules/mime-types": { 1762 | "version": "2.1.35", 1763 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", 1764 | "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", 1765 | "dependencies": { 1766 | "mime-db": "1.52.0" 1767 | }, 1768 | "engines": { 1769 | "node": ">= 0.6" 1770 | } 1771 | }, 1772 | "node_modules/minimist": { 1773 | "version": "1.2.8", 1774 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", 1775 | "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", 1776 | "funding": { 1777 | "url": "https://github.com/sponsors/ljharb" 1778 | } 1779 | }, 1780 | "node_modules/ms": { 1781 | "version": "2.1.3", 1782 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", 1783 | "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" 1784 | }, 1785 | "node_modules/no-case": { 1786 | "version": "3.0.4", 1787 | "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", 1788 | "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", 1789 | "dependencies": { 1790 | "lower-case": "^2.0.2", 1791 | "tslib": "^2.0.3" 1792 | } 1793 | }, 1794 | "node_modules/node-fetch": { 1795 | "version": "2.7.0", 1796 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", 1797 | "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", 1798 | "dependencies": { 1799 | "whatwg-url": "^5.0.0" 1800 | }, 1801 | "engines": { 1802 | "node": "4.x || >=6.0.0" 1803 | }, 1804 | "peerDependencies": { 1805 | "encoding": "^0.1.0" 1806 | }, 1807 | "peerDependenciesMeta": { 1808 | "encoding": { 1809 | "optional": true 1810 | } 1811 | } 1812 | }, 1813 | "node_modules/node-gyp-build": { 1814 | "version": "4.8.0", 1815 | "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.0.tgz", 1816 | "integrity": "sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==", 1817 | "optional": true, 1818 | "bin": { 1819 | "node-gyp-build": "bin.js", 1820 | "node-gyp-build-optional": "optional.js", 1821 | "node-gyp-build-test": "build-test.js" 1822 | } 1823 | }, 1824 | "node_modules/npm-conf": { 1825 | "version": "1.1.3", 1826 | "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", 1827 | "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", 1828 | "dependencies": { 1829 | "config-chain": "^1.1.11", 1830 | "pify": "^3.0.0" 1831 | }, 1832 | "engines": { 1833 | "node": ">=4" 1834 | } 1835 | }, 1836 | "node_modules/object-keys": { 1837 | "version": "1.1.1", 1838 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", 1839 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", 1840 | "engines": { 1841 | "node": ">= 0.4" 1842 | } 1843 | }, 1844 | "node_modules/on-exit-leak-free": { 1845 | "version": "2.1.2", 1846 | "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", 1847 | "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", 1848 | "engines": { 1849 | "node": ">=14.0.0" 1850 | } 1851 | }, 1852 | "node_modules/once": { 1853 | "version": "1.4.0", 1854 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1855 | "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", 1856 | "dependencies": { 1857 | "wrappy": "1" 1858 | } 1859 | }, 1860 | "node_modules/pako": { 1861 | "version": "2.1.0", 1862 | "resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz", 1863 | "integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==" 1864 | }, 1865 | "node_modules/pify": { 1866 | "version": "3.0.0", 1867 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 1868 | "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", 1869 | "engines": { 1870 | "node": ">=4" 1871 | } 1872 | }, 1873 | "node_modules/pino": { 1874 | "version": "8.19.0", 1875 | "resolved": "https://registry.npmjs.org/pino/-/pino-8.19.0.tgz", 1876 | "integrity": "sha512-oswmokxkav9bADfJ2ifrvfHUwad6MLp73Uat0IkQWY3iAw5xTRoznXbXksZs8oaOUMpmhVWD+PZogNzllWpJaA==", 1877 | "dependencies": { 1878 | "atomic-sleep": "^1.0.0", 1879 | "fast-redact": "^3.1.1", 1880 | "on-exit-leak-free": "^2.1.0", 1881 | "pino-abstract-transport": "v1.1.0", 1882 | "pino-std-serializers": "^6.0.0", 1883 | "process-warning": "^3.0.0", 1884 | "quick-format-unescaped": "^4.0.3", 1885 | "real-require": "^0.2.0", 1886 | "safe-stable-stringify": "^2.3.1", 1887 | "sonic-boom": "^3.7.0", 1888 | "thread-stream": "^2.0.0" 1889 | }, 1890 | "bin": { 1891 | "pino": "bin.js" 1892 | } 1893 | }, 1894 | "node_modules/pino-abstract-transport": { 1895 | "version": "1.1.0", 1896 | "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-1.1.0.tgz", 1897 | "integrity": "sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==", 1898 | "dependencies": { 1899 | "readable-stream": "^4.0.0", 1900 | "split2": "^4.0.0" 1901 | } 1902 | }, 1903 | "node_modules/pino-pretty": { 1904 | "version": "10.3.1", 1905 | "resolved": "https://registry.npmjs.org/pino-pretty/-/pino-pretty-10.3.1.tgz", 1906 | "integrity": "sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==", 1907 | "dependencies": { 1908 | "colorette": "^2.0.7", 1909 | "dateformat": "^4.6.3", 1910 | "fast-copy": "^3.0.0", 1911 | "fast-safe-stringify": "^2.1.1", 1912 | "help-me": "^5.0.0", 1913 | "joycon": "^3.1.1", 1914 | "minimist": "^1.2.6", 1915 | "on-exit-leak-free": "^2.1.0", 1916 | "pino-abstract-transport": "^1.0.0", 1917 | "pump": "^3.0.0", 1918 | "readable-stream": "^4.0.0", 1919 | "secure-json-parse": "^2.4.0", 1920 | "sonic-boom": "^3.0.0", 1921 | "strip-json-comments": "^3.1.1" 1922 | }, 1923 | "bin": { 1924 | "pino-pretty": "bin.js" 1925 | } 1926 | }, 1927 | "node_modules/pino-std-serializers": { 1928 | "version": "6.2.2", 1929 | "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", 1930 | "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" 1931 | }, 1932 | "node_modules/prettier": { 1933 | "version": "3.2.5", 1934 | "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", 1935 | "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", 1936 | "dev": true, 1937 | "bin": { 1938 | "prettier": "bin/prettier.cjs" 1939 | }, 1940 | "engines": { 1941 | "node": ">=14" 1942 | }, 1943 | "funding": { 1944 | "url": "https://github.com/prettier/prettier?sponsor=1" 1945 | } 1946 | }, 1947 | "node_modules/process": { 1948 | "version": "0.11.10", 1949 | "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", 1950 | "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", 1951 | "engines": { 1952 | "node": ">= 0.6.0" 1953 | } 1954 | }, 1955 | "node_modules/process-warning": { 1956 | "version": "3.0.0", 1957 | "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-3.0.0.tgz", 1958 | "integrity": "sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==" 1959 | }, 1960 | "node_modules/proto-list": { 1961 | "version": "1.2.4", 1962 | "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", 1963 | "integrity": "sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==" 1964 | }, 1965 | "node_modules/protobufjs": { 1966 | "version": "7.2.6", 1967 | "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-7.2.6.tgz", 1968 | "integrity": "sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw==", 1969 | "hasInstallScript": true, 1970 | "dependencies": { 1971 | "@protobufjs/aspromise": "^1.1.2", 1972 | "@protobufjs/base64": "^1.1.2", 1973 | "@protobufjs/codegen": "^2.0.4", 1974 | "@protobufjs/eventemitter": "^1.1.0", 1975 | "@protobufjs/fetch": "^1.1.0", 1976 | "@protobufjs/float": "^1.0.2", 1977 | "@protobufjs/inquire": "^1.1.0", 1978 | "@protobufjs/path": "^1.1.2", 1979 | "@protobufjs/pool": "^1.1.0", 1980 | "@protobufjs/utf8": "^1.1.0", 1981 | "@types/node": ">=13.7.0", 1982 | "long": "^5.0.0" 1983 | }, 1984 | "engines": { 1985 | "node": ">=12.0.0" 1986 | } 1987 | }, 1988 | "node_modules/proxy-from-env": { 1989 | "version": "1.1.0", 1990 | "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", 1991 | "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" 1992 | }, 1993 | "node_modules/pump": { 1994 | "version": "3.0.0", 1995 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1996 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1997 | "dependencies": { 1998 | "end-of-stream": "^1.1.0", 1999 | "once": "^1.3.1" 2000 | } 2001 | }, 2002 | "node_modules/quick-format-unescaped": { 2003 | "version": "4.0.4", 2004 | "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", 2005 | "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" 2006 | }, 2007 | "node_modules/readable-stream": { 2008 | "version": "4.5.2", 2009 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz", 2010 | "integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==", 2011 | "dependencies": { 2012 | "abort-controller": "^3.0.0", 2013 | "buffer": "^6.0.3", 2014 | "events": "^3.3.0", 2015 | "process": "^0.11.10", 2016 | "string_decoder": "^1.3.0" 2017 | }, 2018 | "engines": { 2019 | "node": "^12.22.0 || ^14.17.0 || >=16.0.0" 2020 | } 2021 | }, 2022 | "node_modules/real-require": { 2023 | "version": "0.2.0", 2024 | "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", 2025 | "integrity": "sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==", 2026 | "engines": { 2027 | "node": ">= 12.13.0" 2028 | } 2029 | }, 2030 | "node_modules/regenerator-runtime": { 2031 | "version": "0.14.1", 2032 | "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", 2033 | "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" 2034 | }, 2035 | "node_modules/require-directory": { 2036 | "version": "2.1.1", 2037 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 2038 | "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", 2039 | "engines": { 2040 | "node": ">=0.10.0" 2041 | } 2042 | }, 2043 | "node_modules/roarr": { 2044 | "version": "2.15.4", 2045 | "resolved": "https://registry.npmjs.org/roarr/-/roarr-2.15.4.tgz", 2046 | "integrity": "sha512-CHhPh+UNHD2GTXNYhPWLnU8ONHdI+5DI+4EYIAOaiD63rHeYlZvyh8P+in5999TTSFgUYuKUAjzRI4mdh/p+2A==", 2047 | "dependencies": { 2048 | "boolean": "^3.0.1", 2049 | "detect-node": "^2.0.4", 2050 | "globalthis": "^1.0.1", 2051 | "json-stringify-safe": "^5.0.1", 2052 | "semver-compare": "^1.0.0", 2053 | "sprintf-js": "^1.1.2" 2054 | }, 2055 | "engines": { 2056 | "node": ">=8.0" 2057 | } 2058 | }, 2059 | "node_modules/rpc-websockets": { 2060 | "version": "7.9.0", 2061 | "resolved": "https://registry.npmjs.org/rpc-websockets/-/rpc-websockets-7.9.0.tgz", 2062 | "integrity": "sha512-DwKewQz1IUA5wfLvgM8wDpPRcr+nWSxuFxx5CbrI2z/MyyZ4nXLM86TvIA+cI1ZAdqC8JIBR1mZR55dzaLU+Hw==", 2063 | "dependencies": { 2064 | "@babel/runtime": "^7.17.2", 2065 | "eventemitter3": "^4.0.7", 2066 | "uuid": "^8.3.2", 2067 | "ws": "^8.5.0" 2068 | }, 2069 | "funding": { 2070 | "type": "paypal", 2071 | "url": "https://paypal.me/kozjak" 2072 | }, 2073 | "optionalDependencies": { 2074 | "bufferutil": "^4.0.1", 2075 | "utf-8-validate": "^5.0.2" 2076 | } 2077 | }, 2078 | "node_modules/rpc-websockets/node_modules/ws": { 2079 | "version": "8.16.0", 2080 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", 2081 | "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", 2082 | "engines": { 2083 | "node": ">=10.0.0" 2084 | }, 2085 | "peerDependencies": { 2086 | "bufferutil": "^4.0.1", 2087 | "utf-8-validate": ">=5.0.2" 2088 | }, 2089 | "peerDependenciesMeta": { 2090 | "bufferutil": { 2091 | "optional": true 2092 | }, 2093 | "utf-8-validate": { 2094 | "optional": true 2095 | } 2096 | } 2097 | }, 2098 | "node_modules/safe-buffer": { 2099 | "version": "5.2.1", 2100 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 2101 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 2102 | "funding": [ 2103 | { 2104 | "type": "github", 2105 | "url": "https://github.com/sponsors/feross" 2106 | }, 2107 | { 2108 | "type": "patreon", 2109 | "url": "https://www.patreon.com/feross" 2110 | }, 2111 | { 2112 | "type": "consulting", 2113 | "url": "https://feross.org/support" 2114 | } 2115 | ] 2116 | }, 2117 | "node_modules/safe-stable-stringify": { 2118 | "version": "2.4.3", 2119 | "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", 2120 | "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", 2121 | "engines": { 2122 | "node": ">=10" 2123 | } 2124 | }, 2125 | "node_modules/secure-json-parse": { 2126 | "version": "2.7.0", 2127 | "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", 2128 | "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==" 2129 | }, 2130 | "node_modules/semver": { 2131 | "version": "7.6.0", 2132 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", 2133 | "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", 2134 | "dependencies": { 2135 | "lru-cache": "^6.0.0" 2136 | }, 2137 | "bin": { 2138 | "semver": "bin/semver.js" 2139 | }, 2140 | "engines": { 2141 | "node": ">=10" 2142 | } 2143 | }, 2144 | "node_modules/semver-compare": { 2145 | "version": "1.0.0", 2146 | "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", 2147 | "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==" 2148 | }, 2149 | "node_modules/serialize-error": { 2150 | "version": "7.0.1", 2151 | "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", 2152 | "integrity": "sha512-8I8TjW5KMOKsZQTvoxjuSIa7foAwPWGOts+6o7sgjz41/qMD9VQHEDxi6PBvK2l0MXUmqZyNpUK+T2tQaaElvw==", 2153 | "dependencies": { 2154 | "type-fest": "^0.13.1" 2155 | }, 2156 | "engines": { 2157 | "node": ">=10" 2158 | }, 2159 | "funding": { 2160 | "url": "https://github.com/sponsors/sindresorhus" 2161 | } 2162 | }, 2163 | "node_modules/snake-case": { 2164 | "version": "3.0.4", 2165 | "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", 2166 | "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", 2167 | "dependencies": { 2168 | "dot-case": "^3.0.4", 2169 | "tslib": "^2.0.3" 2170 | } 2171 | }, 2172 | "node_modules/sonic-boom": { 2173 | "version": "3.8.0", 2174 | "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.8.0.tgz", 2175 | "integrity": "sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==", 2176 | "dependencies": { 2177 | "atomic-sleep": "^1.0.0" 2178 | } 2179 | }, 2180 | "node_modules/split2": { 2181 | "version": "4.2.0", 2182 | "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", 2183 | "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", 2184 | "engines": { 2185 | "node": ">= 10.x" 2186 | } 2187 | }, 2188 | "node_modules/sprintf-js": { 2189 | "version": "1.1.3", 2190 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", 2191 | "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==" 2192 | }, 2193 | "node_modules/string_decoder": { 2194 | "version": "1.3.0", 2195 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 2196 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 2197 | "dependencies": { 2198 | "safe-buffer": "~5.2.0" 2199 | } 2200 | }, 2201 | "node_modules/string-width": { 2202 | "version": "4.2.3", 2203 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", 2204 | "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", 2205 | "dependencies": { 2206 | "emoji-regex": "^8.0.0", 2207 | "is-fullwidth-code-point": "^3.0.0", 2208 | "strip-ansi": "^6.0.1" 2209 | }, 2210 | "engines": { 2211 | "node": ">=8" 2212 | } 2213 | }, 2214 | "node_modules/strip-ansi": { 2215 | "version": "6.0.1", 2216 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", 2217 | "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", 2218 | "dependencies": { 2219 | "ansi-regex": "^5.0.1" 2220 | }, 2221 | "engines": { 2222 | "node": ">=8" 2223 | } 2224 | }, 2225 | "node_modules/strip-json-comments": { 2226 | "version": "3.1.1", 2227 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", 2228 | "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", 2229 | "engines": { 2230 | "node": ">=8" 2231 | }, 2232 | "funding": { 2233 | "url": "https://github.com/sponsors/sindresorhus" 2234 | } 2235 | }, 2236 | "node_modules/superstruct": { 2237 | "version": "0.14.2", 2238 | "resolved": "https://registry.npmjs.org/superstruct/-/superstruct-0.14.2.tgz", 2239 | "integrity": "sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ==" 2240 | }, 2241 | "node_modules/text-encoding-utf-8": { 2242 | "version": "1.0.2", 2243 | "resolved": "https://registry.npmjs.org/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz", 2244 | "integrity": "sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg==" 2245 | }, 2246 | "node_modules/thread-stream": { 2247 | "version": "2.4.1", 2248 | "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", 2249 | "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", 2250 | "dependencies": { 2251 | "real-require": "^0.2.0" 2252 | } 2253 | }, 2254 | "node_modules/through": { 2255 | "version": "2.3.8", 2256 | "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", 2257 | "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" 2258 | }, 2259 | "node_modules/toformat": { 2260 | "version": "2.0.0", 2261 | "resolved": "https://registry.npmjs.org/toformat/-/toformat-2.0.0.tgz", 2262 | "integrity": "sha512-03SWBVop6nU8bpyZCx7SodpYznbZF5R4ljwNLBcTQzKOD9xuihRo/psX58llS1BMFhhAI08H3luot5GoXJz2pQ==" 2263 | }, 2264 | "node_modules/toml": { 2265 | "version": "3.0.0", 2266 | "resolved": "https://registry.npmjs.org/toml/-/toml-3.0.0.tgz", 2267 | "integrity": "sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==" 2268 | }, 2269 | "node_modules/tr46": { 2270 | "version": "0.0.3", 2271 | "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", 2272 | "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" 2273 | }, 2274 | "node_modules/traverse-chain": { 2275 | "version": "0.1.0", 2276 | "resolved": "https://registry.npmjs.org/traverse-chain/-/traverse-chain-0.1.0.tgz", 2277 | "integrity": "sha512-up6Yvai4PYKhpNp5PkYtx50m3KbwQrqDwbuZP/ItyL64YEWHAvH6Md83LFLV/GRSk/BoUVwwgUzX6SOQSbsfAg==" 2278 | }, 2279 | "node_modules/ts-node": { 2280 | "version": "10.9.2", 2281 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", 2282 | "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", 2283 | "dev": true, 2284 | "dependencies": { 2285 | "@cspotcode/source-map-support": "^0.8.0", 2286 | "@tsconfig/node10": "^1.0.7", 2287 | "@tsconfig/node12": "^1.0.7", 2288 | "@tsconfig/node14": "^1.0.0", 2289 | "@tsconfig/node16": "^1.0.2", 2290 | "acorn": "^8.4.1", 2291 | "acorn-walk": "^8.1.1", 2292 | "arg": "^4.1.0", 2293 | "create-require": "^1.1.0", 2294 | "diff": "^4.0.1", 2295 | "make-error": "^1.1.1", 2296 | "v8-compile-cache-lib": "^3.0.1", 2297 | "yn": "3.1.1" 2298 | }, 2299 | "bin": { 2300 | "ts-node": "dist/bin.js", 2301 | "ts-node-cwd": "dist/bin-cwd.js", 2302 | "ts-node-esm": "dist/bin-esm.js", 2303 | "ts-node-script": "dist/bin-script.js", 2304 | "ts-node-transpile-only": "dist/bin-transpile.js", 2305 | "ts-script": "dist/bin-script-deprecated.js" 2306 | }, 2307 | "peerDependencies": { 2308 | "@swc/core": ">=1.2.50", 2309 | "@swc/wasm": ">=1.2.50", 2310 | "@types/node": "*", 2311 | "typescript": ">=2.7" 2312 | }, 2313 | "peerDependenciesMeta": { 2314 | "@swc/core": { 2315 | "optional": true 2316 | }, 2317 | "@swc/wasm": { 2318 | "optional": true 2319 | } 2320 | } 2321 | }, 2322 | "node_modules/tslib": { 2323 | "version": "2.6.2", 2324 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", 2325 | "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" 2326 | }, 2327 | "node_modules/tunnel": { 2328 | "version": "0.0.6", 2329 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 2330 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==", 2331 | "engines": { 2332 | "node": ">=0.6.11 <=0.7.0 || >=0.7.3" 2333 | } 2334 | }, 2335 | "node_modules/type-fest": { 2336 | "version": "0.13.1", 2337 | "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.13.1.tgz", 2338 | "integrity": "sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==", 2339 | "engines": { 2340 | "node": ">=10" 2341 | }, 2342 | "funding": { 2343 | "url": "https://github.com/sponsors/sindresorhus" 2344 | } 2345 | }, 2346 | "node_modules/typescript": { 2347 | "version": "5.4.3", 2348 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.3.tgz", 2349 | "integrity": "sha512-KrPd3PKaCLr78MalgiwJnA25Nm8HAmdwN3mYUYZgG/wizIo9EainNVQI9/yDavtVFRN2h3k8uf3GLHuhDMgEHg==", 2350 | "dev": true, 2351 | "bin": { 2352 | "tsc": "bin/tsc", 2353 | "tsserver": "bin/tsserver" 2354 | }, 2355 | "engines": { 2356 | "node": ">=14.17" 2357 | } 2358 | }, 2359 | "node_modules/undici-types": { 2360 | "version": "5.26.5", 2361 | "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", 2362 | "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" 2363 | }, 2364 | "node_modules/utf-8-validate": { 2365 | "version": "5.0.10", 2366 | "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz", 2367 | "integrity": "sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==", 2368 | "hasInstallScript": true, 2369 | "optional": true, 2370 | "dependencies": { 2371 | "node-gyp-build": "^4.3.0" 2372 | }, 2373 | "engines": { 2374 | "node": ">=6.14.2" 2375 | } 2376 | }, 2377 | "node_modules/uuid": { 2378 | "version": "8.3.2", 2379 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 2380 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", 2381 | "bin": { 2382 | "uuid": "dist/bin/uuid" 2383 | } 2384 | }, 2385 | "node_modules/v8-compile-cache-lib": { 2386 | "version": "3.0.1", 2387 | "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", 2388 | "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", 2389 | "dev": true 2390 | }, 2391 | "node_modules/webidl-conversions": { 2392 | "version": "3.0.1", 2393 | "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", 2394 | "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" 2395 | }, 2396 | "node_modules/whatwg-url": { 2397 | "version": "5.0.0", 2398 | "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", 2399 | "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", 2400 | "dependencies": { 2401 | "tr46": "~0.0.3", 2402 | "webidl-conversions": "^3.0.0" 2403 | } 2404 | }, 2405 | "node_modules/wrap-ansi": { 2406 | "version": "7.0.0", 2407 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", 2408 | "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", 2409 | "dependencies": { 2410 | "ansi-styles": "^4.0.0", 2411 | "string-width": "^4.1.0", 2412 | "strip-ansi": "^6.0.0" 2413 | }, 2414 | "engines": { 2415 | "node": ">=10" 2416 | }, 2417 | "funding": { 2418 | "url": "https://github.com/chalk/wrap-ansi?sponsor=1" 2419 | } 2420 | }, 2421 | "node_modules/wrappy": { 2422 | "version": "1.0.2", 2423 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2424 | "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" 2425 | }, 2426 | "node_modules/ws": { 2427 | "version": "7.5.9", 2428 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", 2429 | "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", 2430 | "engines": { 2431 | "node": ">=8.3.0" 2432 | }, 2433 | "peerDependencies": { 2434 | "bufferutil": "^4.0.1", 2435 | "utf-8-validate": "^5.0.2" 2436 | }, 2437 | "peerDependenciesMeta": { 2438 | "bufferutil": { 2439 | "optional": true 2440 | }, 2441 | "utf-8-validate": { 2442 | "optional": true 2443 | } 2444 | } 2445 | }, 2446 | "node_modules/y18n": { 2447 | "version": "5.0.8", 2448 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", 2449 | "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", 2450 | "engines": { 2451 | "node": ">=10" 2452 | } 2453 | }, 2454 | "node_modules/yallist": { 2455 | "version": "4.0.0", 2456 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 2457 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 2458 | }, 2459 | "node_modules/yargs": { 2460 | "version": "17.7.2", 2461 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", 2462 | "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", 2463 | "dependencies": { 2464 | "cliui": "^8.0.1", 2465 | "escalade": "^3.1.1", 2466 | "get-caller-file": "^2.0.5", 2467 | "require-directory": "^2.1.1", 2468 | "string-width": "^4.2.3", 2469 | "y18n": "^5.0.5", 2470 | "yargs-parser": "^21.1.1" 2471 | }, 2472 | "engines": { 2473 | "node": ">=12" 2474 | } 2475 | }, 2476 | "node_modules/yargs-parser": { 2477 | "version": "21.1.1", 2478 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", 2479 | "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", 2480 | "engines": { 2481 | "node": ">=12" 2482 | } 2483 | }, 2484 | "node_modules/yn": { 2485 | "version": "3.1.1", 2486 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", 2487 | "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", 2488 | "dev": true, 2489 | "engines": { 2490 | "node": ">=6" 2491 | } 2492 | } 2493 | } 2494 | } 2495 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "test.ts", 3 | "version": "1.0.0", 4 | "main": "test.ts", 5 | "scripts": { 6 | "build": "tsc", 7 | "start": "node dist/test.js" 8 | }, 9 | "dependencies": { 10 | "@project-serum/serum": "^0.13.65", 11 | "@raydium-io/raydium-sdk": "^1.3.1-beta.47", 12 | "@solana/spl-token": "^0.4.0", 13 | "@solana/web3.js": "^1.89.1", 14 | "@triton-one/yellowstone-grpc": "^0.4.0", 15 | "bigint-buffer": "^1.1.5", 16 | "bn.js": "^5.2.1", 17 | "bs58": "^5.0.0", 18 | "dotenv": "^16.4.1", 19 | "global-agent": "^3.0.0", 20 | "global-tunnel-ng": "^2.7.1", 21 | "http-proxy-agent": "^7.0.2", 22 | "https-proxy-agent": "^7.0.4", 23 | "jito-ts": "latest", 24 | "pino": "^8.18.0", 25 | "pino-pretty": "^10.3.1", 26 | "pino-std-serializers": "^6.2.2" 27 | }, 28 | "devDependencies": { 29 | "@types/bn.js": "^5.1.5", 30 | "@types/global-tunnel-ng": "^2.1.4", 31 | "prettier": "^3.2.4", 32 | "ts-node": "^10.9.2", 33 | "typescript": "^5.3.3" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /streaming/openbook.ts: -------------------------------------------------------------------------------- 1 | import { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc"; 2 | import pino from "pino"; 3 | const transport = pino.transport({ 4 | target: 'pino-pretty', 5 | }); 6 | 7 | export const logger = pino( 8 | { 9 | level: 'info', 10 | serializers: { 11 | error: pino.stdSerializers.err, 12 | }, 13 | base: undefined, 14 | }, 15 | transport, 16 | ); 17 | 18 | 19 | import Client from "@triton-one/yellowstone-grpc"; 20 | import { MARKET_STATE_LAYOUT_V3 } from "@raydium-io/raydium-sdk"; 21 | import { PublicKey } from "@solana/web3.js"; 22 | import { BufferRingBuffer } from "../buffer/buffer"; 23 | 24 | const client = new Client("https://grpc.solanavibestation.com", undefined, undefined); 25 | 26 | //Initialize Ring Buffer 27 | 28 | // This portion of the code streams the Openbook data which is needed to make a buy request. 29 | // The data is stored in a buffer ring and then queried if the raydium stream gets a liquidity event. 30 | // We stream and store this data because a lot of the time the data we need from here is streamed before the raydium stream gets the liquidity event. 31 | // This way we can store the data and then query it when we need it instead of making a slow web request to get the data. 32 | // Many times it will not contain the data we need in which case the buy will be aborted. A trade-off for speed. 33 | 34 | // I know somebody can probably improve this a lot. I'm not a pro at this stuff. I'm just a guy who likes to code. 35 | 36 | export const bufferRing = new BufferRingBuffer(5000); 37 | 38 | export async function streamOpenbook() { 39 | const stream = await client.subscribe(); 40 | // Collecting all incoming events. 41 | stream.on("data", (data) => { 42 | if (data.account != undefined) { 43 | bufferRing.enqueue(data.account.account.data); 44 | } 45 | }); 46 | 47 | const openBookRequest: SubscribeRequest = { 48 | "slots": {}, 49 | "accounts": { 50 | "raydium": { 51 | "account": [], 52 | "filters": [ 53 | { 54 | "memcmp": { 55 | "offset": MARKET_STATE_LAYOUT_V3.offsetOf('quoteMint').toString(), 56 | "base58": "So11111111111111111111111111111111111111112" 57 | } 58 | } 59 | ], 60 | "owner": ["srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX"] //Openbook program ID 61 | } 62 | }, 63 | "transactions": {}, 64 | "blocks": {}, 65 | "blocksMeta": {}, 66 | "accountsDataSlice": [], 67 | "commitment": CommitmentLevel.PROCESSED, 68 | entry: {} 69 | } 70 | // Sending a subscription request. 71 | await new Promise((resolve, reject) => { 72 | stream.write(openBookRequest, (err: null | undefined) => { 73 | if (err === null || err === undefined) { 74 | resolve(); 75 | } else { 76 | reject(err); 77 | } 78 | }); 79 | }).catch((reason) => { 80 | console.error(reason); 81 | throw reason; 82 | }); 83 | } -------------------------------------------------------------------------------- /streaming/raydium.ts: -------------------------------------------------------------------------------- 1 | import { CommitmentLevel, SubscribeRequest } from "@triton-one/yellowstone-grpc"; 2 | import pino from "pino"; 3 | const transport = pino.transport({ 4 | target: 'pino-pretty', 5 | }); 6 | 7 | export const logger = pino( 8 | { 9 | level: 'info', 10 | serializers: { 11 | error: pino.stdSerializers.err, 12 | }, 13 | base: undefined, 14 | }, 15 | transport, 16 | ); 17 | 18 | 19 | import Client from "@triton-one/yellowstone-grpc"; 20 | import { LIQUIDITY_STATE_LAYOUT_V4, MARKET_STATE_LAYOUT_V3 } from "@raydium-io/raydium-sdk"; 21 | import { PublicKey } from "@solana/web3.js"; 22 | import { bufferRing } from "./openbook"; 23 | import { buy } from "../transaction/transaction"; 24 | 25 | // uncomment this line to enable Jito leader schedule check and delete the return line. 26 | function slotExists(slot: number): boolean { 27 | //return leaderSchedule.has(slot); 28 | return true 29 | } 30 | 31 | const client = new Client("https://grpc.solanavibestation.com", undefined, undefined); //grpc endpoint from Solana Vibe Station obviously 32 | 33 | (async () => { 34 | const version = await client.getVersion(); // gets the version information 35 | console.log(version); 36 | })(); 37 | 38 | let latestBlockHash: string = ""; 39 | 40 | export async function streamNewTokens() { 41 | const stream = await client.subscribe(); 42 | // Collecting all incoming events. 43 | stream.on("data", (data) => { 44 | if (data.blockMeta) { 45 | latestBlockHash = data.blockMeta.blockhash; 46 | } 47 | 48 | if (data.account != undefined) { 49 | logger.info(`New token alert!`); 50 | 51 | 52 | const poolstate = LIQUIDITY_STATE_LAYOUT_V4.decode(data.account.account.data); 53 | const tokenAccount = new PublicKey(data.account.account.pubkey); 54 | logger.info(`Token Account: ${tokenAccount}`); 55 | 56 | let attempts = 0; 57 | const maxAttempts = 2; 58 | 59 | const intervalId = setInterval(async () => { 60 | const marketDetails = bufferRing.findPattern(poolstate.baseMint); 61 | if (Buffer.isBuffer(marketDetails)) { 62 | const fullMarketDetailsDecoded = MARKET_STATE_LAYOUT_V3.decode(marketDetails); 63 | const marketDetailsDecoded = { 64 | bids: fullMarketDetailsDecoded.bids, 65 | asks: fullMarketDetailsDecoded.asks, 66 | eventQueue: fullMarketDetailsDecoded.eventQueue, 67 | }; 68 | buy(latestBlockHash, tokenAccount, poolstate, marketDetailsDecoded); 69 | clearInterval(intervalId); // Stop retrying when a match is found 70 | } else if (attempts >= maxAttempts) { 71 | logger.error("Invalid market details"); 72 | clearInterval(intervalId); // Stop retrying after maxAttempts 73 | } 74 | attempts++; 75 | }, 10); // Retry every 10ms 76 | } 77 | }); 78 | 79 | // Create a subscription request. 80 | const request: SubscribeRequest = { 81 | "slots": {}, 82 | "accounts": { 83 | "raydium": { 84 | "account": [], 85 | "filters": [ 86 | { 87 | "memcmp": { 88 | "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('quoteMint').toString(), // Filter for only tokens paired with SOL 89 | "base58": "So11111111111111111111111111111111111111112" 90 | } 91 | }, 92 | { 93 | "memcmp": { 94 | "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('marketProgramId').toString(), // Filter for only Raydium markets that contain references to Serum 95 | "base58": "srmqPvymJeFKQ4zGQed1GFppgkRHL9kaELCbyksJtPX" 96 | } 97 | }, 98 | { 99 | "memcmp": { 100 | "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('swapQuoteInAmount').toString(), // Hack to filter for only new tokens. There is probably a better way to do this 101 | "bytes": Uint8Array.from([0]) 102 | } 103 | }, 104 | { 105 | "memcmp": { 106 | "offset": LIQUIDITY_STATE_LAYOUT_V4.offsetOf('swapBaseOutAmount').toString(), // Hack to filter for only new tokens. There is probably a better way to do this 107 | "bytes": Uint8Array.from([0]) 108 | } 109 | } 110 | ], 111 | "owner": ["675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8"] // raydium program id to subscribe to 112 | } 113 | }, 114 | "transactions": {}, 115 | "blocks": {}, 116 | "blocksMeta": { 117 | "block": [] 118 | }, 119 | "accountsDataSlice": [], 120 | "commitment": CommitmentLevel.PROCESSED, // Subscribe to processed blocks for the fastest updates 121 | entry: {} 122 | } 123 | 124 | // Sending a subscription request. 125 | await new Promise((resolve, reject) => { 126 | stream.write(request, (err: null | undefined) => { 127 | if (err === null || err === undefined) { 128 | resolve(); 129 | } else { 130 | reject(err); 131 | } 132 | }); 133 | }).catch((reason) => { 134 | console.error(reason); 135 | throw reason; 136 | }); 137 | } 138 | -------------------------------------------------------------------------------- /test.ts: -------------------------------------------------------------------------------- 1 | import { streamNewTokens } from './streaming/raydium'; 2 | import { streamOpenbook } from './streaming/openbook'; 3 | 4 | require('dotenv').config(); 5 | 6 | import { init } from './transaction/transaction'; 7 | 8 | 9 | 10 | 11 | async function start() { 12 | 13 | await init(); 14 | 15 | streamNewTokens(); 16 | streamOpenbook(); 17 | 18 | } 19 | 20 | start(); 21 | -------------------------------------------------------------------------------- /transaction/transaction.ts: -------------------------------------------------------------------------------- 1 | import { Liquidity, LiquidityPoolKeysV4, LiquidityStateV4, Token, TokenAmount, Percent } from '@raydium-io/raydium-sdk'; 2 | import { ComputeBudgetProgram, Connection, Keypair, LAMPORTS_PER_SOL, PublicKey, SystemProgram, Transaction, TransactionMessage, VersionedTransaction } from '@solana/web3.js'; 3 | import { createAssociatedTokenAccountIdempotentInstruction, createCloseAccountInstruction, createSyncNativeInstruction, getAccount, getAssociatedTokenAddressSync, MintLayout, TOKEN_PROGRAM_ID } from '@solana/spl-token'; 4 | import bs58 from 'bs58'; 5 | import { logger } from '../utils/logger'; 6 | import { COMMITMENT_LEVEL, LOG_LEVEL, PRIVATE_KEY, QUOTE_AMOUNT, QUOTE_MINT, RPC_ENDPOINT, RPC_WEBSOCKET_ENDPOINT } from "../constants"; 7 | import { createPoolKeys, getTokenAccounts } from "../liquidity"; 8 | import { MinimalMarketLayoutV3 } from '../market'; 9 | 10 | let wallet: Keypair; 11 | let quoteToken: Token; 12 | let quoteTokenAssociatedAddress: PublicKey; 13 | let quoteAmount: TokenAmount; 14 | 15 | wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); 16 | quoteAmount = new TokenAmount(Token.WSOL, QUOTE_AMOUNT, false); 17 | 18 | export interface MinimalTokenAccountData { 19 | mint: PublicKey; 20 | address: PublicKey; 21 | poolKeys?: LiquidityPoolKeysV4; 22 | market?: LiquidityStateV4; 23 | }; 24 | 25 | const existingTokenAccounts: Map = new Map(); 26 | 27 | const solanaConnection = new Connection(RPC_ENDPOINT, { 28 | wsEndpoint: RPC_WEBSOCKET_ENDPOINT, 29 | }); 30 | 31 | // Constants 32 | const AMOUNT_TO_WSOL = parseFloat(process.env.AMOUNT_TO_WSOL || '0.005'); 33 | const AUTO_SELL = process.env.AUTO_SELL === 'true'; 34 | const SELL_TIMER = parseInt(process.env.SELL_TIMER || '10000', 10); 35 | const MAX_RETRY = parseInt(process.env.MAX_RETRY || '10', 10); 36 | const SLIPPAGE = parseFloat(process.env.SLIPPAGE || '0.005'); 37 | 38 | // Init Function 39 | export async function init(): Promise { 40 | logger.level = LOG_LEVEL; 41 | 42 | // Get wallet 43 | wallet = Keypair.fromSecretKey(bs58.decode(PRIVATE_KEY)); 44 | logger.info(`Wallet Address: ${wallet.publicKey}`); 45 | 46 | // Handle quote token based on QUOTE_MINT (WSOL or USDC) 47 | switch (QUOTE_MINT) { 48 | case 'WSOL': { 49 | quoteToken = Token.WSOL; 50 | quoteAmount = new TokenAmount(Token.WSOL, QUOTE_AMOUNT, false); 51 | logger.info('Quote token is WSOL'); 52 | break; 53 | } 54 | case 'USDC': { 55 | quoteToken = new Token( 56 | TOKEN_PROGRAM_ID, 57 | new PublicKey('EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v'), 58 | 6, 59 | 'USDC', 60 | 'USDC', 61 | ); 62 | quoteAmount = new TokenAmount(quoteToken, QUOTE_AMOUNT, false); 63 | logger.info('Quote token is USDC'); 64 | break; 65 | } 66 | default: { 67 | throw new Error(`Unsupported quote mint "${QUOTE_MINT}". Supported values are USDC and WSOL`); 68 | } 69 | } 70 | 71 | logger.info( 72 | `Script will buy all new tokens using ${QUOTE_MINT}. Amount that will be used to buy each token is: ${quoteAmount.toFixed().toString()}` 73 | ); 74 | 75 | // Display AUTO_SELL & SELL_TIMER 76 | logger.info(`AUTO_SELL: ${AUTO_SELL}`); 77 | logger.info(`SELL_TIMER: ${SELL_TIMER}`); 78 | logger.info(`SLIPPAGE: ${SLIPPAGE}`); 79 | logger.info(`AMOUNT_TO_WSOL: ${AMOUNT_TO_WSOL}`); 80 | logger.info(`MAX_RETRY: ${MAX_RETRY}`); 81 | logger.info(`FREEZE_AUTHORITY: ${process.env.FREEZE_AUTHORITY}`); 82 | 83 | // Check existing wallet for associated token account of quote mint 84 | const tokenAccounts = await getTokenAccounts(solanaConnection, wallet.publicKey, COMMITMENT_LEVEL); 85 | logger.info('Fetched token accounts from wallet.'); 86 | 87 | // Create WSOL ATA and fund it with SOL during initialization 88 | if (QUOTE_MINT === 'WSOL') { 89 | const wsolAta = getAssociatedTokenAddressSync(Token.WSOL.mint, wallet.publicKey); 90 | logger.info(`WSOL ATA: ${wsolAta.toString()}`); 91 | 92 | // Check if WSOL account exists in wallet 93 | const solAccount = tokenAccounts.find( 94 | (acc) => acc.accountInfo.mint.toString() === Token.WSOL.mint.toString() 95 | ); 96 | 97 | if (!solAccount) { 98 | logger.info(`No WSOL token account found. Creating and funding with ` + `${AMOUNT_TO_WSOL} SOL...`); 99 | 100 | // Create WSOL (wrapped SOL) account and fund it with SOL 101 | await createAndFundWSOL(wsolAta); 102 | } else { 103 | logger.info('WSOL account already exists in the wallet.'); 104 | 105 | // Fetch the WSOL account balance 106 | const wsolAccountInfo = await getAccount(solanaConnection, wsolAta); 107 | const wsolBalance = Number(wsolAccountInfo.amount) / LAMPORTS_PER_SOL; 108 | logger.info(`Current WSOL balance: ${wsolBalance} WSOL`); 109 | 110 | // If WSOL balance is less than AMOUNT_TO_WSOL, top up the WSOL account 111 | if (wsolBalance < AMOUNT_TO_WSOL) { 112 | logger.info(`Insufficient WSOL balance. Funding with additional ` + `${AMOUNT_TO_WSOL} + SOL...`); 113 | await createAndFundWSOL(wsolAta); 114 | } 115 | } 116 | 117 | // Set the quote token associated address 118 | quoteTokenAssociatedAddress = wsolAta; 119 | } else { 120 | const tokenAccount = tokenAccounts.find( 121 | (acc) => acc.accountInfo.mint.toString() === quoteToken.mint.toString() 122 | ); 123 | 124 | if (!tokenAccount) { 125 | throw new Error(`No ${quoteToken.symbol} token account found in wallet: ${wallet.publicKey}`); 126 | } 127 | 128 | quoteTokenAssociatedAddress = tokenAccount.pubkey; 129 | } 130 | } 131 | 132 | // Helper function to create and fund WSOL account 133 | async function createAndFundWSOL(wsolAta: PublicKey): Promise { 134 | // Create WSOL (wrapped SOL) account and fund it 135 | const instructions = [ 136 | createAssociatedTokenAccountIdempotentInstruction( 137 | wallet.publicKey, 138 | wsolAta, 139 | wallet.publicKey, 140 | Token.WSOL.mint 141 | ), 142 | SystemProgram.transfer({ 143 | fromPubkey: wallet.publicKey, 144 | toPubkey: wsolAta, 145 | lamports: AMOUNT_TO_WSOL * LAMPORTS_PER_SOL, 146 | }), 147 | createSyncNativeInstruction(wsolAta), // Sync native to wrap SOL into WSOL 148 | ]; 149 | 150 | // Prepare message and versioned transaction 151 | const latestBlockhash = await solanaConnection.getLatestBlockhash(); 152 | logger.info('Fetched latest blockhash for transaction.'); 153 | 154 | const message = new TransactionMessage({ 155 | payerKey: wallet.publicKey, 156 | recentBlockhash: latestBlockhash.blockhash, 157 | instructions: instructions, 158 | }).compileToV0Message(); 159 | 160 | const versionedTransaction = new VersionedTransaction(message); 161 | 162 | // Sign the transaction 163 | versionedTransaction.sign([wallet]); 164 | 165 | // Send the serialized transaction using sendRawTransaction 166 | const signature = await solanaConnection.sendRawTransaction(versionedTransaction.serialize(), { 167 | skipPreflight: false, 168 | preflightCommitment: COMMITMENT_LEVEL, 169 | }); 170 | 171 | // Confirm transaction with the new `TransactionConfirmationStrategy` 172 | const confirmationStrategy = { 173 | signature, 174 | blockhash: latestBlockhash.blockhash, 175 | lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, 176 | }; 177 | 178 | await solanaConnection.confirmTransaction(confirmationStrategy, COMMITMENT_LEVEL); 179 | logger.info(`Created and funded WSOL account with ` + AMOUNT_TO_WSOL + ` SOL. Transaction signature: ${signature}`); 180 | } 181 | 182 | 183 | // Helper function to check if freeze authority exists 184 | async function checkFreezeAuthority(mintAddress: PublicKey): Promise { 185 | const mintAccountInfo = await solanaConnection.getAccountInfo(mintAddress); 186 | if (mintAccountInfo && mintAccountInfo.data) { 187 | const mintData = MintLayout.decode(mintAccountInfo.data); 188 | return mintData.freezeAuthorityOption !== 0; 189 | } 190 | return false; 191 | } 192 | 193 | // Buy Function with Conditional Freeze Authority Check 194 | export async function buy( 195 | latestBlockhash: string, 196 | newTokenAccount: PublicKey, 197 | poolState: LiquidityStateV4, 198 | minimalMarketLayoutV3: MinimalMarketLayoutV3 199 | ): Promise { 200 | try { 201 | const mintAddress = poolState.baseMint; 202 | const shouldCheckFreezeAuthority = process.env.FREEZE_AUTHORITY === 'true'; 203 | 204 | if (shouldCheckFreezeAuthority) { 205 | const freezeAuthorityExists = await checkFreezeAuthority(mintAddress); 206 | // Skip buying if freeze authority exists 207 | if (freezeAuthorityExists) { 208 | logger.info(`Freeze authority exists for token mint: ${mintAddress.toString()} Skipping buy.`); 209 | return; 210 | } 211 | 212 | logger.info(`No freeze authority for token mint: ${mintAddress.toString()} Proceeding to buy.`); 213 | } else { 214 | logger.info(`FREEZE_AUTHORITY is disabled. Skipping freeze authority check and proceeding to buy.`); 215 | } 216 | 217 | const ata = getAssociatedTokenAddressSync(mintAddress, wallet.publicKey); 218 | const poolKeys = createPoolKeys(newTokenAccount, poolState, minimalMarketLayoutV3); 219 | 220 | const { innerTransaction } = Liquidity.makeSwapFixedInInstruction( 221 | { 222 | poolKeys: poolKeys, 223 | userKeys: { 224 | tokenAccountIn: quoteTokenAssociatedAddress, 225 | tokenAccountOut: ata, 226 | owner: wallet.publicKey, 227 | }, 228 | amountIn: quoteAmount.raw, 229 | minAmountOut: 0, 230 | }, 231 | poolKeys.version, 232 | ); 233 | 234 | const messageV0 = new TransactionMessage({ 235 | payerKey: wallet.publicKey, 236 | recentBlockhash: latestBlockhash, 237 | instructions: [ 238 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 100000 }), 239 | ComputeBudgetProgram.setComputeUnitLimit({ units: 60000 }), 240 | createAssociatedTokenAccountIdempotentInstruction( 241 | wallet.publicKey, 242 | ata, 243 | wallet.publicKey, 244 | mintAddress, 245 | ), 246 | ...innerTransaction.instructions, 247 | ], 248 | }).compileToV0Message(); 249 | 250 | const transaction = new VersionedTransaction(messageV0); 251 | transaction.sign([wallet, ...innerTransaction.signers]); 252 | 253 | const signature = await solanaConnection.sendRawTransaction(transaction.serialize(), { 254 | skipPreflight: true, 255 | }); 256 | 257 | logger.info(`Buy transaction completed with signature - ${signature}`); 258 | 259 | // Auto-sell logic 260 | if (AUTO_SELL) { 261 | logger.info(`AUTO_SELL is enabled, triggering sell in ${SELL_TIMER} milliseconds...`); 262 | setTimeout(async () => { 263 | await sell(wallet.publicKey, { mint: mintAddress, address: ata }, poolState, poolKeys); 264 | }, SELL_TIMER); 265 | } 266 | 267 | } catch (error) { 268 | logger.error(error); 269 | } 270 | } 271 | 272 | export const sell = async ( 273 | accountId: PublicKey, 274 | rawAccount: MinimalTokenAccountData, 275 | poolState: LiquidityStateV4, 276 | poolKeys: LiquidityPoolKeysV4 277 | ): Promise => { 278 | logger.info(`Sell function triggered for account: ${accountId.toString()}`); 279 | 280 | try { 281 | logger.info({ mint: rawAccount.mint }, `Processing sell for token...`); 282 | 283 | // Get the associated token account for the mint 284 | let ata: PublicKey; 285 | let tokenAccountInfo: any; 286 | const maxRetries = MAX_RETRY; 287 | const delayBetweenRetries = 2000; // 2 seconds delay between retries 288 | 289 | ata = getAssociatedTokenAddressSync(rawAccount.mint, wallet.publicKey); 290 | 291 | for (let attempt = 0; attempt < maxRetries; attempt++) { 292 | try { 293 | tokenAccountInfo = await getAccount(solanaConnection, ata); 294 | break; // Break the loop if fetching the account was successful 295 | } catch (error) { 296 | if (error instanceof Error && error.name === 'TokenAccountNotFoundError') { 297 | logger.info(`Attempt ${attempt + 1}/${maxRetries}: Associated token account not found, retrying...`); 298 | if (attempt === maxRetries - 1) { 299 | logger.error(`Max retries reached. Failed to fetch the token account.`); 300 | throw error; 301 | } 302 | // Wait before retrying 303 | await new Promise((resolve) => setTimeout(resolve, delayBetweenRetries)); 304 | } else if (error instanceof Error) { 305 | logger.error(`Unexpected error while fetching token account: ${error.message}`); 306 | throw error; 307 | } else { 308 | logger.error(`An unknown error occurred: ${String(error)}`); 309 | throw error; 310 | } 311 | } 312 | } 313 | 314 | // If tokenAccountInfo is still undefined after retries, create the associated token account 315 | if (!tokenAccountInfo) { 316 | logger.info(`Creating associated token account for mint: ${rawAccount.mint.toString()}...`); 317 | const transaction = new TransactionMessage({ 318 | payerKey: wallet.publicKey, 319 | recentBlockhash: (await solanaConnection.getLatestBlockhash()).blockhash, 320 | instructions: [ 321 | createAssociatedTokenAccountIdempotentInstruction( 322 | wallet.publicKey, 323 | ata, 324 | wallet.publicKey, 325 | rawAccount.mint, 326 | ), 327 | ], 328 | }).compileToV0Message(); 329 | 330 | const createAtaTx = new VersionedTransaction(transaction); 331 | createAtaTx.sign([wallet]); 332 | 333 | const signature = await solanaConnection.sendRawTransaction(createAtaTx.serialize()); 334 | await solanaConnection.confirmTransaction(signature); 335 | logger.info(`Created associated token account with signature: ${signature}`); 336 | 337 | // Fetch the newly created token account 338 | tokenAccountInfo = await getAccount(solanaConnection, ata); 339 | } 340 | 341 | // Fetch the token balance after ensuring the account exists 342 | const tokenBalance = tokenAccountInfo.amount.toString(); 343 | logger.info(`Token balance for ${rawAccount.mint.toString()} is: ${tokenBalance}`); 344 | 345 | if (tokenBalance === '0') { 346 | logger.info({ mint: rawAccount.mint.toString() }, `Empty balance, can't sell`); 347 | return; 348 | } 349 | 350 | const tokenIn = new Token(TOKEN_PROGRAM_ID, rawAccount.mint, poolState.baseDecimal.toNumber()); 351 | const tokenAmountIn = new TokenAmount(tokenIn, tokenBalance, true); // Use the entire balance 352 | 353 | // Fetch pool info 354 | const poolInfo = await Liquidity.fetchInfo({ 355 | connection: solanaConnection, 356 | poolKeys, 357 | }); 358 | 359 | if (poolInfo) { 360 | logger.info(`Pool status: ${poolInfo.status.toString()}`); 361 | logger.info(`Base decimals: ${poolInfo.baseDecimals}`); 362 | logger.info(`Quote decimals: ${poolInfo.quoteDecimals}`); 363 | logger.info(`Base reserve: ${poolInfo.baseReserve.toString()}`); 364 | logger.info(`Quote reserve: ${poolInfo.quoteReserve.toString()}`); 365 | logger.info(`LP supply: ${poolInfo.lpSupply.toString()}`); 366 | logger.info(`Trading Open time: ${poolInfo.startTime.toString()}`); 367 | } else { 368 | logger.error('Failed to fetch pool info.'); 369 | } 370 | 371 | // Use poolKeys 372 | await swap( 373 | poolKeys, 374 | ata, // Use the associated token account (ata) for the swap 375 | quoteTokenAssociatedAddress, 376 | tokenIn, 377 | quoteToken, 378 | tokenAmountIn, 379 | wallet, 380 | 'sell' 381 | ); 382 | } catch (error) { 383 | logger.error({ mint: rawAccount.mint.toString(), error }, `Failed to sell token`); 384 | } 385 | }; 386 | 387 | 388 | // Swap Function 389 | async function swap( 390 | poolKeys: LiquidityPoolKeysV4, 391 | ataIn: PublicKey, // Token you're selling 392 | ataOut: PublicKey, // Token you're receiving (quoteToken) 393 | tokenIn: Token, 394 | tokenOut: Token, 395 | amountIn: TokenAmount, 396 | wallet: Keypair, 397 | direction: 'buy' | 'sell', 398 | ) { 399 | // Convert slippage into a percentage (500 means 0.5%) 400 | const slippagePercent = new Percent(Math.round(SLIPPAGE * 10000), 10000); 401 | 402 | // Fetch pool info 403 | const poolInfo = await Liquidity.fetchInfo({ 404 | connection: solanaConnection, 405 | poolKeys, 406 | }); 407 | 408 | // Compute the minimum amount out (taking slippage into account) 409 | const computedAmountOut = Liquidity.computeAmountOut({ 410 | poolKeys, 411 | poolInfo, 412 | amountIn, 413 | currencyOut: tokenOut, 414 | slippage: slippagePercent, 415 | }); 416 | 417 | const latestBlockhash = await solanaConnection.getLatestBlockhash(); 418 | const { innerTransaction } = Liquidity.makeSwapFixedInInstruction( 419 | { 420 | poolKeys: poolKeys, 421 | userKeys: { 422 | tokenAccountIn: ataIn, 423 | tokenAccountOut: ataOut, 424 | owner: wallet.publicKey, 425 | }, 426 | amountIn: amountIn.raw, 427 | minAmountOut: computedAmountOut.minAmountOut.raw, 428 | }, 429 | poolKeys.version, 430 | ); 431 | 432 | const messageV0 = new TransactionMessage({ 433 | payerKey: wallet.publicKey, 434 | recentBlockhash: latestBlockhash.blockhash, 435 | instructions: [ 436 | ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 100000 }), 437 | ComputeBudgetProgram.setComputeUnitLimit({ units: 50000 }), 438 | ...innerTransaction.instructions, 439 | ...(direction === 'sell' ? [createCloseAccountInstruction(ataIn, wallet.publicKey, wallet.publicKey)] : []), // Close account if selling 440 | ], 441 | }).compileToV0Message(); 442 | 443 | // Sign and execute the transaction 444 | const transaction = new VersionedTransaction(messageV0); 445 | transaction.sign([wallet, ...innerTransaction.signers]); 446 | 447 | const signature = await solanaConnection.sendRawTransaction(transaction.serialize(), { 448 | skipPreflight: true, 449 | }); 450 | 451 | logger.info(`Transaction ${direction} with signature - ${signature}`); 452 | } 453 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es2017", /* Set the JavaScript language version for emitted JavaScript */ 4 | "module": "commonjs", /* Use commonjs, suitable for Node.js */ 5 | "outDir": "./dist", /* Output compiled files to the dist folder */ 6 | "removeComments": true, /* Remove comments for a cleaner production build */ 7 | "strict": true, /* Enable strict type-checking options */ 8 | "esModuleInterop": true, /* Support for CommonJS imports */ 9 | "forceConsistentCasingInFileNames": true, /* Ensure consistent casing in file names */ 10 | "skipLibCheck": true /* Skip type checking of library files */ 11 | }, 12 | "include": ["**/*.ts"], /* Include all TypeScript files in the root and subfolders */ 13 | "exclude": ["node_modules", "dist"] /* Exclude dependencies and compiled output */ 14 | } 15 | -------------------------------------------------------------------------------- /utils/index.ts: -------------------------------------------------------------------------------- 1 | export * from './utils'; 2 | export * from './logger'; -------------------------------------------------------------------------------- /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 | -------------------------------------------------------------------------------- /utils/utils.ts: -------------------------------------------------------------------------------- 1 | import { Logger } from 'pino'; 2 | import dotenv from 'dotenv'; 3 | 4 | dotenv.config(); 5 | 6 | export const retrieveEnvVariable = (variableName: string, logger: Logger) => { 7 | const variable = process.env[variableName] || ''; 8 | if (!variable) { 9 | logger.error(`${variableName} is not set`); 10 | process.exit(1); 11 | } 12 | return variable; 13 | }; 14 | --------------------------------------------------------------------------------