├── .env.example ├── .gitignore ├── README.md ├── constants ├── idl.json └── index.ts ├── data ├── 5h89hprN8az1RoUan3zrP4PqbWppQnzptMtWQrK2oLXf.json ├── 8mvaBraqTNcy39Fb12mGe8CGSh6ywwTzNKBcMv1KjyY4.json ├── 8pJ8Qm2cn6kEbziwdbXki27rdb1qeQM6SzzindAVfMDE.json ├── 9dYkm8oN2PRcDSFvADMNxyCzq1H8PXd3Qdju4n6hAx4k.json ├── DrxwokrrtNHJB49hZ3vhzUHTmuyEgmapBKtrMTxVGvPp.json ├── GPYMHXuLU7czUyKNscqkQG2Dn96Y2uSqEnKCNiVAfAYj.json └── poolData.json ├── package.json ├── scripts ├── indexPump.ts └── main.ts ├── tsconfig.json ├── types └── index.ts ├── utils └── index.ts └── yarn.lock /.env.example: -------------------------------------------------------------------------------- 1 | 2 | #required configuration variables 3 | 4 | #base58 private key to pay for swaps (can be exported from phantom) 5 | SIGNER_PRIVATE_KEY="" 6 | 7 | #you rpc endpoint url https://dev.helius.xyz/dashboard/app (should preferrably have more than 50 rps) 8 | RPC_URL="" 9 | 10 | #bas58 private key to authenticate with the searcher client (https://web.miniextensions.com/WV3gZjFwqNqITsMufIEp ) 11 | JITO_AUTH_PRIVATE_KEY="" 12 | 13 | #choose a block engine closest to where this script is running (https://jito-labs.gitbook.io/mev/searcher-resources/block-engine/mainnet-addresses) 14 | BLOCK_ENGINE_URL="amsterdam.mainnet.block-engine.jito.wtf" 15 | 16 | #jito tip in SOL 17 | JITO_TIP="0.0001" 18 | 19 | #bundle submission requests max retries (if invalid or not set it defaults to 5) 20 | MAX_RETRIES="5" -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env 3 | package-lock.json 4 | scripts/test.ts -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### pump.fun simple bonding-curve sniper. 2 | 3 | ## Getting Started 4 | 5 | ### Prerequisites 6 | 7 | - Node.js and npm or yarn installed on your machine. 8 | - A solana wallet/Base58 private key. 9 | - RPC Endpoint url . 10 | - JITO access. 11 | 12 | ### Installation 13 | 14 | 1. Clone the repository to your local machine: 15 | ```git clone https://github.com/iSyqozz/pump.fun-sniper.git``` 16 | 2. Navigate to the project directory 17 | 3. Install dependencies: 18 | ```npm install``` or ```yarn install``` 19 | 20 | ### Configuration 21 | 22 | 1. Rename `.env.example` file to `.env` in the root directory. 23 | 2. Populate the `.env` file with the required information. 24 | 25 | ### Usage 26 | 27 | 1. Run the script: 28 | ```npm run start``` 29 | 2. Enter Wallet Address to track, amount and maximum amount in SOL. 30 | 3. Enter Priority fees (0 for default high priority fees). 31 | 32 | ### Contribution 33 | 34 | Contributions are welcome! If you want to contribute to this project, feel free to fork the repository and submit a pull request. 35 | 36 | If you encounter any issues or have suggestions for improvements, please open an issue on GitHub. 37 | 38 | 39 | ### Next Steps 40 | 41 | 1. Geyser integration 42 | 2. seperate commands and better command line workflow 43 | 44 | 45 | ## Tip address 46 | 3Q9xRmnzMBv9jcKYA3pB2gQmK4RtuzUvjCRfJbw6PYWV <333 -------------------------------------------------------------------------------- /constants/idl.json: -------------------------------------------------------------------------------- 1 | { 2 | "version": "0.1.0", 3 | "name": "pump", 4 | "instructions": [ 5 | { 6 | "name": "initialize", 7 | "docs": [ 8 | "Creates the global state." 9 | ], 10 | "accounts": [ 11 | { 12 | "name": "global", 13 | "isMut": true, 14 | "isSigner": false 15 | }, 16 | { 17 | "name": "user", 18 | "isMut": true, 19 | "isSigner": true 20 | }, 21 | { 22 | "name": "systemProgram", 23 | "isMut": false, 24 | "isSigner": false 25 | } 26 | ], 27 | "args": [] 28 | }, 29 | { 30 | "name": "setParams", 31 | "docs": [ 32 | "Sets the global state parameters." 33 | ], 34 | "accounts": [ 35 | { 36 | "name": "global", 37 | "isMut": true, 38 | "isSigner": false 39 | }, 40 | { 41 | "name": "user", 42 | "isMut": true, 43 | "isSigner": true 44 | }, 45 | { 46 | "name": "systemProgram", 47 | "isMut": false, 48 | "isSigner": false 49 | }, 50 | { 51 | "name": "eventAuthority", 52 | "isMut": false, 53 | "isSigner": false 54 | }, 55 | { 56 | "name": "program", 57 | "isMut": false, 58 | "isSigner": false 59 | } 60 | ], 61 | "args": [ 62 | { 63 | "name": "feeRecipient", 64 | "type": "publicKey" 65 | }, 66 | { 67 | "name": "initialVirtualTokenReserves", 68 | "type": "u64" 69 | }, 70 | { 71 | "name": "initialVirtualSolReserves", 72 | "type": "u64" 73 | }, 74 | { 75 | "name": "initialRealTokenReserves", 76 | "type": "u64" 77 | }, 78 | { 79 | "name": "tokenTotalSupply", 80 | "type": "u64" 81 | }, 82 | { 83 | "name": "feeBasisPoints", 84 | "type": "u64" 85 | } 86 | ] 87 | }, 88 | { 89 | "name": "create", 90 | "docs": [ 91 | "Creates a new coin and bonding curve." 92 | ], 93 | "accounts": [ 94 | { 95 | "name": "mint", 96 | "isMut": true, 97 | "isSigner": true 98 | }, 99 | { 100 | "name": "mintAuthority", 101 | "isMut": false, 102 | "isSigner": false 103 | }, 104 | { 105 | "name": "bondingCurve", 106 | "isMut": true, 107 | "isSigner": false 108 | }, 109 | { 110 | "name": "associatedBondingCurve", 111 | "isMut": true, 112 | "isSigner": false 113 | }, 114 | { 115 | "name": "global", 116 | "isMut": false, 117 | "isSigner": false 118 | }, 119 | { 120 | "name": "mplTokenMetadata", 121 | "isMut": false, 122 | "isSigner": false 123 | }, 124 | { 125 | "name": "metadata", 126 | "isMut": true, 127 | "isSigner": false 128 | }, 129 | { 130 | "name": "user", 131 | "isMut": true, 132 | "isSigner": true 133 | }, 134 | { 135 | "name": "systemProgram", 136 | "isMut": false, 137 | "isSigner": false 138 | }, 139 | { 140 | "name": "tokenProgram", 141 | "isMut": false, 142 | "isSigner": false 143 | }, 144 | { 145 | "name": "associatedTokenProgram", 146 | "isMut": false, 147 | "isSigner": false 148 | }, 149 | { 150 | "name": "rent", 151 | "isMut": false, 152 | "isSigner": false 153 | }, 154 | { 155 | "name": "eventAuthority", 156 | "isMut": false, 157 | "isSigner": false 158 | }, 159 | { 160 | "name": "program", 161 | "isMut": false, 162 | "isSigner": false 163 | } 164 | ], 165 | "args": [ 166 | { 167 | "name": "name", 168 | "type": "string" 169 | }, 170 | { 171 | "name": "symbol", 172 | "type": "string" 173 | }, 174 | { 175 | "name": "uri", 176 | "type": "string" 177 | } 178 | ] 179 | }, 180 | { 181 | "name": "buy", 182 | "docs": [ 183 | "Buys tokens from a bonding curve." 184 | ], 185 | "accounts": [ 186 | { 187 | "name": "global", 188 | "isMut": false, 189 | "isSigner": false 190 | }, 191 | { 192 | "name": "feeRecipient", 193 | "isMut": true, 194 | "isSigner": false 195 | }, 196 | { 197 | "name": "mint", 198 | "isMut": false, 199 | "isSigner": false 200 | }, 201 | { 202 | "name": "bondingCurve", 203 | "isMut": true, 204 | "isSigner": false 205 | }, 206 | { 207 | "name": "associatedBondingCurve", 208 | "isMut": true, 209 | "isSigner": false 210 | }, 211 | { 212 | "name": "associatedUser", 213 | "isMut": true, 214 | "isSigner": false 215 | }, 216 | { 217 | "name": "user", 218 | "isMut": true, 219 | "isSigner": true 220 | }, 221 | { 222 | "name": "systemProgram", 223 | "isMut": false, 224 | "isSigner": false 225 | }, 226 | { 227 | "name": "tokenProgram", 228 | "isMut": false, 229 | "isSigner": false 230 | }, 231 | { 232 | "name": "rent", 233 | "isMut": false, 234 | "isSigner": false 235 | }, 236 | { 237 | "name": "eventAuthority", 238 | "isMut": false, 239 | "isSigner": false 240 | }, 241 | { 242 | "name": "program", 243 | "isMut": false, 244 | "isSigner": false 245 | } 246 | ], 247 | "args": [ 248 | { 249 | "name": "amount", 250 | "type": "u64" 251 | }, 252 | { 253 | "name": "maxSolCost", 254 | "type": "u64" 255 | } 256 | ] 257 | }, 258 | { 259 | "name": "sell", 260 | "docs": [ 261 | "Sells tokens into a bonding curve." 262 | ], 263 | "accounts": [ 264 | { 265 | "name": "global", 266 | "isMut": false, 267 | "isSigner": false 268 | }, 269 | { 270 | "name": "feeRecipient", 271 | "isMut": true, 272 | "isSigner": false 273 | }, 274 | { 275 | "name": "mint", 276 | "isMut": false, 277 | "isSigner": false 278 | }, 279 | { 280 | "name": "bondingCurve", 281 | "isMut": true, 282 | "isSigner": false 283 | }, 284 | { 285 | "name": "associatedBondingCurve", 286 | "isMut": true, 287 | "isSigner": false 288 | }, 289 | { 290 | "name": "associatedUser", 291 | "isMut": true, 292 | "isSigner": false 293 | }, 294 | { 295 | "name": "user", 296 | "isMut": true, 297 | "isSigner": true 298 | }, 299 | { 300 | "name": "systemProgram", 301 | "isMut": false, 302 | "isSigner": false 303 | }, 304 | { 305 | "name": "associatedTokenProgram", 306 | "isMut": false, 307 | "isSigner": false 308 | }, 309 | { 310 | "name": "tokenProgram", 311 | "isMut": false, 312 | "isSigner": false 313 | }, 314 | { 315 | "name": "eventAuthority", 316 | "isMut": false, 317 | "isSigner": false 318 | }, 319 | { 320 | "name": "program", 321 | "isMut": false, 322 | "isSigner": false 323 | } 324 | ], 325 | "args": [ 326 | { 327 | "name": "amount", 328 | "type": "u64" 329 | }, 330 | { 331 | "name": "minSolOutput", 332 | "type": "u64" 333 | } 334 | ] 335 | }, 336 | { 337 | "name": "withdraw", 338 | "docs": [ 339 | "Allows the admin to withdraw liquidity for a migration once the bonding curve completes" 340 | ], 341 | "accounts": [ 342 | { 343 | "name": "global", 344 | "isMut": false, 345 | "isSigner": false 346 | }, 347 | { 348 | "name": "mint", 349 | "isMut": false, 350 | "isSigner": false 351 | }, 352 | { 353 | "name": "bondingCurve", 354 | "isMut": true, 355 | "isSigner": false 356 | }, 357 | { 358 | "name": "associatedBondingCurve", 359 | "isMut": true, 360 | "isSigner": false 361 | }, 362 | { 363 | "name": "associatedUser", 364 | "isMut": true, 365 | "isSigner": false 366 | }, 367 | { 368 | "name": "user", 369 | "isMut": true, 370 | "isSigner": true 371 | }, 372 | { 373 | "name": "systemProgram", 374 | "isMut": false, 375 | "isSigner": false 376 | }, 377 | { 378 | "name": "tokenProgram", 379 | "isMut": false, 380 | "isSigner": false 381 | }, 382 | { 383 | "name": "rent", 384 | "isMut": false, 385 | "isSigner": false 386 | }, 387 | { 388 | "name": "eventAuthority", 389 | "isMut": false, 390 | "isSigner": false 391 | }, 392 | { 393 | "name": "program", 394 | "isMut": false, 395 | "isSigner": false 396 | } 397 | ], 398 | "args": [] 399 | } 400 | ], 401 | "accounts": [ 402 | { 403 | "name": "Global", 404 | "type": { 405 | "kind": "struct", 406 | "fields": [ 407 | { 408 | "name": "initialized", 409 | "type": "bool" 410 | }, 411 | { 412 | "name": "authority", 413 | "type": "publicKey" 414 | }, 415 | { 416 | "name": "feeRecipient", 417 | "type": "publicKey" 418 | }, 419 | { 420 | "name": "initialVirtualTokenReserves", 421 | "type": "u64" 422 | }, 423 | { 424 | "name": "initialVirtualSolReserves", 425 | "type": "u64" 426 | }, 427 | { 428 | "name": "initialRealTokenReserves", 429 | "type": "u64" 430 | }, 431 | { 432 | "name": "tokenTotalSupply", 433 | "type": "u64" 434 | }, 435 | { 436 | "name": "feeBasisPoints", 437 | "type": "u64" 438 | } 439 | ] 440 | } 441 | }, 442 | { 443 | "name": "BondingCurve", 444 | "type": { 445 | "kind": "struct", 446 | "fields": [ 447 | { 448 | "name": "virtualTokenReserves", 449 | "type": "u64" 450 | }, 451 | { 452 | "name": "virtualSolReserves", 453 | "type": "u64" 454 | }, 455 | { 456 | "name": "realTokenReserves", 457 | "type": "u64" 458 | }, 459 | { 460 | "name": "realSolReserves", 461 | "type": "u64" 462 | }, 463 | { 464 | "name": "tokenTotalSupply", 465 | "type": "u64" 466 | }, 467 | { 468 | "name": "complete", 469 | "type": "bool" 470 | } 471 | ] 472 | } 473 | } 474 | ], 475 | "events": [ 476 | { 477 | "name": "CreateEvent", 478 | "fields": [ 479 | { 480 | "name": "name", 481 | "type": "string", 482 | "index": false 483 | }, 484 | { 485 | "name": "symbol", 486 | "type": "string", 487 | "index": false 488 | }, 489 | { 490 | "name": "uri", 491 | "type": "string", 492 | "index": false 493 | }, 494 | { 495 | "name": "mint", 496 | "type": "publicKey", 497 | "index": false 498 | }, 499 | { 500 | "name": "bondingCurve", 501 | "type": "publicKey", 502 | "index": false 503 | }, 504 | { 505 | "name": "user", 506 | "type": "publicKey", 507 | "index": false 508 | } 509 | ] 510 | }, 511 | { 512 | "name": "TradeEvent", 513 | "fields": [ 514 | { 515 | "name": "mint", 516 | "type": "publicKey", 517 | "index": false 518 | }, 519 | { 520 | "name": "solAmount", 521 | "type": "u64", 522 | "index": false 523 | }, 524 | { 525 | "name": "tokenAmount", 526 | "type": "u64", 527 | "index": false 528 | }, 529 | { 530 | "name": "isBuy", 531 | "type": "bool", 532 | "index": false 533 | }, 534 | { 535 | "name": "user", 536 | "type": "publicKey", 537 | "index": false 538 | }, 539 | { 540 | "name": "timestamp", 541 | "type": "i64", 542 | "index": false 543 | }, 544 | { 545 | "name": "virtualSolReserves", 546 | "type": "u64", 547 | "index": false 548 | }, 549 | { 550 | "name": "virtualTokenReserves", 551 | "type": "u64", 552 | "index": false 553 | } 554 | ] 555 | }, 556 | { 557 | "name": "CompleteEvent", 558 | "fields": [ 559 | { 560 | "name": "user", 561 | "type": "publicKey", 562 | "index": false 563 | }, 564 | { 565 | "name": "mint", 566 | "type": "publicKey", 567 | "index": false 568 | }, 569 | { 570 | "name": "bondingCurve", 571 | "type": "publicKey", 572 | "index": false 573 | }, 574 | { 575 | "name": "timestamp", 576 | "type": "i64", 577 | "index": false 578 | } 579 | ] 580 | }, 581 | { 582 | "name": "SetParamsEvent", 583 | "fields": [ 584 | { 585 | "name": "feeRecipient", 586 | "type": "publicKey", 587 | "index": false 588 | }, 589 | { 590 | "name": "initialVirtualTokenReserves", 591 | "type": "u64", 592 | "index": false 593 | }, 594 | { 595 | "name": "initialVirtualSolReserves", 596 | "type": "u64", 597 | "index": false 598 | }, 599 | { 600 | "name": "initialRealTokenReserves", 601 | "type": "u64", 602 | "index": false 603 | }, 604 | { 605 | "name": "tokenTotalSupply", 606 | "type": "u64", 607 | "index": false 608 | }, 609 | { 610 | "name": "feeBasisPoints", 611 | "type": "u64", 612 | "index": false 613 | } 614 | ] 615 | } 616 | ], 617 | "errors": [ 618 | { 619 | "code": 6000, 620 | "name": "NotAuthorized", 621 | "msg": "The given account is not authorized to execute this instruction." 622 | }, 623 | { 624 | "code": 6001, 625 | "name": "AlreadyInitialized", 626 | "msg": "The program is already initialized." 627 | }, 628 | { 629 | "code": 6002, 630 | "name": "TooMuchSolRequired", 631 | "msg": "slippage: Too much SOL required to buy the given amount of tokens." 632 | }, 633 | { 634 | "code": 6003, 635 | "name": "TooLittleSolReceived", 636 | "msg": "slippage: Too little SOL received to sell the given amount of tokens." 637 | }, 638 | { 639 | "code": 6004, 640 | "name": "MintDoesNotMatchBondingCurve", 641 | "msg": "The mint does not match the bonding curve." 642 | }, 643 | { 644 | "code": 6005, 645 | "name": "BondingCurveComplete", 646 | "msg": "The bonding curve has completed and liquidity migrated to raydium." 647 | }, 648 | { 649 | "code": 6006, 650 | "name": "BondingCurveNotComplete", 651 | "msg": "The bonding curve has not completed." 652 | }, 653 | { 654 | "code": 6007, 655 | "name": "NotInitialized", 656 | "msg": "The program is not initialized." 657 | } 658 | ], 659 | "metadata": { 660 | "address": "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P" 661 | } 662 | } -------------------------------------------------------------------------------- /constants/index.ts: -------------------------------------------------------------------------------- 1 | export const programID = "6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"; 2 | export const MEMO_PROGRAM_ID = 'MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr'; 3 | export const feeRecipient = "CebN5WGQ4jvEPvsVU4EoHEpgzq1VV7AbicfhtW4xC9iM"; 4 | export const EVENT_AUTH = "Ce6TQqeHC9p8KetsN6JsjHK7UTZk7nasjjnr7XxXp9F1"; 5 | -------------------------------------------------------------------------------- /data/5h89hprN8az1RoUan3zrP4PqbWppQnzptMtWQrK2oLXf.json: -------------------------------------------------------------------------------- 1 | { 2 | "account": null, 3 | "mint": "5h89hprN8az1RoUan3zrP4PqbWppQnzptMtWQrK2oLXf", 4 | "mintAuth": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", 5 | "bondingCurve": "7pTGLoo19yM1wUo9eHodbJKvGVUm5Ni7rgfnk7sw34DL", 6 | "bondingCurveAta": "EiooBkyDNhQNtba5b9B76ZiPbTJ1JcJFs3DwyLbRmvsn", 7 | "globalState": "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf", 8 | "user": "84evJbzLnRcdk7zdP9kzAW9sydraiEfcrAiZAyUAqgPf", 9 | "userAta": "4yEFDqe6eZbNTjhsqr1YEQvLUGgi4Wba3mu7boGuHgp8", 10 | "signerTokenAccount": "4yEFDqe6eZbNTjhsqr1YEQvLUGgi4Wba3mu7boGuHgp8", 11 | "decimals": 6, 12 | "virtualTokenReserves": 1005937500000001, 13 | "virtualSolReserves": 32000000000, 14 | "realTokenReserves": 726037500000001, 15 | "realSolReserves": 2000000000, 16 | "adjustedVirtualTokenReserves": 1005937500.000001, 17 | "adjustedVirtualSolReserves": 32, 18 | "virtualTokenPrice": 3.181112146629385e-8 19 | } -------------------------------------------------------------------------------- /data/8mvaBraqTNcy39Fb12mGe8CGSh6ywwTzNKBcMv1KjyY4.json: -------------------------------------------------------------------------------- 1 | { 2 | "account": null, 3 | "mint": "8mvaBraqTNcy39Fb12mGe8CGSh6ywwTzNKBcMv1KjyY4", 4 | "mintAuth": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", 5 | "bondingCurve": "BSasZh2Kv367zaGBRipNzt2z2TVdyfJWxs289BCcCRCc", 6 | "bondingCurveAta": "GtVgnbTDA3HMwd1TLF5BcKg8RqRhdw5nrynUzJotW8iw", 7 | "globalState": "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf", 8 | "user": "84evJbzLnRcdk7zdP9kzAW9sydraiEfcrAiZAyUAqgPf", 9 | "userAta": "Usxc3E2kvb5NW3PVpT9Ecfr4cKaYzyQed3Kx1RkWmBT", 10 | "signerTokenAccount": "Usxc3E2kvb5NW3PVpT9Ecfr4cKaYzyQed3Kx1RkWmBT", 11 | "decimals": 6, 12 | "virtualTokenReserves": 1072999999511255, 13 | "virtualSolReserves": 30000000014, 14 | "realTokenReserves": 793099999511255, 15 | "realSolReserves": 14, 16 | "adjustedVirtualTokenReserves": 1072999999.511255, 17 | "adjustedVirtualSolReserves": 30.000000014, 18 | "virtualTokenPrice": 2.795899350201754e-8 19 | } -------------------------------------------------------------------------------- /data/8pJ8Qm2cn6kEbziwdbXki27rdb1qeQM6SzzindAVfMDE.json: -------------------------------------------------------------------------------- 1 | { 2 | "account": null, 3 | "mint": "8pJ8Qm2cn6kEbziwdbXki27rdb1qeQM6SzzindAVfMDE", 4 | "mintAuth": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", 5 | "bondingCurve": "4hevohvpKaReD7ivSTZrqAZuh2DTXh86amGZfdSfvJHw", 6 | "bondingCurveAta": "GQ53Aqfa1oPrBdHZqh4TFtrrmm11MYT1wCDyybzagB8L", 7 | "globalState": "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf", 8 | "user": "84evJbzLnRcdk7zdP9kzAW9sydraiEfcrAiZAyUAqgPf", 9 | "userAta": "84uVXrc1ByaqZjMRnSFsSa5GLTxSoMGmBSPaKSnaEyR1", 10 | "signerTokenAccount": "84uVXrc1ByaqZjMRnSFsSa5GLTxSoMGmBSPaKSnaEyR1", 11 | "decimals": 6, 12 | "virtualTokenReserves": 1038387096774194, 13 | "virtualSolReserves": 31000000000, 14 | "realTokenReserves": 758487096774194, 15 | "realSolReserves": 1000000000, 16 | "adjustedVirtualTokenReserves": 1038387096.774194, 17 | "adjustedVirtualSolReserves": 31, 18 | "virtualTokenPrice": 2.9853991922957425e-8 19 | } -------------------------------------------------------------------------------- /data/9dYkm8oN2PRcDSFvADMNxyCzq1H8PXd3Qdju4n6hAx4k.json: -------------------------------------------------------------------------------- 1 | { 2 | "account": null, 3 | "mint": "9dYkm8oN2PRcDSFvADMNxyCzq1H8PXd3Qdju4n6hAx4k", 4 | "mintAuth": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", 5 | "bondingCurve": "DsSYks5XQd9iFV5rzZqSnjQCedsLJcHWtj8GHCbbvKZj", 6 | "bondingCurveAta": "Guox23H1iDbVjWZAXAHFqWS6hQMZLZnNrai9jiwV8D2f", 7 | "globalState": "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf", 8 | "user": "84evJbzLnRcdk7zdP9kzAW9sydraiEfcrAiZAyUAqgPf", 9 | "userAta": "48yNgkJqiZkygydMi78TqkFLYVv5gtmh9P9GBueBUHkC", 10 | "signerTokenAccount": "48yNgkJqiZkygydMi78TqkFLYVv5gtmh9P9GBueBUHkC", 11 | "decimals": 6, 12 | "virtualTokenReserves": 1031730769230770, 13 | "virtualSolReserves": 31200000000, 14 | "realTokenReserves": 751830769230770, 15 | "realSolReserves": 1200000000, 16 | "adjustedVirtualTokenReserves": 1031730769.23077, 17 | "adjustedVirtualSolReserves": 31.2, 18 | "virtualTokenPrice": 3.02404473438956e-8 19 | } -------------------------------------------------------------------------------- /data/DrxwokrrtNHJB49hZ3vhzUHTmuyEgmapBKtrMTxVGvPp.json: -------------------------------------------------------------------------------- 1 | { 2 | "account": null, 3 | "mint": "DrxwokrrtNHJB49hZ3vhzUHTmuyEgmapBKtrMTxVGvPp", 4 | "mintAuth": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", 5 | "bondingCurve": "9D5wvp1nXmpwsxjA3fMYGUfD2i84DkvpZGTovPkMsvxw", 6 | "bondingCurveAta": "9soCBSozhDAV4KAHZ4V95qBMWHXTbsdvNqppLEPc7pKk", 7 | "globalState": "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf", 8 | "user": "84evJbzLnRcdk7zdP9kzAW9sydraiEfcrAiZAyUAqgPf", 9 | "userAta": "FSh5nx6bXnfeWkKFRsSvvtzncGViLuwoFKXwf7bM1GmD", 10 | "signerTokenAccount": "FSh5nx6bXnfeWkKFRsSvvtzncGViLuwoFKXwf7bM1GmD", 11 | "decimals": 6, 12 | "virtualTokenReserves": 1005937500000001, 13 | "virtualSolReserves": 32000000000, 14 | "realTokenReserves": 726037500000001, 15 | "realSolReserves": 2000000000, 16 | "adjustedVirtualTokenReserves": 1005937500.000001, 17 | "adjustedVirtualSolReserves": 32, 18 | "virtualTokenPrice": 3.181112146629385e-8 19 | } -------------------------------------------------------------------------------- /data/GPYMHXuLU7czUyKNscqkQG2Dn96Y2uSqEnKCNiVAfAYj.json: -------------------------------------------------------------------------------- 1 | { 2 | "account": null, 3 | "mint": "GPYMHXuLU7czUyKNscqkQG2Dn96Y2uSqEnKCNiVAfAYj", 4 | "mintAuth": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", 5 | "bondingCurve": "G5FMAKchcmhdhkPMGCBDzraoxw291s9Jxf2v1J98cA1x", 6 | "bondingCurveAta": "GgCKh5LnCEU5KSDy7paEdjRrTCpabGQkQyBxMbAAEKND", 7 | "globalState": "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf", 8 | "user": "84evJbzLnRcdk7zdP9kzAW9sydraiEfcrAiZAyUAqgPf", 9 | "userAta": "DtSjN6jUvQeE8yodwJ1TcesS4uR93hCoyDEqM9vBMjMR", 10 | "signerTokenAccount": "DtSjN6jUvQeE8yodwJ1TcesS4uR93hCoyDEqM9vBMjMR", 11 | "decimals": 6, 12 | "virtualTokenReserves": 946764705882353, 13 | "virtualSolReserves": 34000000000, 14 | "realTokenReserves": 666864705882353, 15 | "realSolReserves": 4000000000, 16 | "adjustedVirtualTokenReserves": 946764705.882353, 17 | "adjustedVirtualSolReserves": 34, 18 | "virtualTokenPrice": 3.5911773842808325e-8 19 | } -------------------------------------------------------------------------------- /data/poolData.json: -------------------------------------------------------------------------------- 1 | { 2 | "account": { 3 | "data": { 4 | "type": "Buffer", 5 | "data": [ 6 | 44, 7 | 62, 8 | 255, 9 | 166, 10 | 93, 11 | 175, 12 | 57, 13 | 239, 14 | 114, 15 | 44, 16 | 221, 17 | 30, 18 | 192, 19 | 166, 20 | 116, 21 | 99, 22 | 210, 23 | 147, 24 | 28, 25 | 144, 26 | 153, 27 | 170, 28 | 114, 29 | 131, 30 | 249, 31 | 184, 32 | 201, 33 | 38, 34 | 94, 35 | 152, 36 | 11, 37 | 144, 38 | 104, 39 | 241, 40 | 109, 41 | 20, 42 | 76, 43 | 220, 44 | 203, 45 | 147, 46 | 187, 47 | 115, 48 | 234, 49 | 194, 50 | 49, 51 | 92, 52 | 47, 53 | 215, 54 | 15, 55 | 55, 56 | 86, 57 | 138, 58 | 224, 59 | 91, 60 | 185, 61 | 44, 62 | 6, 63 | 148, 64 | 135, 65 | 207, 66 | 107, 67 | 202, 68 | 205, 69 | 14, 70 | 168, 71 | 41, 72 | 140, 73 | 113, 74 | 7, 75 | 0, 76 | 0, 77 | 0, 78 | 0, 79 | 0, 80 | 0, 81 | 0, 82 | 0, 83 | 0, 84 | 0, 85 | 0, 86 | 0, 87 | 0, 88 | 0, 89 | 0, 90 | 0, 91 | 0, 92 | 0, 93 | 0, 94 | 0, 95 | 0, 96 | 0, 97 | 0, 98 | 0, 99 | 0, 100 | 0, 101 | 0, 102 | 0, 103 | 0, 104 | 0, 105 | 0, 106 | 0, 107 | 0, 108 | 0, 109 | 0, 110 | 0, 111 | 0, 112 | 0, 113 | 0, 114 | 1, 115 | 0, 116 | 0, 117 | 0, 118 | 0, 119 | 0, 120 | 0, 121 | 0, 122 | 0, 123 | 0, 124 | 0, 125 | 0, 126 | 0, 127 | 0, 128 | 0, 129 | 0, 130 | 0, 131 | 0, 132 | 0, 133 | 0, 134 | 0, 135 | 0, 136 | 0, 137 | 0, 138 | 0, 139 | 0, 140 | 0, 141 | 0, 142 | 0, 143 | 0, 144 | 0, 145 | 0, 146 | 0, 147 | 0, 148 | 0, 149 | 0, 150 | 0, 151 | 0, 152 | 0, 153 | 0, 154 | 0, 155 | 0, 156 | 0, 157 | 0, 158 | 0, 159 | 0, 160 | 0, 161 | 0, 162 | 0, 163 | 0, 164 | 0, 165 | 0, 166 | 0, 167 | 0, 168 | 0, 169 | 0, 170 | 0 171 | ] 172 | }, 173 | "executable": false, 174 | "lamports": 2039280, 175 | "owner": "TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA", 176 | "rentEpoch": 18446744073709552000, 177 | "space": 165 178 | }, 179 | "mint": "3yiezTZHsWjEDBnZxTgEo21He8f5iSNNJhQ9EQdH8mef", 180 | "mintAuth": "TSLvdd1pWpHVjahSpsvCXUbgwsL3JAcvokwaKt1eokM", 181 | "bondingCurve": "FmaQEfSyeLnhRoPiMWL7js5ZUx7cysNVtJwn5DdjQo63", 182 | "bondingCurveAta": "EfNutZrJuDChm13cEAt25AMpZx4EpppA4RV62VmXgCGZ", 183 | "globalState": "4wTV1YmiEkRvAtNtsSGPtUrqRYQMe5SKy2uB4Jjaxnjf", 184 | "user": "84evJbzLnRcdk7zdP9kzAW9sydraiEfcrAiZAyUAqgPf", 185 | "userAta": "DevywRe87ADH5hRnGb6v2QUux9XiX8b5y8ZiKeaUr518", 186 | "signerTokenAccount": "DevywRe87ADH5hRnGb6v2QUux9XiX8b5y8ZiKeaUr518", 187 | "decimals": 6, 188 | "virtualTokenReserves": 1069403245230409, 189 | "virtualSolReserves": 30100899871, 190 | "adjustedVirtualTokenReserves": 1069403245.230409, 191 | "adjustedVirtualSolReserves": 30.100899871, 192 | "virtualTokenPrice": 2.8147380331274932e-8 193 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pump-sniper", 3 | "version": "1.0.0", 4 | "description": "Solana Pump.fun wallet monitor and sniper", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "ts-node scripts/main.ts --disable-warning --no-warnings" 8 | }, 9 | "keywords": [], 10 | "author": "iSyqozz ", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@coral-xyz/anchor": "^0.29.0", 14 | "@solana/spl-token": "^0.4.3", 15 | "@solana/web3.js": "^1.91.2", 16 | "bn.js": "^5.2.1", 17 | "bs58": "^5.0.0", 18 | "dotenv": "^16.4.5", 19 | "jito-ts": "^3.0.1" 20 | }, 21 | "devDependencies": { 22 | "@types/node": "^20.12.2", 23 | "ts-node": "^10.9.2", 24 | "typescript": "^5.4.3" 25 | }, 26 | "repository": "https://github.com/iSyqozz/Pump.fun-pool-bonding-curve-sniper.git" 27 | } 28 | -------------------------------------------------------------------------------- /scripts/indexPump.ts: -------------------------------------------------------------------------------- 1 | import { validateSolAddress, getKeypairFromBs58, ConstructOptimalTransaction, getRandomNumber, buildBundle, onBundleResult, getCurrentDateTime, roundUpToNonZeroString, listenProgramLogs, getMintPoolData, sendTx } from "../utils"; 2 | import idl from "../constants/idl.json"; 3 | import { TransactionInstruction, Connection, LAMPORTS_PER_SOL, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, PartiallyDecodedInstruction, ParsedInstruction, ParsedTransactionWithMeta, } from "@solana/web3.js" 4 | import { TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, getAssociatedTokenAddressSync } from "@solana/spl-token"; 5 | import * as anchor from "@coral-xyz/anchor"; 6 | import { Program } from "@coral-xyz/anchor"; 7 | import { BN } from "@coral-xyz/anchor"; 8 | import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; 9 | import dotenv from "dotenv"; 10 | import { parseSignatures } from "../utils"; 11 | import { sleep, getUserInput } from "../utils"; 12 | import { searcherClient } from "jito-ts/dist/sdk/block-engine/searcher"; 13 | import fs from "fs"; 14 | 15 | import { 16 | programID, 17 | MEMO_PROGRAM_ID, 18 | feeRecipient, 19 | EVENT_AUTH, 20 | } from "../constants" 21 | import { PoolData } from "../types"; 22 | import { send } from "process"; 23 | 24 | 25 | 26 | process.removeAllListeners('warning') 27 | dotenv.config(); 28 | const PRIVATE_KEY = "5QgozLz3sqx3Dcdj6rwKuCr6LJjq6J7FYaUgwjY2LduHjtNifMiQ5KwoCKVsAU9jkD94SPJEo1dMADoMY4roWDvM" 29 | const vitualSolToSol = 32000000000 30 | 31 | const RPC_ENDPOINT = "https://solana-mainnet.core.chainstack.com/444a9722c51931fbf1f90e396ce78229" 32 | const RPC_WEBSOCKET_ENDPOINT = "wss://api.mainnet-beta.solana.com" 33 | 34 | // export const connection = new Connection(RPC_ENDPOINT, { 35 | // wsEndpoint: RPC_WEBSOCKET_ENDPOINT 36 | // }) 37 | 38 | const searchInstruction = "InitializeMint2"; 39 | const pumpProgramId = new PublicKey("6EF8rrecthR5Dkzon8Nwu78hRvfCKubJ14M5uBEwF6P"); 40 | const signerKeypair = getKeypairFromBs58(PRIVATE_KEY); 41 | // let priorityFee: number = 1000000 42 | let priorityFee: number = 5000000 43 | const connection = new Connection(process.env.RPC_URL as string, { commitment: 'confirmed', }); 44 | 45 | const program = new Program(idl as anchor.Idl, programID, new anchor.AnchorProvider(connection, new NodeWallet(signerKeypair), anchor.AnchorProvider.defaultOptions())); 46 | const maxRetriesString = process.env.MAX_RETRIES as string; 47 | const maxRetries = Number(maxRetriesString); 48 | const buyNumberAmount = Number(0.0008); 49 | const buyMinMaxAmount = buyNumberAmount + (buyNumberAmount * 0.15); 50 | const buyMaxSolCost = buyMinMaxAmount 51 | 52 | const sellNumberAmount = Number(10000); 53 | const sellMinMaxAmount = sellNumberAmount + (sellNumberAmount * 0.15); 54 | 55 | const detectedSignatures = new Set(); 56 | 57 | // const numberAmount = Number(0.0001); 58 | // const minMaxAmount = numberAmount + (numberAmount * 0.15); 59 | 60 | //getting max amount to swap with: 61 | 62 | 63 | 64 | 65 | 66 | 67 | async function fetchPumpPairs(txId: string) { 68 | try { 69 | const tx = await connection.getParsedTransaction(txId, { 70 | maxSupportedTransactionVersion: 0, 71 | commitment: "confirmed", 72 | }); 73 | 74 | //@ts-ignore 75 | const accounts = (tx?.transaction.message.instructions).find( 76 | (ix) => 77 | ix.programId.toBase58() === pumpProgramId.toBase58() 78 | // @ts-ignore 79 | ).accounts as PublicKey[]; 80 | 81 | if (!accounts) { 82 | console.log("No accounts found in the transaction."); 83 | return; 84 | } 85 | 86 | if (accounts.length === 14 && !detectedSignatures.has(txId)) { 87 | // console.log("Accounts found:", accounts.length); 88 | detectedSignatures.add(txId); 89 | console.log( 90 | `Signature for ${searchInstruction}:`, 91 | `https://solscan.io/tx/${txId}` 92 | ); 93 | await buy(txId); 94 | } 95 | } catch (error) { 96 | // console.error(error); 97 | } 98 | } 99 | 100 | async function listenNewPairs(connection: Connection) { 101 | listenProgramLogs( 102 | connection, 103 | pumpProgramId, 104 | searchInstruction, 105 | fetchPumpPairs 106 | ).catch(console.error); 107 | } 108 | 109 | 110 | 111 | async function buildBuyTx(program: Program, buyNumberAmount: number, maxSolCost: number, feeRecipient: PublicKey, poolData: PoolData, priorityFee: number): Promise { 112 | const { 113 | account, 114 | mint, 115 | bondingCurve, 116 | bondingCurveAta, 117 | globalState, 118 | user, 119 | userAta, 120 | signerTokenAccount, 121 | decimals, 122 | virtualTokenPrice 123 | } = poolData; 124 | 125 | const buyAmount = (buyNumberAmount / virtualTokenPrice); 126 | 127 | const tx = new Transaction(); 128 | 129 | if (!account) { 130 | tx.add( 131 | createAssociatedTokenAccountInstruction( 132 | user, 133 | signerTokenAccount, 134 | user, 135 | mint, 136 | ) 137 | ) 138 | }; 139 | 140 | const snipeIx = await program.methods.buy( 141 | new BN((buyAmount * (10 ** decimals))), 142 | new BN(maxSolCost * LAMPORTS_PER_SOL), 143 | ).accounts({ 144 | global: globalState, 145 | feeRecipient: feeRecipient, 146 | mint: mint, 147 | bondingCurve: bondingCurve, 148 | associatedBondingCurve: bondingCurveAta, 149 | associatedUser: userAta, 150 | user: user, 151 | systemProgram: SystemProgram.programId, 152 | tokenProgram: TOKEN_PROGRAM_ID, 153 | rent: SYSVAR_RENT_PUBKEY, 154 | eventAuthority: EVENT_AUTH, 155 | program: program.programId, 156 | }).instruction(); 157 | tx.add(snipeIx); 158 | 159 | const memoix = new TransactionInstruction({ 160 | programId: new PublicKey(MEMO_PROGRAM_ID), 161 | keys: [], 162 | data: Buffer.from(getRandomNumber().toString(), "utf8") 163 | }) 164 | tx.add(memoix); 165 | 166 | //preparing transaction 167 | // const hashAndCtx = await connection.getLatestBlockhashAndContext('processed'); 168 | const hashAndCtx = await connection.getLatestBlockhashAndContext('confirmed'); 169 | const recentBlockhash = hashAndCtx.value.blockhash; 170 | const lastValidBlockHeight = hashAndCtx.value.lastValidBlockHeight; 171 | 172 | tx.recentBlockhash = recentBlockhash; 173 | tx.lastValidBlockHeight = lastValidBlockHeight; 174 | tx.feePayer = user; 175 | 176 | const finalTx = await ConstructOptimalTransaction(tx, connection, priorityFee); 177 | 178 | finalTx.sign(signerKeypair); 179 | 180 | return finalTx; 181 | } 182 | 183 | 184 | 185 | async function buy(txId: string) { 186 | 187 | try { 188 | const poolData: PoolData | undefined = await getMintPoolData(connection, program, signerKeypair.publicKey, txId); 189 | if (!poolData) { 190 | console.log("No pool data found"); 191 | return; 192 | } 193 | 194 | fs.writeFileSync(`data/${poolData.mint.toBase58()}.json`, JSON.stringify(poolData, null, 2)); 195 | 196 | let retries = 0; 197 | while (retries <= (maxRetries ? Math.max(1, maxRetries) : 5)) { 198 | const tx = await buildBuyTx(program, buyNumberAmount, buyMaxSolCost, new PublicKey(feeRecipient), poolData, priorityFee); 199 | console.log(`\n\nRetrying ${retries + 1} of ${maxRetries ? maxRetries : 5}...`); 200 | console.log(`\n\nSending Transaction...`); 201 | 202 | const signature = await sendTx(connection, tx); 203 | if (signature) { 204 | console.log(`Transaction sent: https://solscan.io/tx/${signature}`); 205 | break; 206 | } 207 | retries++; 208 | } 209 | 210 | console.log('\nMax Retries Reached.'); 211 | process.exit(1); 212 | 213 | } catch (e) { 214 | console.log(e); 215 | console.log('an error has occurred'); 216 | } 217 | } 218 | 219 | async function sell(txId: string) { 220 | 221 | // const poolDataString = fs.readFileSync("data/poolData.json", "utf8"); 222 | // const poolData: PoolData = JSON.parse(poolDataString); 223 | // const { globalState, mint, bondingCurve, bondingCurveAta, userAta, user } = poolData; 224 | 225 | // console.log({ 226 | // poolData 227 | // }) 228 | 229 | const poolData: PoolData | undefined = await getMintPoolData(connection, program, signerKeypair.publicKey, txId); 230 | if (!poolData) { 231 | console.log("No pool data found"); 232 | return; 233 | } 234 | 235 | const { 236 | account, 237 | mint, 238 | bondingCurve, 239 | bondingCurveAta, 240 | globalState, 241 | user, 242 | userAta, 243 | signerTokenAccount, 244 | decimals, 245 | virtualTokenPrice } = poolData; 246 | 247 | const tx = new Transaction(); 248 | 249 | 250 | 251 | const mintDecimals = 6; 252 | const snipeIx = await program.methods.sell( 253 | //new BN(10000000000), 254 | new BN((sellNumberAmount * (10 ** mintDecimals))), 255 | new BN(1), 256 | ).accounts({ 257 | global: globalState, 258 | feeRecipient: feeRecipient, 259 | mint: mint, 260 | bondingCurve: bondingCurve, 261 | associatedBondingCurve: bondingCurveAta, 262 | associatedUser: userAta, 263 | user: user, 264 | systemProgram: SystemProgram.programId, 265 | tokenProgram: TOKEN_PROGRAM_ID, 266 | rent: SYSVAR_RENT_PUBKEY, 267 | eventAuthority: EVENT_AUTH, 268 | program: program.programId, 269 | }).instruction(); 270 | tx.add(snipeIx); 271 | 272 | const memoix = new TransactionInstruction({ 273 | programId: new PublicKey(MEMO_PROGRAM_ID), 274 | keys: [], 275 | data: Buffer.from(getRandomNumber().toString(), "utf8") 276 | }) 277 | tx.add(memoix); 278 | 279 | const hashAndCtx = await connection.getLatestBlockhashAndContext('confirmed'); 280 | const recentBlockhash = hashAndCtx.value.blockhash; 281 | const lastValidBlockHeight = hashAndCtx.value.lastValidBlockHeight; 282 | 283 | tx.recentBlockhash = recentBlockhash; 284 | tx.lastValidBlockHeight = lastValidBlockHeight; 285 | tx.feePayer = user; 286 | 287 | const finalTx = await ConstructOptimalTransaction(tx, connection, priorityFee); 288 | 289 | finalTx.sign(signerKeypair); 290 | 291 | const signature = await connection.sendRawTransaction( 292 | finalTx.serialize(), 293 | { 294 | preflightCommitment: "confirmed" 295 | } 296 | ) 297 | 298 | console.log(`Transaction sent: https://solscan.io/tx/${signature}`); 299 | 300 | if (signature && signature.length > 0) { 301 | const latestBlockhash = await connection.getLatestBlockhash({ 302 | commitment: "confirmed" 303 | }) 304 | const confirmation = await connection.confirmTransaction( 305 | { 306 | signature, 307 | lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, 308 | blockhash: latestBlockhash.blockhash 309 | }, 310 | "confirmed" 311 | ) 312 | if (!confirmation.value.err) { 313 | console.log(`Transaction confirmed: https://solscan.io/tx/${signature}`); 314 | } else { 315 | console.log(`Transaction failed: ${confirmation.value.err}`); 316 | } 317 | } else { 318 | 319 | } 320 | 321 | 322 | } 323 | 324 | 325 | async function main() { 326 | // await listenNewPairs(connection) 327 | 328 | await buy("3LFtxNbGippSZVKULqZ9hk6oWHqPz9r4JtP8Fg29QrcTnNt9xBQR8Ry2rqpdZi4h45mJetm7gupc4wZuwBQDh2P") 329 | // await sell("52v5G9z2kxLxdymHrXhq1DYcyTkDcztggJveCxxxKCLL7LnTGxLwQVmWWbmKzm4xAug33LwBL3iw8HL1TrYgYxiW") 330 | // const txId = "52v5G9z2kxLxdymHrXhq1DYcyTkDcztggJveCxxxKCLL7LnTGxLwQVmWWbmKzm4xAug33LwBL3iw8HL1TrYgYxiW" 331 | // await sell(txId) 332 | 333 | 334 | // const poolData: PoolData | undefined = await getMintPoolData(txId); 335 | // if (!poolData) { 336 | // console.log("No pool data found"); 337 | // return; 338 | // } 339 | 340 | // const { virtualTokenPrice } = poolData; 341 | // console.log(virtualTokenPrice); 342 | } 343 | 344 | main().catch(console.error); -------------------------------------------------------------------------------- /scripts/main.ts: -------------------------------------------------------------------------------- 1 | import { validateSolAddress, getKeypairFromBs58, ConstructOptimalTransaction, getRandomNumber, buildBundle, onBundleResult, getCurrentDateTime, roundUpToNonZeroString } from "../utils"; 2 | import idl from "../constants/idl.json"; 3 | import { TransactionInstruction, Connection, LAMPORTS_PER_SOL, PublicKey, SYSVAR_RENT_PUBKEY, SystemProgram, Transaction, PartiallyDecodedInstruction, ParsedInstruction, ParsedTransactionWithMeta, } from "@solana/web3.js" 4 | import { TOKEN_PROGRAM_ID, createAssociatedTokenAccountInstruction, getAssociatedTokenAddressSync } from "@solana/spl-token"; 5 | import * as anchor from "@coral-xyz/anchor"; 6 | import { Program } from "@coral-xyz/anchor"; 7 | import { BN } from "@coral-xyz/anchor"; 8 | import NodeWallet from "@coral-xyz/anchor/dist/cjs/nodewallet"; 9 | import dotenv from "dotenv"; 10 | import { parseSignatures } from "../utils"; 11 | import { sleep, getUserInput } from "../utils"; 12 | import { searcherClient } from "jito-ts/dist/sdk/block-engine/searcher"; 13 | 14 | import { 15 | programID, 16 | MEMO_PROGRAM_ID, 17 | feeRecipient, 18 | EVENT_AUTH, 19 | } from "../constants" 20 | 21 | 22 | process.removeAllListeners('warning') 23 | dotenv.config(); 24 | 25 | 26 | async function main() { 27 | 28 | try { 29 | 30 | const pk = process.env.SIGNER_PRIVATE_KEY as string; 31 | if (!pk || pk == '') { 32 | console.log('missing signer keypair'); 33 | console.log('please fill it in .env file'); 34 | return 35 | } 36 | 37 | const url = process.env.RPC_URL as string; 38 | if (!url || url == '') { 39 | console.log('missing rpc endpoint'); 40 | console.log('please fill it in .env file'); 41 | return 42 | } 43 | 44 | const jitoAuthPrivateKey = process.env.JITO_AUTH_PRIVATE_KEY as string; 45 | if (!jitoAuthPrivateKey || jitoAuthPrivateKey == '') { 46 | console.log('Missing jito authentication private key'); 47 | console.log('please fill it in the .env file.'); 48 | return 49 | } 50 | 51 | const blockEngineUrl = process.env.BLOCK_ENGINE_URL as string; 52 | if (!blockEngineUrl) { 53 | console.log('Missing block engine url'); 54 | console.log('please fill it in the .env file.'); 55 | return 56 | } 57 | 58 | const envTip = process.env.JITO_TIP as string; 59 | const jitoTip = Number(envTip); 60 | if (!jitoTip) { 61 | console.log('invalid jito tip'); 62 | console.log('please fix it in the .env file.'); 63 | return 64 | } 65 | 66 | const maxRetriesString = process.env.MAX_RETRIES as string; 67 | const maxRetries = Number(maxRetriesString); 68 | 69 | 70 | 71 | 72 | const connection = new Connection(process.env.RPC_URL as string, { commitment: 'confirmed', }); 73 | const signerKeypair = getKeypairFromBs58(pk); 74 | 75 | //getting the wallet to track: 76 | const inputtedWallet = (await getUserInput("Enter the wallet address to monitor: ")); 77 | if (!validateSolAddress(inputtedWallet)) { 78 | console.log('invalid wallet address'); 79 | return; 80 | } 81 | 82 | //getting the amount to swap with: 83 | const inputtedAmount = (await getUserInput("Enter the amount of SOL to snipe with: ")); 84 | const numberAmount = Number(inputtedAmount); 85 | if (!numberAmount) { 86 | console.log('invalid sol amount'); 87 | return; 88 | } 89 | 90 | const minMaxAmount = numberAmount + (numberAmount * 0.15); 91 | 92 | //getting max amount to swap with: 93 | const inputtedMaxSolCost = (await getUserInput(`Enter the maximum amount of SOL accounting to slippage (min ${roundUpToNonZeroString(parseFloat((minMaxAmount).toFixed(6)))} SOL): `)); 94 | const maxSolCost = Number(inputtedMaxSolCost); 95 | if (!maxSolCost || maxSolCost < minMaxAmount) { 96 | console.log('invalid maximum sol amount'); 97 | return; 98 | } 99 | 100 | //getting the micro lamports for compute budget price: 101 | let priorityFee: number = -1; 102 | const inputtedPriorityFee = (await getUserInput("Enter Priority-fee in micro-lamports ('default' for default fee <1,000,000>): ")); 103 | if (inputtedPriorityFee.toUpperCase() != 'DEFAULT') { 104 | priorityFee = Number(inputtedPriorityFee); 105 | if (!priorityFee || priorityFee < 0) { 106 | console.log('invalid priority fee input'); 107 | return 108 | } 109 | } 110 | 111 | console.log('\n'); 112 | console.log(`Scanning wallet ${inputtedWallet}\n`) 113 | 114 | //caching to avoid accidental duplicate on-chain reads 115 | //var cache: Set = new Set(); 116 | // 117 | //setInterval(() => { 118 | // cache.clear(); 119 | // console.log("cache flushed"); 120 | //}, 3 * 60 * 1000); 121 | 122 | 123 | 124 | //start monitoring 125 | 126 | let neededInstruction: PartiallyDecodedInstruction | ParsedInstruction | null = null; 127 | let parsedSig: ParsedTransactionWithMeta | null = null 128 | 129 | while (neededInstruction == null) { 130 | const data = await connection.getConfirmedSignaturesForAddress2(new PublicKey(inputtedWallet), { limit: 10, },); 131 | const confirmed_sigs: string[] = data.filter(e => !e.err).map(e => e.signature); 132 | 133 | if (confirmed_sigs.length === 0) { 134 | await sleep(500); 135 | console.log('No signatures found, polling for new signatures..') 136 | continue 137 | } 138 | //console.log(confirmed_sigs); 139 | 140 | const parsed_sigs = await parseSignatures(connection, confirmed_sigs); 141 | 142 | 143 | for (var i = 0; i < parsed_sigs.length; i++) { 144 | try { 145 | const sig = parsed_sigs[i]; 146 | if (!sig) { continue } 147 | 148 | const blockTime = sig.blockTime; 149 | const currentTime = Math.floor(Date.now() / 1000); 150 | 151 | //@ts-ignore 152 | const instructions = (sig.transaction.message.instructions); 153 | for (let ix of instructions) { 154 | try { 155 | const hasNeededProgramId = (ix.programId.toBase58() == programID); 156 | //@ts-ignore 157 | //console.log(ix.accounts.length); 158 | //console.log(ix.programId.toBase58()); 159 | //console.log(confirmed_sigs[i]) 160 | 161 | 162 | //@ts-ignore 163 | const hasNeededAccounts = ix.accounts.length == 14; 164 | 165 | if (hasNeededProgramId && hasNeededAccounts) { 166 | //transaction should should be processed within one minute of detecting it here 167 | if (!blockTime || currentTime - blockTime > 60) { 168 | console.log(`${getCurrentDateTime()} Old Bonding Curve detected, Ignoring stale pool...`) 169 | } else { 170 | neededInstruction = ix; 171 | parsedSig = sig 172 | break 173 | } 174 | } 175 | } catch (e) { 176 | continue 177 | } 178 | } 179 | if (neededInstruction) { break }; 180 | 181 | } catch (e) { 182 | continue 183 | } 184 | if (neededInstruction) { break }; 185 | } 186 | 187 | if (neededInstruction) { break }; 188 | 189 | console.log(`${getCurrentDateTime()} No bonding curves found. Polling for new signatures...\n`); 190 | await sleep(500); 191 | 192 | } 193 | 194 | 195 | if (!neededInstruction) { return } 196 | 197 | console.log(`\nFound new pool/bonding-curve, Sniping with ${numberAmount} SOL..\n\n`); 198 | 199 | //initializing program 200 | const program = new Program(idl as anchor.Idl, programID, new anchor.AnchorProvider(connection, new NodeWallet(signerKeypair), anchor.AnchorProvider.defaultOptions())); 201 | 202 | 203 | //@ts-ignore 204 | 205 | //getting needed accounts 206 | const accounts = neededInstruction.accounts 207 | const mint = accounts[0]; 208 | const mintAuth = accounts[1]; 209 | const bondingCurve = accounts[2]; 210 | const bondingCurveAta = accounts[3]; 211 | const globalState = accounts[4]; 212 | const user = signerKeypair.publicKey; 213 | const userAta = getAssociatedTokenAddressSync(mint, user, true); 214 | const signerTokenAccount = getAssociatedTokenAddressSync(mint, user, true, TOKEN_PROGRAM_ID,); 215 | 216 | 217 | const [bondingCurveData, mintData, account] = await Promise.all([ 218 | program.account.bondingCurve.fetch(bondingCurve), 219 | connection.getParsedAccountInfo(mint), 220 | connection.getAccountInfo(signerTokenAccount, 'processed') 221 | ]); 222 | 223 | 224 | //@ts-ignore 225 | const decimals = mintData.value?.data.parsed.info.decimals; 226 | const virtualTokenReserves = (bondingCurveData.virtualTokenReserves as any).toNumber(); 227 | const virtualSolReserves = (bondingCurveData.virtualSolReserves as any).toNumber(); 228 | 229 | const adjustedVirtualTokenReserves = virtualTokenReserves / (10 ** decimals); 230 | const adjustedVirtualSolReserves = virtualSolReserves / LAMPORTS_PER_SOL; 231 | 232 | 233 | const virtualTokenPrice = adjustedVirtualSolReserves / adjustedVirtualTokenReserves; 234 | const finalAmount = (numberAmount / virtualTokenPrice); 235 | 236 | 237 | //console.log(adjustedVirtualSolReserves); 238 | //console.log(adjustedVirtualTokenReserves); 239 | // 240 | //console.log(finalAmount); 241 | //console.log(virtualTokenPrice); 242 | //console.log(virtualTokenReserves); 243 | //console.log(virtualSolReserves); 244 | //console.log(decimals); 245 | //console.log(mint); 246 | //console.log(bondingCurve); 247 | //console.log(finalAmount); 248 | 249 | 250 | 251 | let retries = 0; 252 | while (retries <= (maxRetries ? Math.max(1, maxRetries) : 5)) { 253 | 254 | //creating tx; 255 | const tx = new Transaction(); 256 | 257 | if (!account) { 258 | tx.add( 259 | createAssociatedTokenAccountInstruction( 260 | user, 261 | signerTokenAccount, 262 | user, 263 | mint, 264 | ) 265 | ) 266 | }; 267 | 268 | const snipeIx = await program.methods.buy( 269 | new BN((finalAmount * (10 ** decimals))), 270 | new BN(maxSolCost * LAMPORTS_PER_SOL), 271 | ).accounts({ 272 | global: globalState, 273 | feeRecipient: feeRecipient, 274 | mint: mint, 275 | bondingCurve: bondingCurve, 276 | associatedBondingCurve: bondingCurveAta, 277 | associatedUser: userAta, 278 | user: user, 279 | systemProgram: SystemProgram.programId, 280 | tokenProgram: TOKEN_PROGRAM_ID, 281 | rent: SYSVAR_RENT_PUBKEY, 282 | eventAuthority: EVENT_AUTH, 283 | program: program.programId, 284 | }).instruction(); 285 | tx.add(snipeIx); 286 | 287 | 288 | const memoix = new TransactionInstruction({ 289 | programId: new PublicKey(MEMO_PROGRAM_ID), 290 | keys: [], 291 | data: Buffer.from(getRandomNumber().toString(), "utf8") 292 | }) 293 | tx.add(memoix); 294 | 295 | //preparing transaction 296 | const hashAndCtx = await connection.getLatestBlockhashAndContext('processed'); 297 | const recentBlockhash = hashAndCtx.value.blockhash; 298 | const lastValidBlockHeight = hashAndCtx.value.lastValidBlockHeight; 299 | 300 | tx.recentBlockhash = recentBlockhash; 301 | tx.lastValidBlockHeight = lastValidBlockHeight; 302 | tx.feePayer = user; 303 | 304 | const finalTx = await ConstructOptimalTransaction(tx, connection, priorityFee); 305 | 306 | finalTx.sign(signerKeypair); 307 | 308 | const jitoAuthKeypair = getKeypairFromBs58(jitoAuthPrivateKey); 309 | 310 | 311 | const bundleTransactionLimit = 1; 312 | const search = searcherClient(blockEngineUrl, jitoAuthKeypair); 313 | 314 | const bundleCtx = await buildBundle( 315 | search, 316 | bundleTransactionLimit, 317 | finalTx, 318 | signerKeypair, 319 | jitoTip, 320 | ); 321 | 322 | if (bundleCtx != null) { 323 | const bundleResult = await onBundleResult(search); 324 | if (bundleResult[0]) { 325 | console.log('Successful! '); 326 | process.exit(0); 327 | } else { 328 | console.log('Failed to send Bundle, retrying... (ctrl + c to abort)'); 329 | console.log('Retries left: ', maxRetries - retries); 330 | bundleResult[1]() 331 | retries += 1; 332 | continue 333 | } 334 | } else { 335 | throw new Error 336 | } 337 | } 338 | 339 | console.log('\nMax Retries Reached.'); 340 | process.exit(1); 341 | 342 | } catch (e) { 343 | console.log(e); 344 | console.log('an error has occurred'); 345 | } 346 | } 347 | 348 | main() -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "allowJs": true, 4 | "lib": ["es2015", "es2017", "es2020", "dom"], 5 | "module": "CommonJS", 6 | "moduleResolution": "node", 7 | "target": "es2020", // Update the target to es2020 8 | "noImplicitReturns": true, 9 | "noFallthroughCasesInSwitch": true, 10 | "pretty": true, 11 | "strict": true, 12 | "outDir": "./build", 13 | "skipLibCheck": true, 14 | "noImplicitAny": true, 15 | "esModuleInterop": true, 16 | "declaration": false, 17 | "resolveJsonModule": true, 18 | }, 19 | "include": [ 20 | "**/*" 21 | ], 22 | "compileOnSave": false 23 | } -------------------------------------------------------------------------------- /types/index.ts: -------------------------------------------------------------------------------- 1 | import * as anchor from "@coral-xyz/anchor"; 2 | import { PublicKey } from "@solana/web3.js"; 3 | 4 | export interface PoolData { 5 | account: anchor.web3.AccountInfo | null, 6 | mint: PublicKey, 7 | mintAuth: PublicKey, 8 | bondingCurve: PublicKey, 9 | bondingCurveAta: PublicKey, 10 | globalState: PublicKey, 11 | user: PublicKey, 12 | userAta: PublicKey, 13 | signerTokenAccount: PublicKey, 14 | decimals: number, 15 | virtualTokenReserves: number, 16 | virtualSolReserves: number, 17 | realTokenReserves: number, 18 | realSolReserves: number, 19 | adjustedVirtualTokenReserves: number, 20 | adjustedVirtualSolReserves: number, 21 | virtualTokenPrice: number, 22 | } -------------------------------------------------------------------------------- /utils/index.ts: -------------------------------------------------------------------------------- 1 | 2 | import { Connection, Keypair, LAMPORTS_PER_SOL, ParsedInstruction, PartiallyDecodedInstruction, PublicKey, SystemProgram, TransactionMessage, VersionedTransaction, sendAndConfirmRawTransaction } from "@solana/web3.js"; 3 | import base58 from "bs58"; 4 | import { bs58 } from "@coral-xyz/anchor/dist/cjs/utils/bytes"; 5 | import { Transaction, ComputeBudgetProgram, } from "@solana/web3.js"; 6 | import readline from 'readline' 7 | import { SearcherClient } from "jito-ts/dist/sdk/block-engine/searcher"; 8 | import { isError } from "jito-ts/dist/sdk/block-engine/utils"; 9 | import { BundleResult } from "jito-ts/dist/gen/block-engine/bundle"; 10 | import { searcherClient } from 'jito-ts/dist/sdk/block-engine/searcher'; 11 | import { Bundle } from "jito-ts/dist/sdk/block-engine/types"; 12 | import * as anchor from '@coral-xyz/anchor'; 13 | import { Idl } from "@coral-xyz/anchor"; 14 | import { program } from "@coral-xyz/anchor/dist/cjs/native/system"; 15 | import { getAssociatedTokenAddressSync, TOKEN_PROGRAM_ID } from "@solana/spl-token"; 16 | import { programID } from "../constants"; 17 | import { PoolData } from "../types"; 18 | 19 | export async function sendTx(connection: Connection, tx: Transaction): Promise { 20 | 21 | try { 22 | 23 | const signature = await connection.sendRawTransaction( 24 | tx.serialize(), 25 | { 26 | preflightCommitment: "processed", 27 | skipPreflight: true, 28 | maxRetries: 2 29 | } 30 | ) 31 | 32 | if (!signature) { 33 | throw new Error("Invalid signature"); 34 | } 35 | 36 | console.log("tx", signature) 37 | 38 | const latestBlockhash = await connection.getLatestBlockhash({ 39 | commitment: "processed" 40 | }) 41 | const confirmation = await connection.confirmTransaction( 42 | { 43 | signature, 44 | lastValidBlockHeight: latestBlockhash.lastValidBlockHeight, 45 | blockhash: latestBlockhash.blockhash 46 | }, 47 | "processed" 48 | ) 49 | 50 | if (confirmation.value.err) { 51 | throw new Error(confirmation.value.err.toString()); 52 | } 53 | 54 | return signature; 55 | } catch (e) { 56 | return "" 57 | } 58 | } 59 | 60 | export async function send_transactions( 61 | Transactions: Transaction[], 62 | connection: Connection 63 | ) { 64 | try { 65 | var staggeredTransactions: Promise[] = [] 66 | var i = 1 67 | Transactions.forEach((tx, idx) => { 68 | const prms = new Promise((resolve) => { 69 | setTimeout(() => { 70 | sendAndConfirmRawTransaction(connection, tx.serialize(), { skipPreflight: true, commitment: 'processed', maxRetries: 2 }) 71 | .then(async (sig) => { 72 | //console.log(`Transaction successful.`) 73 | resolve(sig); 74 | }) 75 | .catch(error => { 76 | //console.log('Transaction failed :c') 77 | resolve('failed'); 78 | }) 79 | }, 100 * i) 80 | }) 81 | staggeredTransactions.push(prms); 82 | i += 1 83 | }) 84 | const result = await Promise.allSettled(staggeredTransactions) 85 | const values = [] 86 | for (var entry of result) { 87 | //@ts-ignore 88 | values.push(entry.value) 89 | } 90 | return values 91 | 92 | } catch (e) { 93 | return ['failed']; 94 | } 95 | }; 96 | 97 | export function getRandomNumber() { 98 | // Generate a random number between 0 and 1 99 | var randomNumber = Math.random(); 100 | 101 | // Scale the random number to the desired range (1 to 5000) 102 | var scaledNumber = Math.floor(randomNumber * 5000) + 1; 103 | 104 | return scaledNumber; 105 | } 106 | 107 | 108 | export function getCurrentDateTime(): string { 109 | const now = new Date(); 110 | const date = now.toISOString().split('T')[0]; 111 | const hours = String(now.getHours()).padStart(2, '0'); 112 | const minutes = String(now.getMinutes()).padStart(2, '0'); 113 | const seconds = String(now.getSeconds()).padStart(2, '0'); 114 | return `[${date} ${hours}:${minutes}:${seconds}]`; 115 | } 116 | 117 | export function roundUpToNonZeroString(num: number): string { 118 | const numString = num.toString(); 119 | const decimalIndex = numString.indexOf('.'); 120 | 121 | if (decimalIndex === -1) { 122 | return numString; 123 | } else { 124 | const integerPart = numString.substring(0, decimalIndex); 125 | 126 | let decimalPart = numString.substring(decimalIndex + 1); 127 | decimalPart = decimalPart.replace(/0+$/, ''); 128 | 129 | return decimalPart === '' ? integerPart : integerPart + '.' + decimalPart; 130 | } 131 | } 132 | 133 | export function getKeypairFromBs58(bs58String: string): Keypair { 134 | const privateKeyObject = base58.decode(bs58String); 135 | const privateKey = Uint8Array.from(privateKeyObject); 136 | const keypair = Keypair.fromSecretKey(privateKey); 137 | return keypair 138 | } 139 | 140 | export function generate_transactions(serializedTransactions: Array) { 141 | const transactionBuffers = serializedTransactions 142 | .map((transaction) => Buffer.from(transaction, 'base64')); 143 | const rawTransactions = transactionBuffers 144 | .map((transactionBuffer) => Transaction.from(transactionBuffer)); 145 | return rawTransactions; 146 | } 147 | 148 | export function serializeTransactions(rawTxs: Transaction[]) { 149 | return rawTxs.map((trans: Transaction) => { 150 | const temp = trans.serialize({ requireAllSignatures: false, verifySignatures: false }) 151 | return Buffer.from(temp).toString('base64'); 152 | }) 153 | } 154 | 155 | export async function getComputeUnitsForTransaction(tx: Transaction, connection: Connection) { 156 | try { 157 | const newTx = new Transaction(); 158 | newTx.add(ComputeBudgetProgram.setComputeUnitPrice({ microLamports: 1000000 })); 159 | newTx.add(ComputeBudgetProgram.setComputeUnitLimit({ units: 1_400_000 })); 160 | newTx.add(...tx.instructions); 161 | newTx.recentBlockhash = tx.recentBlockhash; 162 | newTx.lastValidBlockHeight = tx.lastValidBlockHeight; 163 | newTx.feePayer = tx.feePayer; 164 | const simulation = await connection.simulateTransaction(newTx); 165 | 166 | if (simulation.value.err) { 167 | return 0; 168 | } 169 | return simulation.value.unitsConsumed ?? 200_000; 170 | 171 | } catch (e) { 172 | console.log(e); 173 | return 0 174 | } 175 | } 176 | export async function getPriorityFeeEstimateForTransaction(tx: Transaction) { 177 | try { 178 | const endpoint = process.env.RPC_URL as string; 179 | const jsonPayload = { 180 | jsonrpc: '2.0', 181 | id: '1', 182 | method: 'getPriorityFeeEstimate', 183 | params: [ 184 | { 185 | transaction: bs58.encode(tx.serialize({ verifySignatures: false, requireAllSignatures: false })), // Pass the serialized transaction in Base58 186 | options: { includeAllPriorityFeeLevels: true }, 187 | }, 188 | ] 189 | } 190 | const res = await fetch(endpoint, { 191 | method: 'POST', 192 | headers: { 193 | 'Content-Type': 'application/json', 194 | }, 195 | body: JSON.stringify(jsonPayload) 196 | }).then(res => res.json()); 197 | 198 | //const highFee = res.result.priorityFeeLevels.high as number; 199 | const veryHighFee = res.result.priorityFeeLevels.veryHigh as number; 200 | const finalFee = Math.min(Math.floor((veryHighFee * 2)), 20_000_000); 201 | return finalFee; 202 | 203 | } catch (e) { 204 | console.log(e); 205 | return 1000000; 206 | } 207 | } 208 | export async function getOptimalPriceAndBudget(hydratedTransaction: Transaction, connection: Connection) { 209 | 210 | const [priorityFee, ComputeUnits] = await Promise.all([ 211 | getPriorityFeeEstimateForTransaction(hydratedTransaction), 212 | getComputeUnitsForTransaction(hydratedTransaction, connection), 213 | ]) 214 | return [priorityFee, ComputeUnits]; 215 | } 216 | export async function ConstructOptimalTransaction(prevTx: Transaction, connection: Connection, fee: number): Promise { 217 | 218 | const microLamports = fee == -1 ? await 1_000_000 : fee; 219 | const units = 59_000 + getRandomNumber(); 220 | //getComputeUnitsForTransaction(prevTx, connection); 221 | //console.log(`Compute units to consume: ${units}`); 222 | //console.log(`Micro-lamports per compute unit: ${fee}\n`) 223 | 224 | const newTx = new Transaction(); 225 | newTx.add(ComputeBudgetProgram.setComputeUnitPrice({ microLamports })); 226 | newTx.add(ComputeBudgetProgram.setComputeUnitLimit({ units })); 227 | newTx.add(...prevTx.instructions); 228 | newTx.recentBlockhash = prevTx.recentBlockhash; 229 | newTx.lastValidBlockHeight = prevTx.lastValidBlockHeight; 230 | newTx.feePayer = prevTx.feePayer; 231 | return newTx; 232 | } 233 | 234 | 235 | export function validateSolAddress(address: string) { 236 | try { 237 | let pubkey = new PublicKey(address) 238 | let isSolana = PublicKey.isOnCurve(pubkey.toBuffer()) 239 | return isSolana 240 | } catch (error) { 241 | return false 242 | } 243 | } 244 | 245 | 246 | //parsing signatures 247 | export async function parseSignatures(connection: Connection, signatures: string[]) { 248 | const parsedSignatures = await connection.getParsedTransactions(signatures, { maxSupportedTransactionVersion: 2 }); 249 | return parsedSignatures 250 | } 251 | 252 | 253 | export const getUserInput = (prompt: string): Promise => { 254 | const rl = readline.createInterface({ 255 | input: process.stdin, 256 | output: process.stdout 257 | }); 258 | return new Promise((resolve) => { 259 | rl.question(prompt, (userInput) => { 260 | resolve(userInput); 261 | rl.close(); 262 | }); 263 | }); 264 | }; 265 | 266 | //sleep function 267 | export function sleep(ms: number) { 268 | return new Promise(resolve => setTimeout(resolve, ms)); 269 | } 270 | 271 | 272 | export async function buildBundle( 273 | search: SearcherClient, 274 | bundleTransactionLimit: number, 275 | tx: Transaction, 276 | signer: Keypair, 277 | tip: number, 278 | ) { 279 | 280 | //console.log("tip account:", _tipAccount); 281 | const tipAccount = new PublicKey((await search.getTipAccounts())[0]); 282 | const bund = new Bundle([], bundleTransactionLimit); 283 | 284 | 285 | 286 | const tipIx = SystemProgram.transfer({ 287 | fromPubkey: signer.publicKey, 288 | toPubkey: tipAccount, 289 | lamports: Math.max(Math.floor(tip * LAMPORTS_PER_SOL), 5001), 290 | }) 291 | 292 | //creating versionedTx 293 | const messageV0 = new TransactionMessage({ 294 | payerKey: tx.feePayer!, 295 | recentBlockhash: tx.recentBlockhash!, 296 | instructions: [...tx.instructions, tipIx], 297 | }).compileToV0Message(); 298 | 299 | 300 | const vTransaction = new VersionedTransaction(messageV0); 301 | vTransaction.sign([signer]); 302 | 303 | const buildBundle = bund.addTransactions(vTransaction); 304 | 305 | 306 | if (isError(buildBundle)) { 307 | console.log('Error while creating bundle'); 308 | //console.log(buildBundle) 309 | return null; 310 | } 311 | 312 | try { 313 | const res = await search.sendBundle(buildBundle); 314 | //console.log('reponse_bundle:', res); 315 | } catch (e) { 316 | console.log('error sending bundle:\n', e); 317 | } 318 | return buildBundle; 319 | } 320 | 321 | 322 | export const onBundleResult = (c: SearcherClient): Promise<[number, any]> => { 323 | 324 | 325 | return new Promise((resolve) => { 326 | 327 | let state = 0; 328 | let isResolved = false; 329 | 330 | 331 | const listener = c.onBundleResult( 332 | //@ts-ignore 333 | (result) => { 334 | 335 | if (isResolved) return state; 336 | 337 | 338 | const bundleId = result.bundleId; 339 | const isAccepted = result.accepted; 340 | const isRejected = result.rejected; 341 | 342 | if (isResolved == false) { 343 | 344 | if (isAccepted) { 345 | //console.log(result); 346 | 347 | console.log( 348 | "bundle accepted, ID:", 349 | bundleId, 350 | " Slot: ", 351 | result?.accepted?.slot 352 | ); 353 | state += 1; 354 | isResolved = true; 355 | //listener() 356 | resolve([state, listener]); // Resolve with 'first' when a bundle is accepted 357 | } 358 | 359 | if (isRejected) { 360 | if (isRejected.simulationFailure) { 361 | console.log(isRejected.simulationFailure.msg ?? ''); 362 | console.log('\n') 363 | } 364 | 365 | if (isRejected.internalError) { 366 | console.log('\n') 367 | console.log(isRejected.internalError.msg); 368 | } 369 | 370 | if (isRejected.stateAuctionBidRejected) { 371 | console.log('\n') 372 | console.log(isRejected.stateAuctionBidRejected.msg ?? ''); 373 | } 374 | 375 | if (isRejected.droppedBundle) { 376 | console.log('\n') 377 | console.log(isRejected.droppedBundle); 378 | } 379 | isResolved = true; 380 | resolve([state, listener]); 381 | } 382 | 383 | } 384 | 385 | }, 386 | (e) => { 387 | console.error(e); 388 | // Do not reject the promise here 389 | } 390 | ); 391 | 392 | 393 | // Set a timeout to reject the promise if no bundle is accepted within 30 seconds 394 | //setTimeout(() => { 395 | // listener(); 396 | // resolve(first); 397 | // isResolved = true 398 | //}, 30000); 399 | 400 | 401 | }); 402 | }; 403 | 404 | 405 | //metadata pda 406 | 407 | export function getMetadataPda(mint: PublicKey) { 408 | const [metadataPda, _] = PublicKey.findProgramAddressSync( 409 | [ 410 | Buffer.from("metadata"), 411 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s').toBuffer(), 412 | mint.toBuffer(), 413 | ], 414 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'), 415 | ) 416 | return metadataPda 417 | } 418 | 419 | //master edition pda 420 | export function getMasterEditionPda(mint: PublicKey) { 421 | const [masterEditionPda, _] = PublicKey.findProgramAddressSync( 422 | [ 423 | Buffer.from("metadata"), 424 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s').toBuffer(), 425 | mint.toBuffer(), 426 | Buffer.from("edition"), 427 | ], 428 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'), 429 | ) 430 | return masterEditionPda 431 | } 432 | 433 | //token record pda 434 | export function getTokenRecord(mint: PublicKey, ata: PublicKey) { 435 | const [TokenRecord, _] = PublicKey.findProgramAddressSync( 436 | [ 437 | Buffer.from("metadata"), 438 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s').toBuffer(), 439 | mint.toBuffer(), 440 | Buffer.from("token_record"), 441 | ata.toBuffer(), 442 | ], 443 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'), 444 | ) 445 | return TokenRecord 446 | } 447 | 448 | //master edition pda 449 | export function getMetadataDelegateRecord(mint: PublicKey, ata: PublicKey, delegate: PublicKey, updateAuthority: PublicKey,) { 450 | const [pda, _] = PublicKey.findProgramAddressSync( 451 | [ 452 | anchor.utils.bytes.utf8.encode("metadata"), 453 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s').toBuffer(), 454 | mint.toBuffer(), 455 | anchor.utils.bytes.utf8.encode("update"), 456 | updateAuthority.toBuffer(), 457 | delegate.toBuffer(), 458 | ], 459 | new PublicKey('metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s'), 460 | ) 461 | return pda 462 | } 463 | 464 | 465 | export async function getMintPrice(connection: Connection, program: anchor.Program, mint: PublicKey, bondingCurve: PublicKey): Promise { 466 | const [bondingCurveData, mintData] = await Promise.all([ 467 | program.account.bondingCurve.fetch(bondingCurve), 468 | connection.getParsedAccountInfo(mint), 469 | ]); 470 | 471 | //@ts-ignore 472 | const decimals = mintData.value?.data.parsed.info.decimals; 473 | const virtualTokenReserves = (bondingCurveData.virtualTokenReserves as any).toNumber(); 474 | const virtualSolReserves = (bondingCurveData.virtualSolReserves as any).toNumber(); 475 | const adjustedVirtualTokenReserves = virtualTokenReserves / (10 ** decimals); 476 | const adjustedVirtualSolReserves = virtualSolReserves / LAMPORTS_PER_SOL; 477 | const virtualTokenPrice = adjustedVirtualSolReserves / adjustedVirtualTokenReserves; 478 | 479 | return virtualTokenPrice; 480 | } 481 | 482 | 483 | export async function listenProgramLogs( 484 | connection: Connection, 485 | programAddress: PublicKey, 486 | searchInstruction: string, 487 | callBackFunction: Function 488 | ): Promise { 489 | console.log("Monitoring logs for program:", programAddress.toString()); 490 | connection.onLogs( 491 | programAddress, 492 | ({ logs, err, signature }) => { 493 | if (err) return; 494 | if (logs && logs.some((log) => log.includes(searchInstruction))) { 495 | callBackFunction(signature); 496 | } 497 | }, 498 | "finalized" 499 | ); 500 | } 501 | 502 | export async function getMintPoolData(connection: Connection, program: anchor.Program, user: PublicKey, txId: string): Promise { 503 | let neededInstruction: PartiallyDecodedInstruction | ParsedInstruction | null = null; 504 | // let parsedSig: ParsedTransactionWithMeta | null = null 505 | const parsed_sigs = await parseSignatures(connection, [txId]); 506 | 507 | for (var i = 0; i < parsed_sigs.length; i++) { 508 | try { 509 | const sig = parsed_sigs[i]; 510 | if (!sig) { continue } 511 | 512 | const blockTime = sig.blockTime; 513 | const currentTime = Math.floor(Date.now() / 1000); 514 | 515 | //@ts-ignore 516 | const instructions = (sig.transaction.message.instructions); 517 | 518 | for (let ix of instructions) { 519 | try { 520 | const hasNeededProgramId = (ix.programId.toBase58() == programID); 521 | //@ts-ignore 522 | if (!ix.accounts) { 523 | continue 524 | } 525 | 526 | //@ts-ignore 527 | const hasNeededAccounts = ix.accounts.length == 14; 528 | 529 | if (hasNeededProgramId && hasNeededAccounts) { 530 | // transaction should should be processed within one minute of detecting it here 531 | // if (!blockTime || currentTime - blockTime > 60) { 532 | // console.log(`${getCurrentDateTime()} Old Bonding Curve detected, Ignoring stale pool...`) 533 | // } else { 534 | // neededInstruction = ix; 535 | // parsedSig = sig 536 | // } 537 | 538 | neededInstruction = ix; 539 | //parsedSig = sig 540 | } 541 | } catch (e) { 542 | console.log(e); 543 | } 544 | } 545 | 546 | if (!neededInstruction) { continue } 547 | //@ts-ignore 548 | const accounts = neededInstruction.accounts 549 | const mint = accounts[0]; 550 | const mintAuth = accounts[1]; 551 | const bondingCurve = accounts[2]; 552 | const bondingCurveAta = accounts[3]; 553 | const globalState = accounts[4]; 554 | const userAta = getAssociatedTokenAddressSync(mint, user, true); 555 | const signerTokenAccount = getAssociatedTokenAddressSync(mint, user, true, TOKEN_PROGRAM_ID,); 556 | const [bondingCurveData, mintData, account] = await Promise.all([ 557 | // @ts-ignore 558 | program.account.bondingCurve.fetch(bondingCurve), 559 | connection.getParsedAccountInfo(mint), 560 | connection.getAccountInfo(signerTokenAccount, 'processed') 561 | ]); 562 | 563 | //@ts-ignore 564 | const decimals = mintData.value?.data.parsed.info.decimals; 565 | const virtualTokenReserves = (bondingCurveData.virtualTokenReserves as any).toNumber(); 566 | const virtualSolReserves = (bondingCurveData.virtualSolReserves as any).toNumber(); 567 | const realTokenReserves = (bondingCurveData.realTokenReserves as any).toNumber(); 568 | const realSolReserves = (bondingCurveData.realSolReserves as any).toNumber(); 569 | const adjustedVirtualTokenReserves = virtualTokenReserves / (10 ** decimals); 570 | const adjustedVirtualSolReserves = virtualSolReserves / LAMPORTS_PER_SOL; 571 | const virtualTokenPrice = adjustedVirtualSolReserves / adjustedVirtualTokenReserves; 572 | 573 | const poolData: PoolData = { 574 | account, 575 | mint, 576 | mintAuth, 577 | bondingCurve, 578 | bondingCurveAta, 579 | globalState, 580 | user, 581 | userAta, 582 | signerTokenAccount, 583 | decimals, 584 | virtualTokenReserves, 585 | virtualSolReserves, 586 | realTokenReserves, 587 | realSolReserves, 588 | adjustedVirtualTokenReserves, 589 | adjustedVirtualSolReserves, 590 | virtualTokenPrice, 591 | } 592 | 593 | //console.log(adjustedVirtualSolReserves); 594 | //console.log(adjustedVirtualTokenReserves); 595 | // 596 | //console.log(finalAmount); 597 | //console.log(virtualTokenPrice); 598 | //console.log(virtualTokenReserves); 599 | //console.log(virtualSolReserves); 600 | //console.log(decimals); 601 | //console.log(mint); 602 | //console.log(bondingCurve); 603 | //console.log(finalAmount); 604 | 605 | return poolData; 606 | } catch (e) { 607 | console.log(e); 608 | } 609 | } 610 | return undefined 611 | } -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/runtime@^7.12.5", "@babel/runtime@^7.17.2", "@babel/runtime@^7.23.4": 6 | version "7.24.4" 7 | resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.4.tgz#de795accd698007a66ba44add6cc86542aff1edd" 8 | integrity sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA== 9 | dependencies: 10 | regenerator-runtime "^0.14.0" 11 | 12 | "@coral-xyz/anchor@^0.29.0": 13 | version "0.29.0" 14 | resolved "https://registry.yarnpkg.com/@coral-xyz/anchor/-/anchor-0.29.0.tgz#bd0be95bedfb30a381c3e676e5926124c310ff12" 15 | integrity sha512-eny6QNG0WOwqV0zQ7cs/b1tIuzZGmP7U7EcH+ogt4Gdbl8HDmIYVMh/9aTmYZPaFWjtUaI8qSn73uYEXWfATdA== 16 | dependencies: 17 | "@coral-xyz/borsh" "^0.29.0" 18 | "@noble/hashes" "^1.3.1" 19 | "@solana/web3.js" "^1.68.0" 20 | bn.js "^5.1.2" 21 | bs58 "^4.0.1" 22 | buffer-layout "^1.2.2" 23 | camelcase "^6.3.0" 24 | cross-fetch "^3.1.5" 25 | crypto-hash "^1.3.0" 26 | eventemitter3 "^4.0.7" 27 | pako "^2.0.3" 28 | snake-case "^3.0.4" 29 | superstruct "^0.15.4" 30 | toml "^3.0.0" 31 | 32 | "@coral-xyz/borsh@^0.29.0": 33 | version "0.29.0" 34 | resolved "https://registry.yarnpkg.com/@coral-xyz/borsh/-/borsh-0.29.0.tgz#79f7045df2ef66da8006d47f5399c7190363e71f" 35 | integrity sha512-s7VFVa3a0oqpkuRloWVPdCK7hMbAMY270geZOGfCnaqexrP5dTIpbEHL33req6IYPPJ0hYa71cdvJ1h6V55/oQ== 36 | dependencies: 37 | bn.js "^5.1.2" 38 | buffer-layout "^1.2.0" 39 | 40 | "@cspotcode/source-map-support@^0.8.0": 41 | version "0.8.1" 42 | resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1" 43 | integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw== 44 | dependencies: 45 | "@jridgewell/trace-mapping" "0.3.9" 46 | 47 | "@grpc/grpc-js@^1.8.13": 48 | version "1.10.6" 49 | resolved "https://registry.yarnpkg.com/@grpc/grpc-js/-/grpc-js-1.10.6.tgz#1e3eb1af911dc888fbef7452f56a7573b8284d54" 50 | integrity sha512-xP58G7wDQ4TCmN/cMUHh00DS7SRDv/+lC+xFLrTkMIN8h55X5NhZMLYbvy7dSELP15qlI6hPhNCRWVMtZMwqLA== 51 | dependencies: 52 | "@grpc/proto-loader" "^0.7.10" 53 | "@js-sdsl/ordered-map" "^4.4.2" 54 | 55 | "@grpc/proto-loader@^0.7.10": 56 | version "0.7.12" 57 | resolved "https://registry.yarnpkg.com/@grpc/proto-loader/-/proto-loader-0.7.12.tgz#787b58e3e3771df30b1567c057b6ab89e3a42911" 58 | integrity sha512-DCVwMxqYzpUCiDMl7hQ384FqP4T3DbNpXU8pt681l3UWCip1WUiD5JrkImUwCB9a7f2cq4CUTmi5r/xIMRPY1Q== 59 | dependencies: 60 | lodash.camelcase "^4.3.0" 61 | long "^5.0.0" 62 | protobufjs "^7.2.4" 63 | yargs "^17.7.2" 64 | 65 | "@jridgewell/resolve-uri@^3.0.3": 66 | version "3.1.2" 67 | resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" 68 | integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== 69 | 70 | "@jridgewell/sourcemap-codec@^1.4.10": 71 | version "1.4.15" 72 | resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" 73 | integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== 74 | 75 | "@jridgewell/trace-mapping@0.3.9": 76 | version "0.3.9" 77 | resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9" 78 | integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ== 79 | dependencies: 80 | "@jridgewell/resolve-uri" "^3.0.3" 81 | "@jridgewell/sourcemap-codec" "^1.4.10" 82 | 83 | "@js-sdsl/ordered-map@^4.4.2": 84 | version "4.4.2" 85 | resolved "https://registry.yarnpkg.com/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz#9299f82874bab9e4c7f9c48d865becbfe8d6907c" 86 | integrity sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw== 87 | 88 | "@noble/curves@^1.0.0", "@noble/curves@^1.2.0": 89 | version "1.4.0" 90 | resolved "https://registry.yarnpkg.com/@noble/curves/-/curves-1.4.0.tgz#f05771ef64da724997f69ee1261b2417a49522d6" 91 | integrity sha512-p+4cb332SFCrReJkCYe8Xzm0OWi4Jji5jVdIZRL/PmacmDkFNw6MrrV+gGpiPxLHbV+zKFRywUWbaseT+tZRXg== 92 | dependencies: 93 | "@noble/hashes" "1.4.0" 94 | 95 | "@noble/ed25519@^1.7.1": 96 | version "1.7.3" 97 | resolved "https://registry.yarnpkg.com/@noble/ed25519/-/ed25519-1.7.3.tgz#57e1677bf6885354b466c38e2b620c62f45a7123" 98 | integrity sha512-iR8GBkDt0Q3GyaVcIu7mSsVIqnFbkbRzGLWlvhwunacoLwt4J3swfKhfaM6rN6WY+TBGoYT1GtT1mIh2/jGbRQ== 99 | 100 | "@noble/hashes@1.4.0", "@noble/hashes@^1.3.0", "@noble/hashes@^1.3.1", "@noble/hashes@^1.3.3": 101 | version "1.4.0" 102 | resolved "https://registry.yarnpkg.com/@noble/hashes/-/hashes-1.4.0.tgz#45814aa329f30e4fe0ba49426f49dfccdd066426" 103 | integrity sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg== 104 | 105 | "@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2": 106 | version "1.1.2" 107 | resolved "https://registry.yarnpkg.com/@protobufjs/aspromise/-/aspromise-1.1.2.tgz#9b8b0cc663d669a7d8f6f5d0893a14d348f30fbf" 108 | integrity sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ== 109 | 110 | "@protobufjs/base64@^1.1.2": 111 | version "1.1.2" 112 | resolved "https://registry.yarnpkg.com/@protobufjs/base64/-/base64-1.1.2.tgz#4c85730e59b9a1f1f349047dbf24296034bb2735" 113 | integrity sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg== 114 | 115 | "@protobufjs/codegen@^2.0.4": 116 | version "2.0.4" 117 | resolved "https://registry.yarnpkg.com/@protobufjs/codegen/-/codegen-2.0.4.tgz#7ef37f0d010fb028ad1ad59722e506d9262815cb" 118 | integrity sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg== 119 | 120 | "@protobufjs/eventemitter@^1.1.0": 121 | version "1.1.0" 122 | resolved "https://registry.yarnpkg.com/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz#355cbc98bafad5978f9ed095f397621f1d066b70" 123 | integrity sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q== 124 | 125 | "@protobufjs/fetch@^1.1.0": 126 | version "1.1.0" 127 | resolved "https://registry.yarnpkg.com/@protobufjs/fetch/-/fetch-1.1.0.tgz#ba99fb598614af65700c1619ff06d454b0d84c45" 128 | integrity sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ== 129 | dependencies: 130 | "@protobufjs/aspromise" "^1.1.1" 131 | "@protobufjs/inquire" "^1.1.0" 132 | 133 | "@protobufjs/float@^1.0.2": 134 | version "1.0.2" 135 | resolved "https://registry.yarnpkg.com/@protobufjs/float/-/float-1.0.2.tgz#5e9e1abdcb73fc0a7cb8b291df78c8cbd97b87d1" 136 | integrity sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ== 137 | 138 | "@protobufjs/inquire@^1.1.0": 139 | version "1.1.0" 140 | resolved "https://registry.yarnpkg.com/@protobufjs/inquire/-/inquire-1.1.0.tgz#ff200e3e7cf2429e2dcafc1140828e8cc638f089" 141 | integrity sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q== 142 | 143 | "@protobufjs/path@^1.1.2": 144 | version "1.1.2" 145 | resolved "https://registry.yarnpkg.com/@protobufjs/path/-/path-1.1.2.tgz#6cc2b20c5c9ad6ad0dccfd21ca7673d8d7fbf68d" 146 | integrity sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA== 147 | 148 | "@protobufjs/pool@^1.1.0": 149 | version "1.1.0" 150 | resolved "https://registry.yarnpkg.com/@protobufjs/pool/-/pool-1.1.0.tgz#09fd15f2d6d3abfa9b65bc366506d6ad7846ff54" 151 | integrity sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw== 152 | 153 | "@protobufjs/utf8@^1.1.0": 154 | version "1.1.0" 155 | resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570" 156 | integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw== 157 | 158 | "@solana/buffer-layout-utils@^0.2.0": 159 | version "0.2.0" 160 | resolved "https://registry.yarnpkg.com/@solana/buffer-layout-utils/-/buffer-layout-utils-0.2.0.tgz#b45a6cab3293a2eb7597cceb474f229889d875ca" 161 | integrity sha512-szG4sxgJGktbuZYDg2FfNmkMi0DYQoVjN2h7ta1W1hPrwzarcFLBq9UpX1UjNXsNpT9dn+chgprtWGioUAr4/g== 162 | dependencies: 163 | "@solana/buffer-layout" "^4.0.0" 164 | "@solana/web3.js" "^1.32.0" 165 | bigint-buffer "^1.1.5" 166 | bignumber.js "^9.0.1" 167 | 168 | "@solana/buffer-layout@^4.0.0", "@solana/buffer-layout@^4.0.1": 169 | version "4.0.1" 170 | resolved "https://registry.yarnpkg.com/@solana/buffer-layout/-/buffer-layout-4.0.1.tgz#b996235eaec15b1e0b5092a8ed6028df77fa6c15" 171 | integrity sha512-E1ImOIAD1tBZFRdjeM4/pzTiTApC0AOBGwyAMS4fwIodCWArzJ3DWdoh8cKxeFM2fElkxBh2Aqts1BPC373rHA== 172 | dependencies: 173 | buffer "~6.0.3" 174 | 175 | "@solana/codecs-core@2.0.0-experimental.8618508": 176 | version "2.0.0-experimental.8618508" 177 | resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.0.0-experimental.8618508.tgz#4f6709dd50e671267f3bea7d09209bc6471b7ad0" 178 | integrity sha512-JCz7mKjVKtfZxkuDtwMAUgA7YvJcA2BwpZaA1NOLcted4OMC4Prwa3DUe3f3181ixPYaRyptbF0Ikq2MbDkYEA== 179 | 180 | "@solana/codecs-core@2.0.0-preview.2": 181 | version "2.0.0-preview.2" 182 | resolved "https://registry.yarnpkg.com/@solana/codecs-core/-/codecs-core-2.0.0-preview.2.tgz#689784d032fbc1fedbde40bb25d76cdcecf6553b" 183 | integrity sha512-gLhCJXieSCrAU7acUJjbXl+IbGnqovvxQLlimztPoGgfLQ1wFYu+XJswrEVQqknZYK1pgxpxH3rZ+OKFs0ndQg== 184 | dependencies: 185 | "@solana/errors" "2.0.0-preview.2" 186 | 187 | "@solana/codecs-data-structures@2.0.0-experimental.8618508": 188 | version "2.0.0-experimental.8618508" 189 | resolved "https://registry.yarnpkg.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-experimental.8618508.tgz#c16a704ac0f743a2e0bf73ada42d830b3402d848" 190 | integrity sha512-sLpjL9sqzaDdkloBPV61Rht1tgaKq98BCtIKRuyscIrmVPu3wu0Bavk2n/QekmUzaTsj7K1pVSniM0YqCdnEBw== 191 | dependencies: 192 | "@solana/codecs-core" "2.0.0-experimental.8618508" 193 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 194 | 195 | "@solana/codecs-data-structures@2.0.0-preview.2": 196 | version "2.0.0-preview.2" 197 | resolved "https://registry.yarnpkg.com/@solana/codecs-data-structures/-/codecs-data-structures-2.0.0-preview.2.tgz#e82cb1b6d154fa636cd5c8953ff3f32959cc0370" 198 | integrity sha512-Xf5vIfromOZo94Q8HbR04TbgTwzigqrKII0GjYr21K7rb3nba4hUW2ir8kguY7HWFBcjHGlU5x3MevKBOLp3Zg== 199 | dependencies: 200 | "@solana/codecs-core" "2.0.0-preview.2" 201 | "@solana/codecs-numbers" "2.0.0-preview.2" 202 | "@solana/errors" "2.0.0-preview.2" 203 | 204 | "@solana/codecs-numbers@2.0.0-experimental.8618508": 205 | version "2.0.0-experimental.8618508" 206 | resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-experimental.8618508.tgz#d84f9ed0521b22e19125eefc7d51e217fcaeb3e4" 207 | integrity sha512-EXQKfzFr3CkKKNzKSZPOOOzchXsFe90TVONWsSnVkonO9z+nGKALE0/L9uBmIFGgdzhhU9QQVFvxBMclIDJo2Q== 208 | dependencies: 209 | "@solana/codecs-core" "2.0.0-experimental.8618508" 210 | 211 | "@solana/codecs-numbers@2.0.0-preview.2": 212 | version "2.0.0-preview.2" 213 | resolved "https://registry.yarnpkg.com/@solana/codecs-numbers/-/codecs-numbers-2.0.0-preview.2.tgz#56995c27396cd8ee3bae8bd055363891b630bbd0" 214 | integrity sha512-aLZnDTf43z4qOnpTcDsUVy1Ci9im1Md8thWipSWbE+WM9ojZAx528oAql+Cv8M8N+6ALKwgVRhPZkto6E59ARw== 215 | dependencies: 216 | "@solana/codecs-core" "2.0.0-preview.2" 217 | "@solana/errors" "2.0.0-preview.2" 218 | 219 | "@solana/codecs-strings@2.0.0-experimental.8618508": 220 | version "2.0.0-experimental.8618508" 221 | resolved "https://registry.yarnpkg.com/@solana/codecs-strings/-/codecs-strings-2.0.0-experimental.8618508.tgz#72457b884d9be80b59b263bcce73892b081e9402" 222 | integrity sha512-b2yhinr1+oe+JDmnnsV0641KQqqDG8AQ16Z/x7GVWO+AWHMpRlHWVXOq8U1yhPMA4VXxl7i+D+C6ql0VGFp0GA== 223 | dependencies: 224 | "@solana/codecs-core" "2.0.0-experimental.8618508" 225 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 226 | 227 | "@solana/codecs-strings@2.0.0-preview.2": 228 | version "2.0.0-preview.2" 229 | resolved "https://registry.yarnpkg.com/@solana/codecs-strings/-/codecs-strings-2.0.0-preview.2.tgz#8bd01a4e48614d5289d72d743c3e81305d445c46" 230 | integrity sha512-EgBwY+lIaHHgMJIqVOGHfIfpdmmUDNoNO/GAUGeFPf+q0dF+DtwhJPEMShhzh64X2MeCZcmSO6Kinx0Bvmmz2g== 231 | dependencies: 232 | "@solana/codecs-core" "2.0.0-preview.2" 233 | "@solana/codecs-numbers" "2.0.0-preview.2" 234 | "@solana/errors" "2.0.0-preview.2" 235 | 236 | "@solana/codecs@2.0.0-preview.2": 237 | version "2.0.0-preview.2" 238 | resolved "https://registry.yarnpkg.com/@solana/codecs/-/codecs-2.0.0-preview.2.tgz#d6615fec98f423166fb89409f9a4ad5b74c10935" 239 | integrity sha512-4HHzCD5+pOSmSB71X6w9ptweV48Zj1Vqhe732+pcAQ2cMNnN0gMPMdDq7j3YwaZDZ7yrILVV/3+HTnfT77t2yA== 240 | dependencies: 241 | "@solana/codecs-core" "2.0.0-preview.2" 242 | "@solana/codecs-data-structures" "2.0.0-preview.2" 243 | "@solana/codecs-numbers" "2.0.0-preview.2" 244 | "@solana/codecs-strings" "2.0.0-preview.2" 245 | "@solana/options" "2.0.0-preview.2" 246 | 247 | "@solana/errors@2.0.0-preview.2": 248 | version "2.0.0-preview.2" 249 | resolved "https://registry.yarnpkg.com/@solana/errors/-/errors-2.0.0-preview.2.tgz#e0ea8b008c5c02528d5855bc1903e5e9bbec322e" 250 | integrity sha512-H2DZ1l3iYF5Rp5pPbJpmmtCauWeQXRJapkDg8epQ8BJ7cA2Ut/QEtC3CMmw/iMTcuS6uemFNLcWvlOfoQhvQuA== 251 | dependencies: 252 | chalk "^5.3.0" 253 | commander "^12.0.0" 254 | 255 | "@solana/options@2.0.0-experimental.8618508": 256 | version "2.0.0-experimental.8618508" 257 | resolved "https://registry.yarnpkg.com/@solana/options/-/options-2.0.0-experimental.8618508.tgz#95385340e85f9e8a81b2bfba089404a61c8e9520" 258 | integrity sha512-fy/nIRAMC3QHvnKi63KEd86Xr/zFBVxNW4nEpVEU2OT0gCEKwHY4Z55YHf7XujhyuM3PNpiBKg/YYw5QlRU4vg== 259 | dependencies: 260 | "@solana/codecs-core" "2.0.0-experimental.8618508" 261 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 262 | 263 | "@solana/options@2.0.0-preview.2": 264 | version "2.0.0-preview.2" 265 | resolved "https://registry.yarnpkg.com/@solana/options/-/options-2.0.0-preview.2.tgz#13ff008bf43a5056ef9a091dc7bb3f39321e867e" 266 | integrity sha512-FAHqEeH0cVsUOTzjl5OfUBw2cyT8d5Oekx4xcn5hn+NyPAfQJgM3CEThzgRD6Q/4mM5pVUnND3oK/Mt1RzSE/w== 267 | dependencies: 268 | "@solana/codecs-core" "2.0.0-preview.2" 269 | "@solana/codecs-numbers" "2.0.0-preview.2" 270 | 271 | "@solana/spl-token-group@^0.0.2": 272 | version "0.0.2" 273 | resolved "https://registry.yarnpkg.com/@solana/spl-token-group/-/spl-token-group-0.0.2.tgz#23f754fd535a4df5e2b80293a03aabd58bd99167" 274 | integrity sha512-vLePrFvT9+PfK2KZaddPebTWtRykXUR+060gqomFUcBk/2UPpZtsJGW+xshI9z9Ryrx7FieprZEUCApw34BwrQ== 275 | dependencies: 276 | "@solana/codecs" "2.0.0-preview.2" 277 | "@solana/spl-type-length-value" "0.1.0" 278 | 279 | "@solana/spl-token-metadata@^0.1.2": 280 | version "0.1.2" 281 | resolved "https://registry.yarnpkg.com/@solana/spl-token-metadata/-/spl-token-metadata-0.1.2.tgz#876e13432bd2960bd3cac16b9b0af63e69e37719" 282 | integrity sha512-hJYnAJNkDrtkE2Q41YZhCpeOGU/0JgRFXbtrtOuGGeKc3pkEUHB9DDoxZAxx+XRno13GozUleyBi0qypz4c3bw== 283 | dependencies: 284 | "@solana/codecs-core" "2.0.0-experimental.8618508" 285 | "@solana/codecs-data-structures" "2.0.0-experimental.8618508" 286 | "@solana/codecs-numbers" "2.0.0-experimental.8618508" 287 | "@solana/codecs-strings" "2.0.0-experimental.8618508" 288 | "@solana/options" "2.0.0-experimental.8618508" 289 | "@solana/spl-type-length-value" "0.1.0" 290 | 291 | "@solana/spl-token@^0.4.3": 292 | version "0.4.3" 293 | resolved "https://registry.yarnpkg.com/@solana/spl-token/-/spl-token-0.4.3.tgz#cb923184fcba3f875f5914a440a68d7f537d0bac" 294 | integrity sha512-mRjJJE9CIBejsg9WAmDp369pWeObm42K2fwsZ4dkJAMCt1KBPb5Eb1vzM5+AYfV/BUTy3QP2oFx8kV+8Doa1xQ== 295 | dependencies: 296 | "@solana/buffer-layout" "^4.0.0" 297 | "@solana/buffer-layout-utils" "^0.2.0" 298 | "@solana/spl-token-group" "^0.0.2" 299 | "@solana/spl-token-metadata" "^0.1.2" 300 | buffer "^6.0.3" 301 | 302 | "@solana/spl-type-length-value@0.1.0": 303 | version "0.1.0" 304 | resolved "https://registry.yarnpkg.com/@solana/spl-type-length-value/-/spl-type-length-value-0.1.0.tgz#b5930cf6c6d8f50c7ff2a70463728a4637a2f26b" 305 | integrity sha512-JBMGB0oR4lPttOZ5XiUGyvylwLQjt1CPJa6qQ5oM+MBCndfjz2TKKkw0eATlLLcYmq1jBVsNlJ2cD6ns2GR7lA== 306 | dependencies: 307 | buffer "^6.0.3" 308 | 309 | "@solana/web3.js@^1.32.0", "@solana/web3.js@^1.68.0", "@solana/web3.js@^1.91.2": 310 | version "1.91.4" 311 | resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.91.4.tgz#b80295ce72aa125930dfc5b41b4b4e3f85fd87fa" 312 | integrity sha512-zconqecIcBqEF6JiM4xYF865Xc4aas+iWK5qnu7nwKPq9ilRYcn+2GiwpYXqUqqBUe0XCO17w18KO0F8h+QATg== 313 | dependencies: 314 | "@babel/runtime" "^7.23.4" 315 | "@noble/curves" "^1.2.0" 316 | "@noble/hashes" "^1.3.3" 317 | "@solana/buffer-layout" "^4.0.1" 318 | agentkeepalive "^4.5.0" 319 | bigint-buffer "^1.1.5" 320 | bn.js "^5.2.1" 321 | borsh "^0.7.0" 322 | bs58 "^4.0.1" 323 | buffer "6.0.3" 324 | fast-stable-stringify "^1.0.0" 325 | jayson "^4.1.0" 326 | node-fetch "^2.7.0" 327 | rpc-websockets "^7.5.1" 328 | superstruct "^0.14.2" 329 | 330 | "@solana/web3.js@~1.77.3": 331 | version "1.77.4" 332 | resolved "https://registry.yarnpkg.com/@solana/web3.js/-/web3.js-1.77.4.tgz#aad8c44a02ced319493308ef765a2b36a9e9fa8c" 333 | integrity sha512-XdN0Lh4jdY7J8FYMyucxCwzn6Ga2Sr1DHDWRbqVzk7ZPmmpSPOVWHzO67X1cVT+jNi1D6gZi2tgjHgDPuj6e9Q== 334 | dependencies: 335 | "@babel/runtime" "^7.12.5" 336 | "@noble/curves" "^1.0.0" 337 | "@noble/hashes" "^1.3.0" 338 | "@solana/buffer-layout" "^4.0.0" 339 | agentkeepalive "^4.2.1" 340 | bigint-buffer "^1.1.5" 341 | bn.js "^5.0.0" 342 | borsh "^0.7.0" 343 | bs58 "^4.0.1" 344 | buffer "6.0.3" 345 | fast-stable-stringify "^1.0.0" 346 | jayson "^4.1.0" 347 | node-fetch "^2.6.7" 348 | rpc-websockets "^7.5.1" 349 | superstruct "^0.14.2" 350 | 351 | "@tsconfig/node10@^1.0.7": 352 | version "1.0.11" 353 | resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" 354 | integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw== 355 | 356 | "@tsconfig/node12@^1.0.7": 357 | version "1.0.11" 358 | resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d" 359 | integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag== 360 | 361 | "@tsconfig/node14@^1.0.0": 362 | version "1.0.3" 363 | resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1" 364 | integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== 365 | 366 | "@tsconfig/node16@^1.0.2": 367 | version "1.0.4" 368 | resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" 369 | integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== 370 | 371 | "@types/connect@^3.4.33": 372 | version "3.4.38" 373 | resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858" 374 | integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug== 375 | dependencies: 376 | "@types/node" "*" 377 | 378 | "@types/node@*", "@types/node@>=13.7.0", "@types/node@^20.12.2": 379 | version "20.12.7" 380 | resolved "https://registry.yarnpkg.com/@types/node/-/node-20.12.7.tgz#04080362fa3dd6c5822061aa3124f5c152cff384" 381 | integrity sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg== 382 | dependencies: 383 | undici-types "~5.26.4" 384 | 385 | "@types/node@^12.12.54": 386 | version "12.20.55" 387 | resolved "https://registry.yarnpkg.com/@types/node/-/node-12.20.55.tgz#c329cbd434c42164f846b909bd6f85b5537f6240" 388 | integrity sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ== 389 | 390 | "@types/ws@^7.4.4": 391 | version "7.4.7" 392 | resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" 393 | integrity sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww== 394 | dependencies: 395 | "@types/node" "*" 396 | 397 | JSONStream@^1.3.5: 398 | version "1.3.5" 399 | resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 400 | integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== 401 | dependencies: 402 | jsonparse "^1.2.0" 403 | through ">=2.2.7 <3" 404 | 405 | acorn-walk@^8.1.1: 406 | version "8.3.2" 407 | resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" 408 | integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== 409 | 410 | acorn@^8.4.1: 411 | version "8.11.3" 412 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" 413 | integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== 414 | 415 | agentkeepalive@^4.2.1, agentkeepalive@^4.3.0, agentkeepalive@^4.5.0: 416 | version "4.5.0" 417 | resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.5.0.tgz#2673ad1389b3c418c5a20c5d7364f93ca04be923" 418 | integrity sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew== 419 | dependencies: 420 | humanize-ms "^1.2.1" 421 | 422 | ansi-regex@^5.0.1: 423 | version "5.0.1" 424 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" 425 | integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== 426 | 427 | ansi-styles@^4.0.0: 428 | version "4.3.0" 429 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" 430 | integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== 431 | dependencies: 432 | color-convert "^2.0.1" 433 | 434 | arg@^4.1.0: 435 | version "4.1.3" 436 | resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" 437 | integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== 438 | 439 | base-x@^3.0.2: 440 | version "3.0.9" 441 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-3.0.9.tgz#6349aaabb58526332de9f60995e548a53fe21320" 442 | integrity sha512-H7JU6iBHTal1gp56aKoaa//YUxEaAOUiydvrV/pILqIHXTtqxSkATOnDA2u+jZ/61sD+L/412+7kzXRtWukhpQ== 443 | dependencies: 444 | safe-buffer "^5.0.1" 445 | 446 | base-x@^4.0.0: 447 | version "4.0.0" 448 | resolved "https://registry.yarnpkg.com/base-x/-/base-x-4.0.0.tgz#d0e3b7753450c73f8ad2389b5c018a4af7b2224a" 449 | integrity sha512-FuwxlW4H5kh37X/oW59pwTzzTKRzfrrQwhmyspRM7swOEZcHtDZSCt45U6oKgtuFE+WYPblePMVIPR4RZrh/hw== 450 | 451 | base64-js@^1.3.1: 452 | version "1.5.1" 453 | resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" 454 | integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== 455 | 456 | bigint-buffer@^1.1.5: 457 | version "1.1.5" 458 | resolved "https://registry.yarnpkg.com/bigint-buffer/-/bigint-buffer-1.1.5.tgz#d038f31c8e4534c1f8d0015209bf34b4fa6dd442" 459 | integrity sha512-trfYco6AoZ+rKhKnxA0hgX0HAbVP/s808/EuDSe2JDzUnCp/xAsli35Orvk67UrTEcwuxZqYZDmfA2RXJgxVvA== 460 | dependencies: 461 | bindings "^1.3.0" 462 | 463 | bignumber.js@^9.0.1: 464 | version "9.1.2" 465 | resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-9.1.2.tgz#b7c4242259c008903b13707983b5f4bbd31eda0c" 466 | integrity sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug== 467 | 468 | bindings@^1.3.0: 469 | version "1.5.0" 470 | resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz#10353c9e945334bc0511a6d90b38fbc7c9c504df" 471 | integrity sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ== 472 | dependencies: 473 | file-uri-to-path "1.0.0" 474 | 475 | bn.js@^5.0.0, bn.js@^5.1.2, bn.js@^5.2.0, bn.js@^5.2.1: 476 | version "5.2.1" 477 | resolved "https://registry.yarnpkg.com/bn.js/-/bn.js-5.2.1.tgz#0bc527a6a0d18d0aa8d5b0538ce4a77dccfa7b70" 478 | integrity sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ== 479 | 480 | borsh@^0.7.0: 481 | version "0.7.0" 482 | resolved "https://registry.yarnpkg.com/borsh/-/borsh-0.7.0.tgz#6e9560d719d86d90dc589bca60ffc8a6c51fec2a" 483 | integrity sha512-CLCsZGIBCFnPtkNnieW/a8wmreDmfUtjU2m9yHrzPXIlNbqVs0AQrSatSG6vdNYUqdc83tkQi2eHfF98ubzQLA== 484 | dependencies: 485 | bn.js "^5.2.0" 486 | bs58 "^4.0.0" 487 | text-encoding-utf-8 "^1.0.2" 488 | 489 | bs58@^4.0.0, bs58@^4.0.1: 490 | version "4.0.1" 491 | resolved "https://registry.yarnpkg.com/bs58/-/bs58-4.0.1.tgz#be161e76c354f6f788ae4071f63f34e8c4f0a42a" 492 | integrity sha512-Ok3Wdf5vOIlBrgCvTq96gBkJw+JUEzdBgyaza5HLtPm7yTHkjRy8+JzNyHF7BHa0bNWOQIp3m5YF0nnFcOIKLw== 493 | dependencies: 494 | base-x "^3.0.2" 495 | 496 | bs58@^5.0.0: 497 | version "5.0.0" 498 | resolved "https://registry.yarnpkg.com/bs58/-/bs58-5.0.0.tgz#865575b4d13c09ea2a84622df6c8cbeb54ffc279" 499 | integrity sha512-r+ihvQJvahgYT50JD05dyJNKlmmSlMoOGwn1lCcEzanPglg7TxYjioQUYehQ9mAR/+hOSd2jRc/Z2y5UxBymvQ== 500 | dependencies: 501 | base-x "^4.0.0" 502 | 503 | buffer-layout@^1.2.0, buffer-layout@^1.2.2: 504 | version "1.2.2" 505 | resolved "https://registry.yarnpkg.com/buffer-layout/-/buffer-layout-1.2.2.tgz#b9814e7c7235783085f9ca4966a0cfff112259d5" 506 | integrity sha512-kWSuLN694+KTk8SrYvCqwP2WcgQjoRCiF5b4QDvkkz8EmgD+aWAIceGFKMIAdmF/pH+vpgNV3d3kAKorcdAmWA== 507 | 508 | buffer@6.0.3, buffer@^6.0.3, buffer@~6.0.3: 509 | version "6.0.3" 510 | resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" 511 | integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== 512 | dependencies: 513 | base64-js "^1.3.1" 514 | ieee754 "^1.2.1" 515 | 516 | bufferutil@^4.0.1: 517 | version "4.0.8" 518 | resolved "https://registry.yarnpkg.com/bufferutil/-/bufferutil-4.0.8.tgz#1de6a71092d65d7766c4d8a522b261a6e787e8ea" 519 | integrity sha512-4T53u4PdgsXqKaIctwF8ifXlRTTmEPJ8iEPWFdGZvcf7sbwYo6FKFEX9eNNAnzFZ7EzJAQ3CJeOtCRA4rDp7Pw== 520 | dependencies: 521 | node-gyp-build "^4.3.0" 522 | 523 | camelcase@^6.3.0: 524 | version "6.3.0" 525 | resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" 526 | integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== 527 | 528 | chalk@^5.3.0: 529 | version "5.3.0" 530 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" 531 | integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== 532 | 533 | cliui@^8.0.1: 534 | version "8.0.1" 535 | resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa" 536 | integrity sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ== 537 | dependencies: 538 | string-width "^4.2.0" 539 | strip-ansi "^6.0.1" 540 | wrap-ansi "^7.0.0" 541 | 542 | color-convert@^2.0.1: 543 | version "2.0.1" 544 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" 545 | integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== 546 | dependencies: 547 | color-name "~1.1.4" 548 | 549 | color-name@~1.1.4: 550 | version "1.1.4" 551 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" 552 | integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== 553 | 554 | commander@^12.0.0: 555 | version "12.0.0" 556 | resolved "https://registry.yarnpkg.com/commander/-/commander-12.0.0.tgz#b929db6df8546080adfd004ab215ed48cf6f2592" 557 | integrity sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA== 558 | 559 | commander@^2.20.3: 560 | version "2.20.3" 561 | resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" 562 | integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== 563 | 564 | create-require@^1.1.0: 565 | version "1.1.1" 566 | resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" 567 | integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== 568 | 569 | cross-fetch@^3.1.5: 570 | version "3.1.8" 571 | resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.1.8.tgz#0327eba65fd68a7d119f8fb2bf9334a1a7956f82" 572 | integrity sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg== 573 | dependencies: 574 | node-fetch "^2.6.12" 575 | 576 | crypto-hash@^1.3.0: 577 | version "1.3.0" 578 | resolved "https://registry.yarnpkg.com/crypto-hash/-/crypto-hash-1.3.0.tgz#b402cb08f4529e9f4f09346c3e275942f845e247" 579 | integrity sha512-lyAZ0EMyjDkVvz8WOeVnuCPvKVBXcMv1l5SVqO1yC7PzTwrD/pPje/BIRbWhMoPe436U+Y2nD7f5bFx0kt+Sbg== 580 | 581 | delay@^5.0.0: 582 | version "5.0.0" 583 | resolved "https://registry.yarnpkg.com/delay/-/delay-5.0.0.tgz#137045ef1b96e5071060dd5be60bf9334436bd1d" 584 | integrity sha512-ReEBKkIfe4ya47wlPYf/gu5ib6yUG0/Aez0JQZQz94kiWtRQvZIQbTiehsnwHvLSWJnQdhVeqYue7Id1dKr0qw== 585 | 586 | diff@^4.0.1: 587 | version "4.0.2" 588 | resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" 589 | integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== 590 | 591 | dot-case@^3.0.4: 592 | version "3.0.4" 593 | resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" 594 | integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== 595 | dependencies: 596 | no-case "^3.0.4" 597 | tslib "^2.0.3" 598 | 599 | dotenv@^16.0.3, dotenv@^16.4.5: 600 | version "16.4.5" 601 | resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" 602 | integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== 603 | 604 | emoji-regex@^8.0.0: 605 | version "8.0.0" 606 | resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" 607 | integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== 608 | 609 | es6-promise@^4.0.3: 610 | version "4.2.8" 611 | resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.8.tgz#4eb21594c972bc40553d276e510539143db53e0a" 612 | integrity sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w== 613 | 614 | es6-promisify@^5.0.0: 615 | version "5.0.0" 616 | resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" 617 | integrity sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ== 618 | dependencies: 619 | es6-promise "^4.0.3" 620 | 621 | escalade@^3.1.1: 622 | version "3.1.2" 623 | resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27" 624 | integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA== 625 | 626 | eventemitter3@^4.0.7: 627 | version "4.0.7" 628 | resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.7.tgz#2de9b68f6528d5644ef5c59526a1b4a07306169f" 629 | integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== 630 | 631 | eyes@^0.1.8: 632 | version "0.1.8" 633 | resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" 634 | integrity sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ== 635 | 636 | fast-stable-stringify@^1.0.0: 637 | version "1.0.0" 638 | resolved "https://registry.yarnpkg.com/fast-stable-stringify/-/fast-stable-stringify-1.0.0.tgz#5c5543462b22aeeefd36d05b34e51c78cb86d313" 639 | integrity sha512-wpYMUmFu5f00Sm0cj2pfivpmawLZ0NKdviQ4w9zJeR8JVtOpOxHmLaJuj0vxvGqMJQWyP/COUkF75/57OKyRag== 640 | 641 | file-uri-to-path@1.0.0: 642 | version "1.0.0" 643 | resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" 644 | integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== 645 | 646 | get-caller-file@^2.0.5: 647 | version "2.0.5" 648 | resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" 649 | integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== 650 | 651 | humanize-ms@^1.2.1: 652 | version "1.2.1" 653 | resolved "https://registry.yarnpkg.com/humanize-ms/-/humanize-ms-1.2.1.tgz#c46e3159a293f6b896da29316d8b6fe8bb79bbed" 654 | integrity sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ== 655 | dependencies: 656 | ms "^2.0.0" 657 | 658 | ieee754@^1.2.1: 659 | version "1.2.1" 660 | resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352" 661 | integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== 662 | 663 | is-fullwidth-code-point@^3.0.0: 664 | version "3.0.0" 665 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" 666 | integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== 667 | 668 | isomorphic-ws@^4.0.1: 669 | version "4.0.1" 670 | resolved "https://registry.yarnpkg.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz#55fd4cd6c5e6491e76dc125938dd863f5cd4f2dc" 671 | integrity sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w== 672 | 673 | jayson@^4.0.0, jayson@^4.1.0: 674 | version "4.1.0" 675 | resolved "https://registry.yarnpkg.com/jayson/-/jayson-4.1.0.tgz#60dc946a85197317f2b1439d672a8b0a99cea2f9" 676 | integrity sha512-R6JlbyLN53Mjku329XoRT2zJAE6ZgOQ8f91ucYdMCD4nkGCF9kZSrcGXpHIU4jeKj58zUZke2p+cdQchU7Ly7A== 677 | dependencies: 678 | "@types/connect" "^3.4.33" 679 | "@types/node" "^12.12.54" 680 | "@types/ws" "^7.4.4" 681 | JSONStream "^1.3.5" 682 | commander "^2.20.3" 683 | delay "^5.0.0" 684 | es6-promisify "^5.0.0" 685 | eyes "^0.1.8" 686 | isomorphic-ws "^4.0.1" 687 | json-stringify-safe "^5.0.1" 688 | uuid "^8.3.2" 689 | ws "^7.4.5" 690 | 691 | jito-ts@^3.0.1: 692 | version "3.0.1" 693 | resolved "https://registry.yarnpkg.com/jito-ts/-/jito-ts-3.0.1.tgz#24126389896e042c26d303c4e802064b249ed27e" 694 | integrity sha512-TSofF7KqcwyaWGjPaSYC8RDoNBY1TPRNBHdrw24bdIi7mQ5bFEDdYK3D//llw/ml8YDvcZlgd644WxhjLTS9yg== 695 | dependencies: 696 | "@grpc/grpc-js" "^1.8.13" 697 | "@noble/ed25519" "^1.7.1" 698 | "@solana/web3.js" "~1.77.3" 699 | agentkeepalive "^4.3.0" 700 | dotenv "^16.0.3" 701 | jayson "^4.0.0" 702 | node-fetch "^2.6.7" 703 | superstruct "^1.0.3" 704 | 705 | json-stringify-safe@^5.0.1: 706 | version "5.0.1" 707 | resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" 708 | integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== 709 | 710 | jsonparse@^1.2.0: 711 | version "1.3.1" 712 | resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280" 713 | integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== 714 | 715 | lodash.camelcase@^4.3.0: 716 | version "4.3.0" 717 | resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" 718 | integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== 719 | 720 | long@^5.0.0: 721 | version "5.2.3" 722 | resolved "https://registry.yarnpkg.com/long/-/long-5.2.3.tgz#a3ba97f3877cf1d778eccbcb048525ebb77499e1" 723 | integrity sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q== 724 | 725 | lower-case@^2.0.2: 726 | version "2.0.2" 727 | resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" 728 | integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== 729 | dependencies: 730 | tslib "^2.0.3" 731 | 732 | make-error@^1.1.1: 733 | version "1.3.6" 734 | resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" 735 | integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== 736 | 737 | ms@^2.0.0: 738 | version "2.1.3" 739 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" 740 | integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== 741 | 742 | no-case@^3.0.4: 743 | version "3.0.4" 744 | resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" 745 | integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== 746 | dependencies: 747 | lower-case "^2.0.2" 748 | tslib "^2.0.3" 749 | 750 | node-fetch@^2.6.12, node-fetch@^2.6.7, node-fetch@^2.7.0: 751 | version "2.7.0" 752 | resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" 753 | integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== 754 | dependencies: 755 | whatwg-url "^5.0.0" 756 | 757 | node-gyp-build@^4.3.0: 758 | version "4.8.0" 759 | resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.8.0.tgz#3fee9c1731df4581a3f9ead74664369ff00d26dd" 760 | integrity sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og== 761 | 762 | pako@^2.0.3: 763 | version "2.1.0" 764 | resolved "https://registry.yarnpkg.com/pako/-/pako-2.1.0.tgz#266cc37f98c7d883545d11335c00fbd4062c9a86" 765 | integrity sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug== 766 | 767 | protobufjs@^7.2.4: 768 | version "7.2.6" 769 | resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.2.6.tgz#4a0ccd79eb292717aacf07530a07e0ed20278215" 770 | integrity sha512-dgJaEDDL6x8ASUZ1YqWciTRrdOuYNzoOf27oHNfdyvKqHr5i0FV7FSLU+aIeFjyFgVxrpTOtQUi0BLLBymZaBw== 771 | dependencies: 772 | "@protobufjs/aspromise" "^1.1.2" 773 | "@protobufjs/base64" "^1.1.2" 774 | "@protobufjs/codegen" "^2.0.4" 775 | "@protobufjs/eventemitter" "^1.1.0" 776 | "@protobufjs/fetch" "^1.1.0" 777 | "@protobufjs/float" "^1.0.2" 778 | "@protobufjs/inquire" "^1.1.0" 779 | "@protobufjs/path" "^1.1.2" 780 | "@protobufjs/pool" "^1.1.0" 781 | "@protobufjs/utf8" "^1.1.0" 782 | "@types/node" ">=13.7.0" 783 | long "^5.0.0" 784 | 785 | regenerator-runtime@^0.14.0: 786 | version "0.14.1" 787 | resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" 788 | integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== 789 | 790 | require-directory@^2.1.1: 791 | version "2.1.1" 792 | resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" 793 | integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== 794 | 795 | rpc-websockets@^7.5.1: 796 | version "7.10.0" 797 | resolved "https://registry.yarnpkg.com/rpc-websockets/-/rpc-websockets-7.10.0.tgz#8ffaf6aaab3eb18e603c7549988cf49feeddcd29" 798 | integrity sha512-cemZ6RiDtYZpPiBzYijdOrkQQzmBCmug0E9SdRH2gIUNT15ql4mwCYWIp0VnSZq6Qrw/JkGUygp4PrK1y9KfwQ== 799 | dependencies: 800 | "@babel/runtime" "^7.17.2" 801 | eventemitter3 "^4.0.7" 802 | uuid "^8.3.2" 803 | ws "^8.5.0" 804 | optionalDependencies: 805 | bufferutil "^4.0.1" 806 | utf-8-validate "^5.0.2" 807 | 808 | safe-buffer@^5.0.1: 809 | version "5.2.1" 810 | resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" 811 | integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== 812 | 813 | snake-case@^3.0.4: 814 | version "3.0.4" 815 | resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" 816 | integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== 817 | dependencies: 818 | dot-case "^3.0.4" 819 | tslib "^2.0.3" 820 | 821 | string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: 822 | version "4.2.3" 823 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" 824 | integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== 825 | dependencies: 826 | emoji-regex "^8.0.0" 827 | is-fullwidth-code-point "^3.0.0" 828 | strip-ansi "^6.0.1" 829 | 830 | strip-ansi@^6.0.0, strip-ansi@^6.0.1: 831 | version "6.0.1" 832 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" 833 | integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== 834 | dependencies: 835 | ansi-regex "^5.0.1" 836 | 837 | superstruct@^0.14.2: 838 | version "0.14.2" 839 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.14.2.tgz#0dbcdf3d83676588828f1cf5ed35cda02f59025b" 840 | integrity sha512-nPewA6m9mR3d6k7WkZ8N8zpTWfenFH3q9pA2PkuiZxINr9DKB2+40wEQf0ixn8VaGuJ78AB6iWOtStI+/4FKZQ== 841 | 842 | superstruct@^0.15.4: 843 | version "0.15.5" 844 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-0.15.5.tgz#0f0a8d3ce31313f0d84c6096cd4fa1bfdedc9dab" 845 | integrity sha512-4AOeU+P5UuE/4nOUkmcQdW5y7i9ndt1cQd/3iUe+LTz3RxESf/W/5lg4B74HbDMMv8PHnPnGCQFH45kBcrQYoQ== 846 | 847 | superstruct@^1.0.3: 848 | version "1.0.4" 849 | resolved "https://registry.yarnpkg.com/superstruct/-/superstruct-1.0.4.tgz#0adb99a7578bd2f1c526220da6571b2d485d91ca" 850 | integrity sha512-7JpaAoX2NGyoFlI9NBh66BQXGONc+uE+MRS5i2iOBKuS4e+ccgMDjATgZldkah+33DakBxDHiss9kvUcGAO8UQ== 851 | 852 | text-encoding-utf-8@^1.0.2: 853 | version "1.0.2" 854 | resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" 855 | integrity sha512-8bw4MY9WjdsD2aMtO0OzOCY3pXGYNx2d2FfHRVUKkiCPDWjKuOlhLVASS+pD7VkLTVjW268LYJHwsnPFlBpbAg== 856 | 857 | "through@>=2.2.7 <3": 858 | version "2.3.8" 859 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 860 | integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== 861 | 862 | toml@^3.0.0: 863 | version "3.0.0" 864 | resolved "https://registry.yarnpkg.com/toml/-/toml-3.0.0.tgz#342160f1af1904ec9d204d03a5d61222d762c5ee" 865 | integrity sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w== 866 | 867 | tr46@~0.0.3: 868 | version "0.0.3" 869 | resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" 870 | integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== 871 | 872 | ts-node@^10.9.2: 873 | version "10.9.2" 874 | resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" 875 | integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== 876 | dependencies: 877 | "@cspotcode/source-map-support" "^0.8.0" 878 | "@tsconfig/node10" "^1.0.7" 879 | "@tsconfig/node12" "^1.0.7" 880 | "@tsconfig/node14" "^1.0.0" 881 | "@tsconfig/node16" "^1.0.2" 882 | acorn "^8.4.1" 883 | acorn-walk "^8.1.1" 884 | arg "^4.1.0" 885 | create-require "^1.1.0" 886 | diff "^4.0.1" 887 | make-error "^1.1.1" 888 | v8-compile-cache-lib "^3.0.1" 889 | yn "3.1.1" 890 | 891 | tslib@^2.0.3: 892 | version "2.6.2" 893 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" 894 | integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== 895 | 896 | typescript@^5.4.3: 897 | version "5.4.5" 898 | resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.4.5.tgz#42ccef2c571fdbd0f6718b1d1f5e6e5ef006f611" 899 | integrity sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ== 900 | 901 | undici-types@~5.26.4: 902 | version "5.26.5" 903 | resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" 904 | integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== 905 | 906 | utf-8-validate@^5.0.2: 907 | version "5.0.10" 908 | resolved "https://registry.yarnpkg.com/utf-8-validate/-/utf-8-validate-5.0.10.tgz#d7d10ea39318171ca982718b6b96a8d2442571a2" 909 | integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ== 910 | dependencies: 911 | node-gyp-build "^4.3.0" 912 | 913 | uuid@^8.3.2: 914 | version "8.3.2" 915 | resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" 916 | integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== 917 | 918 | v8-compile-cache-lib@^3.0.1: 919 | version "3.0.1" 920 | resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf" 921 | integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg== 922 | 923 | webidl-conversions@^3.0.0: 924 | version "3.0.1" 925 | resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871" 926 | integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== 927 | 928 | whatwg-url@^5.0.0: 929 | version "5.0.0" 930 | resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d" 931 | integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== 932 | dependencies: 933 | tr46 "~0.0.3" 934 | webidl-conversions "^3.0.0" 935 | 936 | wrap-ansi@^7.0.0: 937 | version "7.0.0" 938 | resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" 939 | integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== 940 | dependencies: 941 | ansi-styles "^4.0.0" 942 | string-width "^4.1.0" 943 | strip-ansi "^6.0.0" 944 | 945 | ws@^7.4.5: 946 | version "7.5.9" 947 | resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.9.tgz#54fa7db29f4c7cec68b1ddd3a89de099942bb591" 948 | integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== 949 | 950 | ws@^8.5.0: 951 | version "8.16.0" 952 | resolved "https://registry.yarnpkg.com/ws/-/ws-8.16.0.tgz#d1cd774f36fbc07165066a60e40323eab6446fd4" 953 | integrity sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ== 954 | 955 | y18n@^5.0.5: 956 | version "5.0.8" 957 | resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" 958 | integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== 959 | 960 | yargs-parser@^21.1.1: 961 | version "21.1.1" 962 | resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" 963 | integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== 964 | 965 | yargs@^17.7.2: 966 | version "17.7.2" 967 | resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" 968 | integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== 969 | dependencies: 970 | cliui "^8.0.1" 971 | escalade "^3.1.1" 972 | get-caller-file "^2.0.5" 973 | require-directory "^2.1.1" 974 | string-width "^4.2.3" 975 | y18n "^5.0.5" 976 | yargs-parser "^21.1.1" 977 | 978 | yn@3.1.1: 979 | version "3.1.1" 980 | resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" 981 | integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== 982 | --------------------------------------------------------------------------------